blob: 6aedab2e025abbbe3b9b0f510fc55a60fe1b691b [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2008 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00003 *
kjellander1afca732016-02-07 20:46:45 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
kwiberg686a8ef2016-02-26 03:00:35 -080011#include <memory>
12
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010013#include "webrtc/pc/channel.h"
tfarina5237aaf2015-11-10 23:44:30 -080014#include "webrtc/base/arraysize.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000015#include "webrtc/base/byteorder.h"
16#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020017#include "webrtc/call.h"
stefanba4c0e42016-02-04 04:12:24 -080018#include "webrtc/p2p/base/faketransportcontroller.h"
19#include "webrtc/test/field_trial.h"
skvlad11a9cbf2016-10-07 11:53:05 -070020#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
kjellandera96e2d72016-02-04 23:52:28 -080021#include "webrtc/media/base/fakemediaengine.h"
22#include "webrtc/media/base/fakenetworkinterface.h"
23#include "webrtc/media/base/fakertp.h"
kjellanderf4752772016-03-02 05:42:30 -080024#include "webrtc/media/base/mediaconstants.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010025#include "webrtc/media/engine/fakewebrtccall.h"
26#include "webrtc/media/engine/fakewebrtcvoiceengine.h"
27#include "webrtc/media/engine/webrtcvoiceengine.h"
ossu29b1a8d2016-06-13 07:34:51 -070028#include "webrtc/modules/audio_coding/codecs/builtin_audio_decoder_factory.h"
29#include "webrtc/modules/audio_coding/codecs/mock/mock_audio_decoder_factory.h"
solenbergbc37fc82016-04-04 09:54:44 -070030#include "webrtc/modules/audio_device/include/mock_audio_device.h"
solenberg059fb442016-10-26 05:12:24 -070031#include "webrtc/modules/audio_processing/include/mock_audio_processing.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032
solenbergbc37fc82016-04-04 09:54:44 -070033using testing::Return;
34using testing::StrictMock;
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000035
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020036namespace {
37
deadbeef67cf2c12016-04-13 10:07:16 -070038const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1);
39const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1);
40const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2);
41const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1);
42const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1);
deadbeef67cf2c12016-04-13 10:07:16 -070043const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1);
44const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1);
45const cricket::AudioCodec kTelephoneEventCodec(106,
46 "telephone-event",
47 8000,
48 0,
49 1);
solenberg85a04962015-10-27 03:35:21 -070050const uint32_t kSsrc1 = 0x99;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080051const uint32_t kSsrc2 = 2;
52const uint32_t kSsrc3 = 3;
solenberg85a04962015-10-27 03:35:21 -070053const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000054
solenberg971cab02016-06-14 10:02:41 -070055constexpr int kRtpHistoryMs = 5000;
56
henrike@webrtc.org28e20752013-07-10 00:45:36 +000057class FakeVoEWrapper : public cricket::VoEWrapper {
58 public:
59 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
60 : cricket::VoEWrapper(engine, // processing
61 engine, // base
62 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000063 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064 engine) { // volume
65 }
66};
skvlad11a9cbf2016-10-07 11:53:05 -070067
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020068} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000069
solenbergff976312016-03-30 23:28:51 -070070// Tests that our stub library "works".
71TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070072 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
73 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
74 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070075 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
76 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
77 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenberg059fb442016-10-26 05:12:24 -070078 StrictMock<webrtc::test::MockAudioProcessing> apm;
79 EXPECT_CALL(apm, ApplyConfig(testing::_));
80 EXPECT_CALL(apm, SetExtraOptions(testing::_));
81 EXPECT_CALL(apm, Initialize()).WillOnce(Return(0));
82 cricket::FakeWebRtcVoiceEngine voe(&apm);
solenbergff976312016-03-30 23:28:51 -070083 EXPECT_FALSE(voe.IsInited());
84 {
ossuc54071d2016-08-17 02:45:41 -070085 cricket::WebRtcVoiceEngine engine(
86 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(),
87 new FakeVoEWrapper(&voe));
solenbergff976312016-03-30 23:28:51 -070088 EXPECT_TRUE(voe.IsInited());
89 }
90 EXPECT_FALSE(voe.IsInited());
91}
92
deadbeef884f5852016-01-15 09:20:04 -080093class FakeAudioSink : public webrtc::AudioSinkInterface {
94 public:
95 void OnData(const Data& audio) override {}
96};
97
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080098class FakeAudioSource : public cricket::AudioSource {
99 void SetSink(Sink* sink) override {}
100};
101
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000102class WebRtcVoiceEngineTestFake : public testing::Test {
103 public:
stefanba4c0e42016-02-04 04:12:24 -0800104 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
105
106 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
solenberg059fb442016-10-26 05:12:24 -0700107 : call_(webrtc::Call::Config(&event_log_)), voe_(&apm_),
skvlad11a9cbf2016-10-07 11:53:05 -0700108 override_field_trials_(field_trials) {
ossuc54071d2016-08-17 02:45:41 -0700109 auto factory = webrtc::MockAudioDecoderFactory::CreateUnusedFactory();
solenbergbc37fc82016-04-04 09:54:44 -0700110 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
111 EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -0700112 EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false));
113 EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false));
114 EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenberg059fb442016-10-26 05:12:24 -0700115 EXPECT_CALL(apm_, ApplyConfig(testing::_));
116 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
117 EXPECT_CALL(apm_, Initialize()).WillOnce(Return(0));
ossuc54071d2016-08-17 02:45:41 -0700118 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, factory,
solenbergbc37fc82016-04-04 09:54:44 -0700119 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200120 send_parameters_.codecs.push_back(kPcmuCodec);
121 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000122 }
solenberg8189b022016-06-14 12:13:00 -0700123
solenbergff976312016-03-30 23:28:51 -0700124 bool SetupChannel() {
solenberg059fb442016-10-26 05:12:24 -0700125 EXPECT_CALL(apm_, ApplyConfig(testing::_));
126 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
solenbergbc37fc82016-04-04 09:54:44 -0700127 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
128 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200129 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000130 }
solenberg8189b022016-06-14 12:13:00 -0700131
solenbergff976312016-03-30 23:28:51 -0700132 bool SetupRecvStream() {
133 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700134 return false;
135 }
solenberg8189b022016-06-14 12:13:00 -0700136 return AddRecvStream(kSsrc1);
solenberg1ac56142015-10-13 03:58:19 -0700137 }
solenberg8189b022016-06-14 12:13:00 -0700138
solenbergff976312016-03-30 23:28:51 -0700139 bool SetupSendStream() {
140 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000141 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000142 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800143 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
144 return false;
145 }
solenberg059fb442016-10-26 05:12:24 -0700146 EXPECT_CALL(apm_, set_output_will_be_muted(false));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800147 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000148 }
solenberg8189b022016-06-14 12:13:00 -0700149
150 bool AddRecvStream(uint32_t ssrc) {
151 EXPECT_TRUE(channel_);
152 return channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(ssrc));
153 }
154
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000155 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700156 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700157 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800158 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700159 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700160 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800161 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000162 }
solenberg8189b022016-06-14 12:13:00 -0700163
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000164 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700165 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000166 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000167 }
solenberg8189b022016-06-14 12:13:00 -0700168
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200169 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000170 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000171 }
172
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100173 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
174 const auto* send_stream = call_.GetAudioSendStream(ssrc);
175 EXPECT_TRUE(send_stream);
176 return *send_stream;
177 }
178
deadbeef884f5852016-01-15 09:20:04 -0800179 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
180 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
181 EXPECT_TRUE(recv_stream);
182 return *recv_stream;
183 }
184
solenberg3a941542015-11-16 07:34:50 -0800185 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800186 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800187 }
188
solenberg7add0582015-11-20 09:59:34 -0800189 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800190 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800191 }
192
solenberg059fb442016-10-26 05:12:24 -0700193 void SetSend(bool enable) {
194 ASSERT_TRUE(channel_);
solenbergd53a3f92016-04-14 13:56:37 -0700195 if (enable) {
196 EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false));
197 EXPECT_CALL(adm_, Recording()).WillOnce(Return(false));
198 EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0));
solenberg059fb442016-10-26 05:12:24 -0700199 EXPECT_CALL(apm_, ApplyConfig(testing::_));
200 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
solenbergd53a3f92016-04-14 13:56:37 -0700201 }
solenberg059fb442016-10-26 05:12:24 -0700202 channel_->SetSend(enable);
203 }
204
205 void SetSendParameters(const cricket::AudioSendParameters& params) {
206 EXPECT_CALL(apm_, ApplyConfig(testing::_));
207 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
208 ASSERT_TRUE(channel_);
209 EXPECT_TRUE(channel_->SetSendParameters(params));
210 }
211
minyue6b825df2016-10-31 04:08:32 -0700212 void SetAudioSend(uint32_t ssrc, bool enable, cricket::AudioSource* source,
213 const cricket::AudioOptions* options = nullptr) {
solenberg059fb442016-10-26 05:12:24 -0700214 EXPECT_CALL(apm_, set_output_will_be_muted(!enable));
215 ASSERT_TRUE(channel_);
minyue6b825df2016-10-31 04:08:32 -0700216 if (enable && options) {
217 EXPECT_CALL(apm_, ApplyConfig(testing::_));
218 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
219 }
220 EXPECT_TRUE(channel_->SetAudioSend(ssrc, enable, options, source));
solenbergd53a3f92016-04-14 13:56:37 -0700221 }
222
Peter Boström0c4e06b2015-10-07 12:23:21 +0200223 void TestInsertDtmf(uint32_t ssrc, bool caller) {
solenbergff976312016-03-30 23:28:51 -0700224 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000225 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700226 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000227 // send stream.
228 EXPECT_TRUE(channel_->AddSendStream(
229 cricket::StreamParams::CreateLegacy(kSsrc1)));
230 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000231
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000232 // Test we can only InsertDtmf when the other side supports telephone-event.
solenberg059fb442016-10-26 05:12:24 -0700233 SetSendParameters(send_parameters_);
234 SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000235 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800236 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200237 send_parameters_.codecs.push_back(kTelephoneEventCodec);
solenberg059fb442016-10-26 05:12:24 -0700238 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000239 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000240
241 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700242 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800243 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000244 EXPECT_TRUE(channel_->AddSendStream(
245 cricket::StreamParams::CreateLegacy(kSsrc1)));
246 }
247
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000248 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800249 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000250
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100251 // Test send.
252 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
253 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
254 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800255 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100256 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
257 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
258 EXPECT_EQ(2, telephone_event.event_code);
259 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000260 }
261
262 // Test that send bandwidth is set correctly.
263 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000264 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
265 // |expected_result| is the expected result from SetMaxSendBandwidth().
266 // |expected_bitrate| is the expected audio bitrate afterward.
deadbeef80346142016-04-27 14:17:10 -0700267 void TestMaxSendBandwidth(const cricket::AudioCodec& codec,
268 int max_bitrate,
269 bool expected_result,
270 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200271 cricket::AudioSendParameters parameters;
272 parameters.codecs.push_back(codec);
273 parameters.max_bandwidth_bps = max_bitrate;
solenberg059fb442016-10-26 05:12:24 -0700274 if (expected_result) {
275 SetSendParameters(parameters);
276 } else {
277 EXPECT_FALSE(channel_->SetSendParameters(parameters));
278 }
minyue7a973442016-10-20 03:27:12 -0700279 EXPECT_EQ(expected_bitrate, GetCodecBitrate(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000280 }
281
skvlade0d46372016-04-07 22:59:22 -0700282 // Sets the per-stream maximum bitrate limit for the specified SSRC.
283 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700284 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(ssrc);
skvlade0d46372016-04-07 22:59:22 -0700285 EXPECT_EQ(1UL, parameters.encodings.size());
286
287 parameters.encodings[0].max_bitrate_bps = bitrate;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700288 return channel_->SetRtpSendParameters(ssrc, parameters);
skvlade0d46372016-04-07 22:59:22 -0700289 }
290
solenberg059fb442016-10-26 05:12:24 -0700291 void SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
skvlade0d46372016-04-07 22:59:22 -0700292 cricket::AudioSendParameters send_parameters;
293 send_parameters.codecs.push_back(codec);
294 send_parameters.max_bandwidth_bps = bitrate;
solenberg059fb442016-10-26 05:12:24 -0700295 SetSendParameters(send_parameters);
skvlade0d46372016-04-07 22:59:22 -0700296 }
297
minyue7a973442016-10-20 03:27:12 -0700298 void CheckSendCodec(int32_t ssrc,
299 const char expected_name[],
300 int expected_channels,
301 int expected_bitrate) {
302 const auto& codec = GetSendStreamConfig(ssrc).send_codec_spec.codec_inst;
303 EXPECT_STREQ(expected_name, codec.plname);
304 EXPECT_EQ(expected_channels, codec.channels);
305 EXPECT_EQ(expected_bitrate, codec.rate);
306 }
307
308 int GetOpusMaxPlaybackRate(int32_t ssrc) {
309 return GetSendStreamConfig(ssrc).send_codec_spec.opus_max_playback_rate;
310 }
311
312 bool GetOpusDtx(int32_t ssrc) {
313 return GetSendStreamConfig(ssrc).send_codec_spec.enable_opus_dtx;
314 }
315
316 bool GetCodecFec(int32_t ssrc) {
317 return GetSendStreamConfig(ssrc).send_codec_spec.enable_codec_fec;
318 }
319
skvlade0d46372016-04-07 22:59:22 -0700320 int GetCodecBitrate(int32_t ssrc) {
minyue7a973442016-10-20 03:27:12 -0700321 return GetSendStreamConfig(ssrc).send_codec_spec.codec_inst.rate;
322 }
323
324 int GetCodecPacSize(int32_t ssrc) {
325 return GetSendStreamConfig(ssrc).send_codec_spec.codec_inst.pacsize;
skvlade0d46372016-04-07 22:59:22 -0700326 }
327
minyue6b825df2016-10-31 04:08:32 -0700328 const rtc::Optional<std::string>& GetAudioNetworkAdaptorConfig(int32_t ssrc) {
329 return GetSendStreamConfig(ssrc).audio_network_adaptor_config;
330 }
331
skvlade0d46372016-04-07 22:59:22 -0700332 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
333 int global_max,
334 int stream_max,
335 bool expected_result,
336 int expected_codec_bitrate) {
337 // Clear the bitrate limit from the previous test case.
338 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
339
340 // Attempt to set the requested bitrate limits.
solenberg059fb442016-10-26 05:12:24 -0700341 SetGlobalMaxBitrate(codec, global_max);
skvlade0d46372016-04-07 22:59:22 -0700342 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
343
344 // Verify that reading back the parameters gives results
345 // consistent with the Set() result.
346 webrtc::RtpParameters resulting_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700347 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700348 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
349 EXPECT_EQ(expected_result ? stream_max : -1,
350 resulting_parameters.encodings[0].max_bitrate_bps);
351
352 // Verify that the codec settings have the expected bitrate.
353 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
354 }
355
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000356 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700357 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000358
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000359 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800360 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000361
362 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700363 send_parameters_.extensions.push_back(
364 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg059fb442016-10-26 05:12:24 -0700365 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800366 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000367
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000368 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200369 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -0700370 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800371 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000372
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000373 // Ensure extension is set properly.
374 const int id = 1;
isheriff6f8d6862016-05-26 11:24:55 -0700375 send_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg059fb442016-10-26 05:12:24 -0700376 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800377 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700378 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800379 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000380
solenberg7add0582015-11-20 09:59:34 -0800381 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000382 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700383 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800384 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
385 call_.GetAudioSendStream(kSsrc2));
386 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700387 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800388 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000389
390 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200391 send_parameters_.codecs.push_back(kPcmuCodec);
392 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -0700393 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800394 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
395 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000396 }
397
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000398 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700399 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000400
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000401 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800402 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000403
404 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700405 recv_parameters_.extensions.push_back(
406 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800407 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
408 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000409
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000410 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800411 recv_parameters_.extensions.clear();
412 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
413 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000414
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000415 // Ensure extension is set properly.
416 const int id = 2;
isheriff6f8d6862016-05-26 11:24:55 -0700417 recv_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg7add0582015-11-20 09:59:34 -0800418 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
419 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700420 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800421 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000422
solenberg7add0582015-11-20 09:59:34 -0800423 // Ensure extension is set properly on new stream.
solenberg8189b022016-06-14 12:13:00 -0700424 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -0800425 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
426 call_.GetAudioReceiveStream(kSsrc2));
427 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700428 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800429 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000430
431 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800432 recv_parameters_.extensions.clear();
433 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
434 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
435 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000436 }
437
solenberg85a04962015-10-27 03:35:21 -0700438 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
439 webrtc::AudioSendStream::Stats stats;
440 stats.local_ssrc = 12;
441 stats.bytes_sent = 345;
442 stats.packets_sent = 678;
443 stats.packets_lost = 9012;
444 stats.fraction_lost = 34.56f;
445 stats.codec_name = "codec_name_send";
446 stats.ext_seqnum = 789;
447 stats.jitter_ms = 12;
448 stats.rtt_ms = 345;
449 stats.audio_level = 678;
450 stats.aec_quality_min = 9.01f;
451 stats.echo_delay_median_ms = 234;
452 stats.echo_delay_std_ms = 567;
453 stats.echo_return_loss = 890;
454 stats.echo_return_loss_enhancement = 1234;
ivoc8c63a822016-10-21 04:10:03 -0700455 stats.residual_echo_likelihood = 0.432f;
solenberg85a04962015-10-27 03:35:21 -0700456 stats.typing_noise_detected = true;
457 return stats;
458 }
459 void SetAudioSendStreamStats() {
460 for (auto* s : call_.GetAudioSendStreams()) {
461 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200462 }
solenberg85a04962015-10-27 03:35:21 -0700463 }
solenberg566ef242015-11-06 15:34:49 -0800464 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
465 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700466 const auto stats = GetAudioSendStreamStats();
467 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
468 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
469 EXPECT_EQ(info.packets_sent, stats.packets_sent);
470 EXPECT_EQ(info.packets_lost, stats.packets_lost);
471 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
472 EXPECT_EQ(info.codec_name, stats.codec_name);
473 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
474 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
475 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
476 EXPECT_EQ(info.audio_level, stats.audio_level);
477 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
478 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
479 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
480 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
481 EXPECT_EQ(info.echo_return_loss_enhancement,
482 stats.echo_return_loss_enhancement);
ivoc8c63a822016-10-21 04:10:03 -0700483 EXPECT_EQ(info.residual_echo_likelihood, stats.residual_echo_likelihood);
solenberg566ef242015-11-06 15:34:49 -0800484 EXPECT_EQ(info.typing_noise_detected,
485 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700486 }
487
488 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
489 webrtc::AudioReceiveStream::Stats stats;
490 stats.remote_ssrc = 123;
491 stats.bytes_rcvd = 456;
492 stats.packets_rcvd = 768;
493 stats.packets_lost = 101;
494 stats.fraction_lost = 23.45f;
495 stats.codec_name = "codec_name_recv";
496 stats.ext_seqnum = 678;
497 stats.jitter_ms = 901;
498 stats.jitter_buffer_ms = 234;
499 stats.jitter_buffer_preferred_ms = 567;
500 stats.delay_estimate_ms = 890;
501 stats.audio_level = 1234;
502 stats.expand_rate = 5.67f;
503 stats.speech_expand_rate = 8.90f;
504 stats.secondary_decoded_rate = 1.23f;
505 stats.accelerate_rate = 4.56f;
506 stats.preemptive_expand_rate = 7.89f;
507 stats.decoding_calls_to_silence_generator = 12;
508 stats.decoding_calls_to_neteq = 345;
509 stats.decoding_normal = 67890;
510 stats.decoding_plc = 1234;
511 stats.decoding_cng = 5678;
512 stats.decoding_plc_cng = 9012;
henrik.lundin63489782016-09-20 01:47:12 -0700513 stats.decoding_muted_output = 3456;
514 stats.capture_start_ntp_time_ms = 7890;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200515 return stats;
516 }
517 void SetAudioReceiveStreamStats() {
518 for (auto* s : call_.GetAudioReceiveStreams()) {
519 s->SetStats(GetAudioReceiveStreamStats());
520 }
521 }
522 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700523 const auto stats = GetAudioReceiveStreamStats();
524 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
525 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
526 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
527 EXPECT_EQ(info.packets_lost, stats.packets_lost);
528 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
529 EXPECT_EQ(info.codec_name, stats.codec_name);
530 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
531 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
532 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200533 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700534 stats.jitter_buffer_preferred_ms);
535 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
536 EXPECT_EQ(info.audio_level, stats.audio_level);
537 EXPECT_EQ(info.expand_rate, stats.expand_rate);
538 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
539 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
540 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
541 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200542 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700543 stats.decoding_calls_to_silence_generator);
544 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
545 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
546 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
547 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
548 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
henrik.lundin63489782016-09-20 01:47:12 -0700549 EXPECT_EQ(info.decoding_muted_output, stats.decoding_muted_output);
solenberg85a04962015-10-27 03:35:21 -0700550 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200551 }
552
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000553 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700554 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
solenberg059fb442016-10-26 05:12:24 -0700555 StrictMock<webrtc::test::MockAudioProcessing> apm_;
skvlad11a9cbf2016-10-07 11:53:05 -0700556 webrtc::RtcEventLogNullImpl event_log_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200557 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000558 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700559 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700560 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200561 cricket::AudioSendParameters send_parameters_;
562 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800563 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800564 private:
565 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000566};
567
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000568// Tests that we can create and destroy a channel.
569TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700570 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000571}
572
solenberg31fec402016-05-06 02:13:12 -0700573// Test that we can add a send stream and that it has the correct defaults.
574TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
575 EXPECT_TRUE(SetupChannel());
576 EXPECT_TRUE(
577 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
578 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
579 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
580 EXPECT_EQ("", config.rtp.c_name);
581 EXPECT_EQ(0u, config.rtp.extensions.size());
582 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
583 config.send_transport);
584}
585
586// Test that we can add a receive stream and that it has the correct defaults.
587TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
588 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -0700589 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg31fec402016-05-06 02:13:12 -0700590 const webrtc::AudioReceiveStream::Config& config =
591 GetRecvStreamConfig(kSsrc1);
592 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
593 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
594 EXPECT_FALSE(config.rtp.transport_cc);
595 EXPECT_EQ(0u, config.rtp.extensions.size());
596 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
597 config.rtcp_send_transport);
598 EXPECT_EQ("", config.sync_group);
599}
600
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700602// correctly (such that opus appears first).
ossudedfd282016-06-14 07:12:39 -0700603// TODO(ossu): This test should move into a separate builtin audio codecs
604// module.
deadbeef67cf2c12016-04-13 10:07:16 -0700605TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
ossudedfd282016-06-14 07:12:39 -0700606 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000607 ASSERT_FALSE(codecs.empty());
608 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
609 EXPECT_EQ(48000, codecs[0].clockrate);
610 EXPECT_EQ(2, codecs[0].channels);
611 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000612}
613
stefanba4c0e42016-02-04 04:12:24 -0800614TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
ossudedfd282016-06-14 07:12:39 -0700615 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -0800616 bool opus_found = false;
617 for (cricket::AudioCodec codec : codecs) {
618 if (codec.name == "opus") {
619 EXPECT_TRUE(HasTransportCc(codec));
620 opus_found = true;
621 }
622 }
623 EXPECT_TRUE(opus_found);
624}
625
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000626// Tests that we can find codecs by name or id, and that we interpret the
627// clockrate and bitrate fields properly.
628TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
629 cricket::AudioCodec codec;
630 webrtc::CodecInst codec_inst;
631 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800632 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000633 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800634 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000635 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800636 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
637 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000638 // Find ISAC with a different payload id.
639 codec = kIsacCodec;
640 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800641 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000642 EXPECT_EQ(codec.id, codec_inst.pltype);
643 // Find PCMU with a 0 clockrate.
644 codec = kPcmuCodec;
645 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800646 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000647 EXPECT_EQ(codec.id, codec_inst.pltype);
648 EXPECT_EQ(8000, codec_inst.plfreq);
649 // Find PCMU with a 0 bitrate.
650 codec = kPcmuCodec;
651 codec.bitrate = 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(64000, codec_inst.rate);
655 // Find ISAC with an explicit bitrate.
656 codec = kIsacCodec;
657 codec.bitrate = 32000;
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(32000, codec_inst.rate);
661}
662
663// Test that we set our inbound codecs properly, including changing PT.
664TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700665 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200666 cricket::AudioRecvParameters parameters;
667 parameters.codecs.push_back(kIsacCodec);
668 parameters.codecs.push_back(kPcmuCodec);
669 parameters.codecs.push_back(kTelephoneEventCodec);
670 parameters.codecs[0].id = 106; // collide with existing telephone-event
671 parameters.codecs[2].id = 126;
672 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700673 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700674 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000675 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800676 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000677 gcodec.plfreq = 16000;
678 gcodec.channels = 1;
679 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
680 EXPECT_EQ(106, gcodec.pltype);
681 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800682 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000683 gcodec.plfreq = 8000;
684 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
685 EXPECT_EQ(126, gcodec.pltype);
686 EXPECT_STREQ("telephone-event", gcodec.plname);
687}
688
689// Test that we fail to set an unknown inbound codec.
690TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700691 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200692 cricket::AudioRecvParameters parameters;
693 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700694 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200695 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000696}
697
698// Test that we fail if we have duplicate types in the inbound list.
699TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700700 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200701 cricket::AudioRecvParameters parameters;
702 parameters.codecs.push_back(kIsacCodec);
703 parameters.codecs.push_back(kCn16000Codec);
704 parameters.codecs[1].id = kIsacCodec.id;
705 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000706}
707
708// Test that we can decode OPUS without stereo parameters.
709TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700710 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200711 cricket::AudioRecvParameters parameters;
712 parameters.codecs.push_back(kIsacCodec);
713 parameters.codecs.push_back(kPcmuCodec);
714 parameters.codecs.push_back(kOpusCodec);
715 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700716 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700717 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000718 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800719 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000720 // Even without stereo parameters, recv codecs still specify channels = 2.
721 EXPECT_EQ(2, opus.channels);
722 EXPECT_EQ(111, opus.pltype);
723 EXPECT_STREQ("opus", opus.plname);
724 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700725 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000726 EXPECT_EQ(111, opus.pltype);
727}
728
729// Test that we can decode OPUS with stereo = 0.
730TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700731 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200732 cricket::AudioRecvParameters parameters;
733 parameters.codecs.push_back(kIsacCodec);
734 parameters.codecs.push_back(kPcmuCodec);
735 parameters.codecs.push_back(kOpusCodec);
736 parameters.codecs[2].params["stereo"] = "0";
737 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700738 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000739 int channel_num2 = voe_.GetLastChannel();
740 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800741 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000742 // Even when stereo is off, recv codecs still specify channels = 2.
743 EXPECT_EQ(2, opus.channels);
744 EXPECT_EQ(111, opus.pltype);
745 EXPECT_STREQ("opus", opus.plname);
746 opus.pltype = 0;
747 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
748 EXPECT_EQ(111, opus.pltype);
749}
750
751// Test that we can decode OPUS with stereo = 1.
752TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700753 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200754 cricket::AudioRecvParameters parameters;
755 parameters.codecs.push_back(kIsacCodec);
756 parameters.codecs.push_back(kPcmuCodec);
757 parameters.codecs.push_back(kOpusCodec);
758 parameters.codecs[2].params["stereo"] = "1";
759 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700760 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000761 int channel_num2 = voe_.GetLastChannel();
762 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800763 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000764 EXPECT_EQ(2, opus.channels);
765 EXPECT_EQ(111, opus.pltype);
766 EXPECT_STREQ("opus", opus.plname);
767 opus.pltype = 0;
768 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
769 EXPECT_EQ(111, opus.pltype);
770}
771
772// Test that changes to recv codecs are applied to all streams.
773TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700774 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200775 cricket::AudioRecvParameters parameters;
776 parameters.codecs.push_back(kIsacCodec);
777 parameters.codecs.push_back(kPcmuCodec);
778 parameters.codecs.push_back(kTelephoneEventCodec);
779 parameters.codecs[0].id = 106; // collide with existing telephone-event
780 parameters.codecs[2].id = 126;
781 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700782 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000783 int channel_num2 = voe_.GetLastChannel();
784 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800785 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000786 gcodec.plfreq = 16000;
787 gcodec.channels = 1;
788 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
789 EXPECT_EQ(106, gcodec.pltype);
790 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800791 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000792 gcodec.plfreq = 8000;
793 gcodec.channels = 1;
794 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
795 EXPECT_EQ(126, gcodec.pltype);
796 EXPECT_STREQ("telephone-event", gcodec.plname);
797}
798
799TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700800 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200801 cricket::AudioRecvParameters parameters;
802 parameters.codecs.push_back(kIsacCodec);
803 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200804 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000805
806 int channel_num2 = voe_.GetLastChannel();
807 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800808 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000809 gcodec.plfreq = 16000;
810 gcodec.channels = 1;
811 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
812 EXPECT_EQ(106, gcodec.pltype);
813 EXPECT_STREQ("ISAC", gcodec.plname);
814}
815
816// Test that we can apply the same set of codecs again while playing.
817TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700818 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200819 cricket::AudioRecvParameters parameters;
820 parameters.codecs.push_back(kIsacCodec);
821 parameters.codecs.push_back(kCn16000Codec);
822 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700823 channel_->SetPlayout(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200824 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000825
826 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200827 parameters.codecs[0].id = 127;
828 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700829 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000830}
831
832// Test that we can add a codec while playing.
833TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700834 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200835 cricket::AudioRecvParameters parameters;
836 parameters.codecs.push_back(kIsacCodec);
837 parameters.codecs.push_back(kCn16000Codec);
838 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700839 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000840
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200841 parameters.codecs.push_back(kOpusCodec);
842 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700843 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000844 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800845 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000846 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
847}
848
849TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700850 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000851
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000852 // Test that when autobw is enabled, bitrate is kept as the default
853 // value. autobw is enabled for the following tests because the target
854 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000855
856 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700857 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000858
859 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700860 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000861
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000862 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700863 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000864}
865
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000866TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700867 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000868
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000869 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000870
871 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700872 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
873 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
874 // Rates above the max (56000) should be capped.
875 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000876
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000877 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700878 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
879 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
880 // Rates above the max (510000) should be capped.
881 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000882}
883
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000884TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700885 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000886
887 // Test that we can only set a maximum bitrate for a fixed-rate codec
888 // if it's bigger than the fixed rate.
889
890 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700891 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
892 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
893 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
894 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
895 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
896 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
897 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000898}
899
900TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700901 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200902 const int kDesiredBitrate = 128000;
903 cricket::AudioSendParameters parameters;
ossudedfd282016-06-14 07:12:39 -0700904 parameters.codecs = engine_->send_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200905 parameters.max_bandwidth_bps = kDesiredBitrate;
solenberg059fb442016-10-26 05:12:24 -0700906 SetSendParameters(parameters);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000907
908 EXPECT_TRUE(channel_->AddSendStream(
909 cricket::StreamParams::CreateLegacy(kSsrc1)));
910
minyue7a973442016-10-20 03:27:12 -0700911 EXPECT_EQ(kDesiredBitrate, GetCodecBitrate(kSsrc1));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000912}
913
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000914// Test that bitrate cannot be set for CBR codecs.
915// Bitrate is ignored if it is higher than the fixed bitrate.
916// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000917TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700918 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000919
920 // PCMU, default bitrate == 64000.
solenberg059fb442016-10-26 05:12:24 -0700921 SetSendParameters(send_parameters_);
minyue7a973442016-10-20 03:27:12 -0700922 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200923
924 send_parameters_.max_bandwidth_bps = 128000;
solenberg059fb442016-10-26 05:12:24 -0700925 SetSendParameters(send_parameters_);
minyue7a973442016-10-20 03:27:12 -0700926 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200927
928 send_parameters_.max_bandwidth_bps = 128;
929 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
minyue7a973442016-10-20 03:27:12 -0700930 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000931}
932
skvlade0d46372016-04-07 22:59:22 -0700933// Test that the per-stream bitrate limit and the global
934// bitrate limit both apply.
935TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
936 EXPECT_TRUE(SetupSendStream());
937
938 // opus, default bitrate == 64000.
939 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
940 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
941 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
942 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
943
944 // CBR codecs allow both maximums to exceed the bitrate.
945 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
946 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
947 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
948 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
949
950 // CBR codecs don't allow per stream maximums to be too low.
951 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
952 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
953}
954
955// Test that an attempt to set RtpParameters for a stream that does not exist
956// fails.
957TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
958 EXPECT_TRUE(SetupChannel());
959 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700960 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700961 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
962
963 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700964 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -0700965}
966
967TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700968 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -0700969 // This test verifies that setting RtpParameters succeeds only if
970 // the structure contains exactly one encoding.
971 // TODO(skvlad): Update this test when we start supporting setting parameters
972 // for each encoding individually.
973
974 EXPECT_TRUE(SetupSendStream());
975 // Setting RtpParameters with no encoding is expected to fail.
976 webrtc::RtpParameters parameters;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700977 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700978 // Setting RtpParameters with exactly one encoding should succeed.
979 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700980 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700981 // Two or more encodings should result in failure.
982 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700983 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700984}
985
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700986// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700987// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700988TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
989 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -0700990 SetSend(true);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700991 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
992 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700993 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700994 ASSERT_EQ(1u, parameters.encodings.size());
995 ASSERT_TRUE(parameters.encodings[0].active);
996 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700997 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700998 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
999
1000 // Now change it back to active and verify we resume sending.
1001 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001002 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001003 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
1004}
1005
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001006// Test that SetRtpSendParameters configures the correct encoding channel for
1007// each SSRC.
skvlade0d46372016-04-07 22:59:22 -07001008TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
1009 SetupForMultiSendStream();
1010 // Create send streams.
1011 for (uint32_t ssrc : kSsrcs4) {
1012 EXPECT_TRUE(
1013 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
1014 }
1015 // Configure one stream to be limited by the stream config, another to be
1016 // limited by the global max, and the third one with no per-stream limit
1017 // (still subject to the global limit).
solenberg059fb442016-10-26 05:12:24 -07001018 SetGlobalMaxBitrate(kOpusCodec, 64000);
skvlade0d46372016-04-07 22:59:22 -07001019 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
1020 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
1021 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
1022
1023 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
1024 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
1025 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
1026
1027 // Remove the global cap; the streams should switch to their respective
1028 // maximums (or remain unchanged if there was no other limit on them.)
solenberg059fb442016-10-26 05:12:24 -07001029 SetGlobalMaxBitrate(kOpusCodec, -1);
skvlade0d46372016-04-07 22:59:22 -07001030 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
1031 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
1032 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
1033}
1034
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001035// Test that GetRtpSendParameters returns the currently configured codecs.
1036TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001037 EXPECT_TRUE(SetupSendStream());
1038 cricket::AudioSendParameters parameters;
1039 parameters.codecs.push_back(kIsacCodec);
1040 parameters.codecs.push_back(kPcmuCodec);
solenberg059fb442016-10-26 05:12:24 -07001041 SetSendParameters(parameters);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001042
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001043 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001044 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001045 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1046 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001047}
1048
1049// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001050TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001051 EXPECT_TRUE(SetupSendStream());
1052 cricket::AudioSendParameters parameters;
1053 parameters.codecs.push_back(kIsacCodec);
1054 parameters.codecs.push_back(kPcmuCodec);
solenberg059fb442016-10-26 05:12:24 -07001055 SetSendParameters(parameters);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001056
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001057 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001058
1059 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001060 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001061
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001062 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1063 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1064 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1065}
1066
1067// Test that GetRtpReceiveParameters returns the currently configured codecs.
1068TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1069 EXPECT_TRUE(SetupRecvStream());
1070 cricket::AudioRecvParameters parameters;
1071 parameters.codecs.push_back(kIsacCodec);
1072 parameters.codecs.push_back(kPcmuCodec);
1073 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1074
1075 webrtc::RtpParameters rtp_parameters =
1076 channel_->GetRtpReceiveParameters(kSsrc1);
1077 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1078 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1079 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1080}
1081
1082// Test that if we set/get parameters multiple times, we get the same results.
1083TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1084 EXPECT_TRUE(SetupRecvStream());
1085 cricket::AudioRecvParameters parameters;
1086 parameters.codecs.push_back(kIsacCodec);
1087 parameters.codecs.push_back(kPcmuCodec);
1088 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1089
1090 webrtc::RtpParameters initial_params =
1091 channel_->GetRtpReceiveParameters(kSsrc1);
1092
1093 // We should be able to set the params we just got.
1094 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1095
1096 // ... And this shouldn't change the params returned by
1097 // GetRtpReceiveParameters.
1098 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1099 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001100}
1101
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001102// Test that we apply codecs properly.
1103TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001104 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001105 cricket::AudioSendParameters parameters;
1106 parameters.codecs.push_back(kIsacCodec);
1107 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001108 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001109 parameters.codecs[0].id = 96;
1110 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001111 const int initial_num = call_.GetNumCreatedSendStreams();
solenberg059fb442016-10-26 05:12:24 -07001112 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001113 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
1114 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1115 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1116 EXPECT_EQ(48000, send_codec_spec.codec_inst.rate);
1117 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1118 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1119 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
1120 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001121 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001122}
1123
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001124// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1125// to apply.
1126TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001127 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001128 cricket::AudioSendParameters parameters;
1129 parameters.codecs.push_back(kIsacCodec);
1130 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001131 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001132 parameters.codecs[0].id = 96;
1133 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001134 const int initial_num = call_.GetNumCreatedSendStreams();
solenberg059fb442016-10-26 05:12:24 -07001135 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001136 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001137 // Calling SetSendCodec again with same codec which is already set.
1138 // In this case media channel shouldn't send codec to VoE.
solenberg059fb442016-10-26 05:12:24 -07001139 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001140 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001141}
1142
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001143// Verify that G722 is set with 16000 samples per second to WebRTC.
1144TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001145 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001146 cricket::AudioSendParameters parameters;
1147 parameters.codecs.push_back(kG722CodecSdp);
solenberg059fb442016-10-26 05:12:24 -07001148 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001149 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001150 EXPECT_STREQ("G722", gcodec.plname);
1151 EXPECT_EQ(1, gcodec.channels);
1152 EXPECT_EQ(16000, gcodec.plfreq);
1153}
1154
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001155// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001156TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001157 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001158 cricket::AudioSendParameters parameters;
1159 parameters.codecs.push_back(kOpusCodec);
1160 parameters.codecs[0].bitrate = 0;
1161 parameters.codecs[0].clockrate = 50000;
1162 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001163}
1164
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001165// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001166TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
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(kOpusCodec);
1170 parameters.codecs[0].bitrate = 0;
1171 parameters.codecs[0].channels = 0;
1172 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001173}
1174
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001175// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001176TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001177 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001178 cricket::AudioSendParameters parameters;
1179 parameters.codecs.push_back(kOpusCodec);
1180 parameters.codecs[0].bitrate = 0;
1181 parameters.codecs[0].channels = 0;
1182 parameters.codecs[0].params["stereo"] = "1";
1183 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001184}
1185
1186// Test that if channel is 1 for opus and there's no stereo, we fail.
1187TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001188 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001189 cricket::AudioSendParameters parameters;
1190 parameters.codecs.push_back(kOpusCodec);
1191 parameters.codecs[0].bitrate = 0;
1192 parameters.codecs[0].channels = 1;
1193 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001194}
1195
1196// Test that if channel is 1 for opus and stereo=0, we fail.
1197TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001198 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001199 cricket::AudioSendParameters parameters;
1200 parameters.codecs.push_back(kOpusCodec);
1201 parameters.codecs[0].bitrate = 0;
1202 parameters.codecs[0].channels = 1;
1203 parameters.codecs[0].params["stereo"] = "0";
1204 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001205}
1206
1207// Test that if channel is 1 for opus and stereo=1, we fail.
1208TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001209 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001210 cricket::AudioSendParameters parameters;
1211 parameters.codecs.push_back(kOpusCodec);
1212 parameters.codecs[0].bitrate = 0;
1213 parameters.codecs[0].channels = 1;
1214 parameters.codecs[0].params["stereo"] = "1";
1215 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001216}
1217
1218// Test that with bitrate=0 and no stereo,
1219// channels and bitrate are 1 and 32000.
1220TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001221 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001222 cricket::AudioSendParameters parameters;
1223 parameters.codecs.push_back(kOpusCodec);
1224 parameters.codecs[0].bitrate = 0;
solenberg059fb442016-10-26 05:12:24 -07001225 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001226 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001227}
1228
1229// Test that with bitrate=0 and stereo=0,
1230// channels and bitrate are 1 and 32000.
1231TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001232 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001233 cricket::AudioSendParameters parameters;
1234 parameters.codecs.push_back(kOpusCodec);
1235 parameters.codecs[0].bitrate = 0;
1236 parameters.codecs[0].params["stereo"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001237 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001238 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001239}
1240
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001241// Test that with bitrate=invalid and stereo=0,
1242// channels and bitrate are 1 and 32000.
1243TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001244 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001245 cricket::AudioSendParameters parameters;
1246 parameters.codecs.push_back(kOpusCodec);
1247 parameters.codecs[0].params["stereo"] = "0";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001248 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001249 parameters.codecs[0].bitrate = 5999;
solenberg059fb442016-10-26 05:12:24 -07001250 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001251 CheckSendCodec(kSsrc1, "opus", 1, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001252
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001253 parameters.codecs[0].bitrate = 510001;
solenberg059fb442016-10-26 05:12:24 -07001254 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001255 CheckSendCodec(kSsrc1, "opus", 1, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001256}
1257
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001258// Test that with bitrate=0 and stereo=1,
1259// channels and bitrate are 2 and 64000.
1260TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001261 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001262 cricket::AudioSendParameters parameters;
1263 parameters.codecs.push_back(kOpusCodec);
1264 parameters.codecs[0].bitrate = 0;
1265 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001266 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001267 CheckSendCodec(kSsrc1, "opus", 2, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001268}
1269
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001270// Test that with bitrate=invalid and stereo=1,
1271// channels and bitrate are 2 and 64000.
1272TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001273 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001274 cricket::AudioSendParameters parameters;
1275 parameters.codecs.push_back(kOpusCodec);
1276 parameters.codecs[0].params["stereo"] = "1";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001277 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001278 parameters.codecs[0].bitrate = 5999;
solenberg059fb442016-10-26 05:12:24 -07001279 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001280 CheckSendCodec(kSsrc1, "opus", 2, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001281
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001282 parameters.codecs[0].bitrate = 510001;
solenberg059fb442016-10-26 05:12:24 -07001283 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001284 CheckSendCodec(kSsrc1, "opus", 2, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001285}
1286
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001287// Test that with bitrate=N and stereo unset,
1288// channels and bitrate are 1 and N.
1289TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001290 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001291 cricket::AudioSendParameters parameters;
1292 parameters.codecs.push_back(kOpusCodec);
1293 parameters.codecs[0].bitrate = 96000;
solenberg059fb442016-10-26 05:12:24 -07001294 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001295 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001296 EXPECT_EQ(111, gcodec.pltype);
1297 EXPECT_EQ(96000, gcodec.rate);
1298 EXPECT_STREQ("opus", gcodec.plname);
1299 EXPECT_EQ(1, gcodec.channels);
1300 EXPECT_EQ(48000, gcodec.plfreq);
1301}
1302
1303// Test that with bitrate=N and stereo=0,
1304// channels and bitrate are 1 and N.
1305TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001306 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001307 cricket::AudioSendParameters parameters;
1308 parameters.codecs.push_back(kOpusCodec);
1309 parameters.codecs[0].bitrate = 30000;
1310 parameters.codecs[0].params["stereo"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001311 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001312 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001313}
1314
1315// Test that with bitrate=N and without any parameters,
1316// channels and bitrate are 1 and N.
1317TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001318 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001319 cricket::AudioSendParameters parameters;
1320 parameters.codecs.push_back(kOpusCodec);
1321 parameters.codecs[0].bitrate = 30000;
solenberg059fb442016-10-26 05:12:24 -07001322 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001323 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001324}
1325
1326// Test that with bitrate=N and stereo=1,
1327// channels and bitrate are 2 and N.
1328TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001329 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001330 cricket::AudioSendParameters parameters;
1331 parameters.codecs.push_back(kOpusCodec);
1332 parameters.codecs[0].bitrate = 30000;
1333 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001334 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001335 CheckSendCodec(kSsrc1, "opus", 2, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001336}
1337
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001338// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1339// Also test that the "maxaveragebitrate" can't be set to values outside the
1340// range of 6000 and 510000
1341TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001342 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001343 cricket::AudioSendParameters parameters;
1344 parameters.codecs.push_back(kOpusCodec);
1345 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001346 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001347 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
solenberg059fb442016-10-26 05:12:24 -07001348 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001349 EXPECT_EQ(6000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001350
1351 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001352 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
solenberg059fb442016-10-26 05:12:24 -07001353 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001354 EXPECT_EQ(510000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001355
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001356 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
solenberg059fb442016-10-26 05:12:24 -07001357 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001358 EXPECT_EQ(200000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001359}
1360
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001361// Test that we can enable NACK with opus as caller.
1362TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001363 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001364 cricket::AudioSendParameters parameters;
1365 parameters.codecs.push_back(kOpusCodec);
1366 parameters.codecs[0].AddFeedbackParam(
1367 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1368 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001369 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001370 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001371 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001372}
1373
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001374// Test that we can enable NACK with opus as callee.
1375TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001376 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001377 cricket::AudioSendParameters parameters;
1378 parameters.codecs.push_back(kOpusCodec);
1379 parameters.codecs[0].AddFeedbackParam(
1380 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1381 cricket::kParamValueEmpty));
solenberg8189b022016-06-14 12:13:00 -07001382 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001383 SetSendParameters(parameters);
deadbeefb56069e2016-05-06 04:57:03 -07001384 // NACK should be enabled even with no send stream.
solenberg8189b022016-06-14 12:13:00 -07001385 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001386
1387 EXPECT_TRUE(channel_->AddSendStream(
1388 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg971cab02016-06-14 10:02:41 -07001389 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001390}
1391
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001392// Test that we can enable NACK on receive streams.
1393TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001394 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001395 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001396 cricket::AudioSendParameters parameters;
1397 parameters.codecs.push_back(kOpusCodec);
1398 parameters.codecs[0].AddFeedbackParam(
1399 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1400 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001401 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001402 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001403 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001404 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001405 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001406}
1407
1408// Test that we can disable NACK.
1409TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001410 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001411 cricket::AudioSendParameters parameters;
1412 parameters.codecs.push_back(kOpusCodec);
1413 parameters.codecs[0].AddFeedbackParam(
1414 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1415 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001416 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001417 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001418
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001419 parameters.codecs.clear();
1420 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001421 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001422 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001423}
1424
1425// Test that we can disable NACK on receive streams.
1426TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001427 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001428 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001429 cricket::AudioSendParameters parameters;
1430 parameters.codecs.push_back(kOpusCodec);
1431 parameters.codecs[0].AddFeedbackParam(
1432 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1433 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001434 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001435 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001436 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001437
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001438 parameters.codecs.clear();
1439 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001440 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001441 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001442 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001443}
1444
1445// Test that NACK is enabled on a new receive stream.
1446TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001447 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001448 cricket::AudioSendParameters parameters;
1449 parameters.codecs.push_back(kIsacCodec);
1450 parameters.codecs.push_back(kCn16000Codec);
1451 parameters.codecs[0].AddFeedbackParam(
1452 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1453 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001454 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001455 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001456
solenberg8189b022016-06-14 12:13:00 -07001457 EXPECT_TRUE(AddRecvStream(kSsrc2));
1458 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
1459 EXPECT_TRUE(AddRecvStream(kSsrc3));
1460 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc3).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001461}
1462
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001463// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001464TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001465 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001466 cricket::AudioSendParameters parameters;
1467 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001468 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001469 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001470}
1471
1472// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001473TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001474 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001475 cricket::AudioSendParameters parameters;
1476 parameters.codecs.push_back(kOpusCodec);
1477 parameters.codecs[0].bitrate = 0;
1478 parameters.codecs[0].params["useinbandfec"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001479 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001480 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001481}
1482
1483// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001484TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001485 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001486 cricket::AudioSendParameters parameters;
1487 parameters.codecs.push_back(kOpusCodec);
1488 parameters.codecs[0].bitrate = 0;
1489 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001490 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001491 EXPECT_TRUE(GetCodecFec(kSsrc1));
1492 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001493}
1494
1495// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001496TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001497 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001498 cricket::AudioSendParameters parameters;
1499 parameters.codecs.push_back(kOpusCodec);
1500 parameters.codecs[0].bitrate = 0;
1501 parameters.codecs[0].params["stereo"] = "1";
1502 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001503 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001504 EXPECT_TRUE(GetCodecFec(kSsrc1));
1505 CheckSendCodec(kSsrc1, "opus", 2, 64000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001506}
1507
1508// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001509TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001510 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001511 cricket::AudioSendParameters parameters;
1512 parameters.codecs.push_back(kIsacCodec);
solenberg059fb442016-10-26 05:12:24 -07001513 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001514 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001515}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001516
1517// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1518TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
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(kIsacCodec);
1522 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001523 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001524 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001525}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001526
1527// Test that Opus FEC status can be changed.
1528TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001529 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001530 cricket::AudioSendParameters parameters;
1531 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001532 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001533 EXPECT_FALSE(GetCodecFec(kSsrc1));
1534
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001535 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001536 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001537 EXPECT_TRUE(GetCodecFec(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001538}
1539
stefanba4c0e42016-02-04 04:12:24 -08001540TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001541 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001542 cricket::AudioSendParameters send_parameters;
1543 send_parameters.codecs.push_back(kOpusCodec);
1544 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
solenberg059fb442016-10-26 05:12:24 -07001545 SetSendParameters(send_parameters);
stefanba4c0e42016-02-04 04:12:24 -08001546
1547 cricket::AudioRecvParameters recv_parameters;
1548 recv_parameters.codecs.push_back(kIsacCodec);
1549 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
solenberg8189b022016-06-14 12:13:00 -07001550 EXPECT_TRUE(AddRecvStream(kSsrc1));
stefanba4c0e42016-02-04 04:12:24 -08001551 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1552 EXPECT_FALSE(
1553 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1554
ossudedfd282016-06-14 07:12:39 -07001555 send_parameters.codecs = engine_->send_codecs();
solenberg059fb442016-10-26 05:12:24 -07001556 SetSendParameters(send_parameters);
stefanba4c0e42016-02-04 04:12:24 -08001557 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1558 EXPECT_TRUE(
1559 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1560}
1561
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001562// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1563TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001564 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001565 cricket::AudioSendParameters parameters;
1566 parameters.codecs.push_back(kOpusCodec);
1567 parameters.codecs[0].bitrate = 0;
1568 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
solenberg059fb442016-10-26 05:12:24 -07001569 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001570 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
1571 EXPECT_EQ(12000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001572
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001573 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001574 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001575 EXPECT_EQ(24000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001576}
1577
1578// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1579TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001580 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001581 cricket::AudioSendParameters parameters;
1582 parameters.codecs.push_back(kOpusCodec);
1583 parameters.codecs[0].bitrate = 0;
1584 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
solenberg059fb442016-10-26 05:12:24 -07001585 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001586 EXPECT_EQ(8001, GetOpusMaxPlaybackRate(kSsrc1));
1587 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001588
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001589 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001590 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001591 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001592}
1593
1594// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1595TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001596 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001597 cricket::AudioSendParameters parameters;
1598 parameters.codecs.push_back(kOpusCodec);
1599 parameters.codecs[0].bitrate = 0;
1600 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
solenberg059fb442016-10-26 05:12:24 -07001601 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001602 EXPECT_EQ(12001, GetOpusMaxPlaybackRate(kSsrc1));
1603 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001604
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001605 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001606 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001607 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001608}
1609
1610// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1611TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001612 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001613 cricket::AudioSendParameters parameters;
1614 parameters.codecs.push_back(kOpusCodec);
1615 parameters.codecs[0].bitrate = 0;
1616 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
solenberg059fb442016-10-26 05:12:24 -07001617 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001618 EXPECT_EQ(16001, GetOpusMaxPlaybackRate(kSsrc1));
1619 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001620
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001621 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001622 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001623 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001624}
1625
1626// Test 24000 < maxplaybackrate triggers Opus full band mode.
1627TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001628 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001629 cricket::AudioSendParameters parameters;
1630 parameters.codecs.push_back(kOpusCodec);
1631 parameters.codecs[0].bitrate = 0;
1632 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
solenberg059fb442016-10-26 05:12:24 -07001633 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001634 EXPECT_EQ(24001, GetOpusMaxPlaybackRate(kSsrc1));
1635 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001636
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001637 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001638 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001639 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001640}
1641
1642// Test Opus that without maxplaybackrate, default playback rate is used.
1643TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001644 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001645 cricket::AudioSendParameters parameters;
1646 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001647 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001648 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001649}
1650
1651// Test the with non-Opus, maxplaybackrate has no effect.
1652TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001653 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001654 cricket::AudioSendParameters parameters;
1655 parameters.codecs.push_back(kIsacCodec);
1656 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
solenberg059fb442016-10-26 05:12:24 -07001657 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001658 EXPECT_EQ(0, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001659}
1660
1661// Test maxplaybackrate can be set on two streams.
1662TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001663 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001664 cricket::AudioSendParameters parameters;
1665 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001666 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001667 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001668
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001669 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
solenberg059fb442016-10-26 05:12:24 -07001670 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001671 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001672
1673 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
minyue7a973442016-10-20 03:27:12 -07001674 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc2));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001675}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001676
Minyue Li7100dcd2015-03-27 05:05:59 +01001677// Test that with usedtx=0, Opus DTX is off.
1678TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001679 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001680 cricket::AudioSendParameters parameters;
1681 parameters.codecs.push_back(kOpusCodec);
1682 parameters.codecs[0].params["usedtx"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001683 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001684 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001685}
1686
1687// Test that with usedtx=1, Opus DTX is on.
1688TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001689 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001690 cricket::AudioSendParameters parameters;
1691 parameters.codecs.push_back(kOpusCodec);
1692 parameters.codecs[0].params["usedtx"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001693 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001694 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001695}
1696
1697// Test that usedtx=1 works with stereo Opus.
1698TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001699 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001700 cricket::AudioSendParameters parameters;
1701 parameters.codecs.push_back(kOpusCodec);
1702 parameters.codecs[0].params["usedtx"] = "1";
1703 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001704 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001705 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001706}
1707
1708// Test that usedtx=1 does not work with non Opus.
1709TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001710 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001711 cricket::AudioSendParameters parameters;
1712 parameters.codecs.push_back(kIsacCodec);
1713 parameters.codecs[0].params["usedtx"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001714 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001715 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001716}
1717
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001718// Test that we can switch back and forth between Opus and ISAC with CN.
1719TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001720 EXPECT_TRUE(SetupSendStream());
minyue7a973442016-10-20 03:27:12 -07001721
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001722 cricket::AudioSendParameters opus_parameters;
1723 opus_parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001724 SetSendParameters(opus_parameters);
minyue7a973442016-10-20 03:27:12 -07001725 {
1726 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1727 EXPECT_EQ(111, gcodec.pltype);
1728 EXPECT_STREQ("opus", gcodec.plname);
1729 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001730
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001731 cricket::AudioSendParameters isac_parameters;
1732 isac_parameters.codecs.push_back(kIsacCodec);
1733 isac_parameters.codecs.push_back(kCn16000Codec);
1734 isac_parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001735 SetSendParameters(isac_parameters);
minyue7a973442016-10-20 03:27:12 -07001736 {
1737 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1738 EXPECT_EQ(103, gcodec.pltype);
1739 EXPECT_STREQ("ISAC", gcodec.plname);
1740 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001741
solenberg059fb442016-10-26 05:12:24 -07001742 SetSendParameters(opus_parameters);
minyue7a973442016-10-20 03:27:12 -07001743 {
1744 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1745 EXPECT_EQ(111, gcodec.pltype);
1746 EXPECT_STREQ("opus", gcodec.plname);
1747 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001748}
1749
1750// Test that we handle various ways of specifying bitrate.
1751TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001752 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001753 cricket::AudioSendParameters parameters;
1754 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
solenberg059fb442016-10-26 05:12:24 -07001755 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001756 {
1757 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1758 EXPECT_EQ(103, gcodec.pltype);
1759 EXPECT_STREQ("ISAC", gcodec.plname);
1760 EXPECT_EQ(32000, gcodec.rate);
1761 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001762
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001763 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001764 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001765 {
1766 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1767 EXPECT_EQ(103, gcodec.pltype);
1768 EXPECT_STREQ("ISAC", gcodec.plname);
1769 EXPECT_EQ(-1, gcodec.rate);
1770 }
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001771 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
solenberg059fb442016-10-26 05:12:24 -07001772 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001773 {
1774 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1775 EXPECT_EQ(103, gcodec.pltype);
1776 EXPECT_STREQ("ISAC", gcodec.plname);
1777 EXPECT_EQ(28000, gcodec.rate);
1778 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001779
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001780 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
solenberg059fb442016-10-26 05:12:24 -07001781 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001782 {
1783 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1784 EXPECT_EQ(0, gcodec.pltype);
1785 EXPECT_STREQ("PCMU", gcodec.plname);
1786 EXPECT_EQ(64000, gcodec.rate);
1787 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001788
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001789 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001790 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001791 {
1792 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1793 EXPECT_EQ(0, gcodec.pltype);
1794 EXPECT_STREQ("PCMU", gcodec.plname);
1795 EXPECT_EQ(64000, gcodec.rate);
1796 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001797
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001798 parameters.codecs[0] = kOpusCodec;
1799 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001800 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001801 {
1802 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1803 EXPECT_EQ(111, gcodec.pltype);
1804 EXPECT_STREQ("opus", gcodec.plname);
1805 EXPECT_EQ(32000, gcodec.rate);
1806 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001807}
1808
Brave Yao5225dd82015-03-26 07:39:19 +08001809// Test that we could set packet size specified in kCodecParamPTime.
1810TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001811 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001812 cricket::AudioSendParameters parameters;
1813 parameters.codecs.push_back(kOpusCodec);
1814 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
solenberg059fb442016-10-26 05:12:24 -07001815 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001816 EXPECT_EQ(1920, GetCodecPacSize(kSsrc1)); // Opus gets 40ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001817
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001818 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
solenberg059fb442016-10-26 05:12:24 -07001819 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001820 EXPECT_EQ(480, GetCodecPacSize(kSsrc1)); // Opus gets 10ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001821
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001822 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
solenberg059fb442016-10-26 05:12:24 -07001823 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001824 EXPECT_EQ(2880, GetCodecPacSize(kSsrc1)); // Opus gets 60ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001825
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001826 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1827 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
solenberg059fb442016-10-26 05:12:24 -07001828 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001829 EXPECT_EQ(480, GetCodecPacSize(
1830 kSsrc1)); // Isac gets 30ms as the next smallest value.
Brave Yao5225dd82015-03-26 07:39:19 +08001831
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001832 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1833 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
solenberg059fb442016-10-26 05:12:24 -07001834 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001835 EXPECT_EQ(640, GetCodecPacSize(
1836 kSsrc1)); // G722 gets 40ms @16kHz as defined in VoE.
Brave Yao5225dd82015-03-26 07:39:19 +08001837}
1838
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001839// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001840TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001841 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001842 cricket::AudioSendParameters parameters;
1843 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001844}
1845
1846// Test that we can set send codecs even with telephone-event codec as the first
1847// one on the list.
1848TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001849 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001850 cricket::AudioSendParameters parameters;
1851 parameters.codecs.push_back(kTelephoneEventCodec);
1852 parameters.codecs.push_back(kIsacCodec);
1853 parameters.codecs.push_back(kPcmuCodec);
1854 parameters.codecs[0].id = 98; // DTMF
1855 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001856 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001857 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001858 EXPECT_EQ(96, gcodec.pltype);
1859 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001860 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001861}
1862
solenberg31642aa2016-03-14 08:00:37 -07001863// Test that payload type range is limited for telephone-event codec.
1864TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001865 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001866 cricket::AudioSendParameters parameters;
1867 parameters.codecs.push_back(kTelephoneEventCodec);
1868 parameters.codecs.push_back(kIsacCodec);
1869 parameters.codecs[0].id = 0; // DTMF
1870 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001871 SetSendParameters(parameters);
solenberg31642aa2016-03-14 08:00:37 -07001872 EXPECT_TRUE(channel_->CanInsertDtmf());
1873 parameters.codecs[0].id = 128; // DTMF
1874 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1875 EXPECT_FALSE(channel_->CanInsertDtmf());
1876 parameters.codecs[0].id = 127;
solenberg059fb442016-10-26 05:12:24 -07001877 SetSendParameters(parameters);
solenberg31642aa2016-03-14 08:00:37 -07001878 EXPECT_TRUE(channel_->CanInsertDtmf());
1879 parameters.codecs[0].id = -1; // DTMF
1880 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1881 EXPECT_FALSE(channel_->CanInsertDtmf());
1882}
1883
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001884// Test that we can set send codecs even with CN codec as the first
1885// one on the list.
1886TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001887 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001888 cricket::AudioSendParameters parameters;
1889 parameters.codecs.push_back(kCn16000Codec);
1890 parameters.codecs.push_back(kIsacCodec);
1891 parameters.codecs.push_back(kPcmuCodec);
1892 parameters.codecs[0].id = 98; // wideband CN
1893 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001894 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001895 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1896 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1897 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1898 EXPECT_EQ(98, send_codec_spec.cng_payload_type);
1899 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001900}
1901
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001902// Test that we set VAD and DTMF types correctly as caller.
1903TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001904 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001905 cricket::AudioSendParameters parameters;
1906 parameters.codecs.push_back(kIsacCodec);
1907 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001908 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001909 parameters.codecs.push_back(kCn16000Codec);
1910 parameters.codecs.push_back(kCn8000Codec);
1911 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001912 parameters.codecs[0].id = 96;
1913 parameters.codecs[2].id = 97; // wideband CN
1914 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07001915 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001916 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1917 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1918 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1919 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1920 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1921 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1922 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001923 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001924}
1925
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001926// Test that we set VAD and DTMF types correctly as callee.
1927TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001928 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001929 cricket::AudioSendParameters parameters;
1930 parameters.codecs.push_back(kIsacCodec);
1931 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001932 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001933 parameters.codecs.push_back(kCn16000Codec);
1934 parameters.codecs.push_back(kCn8000Codec);
1935 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001936 parameters.codecs[0].id = 96;
1937 parameters.codecs[2].id = 97; // wideband CN
1938 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07001939 SetSendParameters(parameters);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001940 EXPECT_TRUE(channel_->AddSendStream(
1941 cricket::StreamParams::CreateLegacy(kSsrc1)));
1942
minyue7a973442016-10-20 03:27:12 -07001943 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1944 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1945 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1946 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1947 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1948 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1949 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001950 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001951}
1952
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001953// Test that we only apply VAD if we have a CN codec that matches the
1954// send codec clockrate.
1955TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07001956 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001957 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001958 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001959 parameters.codecs.push_back(kIsacCodec);
1960 parameters.codecs.push_back(kCn16000Codec);
1961 parameters.codecs[1].id = 97;
solenberg059fb442016-10-26 05:12:24 -07001962 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001963 {
1964 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1965 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1966 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1967 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1968 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1969 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
1970 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001971 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001972 parameters.codecs[0] = kPcmuCodec;
solenberg059fb442016-10-26 05:12:24 -07001973 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001974 {
1975 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1976 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
1977 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1978 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001979 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001980 parameters.codecs[1] = kCn8000Codec;
solenberg059fb442016-10-26 05:12:24 -07001981 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001982 {
1983 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1984 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
1985 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1986 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1987 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
1988 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
1989 }
Brave Yao5225dd82015-03-26 07:39:19 +08001990 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001991 parameters.codecs[0] = kIsacCodec;
solenberg059fb442016-10-26 05:12:24 -07001992 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001993 {
1994 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1995 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1996 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1997 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001998}
1999
2000// Test that we perform case-insensitive matching of codec names.
2001TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002002 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002003 cricket::AudioSendParameters parameters;
2004 parameters.codecs.push_back(kIsacCodec);
2005 parameters.codecs.push_back(kPcmuCodec);
2006 parameters.codecs.push_back(kCn16000Codec);
2007 parameters.codecs.push_back(kCn8000Codec);
2008 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002009 parameters.codecs[0].name = "iSaC";
2010 parameters.codecs[0].id = 96;
2011 parameters.codecs[2].id = 97; // wideband CN
2012 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07002013 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002014 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2015 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2016 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2017 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2018 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2019 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2020 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002021 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002022}
2023
stefanba4c0e42016-02-04 04:12:24 -08002024class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2025 public:
2026 WebRtcVoiceEngineWithSendSideBweTest()
2027 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2028};
2029
2030TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2031 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002032 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002033 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07002034 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
2035 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
2036 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08002037 extension.id);
2038 return;
2039 }
2040 }
2041 FAIL() << "Transport sequence number extension not in header-extension list.";
2042}
2043
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002044// Test support for audio level header extension.
2045TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002046 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002047}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002048TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002049 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002050}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002051
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002052// Test support for absolute send time header extension.
2053TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002054 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002055}
2056TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002057 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002058}
2059
solenberg1ac56142015-10-13 03:58:19 -07002060// Test that we can create a channel and start sending on it.
2061TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002062 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002063 SetSendParameters(send_parameters_);
2064 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002065 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002066 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002067 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2068}
2069
2070// Test that a channel will send if and only if it has a source and is enabled
2071// for sending.
2072TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002073 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002074 SetSendParameters(send_parameters_);
2075 SetAudioSend(kSsrc1, true, nullptr);
2076 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002077 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002078 SetAudioSend(kSsrc1, true, &fake_source_);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002079 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002080 SetAudioSend(kSsrc1, true, nullptr);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002081 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002082}
2083
solenberg94218532016-06-16 10:53:22 -07002084// Test that a channel is muted/unmuted.
2085TEST_F(WebRtcVoiceEngineTestFake, SendStateMuteUnmute) {
2086 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002087 SetSendParameters(send_parameters_);
solenberg94218532016-06-16 10:53:22 -07002088 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
solenberg059fb442016-10-26 05:12:24 -07002089 SetAudioSend(kSsrc1, true, nullptr);
solenberg94218532016-06-16 10:53:22 -07002090 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
solenberg059fb442016-10-26 05:12:24 -07002091 SetAudioSend(kSsrc1, false, nullptr);
solenberg94218532016-06-16 10:53:22 -07002092 EXPECT_TRUE(GetSendStream(kSsrc1).muted());
2093}
2094
solenberg6d6e7c52016-04-13 09:07:30 -07002095// Test that SetSendParameters() does not alter a stream's send state.
2096TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2097 EXPECT_TRUE(SetupSendStream());
2098 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2099
2100 // Turn on sending.
solenberg059fb442016-10-26 05:12:24 -07002101 SetSend(true);
solenberg6d6e7c52016-04-13 09:07:30 -07002102 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2103
2104 // Changing RTP header extensions will recreate the AudioSendStream.
2105 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002106 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg059fb442016-10-26 05:12:24 -07002107 SetSendParameters(send_parameters_);
solenberg6d6e7c52016-04-13 09:07:30 -07002108 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2109
2110 // Turn off sending.
solenberg059fb442016-10-26 05:12:24 -07002111 SetSend(false);
solenberg6d6e7c52016-04-13 09:07:30 -07002112 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2113
2114 // Changing RTP header extensions will recreate the AudioSendStream.
2115 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -07002116 SetSendParameters(send_parameters_);
solenberg6d6e7c52016-04-13 09:07:30 -07002117 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2118}
2119
solenberg1ac56142015-10-13 03:58:19 -07002120// Test that we can create a channel and start playing out on it.
2121TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002122 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002123 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
aleloi84ef6152016-08-04 05:28:21 -07002124 channel_->SetPlayout(true);
2125 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
2126 channel_->SetPlayout(false);
2127 EXPECT_FALSE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002128}
2129
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002130// Test that we can add and remove send streams.
2131TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2132 SetupForMultiSendStream();
2133
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002134 // Set the global state for sending.
solenberg059fb442016-10-26 05:12:24 -07002135 SetSend(true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002136
solenbergc96df772015-10-21 13:01:53 -07002137 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002138 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002139 cricket::StreamParams::CreateLegacy(ssrc)));
solenberg059fb442016-10-26 05:12:24 -07002140 SetAudioSend(ssrc, true, &fake_source_);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002141 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002142 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002143 }
tfarina5237aaf2015-11-10 23:44:30 -08002144 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002145
solenbergc96df772015-10-21 13:01:53 -07002146 // Delete the send streams.
2147 for (uint32_t ssrc : kSsrcs4) {
2148 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002149 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002150 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002151 }
solenbergc96df772015-10-21 13:01:53 -07002152 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002153}
2154
2155// Test SetSendCodecs correctly configure the codecs in all send streams.
2156TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2157 SetupForMultiSendStream();
2158
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002159 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002160 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002161 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002162 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002163 }
2164
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002165 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002166 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002167 parameters.codecs.push_back(kIsacCodec);
2168 parameters.codecs.push_back(kCn16000Codec);
2169 parameters.codecs[1].id = 97;
solenberg059fb442016-10-26 05:12:24 -07002170 SetSendParameters(parameters);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002171
2172 // Verify ISAC and VAD are corrected configured on all send channels.
solenbergc96df772015-10-21 13:01:53 -07002173 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002174 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2175 const auto& send_codec_spec =
2176 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2177 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2178 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2179 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2180 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2181 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002182 }
2183
minyue7a973442016-10-20 03:27:12 -07002184 // Change to PCMU(8K) and CN(16K).
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002185 parameters.codecs[0] = kPcmuCodec;
solenberg059fb442016-10-26 05:12:24 -07002186 SetSendParameters(parameters);
solenbergc96df772015-10-21 13:01:53 -07002187 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002188 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2189 const auto& send_codec_spec =
2190 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2191 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2192 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2193 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2194 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002195 }
2196}
2197
2198// Test we can SetSend on all send streams correctly.
2199TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2200 SetupForMultiSendStream();
2201
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002202 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002203 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002204 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002205 cricket::StreamParams::CreateLegacy(ssrc)));
solenberg059fb442016-10-26 05:12:24 -07002206 SetAudioSend(ssrc, true, &fake_source_);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002207 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002208 }
2209
2210 // Set the global state for starting sending.
solenberg059fb442016-10-26 05:12:24 -07002211 SetSend(true);
solenbergc96df772015-10-21 13:01:53 -07002212 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002213 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002214 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002215 }
2216
2217 // Set the global state for stopping sending.
solenberg059fb442016-10-26 05:12:24 -07002218 SetSend(false);
solenbergc96df772015-10-21 13:01:53 -07002219 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002220 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002221 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002222 }
2223}
2224
2225// Test we can set the correct statistics on all send streams.
2226TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2227 SetupForMultiSendStream();
2228
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002229 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002230 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002231 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002232 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002233 }
solenberg85a04962015-10-27 03:35:21 -07002234
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002235 // Create a receive stream to check that none of the send streams end up in
2236 // the receive stream stats.
solenberg8189b022016-06-14 12:13:00 -07002237 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg971cab02016-06-14 10:02:41 -07002238
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002239 // We need send codec to be set to get all stats.
solenberg059fb442016-10-26 05:12:24 -07002240 SetSendParameters(send_parameters_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002241 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002242 SetAudioSendStreamStats();
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002243
solenberg85a04962015-10-27 03:35:21 -07002244 // Check stats for the added streams.
2245 {
2246 cricket::VoiceMediaInfo info;
2247 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002248
solenberg85a04962015-10-27 03:35:21 -07002249 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002250 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002251 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002252 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002253 }
2254
2255 // We have added one receive stream. We should see empty stats.
2256 EXPECT_EQ(info.receivers.size(), 1u);
2257 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002258 }
solenberg1ac56142015-10-13 03:58:19 -07002259
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002260 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002261 {
2262 cricket::VoiceMediaInfo info;
2263 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2264 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002265 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002266 EXPECT_EQ(0u, info.receivers.size());
2267 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002268
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002269 // Deliver a new packet - a default receive stream should be created and we
2270 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002271 {
2272 cricket::VoiceMediaInfo info;
2273 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2274 SetAudioReceiveStreamStats();
2275 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002276 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002277 EXPECT_EQ(1u, info.receivers.size());
2278 VerifyVoiceReceiverInfo(info.receivers[0]);
2279 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002280}
2281
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002282// Test that we can add and remove receive streams, and do proper send/playout.
2283// We can receive on multiple streams while sending one stream.
2284TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002285 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002286
solenberg1ac56142015-10-13 03:58:19 -07002287 // Start playout without a receive stream.
solenberg059fb442016-10-26 05:12:24 -07002288 SetSendParameters(send_parameters_);
aleloi84ef6152016-08-04 05:28:21 -07002289 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002290
solenberg1ac56142015-10-13 03:58:19 -07002291 // Adding another stream should enable playout on the new stream only.
solenberg8189b022016-06-14 12:13:00 -07002292 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg059fb442016-10-26 05:12:24 -07002293 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002294 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002295
solenberg1ac56142015-10-13 03:58:19 -07002296 // Make sure only the new stream is played out.
aleloi84ef6152016-08-04 05:28:21 -07002297 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002298
2299 // Adding yet another stream should have stream 2 and 3 enabled for playout.
solenberg8189b022016-06-14 12:13:00 -07002300 EXPECT_TRUE(AddRecvStream(kSsrc3));
aleloi84ef6152016-08-04 05:28:21 -07002301 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2302 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002303
2304 // Stop sending.
solenberg059fb442016-10-26 05:12:24 -07002305 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002306 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002307
2308 // Stop playout.
aleloi84ef6152016-08-04 05:28:21 -07002309 channel_->SetPlayout(false);
2310 EXPECT_FALSE(GetRecvStream(kSsrc2).started());
2311 EXPECT_FALSE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002312
aleloi84ef6152016-08-04 05:28:21 -07002313 // Restart playout and make sure recv streams are played out.
2314 channel_->SetPlayout(true);
2315 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2316 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002317
aleloi84ef6152016-08-04 05:28:21 -07002318 // Now remove the recv streams.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002319 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2320 EXPECT_TRUE(channel_->RemoveRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002321}
2322
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002323// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002324// and start sending on it.
2325TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002326 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002327 cricket::AudioOptions options_adjust_agc;
2328 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002329 webrtc::AgcConfig agc_config;
2330 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2331 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002332 send_parameters_.options = options_adjust_agc;
solenberg059fb442016-10-26 05:12:24 -07002333 SetSendParameters(send_parameters_);
2334 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002335 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002336 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2337 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenberg059fb442016-10-26 05:12:24 -07002338 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002339 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002340 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002341}
2342
wu@webrtc.org97077a32013-10-25 21:18:33 +00002343TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002344 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002345 EXPECT_CALL(adm_,
2346 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002347 webrtc::AgcConfig agc_config;
2348 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2349 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002350 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2351 send_parameters_.options.tx_agc_digital_compression_gain =
2352 rtc::Optional<uint16_t>(9);
2353 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2354 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002355 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002356 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2357 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2358 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2359 EXPECT_TRUE(agc_config.limiterEnable);
2360
2361 // Check interaction with adjust_agc_delta. Both should be respected, for
2362 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002363 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
solenberg059fb442016-10-26 05:12:24 -07002364 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002365 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2366 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2367}
2368
wu@webrtc.org97077a32013-10-25 21:18:33 +00002369TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002370 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002371 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2372 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002373 send_parameters_.options.recording_sample_rate =
2374 rtc::Optional<uint32_t>(48000);
2375 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
solenberg059fb442016-10-26 05:12:24 -07002376 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002377}
2378
minyue6b825df2016-10-31 04:08:32 -07002379TEST_F(WebRtcVoiceEngineTestFake, SetAudioNetworkAdaptorViaOptions) {
2380 EXPECT_TRUE(SetupSendStream());
2381 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2382 send_parameters_.options.audio_network_adaptor_config =
2383 rtc::Optional<std::string>("1234");
2384 SetSendParameters(send_parameters_);
2385 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2386 GetAudioNetworkAdaptorConfig(kSsrc1));
2387}
2388
2389TEST_F(WebRtcVoiceEngineTestFake, AudioSendResetAudioNetworkAdaptor) {
2390 EXPECT_TRUE(SetupSendStream());
2391 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2392 send_parameters_.options.audio_network_adaptor_config =
2393 rtc::Optional<std::string>("1234");
2394 SetSendParameters(send_parameters_);
2395 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2396 GetAudioNetworkAdaptorConfig(kSsrc1));
2397 const int initial_num = call_.GetNumCreatedSendStreams();
2398 cricket::AudioOptions options;
2399 options.audio_network_adaptor = rtc::Optional<bool>(false);
2400 SetAudioSend(kSsrc1, true, nullptr, &options);
2401 // AudioSendStream expected to be recreated.
2402 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
2403 EXPECT_EQ(rtc::Optional<std::string>(), GetAudioNetworkAdaptorConfig(kSsrc1));
2404}
2405
2406TEST_F(WebRtcVoiceEngineTestFake, AudioNetworkAdaptorNotGetOverridden) {
2407 EXPECT_TRUE(SetupSendStream());
2408 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2409 send_parameters_.options.audio_network_adaptor_config =
2410 rtc::Optional<std::string>("1234");
2411 SetSendParameters(send_parameters_);
2412 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2413 GetAudioNetworkAdaptorConfig(kSsrc1));
2414 const int initial_num = call_.GetNumCreatedSendStreams();
2415 cricket::AudioOptions options;
2416 options.audio_network_adaptor = rtc::Optional<bool>();
2417 // Unvalued |options.audio_network_adaptor|.should not reset audio network
2418 // adaptor.
2419 SetAudioSend(kSsrc1, true, nullptr, &options);
2420 // AudioSendStream not expected to be recreated.
2421 EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
2422 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2423 GetAudioNetworkAdaptorConfig(kSsrc1));
2424}
2425
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002426// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002427// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002428TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002429 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002430 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002431}
2432
2433TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2434 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002435 EXPECT_TRUE(SetupSendStream());
solenbergff976312016-03-30 23:28:51 -07002436 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002437 // stream has to use a different SSRC.
solenberg8189b022016-06-14 12:13:00 -07002438 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg059fb442016-10-26 05:12:24 -07002439 SetSendParameters(send_parameters_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002440 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002441 SetAudioSendStreamStats();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002442
solenberg85a04962015-10-27 03:35:21 -07002443 // Check stats for the added streams.
2444 {
2445 cricket::VoiceMediaInfo info;
2446 EXPECT_EQ(true, channel_->GetStats(&info));
2447
2448 // We have added one send stream. We should see the stats we've set.
2449 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002450 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002451 // We have added one receive stream. We should see empty stats.
2452 EXPECT_EQ(info.receivers.size(), 1u);
2453 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2454 }
solenberg1ac56142015-10-13 03:58:19 -07002455
solenberg566ef242015-11-06 15:34:49 -08002456 // Start sending - this affects some reported stats.
2457 {
2458 cricket::VoiceMediaInfo info;
solenberg059fb442016-10-26 05:12:24 -07002459 SetSend(true);
solenberg566ef242015-11-06 15:34:49 -08002460 EXPECT_EQ(true, channel_->GetStats(&info));
2461 VerifyVoiceSenderInfo(info.senders[0], true);
2462 }
2463
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002464 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002465 {
2466 cricket::VoiceMediaInfo info;
2467 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2468 EXPECT_EQ(true, channel_->GetStats(&info));
2469 EXPECT_EQ(1u, info.senders.size());
2470 EXPECT_EQ(0u, info.receivers.size());
2471 }
solenberg1ac56142015-10-13 03:58:19 -07002472
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002473 // Deliver a new packet - a default receive stream should be created and we
2474 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002475 {
2476 cricket::VoiceMediaInfo info;
2477 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2478 SetAudioReceiveStreamStats();
2479 EXPECT_EQ(true, channel_->GetStats(&info));
2480 EXPECT_EQ(1u, info.senders.size());
2481 EXPECT_EQ(1u, info.receivers.size());
2482 VerifyVoiceReceiverInfo(info.receivers[0]);
2483 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002484}
2485
2486// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002487// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002488TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002489 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002490 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg8189b022016-06-14 12:13:00 -07002491 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -08002492 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002493}
2494
2495// Test that the local SSRC is the same on sending and receiving channels if the
2496// receive channel is created before the send channel.
2497TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002498 EXPECT_TRUE(SetupChannel());
solenberg4a0f7b52016-06-16 13:07:33 -07002499 EXPECT_TRUE(AddRecvStream(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002500 EXPECT_TRUE(channel_->AddSendStream(
solenberg4a0f7b52016-06-16 13:07:33 -07002501 cricket::StreamParams::CreateLegacy(kSsrc1)));
2502 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
2503 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002504}
2505
2506// Test that we can properly receive packets.
2507TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002508 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002509 EXPECT_TRUE(AddRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002510 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002511
2512 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2513 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002514}
2515
2516// Test that we can properly receive packets on multiple streams.
2517TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002518 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002519 const uint32_t ssrc1 = 1;
2520 const uint32_t ssrc2 = 2;
2521 const uint32_t ssrc3 = 3;
solenberg8189b022016-06-14 12:13:00 -07002522 EXPECT_TRUE(AddRecvStream(ssrc1));
2523 EXPECT_TRUE(AddRecvStream(ssrc2));
2524 EXPECT_TRUE(AddRecvStream(ssrc3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002525 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002526 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002527 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002528 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002529 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002530 }
mflodman3d7db262016-04-29 00:57:13 -07002531
2532 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2533 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2534 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2535
2536 EXPECT_EQ(s1.received_packets(), 0);
2537 EXPECT_EQ(s2.received_packets(), 0);
2538 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002539
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002540 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002541 EXPECT_EQ(s1.received_packets(), 0);
2542 EXPECT_EQ(s2.received_packets(), 0);
2543 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002544
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002545 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002546 EXPECT_EQ(s1.received_packets(), 1);
2547 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2548 EXPECT_EQ(s2.received_packets(), 0);
2549 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002550
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002551 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002552 EXPECT_EQ(s1.received_packets(), 1);
2553 EXPECT_EQ(s2.received_packets(), 1);
2554 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2555 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002556
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002557 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002558 EXPECT_EQ(s1.received_packets(), 1);
2559 EXPECT_EQ(s2.received_packets(), 1);
2560 EXPECT_EQ(s3.received_packets(), 1);
2561 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002562
mflodman3d7db262016-04-29 00:57:13 -07002563 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2564 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2565 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002566}
2567
solenberg7e63ef02015-11-20 00:19:43 -08002568// Test that receiving on an unsignalled stream works (default channel will be
2569// created).
2570TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002571 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002572 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2573
solenberg7e63ef02015-11-20 00:19:43 -08002574 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002575
2576 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2577 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2578 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002579}
2580
2581// Test that receiving on an unsignalled stream works (default channel will be
2582// created), and that packets will be forwarded to the default channel
2583// regardless of their SSRCs.
2584TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002585 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002586 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002587 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2588
mflodman3d7db262016-04-29 00:57:13 -07002589 // Note that ssrc = 0 is not supported.
2590 uint32_t ssrc = 1;
2591 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002592 rtc::SetBE32(&packet[8], ssrc);
2593 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002594
2595 // Verify we only have one default stream.
2596 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2597 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2598 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002599 }
mflodman3d7db262016-04-29 00:57:13 -07002600
2601 // Sending the same ssrc again should not create a new stream.
2602 --ssrc;
2603 DeliverPacket(packet, sizeof(packet));
2604 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2605 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2606 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002607}
2608
2609// Test that a default channel is created even after a signalled stream has been
2610// added, and that this stream will get any packets for unknown SSRCs.
2611TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002612 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002613 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002614 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2615
2616 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002617 const uint32_t signaled_ssrc = 1;
2618 rtc::SetBE32(&packet[8], signaled_ssrc);
solenberg8189b022016-06-14 12:13:00 -07002619 EXPECT_TRUE(AddRecvStream(signaled_ssrc));
solenberg7e63ef02015-11-20 00:19:43 -08002620 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002621 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2622 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002623
2624 // Note that the first unknown SSRC cannot be 0, because we only support
2625 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002626 const uint32_t unsignaled_ssrc = 7011;
2627 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002628 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002629 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2630 packet, sizeof(packet)));
2631 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2632
2633 DeliverPacket(packet, sizeof(packet));
2634 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2635
2636 rtc::SetBE32(&packet[8], signaled_ssrc);
2637 DeliverPacket(packet, sizeof(packet));
2638 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2639 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002640}
2641
solenberg0a617e22015-10-20 15:49:38 -07002642// Test that we properly handle failures to add a receive stream.
2643TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002644 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002645 voe_.set_fail_create_channel(true);
solenberg8189b022016-06-14 12:13:00 -07002646 EXPECT_FALSE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002647}
2648
solenberg0a617e22015-10-20 15:49:38 -07002649// Test that we properly handle failures to add a send stream.
2650TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002651 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002652 voe_.set_fail_create_channel(true);
2653 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2654}
2655
solenberg1ac56142015-10-13 03:58:19 -07002656// Test that AddRecvStream creates new stream.
2657TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002658 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002659 int channel_num = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07002660 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002661 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002662}
2663
2664// Test that after adding a recv stream, we do not decode more codecs than
2665// those previously passed into SetRecvCodecs.
2666TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002667 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002668 cricket::AudioRecvParameters parameters;
2669 parameters.codecs.push_back(kIsacCodec);
2670 parameters.codecs.push_back(kPcmuCodec);
2671 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -07002672 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002673 int channel_num2 = voe_.GetLastChannel();
2674 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002675 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002676 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002677 gcodec.channels = 2;
2678 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2679}
2680
2681// Test that we properly clean up any streams that were added, even if
2682// not explicitly removed.
2683TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002684 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002685 SetSendParameters(send_parameters_);
solenberg8189b022016-06-14 12:13:00 -07002686 EXPECT_TRUE(AddRecvStream(1));
2687 EXPECT_TRUE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002688 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2689 delete channel_;
2690 channel_ = NULL;
2691 EXPECT_EQ(0, voe_.GetNumChannels());
2692}
2693
wu@webrtc.org78187522013-10-07 23:32:02 +00002694TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002695 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07002696 EXPECT_FALSE(AddRecvStream(0));
wu@webrtc.org78187522013-10-07 23:32:02 +00002697}
2698
2699TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002700 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002701 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002702 // Manually delete channel to simulate a failure.
2703 int channel = voe_.GetLastChannel();
2704 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2705 // Add recv stream 2 should work.
solenberg8189b022016-06-14 12:13:00 -07002706 EXPECT_TRUE(AddRecvStream(2));
wu@webrtc.org78187522013-10-07 23:32:02 +00002707 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002708 EXPECT_NE(channel, new_channel);
2709 // The last created channel is deleted too.
2710 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002711}
2712
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002713// Test the InsertDtmf on default send stream as caller.
2714TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2715 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002716}
2717
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002718// Test the InsertDtmf on default send stream as callee
2719TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2720 TestInsertDtmf(0, false);
2721}
2722
2723// Test the InsertDtmf on specified send stream as caller.
2724TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2725 TestInsertDtmf(kSsrc1, true);
2726}
2727
2728// Test the InsertDtmf on specified send stream as callee.
2729TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2730 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002731}
2732
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002733TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002734 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002735 EXPECT_CALL(adm_,
2736 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2737 EXPECT_CALL(adm_,
2738 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2739 EXPECT_CALL(adm_,
2740 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002741 bool ec_enabled;
2742 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002743 webrtc::AecmModes aecm_mode;
2744 bool cng_enabled;
2745 bool agc_enabled;
2746 webrtc::AgcModes agc_mode;
2747 webrtc::AgcConfig agc_config;
2748 bool ns_enabled;
2749 webrtc::NsModes ns_mode;
2750 bool highpass_filter_enabled;
2751 bool stereo_swapping_enabled;
2752 bool typing_detection_enabled;
2753 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002754 voe_.GetAecmMode(aecm_mode, cng_enabled);
2755 voe_.GetAgcStatus(agc_enabled, agc_mode);
2756 voe_.GetAgcConfig(agc_config);
2757 voe_.GetNsStatus(ns_enabled, ns_mode);
2758 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2759 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2760 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2761 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002762 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002763 EXPECT_FALSE(cng_enabled);
2764 EXPECT_TRUE(agc_enabled);
2765 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2766 EXPECT_TRUE(ns_enabled);
2767 EXPECT_TRUE(highpass_filter_enabled);
2768 EXPECT_FALSE(stereo_swapping_enabled);
2769 EXPECT_TRUE(typing_detection_enabled);
2770 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2771 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002772 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2773 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002774
solenberg246b8172015-12-08 09:50:23 -08002775 // Nothing set in AudioOptions, so everything should be as default.
2776 send_parameters_.options = cricket::AudioOptions();
solenberg059fb442016-10-26 05:12:24 -07002777 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002778 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002779 voe_.GetAecmMode(aecm_mode, cng_enabled);
2780 voe_.GetAgcStatus(agc_enabled, agc_mode);
2781 voe_.GetAgcConfig(agc_config);
2782 voe_.GetNsStatus(ns_enabled, ns_mode);
2783 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2784 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2785 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2786 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002787 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002788 EXPECT_FALSE(cng_enabled);
2789 EXPECT_TRUE(agc_enabled);
2790 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2791 EXPECT_TRUE(ns_enabled);
2792 EXPECT_TRUE(highpass_filter_enabled);
2793 EXPECT_FALSE(stereo_swapping_enabled);
2794 EXPECT_TRUE(typing_detection_enabled);
2795 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2796 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002797 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2798 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002799
2800 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002801 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002802 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002803 voe_.GetEcStatus(ec_enabled, ec_mode);
2804 EXPECT_FALSE(ec_enabled);
2805
2806 // Turn echo cancellation back on, with settings, and make sure
2807 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002808 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002809 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002810 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002811 voe_.GetAecmMode(aecm_mode, cng_enabled);
2812 voe_.GetAgcStatus(agc_enabled, agc_mode);
2813 voe_.GetAgcConfig(agc_config);
2814 voe_.GetNsStatus(ns_enabled, ns_mode);
2815 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2816 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2817 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2818 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002819 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002820 EXPECT_TRUE(agc_enabled);
2821 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2822 EXPECT_TRUE(ns_enabled);
2823 EXPECT_TRUE(highpass_filter_enabled);
2824 EXPECT_FALSE(stereo_swapping_enabled);
2825 EXPECT_TRUE(typing_detection_enabled);
2826 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2827 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2828
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002829 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2830 // control.
solenberg246b8172015-12-08 09:50:23 -08002831 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002832 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002833 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002834 voe_.GetAecmMode(aecm_mode, cng_enabled);
2835 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002836 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002837 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2838
2839 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002840 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2841 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2842 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002843 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002844 voe_.GetEcStatus(ec_enabled, ec_mode);
2845 EXPECT_FALSE(ec_enabled);
2846 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002847 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002848 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002849 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002850 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002851 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002852 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2853
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002854 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002855 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002856 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002857 voe_.GetAgcStatus(agc_enabled, agc_mode);
2858 EXPECT_FALSE(agc_enabled);
2859
2860 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002861 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2862 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
solenberg059fb442016-10-26 05:12:24 -07002863 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002864 voe_.GetAgcStatus(agc_enabled, agc_mode);
2865 EXPECT_TRUE(agc_enabled);
2866 voe_.GetAgcConfig(agc_config);
2867 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2868
2869 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002870 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2871 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2872 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2873 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002874 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002875 voe_.GetNsStatus(ns_enabled, ns_mode);
2876 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2877 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2878 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2879 EXPECT_FALSE(ns_enabled);
2880 EXPECT_FALSE(highpass_filter_enabled);
2881 EXPECT_FALSE(typing_detection_enabled);
2882 EXPECT_TRUE(stereo_swapping_enabled);
2883
solenberg1ac56142015-10-13 03:58:19 -07002884 // Set options again to ensure it has no impact.
solenberg059fb442016-10-26 05:12:24 -07002885 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002886 voe_.GetEcStatus(ec_enabled, ec_mode);
2887 voe_.GetNsStatus(ns_enabled, ns_mode);
2888 EXPECT_TRUE(ec_enabled);
2889 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2890 EXPECT_FALSE(ns_enabled);
2891 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2892}
2893
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002894TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002895 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002896
2897 bool ec_enabled;
2898 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002899 bool agc_enabled;
2900 webrtc::AgcModes agc_mode;
2901 bool ns_enabled;
2902 webrtc::NsModes ns_mode;
2903 bool highpass_filter_enabled;
2904 bool stereo_swapping_enabled;
2905 bool typing_detection_enabled;
2906
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002907 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002908 voe_.GetAgcStatus(agc_enabled, agc_mode);
2909 voe_.GetNsStatus(ns_enabled, ns_mode);
2910 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2911 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2912 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2913 EXPECT_TRUE(ec_enabled);
2914 EXPECT_TRUE(agc_enabled);
2915 EXPECT_TRUE(ns_enabled);
2916 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002917 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002918 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002919}
2920
2921TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2922 webrtc::AgcConfig set_config = {0};
2923 set_config.targetLeveldBOv = 3;
2924 set_config.digitalCompressionGaindB = 9;
2925 set_config.limiterEnable = true;
2926 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002927
2928 webrtc::AgcConfig config = {0};
2929 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2930 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2931 EXPECT_EQ(set_config.digitalCompressionGaindB,
2932 config.digitalCompressionGaindB);
2933 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2934}
2935
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002936TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002937 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002938 EXPECT_CALL(adm_,
2939 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2940 EXPECT_CALL(adm_,
2941 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
2942 EXPECT_CALL(adm_,
2943 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
solenberg059fb442016-10-26 05:12:24 -07002944 EXPECT_CALL(adm_,
2945 RecordingIsInitialized()).Times(2).WillRepeatedly(Return(false));
2946 EXPECT_CALL(adm_, Recording()).Times(2).WillRepeatedly(Return(false));
2947 EXPECT_CALL(adm_, InitRecording()).Times(2).WillRepeatedly(Return(0));
2948 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(10);
2949 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(10);
solenberg5b5129a2016-04-08 05:35:48 -07002950
kwiberg686a8ef2016-02-26 03:00:35 -08002951 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07002952 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002953 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002954 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07002955 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002956 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002957
2958 // Have to add a stream to make SetSend work.
2959 cricket::StreamParams stream1;
2960 stream1.ssrcs.push_back(1);
2961 channel1->AddSendStream(stream1);
2962 cricket::StreamParams stream2;
2963 stream2.ssrcs.push_back(2);
2964 channel2->AddSendStream(stream2);
2965
2966 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002967 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002968 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2969 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2970 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002971 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002972 EXPECT_EQ(parameters_options_all.options, channel1->options());
solenberg059fb442016-10-26 05:12:24 -07002973 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002974 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002975
2976 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002977 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002978 parameters_options_no_ns.options.noise_suppression =
2979 rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002980 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002981 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002982 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2983 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2984 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002985 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002986
2987 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002988 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002989 parameters_options_no_agc.options.auto_gain_control =
2990 rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002991 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002992 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2993 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2994 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002995 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002996
solenberg059fb442016-10-26 05:12:24 -07002997 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002998 bool ec_enabled;
2999 webrtc::EcModes ec_mode;
3000 bool agc_enabled;
3001 webrtc::AgcModes agc_mode;
3002 bool ns_enabled;
3003 webrtc::NsModes ns_mode;
3004 voe_.GetEcStatus(ec_enabled, ec_mode);
3005 voe_.GetAgcStatus(agc_enabled, agc_mode);
3006 voe_.GetNsStatus(ns_enabled, ns_mode);
3007 EXPECT_TRUE(ec_enabled);
3008 EXPECT_TRUE(agc_enabled);
3009 EXPECT_TRUE(ns_enabled);
3010
solenberg059fb442016-10-26 05:12:24 -07003011 channel1->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003012 voe_.GetEcStatus(ec_enabled, ec_mode);
3013 voe_.GetAgcStatus(agc_enabled, agc_mode);
3014 voe_.GetNsStatus(ns_enabled, ns_mode);
3015 EXPECT_TRUE(ec_enabled);
3016 EXPECT_TRUE(agc_enabled);
3017 EXPECT_FALSE(ns_enabled);
3018
solenberg059fb442016-10-26 05:12:24 -07003019 channel2->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003020 voe_.GetEcStatus(ec_enabled, ec_mode);
3021 voe_.GetAgcStatus(agc_enabled, agc_mode);
3022 voe_.GetNsStatus(ns_enabled, ns_mode);
3023 EXPECT_TRUE(ec_enabled);
3024 EXPECT_FALSE(agc_enabled);
3025 EXPECT_TRUE(ns_enabled);
3026
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003027 // Make sure settings take effect while we are sending.
solenberg059fb442016-10-26 05:12:24 -07003028 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
3029 EXPECT_CALL(apm_, ApplyConfig(testing::_));
3030 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003031 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3032 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003033 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003034 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003035 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003036 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003037 channel2->SetSend(true);
solenberg059fb442016-10-26 05:12:24 -07003038 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc_nor_ns));
Karl Wibergbe579832015-11-10 22:34:18 +01003039 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3040 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3041 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003042 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003043 voe_.GetEcStatus(ec_enabled, ec_mode);
3044 voe_.GetAgcStatus(agc_enabled, agc_mode);
3045 voe_.GetNsStatus(ns_enabled, ns_mode);
3046 EXPECT_TRUE(ec_enabled);
3047 EXPECT_FALSE(agc_enabled);
3048 EXPECT_FALSE(ns_enabled);
3049}
3050
wu@webrtc.orgde305012013-10-31 15:40:38 +00003051// This test verifies DSCP settings are properly applied on voice media channel.
3052TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003053 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003054 cricket::FakeNetworkInterface network_interface;
3055 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003056 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003057
solenberg059fb442016-10-26 05:12:24 -07003058 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(3);
3059 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(3);
3060
solenbergbc37fc82016-04-04 09:54:44 -07003061 channel.reset(
3062 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003063 channel->SetInterface(&network_interface);
3064 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3065 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3066
3067 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003068 channel.reset(
3069 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003070 channel->SetInterface(&network_interface);
3071 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3072
3073 // Verify that setting the option to false resets the
3074 // DiffServCodePoint.
3075 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003076 channel.reset(
3077 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003078 channel->SetInterface(&network_interface);
3079 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3080 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3081
3082 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003083}
3084
solenberg1ac56142015-10-13 03:58:19 -07003085TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003086 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003087 cricket::WebRtcVoiceMediaChannel* media_channel =
3088 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003089 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
solenberg8189b022016-06-14 12:13:00 -07003090 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -07003091 int channel_id = voe_.GetLastChannel();
3092 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3093 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
solenberg8189b022016-06-14 12:13:00 -07003094 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07003095 int channel_id2 = voe_.GetLastChannel();
3096 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003097}
3098
solenberg1ac56142015-10-13 03:58:19 -07003099TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003100 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003101 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003102 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3103 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3104 EXPECT_TRUE(channel_->AddSendStream(
3105 cricket::StreamParams::CreateLegacy(kSsrc1)));
3106 int channel_id = voe_.GetLastChannel();
3107 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3108 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3109 EXPECT_TRUE(channel_->AddSendStream(
3110 cricket::StreamParams::CreateLegacy(kSsrc2)));
3111 int channel_id2 = voe_.GetLastChannel();
3112 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003113}
3114
solenberg4bac9c52015-10-09 02:32:53 -07003115TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003116 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003117 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003118 cricket::StreamParams stream;
3119 stream.ssrcs.push_back(kSsrc2);
3120 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg217fb662016-06-17 08:30:54 -07003121 EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrc2).gain());
solenberg4bac9c52015-10-09 02:32:53 -07003122 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg217fb662016-06-17 08:30:54 -07003123 EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc2).gain());
solenberg1ac56142015-10-13 03:58:19 -07003124}
3125
3126TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003127 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003128 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3129 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg217fb662016-06-17 08:30:54 -07003130 EXPECT_DOUBLE_EQ(2, GetRecvStream(1).gain());
solenberg1ac56142015-10-13 03:58:19 -07003131 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenberg217fb662016-06-17 08:30:54 -07003132 EXPECT_DOUBLE_EQ(3, GetRecvStream(1).gain());
3133 EXPECT_TRUE(channel_->SetOutputVolume(1, 4));
3134 EXPECT_DOUBLE_EQ(4, GetRecvStream(1).gain());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003135}
3136
pbos8fc7fa72015-07-15 08:02:58 -07003137TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003138 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003139 const std::string kSyncLabel = "AvSyncLabel";
3140
solenbergff976312016-03-30 23:28:51 -07003141 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003142 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3143 sp.sync_label = kSyncLabel;
3144 // Creating two channels to make sure that sync label is set properly for both
3145 // the default voice channel and following ones.
3146 EXPECT_TRUE(channel_->AddRecvStream(sp));
3147 sp.ssrcs[0] += 1;
3148 EXPECT_TRUE(channel_->AddRecvStream(sp));
3149
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003150 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003151 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003152 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003153 << "SyncGroup should be set based on sync_label";
3154 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003155 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003156 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003157}
3158
solenberg3a941542015-11-16 07:34:50 -08003159// TODO(solenberg): Remove, once recv streams are configured through Call.
3160// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003161TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003162 // Test that setting the header extensions results in the expected state
3163 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003164 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003165 ssrcs.push_back(223);
3166 ssrcs.push_back(224);
3167
solenbergff976312016-03-30 23:28:51 -07003168 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07003169 SetSendParameters(send_parameters_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02003170 for (uint32_t ssrc : ssrcs) {
solenberg059fb442016-10-26 05:12:24 -07003171 EXPECT_TRUE(channel_->AddRecvStream(
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003172 cricket::StreamParams::CreateLegacy(ssrc)));
3173 }
3174
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003175 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003176 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003177 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003178 EXPECT_NE(nullptr, s);
3179 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3180 }
3181
3182 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003183 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003184 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003185 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003186 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003187 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003188 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003189 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003190 EXPECT_NE(nullptr, s);
3191 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003192 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3193 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003194 for (const auto& s_ext : s_exts) {
3195 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003196 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003197 }
3198 }
3199 }
3200 }
3201
3202 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003203 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003204 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003205 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003206 EXPECT_NE(nullptr, s);
3207 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3208 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003209}
3210
3211TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3212 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003213 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003214 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003215 static const unsigned char kRtcp[] = {
3216 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3217 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3218 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3219 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3220 };
jbaucheec21bd2016-03-20 06:15:43 -07003221 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003222
solenbergff976312016-03-30 23:28:51 -07003223 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003224 cricket::WebRtcVoiceMediaChannel* media_channel =
3225 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg059fb442016-10-26 05:12:24 -07003226 SetSendParameters(send_parameters_);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003227 EXPECT_TRUE(media_channel->AddRecvStream(
3228 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3229
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003230 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003231 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003232 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003233 EXPECT_EQ(0, s->received_packets());
3234 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3235 EXPECT_EQ(1, s->received_packets());
3236 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3237 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003238}
Minyue2013aec2015-05-13 14:14:42 +02003239
solenberg0a617e22015-10-20 15:49:38 -07003240// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003241// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003242TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003243 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07003244 SetSendParameters(send_parameters_);
solenberg8fb30c32015-10-13 03:06:58 -07003245 int default_channel = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07003246 EXPECT_TRUE(AddRecvStream(1));
Minyue2013aec2015-05-13 14:14:42 +02003247 int recv_ch = voe_.GetLastChannel();
3248 EXPECT_NE(recv_ch, default_channel);
3249 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3250 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3251 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg8189b022016-06-14 12:13:00 -07003252 EXPECT_TRUE(AddRecvStream(3));
solenberg1ac56142015-10-13 03:58:19 -07003253 recv_ch = voe_.GetLastChannel();
3254 EXPECT_NE(recv_ch, default_channel);
3255 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003256}
3257
3258TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003259 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07003260 SetSendParameters(send_parameters_);
Minyue2013aec2015-05-13 14:14:42 +02003261
solenberg8189b022016-06-14 12:13:00 -07003262 EXPECT_TRUE(AddRecvStream(1));
Minyue2013aec2015-05-13 14:14:42 +02003263 int recv_ch = voe_.GetLastChannel();
3264
3265 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3266 int send_ch = voe_.GetLastChannel();
3267
3268 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3269 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3270 // channel of |recv_ch|.This is not a common case, since, normally, only the
3271 // default channel can be associated. However, the default is not deletable.
3272 // So we force the |recv_ch| to associate with a non-default channel.
3273 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3274 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3275
3276 EXPECT_TRUE(channel_->RemoveSendStream(2));
3277 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3278}
stefan658910c2015-09-03 05:48:32 -07003279
deadbeef884f5852016-01-15 09:20:04 -08003280TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003281 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003282 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3283 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003284
3285 // Setting the sink before a recv stream exists should do nothing.
3286 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
solenberg8189b022016-06-14 12:13:00 -07003287 EXPECT_TRUE(AddRecvStream(kSsrc1));
deadbeef884f5852016-01-15 09:20:04 -08003288 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3289
3290 // Now try actually setting the sink.
3291 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3292 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3293
3294 // Now try resetting it.
3295 channel_->SetRawAudioSink(kSsrc1, nullptr);
3296 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3297}
3298
3299TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003300 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003301 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3302 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003303
3304 // Should be able to set a default sink even when no stream exists.
3305 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3306
3307 // Create default channel and ensure it's assigned the default sink.
3308 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3309 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3310
3311 // Try resetting the default sink.
3312 channel_->SetRawAudioSink(0, nullptr);
3313 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3314
3315 // Try setting the default sink while the default stream exists.
3316 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3317 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3318
3319 // If we remove and add a default stream, it should get the same sink.
3320 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3321 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3322 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3323}
3324
skvlad7a43d252016-03-22 15:32:27 -07003325// Test that, just like the video channel, the voice channel communicates the
3326// network state to the call.
3327TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003328 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003329
3330 EXPECT_EQ(webrtc::kNetworkUp,
3331 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3332 EXPECT_EQ(webrtc::kNetworkUp,
3333 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3334
3335 channel_->OnReadyToSend(false);
3336 EXPECT_EQ(webrtc::kNetworkDown,
3337 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3338 EXPECT_EQ(webrtc::kNetworkUp,
3339 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3340
3341 channel_->OnReadyToSend(true);
3342 EXPECT_EQ(webrtc::kNetworkUp,
3343 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3344 EXPECT_EQ(webrtc::kNetworkUp,
3345 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3346}
3347
aleloi18e0b672016-10-04 02:45:47 -07003348// Test that playout is still started after changing parameters
3349TEST_F(WebRtcVoiceEngineTestFake, PreservePlayoutWhenRecreateRecvStream) {
3350 SetupRecvStream();
3351 channel_->SetPlayout(true);
3352 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3353
3354 // Changing RTP header extensions will recreate the AudioReceiveStream.
3355 cricket::AudioRecvParameters parameters;
3356 parameters.extensions.push_back(
3357 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
3358 channel_->SetRecvParameters(parameters);
3359
3360 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3361}
3362
stefan658910c2015-09-03 05:48:32 -07003363// Tests that the library initializes and shuts down properly.
3364TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossu29b1a8d2016-06-13 07:34:51 -07003365 // If the VoiceEngine wants to gather available codecs early, that's fine but
3366 // we never want it to create a decoder at this stage.
ossuc54071d2016-08-17 02:45:41 -07003367 cricket::WebRtcVoiceEngine engine(
3368 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003369 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003370 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003371 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003372 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3373 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003374 EXPECT_TRUE(channel != nullptr);
3375 delete channel;
solenbergff976312016-03-30 23:28:51 -07003376}
stefan658910c2015-09-03 05:48:32 -07003377
solenbergff976312016-03-30 23:28:51 -07003378// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003379TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3380 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3381 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3382 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003383 {
ossuc54071d2016-08-17 02:45:41 -07003384 cricket::WebRtcVoiceEngine engine(
3385 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003386 webrtc::RtcEventLogNullImpl event_log;
solenbergff976312016-03-30 23:28:51 -07003387 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003388 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
solenbergff976312016-03-30 23:28:51 -07003389 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3390 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3391 EXPECT_TRUE(channel != nullptr);
3392 delete channel;
3393 }
stefan658910c2015-09-03 05:48:32 -07003394}
3395
3396// Tests that the library is configured with the codecs we want.
3397TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003398 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3399 // module.
3400
stefan658910c2015-09-03 05:48:32 -07003401 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003402 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003403 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003404 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003405 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003406 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003407 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003408 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003409 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003410 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003411 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003412 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003413 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003414 cricket::AudioCodec(96, "PCMU", 8000, 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, "PCMA", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003417 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003418 cricket::AudioCodec(96, "G722", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003419 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003420 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003421 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003422 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003423 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003424 cricket::AudioCodec(96, "CN", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003425 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003426 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003427 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003428 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003429 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003430 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003431 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003432 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003433 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003434 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003435 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003436 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003437 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003438 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003439 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003440 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003441 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003442 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003443 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003444 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003445 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003446 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003447 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003448 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003449 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003450
stefan658910c2015-09-03 05:48:32 -07003451 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossuc54071d2016-08-17 02:45:41 -07003452 // TODO(ossu): Why are the payload types of codecs with non-static payload
3453 // type assignments checked here? It shouldn't really matter.
3454 cricket::WebRtcVoiceEngine engine(
3455 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
stefan658910c2015-09-03 05:48:32 -07003456 for (std::vector<cricket::AudioCodec>::const_iterator it =
ossuc54071d2016-08-17 02:45:41 -07003457 engine.send_codecs().begin();
3458 it != engine.send_codecs().end(); ++it) {
stefan658910c2015-09-03 05:48:32 -07003459 if (it->name == "CN" && it->clockrate == 16000) {
3460 EXPECT_EQ(105, it->id);
3461 } else if (it->name == "CN" && it->clockrate == 32000) {
3462 EXPECT_EQ(106, it->id);
3463 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3464 EXPECT_EQ(103, it->id);
3465 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3466 EXPECT_EQ(104, it->id);
3467 } else if (it->name == "G722" && it->clockrate == 8000) {
3468 EXPECT_EQ(9, it->id);
3469 } else if (it->name == "telephone-event") {
3470 EXPECT_EQ(126, it->id);
stefan658910c2015-09-03 05:48:32 -07003471 } else if (it->name == "opus") {
3472 EXPECT_EQ(111, it->id);
3473 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3474 EXPECT_EQ("10", it->params.find("minptime")->second);
stefan658910c2015-09-03 05:48:32 -07003475 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3476 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3477 }
3478 }
stefan658910c2015-09-03 05:48:32 -07003479}
3480
3481// Tests that VoE supports at least 32 channels
3482TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossuc54071d2016-08-17 02:45:41 -07003483 cricket::WebRtcVoiceEngine engine(
3484 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003485 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003486 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003487 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
stefan658910c2015-09-03 05:48:32 -07003488
3489 cricket::VoiceMediaChannel* channels[32];
3490 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003491 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003492 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3493 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003494 if (!channel)
3495 break;
stefan658910c2015-09-03 05:48:32 -07003496 channels[num_channels++] = channel;
3497 }
3498
tfarina5237aaf2015-11-10 23:44:30 -08003499 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003500 EXPECT_EQ(expected, num_channels);
3501
3502 while (num_channels > 0) {
3503 delete channels[--num_channels];
3504 }
stefan658910c2015-09-03 05:48:32 -07003505}
3506
3507// Test that we set our preferred codecs properly.
3508TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003509 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3510 // - Check that our builtin codecs are usable by Channel.
3511 // - The codecs provided by the engine is usable by Channel.
3512 // It does not check that the codecs in the RecvParameters are actually
3513 // what we sent in - though it's probably reasonable to expect so, if
3514 // SetRecvParameters returns true.
3515 // I think it will become clear once audio decoder injection is completed.
3516 cricket::WebRtcVoiceEngine engine(
3517 nullptr, webrtc::CreateBuiltinAudioDecoderFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003518 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003519 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003520 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003521 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3522 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003523 cricket::AudioRecvParameters parameters;
ossudedfd282016-06-14 07:12:39 -07003524 parameters.codecs = engine.recv_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003525 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003526}