blob: 3bab92ddc65efe6cfcb88886e2b091ec2c2fdd74 [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";
449 stats.ext_seqnum = 789;
450 stats.jitter_ms = 12;
451 stats.rtt_ms = 345;
452 stats.audio_level = 678;
453 stats.aec_quality_min = 9.01f;
454 stats.echo_delay_median_ms = 234;
455 stats.echo_delay_std_ms = 567;
456 stats.echo_return_loss = 890;
457 stats.echo_return_loss_enhancement = 1234;
ivoc8c63a822016-10-21 04:10:03 -0700458 stats.residual_echo_likelihood = 0.432f;
solenberg85a04962015-10-27 03:35:21 -0700459 stats.typing_noise_detected = true;
460 return stats;
461 }
462 void SetAudioSendStreamStats() {
463 for (auto* s : call_.GetAudioSendStreams()) {
464 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200465 }
solenberg85a04962015-10-27 03:35:21 -0700466 }
solenberg566ef242015-11-06 15:34:49 -0800467 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
468 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700469 const auto stats = GetAudioSendStreamStats();
470 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
471 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
472 EXPECT_EQ(info.packets_sent, stats.packets_sent);
473 EXPECT_EQ(info.packets_lost, stats.packets_lost);
474 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
475 EXPECT_EQ(info.codec_name, stats.codec_name);
476 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
477 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
478 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
479 EXPECT_EQ(info.audio_level, stats.audio_level);
480 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
481 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
482 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
483 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
484 EXPECT_EQ(info.echo_return_loss_enhancement,
485 stats.echo_return_loss_enhancement);
ivoc8c63a822016-10-21 04:10:03 -0700486 EXPECT_EQ(info.residual_echo_likelihood, stats.residual_echo_likelihood);
solenberg566ef242015-11-06 15:34:49 -0800487 EXPECT_EQ(info.typing_noise_detected,
488 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700489 }
490
491 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
492 webrtc::AudioReceiveStream::Stats stats;
493 stats.remote_ssrc = 123;
494 stats.bytes_rcvd = 456;
495 stats.packets_rcvd = 768;
496 stats.packets_lost = 101;
497 stats.fraction_lost = 23.45f;
498 stats.codec_name = "codec_name_recv";
499 stats.ext_seqnum = 678;
500 stats.jitter_ms = 901;
501 stats.jitter_buffer_ms = 234;
502 stats.jitter_buffer_preferred_ms = 567;
503 stats.delay_estimate_ms = 890;
504 stats.audio_level = 1234;
505 stats.expand_rate = 5.67f;
506 stats.speech_expand_rate = 8.90f;
507 stats.secondary_decoded_rate = 1.23f;
508 stats.accelerate_rate = 4.56f;
509 stats.preemptive_expand_rate = 7.89f;
510 stats.decoding_calls_to_silence_generator = 12;
511 stats.decoding_calls_to_neteq = 345;
512 stats.decoding_normal = 67890;
513 stats.decoding_plc = 1234;
514 stats.decoding_cng = 5678;
515 stats.decoding_plc_cng = 9012;
henrik.lundin63489782016-09-20 01:47:12 -0700516 stats.decoding_muted_output = 3456;
517 stats.capture_start_ntp_time_ms = 7890;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200518 return stats;
519 }
520 void SetAudioReceiveStreamStats() {
521 for (auto* s : call_.GetAudioReceiveStreams()) {
522 s->SetStats(GetAudioReceiveStreamStats());
523 }
524 }
525 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700526 const auto stats = GetAudioReceiveStreamStats();
527 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
528 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
529 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
530 EXPECT_EQ(info.packets_lost, stats.packets_lost);
531 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
532 EXPECT_EQ(info.codec_name, stats.codec_name);
533 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
534 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
535 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200536 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700537 stats.jitter_buffer_preferred_ms);
538 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
539 EXPECT_EQ(info.audio_level, stats.audio_level);
540 EXPECT_EQ(info.expand_rate, stats.expand_rate);
541 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
542 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
543 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
544 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200545 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700546 stats.decoding_calls_to_silence_generator);
547 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
548 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
549 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
550 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
551 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
henrik.lundin63489782016-09-20 01:47:12 -0700552 EXPECT_EQ(info.decoding_muted_output, stats.decoding_muted_output);
solenberg85a04962015-10-27 03:35:21 -0700553 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200554 }
555
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000556 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700557 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
solenberg059fb442016-10-26 05:12:24 -0700558 StrictMock<webrtc::test::MockAudioProcessing> apm_;
skvlad11a9cbf2016-10-07 11:53:05 -0700559 webrtc::RtcEventLogNullImpl event_log_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200560 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000561 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700562 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700563 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200564 cricket::AudioSendParameters send_parameters_;
565 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800566 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800567 private:
568 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000569};
570
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000571// Tests that we can create and destroy a channel.
572TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700573 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000574}
575
solenberg31fec402016-05-06 02:13:12 -0700576// Test that we can add a send stream and that it has the correct defaults.
577TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
578 EXPECT_TRUE(SetupChannel());
579 EXPECT_TRUE(
580 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
581 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
582 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
583 EXPECT_EQ("", config.rtp.c_name);
584 EXPECT_EQ(0u, config.rtp.extensions.size());
585 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
586 config.send_transport);
587}
588
589// Test that we can add a receive stream and that it has the correct defaults.
590TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
591 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -0700592 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg31fec402016-05-06 02:13:12 -0700593 const webrtc::AudioReceiveStream::Config& config =
594 GetRecvStreamConfig(kSsrc1);
595 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
596 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
597 EXPECT_FALSE(config.rtp.transport_cc);
598 EXPECT_EQ(0u, config.rtp.extensions.size());
599 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
600 config.rtcp_send_transport);
601 EXPECT_EQ("", config.sync_group);
602}
603
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000604// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700605// correctly (such that opus appears first).
ossudedfd282016-06-14 07:12:39 -0700606// TODO(ossu): This test should move into a separate builtin audio codecs
607// module.
deadbeef67cf2c12016-04-13 10:07:16 -0700608TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
ossudedfd282016-06-14 07:12:39 -0700609 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000610 ASSERT_FALSE(codecs.empty());
611 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
612 EXPECT_EQ(48000, codecs[0].clockrate);
613 EXPECT_EQ(2, codecs[0].channels);
614 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000615}
616
stefanba4c0e42016-02-04 04:12:24 -0800617TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
ossudedfd282016-06-14 07:12:39 -0700618 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -0800619 bool opus_found = false;
620 for (cricket::AudioCodec codec : codecs) {
621 if (codec.name == "opus") {
622 EXPECT_TRUE(HasTransportCc(codec));
623 opus_found = true;
624 }
625 }
626 EXPECT_TRUE(opus_found);
627}
628
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000629// Tests that we can find codecs by name or id, and that we interpret the
630// clockrate and bitrate fields properly.
631TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
632 cricket::AudioCodec codec;
633 webrtc::CodecInst codec_inst;
634 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800635 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000636 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800637 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000638 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg2779bab2016-11-17 04:45:19 -0800639 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec1,
640 &codec_inst));
641 // Find telephone-event with explicit clockrate and 0 bitrate.
642 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec2,
solenberg26c8c912015-11-27 04:00:25 -0800643 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000644 // Find ISAC with a different payload id.
645 codec = kIsacCodec;
646 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800647 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 EXPECT_EQ(codec.id, codec_inst.pltype);
649 // Find PCMU with a 0 clockrate.
650 codec = kPcmuCodec;
651 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800652 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000653 EXPECT_EQ(codec.id, codec_inst.pltype);
654 EXPECT_EQ(8000, codec_inst.plfreq);
655 // Find PCMU with a 0 bitrate.
656 codec = kPcmuCodec;
657 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800658 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000659 EXPECT_EQ(codec.id, codec_inst.pltype);
660 EXPECT_EQ(64000, codec_inst.rate);
661 // Find ISAC with an explicit bitrate.
662 codec = kIsacCodec;
663 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800664 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000665 EXPECT_EQ(codec.id, codec_inst.pltype);
666 EXPECT_EQ(32000, codec_inst.rate);
667}
668
669// Test that we set our inbound codecs properly, including changing PT.
670TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700671 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200672 cricket::AudioRecvParameters parameters;
673 parameters.codecs.push_back(kIsacCodec);
674 parameters.codecs.push_back(kPcmuCodec);
solenberg2779bab2016-11-17 04:45:19 -0800675 parameters.codecs.push_back(kTelephoneEventCodec1);
676 parameters.codecs.push_back(kTelephoneEventCodec2);
677 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200678 parameters.codecs[2].id = 126;
679 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700680 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700681 int channel_num = voe_.GetLastChannel();
solenberg2779bab2016-11-17 04:45:19 -0800682
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000683 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800684 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000685 gcodec.plfreq = 16000;
686 gcodec.channels = 1;
687 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
688 EXPECT_EQ(106, gcodec.pltype);
689 EXPECT_STREQ("ISAC", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800690
tfarina5237aaf2015-11-10 23:44:30 -0800691 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692 gcodec.plfreq = 8000;
693 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
694 EXPECT_EQ(126, gcodec.pltype);
695 EXPECT_STREQ("telephone-event", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800696
697 gcodec.plfreq = 32000;
698 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
699 EXPECT_EQ(107, gcodec.pltype);
700 EXPECT_STREQ("telephone-event", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000701}
702
703// Test that we fail to set an unknown inbound codec.
704TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700705 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200706 cricket::AudioRecvParameters parameters;
707 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700708 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200709 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000710}
711
712// Test that we fail if we have duplicate types in the inbound list.
713TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700714 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200715 cricket::AudioRecvParameters parameters;
716 parameters.codecs.push_back(kIsacCodec);
717 parameters.codecs.push_back(kCn16000Codec);
718 parameters.codecs[1].id = kIsacCodec.id;
719 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000720}
721
722// Test that we can decode OPUS without stereo parameters.
723TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700724 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200725 cricket::AudioRecvParameters parameters;
726 parameters.codecs.push_back(kIsacCodec);
727 parameters.codecs.push_back(kPcmuCodec);
728 parameters.codecs.push_back(kOpusCodec);
729 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700730 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700731 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000732 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800733 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000734 // Even without stereo parameters, recv codecs still specify channels = 2.
735 EXPECT_EQ(2, opus.channels);
736 EXPECT_EQ(111, opus.pltype);
737 EXPECT_STREQ("opus", opus.plname);
738 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700739 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000740 EXPECT_EQ(111, opus.pltype);
741}
742
743// Test that we can decode OPUS with stereo = 0.
744TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700745 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200746 cricket::AudioRecvParameters parameters;
747 parameters.codecs.push_back(kIsacCodec);
748 parameters.codecs.push_back(kPcmuCodec);
749 parameters.codecs.push_back(kOpusCodec);
750 parameters.codecs[2].params["stereo"] = "0";
751 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700752 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000753 int channel_num2 = voe_.GetLastChannel();
754 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800755 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000756 // Even when stereo is off, recv codecs still specify channels = 2.
757 EXPECT_EQ(2, opus.channels);
758 EXPECT_EQ(111, opus.pltype);
759 EXPECT_STREQ("opus", opus.plname);
760 opus.pltype = 0;
761 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
762 EXPECT_EQ(111, opus.pltype);
763}
764
765// Test that we can decode OPUS with stereo = 1.
766TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700767 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200768 cricket::AudioRecvParameters parameters;
769 parameters.codecs.push_back(kIsacCodec);
770 parameters.codecs.push_back(kPcmuCodec);
771 parameters.codecs.push_back(kOpusCodec);
772 parameters.codecs[2].params["stereo"] = "1";
773 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700774 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000775 int channel_num2 = voe_.GetLastChannel();
776 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800777 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000778 EXPECT_EQ(2, opus.channels);
779 EXPECT_EQ(111, opus.pltype);
780 EXPECT_STREQ("opus", opus.plname);
781 opus.pltype = 0;
782 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
783 EXPECT_EQ(111, opus.pltype);
784}
785
786// Test that changes to recv codecs are applied to all streams.
787TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700788 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200789 cricket::AudioRecvParameters parameters;
790 parameters.codecs.push_back(kIsacCodec);
791 parameters.codecs.push_back(kPcmuCodec);
solenberg2779bab2016-11-17 04:45:19 -0800792 parameters.codecs.push_back(kTelephoneEventCodec1);
793 parameters.codecs.push_back(kTelephoneEventCodec2);
794 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200795 parameters.codecs[2].id = 126;
796 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700797 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000798 int channel_num2 = voe_.GetLastChannel();
solenberg2779bab2016-11-17 04:45:19 -0800799
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000800 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800801 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000802 gcodec.plfreq = 16000;
803 gcodec.channels = 1;
804 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
805 EXPECT_EQ(106, gcodec.pltype);
806 EXPECT_STREQ("ISAC", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800807
tfarina5237aaf2015-11-10 23:44:30 -0800808 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000809 gcodec.plfreq = 8000;
810 gcodec.channels = 1;
811 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
812 EXPECT_EQ(126, gcodec.pltype);
813 EXPECT_STREQ("telephone-event", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800814
815 gcodec.plfreq = 32000;
816 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
817 EXPECT_EQ(107, gcodec.pltype);
818 EXPECT_STREQ("telephone-event", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000819}
820
821TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700822 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200823 cricket::AudioRecvParameters parameters;
824 parameters.codecs.push_back(kIsacCodec);
solenberg2779bab2016-11-17 04:45:19 -0800825 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200826 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000827
828 int channel_num2 = voe_.GetLastChannel();
829 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800830 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000831 gcodec.plfreq = 16000;
832 gcodec.channels = 1;
833 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
834 EXPECT_EQ(106, gcodec.pltype);
835 EXPECT_STREQ("ISAC", gcodec.plname);
836}
837
838// Test that we can apply the same set of codecs again while playing.
839TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
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);
843 parameters.codecs.push_back(kCn16000Codec);
844 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700845 channel_->SetPlayout(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200846 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000847
848 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200849 parameters.codecs[0].id = 127;
850 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700851 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000852}
853
854// Test that we can add a codec while playing.
855TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700856 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200857 cricket::AudioRecvParameters parameters;
858 parameters.codecs.push_back(kIsacCodec);
859 parameters.codecs.push_back(kCn16000Codec);
860 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700861 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000862
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200863 parameters.codecs.push_back(kOpusCodec);
864 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700865 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000866 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800867 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000868 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
869}
870
871TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700872 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000873
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000874 // Test that when autobw is enabled, bitrate is kept as the default
875 // value. autobw is enabled for the following tests because the target
876 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000877
878 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700879 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000880
881 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700882 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000883
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000884 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700885 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000886}
887
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000888TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700889 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000890
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000891 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000892
893 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700894 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
895 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
896 // Rates above the max (56000) should be capped.
897 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000898
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000899 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700900 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
901 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
902 // Rates above the max (510000) should be capped.
903 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000904}
905
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000906TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700907 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000908
909 // Test that we can only set a maximum bitrate for a fixed-rate codec
910 // if it's bigger than the fixed rate.
911
912 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700913 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
914 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
915 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
916 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
917 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
918 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
919 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000920}
921
922TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700923 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200924 const int kDesiredBitrate = 128000;
925 cricket::AudioSendParameters parameters;
ossudedfd282016-06-14 07:12:39 -0700926 parameters.codecs = engine_->send_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200927 parameters.max_bandwidth_bps = kDesiredBitrate;
solenberg059fb442016-10-26 05:12:24 -0700928 SetSendParameters(parameters);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000929
930 EXPECT_TRUE(channel_->AddSendStream(
931 cricket::StreamParams::CreateLegacy(kSsrc1)));
932
minyue7a973442016-10-20 03:27:12 -0700933 EXPECT_EQ(kDesiredBitrate, GetCodecBitrate(kSsrc1));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000934}
935
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000936// Test that bitrate cannot be set for CBR codecs.
937// Bitrate is ignored if it is higher than the fixed bitrate.
938// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000939TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700940 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000941
942 // PCMU, default bitrate == 64000.
solenberg059fb442016-10-26 05:12:24 -0700943 SetSendParameters(send_parameters_);
minyue7a973442016-10-20 03:27:12 -0700944 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200945
946 send_parameters_.max_bandwidth_bps = 128000;
solenberg059fb442016-10-26 05:12:24 -0700947 SetSendParameters(send_parameters_);
minyue7a973442016-10-20 03:27:12 -0700948 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200949
950 send_parameters_.max_bandwidth_bps = 128;
951 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
minyue7a973442016-10-20 03:27:12 -0700952 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000953}
954
skvlade0d46372016-04-07 22:59:22 -0700955// Test that the per-stream bitrate limit and the global
956// bitrate limit both apply.
957TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
958 EXPECT_TRUE(SetupSendStream());
959
960 // opus, default bitrate == 64000.
961 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
962 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
963 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
964 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
965
966 // CBR codecs allow both maximums to exceed the bitrate.
967 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
968 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
969 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
970 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
971
972 // CBR codecs don't allow per stream maximums to be too low.
973 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
974 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
975}
976
977// Test that an attempt to set RtpParameters for a stream that does not exist
978// fails.
979TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
980 EXPECT_TRUE(SetupChannel());
981 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700982 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700983 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
984
985 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700986 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -0700987}
988
989TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700990 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -0700991 // This test verifies that setting RtpParameters succeeds only if
992 // the structure contains exactly one encoding.
993 // TODO(skvlad): Update this test when we start supporting setting parameters
994 // for each encoding individually.
995
996 EXPECT_TRUE(SetupSendStream());
997 // Setting RtpParameters with no encoding is expected to fail.
998 webrtc::RtpParameters parameters;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700999 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -07001000 // Setting RtpParameters with exactly one encoding should succeed.
1001 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001002 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -07001003 // Two or more encodings should result in failure.
1004 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001005 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -07001006}
1007
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001008// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001009// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001010TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
1011 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07001012 SetSend(true);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001013 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
1014 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001015 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001016 ASSERT_EQ(1u, parameters.encodings.size());
1017 ASSERT_TRUE(parameters.encodings[0].active);
1018 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001019 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001020 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
1021
1022 // Now change it back to active and verify we resume sending.
1023 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001024 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001025 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
1026}
1027
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001028// Test that SetRtpSendParameters configures the correct encoding channel for
1029// each SSRC.
skvlade0d46372016-04-07 22:59:22 -07001030TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
1031 SetupForMultiSendStream();
1032 // Create send streams.
1033 for (uint32_t ssrc : kSsrcs4) {
1034 EXPECT_TRUE(
1035 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
1036 }
1037 // Configure one stream to be limited by the stream config, another to be
1038 // limited by the global max, and the third one with no per-stream limit
1039 // (still subject to the global limit).
solenberg059fb442016-10-26 05:12:24 -07001040 SetGlobalMaxBitrate(kOpusCodec, 64000);
skvlade0d46372016-04-07 22:59:22 -07001041 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
1042 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
1043 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
1044
1045 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
1046 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
1047 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
1048
1049 // Remove the global cap; the streams should switch to their respective
1050 // maximums (or remain unchanged if there was no other limit on them.)
solenberg059fb442016-10-26 05:12:24 -07001051 SetGlobalMaxBitrate(kOpusCodec, -1);
skvlade0d46372016-04-07 22:59:22 -07001052 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
1053 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
1054 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
1055}
1056
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001057// Test that GetRtpSendParameters returns the currently configured codecs.
1058TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001059 EXPECT_TRUE(SetupSendStream());
1060 cricket::AudioSendParameters parameters;
1061 parameters.codecs.push_back(kIsacCodec);
1062 parameters.codecs.push_back(kPcmuCodec);
solenberg059fb442016-10-26 05:12:24 -07001063 SetSendParameters(parameters);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001064
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001065 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001066 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001067 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1068 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001069}
1070
1071// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001072TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001073 EXPECT_TRUE(SetupSendStream());
1074 cricket::AudioSendParameters parameters;
1075 parameters.codecs.push_back(kIsacCodec);
1076 parameters.codecs.push_back(kPcmuCodec);
solenberg059fb442016-10-26 05:12:24 -07001077 SetSendParameters(parameters);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001078
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001079 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001080
1081 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001082 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001083
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001084 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1085 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1086 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1087}
1088
1089// Test that GetRtpReceiveParameters returns the currently configured codecs.
1090TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1091 EXPECT_TRUE(SetupRecvStream());
1092 cricket::AudioRecvParameters parameters;
1093 parameters.codecs.push_back(kIsacCodec);
1094 parameters.codecs.push_back(kPcmuCodec);
1095 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1096
1097 webrtc::RtpParameters rtp_parameters =
1098 channel_->GetRtpReceiveParameters(kSsrc1);
1099 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1100 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1101 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1102}
1103
1104// Test that if we set/get parameters multiple times, we get the same results.
1105TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1106 EXPECT_TRUE(SetupRecvStream());
1107 cricket::AudioRecvParameters parameters;
1108 parameters.codecs.push_back(kIsacCodec);
1109 parameters.codecs.push_back(kPcmuCodec);
1110 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1111
1112 webrtc::RtpParameters initial_params =
1113 channel_->GetRtpReceiveParameters(kSsrc1);
1114
1115 // We should be able to set the params we just got.
1116 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1117
1118 // ... And this shouldn't change the params returned by
1119 // GetRtpReceiveParameters.
1120 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1121 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001122}
1123
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001124// Test that we apply codecs properly.
1125TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001126 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001127 cricket::AudioSendParameters parameters;
1128 parameters.codecs.push_back(kIsacCodec);
1129 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001130 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001131 parameters.codecs[0].id = 96;
1132 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001133 const int initial_num = call_.GetNumCreatedSendStreams();
solenberg059fb442016-10-26 05:12:24 -07001134 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001135 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
1136 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1137 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1138 EXPECT_EQ(48000, send_codec_spec.codec_inst.rate);
1139 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1140 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1141 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
1142 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001143 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001144}
1145
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001146// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1147// to apply.
1148TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001149 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001150 cricket::AudioSendParameters parameters;
1151 parameters.codecs.push_back(kIsacCodec);
1152 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001153 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001154 parameters.codecs[0].id = 96;
1155 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001156 const int initial_num = call_.GetNumCreatedSendStreams();
solenberg059fb442016-10-26 05:12:24 -07001157 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001158 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001159 // Calling SetSendCodec again with same codec which is already set.
1160 // In this case media channel shouldn't send codec to VoE.
solenberg059fb442016-10-26 05:12:24 -07001161 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001162 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001163}
1164
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001165// Verify that G722 is set with 16000 samples per second to WebRTC.
1166TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
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(kG722CodecSdp);
solenberg059fb442016-10-26 05:12:24 -07001170 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001171 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001172 EXPECT_STREQ("G722", gcodec.plname);
1173 EXPECT_EQ(1, gcodec.channels);
1174 EXPECT_EQ(16000, gcodec.plfreq);
1175}
1176
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001177// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001178TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001179 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001180 cricket::AudioSendParameters parameters;
1181 parameters.codecs.push_back(kOpusCodec);
1182 parameters.codecs[0].bitrate = 0;
1183 parameters.codecs[0].clockrate = 50000;
1184 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001185}
1186
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001187// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001188TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001189 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001190 cricket::AudioSendParameters parameters;
1191 parameters.codecs.push_back(kOpusCodec);
1192 parameters.codecs[0].bitrate = 0;
1193 parameters.codecs[0].channels = 0;
1194 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001195}
1196
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001197// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001198TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001199 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001200 cricket::AudioSendParameters parameters;
1201 parameters.codecs.push_back(kOpusCodec);
1202 parameters.codecs[0].bitrate = 0;
1203 parameters.codecs[0].channels = 0;
1204 parameters.codecs[0].params["stereo"] = "1";
1205 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001206}
1207
1208// Test that if channel is 1 for opus and there's no stereo, we fail.
1209TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001210 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001211 cricket::AudioSendParameters parameters;
1212 parameters.codecs.push_back(kOpusCodec);
1213 parameters.codecs[0].bitrate = 0;
1214 parameters.codecs[0].channels = 1;
1215 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001216}
1217
1218// Test that if channel is 1 for opus and stereo=0, we fail.
1219TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001220 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001221 cricket::AudioSendParameters parameters;
1222 parameters.codecs.push_back(kOpusCodec);
1223 parameters.codecs[0].bitrate = 0;
1224 parameters.codecs[0].channels = 1;
1225 parameters.codecs[0].params["stereo"] = "0";
1226 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001227}
1228
1229// Test that if channel is 1 for opus and stereo=1, we fail.
1230TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001231 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001232 cricket::AudioSendParameters parameters;
1233 parameters.codecs.push_back(kOpusCodec);
1234 parameters.codecs[0].bitrate = 0;
1235 parameters.codecs[0].channels = 1;
1236 parameters.codecs[0].params["stereo"] = "1";
1237 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001238}
1239
1240// Test that with bitrate=0 and no stereo,
1241// channels and bitrate are 1 and 32000.
1242TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001243 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001244 cricket::AudioSendParameters parameters;
1245 parameters.codecs.push_back(kOpusCodec);
1246 parameters.codecs[0].bitrate = 0;
solenberg059fb442016-10-26 05:12:24 -07001247 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001248 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001249}
1250
1251// Test that with bitrate=0 and stereo=0,
1252// channels and bitrate are 1 and 32000.
1253TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001254 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001255 cricket::AudioSendParameters parameters;
1256 parameters.codecs.push_back(kOpusCodec);
1257 parameters.codecs[0].bitrate = 0;
1258 parameters.codecs[0].params["stereo"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001259 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001260 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001261}
1262
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001263// Test that with bitrate=invalid and stereo=0,
1264// channels and bitrate are 1 and 32000.
1265TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001266 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001267 cricket::AudioSendParameters parameters;
1268 parameters.codecs.push_back(kOpusCodec);
1269 parameters.codecs[0].params["stereo"] = "0";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001270 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001271 parameters.codecs[0].bitrate = 5999;
solenberg059fb442016-10-26 05:12:24 -07001272 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001273 CheckSendCodec(kSsrc1, "opus", 1, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001274
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001275 parameters.codecs[0].bitrate = 510001;
solenberg059fb442016-10-26 05:12:24 -07001276 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001277 CheckSendCodec(kSsrc1, "opus", 1, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001278}
1279
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001280// Test that with bitrate=0 and stereo=1,
1281// channels and bitrate are 2 and 64000.
1282TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001283 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001284 cricket::AudioSendParameters parameters;
1285 parameters.codecs.push_back(kOpusCodec);
1286 parameters.codecs[0].bitrate = 0;
1287 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001288 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001289 CheckSendCodec(kSsrc1, "opus", 2, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001290}
1291
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001292// Test that with bitrate=invalid and stereo=1,
1293// channels and bitrate are 2 and 64000.
1294TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001295 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001296 cricket::AudioSendParameters parameters;
1297 parameters.codecs.push_back(kOpusCodec);
1298 parameters.codecs[0].params["stereo"] = "1";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001299 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001300 parameters.codecs[0].bitrate = 5999;
solenberg059fb442016-10-26 05:12:24 -07001301 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001302 CheckSendCodec(kSsrc1, "opus", 2, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001303
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001304 parameters.codecs[0].bitrate = 510001;
solenberg059fb442016-10-26 05:12:24 -07001305 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001306 CheckSendCodec(kSsrc1, "opus", 2, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001307}
1308
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001309// Test that with bitrate=N and stereo unset,
1310// channels and bitrate are 1 and N.
1311TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001312 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001313 cricket::AudioSendParameters parameters;
1314 parameters.codecs.push_back(kOpusCodec);
1315 parameters.codecs[0].bitrate = 96000;
solenberg059fb442016-10-26 05:12:24 -07001316 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001317 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001318 EXPECT_EQ(111, gcodec.pltype);
1319 EXPECT_EQ(96000, gcodec.rate);
1320 EXPECT_STREQ("opus", gcodec.plname);
1321 EXPECT_EQ(1, gcodec.channels);
1322 EXPECT_EQ(48000, gcodec.plfreq);
1323}
1324
1325// Test that with bitrate=N and stereo=0,
1326// channels and bitrate are 1 and N.
1327TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001328 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001329 cricket::AudioSendParameters parameters;
1330 parameters.codecs.push_back(kOpusCodec);
1331 parameters.codecs[0].bitrate = 30000;
1332 parameters.codecs[0].params["stereo"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001333 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001334 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001335}
1336
1337// Test that with bitrate=N and without any parameters,
1338// channels and bitrate are 1 and N.
1339TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001340 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001341 cricket::AudioSendParameters parameters;
1342 parameters.codecs.push_back(kOpusCodec);
1343 parameters.codecs[0].bitrate = 30000;
solenberg059fb442016-10-26 05:12:24 -07001344 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001345 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001346}
1347
1348// Test that with bitrate=N and stereo=1,
1349// channels and bitrate are 2 and N.
1350TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001351 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001352 cricket::AudioSendParameters parameters;
1353 parameters.codecs.push_back(kOpusCodec);
1354 parameters.codecs[0].bitrate = 30000;
1355 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001356 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001357 CheckSendCodec(kSsrc1, "opus", 2, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001358}
1359
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001360// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1361// Also test that the "maxaveragebitrate" can't be set to values outside the
1362// range of 6000 and 510000
1363TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001364 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001365 cricket::AudioSendParameters parameters;
1366 parameters.codecs.push_back(kOpusCodec);
1367 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001368 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001369 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
solenberg059fb442016-10-26 05:12:24 -07001370 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001371 EXPECT_EQ(6000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001372
1373 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001374 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
solenberg059fb442016-10-26 05:12:24 -07001375 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001376 EXPECT_EQ(510000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001377
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001378 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
solenberg059fb442016-10-26 05:12:24 -07001379 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001380 EXPECT_EQ(200000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001381}
1382
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001383// Test that we can enable NACK with opus as caller.
1384TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001385 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001386 cricket::AudioSendParameters parameters;
1387 parameters.codecs.push_back(kOpusCodec);
1388 parameters.codecs[0].AddFeedbackParam(
1389 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1390 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001391 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001392 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001393 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001394}
1395
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001396// Test that we can enable NACK with opus as callee.
1397TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001398 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001399 cricket::AudioSendParameters parameters;
1400 parameters.codecs.push_back(kOpusCodec);
1401 parameters.codecs[0].AddFeedbackParam(
1402 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1403 cricket::kParamValueEmpty));
solenberg8189b022016-06-14 12:13:00 -07001404 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001405 SetSendParameters(parameters);
deadbeefb56069e2016-05-06 04:57:03 -07001406 // NACK should be enabled even with no send stream.
solenberg8189b022016-06-14 12:13:00 -07001407 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001408
1409 EXPECT_TRUE(channel_->AddSendStream(
1410 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg971cab02016-06-14 10:02:41 -07001411 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001412}
1413
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001414// Test that we can enable NACK on receive streams.
1415TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001416 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001417 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001418 cricket::AudioSendParameters parameters;
1419 parameters.codecs.push_back(kOpusCodec);
1420 parameters.codecs[0].AddFeedbackParam(
1421 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1422 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001423 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001424 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001425 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001426 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001427 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001428}
1429
1430// Test that we can disable NACK.
1431TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001432 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001433 cricket::AudioSendParameters parameters;
1434 parameters.codecs.push_back(kOpusCodec);
1435 parameters.codecs[0].AddFeedbackParam(
1436 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1437 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001438 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001439 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001440
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001441 parameters.codecs.clear();
1442 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001443 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001444 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001445}
1446
1447// Test that we can disable NACK on receive streams.
1448TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001449 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001450 EXPECT_TRUE(AddRecvStream(kSsrc2));
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);
solenberg8189b022016-06-14 12:13:00 -07001458 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001459
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001460 parameters.codecs.clear();
1461 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001462 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001463 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001464 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001465}
1466
1467// Test that NACK is enabled on a new receive stream.
1468TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001469 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001470 cricket::AudioSendParameters parameters;
1471 parameters.codecs.push_back(kIsacCodec);
1472 parameters.codecs.push_back(kCn16000Codec);
1473 parameters.codecs[0].AddFeedbackParam(
1474 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1475 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001476 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001477 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001478
solenberg8189b022016-06-14 12:13:00 -07001479 EXPECT_TRUE(AddRecvStream(kSsrc2));
1480 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
1481 EXPECT_TRUE(AddRecvStream(kSsrc3));
1482 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc3).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001483}
1484
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001485// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001486TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
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(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001490 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001491 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001492}
1493
1494// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001495TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001496 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001497 cricket::AudioSendParameters parameters;
1498 parameters.codecs.push_back(kOpusCodec);
1499 parameters.codecs[0].bitrate = 0;
1500 parameters.codecs[0].params["useinbandfec"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001501 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001502 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001503}
1504
1505// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001506TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001507 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001508 cricket::AudioSendParameters parameters;
1509 parameters.codecs.push_back(kOpusCodec);
1510 parameters.codecs[0].bitrate = 0;
1511 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001512 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001513 EXPECT_TRUE(GetCodecFec(kSsrc1));
1514 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001515}
1516
1517// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001518TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001519 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001520 cricket::AudioSendParameters parameters;
1521 parameters.codecs.push_back(kOpusCodec);
1522 parameters.codecs[0].bitrate = 0;
1523 parameters.codecs[0].params["stereo"] = "1";
1524 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001525 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001526 EXPECT_TRUE(GetCodecFec(kSsrc1));
1527 CheckSendCodec(kSsrc1, "opus", 2, 64000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001528}
1529
1530// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001531TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001532 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001533 cricket::AudioSendParameters parameters;
1534 parameters.codecs.push_back(kIsacCodec);
solenberg059fb442016-10-26 05:12:24 -07001535 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001536 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001537}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001538
1539// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1540TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001541 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001542 cricket::AudioSendParameters parameters;
1543 parameters.codecs.push_back(kIsacCodec);
1544 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001545 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001546 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001547}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001548
1549// Test that Opus FEC status can be changed.
1550TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001551 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001552 cricket::AudioSendParameters parameters;
1553 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001554 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001555 EXPECT_FALSE(GetCodecFec(kSsrc1));
1556
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001557 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001558 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001559 EXPECT_TRUE(GetCodecFec(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001560}
1561
stefanba4c0e42016-02-04 04:12:24 -08001562TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001563 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001564 cricket::AudioSendParameters send_parameters;
1565 send_parameters.codecs.push_back(kOpusCodec);
1566 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
solenberg059fb442016-10-26 05:12:24 -07001567 SetSendParameters(send_parameters);
stefanba4c0e42016-02-04 04:12:24 -08001568
1569 cricket::AudioRecvParameters recv_parameters;
1570 recv_parameters.codecs.push_back(kIsacCodec);
1571 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
solenberg8189b022016-06-14 12:13:00 -07001572 EXPECT_TRUE(AddRecvStream(kSsrc1));
stefanba4c0e42016-02-04 04:12:24 -08001573 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1574 EXPECT_FALSE(
1575 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1576
ossudedfd282016-06-14 07:12:39 -07001577 send_parameters.codecs = engine_->send_codecs();
solenberg059fb442016-10-26 05:12:24 -07001578 SetSendParameters(send_parameters);
stefanba4c0e42016-02-04 04:12:24 -08001579 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1580 EXPECT_TRUE(
1581 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1582}
1583
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001584// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1585TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001586 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001587 cricket::AudioSendParameters parameters;
1588 parameters.codecs.push_back(kOpusCodec);
1589 parameters.codecs[0].bitrate = 0;
1590 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
solenberg059fb442016-10-26 05:12:24 -07001591 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001592 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
1593 EXPECT_EQ(12000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001594
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001595 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001596 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001597 EXPECT_EQ(24000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001598}
1599
1600// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1601TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001602 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001603 cricket::AudioSendParameters parameters;
1604 parameters.codecs.push_back(kOpusCodec);
1605 parameters.codecs[0].bitrate = 0;
1606 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
solenberg059fb442016-10-26 05:12:24 -07001607 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001608 EXPECT_EQ(8001, GetOpusMaxPlaybackRate(kSsrc1));
1609 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001610
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001611 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001612 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001613 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001614}
1615
1616// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1617TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001618 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001619 cricket::AudioSendParameters parameters;
1620 parameters.codecs.push_back(kOpusCodec);
1621 parameters.codecs[0].bitrate = 0;
1622 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
solenberg059fb442016-10-26 05:12:24 -07001623 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001624 EXPECT_EQ(12001, GetOpusMaxPlaybackRate(kSsrc1));
1625 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001626
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001627 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001628 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001629 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001630}
1631
1632// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1633TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001634 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001635 cricket::AudioSendParameters parameters;
1636 parameters.codecs.push_back(kOpusCodec);
1637 parameters.codecs[0].bitrate = 0;
1638 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
solenberg059fb442016-10-26 05:12:24 -07001639 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001640 EXPECT_EQ(16001, GetOpusMaxPlaybackRate(kSsrc1));
1641 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001642
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001643 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001644 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001645 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001646}
1647
1648// Test 24000 < maxplaybackrate triggers Opus full band mode.
1649TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001650 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001651 cricket::AudioSendParameters parameters;
1652 parameters.codecs.push_back(kOpusCodec);
1653 parameters.codecs[0].bitrate = 0;
1654 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
solenberg059fb442016-10-26 05:12:24 -07001655 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001656 EXPECT_EQ(24001, GetOpusMaxPlaybackRate(kSsrc1));
1657 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001658
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001659 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001660 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001661 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001662}
1663
1664// Test Opus that without maxplaybackrate, default playback rate is used.
1665TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001666 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001667 cricket::AudioSendParameters parameters;
1668 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001669 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001670 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001671}
1672
1673// Test the with non-Opus, maxplaybackrate has no effect.
1674TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001675 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001676 cricket::AudioSendParameters parameters;
1677 parameters.codecs.push_back(kIsacCodec);
1678 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
solenberg059fb442016-10-26 05:12:24 -07001679 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001680 EXPECT_EQ(0, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001681}
1682
1683// Test maxplaybackrate can be set on two streams.
1684TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001685 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001686 cricket::AudioSendParameters parameters;
1687 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001688 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001689 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001690
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001691 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
solenberg059fb442016-10-26 05:12:24 -07001692 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001693 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001694
1695 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
minyue7a973442016-10-20 03:27:12 -07001696 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc2));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001697}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001698
Minyue Li7100dcd2015-03-27 05:05:59 +01001699// Test that with usedtx=0, Opus DTX is off.
1700TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001701 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001702 cricket::AudioSendParameters parameters;
1703 parameters.codecs.push_back(kOpusCodec);
1704 parameters.codecs[0].params["usedtx"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001705 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001706 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001707}
1708
1709// Test that with usedtx=1, Opus DTX is on.
1710TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001711 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001712 cricket::AudioSendParameters parameters;
1713 parameters.codecs.push_back(kOpusCodec);
1714 parameters.codecs[0].params["usedtx"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001715 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001716 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001717}
1718
1719// Test that usedtx=1 works with stereo Opus.
1720TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001721 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001722 cricket::AudioSendParameters parameters;
1723 parameters.codecs.push_back(kOpusCodec);
1724 parameters.codecs[0].params["usedtx"] = "1";
1725 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001726 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001727 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001728}
1729
1730// Test that usedtx=1 does not work with non Opus.
1731TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001732 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001733 cricket::AudioSendParameters parameters;
1734 parameters.codecs.push_back(kIsacCodec);
1735 parameters.codecs[0].params["usedtx"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001736 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001737 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001738}
1739
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001740// Test that we can switch back and forth between Opus and ISAC with CN.
1741TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001742 EXPECT_TRUE(SetupSendStream());
minyue7a973442016-10-20 03:27:12 -07001743
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001744 cricket::AudioSendParameters opus_parameters;
1745 opus_parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001746 SetSendParameters(opus_parameters);
minyue7a973442016-10-20 03:27:12 -07001747 {
1748 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1749 EXPECT_EQ(111, gcodec.pltype);
1750 EXPECT_STREQ("opus", gcodec.plname);
1751 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001752
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001753 cricket::AudioSendParameters isac_parameters;
1754 isac_parameters.codecs.push_back(kIsacCodec);
1755 isac_parameters.codecs.push_back(kCn16000Codec);
1756 isac_parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001757 SetSendParameters(isac_parameters);
minyue7a973442016-10-20 03:27:12 -07001758 {
1759 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1760 EXPECT_EQ(103, gcodec.pltype);
1761 EXPECT_STREQ("ISAC", gcodec.plname);
1762 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001763
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}
1771
1772// Test that we handle various ways of specifying bitrate.
1773TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001774 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001775 cricket::AudioSendParameters parameters;
1776 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
solenberg059fb442016-10-26 05:12:24 -07001777 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001778 {
1779 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1780 EXPECT_EQ(103, gcodec.pltype);
1781 EXPECT_STREQ("ISAC", gcodec.plname);
1782 EXPECT_EQ(32000, gcodec.rate);
1783 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001784
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001785 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001786 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001787 {
1788 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1789 EXPECT_EQ(103, gcodec.pltype);
1790 EXPECT_STREQ("ISAC", gcodec.plname);
1791 EXPECT_EQ(-1, gcodec.rate);
1792 }
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001793 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
solenberg059fb442016-10-26 05:12:24 -07001794 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001795 {
1796 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1797 EXPECT_EQ(103, gcodec.pltype);
1798 EXPECT_STREQ("ISAC", gcodec.plname);
1799 EXPECT_EQ(28000, gcodec.rate);
1800 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001801
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001802 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
solenberg059fb442016-10-26 05:12:24 -07001803 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001804 {
1805 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1806 EXPECT_EQ(0, gcodec.pltype);
1807 EXPECT_STREQ("PCMU", gcodec.plname);
1808 EXPECT_EQ(64000, gcodec.rate);
1809 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001810
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001811 parameters.codecs[0].bitrate = 0; // bitrate == default
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(0, gcodec.pltype);
1816 EXPECT_STREQ("PCMU", gcodec.plname);
1817 EXPECT_EQ(64000, gcodec.rate);
1818 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001819
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001820 parameters.codecs[0] = kOpusCodec;
1821 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001822 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001823 {
1824 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1825 EXPECT_EQ(111, gcodec.pltype);
1826 EXPECT_STREQ("opus", gcodec.plname);
1827 EXPECT_EQ(32000, gcodec.rate);
1828 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001829}
1830
Brave Yao5225dd82015-03-26 07:39:19 +08001831// Test that we could set packet size specified in kCodecParamPTime.
1832TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001833 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001834 cricket::AudioSendParameters parameters;
1835 parameters.codecs.push_back(kOpusCodec);
1836 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
solenberg059fb442016-10-26 05:12:24 -07001837 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001838 EXPECT_EQ(1920, GetCodecPacSize(kSsrc1)); // Opus gets 40ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001839
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001840 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
solenberg059fb442016-10-26 05:12:24 -07001841 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001842 EXPECT_EQ(480, GetCodecPacSize(kSsrc1)); // Opus gets 10ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001843
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001844 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
solenberg059fb442016-10-26 05:12:24 -07001845 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001846 EXPECT_EQ(2880, GetCodecPacSize(kSsrc1)); // Opus gets 60ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001847
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001848 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1849 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
solenberg059fb442016-10-26 05:12:24 -07001850 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001851 EXPECT_EQ(480, GetCodecPacSize(
1852 kSsrc1)); // Isac gets 30ms as the next smallest value.
Brave Yao5225dd82015-03-26 07:39:19 +08001853
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001854 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1855 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
solenberg059fb442016-10-26 05:12:24 -07001856 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001857 EXPECT_EQ(640, GetCodecPacSize(
1858 kSsrc1)); // G722 gets 40ms @16kHz as defined in VoE.
Brave Yao5225dd82015-03-26 07:39:19 +08001859}
1860
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001861// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001862TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001863 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001864 cricket::AudioSendParameters parameters;
1865 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001866}
1867
1868// Test that we can set send codecs even with telephone-event codec as the first
1869// one on the list.
1870TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001871 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001872 cricket::AudioSendParameters parameters;
solenberg2779bab2016-11-17 04:45:19 -08001873 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001874 parameters.codecs.push_back(kIsacCodec);
1875 parameters.codecs.push_back(kPcmuCodec);
1876 parameters.codecs[0].id = 98; // DTMF
1877 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001878 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001879 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001880 EXPECT_EQ(96, gcodec.pltype);
1881 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001882 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001883}
1884
solenberg31642aa2016-03-14 08:00:37 -07001885// Test that payload type range is limited for telephone-event codec.
1886TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001887 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001888 cricket::AudioSendParameters parameters;
solenbergffbbcac2016-11-17 05:25:37 -08001889 parameters.codecs.push_back(kTelephoneEventCodec2);
solenberg31642aa2016-03-14 08:00:37 -07001890 parameters.codecs.push_back(kIsacCodec);
1891 parameters.codecs[0].id = 0; // DTMF
1892 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001893 SetSendParameters(parameters);
solenberg31642aa2016-03-14 08:00:37 -07001894 EXPECT_TRUE(channel_->CanInsertDtmf());
1895 parameters.codecs[0].id = 128; // DTMF
1896 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1897 EXPECT_FALSE(channel_->CanInsertDtmf());
1898 parameters.codecs[0].id = 127;
solenberg059fb442016-10-26 05:12:24 -07001899 SetSendParameters(parameters);
solenberg31642aa2016-03-14 08:00:37 -07001900 EXPECT_TRUE(channel_->CanInsertDtmf());
1901 parameters.codecs[0].id = -1; // DTMF
1902 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1903 EXPECT_FALSE(channel_->CanInsertDtmf());
1904}
1905
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001906// Test that we can set send codecs even with CN codec as the first
1907// one on the list.
1908TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001909 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001910 cricket::AudioSendParameters parameters;
1911 parameters.codecs.push_back(kCn16000Codec);
1912 parameters.codecs.push_back(kIsacCodec);
1913 parameters.codecs.push_back(kPcmuCodec);
1914 parameters.codecs[0].id = 98; // wideband CN
1915 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001916 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001917 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1918 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1919 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1920 EXPECT_EQ(98, send_codec_spec.cng_payload_type);
1921 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001922}
1923
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001924// Test that we set VAD and DTMF types correctly as caller.
1925TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001926 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001927 cricket::AudioSendParameters parameters;
1928 parameters.codecs.push_back(kIsacCodec);
1929 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001930 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001931 parameters.codecs.push_back(kCn16000Codec);
1932 parameters.codecs.push_back(kCn8000Codec);
solenberg2779bab2016-11-17 04:45:19 -08001933 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001934 parameters.codecs[0].id = 96;
1935 parameters.codecs[2].id = 97; // wideband CN
1936 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07001937 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001938 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1939 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1940 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1941 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1942 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1943 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1944 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001945 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001946}
1947
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001948// Test that we set VAD and DTMF types correctly as callee.
1949TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001950 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001951 cricket::AudioSendParameters parameters;
1952 parameters.codecs.push_back(kIsacCodec);
1953 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001954 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001955 parameters.codecs.push_back(kCn16000Codec);
1956 parameters.codecs.push_back(kCn8000Codec);
solenbergffbbcac2016-11-17 05:25:37 -08001957 parameters.codecs.push_back(kTelephoneEventCodec2);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001958 parameters.codecs[0].id = 96;
1959 parameters.codecs[2].id = 97; // wideband CN
1960 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07001961 SetSendParameters(parameters);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001962 EXPECT_TRUE(channel_->AddSendStream(
1963 cricket::StreamParams::CreateLegacy(kSsrc1)));
1964
minyue7a973442016-10-20 03:27:12 -07001965 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1966 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1967 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1968 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1969 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1970 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1971 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001972 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001973}
1974
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001975// Test that we only apply VAD if we have a CN codec that matches the
1976// send codec clockrate.
1977TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07001978 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001979 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001980 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001981 parameters.codecs.push_back(kIsacCodec);
1982 parameters.codecs.push_back(kCn16000Codec);
1983 parameters.codecs[1].id = 97;
solenberg059fb442016-10-26 05:12:24 -07001984 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001985 {
1986 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1987 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1988 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1989 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1990 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1991 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
1992 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001993 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001994 parameters.codecs[0] = kPcmuCodec;
solenberg059fb442016-10-26 05:12:24 -07001995 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001996 {
1997 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1998 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
1999 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2000 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002001 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002002 parameters.codecs[1] = kCn8000Codec;
solenberg059fb442016-10-26 05:12:24 -07002003 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002004 {
2005 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2006 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2007 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2008 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2009 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
2010 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
2011 }
Brave Yao5225dd82015-03-26 07:39:19 +08002012 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002013 parameters.codecs[0] = kIsacCodec;
solenberg059fb442016-10-26 05:12:24 -07002014 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002015 {
2016 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2017 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2018 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2019 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002020}
2021
2022// Test that we perform case-insensitive matching of codec names.
2023TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002024 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002025 cricket::AudioSendParameters parameters;
2026 parameters.codecs.push_back(kIsacCodec);
2027 parameters.codecs.push_back(kPcmuCodec);
2028 parameters.codecs.push_back(kCn16000Codec);
2029 parameters.codecs.push_back(kCn8000Codec);
solenberg2779bab2016-11-17 04:45:19 -08002030 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002031 parameters.codecs[0].name = "iSaC";
2032 parameters.codecs[0].id = 96;
2033 parameters.codecs[2].id = 97; // wideband CN
2034 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07002035 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002036 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2037 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2038 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2039 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2040 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2041 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2042 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002043 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002044}
2045
stefanba4c0e42016-02-04 04:12:24 -08002046class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2047 public:
2048 WebRtcVoiceEngineWithSendSideBweTest()
2049 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2050};
2051
2052TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2053 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002054 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002055 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07002056 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
2057 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
2058 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08002059 extension.id);
2060 return;
2061 }
2062 }
2063 FAIL() << "Transport sequence number extension not in header-extension list.";
2064}
2065
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002066// Test support for audio level header extension.
2067TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002068 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002069}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002070TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002071 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002072}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002073
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002074// Test support for absolute send time header extension.
2075TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002076 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002077}
2078TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002079 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002080}
2081
solenberg1ac56142015-10-13 03:58:19 -07002082// Test that we can create a channel and start sending on it.
2083TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002084 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002085 SetSendParameters(send_parameters_);
2086 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002087 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002088 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002089 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2090}
2091
2092// Test that a channel will send if and only if it has a source and is enabled
2093// for sending.
2094TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002095 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002096 SetSendParameters(send_parameters_);
2097 SetAudioSend(kSsrc1, true, nullptr);
2098 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002099 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002100 SetAudioSend(kSsrc1, true, &fake_source_);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002101 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002102 SetAudioSend(kSsrc1, true, nullptr);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002103 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002104}
2105
solenberg94218532016-06-16 10:53:22 -07002106// Test that a channel is muted/unmuted.
2107TEST_F(WebRtcVoiceEngineTestFake, SendStateMuteUnmute) {
2108 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002109 SetSendParameters(send_parameters_);
solenberg94218532016-06-16 10:53:22 -07002110 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
solenberg059fb442016-10-26 05:12:24 -07002111 SetAudioSend(kSsrc1, true, nullptr);
solenberg94218532016-06-16 10:53:22 -07002112 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
solenberg059fb442016-10-26 05:12:24 -07002113 SetAudioSend(kSsrc1, false, nullptr);
solenberg94218532016-06-16 10:53:22 -07002114 EXPECT_TRUE(GetSendStream(kSsrc1).muted());
2115}
2116
solenberg6d6e7c52016-04-13 09:07:30 -07002117// Test that SetSendParameters() does not alter a stream's send state.
2118TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2119 EXPECT_TRUE(SetupSendStream());
2120 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2121
2122 // Turn on sending.
solenberg059fb442016-10-26 05:12:24 -07002123 SetSend(true);
solenberg6d6e7c52016-04-13 09:07:30 -07002124 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2125
2126 // Changing RTP header extensions will recreate the AudioSendStream.
2127 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002128 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg059fb442016-10-26 05:12:24 -07002129 SetSendParameters(send_parameters_);
solenberg6d6e7c52016-04-13 09:07:30 -07002130 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2131
2132 // Turn off sending.
solenberg059fb442016-10-26 05:12:24 -07002133 SetSend(false);
solenberg6d6e7c52016-04-13 09:07:30 -07002134 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2135
2136 // Changing RTP header extensions will recreate the AudioSendStream.
2137 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -07002138 SetSendParameters(send_parameters_);
solenberg6d6e7c52016-04-13 09:07:30 -07002139 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2140}
2141
solenberg1ac56142015-10-13 03:58:19 -07002142// Test that we can create a channel and start playing out on it.
2143TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002144 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002145 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
aleloi84ef6152016-08-04 05:28:21 -07002146 channel_->SetPlayout(true);
2147 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
2148 channel_->SetPlayout(false);
2149 EXPECT_FALSE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002150}
2151
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002152// Test that we can add and remove send streams.
2153TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2154 SetupForMultiSendStream();
2155
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002156 // Set the global state for sending.
solenberg059fb442016-10-26 05:12:24 -07002157 SetSend(true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002158
solenbergc96df772015-10-21 13:01:53 -07002159 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002160 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002161 cricket::StreamParams::CreateLegacy(ssrc)));
solenberg059fb442016-10-26 05:12:24 -07002162 SetAudioSend(ssrc, true, &fake_source_);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002163 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002164 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002165 }
tfarina5237aaf2015-11-10 23:44:30 -08002166 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002167
solenbergc96df772015-10-21 13:01:53 -07002168 // Delete the send streams.
2169 for (uint32_t ssrc : kSsrcs4) {
2170 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002171 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002172 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002173 }
solenbergc96df772015-10-21 13:01:53 -07002174 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002175}
2176
2177// Test SetSendCodecs correctly configure the codecs in all send streams.
2178TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2179 SetupForMultiSendStream();
2180
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002181 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002182 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002183 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002184 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002185 }
2186
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002187 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002188 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002189 parameters.codecs.push_back(kIsacCodec);
2190 parameters.codecs.push_back(kCn16000Codec);
2191 parameters.codecs[1].id = 97;
solenberg059fb442016-10-26 05:12:24 -07002192 SetSendParameters(parameters);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002193
2194 // Verify ISAC and VAD are corrected configured on all send channels.
solenbergc96df772015-10-21 13:01:53 -07002195 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002196 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2197 const auto& send_codec_spec =
2198 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2199 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2200 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2201 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2202 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2203 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002204 }
2205
minyue7a973442016-10-20 03:27:12 -07002206 // Change to PCMU(8K) and CN(16K).
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002207 parameters.codecs[0] = kPcmuCodec;
solenberg059fb442016-10-26 05:12:24 -07002208 SetSendParameters(parameters);
solenbergc96df772015-10-21 13:01:53 -07002209 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002210 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2211 const auto& send_codec_spec =
2212 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2213 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2214 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2215 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2216 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002217 }
2218}
2219
2220// Test we can SetSend on all send streams correctly.
2221TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2222 SetupForMultiSendStream();
2223
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002224 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002225 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002226 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002227 cricket::StreamParams::CreateLegacy(ssrc)));
solenberg059fb442016-10-26 05:12:24 -07002228 SetAudioSend(ssrc, true, &fake_source_);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002229 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002230 }
2231
2232 // Set the global state for starting sending.
solenberg059fb442016-10-26 05:12:24 -07002233 SetSend(true);
solenbergc96df772015-10-21 13:01:53 -07002234 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002235 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002236 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002237 }
2238
2239 // Set the global state for stopping sending.
solenberg059fb442016-10-26 05:12:24 -07002240 SetSend(false);
solenbergc96df772015-10-21 13:01:53 -07002241 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002242 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002243 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002244 }
2245}
2246
2247// Test we can set the correct statistics on all send streams.
2248TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2249 SetupForMultiSendStream();
2250
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002251 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002252 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002253 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002254 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002255 }
solenberg85a04962015-10-27 03:35:21 -07002256
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002257 // Create a receive stream to check that none of the send streams end up in
2258 // the receive stream stats.
solenberg8189b022016-06-14 12:13:00 -07002259 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg971cab02016-06-14 10:02:41 -07002260
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002261 // We need send codec to be set to get all stats.
solenberg059fb442016-10-26 05:12:24 -07002262 SetSendParameters(send_parameters_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002263 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002264 SetAudioSendStreamStats();
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002265
solenberg85a04962015-10-27 03:35:21 -07002266 // Check stats for the added streams.
2267 {
2268 cricket::VoiceMediaInfo info;
2269 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002270
solenberg85a04962015-10-27 03:35:21 -07002271 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002272 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002273 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002274 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002275 }
2276
2277 // We have added one receive stream. We should see empty stats.
2278 EXPECT_EQ(info.receivers.size(), 1u);
2279 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002280 }
solenberg1ac56142015-10-13 03:58:19 -07002281
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002282 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002283 {
2284 cricket::VoiceMediaInfo info;
2285 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2286 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002287 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002288 EXPECT_EQ(0u, info.receivers.size());
2289 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002290
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002291 // Deliver a new packet - a default receive stream should be created and we
2292 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002293 {
2294 cricket::VoiceMediaInfo info;
2295 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2296 SetAudioReceiveStreamStats();
2297 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002298 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002299 EXPECT_EQ(1u, info.receivers.size());
2300 VerifyVoiceReceiverInfo(info.receivers[0]);
2301 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002302}
2303
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002304// Test that we can add and remove receive streams, and do proper send/playout.
2305// We can receive on multiple streams while sending one stream.
2306TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002307 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002308
solenberg1ac56142015-10-13 03:58:19 -07002309 // Start playout without a receive stream.
solenberg059fb442016-10-26 05:12:24 -07002310 SetSendParameters(send_parameters_);
aleloi84ef6152016-08-04 05:28:21 -07002311 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002312
solenberg1ac56142015-10-13 03:58:19 -07002313 // Adding another stream should enable playout on the new stream only.
solenberg8189b022016-06-14 12:13:00 -07002314 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg059fb442016-10-26 05:12:24 -07002315 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002316 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002317
solenberg1ac56142015-10-13 03:58:19 -07002318 // Make sure only the new stream is played out.
aleloi84ef6152016-08-04 05:28:21 -07002319 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002320
2321 // Adding yet another stream should have stream 2 and 3 enabled for playout.
solenberg8189b022016-06-14 12:13:00 -07002322 EXPECT_TRUE(AddRecvStream(kSsrc3));
aleloi84ef6152016-08-04 05:28:21 -07002323 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2324 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002325
2326 // Stop sending.
solenberg059fb442016-10-26 05:12:24 -07002327 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002328 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002329
2330 // Stop playout.
aleloi84ef6152016-08-04 05:28:21 -07002331 channel_->SetPlayout(false);
2332 EXPECT_FALSE(GetRecvStream(kSsrc2).started());
2333 EXPECT_FALSE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002334
aleloi84ef6152016-08-04 05:28:21 -07002335 // Restart playout and make sure recv streams are played out.
2336 channel_->SetPlayout(true);
2337 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2338 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002339
aleloi84ef6152016-08-04 05:28:21 -07002340 // Now remove the recv streams.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002341 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2342 EXPECT_TRUE(channel_->RemoveRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002343}
2344
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002345// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002346// and start sending on it.
2347TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002348 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002349 cricket::AudioOptions options_adjust_agc;
2350 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002351 webrtc::AgcConfig agc_config;
2352 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2353 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002354 send_parameters_.options = options_adjust_agc;
solenberg059fb442016-10-26 05:12:24 -07002355 SetSendParameters(send_parameters_);
2356 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002357 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002358 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2359 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenberg059fb442016-10-26 05:12:24 -07002360 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002361 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002362 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002363}
2364
wu@webrtc.org97077a32013-10-25 21:18:33 +00002365TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002366 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002367 EXPECT_CALL(adm_,
2368 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002369 webrtc::AgcConfig agc_config;
2370 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2371 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002372 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2373 send_parameters_.options.tx_agc_digital_compression_gain =
2374 rtc::Optional<uint16_t>(9);
2375 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2376 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002377 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002378 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2379 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2380 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2381 EXPECT_TRUE(agc_config.limiterEnable);
2382
2383 // Check interaction with adjust_agc_delta. Both should be respected, for
2384 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002385 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
solenberg059fb442016-10-26 05:12:24 -07002386 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002387 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2388 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2389}
2390
wu@webrtc.org97077a32013-10-25 21:18:33 +00002391TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002392 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002393 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2394 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002395 send_parameters_.options.recording_sample_rate =
2396 rtc::Optional<uint32_t>(48000);
2397 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
solenberg059fb442016-10-26 05:12:24 -07002398 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002399}
2400
minyue6b825df2016-10-31 04:08:32 -07002401TEST_F(WebRtcVoiceEngineTestFake, SetAudioNetworkAdaptorViaOptions) {
2402 EXPECT_TRUE(SetupSendStream());
2403 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2404 send_parameters_.options.audio_network_adaptor_config =
2405 rtc::Optional<std::string>("1234");
2406 SetSendParameters(send_parameters_);
2407 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2408 GetAudioNetworkAdaptorConfig(kSsrc1));
2409}
2410
2411TEST_F(WebRtcVoiceEngineTestFake, AudioSendResetAudioNetworkAdaptor) {
2412 EXPECT_TRUE(SetupSendStream());
2413 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2414 send_parameters_.options.audio_network_adaptor_config =
2415 rtc::Optional<std::string>("1234");
2416 SetSendParameters(send_parameters_);
2417 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2418 GetAudioNetworkAdaptorConfig(kSsrc1));
2419 const int initial_num = call_.GetNumCreatedSendStreams();
2420 cricket::AudioOptions options;
2421 options.audio_network_adaptor = rtc::Optional<bool>(false);
2422 SetAudioSend(kSsrc1, true, nullptr, &options);
2423 // AudioSendStream expected to be recreated.
2424 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
2425 EXPECT_EQ(rtc::Optional<std::string>(), GetAudioNetworkAdaptorConfig(kSsrc1));
2426}
2427
2428TEST_F(WebRtcVoiceEngineTestFake, AudioNetworkAdaptorNotGetOverridden) {
2429 EXPECT_TRUE(SetupSendStream());
2430 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2431 send_parameters_.options.audio_network_adaptor_config =
2432 rtc::Optional<std::string>("1234");
2433 SetSendParameters(send_parameters_);
2434 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2435 GetAudioNetworkAdaptorConfig(kSsrc1));
2436 const int initial_num = call_.GetNumCreatedSendStreams();
2437 cricket::AudioOptions options;
2438 options.audio_network_adaptor = rtc::Optional<bool>();
2439 // Unvalued |options.audio_network_adaptor|.should not reset audio network
2440 // adaptor.
2441 SetAudioSend(kSsrc1, true, nullptr, &options);
2442 // AudioSendStream not expected to be recreated.
2443 EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
2444 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2445 GetAudioNetworkAdaptorConfig(kSsrc1));
2446}
2447
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002448// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002449// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002450TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002451 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002452 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002453}
2454
2455TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2456 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002457 EXPECT_TRUE(SetupSendStream());
solenbergff976312016-03-30 23:28:51 -07002458 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002459 // stream has to use a different SSRC.
solenberg8189b022016-06-14 12:13:00 -07002460 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg059fb442016-10-26 05:12:24 -07002461 SetSendParameters(send_parameters_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002462 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002463 SetAudioSendStreamStats();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002464
solenberg85a04962015-10-27 03:35:21 -07002465 // Check stats for the added streams.
2466 {
2467 cricket::VoiceMediaInfo info;
2468 EXPECT_EQ(true, channel_->GetStats(&info));
2469
2470 // We have added one send stream. We should see the stats we've set.
2471 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002472 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002473 // We have added one receive stream. We should see empty stats.
2474 EXPECT_EQ(info.receivers.size(), 1u);
2475 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2476 }
solenberg1ac56142015-10-13 03:58:19 -07002477
solenberg566ef242015-11-06 15:34:49 -08002478 // Start sending - this affects some reported stats.
2479 {
2480 cricket::VoiceMediaInfo info;
solenberg059fb442016-10-26 05:12:24 -07002481 SetSend(true);
solenberg566ef242015-11-06 15:34:49 -08002482 EXPECT_EQ(true, channel_->GetStats(&info));
2483 VerifyVoiceSenderInfo(info.senders[0], true);
2484 }
2485
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002486 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002487 {
2488 cricket::VoiceMediaInfo info;
2489 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2490 EXPECT_EQ(true, channel_->GetStats(&info));
2491 EXPECT_EQ(1u, info.senders.size());
2492 EXPECT_EQ(0u, info.receivers.size());
2493 }
solenberg1ac56142015-10-13 03:58:19 -07002494
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002495 // Deliver a new packet - a default receive stream should be created and we
2496 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002497 {
2498 cricket::VoiceMediaInfo info;
2499 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2500 SetAudioReceiveStreamStats();
2501 EXPECT_EQ(true, channel_->GetStats(&info));
2502 EXPECT_EQ(1u, info.senders.size());
2503 EXPECT_EQ(1u, info.receivers.size());
2504 VerifyVoiceReceiverInfo(info.receivers[0]);
2505 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002506}
2507
2508// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002509// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002510TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002511 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002512 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg8189b022016-06-14 12:13:00 -07002513 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -08002514 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002515}
2516
2517// Test that the local SSRC is the same on sending and receiving channels if the
2518// receive channel is created before the send channel.
2519TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002520 EXPECT_TRUE(SetupChannel());
solenberg4a0f7b52016-06-16 13:07:33 -07002521 EXPECT_TRUE(AddRecvStream(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002522 EXPECT_TRUE(channel_->AddSendStream(
solenberg4a0f7b52016-06-16 13:07:33 -07002523 cricket::StreamParams::CreateLegacy(kSsrc1)));
2524 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
2525 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002526}
2527
2528// Test that we can properly receive packets.
2529TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002530 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002531 EXPECT_TRUE(AddRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002532 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002533
2534 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2535 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002536}
2537
2538// Test that we can properly receive packets on multiple streams.
2539TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002540 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002541 const uint32_t ssrc1 = 1;
2542 const uint32_t ssrc2 = 2;
2543 const uint32_t ssrc3 = 3;
solenberg8189b022016-06-14 12:13:00 -07002544 EXPECT_TRUE(AddRecvStream(ssrc1));
2545 EXPECT_TRUE(AddRecvStream(ssrc2));
2546 EXPECT_TRUE(AddRecvStream(ssrc3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002547 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002548 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002549 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002550 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002551 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002552 }
mflodman3d7db262016-04-29 00:57:13 -07002553
2554 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2555 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2556 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2557
2558 EXPECT_EQ(s1.received_packets(), 0);
2559 EXPECT_EQ(s2.received_packets(), 0);
2560 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002561
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002562 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002563 EXPECT_EQ(s1.received_packets(), 0);
2564 EXPECT_EQ(s2.received_packets(), 0);
2565 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002566
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002567 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002568 EXPECT_EQ(s1.received_packets(), 1);
2569 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2570 EXPECT_EQ(s2.received_packets(), 0);
2571 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002572
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002573 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002574 EXPECT_EQ(s1.received_packets(), 1);
2575 EXPECT_EQ(s2.received_packets(), 1);
2576 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2577 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002578
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002579 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002580 EXPECT_EQ(s1.received_packets(), 1);
2581 EXPECT_EQ(s2.received_packets(), 1);
2582 EXPECT_EQ(s3.received_packets(), 1);
2583 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002584
mflodman3d7db262016-04-29 00:57:13 -07002585 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2586 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2587 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002588}
2589
solenberg7e63ef02015-11-20 00:19:43 -08002590// Test that receiving on an unsignalled stream works (default channel will be
2591// created).
2592TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002593 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002594 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2595
solenberg7e63ef02015-11-20 00:19:43 -08002596 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002597
2598 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2599 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2600 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002601}
2602
2603// Test that receiving on an unsignalled stream works (default channel will be
2604// created), and that packets will be forwarded to the default channel
2605// regardless of their SSRCs.
2606TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002607 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002608 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002609 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2610
mflodman3d7db262016-04-29 00:57:13 -07002611 // Note that ssrc = 0 is not supported.
2612 uint32_t ssrc = 1;
2613 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002614 rtc::SetBE32(&packet[8], ssrc);
2615 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002616
2617 // Verify we only have one default stream.
2618 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2619 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2620 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002621 }
mflodman3d7db262016-04-29 00:57:13 -07002622
2623 // Sending the same ssrc again should not create a new stream.
2624 --ssrc;
2625 DeliverPacket(packet, sizeof(packet));
2626 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2627 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2628 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002629}
2630
2631// Test that a default channel is created even after a signalled stream has been
2632// added, and that this stream will get any packets for unknown SSRCs.
2633TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002634 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002635 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002636 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2637
2638 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002639 const uint32_t signaled_ssrc = 1;
2640 rtc::SetBE32(&packet[8], signaled_ssrc);
solenberg8189b022016-06-14 12:13:00 -07002641 EXPECT_TRUE(AddRecvStream(signaled_ssrc));
solenberg7e63ef02015-11-20 00:19:43 -08002642 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002643 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2644 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002645
2646 // Note that the first unknown SSRC cannot be 0, because we only support
2647 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002648 const uint32_t unsignaled_ssrc = 7011;
2649 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002650 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002651 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2652 packet, sizeof(packet)));
2653 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2654
2655 DeliverPacket(packet, sizeof(packet));
2656 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2657
2658 rtc::SetBE32(&packet[8], signaled_ssrc);
2659 DeliverPacket(packet, sizeof(packet));
2660 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2661 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002662}
2663
solenberg0a617e22015-10-20 15:49:38 -07002664// Test that we properly handle failures to add a receive stream.
2665TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002666 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002667 voe_.set_fail_create_channel(true);
solenberg8189b022016-06-14 12:13:00 -07002668 EXPECT_FALSE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002669}
2670
solenberg0a617e22015-10-20 15:49:38 -07002671// Test that we properly handle failures to add a send stream.
2672TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002673 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002674 voe_.set_fail_create_channel(true);
2675 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2676}
2677
solenberg1ac56142015-10-13 03:58:19 -07002678// Test that AddRecvStream creates new stream.
2679TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002680 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002681 int channel_num = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07002682 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002683 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002684}
2685
2686// Test that after adding a recv stream, we do not decode more codecs than
2687// those previously passed into SetRecvCodecs.
2688TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002689 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002690 cricket::AudioRecvParameters parameters;
2691 parameters.codecs.push_back(kIsacCodec);
2692 parameters.codecs.push_back(kPcmuCodec);
2693 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -07002694 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002695 int channel_num2 = voe_.GetLastChannel();
2696 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002697 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002698 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002699 gcodec.channels = 2;
2700 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2701}
2702
2703// Test that we properly clean up any streams that were added, even if
2704// not explicitly removed.
2705TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002706 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002707 SetSendParameters(send_parameters_);
solenberg8189b022016-06-14 12:13:00 -07002708 EXPECT_TRUE(AddRecvStream(1));
2709 EXPECT_TRUE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002710 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2711 delete channel_;
2712 channel_ = NULL;
2713 EXPECT_EQ(0, voe_.GetNumChannels());
2714}
2715
wu@webrtc.org78187522013-10-07 23:32:02 +00002716TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002717 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07002718 EXPECT_FALSE(AddRecvStream(0));
wu@webrtc.org78187522013-10-07 23:32:02 +00002719}
2720
2721TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002722 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002723 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002724 // Manually delete channel to simulate a failure.
2725 int channel = voe_.GetLastChannel();
2726 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2727 // Add recv stream 2 should work.
solenberg8189b022016-06-14 12:13:00 -07002728 EXPECT_TRUE(AddRecvStream(2));
wu@webrtc.org78187522013-10-07 23:32:02 +00002729 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002730 EXPECT_NE(channel, new_channel);
2731 // The last created channel is deleted too.
2732 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002733}
2734
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002735// Test the InsertDtmf on default send stream as caller.
2736TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
solenbergffbbcac2016-11-17 05:25:37 -08002737 TestInsertDtmf(0, true, kTelephoneEventCodec1);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002738}
2739
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002740// Test the InsertDtmf on default send stream as callee
2741TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
solenbergffbbcac2016-11-17 05:25:37 -08002742 TestInsertDtmf(0, false, kTelephoneEventCodec2);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002743}
2744
2745// Test the InsertDtmf on specified send stream as caller.
2746TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
solenbergffbbcac2016-11-17 05:25:37 -08002747 TestInsertDtmf(kSsrc1, true, kTelephoneEventCodec2);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002748}
2749
2750// Test the InsertDtmf on specified send stream as callee.
2751TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
solenbergffbbcac2016-11-17 05:25:37 -08002752 TestInsertDtmf(kSsrc1, false, kTelephoneEventCodec1);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002753}
2754
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002755TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002756 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002757 EXPECT_CALL(adm_,
2758 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2759 EXPECT_CALL(adm_,
2760 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2761 EXPECT_CALL(adm_,
2762 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002763 bool ec_enabled;
2764 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002765 webrtc::AecmModes aecm_mode;
2766 bool cng_enabled;
2767 bool agc_enabled;
2768 webrtc::AgcModes agc_mode;
2769 webrtc::AgcConfig agc_config;
2770 bool ns_enabled;
2771 webrtc::NsModes ns_mode;
2772 bool highpass_filter_enabled;
2773 bool stereo_swapping_enabled;
2774 bool typing_detection_enabled;
2775 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002776 voe_.GetAecmMode(aecm_mode, cng_enabled);
2777 voe_.GetAgcStatus(agc_enabled, agc_mode);
2778 voe_.GetAgcConfig(agc_config);
2779 voe_.GetNsStatus(ns_enabled, ns_mode);
2780 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2781 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2782 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2783 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002784 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002785 EXPECT_FALSE(cng_enabled);
2786 EXPECT_TRUE(agc_enabled);
2787 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2788 EXPECT_TRUE(ns_enabled);
2789 EXPECT_TRUE(highpass_filter_enabled);
2790 EXPECT_FALSE(stereo_swapping_enabled);
2791 EXPECT_TRUE(typing_detection_enabled);
2792 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2793 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002794 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2795 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002796
solenberg246b8172015-12-08 09:50:23 -08002797 // Nothing set in AudioOptions, so everything should be as default.
2798 send_parameters_.options = cricket::AudioOptions();
solenberg059fb442016-10-26 05:12:24 -07002799 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002800 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002801 voe_.GetAecmMode(aecm_mode, cng_enabled);
2802 voe_.GetAgcStatus(agc_enabled, agc_mode);
2803 voe_.GetAgcConfig(agc_config);
2804 voe_.GetNsStatus(ns_enabled, ns_mode);
2805 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2806 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2807 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2808 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002809 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002810 EXPECT_FALSE(cng_enabled);
2811 EXPECT_TRUE(agc_enabled);
2812 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2813 EXPECT_TRUE(ns_enabled);
2814 EXPECT_TRUE(highpass_filter_enabled);
2815 EXPECT_FALSE(stereo_swapping_enabled);
2816 EXPECT_TRUE(typing_detection_enabled);
2817 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2818 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002819 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2820 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002821
2822 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002823 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002824 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002825 voe_.GetEcStatus(ec_enabled, ec_mode);
2826 EXPECT_FALSE(ec_enabled);
2827
2828 // Turn echo cancellation back on, with settings, and make sure
2829 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002830 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002831 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002832 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002833 voe_.GetAecmMode(aecm_mode, cng_enabled);
2834 voe_.GetAgcStatus(agc_enabled, agc_mode);
2835 voe_.GetAgcConfig(agc_config);
2836 voe_.GetNsStatus(ns_enabled, ns_mode);
2837 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2838 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2839 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2840 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002841 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002842 EXPECT_TRUE(agc_enabled);
2843 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2844 EXPECT_TRUE(ns_enabled);
2845 EXPECT_TRUE(highpass_filter_enabled);
2846 EXPECT_FALSE(stereo_swapping_enabled);
2847 EXPECT_TRUE(typing_detection_enabled);
2848 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2849 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2850
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002851 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2852 // control.
solenberg246b8172015-12-08 09:50:23 -08002853 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002854 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002855 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002856 voe_.GetAecmMode(aecm_mode, cng_enabled);
2857 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002858 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002859 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2860
2861 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002862 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2863 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2864 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002865 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002866 voe_.GetEcStatus(ec_enabled, ec_mode);
2867 EXPECT_FALSE(ec_enabled);
2868 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002869 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002870 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002871 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002872 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002873 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002874 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2875
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002876 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002877 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002878 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002879 voe_.GetAgcStatus(agc_enabled, agc_mode);
2880 EXPECT_FALSE(agc_enabled);
2881
2882 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002883 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2884 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
solenberg059fb442016-10-26 05:12:24 -07002885 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002886 voe_.GetAgcStatus(agc_enabled, agc_mode);
2887 EXPECT_TRUE(agc_enabled);
2888 voe_.GetAgcConfig(agc_config);
2889 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2890
2891 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002892 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2893 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2894 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2895 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002896 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002897 voe_.GetNsStatus(ns_enabled, ns_mode);
2898 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2899 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2900 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2901 EXPECT_FALSE(ns_enabled);
2902 EXPECT_FALSE(highpass_filter_enabled);
2903 EXPECT_FALSE(typing_detection_enabled);
2904 EXPECT_TRUE(stereo_swapping_enabled);
2905
solenberg1ac56142015-10-13 03:58:19 -07002906 // Set options again to ensure it has no impact.
solenberg059fb442016-10-26 05:12:24 -07002907 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002908 voe_.GetEcStatus(ec_enabled, ec_mode);
2909 voe_.GetNsStatus(ns_enabled, ns_mode);
2910 EXPECT_TRUE(ec_enabled);
2911 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2912 EXPECT_FALSE(ns_enabled);
2913 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2914}
2915
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002916TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002917 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002918
2919 bool ec_enabled;
2920 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002921 bool agc_enabled;
2922 webrtc::AgcModes agc_mode;
2923 bool ns_enabled;
2924 webrtc::NsModes ns_mode;
2925 bool highpass_filter_enabled;
2926 bool stereo_swapping_enabled;
2927 bool typing_detection_enabled;
2928
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002929 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002930 voe_.GetAgcStatus(agc_enabled, agc_mode);
2931 voe_.GetNsStatus(ns_enabled, ns_mode);
2932 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2933 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2934 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2935 EXPECT_TRUE(ec_enabled);
2936 EXPECT_TRUE(agc_enabled);
2937 EXPECT_TRUE(ns_enabled);
2938 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002939 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002940 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002941}
2942
2943TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2944 webrtc::AgcConfig set_config = {0};
2945 set_config.targetLeveldBOv = 3;
2946 set_config.digitalCompressionGaindB = 9;
2947 set_config.limiterEnable = true;
2948 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002949
2950 webrtc::AgcConfig config = {0};
2951 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2952 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2953 EXPECT_EQ(set_config.digitalCompressionGaindB,
2954 config.digitalCompressionGaindB);
2955 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2956}
2957
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002958TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002959 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002960 EXPECT_CALL(adm_,
2961 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2962 EXPECT_CALL(adm_,
2963 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
2964 EXPECT_CALL(adm_,
2965 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
solenberg059fb442016-10-26 05:12:24 -07002966 EXPECT_CALL(adm_,
2967 RecordingIsInitialized()).Times(2).WillRepeatedly(Return(false));
2968 EXPECT_CALL(adm_, Recording()).Times(2).WillRepeatedly(Return(false));
2969 EXPECT_CALL(adm_, InitRecording()).Times(2).WillRepeatedly(Return(0));
2970 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(10);
2971 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(10);
solenberg5b5129a2016-04-08 05:35:48 -07002972
kwiberg686a8ef2016-02-26 03:00:35 -08002973 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07002974 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002975 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002976 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07002977 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002978 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002979
2980 // Have to add a stream to make SetSend work.
2981 cricket::StreamParams stream1;
2982 stream1.ssrcs.push_back(1);
2983 channel1->AddSendStream(stream1);
2984 cricket::StreamParams stream2;
2985 stream2.ssrcs.push_back(2);
2986 channel2->AddSendStream(stream2);
2987
2988 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002989 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002990 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2991 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2992 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002993 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002994 EXPECT_EQ(parameters_options_all.options, channel1->options());
solenberg059fb442016-10-26 05:12:24 -07002995 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002996 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002997
2998 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002999 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003000 parameters_options_no_ns.options.noise_suppression =
3001 rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07003002 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003003 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003004 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3005 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3006 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003007 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003008
3009 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003010 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003011 parameters_options_no_agc.options.auto_gain_control =
3012 rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07003013 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003014 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3015 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3016 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003017 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003018
solenberg059fb442016-10-26 05:12:24 -07003019 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003020 bool ec_enabled;
3021 webrtc::EcModes ec_mode;
3022 bool agc_enabled;
3023 webrtc::AgcModes agc_mode;
3024 bool ns_enabled;
3025 webrtc::NsModes ns_mode;
3026 voe_.GetEcStatus(ec_enabled, ec_mode);
3027 voe_.GetAgcStatus(agc_enabled, agc_mode);
3028 voe_.GetNsStatus(ns_enabled, ns_mode);
3029 EXPECT_TRUE(ec_enabled);
3030 EXPECT_TRUE(agc_enabled);
3031 EXPECT_TRUE(ns_enabled);
3032
solenberg059fb442016-10-26 05:12:24 -07003033 channel1->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003034 voe_.GetEcStatus(ec_enabled, ec_mode);
3035 voe_.GetAgcStatus(agc_enabled, agc_mode);
3036 voe_.GetNsStatus(ns_enabled, ns_mode);
3037 EXPECT_TRUE(ec_enabled);
3038 EXPECT_TRUE(agc_enabled);
3039 EXPECT_FALSE(ns_enabled);
3040
solenberg059fb442016-10-26 05:12:24 -07003041 channel2->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003042 voe_.GetEcStatus(ec_enabled, ec_mode);
3043 voe_.GetAgcStatus(agc_enabled, agc_mode);
3044 voe_.GetNsStatus(ns_enabled, ns_mode);
3045 EXPECT_TRUE(ec_enabled);
3046 EXPECT_FALSE(agc_enabled);
3047 EXPECT_TRUE(ns_enabled);
3048
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003049 // Make sure settings take effect while we are sending.
solenberg059fb442016-10-26 05:12:24 -07003050 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
3051 EXPECT_CALL(apm_, ApplyConfig(testing::_));
3052 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003053 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3054 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003055 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003056 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003057 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003058 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003059 channel2->SetSend(true);
solenberg059fb442016-10-26 05:12:24 -07003060 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc_nor_ns));
Karl Wibergbe579832015-11-10 22:34:18 +01003061 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3062 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3063 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003064 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003065 voe_.GetEcStatus(ec_enabled, ec_mode);
3066 voe_.GetAgcStatus(agc_enabled, agc_mode);
3067 voe_.GetNsStatus(ns_enabled, ns_mode);
3068 EXPECT_TRUE(ec_enabled);
3069 EXPECT_FALSE(agc_enabled);
3070 EXPECT_FALSE(ns_enabled);
3071}
3072
wu@webrtc.orgde305012013-10-31 15:40:38 +00003073// This test verifies DSCP settings are properly applied on voice media channel.
3074TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003075 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003076 cricket::FakeNetworkInterface network_interface;
3077 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003078 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003079
solenberg059fb442016-10-26 05:12:24 -07003080 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(3);
3081 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(3);
3082
solenbergbc37fc82016-04-04 09:54:44 -07003083 channel.reset(
3084 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003085 channel->SetInterface(&network_interface);
3086 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3087 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3088
3089 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003090 channel.reset(
3091 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003092 channel->SetInterface(&network_interface);
3093 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3094
3095 // Verify that setting the option to false resets the
3096 // DiffServCodePoint.
3097 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003098 channel.reset(
3099 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003100 channel->SetInterface(&network_interface);
3101 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3102 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3103
3104 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003105}
3106
solenberg1ac56142015-10-13 03:58:19 -07003107TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003108 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003109 cricket::WebRtcVoiceMediaChannel* media_channel =
3110 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003111 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
solenberg8189b022016-06-14 12:13:00 -07003112 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -07003113 int channel_id = voe_.GetLastChannel();
3114 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3115 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
solenberg8189b022016-06-14 12:13:00 -07003116 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07003117 int channel_id2 = voe_.GetLastChannel();
3118 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003119}
3120
solenberg1ac56142015-10-13 03:58:19 -07003121TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003122 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003123 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003124 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3125 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3126 EXPECT_TRUE(channel_->AddSendStream(
3127 cricket::StreamParams::CreateLegacy(kSsrc1)));
3128 int channel_id = voe_.GetLastChannel();
3129 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3130 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3131 EXPECT_TRUE(channel_->AddSendStream(
3132 cricket::StreamParams::CreateLegacy(kSsrc2)));
3133 int channel_id2 = voe_.GetLastChannel();
3134 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003135}
3136
solenberg4bac9c52015-10-09 02:32:53 -07003137TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003138 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003139 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003140 cricket::StreamParams stream;
3141 stream.ssrcs.push_back(kSsrc2);
3142 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg217fb662016-06-17 08:30:54 -07003143 EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrc2).gain());
solenberg4bac9c52015-10-09 02:32:53 -07003144 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg217fb662016-06-17 08:30:54 -07003145 EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc2).gain());
solenberg1ac56142015-10-13 03:58:19 -07003146}
3147
3148TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003149 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003150 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3151 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg217fb662016-06-17 08:30:54 -07003152 EXPECT_DOUBLE_EQ(2, GetRecvStream(1).gain());
solenberg1ac56142015-10-13 03:58:19 -07003153 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenberg217fb662016-06-17 08:30:54 -07003154 EXPECT_DOUBLE_EQ(3, GetRecvStream(1).gain());
3155 EXPECT_TRUE(channel_->SetOutputVolume(1, 4));
3156 EXPECT_DOUBLE_EQ(4, GetRecvStream(1).gain());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003157}
3158
pbos8fc7fa72015-07-15 08:02:58 -07003159TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003160 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003161 const std::string kSyncLabel = "AvSyncLabel";
3162
solenbergff976312016-03-30 23:28:51 -07003163 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003164 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3165 sp.sync_label = kSyncLabel;
3166 // Creating two channels to make sure that sync label is set properly for both
3167 // the default voice channel and following ones.
3168 EXPECT_TRUE(channel_->AddRecvStream(sp));
3169 sp.ssrcs[0] += 1;
3170 EXPECT_TRUE(channel_->AddRecvStream(sp));
3171
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003172 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003173 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003174 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003175 << "SyncGroup should be set based on sync_label";
3176 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003177 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003178 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003179}
3180
solenberg3a941542015-11-16 07:34:50 -08003181// TODO(solenberg): Remove, once recv streams are configured through Call.
3182// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003183TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003184 // Test that setting the header extensions results in the expected state
3185 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003186 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003187 ssrcs.push_back(223);
3188 ssrcs.push_back(224);
3189
solenbergff976312016-03-30 23:28:51 -07003190 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07003191 SetSendParameters(send_parameters_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02003192 for (uint32_t ssrc : ssrcs) {
solenberg059fb442016-10-26 05:12:24 -07003193 EXPECT_TRUE(channel_->AddRecvStream(
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003194 cricket::StreamParams::CreateLegacy(ssrc)));
3195 }
3196
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003197 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003198 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003199 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003200 EXPECT_NE(nullptr, s);
3201 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3202 }
3203
3204 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003205 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003206 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003207 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003208 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003209 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003210 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003211 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003212 EXPECT_NE(nullptr, s);
3213 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003214 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3215 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003216 for (const auto& s_ext : s_exts) {
3217 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003218 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003219 }
3220 }
3221 }
3222 }
3223
3224 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003225 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003226 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003227 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003228 EXPECT_NE(nullptr, s);
3229 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3230 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003231}
3232
3233TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3234 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003235 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003236 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003237 static const unsigned char kRtcp[] = {
3238 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3239 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3240 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3242 };
jbaucheec21bd2016-03-20 06:15:43 -07003243 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003244
solenbergff976312016-03-30 23:28:51 -07003245 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003246 cricket::WebRtcVoiceMediaChannel* media_channel =
3247 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg059fb442016-10-26 05:12:24 -07003248 SetSendParameters(send_parameters_);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003249 EXPECT_TRUE(media_channel->AddRecvStream(
3250 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3251
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003252 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003253 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003254 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003255 EXPECT_EQ(0, s->received_packets());
3256 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3257 EXPECT_EQ(1, s->received_packets());
3258 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3259 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003260}
Minyue2013aec2015-05-13 14:14:42 +02003261
solenberg0a617e22015-10-20 15:49:38 -07003262// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003263// since they do not send RTCP SR.
solenberg7602aab2016-11-14 11:30:07 -08003264TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_SendCreatedFirst) {
solenbergff976312016-03-30 23:28:51 -07003265 EXPECT_TRUE(SetupSendStream());
solenberg7602aab2016-11-14 11:30:07 -08003266 EXPECT_TRUE(AddRecvStream(kSsrc2));
3267 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
3268 EXPECT_TRUE(channel_->AddSendStream(
3269 cricket::StreamParams::CreateLegacy(kSsrc3)));
3270 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
3271 EXPECT_TRUE(AddRecvStream(kSsrc4));
3272 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc4).rtp.local_ssrc);
Minyue2013aec2015-05-13 14:14:42 +02003273}
3274
solenberg7602aab2016-11-14 11:30:07 -08003275TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_RecvCreatedFirst) {
3276 EXPECT_TRUE(SetupRecvStream());
3277 EXPECT_EQ(0xFA17FA17u, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3278 EXPECT_TRUE(channel_->AddSendStream(
3279 cricket::StreamParams::CreateLegacy(kSsrc2)));
3280 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3281 EXPECT_TRUE(AddRecvStream(kSsrc3));
3282 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc3).rtp.local_ssrc);
3283 EXPECT_TRUE(channel_->AddSendStream(
3284 cricket::StreamParams::CreateLegacy(kSsrc4)));
3285 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3286 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc3).rtp.local_ssrc);
Minyue2013aec2015-05-13 14:14:42 +02003287}
stefan658910c2015-09-03 05:48:32 -07003288
deadbeef884f5852016-01-15 09:20:04 -08003289TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003290 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003291 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3292 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003293
3294 // Setting the sink before a recv stream exists should do nothing.
3295 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
solenberg8189b022016-06-14 12:13:00 -07003296 EXPECT_TRUE(AddRecvStream(kSsrc1));
deadbeef884f5852016-01-15 09:20:04 -08003297 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3298
3299 // Now try actually setting the sink.
3300 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3301 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3302
3303 // Now try resetting it.
3304 channel_->SetRawAudioSink(kSsrc1, nullptr);
3305 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3306}
3307
3308TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003309 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003310 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3311 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003312
3313 // Should be able to set a default sink even when no stream exists.
3314 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3315
3316 // Create default channel and ensure it's assigned the default sink.
3317 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3318 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3319
3320 // Try resetting the default sink.
3321 channel_->SetRawAudioSink(0, nullptr);
3322 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3323
3324 // Try setting the default sink while the default stream exists.
3325 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3326 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3327
3328 // If we remove and add a default stream, it should get the same sink.
3329 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3330 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3331 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3332}
3333
skvlad7a43d252016-03-22 15:32:27 -07003334// Test that, just like the video channel, the voice channel communicates the
3335// network state to the call.
3336TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003337 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003338
3339 EXPECT_EQ(webrtc::kNetworkUp,
3340 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3341 EXPECT_EQ(webrtc::kNetworkUp,
3342 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3343
3344 channel_->OnReadyToSend(false);
3345 EXPECT_EQ(webrtc::kNetworkDown,
3346 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3347 EXPECT_EQ(webrtc::kNetworkUp,
3348 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3349
3350 channel_->OnReadyToSend(true);
3351 EXPECT_EQ(webrtc::kNetworkUp,
3352 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3353 EXPECT_EQ(webrtc::kNetworkUp,
3354 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3355}
3356
aleloi18e0b672016-10-04 02:45:47 -07003357// Test that playout is still started after changing parameters
3358TEST_F(WebRtcVoiceEngineTestFake, PreservePlayoutWhenRecreateRecvStream) {
3359 SetupRecvStream();
3360 channel_->SetPlayout(true);
3361 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3362
3363 // Changing RTP header extensions will recreate the AudioReceiveStream.
3364 cricket::AudioRecvParameters parameters;
3365 parameters.extensions.push_back(
3366 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
3367 channel_->SetRecvParameters(parameters);
3368
3369 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3370}
3371
stefan658910c2015-09-03 05:48:32 -07003372// Tests that the library initializes and shuts down properly.
3373TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossu29b1a8d2016-06-13 07:34:51 -07003374 // If the VoiceEngine wants to gather available codecs early, that's fine but
3375 // we never want it to create a decoder at this stage.
ossuc54071d2016-08-17 02:45:41 -07003376 cricket::WebRtcVoiceEngine engine(
3377 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003378 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003379 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003380 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003381 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3382 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003383 EXPECT_TRUE(channel != nullptr);
3384 delete channel;
solenbergff976312016-03-30 23:28:51 -07003385}
stefan658910c2015-09-03 05:48:32 -07003386
solenbergff976312016-03-30 23:28:51 -07003387// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003388TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3389 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3390 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3391 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003392 {
ossuc54071d2016-08-17 02:45:41 -07003393 cricket::WebRtcVoiceEngine engine(
3394 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003395 webrtc::RtcEventLogNullImpl event_log;
solenbergff976312016-03-30 23:28:51 -07003396 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003397 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
solenbergff976312016-03-30 23:28:51 -07003398 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3399 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3400 EXPECT_TRUE(channel != nullptr);
3401 delete channel;
3402 }
stefan658910c2015-09-03 05:48:32 -07003403}
3404
3405// Tests that the library is configured with the codecs we want.
3406TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003407 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3408 // module.
3409
stefan658910c2015-09-03 05:48:32 -07003410 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003411 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003412 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003413 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003414 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003415 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003416 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003417 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003418 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003419 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003420 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003421 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003422 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003423 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003424 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003425 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003426 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003427 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
solenberg2779bab2016-11-17 04:45:19 -08003428 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3429 cricket::AudioCodec(96, "telephone-event", 16000, 0, 1), nullptr));
3430 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3431 cricket::AudioCodec(96, "telephone-event", 32000, 0, 1), nullptr));
3432 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3433 cricket::AudioCodec(96, "telephone-event", 48000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003434 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003435 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003436 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003437 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003438 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003439 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003440 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003441 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003442 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003443 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003444 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003445 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003446 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003447 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003448 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003449 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003450 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003451 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003452 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003453 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003454 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003455 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003456 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003457
stefan658910c2015-09-03 05:48:32 -07003458 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossuc54071d2016-08-17 02:45:41 -07003459 // TODO(ossu): Why are the payload types of codecs with non-static payload
3460 // type assignments checked here? It shouldn't really matter.
3461 cricket::WebRtcVoiceEngine engine(
3462 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
solenberg2779bab2016-11-17 04:45:19 -08003463 for (const cricket::AudioCodec& codec : engine.send_codecs()) {
3464 if (codec.name == "CN" && codec.clockrate == 16000) {
3465 EXPECT_EQ(105, codec.id);
3466 } else if (codec.name == "CN" && codec.clockrate == 32000) {
3467 EXPECT_EQ(106, codec.id);
3468 } else if (codec.name == "ISAC" && codec.clockrate == 16000) {
3469 EXPECT_EQ(103, codec.id);
3470 } else if (codec.name == "ISAC" && codec.clockrate == 32000) {
3471 EXPECT_EQ(104, codec.id);
3472 } else if (codec.name == "G722" && codec.clockrate == 8000) {
3473 EXPECT_EQ(9, codec.id);
3474 } else if (codec.name == "telephone-event" && codec.clockrate == 8000) {
3475 EXPECT_EQ(126, codec.id);
3476 // TODO(solenberg): 16k, 32k, 48k DTMF should be dynamically assigned.
3477 // Remove these checks once both send and receive side assigns payload types
3478 // dynamically.
3479 } else if (codec.name == "telephone-event" && codec.clockrate == 16000) {
3480 EXPECT_EQ(113, codec.id);
3481 } else if (codec.name == "telephone-event" && codec.clockrate == 32000) {
3482 EXPECT_EQ(112, codec.id);
3483 } else if (codec.name == "telephone-event" && codec.clockrate == 48000) {
3484 EXPECT_EQ(110, codec.id);
3485 } else if (codec.name == "opus") {
3486 EXPECT_EQ(111, codec.id);
3487 ASSERT_TRUE(codec.params.find("minptime") != codec.params.end());
3488 EXPECT_EQ("10", codec.params.find("minptime")->second);
3489 ASSERT_TRUE(codec.params.find("useinbandfec") != codec.params.end());
3490 EXPECT_EQ("1", codec.params.find("useinbandfec")->second);
stefan658910c2015-09-03 05:48:32 -07003491 }
3492 }
stefan658910c2015-09-03 05:48:32 -07003493}
3494
3495// Tests that VoE supports at least 32 channels
3496TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossuc54071d2016-08-17 02:45:41 -07003497 cricket::WebRtcVoiceEngine engine(
3498 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003499 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003500 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003501 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
stefan658910c2015-09-03 05:48:32 -07003502
3503 cricket::VoiceMediaChannel* channels[32];
3504 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003505 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003506 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3507 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003508 if (!channel)
3509 break;
stefan658910c2015-09-03 05:48:32 -07003510 channels[num_channels++] = channel;
3511 }
3512
tfarina5237aaf2015-11-10 23:44:30 -08003513 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003514 EXPECT_EQ(expected, num_channels);
3515
3516 while (num_channels > 0) {
3517 delete channels[--num_channels];
3518 }
stefan658910c2015-09-03 05:48:32 -07003519}
3520
3521// Test that we set our preferred codecs properly.
3522TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003523 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3524 // - Check that our builtin codecs are usable by Channel.
3525 // - The codecs provided by the engine is usable by Channel.
3526 // It does not check that the codecs in the RecvParameters are actually
3527 // what we sent in - though it's probably reasonable to expect so, if
3528 // SetRecvParameters returns true.
3529 // I think it will become clear once audio decoder injection is completed.
3530 cricket::WebRtcVoiceEngine engine(
3531 nullptr, webrtc::CreateBuiltinAudioDecoderFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003532 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003533 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003534 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003535 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3536 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003537 cricket::AudioRecvParameters parameters;
ossudedfd282016-06-14 07:12:39 -07003538 parameters.codecs = engine.recv_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003539 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003540}