blob: e4e4cf1b128febc9fb9f2aaea351e7f17bc59af3 [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
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000574 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700575 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
solenberg059fb442016-10-26 05:12:24 -0700576 StrictMock<webrtc::test::MockAudioProcessing> apm_;
skvlad11a9cbf2016-10-07 11:53:05 -0700577 webrtc::RtcEventLogNullImpl event_log_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200578 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000579 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700580 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700581 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200582 cricket::AudioSendParameters send_parameters_;
583 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800584 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800585 private:
586 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000587};
588
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000589// Tests that we can create and destroy a channel.
590TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700591 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000592}
593
solenberg31fec402016-05-06 02:13:12 -0700594// Test that we can add a send stream and that it has the correct defaults.
595TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
596 EXPECT_TRUE(SetupChannel());
597 EXPECT_TRUE(
598 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
599 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
600 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
601 EXPECT_EQ("", config.rtp.c_name);
602 EXPECT_EQ(0u, config.rtp.extensions.size());
603 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
604 config.send_transport);
605}
606
607// Test that we can add a receive stream and that it has the correct defaults.
608TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
609 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -0700610 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg31fec402016-05-06 02:13:12 -0700611 const webrtc::AudioReceiveStream::Config& config =
612 GetRecvStreamConfig(kSsrc1);
613 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
614 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
615 EXPECT_FALSE(config.rtp.transport_cc);
616 EXPECT_EQ(0u, config.rtp.extensions.size());
617 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
618 config.rtcp_send_transport);
619 EXPECT_EQ("", config.sync_group);
620}
621
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000622// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700623// correctly (such that opus appears first).
ossudedfd282016-06-14 07:12:39 -0700624// TODO(ossu): This test should move into a separate builtin audio codecs
625// module.
deadbeef67cf2c12016-04-13 10:07:16 -0700626TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
ossudedfd282016-06-14 07:12:39 -0700627 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000628 ASSERT_FALSE(codecs.empty());
629 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
630 EXPECT_EQ(48000, codecs[0].clockrate);
631 EXPECT_EQ(2, codecs[0].channels);
632 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000633}
634
stefanba4c0e42016-02-04 04:12:24 -0800635TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
ossudedfd282016-06-14 07:12:39 -0700636 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -0800637 bool opus_found = false;
638 for (cricket::AudioCodec codec : codecs) {
639 if (codec.name == "opus") {
640 EXPECT_TRUE(HasTransportCc(codec));
641 opus_found = true;
642 }
643 }
644 EXPECT_TRUE(opus_found);
645}
646
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000647// Tests that we can find codecs by name or id, and that we interpret the
648// clockrate and bitrate fields properly.
649TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
650 cricket::AudioCodec codec;
651 webrtc::CodecInst codec_inst;
652 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800653 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800655 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000656 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg2779bab2016-11-17 04:45:19 -0800657 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec1,
658 &codec_inst));
659 // Find telephone-event with explicit clockrate and 0 bitrate.
660 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec2,
solenberg26c8c912015-11-27 04:00:25 -0800661 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662 // Find ISAC with a different payload id.
663 codec = kIsacCodec;
664 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800665 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000666 EXPECT_EQ(codec.id, codec_inst.pltype);
667 // Find PCMU with a 0 clockrate.
668 codec = kPcmuCodec;
669 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800670 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000671 EXPECT_EQ(codec.id, codec_inst.pltype);
672 EXPECT_EQ(8000, codec_inst.plfreq);
673 // Find PCMU with a 0 bitrate.
674 codec = kPcmuCodec;
675 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800676 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000677 EXPECT_EQ(codec.id, codec_inst.pltype);
678 EXPECT_EQ(64000, codec_inst.rate);
679 // Find ISAC with an explicit bitrate.
680 codec = kIsacCodec;
681 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800682 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000683 EXPECT_EQ(codec.id, codec_inst.pltype);
684 EXPECT_EQ(32000, codec_inst.rate);
685}
686
687// Test that we set our inbound codecs properly, including changing PT.
688TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700689 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200690 cricket::AudioRecvParameters parameters;
691 parameters.codecs.push_back(kIsacCodec);
692 parameters.codecs.push_back(kPcmuCodec);
solenberg2779bab2016-11-17 04:45:19 -0800693 parameters.codecs.push_back(kTelephoneEventCodec1);
694 parameters.codecs.push_back(kTelephoneEventCodec2);
695 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200696 parameters.codecs[2].id = 126;
697 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700698 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700699 int channel_num = voe_.GetLastChannel();
solenberg2779bab2016-11-17 04:45:19 -0800700
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000701 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800702 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000703 gcodec.plfreq = 16000;
704 gcodec.channels = 1;
705 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
706 EXPECT_EQ(106, gcodec.pltype);
707 EXPECT_STREQ("ISAC", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800708
tfarina5237aaf2015-11-10 23:44:30 -0800709 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000710 gcodec.plfreq = 8000;
711 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
712 EXPECT_EQ(126, gcodec.pltype);
713 EXPECT_STREQ("telephone-event", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800714
715 gcodec.plfreq = 32000;
716 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
717 EXPECT_EQ(107, gcodec.pltype);
718 EXPECT_STREQ("telephone-event", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000719}
720
721// Test that we fail to set an unknown inbound codec.
722TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700723 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200724 cricket::AudioRecvParameters parameters;
725 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700726 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200727 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000728}
729
730// Test that we fail if we have duplicate types in the inbound list.
731TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700732 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200733 cricket::AudioRecvParameters parameters;
734 parameters.codecs.push_back(kIsacCodec);
735 parameters.codecs.push_back(kCn16000Codec);
736 parameters.codecs[1].id = kIsacCodec.id;
737 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000738}
739
740// Test that we can decode OPUS without stereo parameters.
741TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700742 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200743 cricket::AudioRecvParameters parameters;
744 parameters.codecs.push_back(kIsacCodec);
745 parameters.codecs.push_back(kPcmuCodec);
746 parameters.codecs.push_back(kOpusCodec);
747 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700748 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700749 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000750 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800751 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000752 // Even without stereo parameters, recv codecs still specify channels = 2.
753 EXPECT_EQ(2, opus.channels);
754 EXPECT_EQ(111, opus.pltype);
755 EXPECT_STREQ("opus", opus.plname);
756 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700757 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000758 EXPECT_EQ(111, opus.pltype);
759}
760
761// Test that we can decode OPUS with stereo = 0.
762TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700763 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200764 cricket::AudioRecvParameters parameters;
765 parameters.codecs.push_back(kIsacCodec);
766 parameters.codecs.push_back(kPcmuCodec);
767 parameters.codecs.push_back(kOpusCodec);
768 parameters.codecs[2].params["stereo"] = "0";
769 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700770 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000771 int channel_num2 = voe_.GetLastChannel();
772 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800773 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000774 // Even when stereo is off, recv codecs still specify channels = 2.
775 EXPECT_EQ(2, opus.channels);
776 EXPECT_EQ(111, opus.pltype);
777 EXPECT_STREQ("opus", opus.plname);
778 opus.pltype = 0;
779 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
780 EXPECT_EQ(111, opus.pltype);
781}
782
783// Test that we can decode OPUS with stereo = 1.
784TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700785 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200786 cricket::AudioRecvParameters parameters;
787 parameters.codecs.push_back(kIsacCodec);
788 parameters.codecs.push_back(kPcmuCodec);
789 parameters.codecs.push_back(kOpusCodec);
790 parameters.codecs[2].params["stereo"] = "1";
791 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700792 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000793 int channel_num2 = voe_.GetLastChannel();
794 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800795 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000796 EXPECT_EQ(2, opus.channels);
797 EXPECT_EQ(111, opus.pltype);
798 EXPECT_STREQ("opus", opus.plname);
799 opus.pltype = 0;
800 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
801 EXPECT_EQ(111, opus.pltype);
802}
803
804// Test that changes to recv codecs are applied to all streams.
805TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700806 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200807 cricket::AudioRecvParameters parameters;
808 parameters.codecs.push_back(kIsacCodec);
809 parameters.codecs.push_back(kPcmuCodec);
solenberg2779bab2016-11-17 04:45:19 -0800810 parameters.codecs.push_back(kTelephoneEventCodec1);
811 parameters.codecs.push_back(kTelephoneEventCodec2);
812 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200813 parameters.codecs[2].id = 126;
814 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700815 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000816 int channel_num2 = voe_.GetLastChannel();
solenberg2779bab2016-11-17 04:45:19 -0800817
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000818 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800819 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000820 gcodec.plfreq = 16000;
821 gcodec.channels = 1;
822 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
823 EXPECT_EQ(106, gcodec.pltype);
824 EXPECT_STREQ("ISAC", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800825
tfarina5237aaf2015-11-10 23:44:30 -0800826 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000827 gcodec.plfreq = 8000;
828 gcodec.channels = 1;
829 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
830 EXPECT_EQ(126, gcodec.pltype);
831 EXPECT_STREQ("telephone-event", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800832
833 gcodec.plfreq = 32000;
834 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
835 EXPECT_EQ(107, gcodec.pltype);
836 EXPECT_STREQ("telephone-event", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000837}
838
839TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700840 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200841 cricket::AudioRecvParameters parameters;
842 parameters.codecs.push_back(kIsacCodec);
solenberg2779bab2016-11-17 04:45:19 -0800843 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200844 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000845
846 int channel_num2 = voe_.GetLastChannel();
847 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800848 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000849 gcodec.plfreq = 16000;
850 gcodec.channels = 1;
851 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
852 EXPECT_EQ(106, gcodec.pltype);
853 EXPECT_STREQ("ISAC", gcodec.plname);
854}
855
856// Test that we can apply the same set of codecs again while playing.
857TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700858 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200859 cricket::AudioRecvParameters parameters;
860 parameters.codecs.push_back(kIsacCodec);
861 parameters.codecs.push_back(kCn16000Codec);
862 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700863 channel_->SetPlayout(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200864 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000865
866 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200867 parameters.codecs[0].id = 127;
868 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700869 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000870}
871
872// Test that we can add a codec while playing.
873TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700874 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200875 cricket::AudioRecvParameters parameters;
876 parameters.codecs.push_back(kIsacCodec);
877 parameters.codecs.push_back(kCn16000Codec);
878 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700879 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000880
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200881 parameters.codecs.push_back(kOpusCodec);
882 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700883 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000884 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800885 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000886 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
887}
888
889TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700890 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000891
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000892 // Test that when autobw is enabled, bitrate is kept as the default
893 // value. autobw is enabled for the following tests because the target
894 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000895
896 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700897 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000898
899 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700900 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000901
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000902 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700903 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000904}
905
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000906TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700907 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000908
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000909 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000910
911 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700912 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
913 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
914 // Rates above the max (56000) should be capped.
915 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000916
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000917 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700918 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
919 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
920 // Rates above the max (510000) should be capped.
921 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000922}
923
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000924TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700925 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000926
927 // Test that we can only set a maximum bitrate for a fixed-rate codec
928 // if it's bigger than the fixed rate.
929
930 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700931 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
932 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
933 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
934 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
935 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
936 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
937 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000938}
939
940TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700941 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200942 const int kDesiredBitrate = 128000;
943 cricket::AudioSendParameters parameters;
ossudedfd282016-06-14 07:12:39 -0700944 parameters.codecs = engine_->send_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200945 parameters.max_bandwidth_bps = kDesiredBitrate;
solenberg059fb442016-10-26 05:12:24 -0700946 SetSendParameters(parameters);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000947
948 EXPECT_TRUE(channel_->AddSendStream(
949 cricket::StreamParams::CreateLegacy(kSsrc1)));
950
minyue7a973442016-10-20 03:27:12 -0700951 EXPECT_EQ(kDesiredBitrate, GetCodecBitrate(kSsrc1));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000952}
953
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000954// Test that bitrate cannot be set for CBR codecs.
955// Bitrate is ignored if it is higher than the fixed bitrate.
956// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000957TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700958 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000959
960 // PCMU, default bitrate == 64000.
solenberg059fb442016-10-26 05:12:24 -0700961 SetSendParameters(send_parameters_);
minyue7a973442016-10-20 03:27:12 -0700962 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200963
964 send_parameters_.max_bandwidth_bps = 128000;
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 = 128;
969 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
minyue7a973442016-10-20 03:27:12 -0700970 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000971}
972
skvlade0d46372016-04-07 22:59:22 -0700973// Test that the per-stream bitrate limit and the global
974// bitrate limit both apply.
975TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
976 EXPECT_TRUE(SetupSendStream());
977
978 // opus, default bitrate == 64000.
979 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
980 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
981 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
982 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
983
984 // CBR codecs allow both maximums to exceed the bitrate.
985 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
986 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
987 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
988 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
989
990 // CBR codecs don't allow per stream maximums to be too low.
991 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
992 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
993}
994
995// Test that an attempt to set RtpParameters for a stream that does not exist
996// fails.
997TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
998 EXPECT_TRUE(SetupChannel());
999 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001000 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -07001001 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
1002
1003 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001004 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -07001005}
1006
1007TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001008 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -07001009 // This test verifies that setting RtpParameters succeeds only if
1010 // the structure contains exactly one encoding.
1011 // TODO(skvlad): Update this test when we start supporting setting parameters
1012 // for each encoding individually.
1013
1014 EXPECT_TRUE(SetupSendStream());
1015 // Setting RtpParameters with no encoding is expected to fail.
1016 webrtc::RtpParameters parameters;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001017 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -07001018 // Setting RtpParameters with exactly one encoding should succeed.
1019 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001020 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -07001021 // Two or more encodings should result in failure.
1022 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001023 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -07001024}
1025
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001026// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001027// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001028TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
1029 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07001030 SetSend(true);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001031 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
1032 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001033 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001034 ASSERT_EQ(1u, parameters.encodings.size());
1035 ASSERT_TRUE(parameters.encodings[0].active);
1036 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001037 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001038 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
1039
1040 // Now change it back to active and verify we resume sending.
1041 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001042 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001043 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
1044}
1045
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001046// Test that SetRtpSendParameters configures the correct encoding channel for
1047// each SSRC.
skvlade0d46372016-04-07 22:59:22 -07001048TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
1049 SetupForMultiSendStream();
1050 // Create send streams.
1051 for (uint32_t ssrc : kSsrcs4) {
1052 EXPECT_TRUE(
1053 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
1054 }
1055 // Configure one stream to be limited by the stream config, another to be
1056 // limited by the global max, and the third one with no per-stream limit
1057 // (still subject to the global limit).
solenberg059fb442016-10-26 05:12:24 -07001058 SetGlobalMaxBitrate(kOpusCodec, 64000);
skvlade0d46372016-04-07 22:59:22 -07001059 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
1060 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
1061 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
1062
1063 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
1064 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
1065 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
1066
1067 // Remove the global cap; the streams should switch to their respective
1068 // maximums (or remain unchanged if there was no other limit on them.)
solenberg059fb442016-10-26 05:12:24 -07001069 SetGlobalMaxBitrate(kOpusCodec, -1);
skvlade0d46372016-04-07 22:59:22 -07001070 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
1071 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
1072 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
1073}
1074
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001075// Test that GetRtpSendParameters returns the currently configured codecs.
1076TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001077 EXPECT_TRUE(SetupSendStream());
1078 cricket::AudioSendParameters parameters;
1079 parameters.codecs.push_back(kIsacCodec);
1080 parameters.codecs.push_back(kPcmuCodec);
solenberg059fb442016-10-26 05:12:24 -07001081 SetSendParameters(parameters);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001082
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001083 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001084 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001085 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1086 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001087}
1088
1089// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001090TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001091 EXPECT_TRUE(SetupSendStream());
1092 cricket::AudioSendParameters parameters;
1093 parameters.codecs.push_back(kIsacCodec);
1094 parameters.codecs.push_back(kPcmuCodec);
solenberg059fb442016-10-26 05:12:24 -07001095 SetSendParameters(parameters);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001096
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001097 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001098
1099 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001100 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001101
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001102 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1103 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1104 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1105}
1106
1107// Test that GetRtpReceiveParameters returns the currently configured codecs.
1108TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1109 EXPECT_TRUE(SetupRecvStream());
1110 cricket::AudioRecvParameters parameters;
1111 parameters.codecs.push_back(kIsacCodec);
1112 parameters.codecs.push_back(kPcmuCodec);
1113 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1114
1115 webrtc::RtpParameters rtp_parameters =
1116 channel_->GetRtpReceiveParameters(kSsrc1);
1117 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1118 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1119 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1120}
1121
1122// Test that if we set/get parameters multiple times, we get the same results.
1123TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1124 EXPECT_TRUE(SetupRecvStream());
1125 cricket::AudioRecvParameters parameters;
1126 parameters.codecs.push_back(kIsacCodec);
1127 parameters.codecs.push_back(kPcmuCodec);
1128 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1129
1130 webrtc::RtpParameters initial_params =
1131 channel_->GetRtpReceiveParameters(kSsrc1);
1132
1133 // We should be able to set the params we just got.
1134 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1135
1136 // ... And this shouldn't change the params returned by
1137 // GetRtpReceiveParameters.
1138 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1139 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001140}
1141
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001142// Test that we apply codecs properly.
1143TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001144 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001145 cricket::AudioSendParameters parameters;
1146 parameters.codecs.push_back(kIsacCodec);
1147 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001148 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001149 parameters.codecs[0].id = 96;
1150 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001151 const int initial_num = call_.GetNumCreatedSendStreams();
solenberg059fb442016-10-26 05:12:24 -07001152 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001153 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
1154 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1155 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1156 EXPECT_EQ(48000, send_codec_spec.codec_inst.rate);
1157 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1158 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1159 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
1160 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001161 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001162}
1163
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001164// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1165// to apply.
1166TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001167 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001168 cricket::AudioSendParameters parameters;
1169 parameters.codecs.push_back(kIsacCodec);
1170 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001171 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001172 parameters.codecs[0].id = 96;
1173 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001174 const int initial_num = call_.GetNumCreatedSendStreams();
solenberg059fb442016-10-26 05:12:24 -07001175 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001176 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001177 // Calling SetSendCodec again with same codec which is already set.
1178 // In this case media channel shouldn't send codec to VoE.
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}
1182
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001183// Verify that G722 is set with 16000 samples per second to WebRTC.
1184TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001185 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001186 cricket::AudioSendParameters parameters;
1187 parameters.codecs.push_back(kG722CodecSdp);
solenberg059fb442016-10-26 05:12:24 -07001188 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001189 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001190 EXPECT_STREQ("G722", gcodec.plname);
1191 EXPECT_EQ(1, gcodec.channels);
1192 EXPECT_EQ(16000, gcodec.plfreq);
1193}
1194
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001195// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001196TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001197 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001198 cricket::AudioSendParameters parameters;
1199 parameters.codecs.push_back(kOpusCodec);
1200 parameters.codecs[0].bitrate = 0;
1201 parameters.codecs[0].clockrate = 50000;
1202 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001203}
1204
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001205// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001206TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001207 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001208 cricket::AudioSendParameters parameters;
1209 parameters.codecs.push_back(kOpusCodec);
1210 parameters.codecs[0].bitrate = 0;
1211 parameters.codecs[0].channels = 0;
1212 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001213}
1214
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001215// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001216TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001217 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001218 cricket::AudioSendParameters parameters;
1219 parameters.codecs.push_back(kOpusCodec);
1220 parameters.codecs[0].bitrate = 0;
1221 parameters.codecs[0].channels = 0;
1222 parameters.codecs[0].params["stereo"] = "1";
1223 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001224}
1225
1226// Test that if channel is 1 for opus and there's no stereo, we fail.
1227TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001228 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001229 cricket::AudioSendParameters parameters;
1230 parameters.codecs.push_back(kOpusCodec);
1231 parameters.codecs[0].bitrate = 0;
1232 parameters.codecs[0].channels = 1;
1233 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001234}
1235
1236// Test that if channel is 1 for opus and stereo=0, we fail.
1237TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001238 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001239 cricket::AudioSendParameters parameters;
1240 parameters.codecs.push_back(kOpusCodec);
1241 parameters.codecs[0].bitrate = 0;
1242 parameters.codecs[0].channels = 1;
1243 parameters.codecs[0].params["stereo"] = "0";
1244 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001245}
1246
1247// Test that if channel is 1 for opus and stereo=1, we fail.
1248TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001249 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001250 cricket::AudioSendParameters parameters;
1251 parameters.codecs.push_back(kOpusCodec);
1252 parameters.codecs[0].bitrate = 0;
1253 parameters.codecs[0].channels = 1;
1254 parameters.codecs[0].params["stereo"] = "1";
1255 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001256}
1257
1258// Test that with bitrate=0 and no stereo,
1259// channels and bitrate are 1 and 32000.
1260TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001261 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001262 cricket::AudioSendParameters parameters;
1263 parameters.codecs.push_back(kOpusCodec);
1264 parameters.codecs[0].bitrate = 0;
solenberg059fb442016-10-26 05:12:24 -07001265 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001266 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001267}
1268
1269// Test that with bitrate=0 and stereo=0,
1270// channels and bitrate are 1 and 32000.
1271TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001272 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001273 cricket::AudioSendParameters parameters;
1274 parameters.codecs.push_back(kOpusCodec);
1275 parameters.codecs[0].bitrate = 0;
1276 parameters.codecs[0].params["stereo"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001277 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001278 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001279}
1280
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001281// Test that with bitrate=invalid and stereo=0,
1282// channels and bitrate are 1 and 32000.
1283TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001284 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001285 cricket::AudioSendParameters parameters;
1286 parameters.codecs.push_back(kOpusCodec);
1287 parameters.codecs[0].params["stereo"] = "0";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001288 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001289 parameters.codecs[0].bitrate = 5999;
solenberg059fb442016-10-26 05:12:24 -07001290 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001291 CheckSendCodec(kSsrc1, "opus", 1, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001292
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001293 parameters.codecs[0].bitrate = 510001;
solenberg059fb442016-10-26 05:12:24 -07001294 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001295 CheckSendCodec(kSsrc1, "opus", 1, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001296}
1297
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001298// Test that with bitrate=0 and stereo=1,
1299// channels and bitrate are 2 and 64000.
1300TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001301 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001302 cricket::AudioSendParameters parameters;
1303 parameters.codecs.push_back(kOpusCodec);
1304 parameters.codecs[0].bitrate = 0;
1305 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001306 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001307 CheckSendCodec(kSsrc1, "opus", 2, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001308}
1309
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001310// Test that with bitrate=invalid and stereo=1,
1311// channels and bitrate are 2 and 64000.
1312TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001313 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001314 cricket::AudioSendParameters parameters;
1315 parameters.codecs.push_back(kOpusCodec);
1316 parameters.codecs[0].params["stereo"] = "1";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001317 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001318 parameters.codecs[0].bitrate = 5999;
solenberg059fb442016-10-26 05:12:24 -07001319 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001320 CheckSendCodec(kSsrc1, "opus", 2, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001321
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001322 parameters.codecs[0].bitrate = 510001;
solenberg059fb442016-10-26 05:12:24 -07001323 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001324 CheckSendCodec(kSsrc1, "opus", 2, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001325}
1326
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001327// Test that with bitrate=N and stereo unset,
1328// channels and bitrate are 1 and N.
1329TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001330 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001331 cricket::AudioSendParameters parameters;
1332 parameters.codecs.push_back(kOpusCodec);
1333 parameters.codecs[0].bitrate = 96000;
solenberg059fb442016-10-26 05:12:24 -07001334 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001335 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001336 EXPECT_EQ(111, gcodec.pltype);
1337 EXPECT_EQ(96000, gcodec.rate);
1338 EXPECT_STREQ("opus", gcodec.plname);
1339 EXPECT_EQ(1, gcodec.channels);
1340 EXPECT_EQ(48000, gcodec.plfreq);
1341}
1342
1343// Test that with bitrate=N and stereo=0,
1344// channels and bitrate are 1 and N.
1345TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001346 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001347 cricket::AudioSendParameters parameters;
1348 parameters.codecs.push_back(kOpusCodec);
1349 parameters.codecs[0].bitrate = 30000;
1350 parameters.codecs[0].params["stereo"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001351 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001352 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001353}
1354
1355// Test that with bitrate=N and without any parameters,
1356// channels and bitrate are 1 and N.
1357TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001358 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001359 cricket::AudioSendParameters parameters;
1360 parameters.codecs.push_back(kOpusCodec);
1361 parameters.codecs[0].bitrate = 30000;
solenberg059fb442016-10-26 05:12:24 -07001362 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001363 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001364}
1365
1366// Test that with bitrate=N and stereo=1,
1367// channels and bitrate are 2 and N.
1368TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001369 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001370 cricket::AudioSendParameters parameters;
1371 parameters.codecs.push_back(kOpusCodec);
1372 parameters.codecs[0].bitrate = 30000;
1373 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001374 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001375 CheckSendCodec(kSsrc1, "opus", 2, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001376}
1377
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001378// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1379// Also test that the "maxaveragebitrate" can't be set to values outside the
1380// range of 6000 and 510000
1381TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001382 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001383 cricket::AudioSendParameters parameters;
1384 parameters.codecs.push_back(kOpusCodec);
1385 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001386 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001387 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
solenberg059fb442016-10-26 05:12:24 -07001388 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001389 EXPECT_EQ(6000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001390
1391 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001392 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
solenberg059fb442016-10-26 05:12:24 -07001393 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001394 EXPECT_EQ(510000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001395
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001396 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
solenberg059fb442016-10-26 05:12:24 -07001397 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001398 EXPECT_EQ(200000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001399}
1400
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001401// Test that we can enable NACK with opus as caller.
1402TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001403 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001404 cricket::AudioSendParameters parameters;
1405 parameters.codecs.push_back(kOpusCodec);
1406 parameters.codecs[0].AddFeedbackParam(
1407 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1408 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001409 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001410 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001411 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001412}
1413
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001414// Test that we can enable NACK with opus as callee.
1415TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001416 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001417 cricket::AudioSendParameters parameters;
1418 parameters.codecs.push_back(kOpusCodec);
1419 parameters.codecs[0].AddFeedbackParam(
1420 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1421 cricket::kParamValueEmpty));
solenberg8189b022016-06-14 12:13:00 -07001422 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001423 SetSendParameters(parameters);
deadbeefb56069e2016-05-06 04:57:03 -07001424 // NACK should be enabled even with no send stream.
solenberg8189b022016-06-14 12:13:00 -07001425 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001426
1427 EXPECT_TRUE(channel_->AddSendStream(
1428 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg971cab02016-06-14 10:02:41 -07001429 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001430}
1431
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001432// Test that we can enable NACK on receive streams.
1433TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001434 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001435 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001436 cricket::AudioSendParameters parameters;
1437 parameters.codecs.push_back(kOpusCodec);
1438 parameters.codecs[0].AddFeedbackParam(
1439 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1440 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001441 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001442 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001443 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001444 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001445 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001446}
1447
1448// Test that we can disable NACK.
1449TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001450 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001451 cricket::AudioSendParameters parameters;
1452 parameters.codecs.push_back(kOpusCodec);
1453 parameters.codecs[0].AddFeedbackParam(
1454 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1455 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001456 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001457 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001458
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001459 parameters.codecs.clear();
1460 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001461 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001462 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001463}
1464
1465// Test that we can disable NACK on receive streams.
1466TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001467 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001468 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001469 cricket::AudioSendParameters parameters;
1470 parameters.codecs.push_back(kOpusCodec);
1471 parameters.codecs[0].AddFeedbackParam(
1472 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1473 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001474 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001475 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001476 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001477
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001478 parameters.codecs.clear();
1479 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001480 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001481 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001482 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001483}
1484
1485// Test that NACK is enabled on a new receive stream.
1486TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001487 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001488 cricket::AudioSendParameters parameters;
1489 parameters.codecs.push_back(kIsacCodec);
1490 parameters.codecs.push_back(kCn16000Codec);
1491 parameters.codecs[0].AddFeedbackParam(
1492 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1493 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001494 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001495 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001496
solenberg8189b022016-06-14 12:13:00 -07001497 EXPECT_TRUE(AddRecvStream(kSsrc2));
1498 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
1499 EXPECT_TRUE(AddRecvStream(kSsrc3));
1500 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc3).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001501}
1502
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001503// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001504TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001505 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001506 cricket::AudioSendParameters parameters;
1507 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001508 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001509 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001510}
1511
1512// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001513TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001514 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001515 cricket::AudioSendParameters parameters;
1516 parameters.codecs.push_back(kOpusCodec);
1517 parameters.codecs[0].bitrate = 0;
1518 parameters.codecs[0].params["useinbandfec"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001519 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001520 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001521}
1522
1523// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001524TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001525 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001526 cricket::AudioSendParameters parameters;
1527 parameters.codecs.push_back(kOpusCodec);
1528 parameters.codecs[0].bitrate = 0;
1529 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001530 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001531 EXPECT_TRUE(GetCodecFec(kSsrc1));
1532 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001533}
1534
1535// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001536TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001537 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001538 cricket::AudioSendParameters parameters;
1539 parameters.codecs.push_back(kOpusCodec);
1540 parameters.codecs[0].bitrate = 0;
1541 parameters.codecs[0].params["stereo"] = "1";
1542 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001543 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001544 EXPECT_TRUE(GetCodecFec(kSsrc1));
1545 CheckSendCodec(kSsrc1, "opus", 2, 64000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001546}
1547
1548// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001549TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001550 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001551 cricket::AudioSendParameters parameters;
1552 parameters.codecs.push_back(kIsacCodec);
solenberg059fb442016-10-26 05:12:24 -07001553 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001554 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001555}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001556
1557// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1558TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001559 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001560 cricket::AudioSendParameters parameters;
1561 parameters.codecs.push_back(kIsacCodec);
1562 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001563 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001564 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001565}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001566
1567// Test that Opus FEC status can be changed.
1568TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001569 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001570 cricket::AudioSendParameters parameters;
1571 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001572 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001573 EXPECT_FALSE(GetCodecFec(kSsrc1));
1574
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001575 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001576 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001577 EXPECT_TRUE(GetCodecFec(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001578}
1579
stefanba4c0e42016-02-04 04:12:24 -08001580TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001581 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001582 cricket::AudioSendParameters send_parameters;
1583 send_parameters.codecs.push_back(kOpusCodec);
1584 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
solenberg059fb442016-10-26 05:12:24 -07001585 SetSendParameters(send_parameters);
stefanba4c0e42016-02-04 04:12:24 -08001586
1587 cricket::AudioRecvParameters recv_parameters;
1588 recv_parameters.codecs.push_back(kIsacCodec);
1589 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
solenberg8189b022016-06-14 12:13:00 -07001590 EXPECT_TRUE(AddRecvStream(kSsrc1));
stefanba4c0e42016-02-04 04:12:24 -08001591 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1592 EXPECT_FALSE(
1593 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1594
ossudedfd282016-06-14 07:12:39 -07001595 send_parameters.codecs = engine_->send_codecs();
solenberg059fb442016-10-26 05:12:24 -07001596 SetSendParameters(send_parameters);
stefanba4c0e42016-02-04 04:12:24 -08001597 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1598 EXPECT_TRUE(
1599 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1600}
1601
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001602// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1603TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001604 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001605 cricket::AudioSendParameters parameters;
1606 parameters.codecs.push_back(kOpusCodec);
1607 parameters.codecs[0].bitrate = 0;
1608 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
solenberg059fb442016-10-26 05:12:24 -07001609 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001610 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
1611 EXPECT_EQ(12000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001612
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001613 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001614 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001615 EXPECT_EQ(24000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001616}
1617
1618// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1619TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001620 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001621 cricket::AudioSendParameters parameters;
1622 parameters.codecs.push_back(kOpusCodec);
1623 parameters.codecs[0].bitrate = 0;
1624 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
solenberg059fb442016-10-26 05:12:24 -07001625 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001626 EXPECT_EQ(8001, GetOpusMaxPlaybackRate(kSsrc1));
1627 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001628
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001629 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001630 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001631 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001632}
1633
1634// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1635TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001636 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001637 cricket::AudioSendParameters parameters;
1638 parameters.codecs.push_back(kOpusCodec);
1639 parameters.codecs[0].bitrate = 0;
1640 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
solenberg059fb442016-10-26 05:12:24 -07001641 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001642 EXPECT_EQ(12001, GetOpusMaxPlaybackRate(kSsrc1));
1643 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001644
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001645 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001646 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001647 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001648}
1649
1650// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1651TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001652 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001653 cricket::AudioSendParameters parameters;
1654 parameters.codecs.push_back(kOpusCodec);
1655 parameters.codecs[0].bitrate = 0;
1656 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
solenberg059fb442016-10-26 05:12:24 -07001657 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001658 EXPECT_EQ(16001, GetOpusMaxPlaybackRate(kSsrc1));
1659 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001660
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001661 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001662 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001663 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001664}
1665
1666// Test 24000 < maxplaybackrate triggers Opus full band mode.
1667TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001668 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001669 cricket::AudioSendParameters parameters;
1670 parameters.codecs.push_back(kOpusCodec);
1671 parameters.codecs[0].bitrate = 0;
1672 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
solenberg059fb442016-10-26 05:12:24 -07001673 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001674 EXPECT_EQ(24001, GetOpusMaxPlaybackRate(kSsrc1));
1675 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001676
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001677 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001678 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001679 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001680}
1681
1682// Test Opus that without maxplaybackrate, default playback rate is used.
1683TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001684 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001685 cricket::AudioSendParameters parameters;
1686 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001687 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001688 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001689}
1690
1691// Test the with non-Opus, maxplaybackrate has no effect.
1692TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001693 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001694 cricket::AudioSendParameters parameters;
1695 parameters.codecs.push_back(kIsacCodec);
1696 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
solenberg059fb442016-10-26 05:12:24 -07001697 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001698 EXPECT_EQ(0, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001699}
1700
1701// Test maxplaybackrate can be set on two streams.
1702TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001703 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001704 cricket::AudioSendParameters parameters;
1705 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001706 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001707 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001708
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001709 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
solenberg059fb442016-10-26 05:12:24 -07001710 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001711 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001712
1713 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
minyue7a973442016-10-20 03:27:12 -07001714 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc2));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001715}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001716
Minyue Li7100dcd2015-03-27 05:05:59 +01001717// Test that with usedtx=0, Opus DTX is off.
1718TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001719 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001720 cricket::AudioSendParameters parameters;
1721 parameters.codecs.push_back(kOpusCodec);
1722 parameters.codecs[0].params["usedtx"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001723 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001724 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001725}
1726
1727// Test that with usedtx=1, Opus DTX is on.
1728TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001729 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001730 cricket::AudioSendParameters parameters;
1731 parameters.codecs.push_back(kOpusCodec);
1732 parameters.codecs[0].params["usedtx"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001733 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001734 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001735}
1736
1737// Test that usedtx=1 works with stereo Opus.
1738TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001739 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001740 cricket::AudioSendParameters parameters;
1741 parameters.codecs.push_back(kOpusCodec);
1742 parameters.codecs[0].params["usedtx"] = "1";
1743 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001744 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001745 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001746}
1747
1748// Test that usedtx=1 does not work with non Opus.
1749TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001750 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001751 cricket::AudioSendParameters parameters;
1752 parameters.codecs.push_back(kIsacCodec);
1753 parameters.codecs[0].params["usedtx"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001754 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001755 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001756}
1757
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001758// Test that we can switch back and forth between Opus and ISAC with CN.
1759TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001760 EXPECT_TRUE(SetupSendStream());
minyue7a973442016-10-20 03:27:12 -07001761
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001762 cricket::AudioSendParameters opus_parameters;
1763 opus_parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001764 SetSendParameters(opus_parameters);
minyue7a973442016-10-20 03:27:12 -07001765 {
1766 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1767 EXPECT_EQ(111, gcodec.pltype);
1768 EXPECT_STREQ("opus", gcodec.plname);
1769 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001770
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001771 cricket::AudioSendParameters isac_parameters;
1772 isac_parameters.codecs.push_back(kIsacCodec);
1773 isac_parameters.codecs.push_back(kCn16000Codec);
1774 isac_parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001775 SetSendParameters(isac_parameters);
minyue7a973442016-10-20 03:27:12 -07001776 {
1777 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1778 EXPECT_EQ(103, gcodec.pltype);
1779 EXPECT_STREQ("ISAC", gcodec.plname);
1780 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001781
solenberg059fb442016-10-26 05:12:24 -07001782 SetSendParameters(opus_parameters);
minyue7a973442016-10-20 03:27:12 -07001783 {
1784 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1785 EXPECT_EQ(111, gcodec.pltype);
1786 EXPECT_STREQ("opus", gcodec.plname);
1787 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001788}
1789
1790// Test that we handle various ways of specifying bitrate.
1791TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001792 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001793 cricket::AudioSendParameters parameters;
1794 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
solenberg059fb442016-10-26 05:12:24 -07001795 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001796 {
1797 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1798 EXPECT_EQ(103, gcodec.pltype);
1799 EXPECT_STREQ("ISAC", gcodec.plname);
1800 EXPECT_EQ(32000, gcodec.rate);
1801 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001802
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001803 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001804 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001805 {
1806 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1807 EXPECT_EQ(103, gcodec.pltype);
1808 EXPECT_STREQ("ISAC", gcodec.plname);
1809 EXPECT_EQ(-1, gcodec.rate);
1810 }
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001811 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
solenberg059fb442016-10-26 05:12:24 -07001812 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001813 {
1814 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1815 EXPECT_EQ(103, gcodec.pltype);
1816 EXPECT_STREQ("ISAC", gcodec.plname);
1817 EXPECT_EQ(28000, gcodec.rate);
1818 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001819
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001820 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
solenberg059fb442016-10-26 05:12:24 -07001821 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001822 {
1823 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1824 EXPECT_EQ(0, gcodec.pltype);
1825 EXPECT_STREQ("PCMU", gcodec.plname);
1826 EXPECT_EQ(64000, gcodec.rate);
1827 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001828
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001829 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001830 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001831 {
1832 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1833 EXPECT_EQ(0, gcodec.pltype);
1834 EXPECT_STREQ("PCMU", gcodec.plname);
1835 EXPECT_EQ(64000, gcodec.rate);
1836 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001837
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001838 parameters.codecs[0] = kOpusCodec;
1839 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001840 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001841 {
1842 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1843 EXPECT_EQ(111, gcodec.pltype);
1844 EXPECT_STREQ("opus", gcodec.plname);
1845 EXPECT_EQ(32000, gcodec.rate);
1846 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001847}
1848
Brave Yao5225dd82015-03-26 07:39:19 +08001849// Test that we could set packet size specified in kCodecParamPTime.
1850TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001851 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001852 cricket::AudioSendParameters parameters;
1853 parameters.codecs.push_back(kOpusCodec);
1854 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
solenberg059fb442016-10-26 05:12:24 -07001855 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001856 EXPECT_EQ(1920, GetCodecPacSize(kSsrc1)); // Opus gets 40ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001857
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001858 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
solenberg059fb442016-10-26 05:12:24 -07001859 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001860 EXPECT_EQ(480, GetCodecPacSize(kSsrc1)); // Opus gets 10ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001861
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001862 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
solenberg059fb442016-10-26 05:12:24 -07001863 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001864 EXPECT_EQ(2880, GetCodecPacSize(kSsrc1)); // Opus gets 60ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001865
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001866 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1867 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
solenberg059fb442016-10-26 05:12:24 -07001868 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001869 EXPECT_EQ(480, GetCodecPacSize(
1870 kSsrc1)); // Isac gets 30ms as the next smallest value.
Brave Yao5225dd82015-03-26 07:39:19 +08001871
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001872 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1873 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
solenberg059fb442016-10-26 05:12:24 -07001874 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001875 EXPECT_EQ(640, GetCodecPacSize(
1876 kSsrc1)); // G722 gets 40ms @16kHz as defined in VoE.
Brave Yao5225dd82015-03-26 07:39:19 +08001877}
1878
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001879// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001880TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001881 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001882 cricket::AudioSendParameters parameters;
1883 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001884}
1885
1886// Test that we can set send codecs even with telephone-event codec as the first
1887// one on the list.
1888TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001889 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001890 cricket::AudioSendParameters parameters;
solenberg2779bab2016-11-17 04:45:19 -08001891 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001892 parameters.codecs.push_back(kIsacCodec);
1893 parameters.codecs.push_back(kPcmuCodec);
1894 parameters.codecs[0].id = 98; // DTMF
1895 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001896 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001897 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001898 EXPECT_EQ(96, gcodec.pltype);
1899 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001900 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001901}
1902
solenberg31642aa2016-03-14 08:00:37 -07001903// Test that payload type range is limited for telephone-event codec.
1904TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001905 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001906 cricket::AudioSendParameters parameters;
solenbergffbbcac2016-11-17 05:25:37 -08001907 parameters.codecs.push_back(kTelephoneEventCodec2);
solenberg31642aa2016-03-14 08:00:37 -07001908 parameters.codecs.push_back(kIsacCodec);
1909 parameters.codecs[0].id = 0; // DTMF
1910 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001911 SetSendParameters(parameters);
solenberg31642aa2016-03-14 08:00:37 -07001912 EXPECT_TRUE(channel_->CanInsertDtmf());
1913 parameters.codecs[0].id = 128; // DTMF
1914 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1915 EXPECT_FALSE(channel_->CanInsertDtmf());
1916 parameters.codecs[0].id = 127;
solenberg059fb442016-10-26 05:12:24 -07001917 SetSendParameters(parameters);
solenberg31642aa2016-03-14 08:00:37 -07001918 EXPECT_TRUE(channel_->CanInsertDtmf());
1919 parameters.codecs[0].id = -1; // DTMF
1920 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1921 EXPECT_FALSE(channel_->CanInsertDtmf());
1922}
1923
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001924// Test that we can set send codecs even with CN codec as the first
1925// one on the list.
1926TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001927 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001928 cricket::AudioSendParameters parameters;
1929 parameters.codecs.push_back(kCn16000Codec);
1930 parameters.codecs.push_back(kIsacCodec);
1931 parameters.codecs.push_back(kPcmuCodec);
1932 parameters.codecs[0].id = 98; // wideband CN
1933 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001934 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001935 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1936 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1937 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1938 EXPECT_EQ(98, send_codec_spec.cng_payload_type);
1939 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001940}
1941
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001942// Test that we set VAD and DTMF types correctly as caller.
1943TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001944 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001945 cricket::AudioSendParameters parameters;
1946 parameters.codecs.push_back(kIsacCodec);
1947 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001948 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001949 parameters.codecs.push_back(kCn16000Codec);
1950 parameters.codecs.push_back(kCn8000Codec);
solenberg2779bab2016-11-17 04:45:19 -08001951 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001952 parameters.codecs[0].id = 96;
1953 parameters.codecs[2].id = 97; // wideband CN
1954 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07001955 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001956 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1957 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1958 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1959 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1960 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1961 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1962 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001963 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001964}
1965
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001966// Test that we set VAD and DTMF types correctly as callee.
1967TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001968 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001969 cricket::AudioSendParameters parameters;
1970 parameters.codecs.push_back(kIsacCodec);
1971 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001972 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001973 parameters.codecs.push_back(kCn16000Codec);
1974 parameters.codecs.push_back(kCn8000Codec);
solenbergffbbcac2016-11-17 05:25:37 -08001975 parameters.codecs.push_back(kTelephoneEventCodec2);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001976 parameters.codecs[0].id = 96;
1977 parameters.codecs[2].id = 97; // wideband CN
1978 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07001979 SetSendParameters(parameters);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001980 EXPECT_TRUE(channel_->AddSendStream(
1981 cricket::StreamParams::CreateLegacy(kSsrc1)));
1982
minyue7a973442016-10-20 03:27:12 -07001983 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1984 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1985 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1986 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1987 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1988 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1989 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001990 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001991}
1992
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001993// Test that we only apply VAD if we have a CN codec that matches the
1994// send codec clockrate.
1995TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07001996 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001997 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001998 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001999 parameters.codecs.push_back(kIsacCodec);
2000 parameters.codecs.push_back(kCn16000Codec);
2001 parameters.codecs[1].id = 97;
solenberg059fb442016-10-26 05:12:24 -07002002 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002003 {
2004 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2005 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2006 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2007 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2008 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2009 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
2010 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002011 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002012 parameters.codecs[0] = kPcmuCodec;
solenberg059fb442016-10-26 05:12:24 -07002013 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002014 {
2015 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2016 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2017 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2018 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002019 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002020 parameters.codecs[1] = kCn8000Codec;
solenberg059fb442016-10-26 05:12:24 -07002021 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002022 {
2023 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2024 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2025 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2026 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2027 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
2028 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
2029 }
Brave Yao5225dd82015-03-26 07:39:19 +08002030 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002031 parameters.codecs[0] = kIsacCodec;
solenberg059fb442016-10-26 05:12:24 -07002032 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002033 {
2034 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2035 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2036 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2037 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002038}
2039
2040// Test that we perform case-insensitive matching of codec names.
2041TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002042 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002043 cricket::AudioSendParameters parameters;
2044 parameters.codecs.push_back(kIsacCodec);
2045 parameters.codecs.push_back(kPcmuCodec);
2046 parameters.codecs.push_back(kCn16000Codec);
2047 parameters.codecs.push_back(kCn8000Codec);
solenberg2779bab2016-11-17 04:45:19 -08002048 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002049 parameters.codecs[0].name = "iSaC";
2050 parameters.codecs[0].id = 96;
2051 parameters.codecs[2].id = 97; // wideband CN
2052 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07002053 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002054 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2055 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2056 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2057 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2058 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2059 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2060 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002061 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002062}
2063
stefanba4c0e42016-02-04 04:12:24 -08002064class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2065 public:
2066 WebRtcVoiceEngineWithSendSideBweTest()
2067 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2068};
2069
2070TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2071 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002072 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002073 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07002074 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
2075 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
2076 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08002077 extension.id);
2078 return;
2079 }
2080 }
2081 FAIL() << "Transport sequence number extension not in header-extension list.";
2082}
2083
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002084// Test support for audio level header extension.
2085TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002086 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002087}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002088TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002089 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002090}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002091
solenbergd4adce42016-11-17 06:26:52 -08002092// Test support for transport sequence number header extension.
2093TEST_F(WebRtcVoiceEngineTestFake, SendTransportSequenceNumberHeaderExtensions) {
2094 TestSetSendRtpHeaderExtensions(
2095 webrtc::RtpExtension::kTransportSequenceNumberUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002096}
solenbergd4adce42016-11-17 06:26:52 -08002097TEST_F(WebRtcVoiceEngineTestFake, RecvTransportSequenceNumberHeaderExtensions) {
2098 TestSetRecvRtpHeaderExtensions(
2099 webrtc::RtpExtension::kTransportSequenceNumberUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002100}
2101
solenberg1ac56142015-10-13 03:58:19 -07002102// Test that we can create a channel and start sending on it.
2103TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002104 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002105 SetSendParameters(send_parameters_);
2106 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002107 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002108 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002109 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2110}
2111
2112// Test that a channel will send if and only if it has a source and is enabled
2113// for sending.
2114TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002115 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002116 SetSendParameters(send_parameters_);
2117 SetAudioSend(kSsrc1, true, nullptr);
2118 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002119 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002120 SetAudioSend(kSsrc1, true, &fake_source_);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002121 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002122 SetAudioSend(kSsrc1, true, nullptr);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002123 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002124}
2125
solenberg94218532016-06-16 10:53:22 -07002126// Test that a channel is muted/unmuted.
2127TEST_F(WebRtcVoiceEngineTestFake, SendStateMuteUnmute) {
2128 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002129 SetSendParameters(send_parameters_);
solenberg94218532016-06-16 10:53:22 -07002130 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
solenberg059fb442016-10-26 05:12:24 -07002131 SetAudioSend(kSsrc1, true, nullptr);
solenberg94218532016-06-16 10:53:22 -07002132 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
solenberg059fb442016-10-26 05:12:24 -07002133 SetAudioSend(kSsrc1, false, nullptr);
solenberg94218532016-06-16 10:53:22 -07002134 EXPECT_TRUE(GetSendStream(kSsrc1).muted());
2135}
2136
solenberg6d6e7c52016-04-13 09:07:30 -07002137// Test that SetSendParameters() does not alter a stream's send state.
2138TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2139 EXPECT_TRUE(SetupSendStream());
2140 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2141
2142 // Turn on sending.
solenberg059fb442016-10-26 05:12:24 -07002143 SetSend(true);
solenberg6d6e7c52016-04-13 09:07:30 -07002144 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2145
2146 // Changing RTP header extensions will recreate the AudioSendStream.
2147 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002148 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg059fb442016-10-26 05:12:24 -07002149 SetSendParameters(send_parameters_);
solenberg6d6e7c52016-04-13 09:07:30 -07002150 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2151
2152 // Turn off sending.
solenberg059fb442016-10-26 05:12:24 -07002153 SetSend(false);
solenberg6d6e7c52016-04-13 09:07:30 -07002154 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2155
2156 // Changing RTP header extensions will recreate the AudioSendStream.
2157 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -07002158 SetSendParameters(send_parameters_);
solenberg6d6e7c52016-04-13 09:07:30 -07002159 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2160}
2161
solenberg1ac56142015-10-13 03:58:19 -07002162// Test that we can create a channel and start playing out on it.
2163TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002164 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002165 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
aleloi84ef6152016-08-04 05:28:21 -07002166 channel_->SetPlayout(true);
2167 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
2168 channel_->SetPlayout(false);
2169 EXPECT_FALSE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002170}
2171
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002172// Test that we can add and remove send streams.
2173TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2174 SetupForMultiSendStream();
2175
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002176 // Set the global state for sending.
solenberg059fb442016-10-26 05:12:24 -07002177 SetSend(true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002178
solenbergc96df772015-10-21 13:01:53 -07002179 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002180 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002181 cricket::StreamParams::CreateLegacy(ssrc)));
solenberg059fb442016-10-26 05:12:24 -07002182 SetAudioSend(ssrc, true, &fake_source_);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002183 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002184 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002185 }
tfarina5237aaf2015-11-10 23:44:30 -08002186 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002187
solenbergc96df772015-10-21 13:01:53 -07002188 // Delete the send streams.
2189 for (uint32_t ssrc : kSsrcs4) {
2190 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002191 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002192 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002193 }
solenbergc96df772015-10-21 13:01:53 -07002194 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002195}
2196
2197// Test SetSendCodecs correctly configure the codecs in all send streams.
2198TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2199 SetupForMultiSendStream();
2200
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002201 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002202 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002203 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002204 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002205 }
2206
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002207 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002208 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002209 parameters.codecs.push_back(kIsacCodec);
2210 parameters.codecs.push_back(kCn16000Codec);
2211 parameters.codecs[1].id = 97;
solenberg059fb442016-10-26 05:12:24 -07002212 SetSendParameters(parameters);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002213
2214 // Verify ISAC and VAD are corrected configured on all send channels.
solenbergc96df772015-10-21 13:01:53 -07002215 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002216 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2217 const auto& send_codec_spec =
2218 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2219 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2220 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2221 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2222 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2223 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002224 }
2225
minyue7a973442016-10-20 03:27:12 -07002226 // Change to PCMU(8K) and CN(16K).
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002227 parameters.codecs[0] = kPcmuCodec;
solenberg059fb442016-10-26 05:12:24 -07002228 SetSendParameters(parameters);
solenbergc96df772015-10-21 13:01:53 -07002229 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002230 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2231 const auto& send_codec_spec =
2232 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2233 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2234 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2235 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2236 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002237 }
2238}
2239
2240// Test we can SetSend on all send streams correctly.
2241TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2242 SetupForMultiSendStream();
2243
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002244 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002245 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002246 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002247 cricket::StreamParams::CreateLegacy(ssrc)));
solenberg059fb442016-10-26 05:12:24 -07002248 SetAudioSend(ssrc, true, &fake_source_);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002249 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002250 }
2251
2252 // Set the global state for starting sending.
solenberg059fb442016-10-26 05:12:24 -07002253 SetSend(true);
solenbergc96df772015-10-21 13:01:53 -07002254 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002255 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002256 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002257 }
2258
2259 // Set the global state for stopping sending.
solenberg059fb442016-10-26 05:12:24 -07002260 SetSend(false);
solenbergc96df772015-10-21 13:01:53 -07002261 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002262 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002263 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002264 }
2265}
2266
2267// Test we can set the correct statistics on all send streams.
2268TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2269 SetupForMultiSendStream();
2270
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002271 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002272 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002273 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002274 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002275 }
solenberg85a04962015-10-27 03:35:21 -07002276
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002277 // Create a receive stream to check that none of the send streams end up in
2278 // the receive stream stats.
solenberg8189b022016-06-14 12:13:00 -07002279 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg971cab02016-06-14 10:02:41 -07002280
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002281 // We need send codec to be set to get all stats.
solenberg059fb442016-10-26 05:12:24 -07002282 SetSendParameters(send_parameters_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002283 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002284 SetAudioSendStreamStats();
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002285
solenberg85a04962015-10-27 03:35:21 -07002286 // Check stats for the added streams.
2287 {
2288 cricket::VoiceMediaInfo info;
2289 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002290
solenberg85a04962015-10-27 03:35:21 -07002291 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002292 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002293 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002294 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002295 }
hbos1acfbd22016-11-17 23:43:29 -08002296 VerifyVoiceSendRecvCodecs(info);
solenberg85a04962015-10-27 03:35:21 -07002297
2298 // We have added one receive stream. We should see empty stats.
2299 EXPECT_EQ(info.receivers.size(), 1u);
2300 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002301 }
solenberg1ac56142015-10-13 03:58:19 -07002302
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002303 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002304 {
2305 cricket::VoiceMediaInfo info;
2306 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2307 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002308 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002309 EXPECT_EQ(0u, info.receivers.size());
2310 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002311
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002312 // Deliver a new packet - a default receive stream should be created and we
2313 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002314 {
2315 cricket::VoiceMediaInfo info;
2316 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2317 SetAudioReceiveStreamStats();
2318 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002319 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002320 EXPECT_EQ(1u, info.receivers.size());
2321 VerifyVoiceReceiverInfo(info.receivers[0]);
hbos1acfbd22016-11-17 23:43:29 -08002322 VerifyVoiceSendRecvCodecs(info);
solenberg85a04962015-10-27 03:35:21 -07002323 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002324}
2325
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002326// Test that we can add and remove receive streams, and do proper send/playout.
2327// We can receive on multiple streams while sending one stream.
2328TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002329 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002330
solenberg1ac56142015-10-13 03:58:19 -07002331 // Start playout without a receive stream.
solenberg059fb442016-10-26 05:12:24 -07002332 SetSendParameters(send_parameters_);
aleloi84ef6152016-08-04 05:28:21 -07002333 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002334
solenberg1ac56142015-10-13 03:58:19 -07002335 // Adding another stream should enable playout on the new stream only.
solenberg8189b022016-06-14 12:13:00 -07002336 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg059fb442016-10-26 05:12:24 -07002337 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002338 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002339
solenberg1ac56142015-10-13 03:58:19 -07002340 // Make sure only the new stream is played out.
aleloi84ef6152016-08-04 05:28:21 -07002341 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002342
2343 // Adding yet another stream should have stream 2 and 3 enabled for playout.
solenberg8189b022016-06-14 12:13:00 -07002344 EXPECT_TRUE(AddRecvStream(kSsrc3));
aleloi84ef6152016-08-04 05:28:21 -07002345 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2346 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002347
2348 // Stop sending.
solenberg059fb442016-10-26 05:12:24 -07002349 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002350 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002351
2352 // Stop playout.
aleloi84ef6152016-08-04 05:28:21 -07002353 channel_->SetPlayout(false);
2354 EXPECT_FALSE(GetRecvStream(kSsrc2).started());
2355 EXPECT_FALSE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002356
aleloi84ef6152016-08-04 05:28:21 -07002357 // Restart playout and make sure recv streams are played out.
2358 channel_->SetPlayout(true);
2359 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2360 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002361
aleloi84ef6152016-08-04 05:28:21 -07002362 // Now remove the recv streams.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002363 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2364 EXPECT_TRUE(channel_->RemoveRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002365}
2366
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002367// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002368// and start sending on it.
2369TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002370 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002371 cricket::AudioOptions options_adjust_agc;
2372 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002373 webrtc::AgcConfig agc_config;
2374 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2375 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002376 send_parameters_.options = options_adjust_agc;
solenberg059fb442016-10-26 05:12:24 -07002377 SetSendParameters(send_parameters_);
2378 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002379 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002380 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2381 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenberg059fb442016-10-26 05:12:24 -07002382 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002383 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002384 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002385}
2386
wu@webrtc.org97077a32013-10-25 21:18:33 +00002387TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002388 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002389 EXPECT_CALL(adm_,
2390 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002391 webrtc::AgcConfig agc_config;
2392 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2393 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002394 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2395 send_parameters_.options.tx_agc_digital_compression_gain =
2396 rtc::Optional<uint16_t>(9);
2397 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2398 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002399 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002400 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2401 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2402 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2403 EXPECT_TRUE(agc_config.limiterEnable);
2404
2405 // Check interaction with adjust_agc_delta. Both should be respected, for
2406 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002407 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
solenberg059fb442016-10-26 05:12:24 -07002408 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002409 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2410 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2411}
2412
wu@webrtc.org97077a32013-10-25 21:18:33 +00002413TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002414 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002415 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2416 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002417 send_parameters_.options.recording_sample_rate =
2418 rtc::Optional<uint32_t>(48000);
2419 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
solenberg059fb442016-10-26 05:12:24 -07002420 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002421}
2422
minyue6b825df2016-10-31 04:08:32 -07002423TEST_F(WebRtcVoiceEngineTestFake, SetAudioNetworkAdaptorViaOptions) {
2424 EXPECT_TRUE(SetupSendStream());
2425 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2426 send_parameters_.options.audio_network_adaptor_config =
2427 rtc::Optional<std::string>("1234");
2428 SetSendParameters(send_parameters_);
2429 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2430 GetAudioNetworkAdaptorConfig(kSsrc1));
2431}
2432
2433TEST_F(WebRtcVoiceEngineTestFake, AudioSendResetAudioNetworkAdaptor) {
2434 EXPECT_TRUE(SetupSendStream());
2435 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2436 send_parameters_.options.audio_network_adaptor_config =
2437 rtc::Optional<std::string>("1234");
2438 SetSendParameters(send_parameters_);
2439 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2440 GetAudioNetworkAdaptorConfig(kSsrc1));
2441 const int initial_num = call_.GetNumCreatedSendStreams();
2442 cricket::AudioOptions options;
2443 options.audio_network_adaptor = rtc::Optional<bool>(false);
2444 SetAudioSend(kSsrc1, true, nullptr, &options);
2445 // AudioSendStream expected to be recreated.
2446 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
2447 EXPECT_EQ(rtc::Optional<std::string>(), GetAudioNetworkAdaptorConfig(kSsrc1));
2448}
2449
2450TEST_F(WebRtcVoiceEngineTestFake, AudioNetworkAdaptorNotGetOverridden) {
2451 EXPECT_TRUE(SetupSendStream());
2452 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2453 send_parameters_.options.audio_network_adaptor_config =
2454 rtc::Optional<std::string>("1234");
2455 SetSendParameters(send_parameters_);
2456 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2457 GetAudioNetworkAdaptorConfig(kSsrc1));
2458 const int initial_num = call_.GetNumCreatedSendStreams();
2459 cricket::AudioOptions options;
2460 options.audio_network_adaptor = rtc::Optional<bool>();
2461 // Unvalued |options.audio_network_adaptor|.should not reset audio network
2462 // adaptor.
2463 SetAudioSend(kSsrc1, true, nullptr, &options);
2464 // AudioSendStream not expected to be recreated.
2465 EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
2466 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2467 GetAudioNetworkAdaptorConfig(kSsrc1));
2468}
2469
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002470// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002471// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002472TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002473 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002474 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002475}
2476
2477TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2478 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002479 EXPECT_TRUE(SetupSendStream());
solenbergff976312016-03-30 23:28:51 -07002480 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002481 // stream has to use a different SSRC.
solenberg8189b022016-06-14 12:13:00 -07002482 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg059fb442016-10-26 05:12:24 -07002483 SetSendParameters(send_parameters_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002484 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002485 SetAudioSendStreamStats();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002486
solenberg85a04962015-10-27 03:35:21 -07002487 // Check stats for the added streams.
2488 {
2489 cricket::VoiceMediaInfo info;
2490 EXPECT_EQ(true, channel_->GetStats(&info));
2491
2492 // We have added one send stream. We should see the stats we've set.
2493 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002494 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002495 // We have added one receive stream. We should see empty stats.
2496 EXPECT_EQ(info.receivers.size(), 1u);
2497 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2498 }
solenberg1ac56142015-10-13 03:58:19 -07002499
solenberg566ef242015-11-06 15:34:49 -08002500 // Start sending - this affects some reported stats.
2501 {
2502 cricket::VoiceMediaInfo info;
solenberg059fb442016-10-26 05:12:24 -07002503 SetSend(true);
solenberg566ef242015-11-06 15:34:49 -08002504 EXPECT_EQ(true, channel_->GetStats(&info));
2505 VerifyVoiceSenderInfo(info.senders[0], true);
hbos1acfbd22016-11-17 23:43:29 -08002506 VerifyVoiceSendRecvCodecs(info);
solenberg566ef242015-11-06 15:34:49 -08002507 }
2508
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002509 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002510 {
2511 cricket::VoiceMediaInfo info;
2512 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2513 EXPECT_EQ(true, channel_->GetStats(&info));
2514 EXPECT_EQ(1u, info.senders.size());
2515 EXPECT_EQ(0u, info.receivers.size());
2516 }
solenberg1ac56142015-10-13 03:58:19 -07002517
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002518 // Deliver a new packet - a default receive stream should be created and we
2519 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002520 {
2521 cricket::VoiceMediaInfo info;
2522 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2523 SetAudioReceiveStreamStats();
2524 EXPECT_EQ(true, channel_->GetStats(&info));
2525 EXPECT_EQ(1u, info.senders.size());
2526 EXPECT_EQ(1u, info.receivers.size());
2527 VerifyVoiceReceiverInfo(info.receivers[0]);
hbos1acfbd22016-11-17 23:43:29 -08002528 VerifyVoiceSendRecvCodecs(info);
solenberg85a04962015-10-27 03:35:21 -07002529 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002530}
2531
2532// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002533// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002534TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002535 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002536 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg8189b022016-06-14 12:13:00 -07002537 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -08002538 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002539}
2540
2541// Test that the local SSRC is the same on sending and receiving channels if the
2542// receive channel is created before the send channel.
2543TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002544 EXPECT_TRUE(SetupChannel());
solenberg4a0f7b52016-06-16 13:07:33 -07002545 EXPECT_TRUE(AddRecvStream(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002546 EXPECT_TRUE(channel_->AddSendStream(
solenberg4a0f7b52016-06-16 13:07:33 -07002547 cricket::StreamParams::CreateLegacy(kSsrc1)));
2548 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
2549 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002550}
2551
2552// Test that we can properly receive packets.
2553TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002554 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002555 EXPECT_TRUE(AddRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002556 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002557
2558 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2559 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002560}
2561
2562// Test that we can properly receive packets on multiple streams.
2563TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002564 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002565 const uint32_t ssrc1 = 1;
2566 const uint32_t ssrc2 = 2;
2567 const uint32_t ssrc3 = 3;
solenberg8189b022016-06-14 12:13:00 -07002568 EXPECT_TRUE(AddRecvStream(ssrc1));
2569 EXPECT_TRUE(AddRecvStream(ssrc2));
2570 EXPECT_TRUE(AddRecvStream(ssrc3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002571 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002572 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002573 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002574 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002575 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002576 }
mflodman3d7db262016-04-29 00:57:13 -07002577
2578 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2579 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2580 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2581
2582 EXPECT_EQ(s1.received_packets(), 0);
2583 EXPECT_EQ(s2.received_packets(), 0);
2584 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002585
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002586 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002587 EXPECT_EQ(s1.received_packets(), 0);
2588 EXPECT_EQ(s2.received_packets(), 0);
2589 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002590
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002591 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002592 EXPECT_EQ(s1.received_packets(), 1);
2593 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2594 EXPECT_EQ(s2.received_packets(), 0);
2595 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002596
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002597 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002598 EXPECT_EQ(s1.received_packets(), 1);
2599 EXPECT_EQ(s2.received_packets(), 1);
2600 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2601 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002602
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002603 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002604 EXPECT_EQ(s1.received_packets(), 1);
2605 EXPECT_EQ(s2.received_packets(), 1);
2606 EXPECT_EQ(s3.received_packets(), 1);
2607 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002608
mflodman3d7db262016-04-29 00:57:13 -07002609 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2610 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2611 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002612}
2613
solenberg7e63ef02015-11-20 00:19:43 -08002614// Test that receiving on an unsignalled stream works (default channel will be
2615// created).
2616TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002617 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002618 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2619
solenberg7e63ef02015-11-20 00:19:43 -08002620 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002621
2622 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2623 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2624 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002625}
2626
2627// Test that receiving on an unsignalled stream works (default channel will be
2628// created), and that packets will be forwarded to the default channel
2629// regardless of their SSRCs.
2630TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002631 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002632 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002633 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2634
mflodman3d7db262016-04-29 00:57:13 -07002635 // Note that ssrc = 0 is not supported.
2636 uint32_t ssrc = 1;
2637 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002638 rtc::SetBE32(&packet[8], ssrc);
2639 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002640
2641 // Verify we only have one default stream.
2642 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2643 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2644 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002645 }
mflodman3d7db262016-04-29 00:57:13 -07002646
2647 // Sending the same ssrc again should not create a new stream.
2648 --ssrc;
2649 DeliverPacket(packet, sizeof(packet));
2650 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2651 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2652 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002653}
2654
2655// Test that a default channel is created even after a signalled stream has been
2656// added, and that this stream will get any packets for unknown SSRCs.
2657TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002658 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002659 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002660 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2661
2662 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002663 const uint32_t signaled_ssrc = 1;
2664 rtc::SetBE32(&packet[8], signaled_ssrc);
solenberg8189b022016-06-14 12:13:00 -07002665 EXPECT_TRUE(AddRecvStream(signaled_ssrc));
solenberg7e63ef02015-11-20 00:19:43 -08002666 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002667 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2668 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002669
2670 // Note that the first unknown SSRC cannot be 0, because we only support
2671 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002672 const uint32_t unsignaled_ssrc = 7011;
2673 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002674 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002675 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2676 packet, sizeof(packet)));
2677 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2678
2679 DeliverPacket(packet, sizeof(packet));
2680 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2681
2682 rtc::SetBE32(&packet[8], signaled_ssrc);
2683 DeliverPacket(packet, sizeof(packet));
2684 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2685 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002686}
2687
solenberg0a617e22015-10-20 15:49:38 -07002688// Test that we properly handle failures to add a receive stream.
2689TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002690 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002691 voe_.set_fail_create_channel(true);
solenberg8189b022016-06-14 12:13:00 -07002692 EXPECT_FALSE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002693}
2694
solenberg0a617e22015-10-20 15:49:38 -07002695// Test that we properly handle failures to add a send stream.
2696TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002697 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002698 voe_.set_fail_create_channel(true);
2699 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2700}
2701
solenberg1ac56142015-10-13 03:58:19 -07002702// Test that AddRecvStream creates new stream.
2703TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002704 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002705 int channel_num = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07002706 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002707 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002708}
2709
2710// Test that after adding a recv stream, we do not decode more codecs than
2711// those previously passed into SetRecvCodecs.
2712TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002713 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002714 cricket::AudioRecvParameters parameters;
2715 parameters.codecs.push_back(kIsacCodec);
2716 parameters.codecs.push_back(kPcmuCodec);
2717 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -07002718 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002719 int channel_num2 = voe_.GetLastChannel();
2720 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002721 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002722 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002723 gcodec.channels = 2;
2724 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2725}
2726
2727// Test that we properly clean up any streams that were added, even if
2728// not explicitly removed.
2729TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002730 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002731 SetSendParameters(send_parameters_);
solenberg8189b022016-06-14 12:13:00 -07002732 EXPECT_TRUE(AddRecvStream(1));
2733 EXPECT_TRUE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002734 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2735 delete channel_;
2736 channel_ = NULL;
2737 EXPECT_EQ(0, voe_.GetNumChannels());
2738}
2739
wu@webrtc.org78187522013-10-07 23:32:02 +00002740TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002741 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07002742 EXPECT_FALSE(AddRecvStream(0));
wu@webrtc.org78187522013-10-07 23:32:02 +00002743}
2744
2745TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002746 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002747 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002748 // Manually delete channel to simulate a failure.
2749 int channel = voe_.GetLastChannel();
2750 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2751 // Add recv stream 2 should work.
solenberg8189b022016-06-14 12:13:00 -07002752 EXPECT_TRUE(AddRecvStream(2));
wu@webrtc.org78187522013-10-07 23:32:02 +00002753 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002754 EXPECT_NE(channel, new_channel);
2755 // The last created channel is deleted too.
2756 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002757}
2758
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002759// Test the InsertDtmf on default send stream as caller.
2760TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
solenbergffbbcac2016-11-17 05:25:37 -08002761 TestInsertDtmf(0, true, kTelephoneEventCodec1);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002762}
2763
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002764// Test the InsertDtmf on default send stream as callee
2765TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
solenbergffbbcac2016-11-17 05:25:37 -08002766 TestInsertDtmf(0, false, kTelephoneEventCodec2);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002767}
2768
2769// Test the InsertDtmf on specified send stream as caller.
2770TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
solenbergffbbcac2016-11-17 05:25:37 -08002771 TestInsertDtmf(kSsrc1, true, kTelephoneEventCodec2);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002772}
2773
2774// Test the InsertDtmf on specified send stream as callee.
2775TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
solenbergffbbcac2016-11-17 05:25:37 -08002776 TestInsertDtmf(kSsrc1, false, kTelephoneEventCodec1);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002777}
2778
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002779TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002780 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002781 EXPECT_CALL(adm_,
2782 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2783 EXPECT_CALL(adm_,
2784 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2785 EXPECT_CALL(adm_,
2786 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002787 bool ec_enabled;
2788 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002789 webrtc::AecmModes aecm_mode;
2790 bool cng_enabled;
2791 bool agc_enabled;
2792 webrtc::AgcModes agc_mode;
2793 webrtc::AgcConfig agc_config;
2794 bool ns_enabled;
2795 webrtc::NsModes ns_mode;
2796 bool highpass_filter_enabled;
2797 bool stereo_swapping_enabled;
2798 bool typing_detection_enabled;
2799 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002800 voe_.GetAecmMode(aecm_mode, cng_enabled);
2801 voe_.GetAgcStatus(agc_enabled, agc_mode);
2802 voe_.GetAgcConfig(agc_config);
2803 voe_.GetNsStatus(ns_enabled, ns_mode);
2804 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2805 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2806 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2807 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002808 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002809 EXPECT_FALSE(cng_enabled);
2810 EXPECT_TRUE(agc_enabled);
2811 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2812 EXPECT_TRUE(ns_enabled);
2813 EXPECT_TRUE(highpass_filter_enabled);
2814 EXPECT_FALSE(stereo_swapping_enabled);
2815 EXPECT_TRUE(typing_detection_enabled);
2816 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2817 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002818 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2819 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002820
solenberg246b8172015-12-08 09:50:23 -08002821 // Nothing set in AudioOptions, so everything should be as default.
2822 send_parameters_.options = cricket::AudioOptions();
solenberg059fb442016-10-26 05:12:24 -07002823 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002824 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002825 voe_.GetAecmMode(aecm_mode, cng_enabled);
2826 voe_.GetAgcStatus(agc_enabled, agc_mode);
2827 voe_.GetAgcConfig(agc_config);
2828 voe_.GetNsStatus(ns_enabled, ns_mode);
2829 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2830 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2831 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2832 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002833 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002834 EXPECT_FALSE(cng_enabled);
2835 EXPECT_TRUE(agc_enabled);
2836 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2837 EXPECT_TRUE(ns_enabled);
2838 EXPECT_TRUE(highpass_filter_enabled);
2839 EXPECT_FALSE(stereo_swapping_enabled);
2840 EXPECT_TRUE(typing_detection_enabled);
2841 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2842 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002843 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2844 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002845
2846 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002847 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002848 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002849 voe_.GetEcStatus(ec_enabled, ec_mode);
2850 EXPECT_FALSE(ec_enabled);
2851
2852 // Turn echo cancellation back on, with settings, and make sure
2853 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002854 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002855 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002856 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002857 voe_.GetAecmMode(aecm_mode, cng_enabled);
2858 voe_.GetAgcStatus(agc_enabled, agc_mode);
2859 voe_.GetAgcConfig(agc_config);
2860 voe_.GetNsStatus(ns_enabled, ns_mode);
2861 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2862 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);
2869 EXPECT_TRUE(highpass_filter_enabled);
2870 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);
2922 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2923 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2924 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2925 EXPECT_FALSE(ns_enabled);
2926 EXPECT_FALSE(highpass_filter_enabled);
2927 EXPECT_FALSE(typing_detection_enabled);
2928 EXPECT_TRUE(stereo_swapping_enabled);
2929
solenberg1ac56142015-10-13 03:58:19 -07002930 // Set options again to ensure it has no impact.
solenberg059fb442016-10-26 05:12:24 -07002931 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002932 voe_.GetEcStatus(ec_enabled, ec_mode);
2933 voe_.GetNsStatus(ns_enabled, ns_mode);
2934 EXPECT_TRUE(ec_enabled);
2935 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2936 EXPECT_FALSE(ns_enabled);
2937 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2938}
2939
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002940TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002941 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002942
2943 bool ec_enabled;
2944 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002945 bool agc_enabled;
2946 webrtc::AgcModes agc_mode;
2947 bool ns_enabled;
2948 webrtc::NsModes ns_mode;
2949 bool highpass_filter_enabled;
2950 bool stereo_swapping_enabled;
2951 bool typing_detection_enabled;
2952
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002953 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002954 voe_.GetAgcStatus(agc_enabled, agc_mode);
2955 voe_.GetNsStatus(ns_enabled, ns_mode);
2956 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2957 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2958 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2959 EXPECT_TRUE(ec_enabled);
2960 EXPECT_TRUE(agc_enabled);
2961 EXPECT_TRUE(ns_enabled);
2962 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002963 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002964 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002965}
2966
2967TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2968 webrtc::AgcConfig set_config = {0};
2969 set_config.targetLeveldBOv = 3;
2970 set_config.digitalCompressionGaindB = 9;
2971 set_config.limiterEnable = true;
2972 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002973
2974 webrtc::AgcConfig config = {0};
2975 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2976 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2977 EXPECT_EQ(set_config.digitalCompressionGaindB,
2978 config.digitalCompressionGaindB);
2979 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2980}
2981
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002982TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002983 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002984 EXPECT_CALL(adm_,
2985 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2986 EXPECT_CALL(adm_,
2987 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
2988 EXPECT_CALL(adm_,
2989 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
solenberg059fb442016-10-26 05:12:24 -07002990 EXPECT_CALL(adm_,
2991 RecordingIsInitialized()).Times(2).WillRepeatedly(Return(false));
2992 EXPECT_CALL(adm_, Recording()).Times(2).WillRepeatedly(Return(false));
2993 EXPECT_CALL(adm_, InitRecording()).Times(2).WillRepeatedly(Return(0));
2994 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(10);
2995 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(10);
solenberg5b5129a2016-04-08 05:35:48 -07002996
kwiberg686a8ef2016-02-26 03:00:35 -08002997 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
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())));
kwiberg686a8ef2016-02-26 03:00:35 -08003000 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07003001 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003002 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003003
3004 // Have to add a stream to make SetSend work.
3005 cricket::StreamParams stream1;
3006 stream1.ssrcs.push_back(1);
3007 channel1->AddSendStream(stream1);
3008 cricket::StreamParams stream2;
3009 stream2.ssrcs.push_back(2);
3010 channel2->AddSendStream(stream2);
3011
3012 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003013 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003014 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
3015 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
3016 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07003017 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003018 EXPECT_EQ(parameters_options_all.options, channel1->options());
solenberg059fb442016-10-26 05:12:24 -07003019 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003020 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003021
3022 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003023 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003024 parameters_options_no_ns.options.noise_suppression =
3025 rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07003026 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003027 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003028 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3029 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3030 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003031 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003032
3033 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003034 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003035 parameters_options_no_agc.options.auto_gain_control =
3036 rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07003037 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003038 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3039 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3040 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003041 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003042
solenberg059fb442016-10-26 05:12:24 -07003043 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003044 bool ec_enabled;
3045 webrtc::EcModes ec_mode;
3046 bool agc_enabled;
3047 webrtc::AgcModes agc_mode;
3048 bool ns_enabled;
3049 webrtc::NsModes ns_mode;
3050 voe_.GetEcStatus(ec_enabled, ec_mode);
3051 voe_.GetAgcStatus(agc_enabled, agc_mode);
3052 voe_.GetNsStatus(ns_enabled, ns_mode);
3053 EXPECT_TRUE(ec_enabled);
3054 EXPECT_TRUE(agc_enabled);
3055 EXPECT_TRUE(ns_enabled);
3056
solenberg059fb442016-10-26 05:12:24 -07003057 channel1->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003058 voe_.GetEcStatus(ec_enabled, ec_mode);
3059 voe_.GetAgcStatus(agc_enabled, agc_mode);
3060 voe_.GetNsStatus(ns_enabled, ns_mode);
3061 EXPECT_TRUE(ec_enabled);
3062 EXPECT_TRUE(agc_enabled);
3063 EXPECT_FALSE(ns_enabled);
3064
solenberg059fb442016-10-26 05:12:24 -07003065 channel2->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003066 voe_.GetEcStatus(ec_enabled, ec_mode);
3067 voe_.GetAgcStatus(agc_enabled, agc_mode);
3068 voe_.GetNsStatus(ns_enabled, ns_mode);
3069 EXPECT_TRUE(ec_enabled);
3070 EXPECT_FALSE(agc_enabled);
3071 EXPECT_TRUE(ns_enabled);
3072
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003073 // Make sure settings take effect while we are sending.
solenberg059fb442016-10-26 05:12:24 -07003074 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
3075 EXPECT_CALL(apm_, ApplyConfig(testing::_));
3076 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003077 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3078 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003079 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003080 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003081 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003082 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003083 channel2->SetSend(true);
solenberg059fb442016-10-26 05:12:24 -07003084 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc_nor_ns));
Karl Wibergbe579832015-11-10 22:34:18 +01003085 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3086 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3087 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003088 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003089 voe_.GetEcStatus(ec_enabled, ec_mode);
3090 voe_.GetAgcStatus(agc_enabled, agc_mode);
3091 voe_.GetNsStatus(ns_enabled, ns_mode);
3092 EXPECT_TRUE(ec_enabled);
3093 EXPECT_FALSE(agc_enabled);
3094 EXPECT_FALSE(ns_enabled);
3095}
3096
wu@webrtc.orgde305012013-10-31 15:40:38 +00003097// This test verifies DSCP settings are properly applied on voice media channel.
3098TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003099 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003100 cricket::FakeNetworkInterface network_interface;
3101 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003102 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003103
solenberg059fb442016-10-26 05:12:24 -07003104 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(3);
3105 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(3);
3106
solenbergbc37fc82016-04-04 09:54:44 -07003107 channel.reset(
3108 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003109 channel->SetInterface(&network_interface);
3110 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3111 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3112
3113 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003114 channel.reset(
3115 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003116 channel->SetInterface(&network_interface);
3117 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3118
3119 // Verify that setting the option to false resets the
3120 // DiffServCodePoint.
3121 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003122 channel.reset(
3123 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003124 channel->SetInterface(&network_interface);
3125 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3126 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3127
3128 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003129}
3130
solenberg1ac56142015-10-13 03:58:19 -07003131TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003132 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003133 cricket::WebRtcVoiceMediaChannel* media_channel =
3134 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003135 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
solenberg8189b022016-06-14 12:13:00 -07003136 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -07003137 int channel_id = voe_.GetLastChannel();
3138 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3139 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
solenberg8189b022016-06-14 12:13:00 -07003140 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07003141 int channel_id2 = voe_.GetLastChannel();
3142 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003143}
3144
solenberg1ac56142015-10-13 03:58:19 -07003145TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003146 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003147 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003148 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3149 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3150 EXPECT_TRUE(channel_->AddSendStream(
3151 cricket::StreamParams::CreateLegacy(kSsrc1)));
3152 int channel_id = voe_.GetLastChannel();
3153 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3154 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3155 EXPECT_TRUE(channel_->AddSendStream(
3156 cricket::StreamParams::CreateLegacy(kSsrc2)));
3157 int channel_id2 = voe_.GetLastChannel();
3158 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003159}
3160
solenberg4bac9c52015-10-09 02:32:53 -07003161TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003162 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003163 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003164 cricket::StreamParams stream;
3165 stream.ssrcs.push_back(kSsrc2);
3166 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg217fb662016-06-17 08:30:54 -07003167 EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrc2).gain());
solenberg4bac9c52015-10-09 02:32:53 -07003168 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg217fb662016-06-17 08:30:54 -07003169 EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc2).gain());
solenberg1ac56142015-10-13 03:58:19 -07003170}
3171
3172TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003173 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003174 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3175 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg217fb662016-06-17 08:30:54 -07003176 EXPECT_DOUBLE_EQ(2, GetRecvStream(1).gain());
solenberg1ac56142015-10-13 03:58:19 -07003177 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenberg217fb662016-06-17 08:30:54 -07003178 EXPECT_DOUBLE_EQ(3, GetRecvStream(1).gain());
3179 EXPECT_TRUE(channel_->SetOutputVolume(1, 4));
3180 EXPECT_DOUBLE_EQ(4, GetRecvStream(1).gain());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003181}
3182
pbos8fc7fa72015-07-15 08:02:58 -07003183TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003184 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003185 const std::string kSyncLabel = "AvSyncLabel";
3186
solenbergff976312016-03-30 23:28:51 -07003187 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003188 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3189 sp.sync_label = kSyncLabel;
3190 // Creating two channels to make sure that sync label is set properly for both
3191 // the default voice channel and following ones.
3192 EXPECT_TRUE(channel_->AddRecvStream(sp));
3193 sp.ssrcs[0] += 1;
3194 EXPECT_TRUE(channel_->AddRecvStream(sp));
3195
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003196 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003197 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003198 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003199 << "SyncGroup should be set based on sync_label";
3200 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003201 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003202 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003203}
3204
solenberg3a941542015-11-16 07:34:50 -08003205// TODO(solenberg): Remove, once recv streams are configured through Call.
3206// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003207TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003208 // Test that setting the header extensions results in the expected state
3209 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003210 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003211 ssrcs.push_back(223);
3212 ssrcs.push_back(224);
3213
solenbergff976312016-03-30 23:28:51 -07003214 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07003215 SetSendParameters(send_parameters_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02003216 for (uint32_t ssrc : ssrcs) {
solenberg059fb442016-10-26 05:12:24 -07003217 EXPECT_TRUE(channel_->AddRecvStream(
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003218 cricket::StreamParams::CreateLegacy(ssrc)));
3219 }
3220
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003221 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003222 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003223 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003224 EXPECT_NE(nullptr, s);
3225 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3226 }
3227
3228 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003229 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003230 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003231 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003232 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003233 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003234 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003235 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003236 EXPECT_NE(nullptr, s);
3237 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003238 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3239 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003240 for (const auto& s_ext : s_exts) {
3241 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003242 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003243 }
3244 }
3245 }
3246 }
3247
3248 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003249 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003250 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003251 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003252 EXPECT_NE(nullptr, s);
3253 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3254 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003255}
3256
3257TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3258 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003259 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003260 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003261 static const unsigned char kRtcp[] = {
3262 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3263 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3264 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3265 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3266 };
jbaucheec21bd2016-03-20 06:15:43 -07003267 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003268
solenbergff976312016-03-30 23:28:51 -07003269 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003270 cricket::WebRtcVoiceMediaChannel* media_channel =
3271 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg059fb442016-10-26 05:12:24 -07003272 SetSendParameters(send_parameters_);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003273 EXPECT_TRUE(media_channel->AddRecvStream(
3274 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3275
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003276 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003277 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003278 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003279 EXPECT_EQ(0, s->received_packets());
3280 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3281 EXPECT_EQ(1, s->received_packets());
3282 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3283 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003284}
Minyue2013aec2015-05-13 14:14:42 +02003285
solenberg0a617e22015-10-20 15:49:38 -07003286// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003287// since they do not send RTCP SR.
solenberg7602aab2016-11-14 11:30:07 -08003288TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_SendCreatedFirst) {
solenbergff976312016-03-30 23:28:51 -07003289 EXPECT_TRUE(SetupSendStream());
solenberg7602aab2016-11-14 11:30:07 -08003290 EXPECT_TRUE(AddRecvStream(kSsrc2));
3291 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
3292 EXPECT_TRUE(channel_->AddSendStream(
3293 cricket::StreamParams::CreateLegacy(kSsrc3)));
3294 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
3295 EXPECT_TRUE(AddRecvStream(kSsrc4));
3296 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc4).rtp.local_ssrc);
Minyue2013aec2015-05-13 14:14:42 +02003297}
3298
solenberg7602aab2016-11-14 11:30:07 -08003299TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_RecvCreatedFirst) {
3300 EXPECT_TRUE(SetupRecvStream());
3301 EXPECT_EQ(0xFA17FA17u, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3302 EXPECT_TRUE(channel_->AddSendStream(
3303 cricket::StreamParams::CreateLegacy(kSsrc2)));
3304 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3305 EXPECT_TRUE(AddRecvStream(kSsrc3));
3306 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc3).rtp.local_ssrc);
3307 EXPECT_TRUE(channel_->AddSendStream(
3308 cricket::StreamParams::CreateLegacy(kSsrc4)));
3309 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3310 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc3).rtp.local_ssrc);
Minyue2013aec2015-05-13 14:14:42 +02003311}
stefan658910c2015-09-03 05:48:32 -07003312
deadbeef884f5852016-01-15 09:20:04 -08003313TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003314 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003315 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3316 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003317
3318 // Setting the sink before a recv stream exists should do nothing.
3319 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
solenberg8189b022016-06-14 12:13:00 -07003320 EXPECT_TRUE(AddRecvStream(kSsrc1));
deadbeef884f5852016-01-15 09:20:04 -08003321 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3322
3323 // Now try actually setting the sink.
3324 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3325 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3326
3327 // Now try resetting it.
3328 channel_->SetRawAudioSink(kSsrc1, nullptr);
3329 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3330}
3331
3332TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003333 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003334 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3335 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003336
3337 // Should be able to set a default sink even when no stream exists.
3338 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3339
3340 // Create default channel and ensure it's assigned the default sink.
3341 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3342 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3343
3344 // Try resetting the default sink.
3345 channel_->SetRawAudioSink(0, nullptr);
3346 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3347
3348 // Try setting the default sink while the default stream exists.
3349 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3350 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3351
3352 // If we remove and add a default stream, it should get the same sink.
3353 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3354 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3355 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3356}
3357
skvlad7a43d252016-03-22 15:32:27 -07003358// Test that, just like the video channel, the voice channel communicates the
3359// network state to the call.
3360TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003361 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003362
3363 EXPECT_EQ(webrtc::kNetworkUp,
3364 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3365 EXPECT_EQ(webrtc::kNetworkUp,
3366 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3367
3368 channel_->OnReadyToSend(false);
3369 EXPECT_EQ(webrtc::kNetworkDown,
3370 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3371 EXPECT_EQ(webrtc::kNetworkUp,
3372 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3373
3374 channel_->OnReadyToSend(true);
3375 EXPECT_EQ(webrtc::kNetworkUp,
3376 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3377 EXPECT_EQ(webrtc::kNetworkUp,
3378 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3379}
3380
aleloi18e0b672016-10-04 02:45:47 -07003381// Test that playout is still started after changing parameters
3382TEST_F(WebRtcVoiceEngineTestFake, PreservePlayoutWhenRecreateRecvStream) {
3383 SetupRecvStream();
3384 channel_->SetPlayout(true);
3385 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3386
3387 // Changing RTP header extensions will recreate the AudioReceiveStream.
3388 cricket::AudioRecvParameters parameters;
3389 parameters.extensions.push_back(
3390 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
3391 channel_->SetRecvParameters(parameters);
3392
3393 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3394}
3395
stefan658910c2015-09-03 05:48:32 -07003396// Tests that the library initializes and shuts down properly.
3397TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossu29b1a8d2016-06-13 07:34:51 -07003398 // If the VoiceEngine wants to gather available codecs early, that's fine but
3399 // we never want it to create a decoder at this stage.
ossuc54071d2016-08-17 02:45:41 -07003400 cricket::WebRtcVoiceEngine engine(
3401 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003402 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003403 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003404 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003405 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3406 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003407 EXPECT_TRUE(channel != nullptr);
3408 delete channel;
solenbergff976312016-03-30 23:28:51 -07003409}
stefan658910c2015-09-03 05:48:32 -07003410
solenbergff976312016-03-30 23:28:51 -07003411// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003412TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3413 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3414 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3415 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003416 {
ossuc54071d2016-08-17 02:45:41 -07003417 cricket::WebRtcVoiceEngine engine(
3418 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003419 webrtc::RtcEventLogNullImpl event_log;
solenbergff976312016-03-30 23:28:51 -07003420 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003421 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
solenbergff976312016-03-30 23:28:51 -07003422 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3423 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3424 EXPECT_TRUE(channel != nullptr);
3425 delete channel;
3426 }
stefan658910c2015-09-03 05:48:32 -07003427}
3428
3429// Tests that the library is configured with the codecs we want.
3430TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003431 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3432 // module.
3433
stefan658910c2015-09-03 05:48:32 -07003434 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003435 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003436 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003437 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003438 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003439 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003440 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003441 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003442 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003443 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003444 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003445 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003446 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003447 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003448 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003449 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003450 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003451 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
solenberg2779bab2016-11-17 04:45:19 -08003452 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3453 cricket::AudioCodec(96, "telephone-event", 16000, 0, 1), nullptr));
3454 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3455 cricket::AudioCodec(96, "telephone-event", 32000, 0, 1), nullptr));
3456 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3457 cricket::AudioCodec(96, "telephone-event", 48000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003458 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003459 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003460 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003461 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003462 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003463 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003464 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003465 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003466 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003467 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003468 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003469 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003470 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003471 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003472 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003473 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003474 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003475 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003476 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003477 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003478 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003479 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003480 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003481
stefan658910c2015-09-03 05:48:32 -07003482 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossuc54071d2016-08-17 02:45:41 -07003483 // TODO(ossu): Why are the payload types of codecs with non-static payload
3484 // type assignments checked here? It shouldn't really matter.
3485 cricket::WebRtcVoiceEngine engine(
3486 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
solenberg2779bab2016-11-17 04:45:19 -08003487 for (const cricket::AudioCodec& codec : engine.send_codecs()) {
3488 if (codec.name == "CN" && codec.clockrate == 16000) {
3489 EXPECT_EQ(105, codec.id);
3490 } else if (codec.name == "CN" && codec.clockrate == 32000) {
3491 EXPECT_EQ(106, codec.id);
3492 } else if (codec.name == "ISAC" && codec.clockrate == 16000) {
3493 EXPECT_EQ(103, codec.id);
3494 } else if (codec.name == "ISAC" && codec.clockrate == 32000) {
3495 EXPECT_EQ(104, codec.id);
3496 } else if (codec.name == "G722" && codec.clockrate == 8000) {
3497 EXPECT_EQ(9, codec.id);
3498 } else if (codec.name == "telephone-event" && codec.clockrate == 8000) {
3499 EXPECT_EQ(126, codec.id);
3500 // TODO(solenberg): 16k, 32k, 48k DTMF should be dynamically assigned.
3501 // Remove these checks once both send and receive side assigns payload types
3502 // dynamically.
3503 } else if (codec.name == "telephone-event" && codec.clockrate == 16000) {
3504 EXPECT_EQ(113, codec.id);
3505 } else if (codec.name == "telephone-event" && codec.clockrate == 32000) {
3506 EXPECT_EQ(112, codec.id);
3507 } else if (codec.name == "telephone-event" && codec.clockrate == 48000) {
3508 EXPECT_EQ(110, codec.id);
3509 } else if (codec.name == "opus") {
3510 EXPECT_EQ(111, codec.id);
3511 ASSERT_TRUE(codec.params.find("minptime") != codec.params.end());
3512 EXPECT_EQ("10", codec.params.find("minptime")->second);
3513 ASSERT_TRUE(codec.params.find("useinbandfec") != codec.params.end());
3514 EXPECT_EQ("1", codec.params.find("useinbandfec")->second);
stefan658910c2015-09-03 05:48:32 -07003515 }
3516 }
stefan658910c2015-09-03 05:48:32 -07003517}
3518
3519// Tests that VoE supports at least 32 channels
3520TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossuc54071d2016-08-17 02:45:41 -07003521 cricket::WebRtcVoiceEngine engine(
3522 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003523 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003524 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003525 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
stefan658910c2015-09-03 05:48:32 -07003526
3527 cricket::VoiceMediaChannel* channels[32];
3528 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003529 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003530 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3531 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003532 if (!channel)
3533 break;
stefan658910c2015-09-03 05:48:32 -07003534 channels[num_channels++] = channel;
3535 }
3536
tfarina5237aaf2015-11-10 23:44:30 -08003537 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003538 EXPECT_EQ(expected, num_channels);
3539
3540 while (num_channels > 0) {
3541 delete channels[--num_channels];
3542 }
stefan658910c2015-09-03 05:48:32 -07003543}
3544
3545// Test that we set our preferred codecs properly.
3546TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003547 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3548 // - Check that our builtin codecs are usable by Channel.
3549 // - The codecs provided by the engine is usable by Channel.
3550 // It does not check that the codecs in the RecvParameters are actually
3551 // what we sent in - though it's probably reasonable to expect so, if
3552 // SetRecvParameters returns true.
3553 // I think it will become clear once audio decoder injection is completed.
3554 cricket::WebRtcVoiceEngine engine(
3555 nullptr, webrtc::CreateBuiltinAudioDecoderFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003556 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003557 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003558 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003559 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3560 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003561 cricket::AudioRecvParameters parameters;
ossudedfd282016-06-14 07:12:39 -07003562 parameters.codecs = engine.recv_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003563 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003564}