blob: 6f0ff6334bd229989c7e7ba181abb3c2dc952b84 [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;
solenberg7602aab2016-11-14 11:30:07 -080053const uint32_t kSsrc4 = 0x42;
solenberg85a04962015-10-27 03:35:21 -070054const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000055
solenberg971cab02016-06-14 10:02:41 -070056constexpr int kRtpHistoryMs = 5000;
57
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058class FakeVoEWrapper : public cricket::VoEWrapper {
59 public:
60 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
61 : cricket::VoEWrapper(engine, // processing
62 engine, // base
63 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000065 engine) { // volume
66 }
67};
skvlad11a9cbf2016-10-07 11:53:05 -070068
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020069} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000070
solenbergff976312016-03-30 23:28:51 -070071// Tests that our stub library "works".
72TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070073 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
74 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
75 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070076 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
77 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
78 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenberg059fb442016-10-26 05:12:24 -070079 StrictMock<webrtc::test::MockAudioProcessing> apm;
80 EXPECT_CALL(apm, ApplyConfig(testing::_));
81 EXPECT_CALL(apm, SetExtraOptions(testing::_));
82 EXPECT_CALL(apm, Initialize()).WillOnce(Return(0));
83 cricket::FakeWebRtcVoiceEngine voe(&apm);
solenbergff976312016-03-30 23:28:51 -070084 EXPECT_FALSE(voe.IsInited());
85 {
ossuc54071d2016-08-17 02:45:41 -070086 cricket::WebRtcVoiceEngine engine(
87 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(),
88 new FakeVoEWrapper(&voe));
solenbergff976312016-03-30 23:28:51 -070089 EXPECT_TRUE(voe.IsInited());
90 }
91 EXPECT_FALSE(voe.IsInited());
92}
93
deadbeef884f5852016-01-15 09:20:04 -080094class FakeAudioSink : public webrtc::AudioSinkInterface {
95 public:
96 void OnData(const Data& audio) override {}
97};
98
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080099class FakeAudioSource : public cricket::AudioSource {
100 void SetSink(Sink* sink) override {}
101};
102
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000103class WebRtcVoiceEngineTestFake : public testing::Test {
104 public:
stefanba4c0e42016-02-04 04:12:24 -0800105 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
106
107 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
solenberg059fb442016-10-26 05:12:24 -0700108 : call_(webrtc::Call::Config(&event_log_)), voe_(&apm_),
skvlad11a9cbf2016-10-07 11:53:05 -0700109 override_field_trials_(field_trials) {
ossuc54071d2016-08-17 02:45:41 -0700110 auto factory = webrtc::MockAudioDecoderFactory::CreateUnusedFactory();
solenbergbc37fc82016-04-04 09:54:44 -0700111 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
112 EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -0700113 EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false));
114 EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false));
115 EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenberg059fb442016-10-26 05:12:24 -0700116 EXPECT_CALL(apm_, ApplyConfig(testing::_));
117 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
118 EXPECT_CALL(apm_, Initialize()).WillOnce(Return(0));
ossuc54071d2016-08-17 02:45:41 -0700119 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, factory,
solenbergbc37fc82016-04-04 09:54:44 -0700120 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200121 send_parameters_.codecs.push_back(kPcmuCodec);
122 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000123 }
solenberg8189b022016-06-14 12:13:00 -0700124
solenbergff976312016-03-30 23:28:51 -0700125 bool SetupChannel() {
solenberg059fb442016-10-26 05:12:24 -0700126 EXPECT_CALL(apm_, ApplyConfig(testing::_));
127 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
solenbergbc37fc82016-04-04 09:54:44 -0700128 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
129 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200130 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000131 }
solenberg8189b022016-06-14 12:13:00 -0700132
solenbergff976312016-03-30 23:28:51 -0700133 bool SetupRecvStream() {
134 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700135 return false;
136 }
solenberg8189b022016-06-14 12:13:00 -0700137 return AddRecvStream(kSsrc1);
solenberg1ac56142015-10-13 03:58:19 -0700138 }
solenberg8189b022016-06-14 12:13:00 -0700139
solenbergff976312016-03-30 23:28:51 -0700140 bool SetupSendStream() {
141 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000142 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000143 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800144 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
145 return false;
146 }
solenberg059fb442016-10-26 05:12:24 -0700147 EXPECT_CALL(apm_, set_output_will_be_muted(false));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800148 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000149 }
solenberg8189b022016-06-14 12:13:00 -0700150
151 bool AddRecvStream(uint32_t ssrc) {
152 EXPECT_TRUE(channel_);
153 return channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(ssrc));
154 }
155
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000156 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700157 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700158 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800159 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700160 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700161 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800162 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000163 }
solenberg8189b022016-06-14 12:13:00 -0700164
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000165 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700166 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000167 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000168 }
solenberg8189b022016-06-14 12:13:00 -0700169
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200170 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000171 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000172 }
173
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100174 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
175 const auto* send_stream = call_.GetAudioSendStream(ssrc);
176 EXPECT_TRUE(send_stream);
177 return *send_stream;
178 }
179
deadbeef884f5852016-01-15 09:20:04 -0800180 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
181 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
182 EXPECT_TRUE(recv_stream);
183 return *recv_stream;
184 }
185
solenberg3a941542015-11-16 07:34:50 -0800186 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800187 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800188 }
189
solenberg7add0582015-11-20 09:59:34 -0800190 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800191 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800192 }
193
solenberg059fb442016-10-26 05:12:24 -0700194 void SetSend(bool enable) {
195 ASSERT_TRUE(channel_);
solenbergd53a3f92016-04-14 13:56:37 -0700196 if (enable) {
197 EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false));
198 EXPECT_CALL(adm_, Recording()).WillOnce(Return(false));
199 EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0));
solenberg059fb442016-10-26 05:12:24 -0700200 EXPECT_CALL(apm_, ApplyConfig(testing::_));
201 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
solenbergd53a3f92016-04-14 13:56:37 -0700202 }
solenberg059fb442016-10-26 05:12:24 -0700203 channel_->SetSend(enable);
204 }
205
206 void SetSendParameters(const cricket::AudioSendParameters& params) {
207 EXPECT_CALL(apm_, ApplyConfig(testing::_));
208 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
209 ASSERT_TRUE(channel_);
210 EXPECT_TRUE(channel_->SetSendParameters(params));
211 }
212
minyue6b825df2016-10-31 04:08:32 -0700213 void SetAudioSend(uint32_t ssrc, bool enable, cricket::AudioSource* source,
214 const cricket::AudioOptions* options = nullptr) {
solenberg059fb442016-10-26 05:12:24 -0700215 EXPECT_CALL(apm_, set_output_will_be_muted(!enable));
216 ASSERT_TRUE(channel_);
minyue6b825df2016-10-31 04:08:32 -0700217 if (enable && options) {
218 EXPECT_CALL(apm_, ApplyConfig(testing::_));
219 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
220 }
221 EXPECT_TRUE(channel_->SetAudioSend(ssrc, enable, options, source));
solenbergd53a3f92016-04-14 13:56:37 -0700222 }
223
Peter Boström0c4e06b2015-10-07 12:23:21 +0200224 void TestInsertDtmf(uint32_t ssrc, bool caller) {
solenbergff976312016-03-30 23:28:51 -0700225 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000226 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700227 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000228 // send stream.
229 EXPECT_TRUE(channel_->AddSendStream(
230 cricket::StreamParams::CreateLegacy(kSsrc1)));
231 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000232
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000233 // Test we can only InsertDtmf when the other side supports telephone-event.
solenberg059fb442016-10-26 05:12:24 -0700234 SetSendParameters(send_parameters_);
235 SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000236 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800237 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200238 send_parameters_.codecs.push_back(kTelephoneEventCodec);
solenberg059fb442016-10-26 05:12:24 -0700239 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000240 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000241
242 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700243 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800244 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000245 EXPECT_TRUE(channel_->AddSendStream(
246 cricket::StreamParams::CreateLegacy(kSsrc1)));
247 }
248
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000249 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800250 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000251
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100252 // Test send.
253 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
254 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
255 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800256 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100257 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
258 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
259 EXPECT_EQ(2, telephone_event.event_code);
260 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000261 }
262
263 // Test that send bandwidth is set correctly.
264 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000265 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
266 // |expected_result| is the expected result from SetMaxSendBandwidth().
267 // |expected_bitrate| is the expected audio bitrate afterward.
deadbeef80346142016-04-27 14:17:10 -0700268 void TestMaxSendBandwidth(const cricket::AudioCodec& codec,
269 int max_bitrate,
270 bool expected_result,
271 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200272 cricket::AudioSendParameters parameters;
273 parameters.codecs.push_back(codec);
274 parameters.max_bandwidth_bps = max_bitrate;
solenberg059fb442016-10-26 05:12:24 -0700275 if (expected_result) {
276 SetSendParameters(parameters);
277 } else {
278 EXPECT_FALSE(channel_->SetSendParameters(parameters));
279 }
minyue7a973442016-10-20 03:27:12 -0700280 EXPECT_EQ(expected_bitrate, GetCodecBitrate(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000281 }
282
skvlade0d46372016-04-07 22:59:22 -0700283 // Sets the per-stream maximum bitrate limit for the specified SSRC.
284 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700285 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(ssrc);
skvlade0d46372016-04-07 22:59:22 -0700286 EXPECT_EQ(1UL, parameters.encodings.size());
287
288 parameters.encodings[0].max_bitrate_bps = bitrate;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700289 return channel_->SetRtpSendParameters(ssrc, parameters);
skvlade0d46372016-04-07 22:59:22 -0700290 }
291
solenberg059fb442016-10-26 05:12:24 -0700292 void SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
skvlade0d46372016-04-07 22:59:22 -0700293 cricket::AudioSendParameters send_parameters;
294 send_parameters.codecs.push_back(codec);
295 send_parameters.max_bandwidth_bps = bitrate;
solenberg059fb442016-10-26 05:12:24 -0700296 SetSendParameters(send_parameters);
skvlade0d46372016-04-07 22:59:22 -0700297 }
298
minyue7a973442016-10-20 03:27:12 -0700299 void CheckSendCodec(int32_t ssrc,
300 const char expected_name[],
301 int expected_channels,
302 int expected_bitrate) {
303 const auto& codec = GetSendStreamConfig(ssrc).send_codec_spec.codec_inst;
304 EXPECT_STREQ(expected_name, codec.plname);
305 EXPECT_EQ(expected_channels, codec.channels);
306 EXPECT_EQ(expected_bitrate, codec.rate);
307 }
308
309 int GetOpusMaxPlaybackRate(int32_t ssrc) {
310 return GetSendStreamConfig(ssrc).send_codec_spec.opus_max_playback_rate;
311 }
312
313 bool GetOpusDtx(int32_t ssrc) {
314 return GetSendStreamConfig(ssrc).send_codec_spec.enable_opus_dtx;
315 }
316
317 bool GetCodecFec(int32_t ssrc) {
318 return GetSendStreamConfig(ssrc).send_codec_spec.enable_codec_fec;
319 }
320
skvlade0d46372016-04-07 22:59:22 -0700321 int GetCodecBitrate(int32_t ssrc) {
minyue7a973442016-10-20 03:27:12 -0700322 return GetSendStreamConfig(ssrc).send_codec_spec.codec_inst.rate;
323 }
324
325 int GetCodecPacSize(int32_t ssrc) {
326 return GetSendStreamConfig(ssrc).send_codec_spec.codec_inst.pacsize;
skvlade0d46372016-04-07 22:59:22 -0700327 }
328
minyue6b825df2016-10-31 04:08:32 -0700329 const rtc::Optional<std::string>& GetAudioNetworkAdaptorConfig(int32_t ssrc) {
330 return GetSendStreamConfig(ssrc).audio_network_adaptor_config;
331 }
332
skvlade0d46372016-04-07 22:59:22 -0700333 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
334 int global_max,
335 int stream_max,
336 bool expected_result,
337 int expected_codec_bitrate) {
338 // Clear the bitrate limit from the previous test case.
339 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
340
341 // Attempt to set the requested bitrate limits.
solenberg059fb442016-10-26 05:12:24 -0700342 SetGlobalMaxBitrate(codec, global_max);
skvlade0d46372016-04-07 22:59:22 -0700343 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
344
345 // Verify that reading back the parameters gives results
346 // consistent with the Set() result.
347 webrtc::RtpParameters resulting_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700348 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700349 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
350 EXPECT_EQ(expected_result ? stream_max : -1,
351 resulting_parameters.encodings[0].max_bitrate_bps);
352
353 // Verify that the codec settings have the expected bitrate.
354 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
355 }
356
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000357 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700358 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000359
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000360 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800361 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000362
363 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700364 send_parameters_.extensions.push_back(
365 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg059fb442016-10-26 05:12:24 -0700366 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800367 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000368
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000369 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200370 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -0700371 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800372 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000373
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000374 // Ensure extension is set properly.
375 const int id = 1;
isheriff6f8d6862016-05-26 11:24:55 -0700376 send_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg059fb442016-10-26 05:12:24 -0700377 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800378 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700379 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800380 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000381
solenberg7add0582015-11-20 09:59:34 -0800382 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000383 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700384 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800385 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
386 call_.GetAudioSendStream(kSsrc2));
387 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700388 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800389 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000390
391 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200392 send_parameters_.codecs.push_back(kPcmuCodec);
393 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -0700394 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800395 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
396 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000397 }
398
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000399 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700400 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000401
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000402 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800403 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000404
405 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700406 recv_parameters_.extensions.push_back(
407 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800408 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
409 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000410
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000411 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800412 recv_parameters_.extensions.clear();
413 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
414 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000415
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000416 // Ensure extension is set properly.
417 const int id = 2;
isheriff6f8d6862016-05-26 11:24:55 -0700418 recv_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg7add0582015-11-20 09:59:34 -0800419 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
420 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700421 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800422 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000423
solenberg7add0582015-11-20 09:59:34 -0800424 // Ensure extension is set properly on new stream.
solenberg8189b022016-06-14 12:13:00 -0700425 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -0800426 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
427 call_.GetAudioReceiveStream(kSsrc2));
428 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700429 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800430 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000431
432 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800433 recv_parameters_.extensions.clear();
434 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
435 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
436 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000437 }
438
solenberg85a04962015-10-27 03:35:21 -0700439 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
440 webrtc::AudioSendStream::Stats stats;
441 stats.local_ssrc = 12;
442 stats.bytes_sent = 345;
443 stats.packets_sent = 678;
444 stats.packets_lost = 9012;
445 stats.fraction_lost = 34.56f;
446 stats.codec_name = "codec_name_send";
447 stats.ext_seqnum = 789;
448 stats.jitter_ms = 12;
449 stats.rtt_ms = 345;
450 stats.audio_level = 678;
451 stats.aec_quality_min = 9.01f;
452 stats.echo_delay_median_ms = 234;
453 stats.echo_delay_std_ms = 567;
454 stats.echo_return_loss = 890;
455 stats.echo_return_loss_enhancement = 1234;
ivoc8c63a822016-10-21 04:10:03 -0700456 stats.residual_echo_likelihood = 0.432f;
solenberg85a04962015-10-27 03:35:21 -0700457 stats.typing_noise_detected = true;
458 return stats;
459 }
460 void SetAudioSendStreamStats() {
461 for (auto* s : call_.GetAudioSendStreams()) {
462 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200463 }
solenberg85a04962015-10-27 03:35:21 -0700464 }
solenberg566ef242015-11-06 15:34:49 -0800465 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
466 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700467 const auto stats = GetAudioSendStreamStats();
468 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
469 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
470 EXPECT_EQ(info.packets_sent, stats.packets_sent);
471 EXPECT_EQ(info.packets_lost, stats.packets_lost);
472 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
473 EXPECT_EQ(info.codec_name, stats.codec_name);
474 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
475 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
476 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
477 EXPECT_EQ(info.audio_level, stats.audio_level);
478 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
479 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
480 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
481 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
482 EXPECT_EQ(info.echo_return_loss_enhancement,
483 stats.echo_return_loss_enhancement);
ivoc8c63a822016-10-21 04:10:03 -0700484 EXPECT_EQ(info.residual_echo_likelihood, stats.residual_echo_likelihood);
solenberg566ef242015-11-06 15:34:49 -0800485 EXPECT_EQ(info.typing_noise_detected,
486 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700487 }
488
489 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
490 webrtc::AudioReceiveStream::Stats stats;
491 stats.remote_ssrc = 123;
492 stats.bytes_rcvd = 456;
493 stats.packets_rcvd = 768;
494 stats.packets_lost = 101;
495 stats.fraction_lost = 23.45f;
496 stats.codec_name = "codec_name_recv";
497 stats.ext_seqnum = 678;
498 stats.jitter_ms = 901;
499 stats.jitter_buffer_ms = 234;
500 stats.jitter_buffer_preferred_ms = 567;
501 stats.delay_estimate_ms = 890;
502 stats.audio_level = 1234;
503 stats.expand_rate = 5.67f;
504 stats.speech_expand_rate = 8.90f;
505 stats.secondary_decoded_rate = 1.23f;
506 stats.accelerate_rate = 4.56f;
507 stats.preemptive_expand_rate = 7.89f;
508 stats.decoding_calls_to_silence_generator = 12;
509 stats.decoding_calls_to_neteq = 345;
510 stats.decoding_normal = 67890;
511 stats.decoding_plc = 1234;
512 stats.decoding_cng = 5678;
513 stats.decoding_plc_cng = 9012;
henrik.lundin63489782016-09-20 01:47:12 -0700514 stats.decoding_muted_output = 3456;
515 stats.capture_start_ntp_time_ms = 7890;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200516 return stats;
517 }
518 void SetAudioReceiveStreamStats() {
519 for (auto* s : call_.GetAudioReceiveStreams()) {
520 s->SetStats(GetAudioReceiveStreamStats());
521 }
522 }
523 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700524 const auto stats = GetAudioReceiveStreamStats();
525 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
526 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
527 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
528 EXPECT_EQ(info.packets_lost, stats.packets_lost);
529 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
530 EXPECT_EQ(info.codec_name, stats.codec_name);
531 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
532 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
533 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200534 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700535 stats.jitter_buffer_preferred_ms);
536 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
537 EXPECT_EQ(info.audio_level, stats.audio_level);
538 EXPECT_EQ(info.expand_rate, stats.expand_rate);
539 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
540 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
541 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
542 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200543 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700544 stats.decoding_calls_to_silence_generator);
545 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
546 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
547 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
548 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
549 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
henrik.lundin63489782016-09-20 01:47:12 -0700550 EXPECT_EQ(info.decoding_muted_output, stats.decoding_muted_output);
solenberg85a04962015-10-27 03:35:21 -0700551 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200552 }
553
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000554 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700555 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
solenberg059fb442016-10-26 05:12:24 -0700556 StrictMock<webrtc::test::MockAudioProcessing> apm_;
skvlad11a9cbf2016-10-07 11:53:05 -0700557 webrtc::RtcEventLogNullImpl event_log_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200558 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000559 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700560 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700561 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200562 cricket::AudioSendParameters send_parameters_;
563 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800564 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800565 private:
566 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000567};
568
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000569// Tests that we can create and destroy a channel.
570TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700571 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000572}
573
solenberg31fec402016-05-06 02:13:12 -0700574// Test that we can add a send stream and that it has the correct defaults.
575TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
576 EXPECT_TRUE(SetupChannel());
577 EXPECT_TRUE(
578 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
579 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
580 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
581 EXPECT_EQ("", config.rtp.c_name);
582 EXPECT_EQ(0u, config.rtp.extensions.size());
583 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
584 config.send_transport);
585}
586
587// Test that we can add a receive stream and that it has the correct defaults.
588TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
589 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -0700590 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg31fec402016-05-06 02:13:12 -0700591 const webrtc::AudioReceiveStream::Config& config =
592 GetRecvStreamConfig(kSsrc1);
593 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
594 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
595 EXPECT_FALSE(config.rtp.transport_cc);
596 EXPECT_EQ(0u, config.rtp.extensions.size());
597 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
598 config.rtcp_send_transport);
599 EXPECT_EQ("", config.sync_group);
600}
601
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000602// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700603// correctly (such that opus appears first).
ossudedfd282016-06-14 07:12:39 -0700604// TODO(ossu): This test should move into a separate builtin audio codecs
605// module.
deadbeef67cf2c12016-04-13 10:07:16 -0700606TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
ossudedfd282016-06-14 07:12:39 -0700607 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000608 ASSERT_FALSE(codecs.empty());
609 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
610 EXPECT_EQ(48000, codecs[0].clockrate);
611 EXPECT_EQ(2, codecs[0].channels);
612 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000613}
614
stefanba4c0e42016-02-04 04:12:24 -0800615TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
ossudedfd282016-06-14 07:12:39 -0700616 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -0800617 bool opus_found = false;
618 for (cricket::AudioCodec codec : codecs) {
619 if (codec.name == "opus") {
620 EXPECT_TRUE(HasTransportCc(codec));
621 opus_found = true;
622 }
623 }
624 EXPECT_TRUE(opus_found);
625}
626
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000627// Tests that we can find codecs by name or id, and that we interpret the
628// clockrate and bitrate fields properly.
629TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
630 cricket::AudioCodec codec;
631 webrtc::CodecInst codec_inst;
632 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800633 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000634 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800635 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000636 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800637 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
638 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000639 // Find ISAC with a different payload id.
640 codec = kIsacCodec;
641 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800642 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000643 EXPECT_EQ(codec.id, codec_inst.pltype);
644 // Find PCMU with a 0 clockrate.
645 codec = kPcmuCodec;
646 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800647 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 EXPECT_EQ(codec.id, codec_inst.pltype);
649 EXPECT_EQ(8000, codec_inst.plfreq);
650 // Find PCMU with a 0 bitrate.
651 codec = kPcmuCodec;
652 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800653 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654 EXPECT_EQ(codec.id, codec_inst.pltype);
655 EXPECT_EQ(64000, codec_inst.rate);
656 // Find ISAC with an explicit bitrate.
657 codec = kIsacCodec;
658 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800659 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000660 EXPECT_EQ(codec.id, codec_inst.pltype);
661 EXPECT_EQ(32000, codec_inst.rate);
662}
663
664// Test that we set our inbound codecs properly, including changing PT.
665TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700666 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200667 cricket::AudioRecvParameters parameters;
668 parameters.codecs.push_back(kIsacCodec);
669 parameters.codecs.push_back(kPcmuCodec);
670 parameters.codecs.push_back(kTelephoneEventCodec);
671 parameters.codecs[0].id = 106; // collide with existing telephone-event
672 parameters.codecs[2].id = 126;
673 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700674 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700675 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000676 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800677 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000678 gcodec.plfreq = 16000;
679 gcodec.channels = 1;
680 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
681 EXPECT_EQ(106, gcodec.pltype);
682 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800683 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000684 gcodec.plfreq = 8000;
685 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
686 EXPECT_EQ(126, gcodec.pltype);
687 EXPECT_STREQ("telephone-event", gcodec.plname);
688}
689
690// Test that we fail to set an unknown inbound codec.
691TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700692 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200693 cricket::AudioRecvParameters parameters;
694 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700695 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200696 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000697}
698
699// Test that we fail if we have duplicate types in the inbound list.
700TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700701 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200702 cricket::AudioRecvParameters parameters;
703 parameters.codecs.push_back(kIsacCodec);
704 parameters.codecs.push_back(kCn16000Codec);
705 parameters.codecs[1].id = kIsacCodec.id;
706 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000707}
708
709// Test that we can decode OPUS without stereo parameters.
710TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700711 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200712 cricket::AudioRecvParameters parameters;
713 parameters.codecs.push_back(kIsacCodec);
714 parameters.codecs.push_back(kPcmuCodec);
715 parameters.codecs.push_back(kOpusCodec);
716 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700717 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700718 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000719 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800720 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000721 // Even without stereo parameters, recv codecs still specify channels = 2.
722 EXPECT_EQ(2, opus.channels);
723 EXPECT_EQ(111, opus.pltype);
724 EXPECT_STREQ("opus", opus.plname);
725 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700726 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000727 EXPECT_EQ(111, opus.pltype);
728}
729
730// Test that we can decode OPUS with stereo = 0.
731TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700732 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200733 cricket::AudioRecvParameters parameters;
734 parameters.codecs.push_back(kIsacCodec);
735 parameters.codecs.push_back(kPcmuCodec);
736 parameters.codecs.push_back(kOpusCodec);
737 parameters.codecs[2].params["stereo"] = "0";
738 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700739 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000740 int channel_num2 = voe_.GetLastChannel();
741 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800742 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000743 // Even when stereo is off, recv codecs still specify channels = 2.
744 EXPECT_EQ(2, opus.channels);
745 EXPECT_EQ(111, opus.pltype);
746 EXPECT_STREQ("opus", opus.plname);
747 opus.pltype = 0;
748 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
749 EXPECT_EQ(111, opus.pltype);
750}
751
752// Test that we can decode OPUS with stereo = 1.
753TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700754 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200755 cricket::AudioRecvParameters parameters;
756 parameters.codecs.push_back(kIsacCodec);
757 parameters.codecs.push_back(kPcmuCodec);
758 parameters.codecs.push_back(kOpusCodec);
759 parameters.codecs[2].params["stereo"] = "1";
760 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700761 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000762 int channel_num2 = voe_.GetLastChannel();
763 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800764 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000765 EXPECT_EQ(2, opus.channels);
766 EXPECT_EQ(111, opus.pltype);
767 EXPECT_STREQ("opus", opus.plname);
768 opus.pltype = 0;
769 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
770 EXPECT_EQ(111, opus.pltype);
771}
772
773// Test that changes to recv codecs are applied to all streams.
774TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700775 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200776 cricket::AudioRecvParameters parameters;
777 parameters.codecs.push_back(kIsacCodec);
778 parameters.codecs.push_back(kPcmuCodec);
779 parameters.codecs.push_back(kTelephoneEventCodec);
780 parameters.codecs[0].id = 106; // collide with existing telephone-event
781 parameters.codecs[2].id = 126;
782 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700783 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000784 int channel_num2 = voe_.GetLastChannel();
785 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800786 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000787 gcodec.plfreq = 16000;
788 gcodec.channels = 1;
789 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
790 EXPECT_EQ(106, gcodec.pltype);
791 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800792 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000793 gcodec.plfreq = 8000;
794 gcodec.channels = 1;
795 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
796 EXPECT_EQ(126, gcodec.pltype);
797 EXPECT_STREQ("telephone-event", gcodec.plname);
798}
799
800TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700801 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200802 cricket::AudioRecvParameters parameters;
803 parameters.codecs.push_back(kIsacCodec);
804 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200805 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000806
807 int channel_num2 = voe_.GetLastChannel();
808 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800809 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000810 gcodec.plfreq = 16000;
811 gcodec.channels = 1;
812 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
813 EXPECT_EQ(106, gcodec.pltype);
814 EXPECT_STREQ("ISAC", gcodec.plname);
815}
816
817// Test that we can apply the same set of codecs again while playing.
818TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700819 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200820 cricket::AudioRecvParameters parameters;
821 parameters.codecs.push_back(kIsacCodec);
822 parameters.codecs.push_back(kCn16000Codec);
823 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700824 channel_->SetPlayout(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200825 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000826
827 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200828 parameters.codecs[0].id = 127;
829 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700830 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000831}
832
833// Test that we can add a codec while playing.
834TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700835 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200836 cricket::AudioRecvParameters parameters;
837 parameters.codecs.push_back(kIsacCodec);
838 parameters.codecs.push_back(kCn16000Codec);
839 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700840 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000841
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200842 parameters.codecs.push_back(kOpusCodec);
843 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700844 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000845 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800846 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000847 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
848}
849
850TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700851 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000852
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000853 // Test that when autobw is enabled, bitrate is kept as the default
854 // value. autobw is enabled for the following tests because the target
855 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000856
857 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700858 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000859
860 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700861 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000862
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000863 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700864 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000865}
866
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000867TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700868 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000869
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000870 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000871
872 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700873 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
874 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
875 // Rates above the max (56000) should be capped.
876 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000877
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000878 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700879 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
880 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
881 // Rates above the max (510000) should be capped.
882 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000883}
884
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000885TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700886 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000887
888 // Test that we can only set a maximum bitrate for a fixed-rate codec
889 // if it's bigger than the fixed rate.
890
891 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700892 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
893 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
894 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
895 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
896 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
897 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
898 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000899}
900
901TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700902 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200903 const int kDesiredBitrate = 128000;
904 cricket::AudioSendParameters parameters;
ossudedfd282016-06-14 07:12:39 -0700905 parameters.codecs = engine_->send_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200906 parameters.max_bandwidth_bps = kDesiredBitrate;
solenberg059fb442016-10-26 05:12:24 -0700907 SetSendParameters(parameters);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000908
909 EXPECT_TRUE(channel_->AddSendStream(
910 cricket::StreamParams::CreateLegacy(kSsrc1)));
911
minyue7a973442016-10-20 03:27:12 -0700912 EXPECT_EQ(kDesiredBitrate, GetCodecBitrate(kSsrc1));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000913}
914
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000915// Test that bitrate cannot be set for CBR codecs.
916// Bitrate is ignored if it is higher than the fixed bitrate.
917// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000918TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700919 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000920
921 // PCMU, default bitrate == 64000.
solenberg059fb442016-10-26 05:12:24 -0700922 SetSendParameters(send_parameters_);
minyue7a973442016-10-20 03:27:12 -0700923 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200924
925 send_parameters_.max_bandwidth_bps = 128000;
solenberg059fb442016-10-26 05:12:24 -0700926 SetSendParameters(send_parameters_);
minyue7a973442016-10-20 03:27:12 -0700927 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200928
929 send_parameters_.max_bandwidth_bps = 128;
930 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
minyue7a973442016-10-20 03:27:12 -0700931 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000932}
933
skvlade0d46372016-04-07 22:59:22 -0700934// Test that the per-stream bitrate limit and the global
935// bitrate limit both apply.
936TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
937 EXPECT_TRUE(SetupSendStream());
938
939 // opus, default bitrate == 64000.
940 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
941 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
942 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
943 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
944
945 // CBR codecs allow both maximums to exceed the bitrate.
946 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
947 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
948 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
949 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
950
951 // CBR codecs don't allow per stream maximums to be too low.
952 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
953 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
954}
955
956// Test that an attempt to set RtpParameters for a stream that does not exist
957// fails.
958TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
959 EXPECT_TRUE(SetupChannel());
960 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700961 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700962 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
963
964 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700965 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -0700966}
967
968TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700969 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -0700970 // This test verifies that setting RtpParameters succeeds only if
971 // the structure contains exactly one encoding.
972 // TODO(skvlad): Update this test when we start supporting setting parameters
973 // for each encoding individually.
974
975 EXPECT_TRUE(SetupSendStream());
976 // Setting RtpParameters with no encoding is expected to fail.
977 webrtc::RtpParameters parameters;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700978 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700979 // Setting RtpParameters with exactly one encoding should succeed.
980 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700981 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700982 // Two or more encodings should result in failure.
983 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700984 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -0700985}
986
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700987// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700988// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700989TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
990 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -0700991 SetSend(true);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700992 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
993 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700994 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700995 ASSERT_EQ(1u, parameters.encodings.size());
996 ASSERT_TRUE(parameters.encodings[0].active);
997 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700998 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -0700999 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
1000
1001 // Now change it back to active and verify we resume sending.
1002 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001003 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001004 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
1005}
1006
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001007// Test that SetRtpSendParameters configures the correct encoding channel for
1008// each SSRC.
skvlade0d46372016-04-07 22:59:22 -07001009TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
1010 SetupForMultiSendStream();
1011 // Create send streams.
1012 for (uint32_t ssrc : kSsrcs4) {
1013 EXPECT_TRUE(
1014 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
1015 }
1016 // Configure one stream to be limited by the stream config, another to be
1017 // limited by the global max, and the third one with no per-stream limit
1018 // (still subject to the global limit).
solenberg059fb442016-10-26 05:12:24 -07001019 SetGlobalMaxBitrate(kOpusCodec, 64000);
skvlade0d46372016-04-07 22:59:22 -07001020 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
1021 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
1022 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
1023
1024 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
1025 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
1026 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
1027
1028 // Remove the global cap; the streams should switch to their respective
1029 // maximums (or remain unchanged if there was no other limit on them.)
solenberg059fb442016-10-26 05:12:24 -07001030 SetGlobalMaxBitrate(kOpusCodec, -1);
skvlade0d46372016-04-07 22:59:22 -07001031 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
1032 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
1033 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
1034}
1035
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001036// Test that GetRtpSendParameters returns the currently configured codecs.
1037TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001038 EXPECT_TRUE(SetupSendStream());
1039 cricket::AudioSendParameters parameters;
1040 parameters.codecs.push_back(kIsacCodec);
1041 parameters.codecs.push_back(kPcmuCodec);
solenberg059fb442016-10-26 05:12:24 -07001042 SetSendParameters(parameters);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001043
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001044 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001045 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001046 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1047 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001048}
1049
1050// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001051TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001052 EXPECT_TRUE(SetupSendStream());
1053 cricket::AudioSendParameters parameters;
1054 parameters.codecs.push_back(kIsacCodec);
1055 parameters.codecs.push_back(kPcmuCodec);
solenberg059fb442016-10-26 05:12:24 -07001056 SetSendParameters(parameters);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001057
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001058 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001059
1060 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001061 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001062
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001063 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1064 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1065 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1066}
1067
1068// Test that GetRtpReceiveParameters returns the currently configured codecs.
1069TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1070 EXPECT_TRUE(SetupRecvStream());
1071 cricket::AudioRecvParameters parameters;
1072 parameters.codecs.push_back(kIsacCodec);
1073 parameters.codecs.push_back(kPcmuCodec);
1074 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1075
1076 webrtc::RtpParameters rtp_parameters =
1077 channel_->GetRtpReceiveParameters(kSsrc1);
1078 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1079 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1080 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1081}
1082
1083// Test that if we set/get parameters multiple times, we get the same results.
1084TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1085 EXPECT_TRUE(SetupRecvStream());
1086 cricket::AudioRecvParameters parameters;
1087 parameters.codecs.push_back(kIsacCodec);
1088 parameters.codecs.push_back(kPcmuCodec);
1089 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1090
1091 webrtc::RtpParameters initial_params =
1092 channel_->GetRtpReceiveParameters(kSsrc1);
1093
1094 // We should be able to set the params we just got.
1095 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1096
1097 // ... And this shouldn't change the params returned by
1098 // GetRtpReceiveParameters.
1099 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1100 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001101}
1102
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001103// Test that we apply codecs properly.
1104TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001105 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001106 cricket::AudioSendParameters parameters;
1107 parameters.codecs.push_back(kIsacCodec);
1108 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001109 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001110 parameters.codecs[0].id = 96;
1111 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001112 const int initial_num = call_.GetNumCreatedSendStreams();
solenberg059fb442016-10-26 05:12:24 -07001113 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001114 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
1115 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1116 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1117 EXPECT_EQ(48000, send_codec_spec.codec_inst.rate);
1118 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1119 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1120 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
1121 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001122 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001123}
1124
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001125// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1126// to apply.
1127TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001128 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001129 cricket::AudioSendParameters parameters;
1130 parameters.codecs.push_back(kIsacCodec);
1131 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001132 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001133 parameters.codecs[0].id = 96;
1134 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001135 const int initial_num = call_.GetNumCreatedSendStreams();
solenberg059fb442016-10-26 05:12:24 -07001136 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001137 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001138 // Calling SetSendCodec again with same codec which is already set.
1139 // In this case media channel shouldn't send codec to VoE.
solenberg059fb442016-10-26 05:12:24 -07001140 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001141 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001142}
1143
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001144// Verify that G722 is set with 16000 samples per second to WebRTC.
1145TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001146 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001147 cricket::AudioSendParameters parameters;
1148 parameters.codecs.push_back(kG722CodecSdp);
solenberg059fb442016-10-26 05:12:24 -07001149 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001150 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001151 EXPECT_STREQ("G722", gcodec.plname);
1152 EXPECT_EQ(1, gcodec.channels);
1153 EXPECT_EQ(16000, gcodec.plfreq);
1154}
1155
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001156// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001157TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001158 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001159 cricket::AudioSendParameters parameters;
1160 parameters.codecs.push_back(kOpusCodec);
1161 parameters.codecs[0].bitrate = 0;
1162 parameters.codecs[0].clockrate = 50000;
1163 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001164}
1165
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001166// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001167TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001168 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001169 cricket::AudioSendParameters parameters;
1170 parameters.codecs.push_back(kOpusCodec);
1171 parameters.codecs[0].bitrate = 0;
1172 parameters.codecs[0].channels = 0;
1173 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001174}
1175
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001176// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001177TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001178 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001179 cricket::AudioSendParameters parameters;
1180 parameters.codecs.push_back(kOpusCodec);
1181 parameters.codecs[0].bitrate = 0;
1182 parameters.codecs[0].channels = 0;
1183 parameters.codecs[0].params["stereo"] = "1";
1184 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001185}
1186
1187// Test that if channel is 1 for opus and there's no stereo, we fail.
1188TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001189 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001190 cricket::AudioSendParameters parameters;
1191 parameters.codecs.push_back(kOpusCodec);
1192 parameters.codecs[0].bitrate = 0;
1193 parameters.codecs[0].channels = 1;
1194 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001195}
1196
1197// Test that if channel is 1 for opus and stereo=0, we fail.
1198TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001199 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001200 cricket::AudioSendParameters parameters;
1201 parameters.codecs.push_back(kOpusCodec);
1202 parameters.codecs[0].bitrate = 0;
1203 parameters.codecs[0].channels = 1;
1204 parameters.codecs[0].params["stereo"] = "0";
1205 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001206}
1207
1208// Test that if channel is 1 for opus and stereo=1, we fail.
1209TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001210 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001211 cricket::AudioSendParameters parameters;
1212 parameters.codecs.push_back(kOpusCodec);
1213 parameters.codecs[0].bitrate = 0;
1214 parameters.codecs[0].channels = 1;
1215 parameters.codecs[0].params["stereo"] = "1";
1216 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001217}
1218
1219// Test that with bitrate=0 and no stereo,
1220// channels and bitrate are 1 and 32000.
1221TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001222 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001223 cricket::AudioSendParameters parameters;
1224 parameters.codecs.push_back(kOpusCodec);
1225 parameters.codecs[0].bitrate = 0;
solenberg059fb442016-10-26 05:12:24 -07001226 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001227 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001228}
1229
1230// Test that with bitrate=0 and stereo=0,
1231// channels and bitrate are 1 and 32000.
1232TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001233 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001234 cricket::AudioSendParameters parameters;
1235 parameters.codecs.push_back(kOpusCodec);
1236 parameters.codecs[0].bitrate = 0;
1237 parameters.codecs[0].params["stereo"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001238 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001239 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001240}
1241
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001242// Test that with bitrate=invalid and stereo=0,
1243// channels and bitrate are 1 and 32000.
1244TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001245 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001246 cricket::AudioSendParameters parameters;
1247 parameters.codecs.push_back(kOpusCodec);
1248 parameters.codecs[0].params["stereo"] = "0";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001249 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001250 parameters.codecs[0].bitrate = 5999;
solenberg059fb442016-10-26 05:12:24 -07001251 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001252 CheckSendCodec(kSsrc1, "opus", 1, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001253
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001254 parameters.codecs[0].bitrate = 510001;
solenberg059fb442016-10-26 05:12:24 -07001255 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001256 CheckSendCodec(kSsrc1, "opus", 1, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001257}
1258
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001259// Test that with bitrate=0 and stereo=1,
1260// channels and bitrate are 2 and 64000.
1261TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001262 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001263 cricket::AudioSendParameters parameters;
1264 parameters.codecs.push_back(kOpusCodec);
1265 parameters.codecs[0].bitrate = 0;
1266 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001267 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001268 CheckSendCodec(kSsrc1, "opus", 2, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001269}
1270
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001271// Test that with bitrate=invalid and stereo=1,
1272// channels and bitrate are 2 and 64000.
1273TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001274 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001275 cricket::AudioSendParameters parameters;
1276 parameters.codecs.push_back(kOpusCodec);
1277 parameters.codecs[0].params["stereo"] = "1";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001278 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001279 parameters.codecs[0].bitrate = 5999;
solenberg059fb442016-10-26 05:12:24 -07001280 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001281 CheckSendCodec(kSsrc1, "opus", 2, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001282
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001283 parameters.codecs[0].bitrate = 510001;
solenberg059fb442016-10-26 05:12:24 -07001284 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001285 CheckSendCodec(kSsrc1, "opus", 2, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001286}
1287
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001288// Test that with bitrate=N and stereo unset,
1289// channels and bitrate are 1 and N.
1290TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001291 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001292 cricket::AudioSendParameters parameters;
1293 parameters.codecs.push_back(kOpusCodec);
1294 parameters.codecs[0].bitrate = 96000;
solenberg059fb442016-10-26 05:12:24 -07001295 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001296 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001297 EXPECT_EQ(111, gcodec.pltype);
1298 EXPECT_EQ(96000, gcodec.rate);
1299 EXPECT_STREQ("opus", gcodec.plname);
1300 EXPECT_EQ(1, gcodec.channels);
1301 EXPECT_EQ(48000, gcodec.plfreq);
1302}
1303
1304// Test that with bitrate=N and stereo=0,
1305// channels and bitrate are 1 and N.
1306TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001307 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001308 cricket::AudioSendParameters parameters;
1309 parameters.codecs.push_back(kOpusCodec);
1310 parameters.codecs[0].bitrate = 30000;
1311 parameters.codecs[0].params["stereo"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001312 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001313 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001314}
1315
1316// Test that with bitrate=N and without any parameters,
1317// channels and bitrate are 1 and N.
1318TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001319 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001320 cricket::AudioSendParameters parameters;
1321 parameters.codecs.push_back(kOpusCodec);
1322 parameters.codecs[0].bitrate = 30000;
solenberg059fb442016-10-26 05:12:24 -07001323 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001324 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001325}
1326
1327// Test that with bitrate=N and stereo=1,
1328// channels and bitrate are 2 and N.
1329TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001330 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001331 cricket::AudioSendParameters parameters;
1332 parameters.codecs.push_back(kOpusCodec);
1333 parameters.codecs[0].bitrate = 30000;
1334 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001335 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001336 CheckSendCodec(kSsrc1, "opus", 2, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001337}
1338
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001339// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1340// Also test that the "maxaveragebitrate" can't be set to values outside the
1341// range of 6000 and 510000
1342TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001343 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001344 cricket::AudioSendParameters parameters;
1345 parameters.codecs.push_back(kOpusCodec);
1346 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001347 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001348 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
solenberg059fb442016-10-26 05:12:24 -07001349 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001350 EXPECT_EQ(6000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001351
1352 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001353 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
solenberg059fb442016-10-26 05:12:24 -07001354 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001355 EXPECT_EQ(510000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001356
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001357 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
solenberg059fb442016-10-26 05:12:24 -07001358 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001359 EXPECT_EQ(200000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001360}
1361
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001362// Test that we can enable NACK with opus as caller.
1363TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001364 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001365 cricket::AudioSendParameters parameters;
1366 parameters.codecs.push_back(kOpusCodec);
1367 parameters.codecs[0].AddFeedbackParam(
1368 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1369 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001370 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001371 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001372 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001373}
1374
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001375// Test that we can enable NACK with opus as callee.
1376TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001377 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001378 cricket::AudioSendParameters parameters;
1379 parameters.codecs.push_back(kOpusCodec);
1380 parameters.codecs[0].AddFeedbackParam(
1381 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1382 cricket::kParamValueEmpty));
solenberg8189b022016-06-14 12:13:00 -07001383 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001384 SetSendParameters(parameters);
deadbeefb56069e2016-05-06 04:57:03 -07001385 // NACK should be enabled even with no send stream.
solenberg8189b022016-06-14 12:13:00 -07001386 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001387
1388 EXPECT_TRUE(channel_->AddSendStream(
1389 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg971cab02016-06-14 10:02:41 -07001390 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001391}
1392
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001393// Test that we can enable NACK on receive streams.
1394TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001395 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001396 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001397 cricket::AudioSendParameters parameters;
1398 parameters.codecs.push_back(kOpusCodec);
1399 parameters.codecs[0].AddFeedbackParam(
1400 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1401 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001402 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001403 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001404 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001405 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001406 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001407}
1408
1409// Test that we can disable NACK.
1410TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001411 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001412 cricket::AudioSendParameters parameters;
1413 parameters.codecs.push_back(kOpusCodec);
1414 parameters.codecs[0].AddFeedbackParam(
1415 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1416 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001417 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001418 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001419
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001420 parameters.codecs.clear();
1421 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001422 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001423 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001424}
1425
1426// Test that we can disable NACK on receive streams.
1427TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001428 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001429 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001430 cricket::AudioSendParameters parameters;
1431 parameters.codecs.push_back(kOpusCodec);
1432 parameters.codecs[0].AddFeedbackParam(
1433 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1434 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001435 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001436 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001437 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001438
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001439 parameters.codecs.clear();
1440 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001441 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001442 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001443 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001444}
1445
1446// Test that NACK is enabled on a new receive stream.
1447TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001448 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001449 cricket::AudioSendParameters parameters;
1450 parameters.codecs.push_back(kIsacCodec);
1451 parameters.codecs.push_back(kCn16000Codec);
1452 parameters.codecs[0].AddFeedbackParam(
1453 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1454 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001455 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001456 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001457
solenberg8189b022016-06-14 12:13:00 -07001458 EXPECT_TRUE(AddRecvStream(kSsrc2));
1459 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
1460 EXPECT_TRUE(AddRecvStream(kSsrc3));
1461 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc3).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001462}
1463
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001464// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001465TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001466 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001467 cricket::AudioSendParameters parameters;
1468 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001469 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001470 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001471}
1472
1473// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001474TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001475 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001476 cricket::AudioSendParameters parameters;
1477 parameters.codecs.push_back(kOpusCodec);
1478 parameters.codecs[0].bitrate = 0;
1479 parameters.codecs[0].params["useinbandfec"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001480 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001481 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001482}
1483
1484// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001485TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001486 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001487 cricket::AudioSendParameters parameters;
1488 parameters.codecs.push_back(kOpusCodec);
1489 parameters.codecs[0].bitrate = 0;
1490 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001491 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001492 EXPECT_TRUE(GetCodecFec(kSsrc1));
1493 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001494}
1495
1496// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001497TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001498 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001499 cricket::AudioSendParameters parameters;
1500 parameters.codecs.push_back(kOpusCodec);
1501 parameters.codecs[0].bitrate = 0;
1502 parameters.codecs[0].params["stereo"] = "1";
1503 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001504 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001505 EXPECT_TRUE(GetCodecFec(kSsrc1));
1506 CheckSendCodec(kSsrc1, "opus", 2, 64000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001507}
1508
1509// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001510TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001511 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001512 cricket::AudioSendParameters parameters;
1513 parameters.codecs.push_back(kIsacCodec);
solenberg059fb442016-10-26 05:12:24 -07001514 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001515 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001516}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001517
1518// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1519TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001520 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001521 cricket::AudioSendParameters parameters;
1522 parameters.codecs.push_back(kIsacCodec);
1523 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001524 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001525 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001526}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001527
1528// Test that Opus FEC status can be changed.
1529TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001530 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001531 cricket::AudioSendParameters parameters;
1532 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001533 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001534 EXPECT_FALSE(GetCodecFec(kSsrc1));
1535
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001536 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001537 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001538 EXPECT_TRUE(GetCodecFec(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001539}
1540
stefanba4c0e42016-02-04 04:12:24 -08001541TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001542 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001543 cricket::AudioSendParameters send_parameters;
1544 send_parameters.codecs.push_back(kOpusCodec);
1545 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
solenberg059fb442016-10-26 05:12:24 -07001546 SetSendParameters(send_parameters);
stefanba4c0e42016-02-04 04:12:24 -08001547
1548 cricket::AudioRecvParameters recv_parameters;
1549 recv_parameters.codecs.push_back(kIsacCodec);
1550 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
solenberg8189b022016-06-14 12:13:00 -07001551 EXPECT_TRUE(AddRecvStream(kSsrc1));
stefanba4c0e42016-02-04 04:12:24 -08001552 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1553 EXPECT_FALSE(
1554 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1555
ossudedfd282016-06-14 07:12:39 -07001556 send_parameters.codecs = engine_->send_codecs();
solenberg059fb442016-10-26 05:12:24 -07001557 SetSendParameters(send_parameters);
stefanba4c0e42016-02-04 04:12:24 -08001558 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1559 EXPECT_TRUE(
1560 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1561}
1562
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001563// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1564TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001565 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001566 cricket::AudioSendParameters parameters;
1567 parameters.codecs.push_back(kOpusCodec);
1568 parameters.codecs[0].bitrate = 0;
1569 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
solenberg059fb442016-10-26 05:12:24 -07001570 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001571 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
1572 EXPECT_EQ(12000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001573
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001574 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001575 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001576 EXPECT_EQ(24000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001577}
1578
1579// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1580TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001581 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001582 cricket::AudioSendParameters parameters;
1583 parameters.codecs.push_back(kOpusCodec);
1584 parameters.codecs[0].bitrate = 0;
1585 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
solenberg059fb442016-10-26 05:12:24 -07001586 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001587 EXPECT_EQ(8001, GetOpusMaxPlaybackRate(kSsrc1));
1588 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001589
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001590 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001591 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001592 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001593}
1594
1595// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1596TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001597 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001598 cricket::AudioSendParameters parameters;
1599 parameters.codecs.push_back(kOpusCodec);
1600 parameters.codecs[0].bitrate = 0;
1601 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
solenberg059fb442016-10-26 05:12:24 -07001602 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001603 EXPECT_EQ(12001, GetOpusMaxPlaybackRate(kSsrc1));
1604 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001605
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001606 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001607 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001608 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001609}
1610
1611// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1612TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001613 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001614 cricket::AudioSendParameters parameters;
1615 parameters.codecs.push_back(kOpusCodec);
1616 parameters.codecs[0].bitrate = 0;
1617 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
solenberg059fb442016-10-26 05:12:24 -07001618 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001619 EXPECT_EQ(16001, GetOpusMaxPlaybackRate(kSsrc1));
1620 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001621
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001622 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001623 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001624 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001625}
1626
1627// Test 24000 < maxplaybackrate triggers Opus full band mode.
1628TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001629 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001630 cricket::AudioSendParameters parameters;
1631 parameters.codecs.push_back(kOpusCodec);
1632 parameters.codecs[0].bitrate = 0;
1633 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
solenberg059fb442016-10-26 05:12:24 -07001634 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001635 EXPECT_EQ(24001, GetOpusMaxPlaybackRate(kSsrc1));
1636 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001637
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001638 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001639 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001640 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001641}
1642
1643// Test Opus that without maxplaybackrate, default playback rate is used.
1644TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001645 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001646 cricket::AudioSendParameters parameters;
1647 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001648 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001649 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001650}
1651
1652// Test the with non-Opus, maxplaybackrate has no effect.
1653TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001654 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001655 cricket::AudioSendParameters parameters;
1656 parameters.codecs.push_back(kIsacCodec);
1657 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
solenberg059fb442016-10-26 05:12:24 -07001658 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001659 EXPECT_EQ(0, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001660}
1661
1662// Test maxplaybackrate can be set on two streams.
1663TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001664 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001665 cricket::AudioSendParameters parameters;
1666 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001667 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001668 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001669
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001670 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
solenberg059fb442016-10-26 05:12:24 -07001671 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001672 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001673
1674 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
minyue7a973442016-10-20 03:27:12 -07001675 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc2));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001676}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001677
Minyue Li7100dcd2015-03-27 05:05:59 +01001678// Test that with usedtx=0, Opus DTX is off.
1679TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001680 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001681 cricket::AudioSendParameters parameters;
1682 parameters.codecs.push_back(kOpusCodec);
1683 parameters.codecs[0].params["usedtx"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001684 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001685 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001686}
1687
1688// Test that with usedtx=1, Opus DTX is on.
1689TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001690 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001691 cricket::AudioSendParameters parameters;
1692 parameters.codecs.push_back(kOpusCodec);
1693 parameters.codecs[0].params["usedtx"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001694 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001695 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001696}
1697
1698// Test that usedtx=1 works with stereo Opus.
1699TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001700 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001701 cricket::AudioSendParameters parameters;
1702 parameters.codecs.push_back(kOpusCodec);
1703 parameters.codecs[0].params["usedtx"] = "1";
1704 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001705 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001706 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001707}
1708
1709// Test that usedtx=1 does not work with non Opus.
1710TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001711 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001712 cricket::AudioSendParameters parameters;
1713 parameters.codecs.push_back(kIsacCodec);
1714 parameters.codecs[0].params["usedtx"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001715 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001716 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001717}
1718
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001719// Test that we can switch back and forth between Opus and ISAC with CN.
1720TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001721 EXPECT_TRUE(SetupSendStream());
minyue7a973442016-10-20 03:27:12 -07001722
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001723 cricket::AudioSendParameters opus_parameters;
1724 opus_parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001725 SetSendParameters(opus_parameters);
minyue7a973442016-10-20 03:27:12 -07001726 {
1727 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1728 EXPECT_EQ(111, gcodec.pltype);
1729 EXPECT_STREQ("opus", gcodec.plname);
1730 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001731
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001732 cricket::AudioSendParameters isac_parameters;
1733 isac_parameters.codecs.push_back(kIsacCodec);
1734 isac_parameters.codecs.push_back(kCn16000Codec);
1735 isac_parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001736 SetSendParameters(isac_parameters);
minyue7a973442016-10-20 03:27:12 -07001737 {
1738 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1739 EXPECT_EQ(103, gcodec.pltype);
1740 EXPECT_STREQ("ISAC", gcodec.plname);
1741 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001742
solenberg059fb442016-10-26 05:12:24 -07001743 SetSendParameters(opus_parameters);
minyue7a973442016-10-20 03:27:12 -07001744 {
1745 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1746 EXPECT_EQ(111, gcodec.pltype);
1747 EXPECT_STREQ("opus", gcodec.plname);
1748 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001749}
1750
1751// Test that we handle various ways of specifying bitrate.
1752TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001753 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001754 cricket::AudioSendParameters parameters;
1755 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
solenberg059fb442016-10-26 05:12:24 -07001756 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001757 {
1758 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1759 EXPECT_EQ(103, gcodec.pltype);
1760 EXPECT_STREQ("ISAC", gcodec.plname);
1761 EXPECT_EQ(32000, gcodec.rate);
1762 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001763
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001764 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001765 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001766 {
1767 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1768 EXPECT_EQ(103, gcodec.pltype);
1769 EXPECT_STREQ("ISAC", gcodec.plname);
1770 EXPECT_EQ(-1, gcodec.rate);
1771 }
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001772 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
solenberg059fb442016-10-26 05:12:24 -07001773 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001774 {
1775 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1776 EXPECT_EQ(103, gcodec.pltype);
1777 EXPECT_STREQ("ISAC", gcodec.plname);
1778 EXPECT_EQ(28000, gcodec.rate);
1779 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001780
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001781 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
solenberg059fb442016-10-26 05:12:24 -07001782 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001783 {
1784 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1785 EXPECT_EQ(0, gcodec.pltype);
1786 EXPECT_STREQ("PCMU", gcodec.plname);
1787 EXPECT_EQ(64000, gcodec.rate);
1788 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001789
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001790 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001791 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001792 {
1793 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1794 EXPECT_EQ(0, gcodec.pltype);
1795 EXPECT_STREQ("PCMU", gcodec.plname);
1796 EXPECT_EQ(64000, gcodec.rate);
1797 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001798
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001799 parameters.codecs[0] = kOpusCodec;
1800 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001801 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001802 {
1803 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1804 EXPECT_EQ(111, gcodec.pltype);
1805 EXPECT_STREQ("opus", gcodec.plname);
1806 EXPECT_EQ(32000, gcodec.rate);
1807 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001808}
1809
Brave Yao5225dd82015-03-26 07:39:19 +08001810// Test that we could set packet size specified in kCodecParamPTime.
1811TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001812 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001813 cricket::AudioSendParameters parameters;
1814 parameters.codecs.push_back(kOpusCodec);
1815 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
solenberg059fb442016-10-26 05:12:24 -07001816 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001817 EXPECT_EQ(1920, GetCodecPacSize(kSsrc1)); // Opus gets 40ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001818
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001819 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
solenberg059fb442016-10-26 05:12:24 -07001820 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001821 EXPECT_EQ(480, GetCodecPacSize(kSsrc1)); // Opus gets 10ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001822
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001823 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
solenberg059fb442016-10-26 05:12:24 -07001824 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001825 EXPECT_EQ(2880, GetCodecPacSize(kSsrc1)); // Opus gets 60ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001826
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001827 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1828 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
solenberg059fb442016-10-26 05:12:24 -07001829 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001830 EXPECT_EQ(480, GetCodecPacSize(
1831 kSsrc1)); // Isac gets 30ms as the next smallest value.
Brave Yao5225dd82015-03-26 07:39:19 +08001832
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001833 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1834 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
solenberg059fb442016-10-26 05:12:24 -07001835 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001836 EXPECT_EQ(640, GetCodecPacSize(
1837 kSsrc1)); // G722 gets 40ms @16kHz as defined in VoE.
Brave Yao5225dd82015-03-26 07:39:19 +08001838}
1839
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001840// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001841TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001842 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001843 cricket::AudioSendParameters parameters;
1844 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001845}
1846
1847// Test that we can set send codecs even with telephone-event codec as the first
1848// one on the list.
1849TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001850 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001851 cricket::AudioSendParameters parameters;
1852 parameters.codecs.push_back(kTelephoneEventCodec);
1853 parameters.codecs.push_back(kIsacCodec);
1854 parameters.codecs.push_back(kPcmuCodec);
1855 parameters.codecs[0].id = 98; // DTMF
1856 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001857 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001858 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001859 EXPECT_EQ(96, gcodec.pltype);
1860 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001861 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001862}
1863
solenberg31642aa2016-03-14 08:00:37 -07001864// Test that payload type range is limited for telephone-event codec.
1865TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001866 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001867 cricket::AudioSendParameters parameters;
1868 parameters.codecs.push_back(kTelephoneEventCodec);
1869 parameters.codecs.push_back(kIsacCodec);
1870 parameters.codecs[0].id = 0; // DTMF
1871 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001872 SetSendParameters(parameters);
solenberg31642aa2016-03-14 08:00:37 -07001873 EXPECT_TRUE(channel_->CanInsertDtmf());
1874 parameters.codecs[0].id = 128; // DTMF
1875 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1876 EXPECT_FALSE(channel_->CanInsertDtmf());
1877 parameters.codecs[0].id = 127;
solenberg059fb442016-10-26 05:12:24 -07001878 SetSendParameters(parameters);
solenberg31642aa2016-03-14 08:00:37 -07001879 EXPECT_TRUE(channel_->CanInsertDtmf());
1880 parameters.codecs[0].id = -1; // DTMF
1881 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1882 EXPECT_FALSE(channel_->CanInsertDtmf());
1883}
1884
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001885// Test that we can set send codecs even with CN codec as the first
1886// one on the list.
1887TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001888 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001889 cricket::AudioSendParameters parameters;
1890 parameters.codecs.push_back(kCn16000Codec);
1891 parameters.codecs.push_back(kIsacCodec);
1892 parameters.codecs.push_back(kPcmuCodec);
1893 parameters.codecs[0].id = 98; // wideband CN
1894 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001895 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001896 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1897 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1898 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1899 EXPECT_EQ(98, send_codec_spec.cng_payload_type);
1900 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001901}
1902
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001903// Test that we set VAD and DTMF types correctly as caller.
1904TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001905 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001906 cricket::AudioSendParameters parameters;
1907 parameters.codecs.push_back(kIsacCodec);
1908 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001909 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001910 parameters.codecs.push_back(kCn16000Codec);
1911 parameters.codecs.push_back(kCn8000Codec);
1912 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001913 parameters.codecs[0].id = 96;
1914 parameters.codecs[2].id = 97; // wideband CN
1915 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07001916 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001917 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1918 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1919 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1920 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1921 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1922 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1923 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001924 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001925}
1926
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001927// Test that we set VAD and DTMF types correctly as callee.
1928TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001929 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001930 cricket::AudioSendParameters parameters;
1931 parameters.codecs.push_back(kIsacCodec);
1932 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001933 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001934 parameters.codecs.push_back(kCn16000Codec);
1935 parameters.codecs.push_back(kCn8000Codec);
1936 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001937 parameters.codecs[0].id = 96;
1938 parameters.codecs[2].id = 97; // wideband CN
1939 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07001940 SetSendParameters(parameters);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001941 EXPECT_TRUE(channel_->AddSendStream(
1942 cricket::StreamParams::CreateLegacy(kSsrc1)));
1943
minyue7a973442016-10-20 03:27:12 -07001944 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1945 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1946 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1947 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1948 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1949 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1950 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001951 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001952}
1953
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001954// Test that we only apply VAD if we have a CN codec that matches the
1955// send codec clockrate.
1956TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07001957 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001958 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001959 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001960 parameters.codecs.push_back(kIsacCodec);
1961 parameters.codecs.push_back(kCn16000Codec);
1962 parameters.codecs[1].id = 97;
solenberg059fb442016-10-26 05:12:24 -07001963 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001964 {
1965 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1966 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1967 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1968 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1969 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
1970 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
1971 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001972 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001973 parameters.codecs[0] = kPcmuCodec;
solenberg059fb442016-10-26 05:12:24 -07001974 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001975 {
1976 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1977 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
1978 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1979 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001980 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001981 parameters.codecs[1] = kCn8000Codec;
solenberg059fb442016-10-26 05:12:24 -07001982 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001983 {
1984 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1985 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
1986 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
1987 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1988 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
1989 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
1990 }
Brave Yao5225dd82015-03-26 07:39:19 +08001991 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001992 parameters.codecs[0] = kIsacCodec;
solenberg059fb442016-10-26 05:12:24 -07001993 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001994 {
1995 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1996 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1997 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1998 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001999}
2000
2001// Test that we perform case-insensitive matching of codec names.
2002TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002003 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002004 cricket::AudioSendParameters parameters;
2005 parameters.codecs.push_back(kIsacCodec);
2006 parameters.codecs.push_back(kPcmuCodec);
2007 parameters.codecs.push_back(kCn16000Codec);
2008 parameters.codecs.push_back(kCn8000Codec);
2009 parameters.codecs.push_back(kTelephoneEventCodec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002010 parameters.codecs[0].name = "iSaC";
2011 parameters.codecs[0].id = 96;
2012 parameters.codecs[2].id = 97; // wideband CN
2013 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07002014 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002015 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2016 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2017 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2018 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2019 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2020 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2021 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002022 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002023}
2024
stefanba4c0e42016-02-04 04:12:24 -08002025class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2026 public:
2027 WebRtcVoiceEngineWithSendSideBweTest()
2028 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2029};
2030
2031TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2032 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002033 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002034 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07002035 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
2036 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
2037 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08002038 extension.id);
2039 return;
2040 }
2041 }
2042 FAIL() << "Transport sequence number extension not in header-extension list.";
2043}
2044
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002045// Test support for audio level header extension.
2046TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002047 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002048}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002049TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002050 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002051}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002052
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002053// Test support for absolute send time header extension.
2054TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002055 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002056}
2057TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002058 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002059}
2060
solenberg1ac56142015-10-13 03:58:19 -07002061// Test that we can create a channel and start sending on it.
2062TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002063 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002064 SetSendParameters(send_parameters_);
2065 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002066 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002067 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002068 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2069}
2070
2071// Test that a channel will send if and only if it has a source and is enabled
2072// for sending.
2073TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002074 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002075 SetSendParameters(send_parameters_);
2076 SetAudioSend(kSsrc1, true, nullptr);
2077 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002078 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002079 SetAudioSend(kSsrc1, true, &fake_source_);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002080 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002081 SetAudioSend(kSsrc1, true, nullptr);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002082 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002083}
2084
solenberg94218532016-06-16 10:53:22 -07002085// Test that a channel is muted/unmuted.
2086TEST_F(WebRtcVoiceEngineTestFake, SendStateMuteUnmute) {
2087 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002088 SetSendParameters(send_parameters_);
solenberg94218532016-06-16 10:53:22 -07002089 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
solenberg059fb442016-10-26 05:12:24 -07002090 SetAudioSend(kSsrc1, true, nullptr);
solenberg94218532016-06-16 10:53:22 -07002091 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
solenberg059fb442016-10-26 05:12:24 -07002092 SetAudioSend(kSsrc1, false, nullptr);
solenberg94218532016-06-16 10:53:22 -07002093 EXPECT_TRUE(GetSendStream(kSsrc1).muted());
2094}
2095
solenberg6d6e7c52016-04-13 09:07:30 -07002096// Test that SetSendParameters() does not alter a stream's send state.
2097TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2098 EXPECT_TRUE(SetupSendStream());
2099 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2100
2101 // Turn on sending.
solenberg059fb442016-10-26 05:12:24 -07002102 SetSend(true);
solenberg6d6e7c52016-04-13 09:07:30 -07002103 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2104
2105 // Changing RTP header extensions will recreate the AudioSendStream.
2106 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002107 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg059fb442016-10-26 05:12:24 -07002108 SetSendParameters(send_parameters_);
solenberg6d6e7c52016-04-13 09:07:30 -07002109 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2110
2111 // Turn off sending.
solenberg059fb442016-10-26 05:12:24 -07002112 SetSend(false);
solenberg6d6e7c52016-04-13 09:07:30 -07002113 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2114
2115 // Changing RTP header extensions will recreate the AudioSendStream.
2116 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -07002117 SetSendParameters(send_parameters_);
solenberg6d6e7c52016-04-13 09:07:30 -07002118 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2119}
2120
solenberg1ac56142015-10-13 03:58:19 -07002121// Test that we can create a channel and start playing out on it.
2122TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002123 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002124 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
aleloi84ef6152016-08-04 05:28:21 -07002125 channel_->SetPlayout(true);
2126 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
2127 channel_->SetPlayout(false);
2128 EXPECT_FALSE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002129}
2130
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002131// Test that we can add and remove send streams.
2132TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2133 SetupForMultiSendStream();
2134
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002135 // Set the global state for sending.
solenberg059fb442016-10-26 05:12:24 -07002136 SetSend(true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002137
solenbergc96df772015-10-21 13:01:53 -07002138 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002139 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002140 cricket::StreamParams::CreateLegacy(ssrc)));
solenberg059fb442016-10-26 05:12:24 -07002141 SetAudioSend(ssrc, true, &fake_source_);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002142 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002143 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002144 }
tfarina5237aaf2015-11-10 23:44:30 -08002145 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002146
solenbergc96df772015-10-21 13:01:53 -07002147 // Delete the send streams.
2148 for (uint32_t ssrc : kSsrcs4) {
2149 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002150 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002151 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002152 }
solenbergc96df772015-10-21 13:01:53 -07002153 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002154}
2155
2156// Test SetSendCodecs correctly configure the codecs in all send streams.
2157TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2158 SetupForMultiSendStream();
2159
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002160 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002161 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002162 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002163 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002164 }
2165
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002166 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002167 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002168 parameters.codecs.push_back(kIsacCodec);
2169 parameters.codecs.push_back(kCn16000Codec);
2170 parameters.codecs[1].id = 97;
solenberg059fb442016-10-26 05:12:24 -07002171 SetSendParameters(parameters);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002172
2173 // Verify ISAC and VAD are corrected configured on all send channels.
solenbergc96df772015-10-21 13:01:53 -07002174 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002175 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2176 const auto& send_codec_spec =
2177 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2178 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2179 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2180 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2181 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2182 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002183 }
2184
minyue7a973442016-10-20 03:27:12 -07002185 // Change to PCMU(8K) and CN(16K).
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002186 parameters.codecs[0] = kPcmuCodec;
solenberg059fb442016-10-26 05:12:24 -07002187 SetSendParameters(parameters);
solenbergc96df772015-10-21 13:01:53 -07002188 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002189 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2190 const auto& send_codec_spec =
2191 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2192 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2193 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2194 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2195 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002196 }
2197}
2198
2199// Test we can SetSend on all send streams correctly.
2200TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2201 SetupForMultiSendStream();
2202
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002203 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002204 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002205 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002206 cricket::StreamParams::CreateLegacy(ssrc)));
solenberg059fb442016-10-26 05:12:24 -07002207 SetAudioSend(ssrc, true, &fake_source_);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002208 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002209 }
2210
2211 // Set the global state for starting sending.
solenberg059fb442016-10-26 05:12:24 -07002212 SetSend(true);
solenbergc96df772015-10-21 13:01:53 -07002213 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002214 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002215 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002216 }
2217
2218 // Set the global state for stopping sending.
solenberg059fb442016-10-26 05:12:24 -07002219 SetSend(false);
solenbergc96df772015-10-21 13:01:53 -07002220 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002221 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002222 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002223 }
2224}
2225
2226// Test we can set the correct statistics on all send streams.
2227TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2228 SetupForMultiSendStream();
2229
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002230 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002231 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002232 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002233 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002234 }
solenberg85a04962015-10-27 03:35:21 -07002235
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002236 // Create a receive stream to check that none of the send streams end up in
2237 // the receive stream stats.
solenberg8189b022016-06-14 12:13:00 -07002238 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg971cab02016-06-14 10:02:41 -07002239
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002240 // We need send codec to be set to get all stats.
solenberg059fb442016-10-26 05:12:24 -07002241 SetSendParameters(send_parameters_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002242 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002243 SetAudioSendStreamStats();
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002244
solenberg85a04962015-10-27 03:35:21 -07002245 // Check stats for the added streams.
2246 {
2247 cricket::VoiceMediaInfo info;
2248 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002249
solenberg85a04962015-10-27 03:35:21 -07002250 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002251 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002252 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002253 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002254 }
2255
2256 // We have added one receive stream. We should see empty stats.
2257 EXPECT_EQ(info.receivers.size(), 1u);
2258 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002259 }
solenberg1ac56142015-10-13 03:58:19 -07002260
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002261 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002262 {
2263 cricket::VoiceMediaInfo info;
2264 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2265 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002266 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002267 EXPECT_EQ(0u, info.receivers.size());
2268 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002269
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002270 // Deliver a new packet - a default receive stream should be created and we
2271 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002272 {
2273 cricket::VoiceMediaInfo info;
2274 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2275 SetAudioReceiveStreamStats();
2276 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002277 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002278 EXPECT_EQ(1u, info.receivers.size());
2279 VerifyVoiceReceiverInfo(info.receivers[0]);
2280 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002281}
2282
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002283// Test that we can add and remove receive streams, and do proper send/playout.
2284// We can receive on multiple streams while sending one stream.
2285TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002286 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002287
solenberg1ac56142015-10-13 03:58:19 -07002288 // Start playout without a receive stream.
solenberg059fb442016-10-26 05:12:24 -07002289 SetSendParameters(send_parameters_);
aleloi84ef6152016-08-04 05:28:21 -07002290 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002291
solenberg1ac56142015-10-13 03:58:19 -07002292 // Adding another stream should enable playout on the new stream only.
solenberg8189b022016-06-14 12:13:00 -07002293 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg059fb442016-10-26 05:12:24 -07002294 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002295 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002296
solenberg1ac56142015-10-13 03:58:19 -07002297 // Make sure only the new stream is played out.
aleloi84ef6152016-08-04 05:28:21 -07002298 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002299
2300 // Adding yet another stream should have stream 2 and 3 enabled for playout.
solenberg8189b022016-06-14 12:13:00 -07002301 EXPECT_TRUE(AddRecvStream(kSsrc3));
aleloi84ef6152016-08-04 05:28:21 -07002302 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2303 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002304
2305 // Stop sending.
solenberg059fb442016-10-26 05:12:24 -07002306 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002307 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002308
2309 // Stop playout.
aleloi84ef6152016-08-04 05:28:21 -07002310 channel_->SetPlayout(false);
2311 EXPECT_FALSE(GetRecvStream(kSsrc2).started());
2312 EXPECT_FALSE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002313
aleloi84ef6152016-08-04 05:28:21 -07002314 // Restart playout and make sure recv streams are played out.
2315 channel_->SetPlayout(true);
2316 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2317 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002318
aleloi84ef6152016-08-04 05:28:21 -07002319 // Now remove the recv streams.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002320 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2321 EXPECT_TRUE(channel_->RemoveRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002322}
2323
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002324// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002325// and start sending on it.
2326TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002327 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002328 cricket::AudioOptions options_adjust_agc;
2329 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002330 webrtc::AgcConfig agc_config;
2331 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2332 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002333 send_parameters_.options = options_adjust_agc;
solenberg059fb442016-10-26 05:12:24 -07002334 SetSendParameters(send_parameters_);
2335 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002336 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002337 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2338 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenberg059fb442016-10-26 05:12:24 -07002339 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002340 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002341 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002342}
2343
wu@webrtc.org97077a32013-10-25 21:18:33 +00002344TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002345 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002346 EXPECT_CALL(adm_,
2347 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002348 webrtc::AgcConfig agc_config;
2349 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2350 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002351 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2352 send_parameters_.options.tx_agc_digital_compression_gain =
2353 rtc::Optional<uint16_t>(9);
2354 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2355 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002356 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002357 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2358 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2359 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2360 EXPECT_TRUE(agc_config.limiterEnable);
2361
2362 // Check interaction with adjust_agc_delta. Both should be respected, for
2363 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002364 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
solenberg059fb442016-10-26 05:12:24 -07002365 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002366 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2367 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2368}
2369
wu@webrtc.org97077a32013-10-25 21:18:33 +00002370TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002371 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002372 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2373 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002374 send_parameters_.options.recording_sample_rate =
2375 rtc::Optional<uint32_t>(48000);
2376 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
solenberg059fb442016-10-26 05:12:24 -07002377 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002378}
2379
minyue6b825df2016-10-31 04:08:32 -07002380TEST_F(WebRtcVoiceEngineTestFake, SetAudioNetworkAdaptorViaOptions) {
2381 EXPECT_TRUE(SetupSendStream());
2382 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2383 send_parameters_.options.audio_network_adaptor_config =
2384 rtc::Optional<std::string>("1234");
2385 SetSendParameters(send_parameters_);
2386 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2387 GetAudioNetworkAdaptorConfig(kSsrc1));
2388}
2389
2390TEST_F(WebRtcVoiceEngineTestFake, AudioSendResetAudioNetworkAdaptor) {
2391 EXPECT_TRUE(SetupSendStream());
2392 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2393 send_parameters_.options.audio_network_adaptor_config =
2394 rtc::Optional<std::string>("1234");
2395 SetSendParameters(send_parameters_);
2396 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2397 GetAudioNetworkAdaptorConfig(kSsrc1));
2398 const int initial_num = call_.GetNumCreatedSendStreams();
2399 cricket::AudioOptions options;
2400 options.audio_network_adaptor = rtc::Optional<bool>(false);
2401 SetAudioSend(kSsrc1, true, nullptr, &options);
2402 // AudioSendStream expected to be recreated.
2403 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
2404 EXPECT_EQ(rtc::Optional<std::string>(), GetAudioNetworkAdaptorConfig(kSsrc1));
2405}
2406
2407TEST_F(WebRtcVoiceEngineTestFake, AudioNetworkAdaptorNotGetOverridden) {
2408 EXPECT_TRUE(SetupSendStream());
2409 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2410 send_parameters_.options.audio_network_adaptor_config =
2411 rtc::Optional<std::string>("1234");
2412 SetSendParameters(send_parameters_);
2413 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2414 GetAudioNetworkAdaptorConfig(kSsrc1));
2415 const int initial_num = call_.GetNumCreatedSendStreams();
2416 cricket::AudioOptions options;
2417 options.audio_network_adaptor = rtc::Optional<bool>();
2418 // Unvalued |options.audio_network_adaptor|.should not reset audio network
2419 // adaptor.
2420 SetAudioSend(kSsrc1, true, nullptr, &options);
2421 // AudioSendStream not expected to be recreated.
2422 EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
2423 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2424 GetAudioNetworkAdaptorConfig(kSsrc1));
2425}
2426
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002427// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002428// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002429TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002430 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002431 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002432}
2433
2434TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2435 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002436 EXPECT_TRUE(SetupSendStream());
solenbergff976312016-03-30 23:28:51 -07002437 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002438 // stream has to use a different SSRC.
solenberg8189b022016-06-14 12:13:00 -07002439 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg059fb442016-10-26 05:12:24 -07002440 SetSendParameters(send_parameters_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002441 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002442 SetAudioSendStreamStats();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002443
solenberg85a04962015-10-27 03:35:21 -07002444 // Check stats for the added streams.
2445 {
2446 cricket::VoiceMediaInfo info;
2447 EXPECT_EQ(true, channel_->GetStats(&info));
2448
2449 // We have added one send stream. We should see the stats we've set.
2450 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002451 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002452 // We have added one receive stream. We should see empty stats.
2453 EXPECT_EQ(info.receivers.size(), 1u);
2454 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2455 }
solenberg1ac56142015-10-13 03:58:19 -07002456
solenberg566ef242015-11-06 15:34:49 -08002457 // Start sending - this affects some reported stats.
2458 {
2459 cricket::VoiceMediaInfo info;
solenberg059fb442016-10-26 05:12:24 -07002460 SetSend(true);
solenberg566ef242015-11-06 15:34:49 -08002461 EXPECT_EQ(true, channel_->GetStats(&info));
2462 VerifyVoiceSenderInfo(info.senders[0], true);
2463 }
2464
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002465 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002466 {
2467 cricket::VoiceMediaInfo info;
2468 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2469 EXPECT_EQ(true, channel_->GetStats(&info));
2470 EXPECT_EQ(1u, info.senders.size());
2471 EXPECT_EQ(0u, info.receivers.size());
2472 }
solenberg1ac56142015-10-13 03:58:19 -07002473
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002474 // Deliver a new packet - a default receive stream should be created and we
2475 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002476 {
2477 cricket::VoiceMediaInfo info;
2478 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2479 SetAudioReceiveStreamStats();
2480 EXPECT_EQ(true, channel_->GetStats(&info));
2481 EXPECT_EQ(1u, info.senders.size());
2482 EXPECT_EQ(1u, info.receivers.size());
2483 VerifyVoiceReceiverInfo(info.receivers[0]);
2484 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002485}
2486
2487// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002488// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002489TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002490 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002491 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg8189b022016-06-14 12:13:00 -07002492 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -08002493 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002494}
2495
2496// Test that the local SSRC is the same on sending and receiving channels if the
2497// receive channel is created before the send channel.
2498TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002499 EXPECT_TRUE(SetupChannel());
solenberg4a0f7b52016-06-16 13:07:33 -07002500 EXPECT_TRUE(AddRecvStream(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002501 EXPECT_TRUE(channel_->AddSendStream(
solenberg4a0f7b52016-06-16 13:07:33 -07002502 cricket::StreamParams::CreateLegacy(kSsrc1)));
2503 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
2504 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002505}
2506
2507// Test that we can properly receive packets.
2508TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002509 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002510 EXPECT_TRUE(AddRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002511 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002512
2513 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2514 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002515}
2516
2517// Test that we can properly receive packets on multiple streams.
2518TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002519 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002520 const uint32_t ssrc1 = 1;
2521 const uint32_t ssrc2 = 2;
2522 const uint32_t ssrc3 = 3;
solenberg8189b022016-06-14 12:13:00 -07002523 EXPECT_TRUE(AddRecvStream(ssrc1));
2524 EXPECT_TRUE(AddRecvStream(ssrc2));
2525 EXPECT_TRUE(AddRecvStream(ssrc3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002526 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002527 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002528 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002529 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002530 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002531 }
mflodman3d7db262016-04-29 00:57:13 -07002532
2533 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2534 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2535 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2536
2537 EXPECT_EQ(s1.received_packets(), 0);
2538 EXPECT_EQ(s2.received_packets(), 0);
2539 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002540
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002541 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002542 EXPECT_EQ(s1.received_packets(), 0);
2543 EXPECT_EQ(s2.received_packets(), 0);
2544 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002545
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002546 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002547 EXPECT_EQ(s1.received_packets(), 1);
2548 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2549 EXPECT_EQ(s2.received_packets(), 0);
2550 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002551
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002552 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002553 EXPECT_EQ(s1.received_packets(), 1);
2554 EXPECT_EQ(s2.received_packets(), 1);
2555 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2556 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002557
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002558 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002559 EXPECT_EQ(s1.received_packets(), 1);
2560 EXPECT_EQ(s2.received_packets(), 1);
2561 EXPECT_EQ(s3.received_packets(), 1);
2562 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002563
mflodman3d7db262016-04-29 00:57:13 -07002564 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2565 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2566 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002567}
2568
solenberg7e63ef02015-11-20 00:19:43 -08002569// Test that receiving on an unsignalled stream works (default channel will be
2570// created).
2571TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002572 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002573 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2574
solenberg7e63ef02015-11-20 00:19:43 -08002575 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002576
2577 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2578 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2579 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002580}
2581
2582// Test that receiving on an unsignalled stream works (default channel will be
2583// created), and that packets will be forwarded to the default channel
2584// regardless of their SSRCs.
2585TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002586 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002587 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002588 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2589
mflodman3d7db262016-04-29 00:57:13 -07002590 // Note that ssrc = 0 is not supported.
2591 uint32_t ssrc = 1;
2592 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002593 rtc::SetBE32(&packet[8], ssrc);
2594 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002595
2596 // Verify we only have one default stream.
2597 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2598 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2599 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002600 }
mflodman3d7db262016-04-29 00:57:13 -07002601
2602 // Sending the same ssrc again should not create a new stream.
2603 --ssrc;
2604 DeliverPacket(packet, sizeof(packet));
2605 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2606 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2607 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002608}
2609
2610// Test that a default channel is created even after a signalled stream has been
2611// added, and that this stream will get any packets for unknown SSRCs.
2612TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002613 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002614 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002615 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2616
2617 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002618 const uint32_t signaled_ssrc = 1;
2619 rtc::SetBE32(&packet[8], signaled_ssrc);
solenberg8189b022016-06-14 12:13:00 -07002620 EXPECT_TRUE(AddRecvStream(signaled_ssrc));
solenberg7e63ef02015-11-20 00:19:43 -08002621 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002622 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2623 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002624
2625 // Note that the first unknown SSRC cannot be 0, because we only support
2626 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002627 const uint32_t unsignaled_ssrc = 7011;
2628 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002629 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002630 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2631 packet, sizeof(packet)));
2632 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2633
2634 DeliverPacket(packet, sizeof(packet));
2635 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2636
2637 rtc::SetBE32(&packet[8], signaled_ssrc);
2638 DeliverPacket(packet, sizeof(packet));
2639 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2640 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002641}
2642
solenberg0a617e22015-10-20 15:49:38 -07002643// Test that we properly handle failures to add a receive stream.
2644TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002645 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002646 voe_.set_fail_create_channel(true);
solenberg8189b022016-06-14 12:13:00 -07002647 EXPECT_FALSE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002648}
2649
solenberg0a617e22015-10-20 15:49:38 -07002650// Test that we properly handle failures to add a send stream.
2651TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002652 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002653 voe_.set_fail_create_channel(true);
2654 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2655}
2656
solenberg1ac56142015-10-13 03:58:19 -07002657// Test that AddRecvStream creates new stream.
2658TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002659 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002660 int channel_num = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07002661 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002662 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002663}
2664
2665// Test that after adding a recv stream, we do not decode more codecs than
2666// those previously passed into SetRecvCodecs.
2667TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002668 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002669 cricket::AudioRecvParameters parameters;
2670 parameters.codecs.push_back(kIsacCodec);
2671 parameters.codecs.push_back(kPcmuCodec);
2672 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -07002673 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002674 int channel_num2 = voe_.GetLastChannel();
2675 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002676 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002677 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002678 gcodec.channels = 2;
2679 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2680}
2681
2682// Test that we properly clean up any streams that were added, even if
2683// not explicitly removed.
2684TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002685 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002686 SetSendParameters(send_parameters_);
solenberg8189b022016-06-14 12:13:00 -07002687 EXPECT_TRUE(AddRecvStream(1));
2688 EXPECT_TRUE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002689 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2690 delete channel_;
2691 channel_ = NULL;
2692 EXPECT_EQ(0, voe_.GetNumChannels());
2693}
2694
wu@webrtc.org78187522013-10-07 23:32:02 +00002695TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002696 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07002697 EXPECT_FALSE(AddRecvStream(0));
wu@webrtc.org78187522013-10-07 23:32:02 +00002698}
2699
2700TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002701 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002702 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002703 // Manually delete channel to simulate a failure.
2704 int channel = voe_.GetLastChannel();
2705 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2706 // Add recv stream 2 should work.
solenberg8189b022016-06-14 12:13:00 -07002707 EXPECT_TRUE(AddRecvStream(2));
wu@webrtc.org78187522013-10-07 23:32:02 +00002708 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002709 EXPECT_NE(channel, new_channel);
2710 // The last created channel is deleted too.
2711 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002712}
2713
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002714// Test the InsertDtmf on default send stream as caller.
2715TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2716 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002717}
2718
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002719// Test the InsertDtmf on default send stream as callee
2720TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2721 TestInsertDtmf(0, false);
2722}
2723
2724// Test the InsertDtmf on specified send stream as caller.
2725TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2726 TestInsertDtmf(kSsrc1, true);
2727}
2728
2729// Test the InsertDtmf on specified send stream as callee.
2730TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2731 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002732}
2733
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002734TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002735 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002736 EXPECT_CALL(adm_,
2737 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2738 EXPECT_CALL(adm_,
2739 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2740 EXPECT_CALL(adm_,
2741 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002742 bool ec_enabled;
2743 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002744 webrtc::AecmModes aecm_mode;
2745 bool cng_enabled;
2746 bool agc_enabled;
2747 webrtc::AgcModes agc_mode;
2748 webrtc::AgcConfig agc_config;
2749 bool ns_enabled;
2750 webrtc::NsModes ns_mode;
2751 bool highpass_filter_enabled;
2752 bool stereo_swapping_enabled;
2753 bool typing_detection_enabled;
2754 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002755 voe_.GetAecmMode(aecm_mode, cng_enabled);
2756 voe_.GetAgcStatus(agc_enabled, agc_mode);
2757 voe_.GetAgcConfig(agc_config);
2758 voe_.GetNsStatus(ns_enabled, ns_mode);
2759 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2760 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2761 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2762 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002763 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002764 EXPECT_FALSE(cng_enabled);
2765 EXPECT_TRUE(agc_enabled);
2766 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2767 EXPECT_TRUE(ns_enabled);
2768 EXPECT_TRUE(highpass_filter_enabled);
2769 EXPECT_FALSE(stereo_swapping_enabled);
2770 EXPECT_TRUE(typing_detection_enabled);
2771 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2772 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002773 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2774 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002775
solenberg246b8172015-12-08 09:50:23 -08002776 // Nothing set in AudioOptions, so everything should be as default.
2777 send_parameters_.options = cricket::AudioOptions();
solenberg059fb442016-10-26 05:12:24 -07002778 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002779 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002780 voe_.GetAecmMode(aecm_mode, cng_enabled);
2781 voe_.GetAgcStatus(agc_enabled, agc_mode);
2782 voe_.GetAgcConfig(agc_config);
2783 voe_.GetNsStatus(ns_enabled, ns_mode);
2784 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2785 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2786 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2787 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002788 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002789 EXPECT_FALSE(cng_enabled);
2790 EXPECT_TRUE(agc_enabled);
2791 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2792 EXPECT_TRUE(ns_enabled);
2793 EXPECT_TRUE(highpass_filter_enabled);
2794 EXPECT_FALSE(stereo_swapping_enabled);
2795 EXPECT_TRUE(typing_detection_enabled);
2796 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2797 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002798 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2799 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002800
2801 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002802 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002803 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002804 voe_.GetEcStatus(ec_enabled, ec_mode);
2805 EXPECT_FALSE(ec_enabled);
2806
2807 // Turn echo cancellation back on, with settings, and make sure
2808 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002809 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002810 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002811 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002812 voe_.GetAecmMode(aecm_mode, cng_enabled);
2813 voe_.GetAgcStatus(agc_enabled, agc_mode);
2814 voe_.GetAgcConfig(agc_config);
2815 voe_.GetNsStatus(ns_enabled, ns_mode);
2816 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2817 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2818 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2819 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002820 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002821 EXPECT_TRUE(agc_enabled);
2822 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2823 EXPECT_TRUE(ns_enabled);
2824 EXPECT_TRUE(highpass_filter_enabled);
2825 EXPECT_FALSE(stereo_swapping_enabled);
2826 EXPECT_TRUE(typing_detection_enabled);
2827 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2828 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2829
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002830 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2831 // control.
solenberg246b8172015-12-08 09:50:23 -08002832 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002833 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002834 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002835 voe_.GetAecmMode(aecm_mode, cng_enabled);
2836 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002837 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002838 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2839
2840 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002841 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2842 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2843 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002844 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002845 voe_.GetEcStatus(ec_enabled, ec_mode);
2846 EXPECT_FALSE(ec_enabled);
2847 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002848 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002849 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002850 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002851 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002852 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002853 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2854
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002855 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002856 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002857 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002858 voe_.GetAgcStatus(agc_enabled, agc_mode);
2859 EXPECT_FALSE(agc_enabled);
2860
2861 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002862 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2863 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
solenberg059fb442016-10-26 05:12:24 -07002864 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002865 voe_.GetAgcStatus(agc_enabled, agc_mode);
2866 EXPECT_TRUE(agc_enabled);
2867 voe_.GetAgcConfig(agc_config);
2868 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2869
2870 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002871 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2872 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2873 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2874 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002875 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002876 voe_.GetNsStatus(ns_enabled, ns_mode);
2877 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2878 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2879 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2880 EXPECT_FALSE(ns_enabled);
2881 EXPECT_FALSE(highpass_filter_enabled);
2882 EXPECT_FALSE(typing_detection_enabled);
2883 EXPECT_TRUE(stereo_swapping_enabled);
2884
solenberg1ac56142015-10-13 03:58:19 -07002885 // Set options again to ensure it has no impact.
solenberg059fb442016-10-26 05:12:24 -07002886 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002887 voe_.GetEcStatus(ec_enabled, ec_mode);
2888 voe_.GetNsStatus(ns_enabled, ns_mode);
2889 EXPECT_TRUE(ec_enabled);
2890 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2891 EXPECT_FALSE(ns_enabled);
2892 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2893}
2894
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002895TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002896 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002897
2898 bool ec_enabled;
2899 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002900 bool agc_enabled;
2901 webrtc::AgcModes agc_mode;
2902 bool ns_enabled;
2903 webrtc::NsModes ns_mode;
2904 bool highpass_filter_enabled;
2905 bool stereo_swapping_enabled;
2906 bool typing_detection_enabled;
2907
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002908 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002909 voe_.GetAgcStatus(agc_enabled, agc_mode);
2910 voe_.GetNsStatus(ns_enabled, ns_mode);
2911 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2912 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2913 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2914 EXPECT_TRUE(ec_enabled);
2915 EXPECT_TRUE(agc_enabled);
2916 EXPECT_TRUE(ns_enabled);
2917 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002918 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002919 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002920}
2921
2922TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2923 webrtc::AgcConfig set_config = {0};
2924 set_config.targetLeveldBOv = 3;
2925 set_config.digitalCompressionGaindB = 9;
2926 set_config.limiterEnable = true;
2927 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002928
2929 webrtc::AgcConfig config = {0};
2930 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2931 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2932 EXPECT_EQ(set_config.digitalCompressionGaindB,
2933 config.digitalCompressionGaindB);
2934 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2935}
2936
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002937TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002938 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002939 EXPECT_CALL(adm_,
2940 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2941 EXPECT_CALL(adm_,
2942 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
2943 EXPECT_CALL(adm_,
2944 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
solenberg059fb442016-10-26 05:12:24 -07002945 EXPECT_CALL(adm_,
2946 RecordingIsInitialized()).Times(2).WillRepeatedly(Return(false));
2947 EXPECT_CALL(adm_, Recording()).Times(2).WillRepeatedly(Return(false));
2948 EXPECT_CALL(adm_, InitRecording()).Times(2).WillRepeatedly(Return(0));
2949 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(10);
2950 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(10);
solenberg5b5129a2016-04-08 05:35:48 -07002951
kwiberg686a8ef2016-02-26 03:00:35 -08002952 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07002953 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002954 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002955 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07002956 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002957 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002958
2959 // Have to add a stream to make SetSend work.
2960 cricket::StreamParams stream1;
2961 stream1.ssrcs.push_back(1);
2962 channel1->AddSendStream(stream1);
2963 cricket::StreamParams stream2;
2964 stream2.ssrcs.push_back(2);
2965 channel2->AddSendStream(stream2);
2966
2967 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002968 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002969 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2970 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2971 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002972 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002973 EXPECT_EQ(parameters_options_all.options, channel1->options());
solenberg059fb442016-10-26 05:12:24 -07002974 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002975 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002976
2977 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002978 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002979 parameters_options_no_ns.options.noise_suppression =
2980 rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002981 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002982 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002983 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2984 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2985 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002986 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002987
2988 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002989 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002990 parameters_options_no_agc.options.auto_gain_control =
2991 rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002992 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002993 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2994 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2995 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002996 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002997
solenberg059fb442016-10-26 05:12:24 -07002998 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002999 bool ec_enabled;
3000 webrtc::EcModes ec_mode;
3001 bool agc_enabled;
3002 webrtc::AgcModes agc_mode;
3003 bool ns_enabled;
3004 webrtc::NsModes ns_mode;
3005 voe_.GetEcStatus(ec_enabled, ec_mode);
3006 voe_.GetAgcStatus(agc_enabled, agc_mode);
3007 voe_.GetNsStatus(ns_enabled, ns_mode);
3008 EXPECT_TRUE(ec_enabled);
3009 EXPECT_TRUE(agc_enabled);
3010 EXPECT_TRUE(ns_enabled);
3011
solenberg059fb442016-10-26 05:12:24 -07003012 channel1->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003013 voe_.GetEcStatus(ec_enabled, ec_mode);
3014 voe_.GetAgcStatus(agc_enabled, agc_mode);
3015 voe_.GetNsStatus(ns_enabled, ns_mode);
3016 EXPECT_TRUE(ec_enabled);
3017 EXPECT_TRUE(agc_enabled);
3018 EXPECT_FALSE(ns_enabled);
3019
solenberg059fb442016-10-26 05:12:24 -07003020 channel2->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003021 voe_.GetEcStatus(ec_enabled, ec_mode);
3022 voe_.GetAgcStatus(agc_enabled, agc_mode);
3023 voe_.GetNsStatus(ns_enabled, ns_mode);
3024 EXPECT_TRUE(ec_enabled);
3025 EXPECT_FALSE(agc_enabled);
3026 EXPECT_TRUE(ns_enabled);
3027
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003028 // Make sure settings take effect while we are sending.
solenberg059fb442016-10-26 05:12:24 -07003029 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
3030 EXPECT_CALL(apm_, ApplyConfig(testing::_));
3031 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003032 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3033 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003034 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003035 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003036 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003037 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003038 channel2->SetSend(true);
solenberg059fb442016-10-26 05:12:24 -07003039 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc_nor_ns));
Karl Wibergbe579832015-11-10 22:34:18 +01003040 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3041 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3042 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003043 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003044 voe_.GetEcStatus(ec_enabled, ec_mode);
3045 voe_.GetAgcStatus(agc_enabled, agc_mode);
3046 voe_.GetNsStatus(ns_enabled, ns_mode);
3047 EXPECT_TRUE(ec_enabled);
3048 EXPECT_FALSE(agc_enabled);
3049 EXPECT_FALSE(ns_enabled);
3050}
3051
wu@webrtc.orgde305012013-10-31 15:40:38 +00003052// This test verifies DSCP settings are properly applied on voice media channel.
3053TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003054 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003055 cricket::FakeNetworkInterface network_interface;
3056 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003057 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003058
solenberg059fb442016-10-26 05:12:24 -07003059 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(3);
3060 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(3);
3061
solenbergbc37fc82016-04-04 09:54:44 -07003062 channel.reset(
3063 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003064 channel->SetInterface(&network_interface);
3065 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3066 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3067
3068 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003069 channel.reset(
3070 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003071 channel->SetInterface(&network_interface);
3072 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3073
3074 // Verify that setting the option to false resets the
3075 // DiffServCodePoint.
3076 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003077 channel.reset(
3078 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003079 channel->SetInterface(&network_interface);
3080 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3081 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3082
3083 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003084}
3085
solenberg1ac56142015-10-13 03:58:19 -07003086TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003087 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003088 cricket::WebRtcVoiceMediaChannel* media_channel =
3089 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003090 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
solenberg8189b022016-06-14 12:13:00 -07003091 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -07003092 int channel_id = voe_.GetLastChannel();
3093 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3094 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
solenberg8189b022016-06-14 12:13:00 -07003095 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07003096 int channel_id2 = voe_.GetLastChannel();
3097 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003098}
3099
solenberg1ac56142015-10-13 03:58:19 -07003100TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003101 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003102 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003103 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3104 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3105 EXPECT_TRUE(channel_->AddSendStream(
3106 cricket::StreamParams::CreateLegacy(kSsrc1)));
3107 int channel_id = voe_.GetLastChannel();
3108 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3109 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3110 EXPECT_TRUE(channel_->AddSendStream(
3111 cricket::StreamParams::CreateLegacy(kSsrc2)));
3112 int channel_id2 = voe_.GetLastChannel();
3113 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003114}
3115
solenberg4bac9c52015-10-09 02:32:53 -07003116TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003117 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003118 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003119 cricket::StreamParams stream;
3120 stream.ssrcs.push_back(kSsrc2);
3121 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg217fb662016-06-17 08:30:54 -07003122 EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrc2).gain());
solenberg4bac9c52015-10-09 02:32:53 -07003123 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg217fb662016-06-17 08:30:54 -07003124 EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc2).gain());
solenberg1ac56142015-10-13 03:58:19 -07003125}
3126
3127TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003128 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003129 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3130 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg217fb662016-06-17 08:30:54 -07003131 EXPECT_DOUBLE_EQ(2, GetRecvStream(1).gain());
solenberg1ac56142015-10-13 03:58:19 -07003132 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenberg217fb662016-06-17 08:30:54 -07003133 EXPECT_DOUBLE_EQ(3, GetRecvStream(1).gain());
3134 EXPECT_TRUE(channel_->SetOutputVolume(1, 4));
3135 EXPECT_DOUBLE_EQ(4, GetRecvStream(1).gain());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003136}
3137
pbos8fc7fa72015-07-15 08:02:58 -07003138TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003139 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003140 const std::string kSyncLabel = "AvSyncLabel";
3141
solenbergff976312016-03-30 23:28:51 -07003142 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003143 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3144 sp.sync_label = kSyncLabel;
3145 // Creating two channels to make sure that sync label is set properly for both
3146 // the default voice channel and following ones.
3147 EXPECT_TRUE(channel_->AddRecvStream(sp));
3148 sp.ssrcs[0] += 1;
3149 EXPECT_TRUE(channel_->AddRecvStream(sp));
3150
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003151 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003152 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003153 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003154 << "SyncGroup should be set based on sync_label";
3155 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003156 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003157 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003158}
3159
solenberg3a941542015-11-16 07:34:50 -08003160// TODO(solenberg): Remove, once recv streams are configured through Call.
3161// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003162TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003163 // Test that setting the header extensions results in the expected state
3164 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003165 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003166 ssrcs.push_back(223);
3167 ssrcs.push_back(224);
3168
solenbergff976312016-03-30 23:28:51 -07003169 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07003170 SetSendParameters(send_parameters_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02003171 for (uint32_t ssrc : ssrcs) {
solenberg059fb442016-10-26 05:12:24 -07003172 EXPECT_TRUE(channel_->AddRecvStream(
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003173 cricket::StreamParams::CreateLegacy(ssrc)));
3174 }
3175
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003176 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003177 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003178 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003179 EXPECT_NE(nullptr, s);
3180 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3181 }
3182
3183 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003184 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003185 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003186 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003187 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003188 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003189 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003190 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003191 EXPECT_NE(nullptr, s);
3192 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003193 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3194 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003195 for (const auto& s_ext : s_exts) {
3196 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003197 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003198 }
3199 }
3200 }
3201 }
3202
3203 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003204 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003205 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003206 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003207 EXPECT_NE(nullptr, s);
3208 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3209 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003210}
3211
3212TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3213 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003214 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003215 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003216 static const unsigned char kRtcp[] = {
3217 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3218 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3219 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3220 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3221 };
jbaucheec21bd2016-03-20 06:15:43 -07003222 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003223
solenbergff976312016-03-30 23:28:51 -07003224 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003225 cricket::WebRtcVoiceMediaChannel* media_channel =
3226 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg059fb442016-10-26 05:12:24 -07003227 SetSendParameters(send_parameters_);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003228 EXPECT_TRUE(media_channel->AddRecvStream(
3229 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3230
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003231 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003232 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003233 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003234 EXPECT_EQ(0, s->received_packets());
3235 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3236 EXPECT_EQ(1, s->received_packets());
3237 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3238 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003239}
Minyue2013aec2015-05-13 14:14:42 +02003240
solenberg0a617e22015-10-20 15:49:38 -07003241// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003242// since they do not send RTCP SR.
solenberg7602aab2016-11-14 11:30:07 -08003243TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_SendCreatedFirst) {
solenbergff976312016-03-30 23:28:51 -07003244 EXPECT_TRUE(SetupSendStream());
solenberg7602aab2016-11-14 11:30:07 -08003245 EXPECT_TRUE(AddRecvStream(kSsrc2));
3246 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
3247 EXPECT_TRUE(channel_->AddSendStream(
3248 cricket::StreamParams::CreateLegacy(kSsrc3)));
3249 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
3250 EXPECT_TRUE(AddRecvStream(kSsrc4));
3251 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc4).rtp.local_ssrc);
Minyue2013aec2015-05-13 14:14:42 +02003252}
3253
solenberg7602aab2016-11-14 11:30:07 -08003254TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_RecvCreatedFirst) {
3255 EXPECT_TRUE(SetupRecvStream());
3256 EXPECT_EQ(0xFA17FA17u, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3257 EXPECT_TRUE(channel_->AddSendStream(
3258 cricket::StreamParams::CreateLegacy(kSsrc2)));
3259 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3260 EXPECT_TRUE(AddRecvStream(kSsrc3));
3261 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc3).rtp.local_ssrc);
3262 EXPECT_TRUE(channel_->AddSendStream(
3263 cricket::StreamParams::CreateLegacy(kSsrc4)));
3264 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3265 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc3).rtp.local_ssrc);
Minyue2013aec2015-05-13 14:14:42 +02003266}
stefan658910c2015-09-03 05:48:32 -07003267
deadbeef884f5852016-01-15 09:20:04 -08003268TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003269 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003270 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3271 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003272
3273 // Setting the sink before a recv stream exists should do nothing.
3274 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
solenberg8189b022016-06-14 12:13:00 -07003275 EXPECT_TRUE(AddRecvStream(kSsrc1));
deadbeef884f5852016-01-15 09:20:04 -08003276 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3277
3278 // Now try actually setting the sink.
3279 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3280 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3281
3282 // Now try resetting it.
3283 channel_->SetRawAudioSink(kSsrc1, nullptr);
3284 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3285}
3286
3287TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003288 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003289 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3290 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003291
3292 // Should be able to set a default sink even when no stream exists.
3293 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3294
3295 // Create default channel and ensure it's assigned the default sink.
3296 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3297 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3298
3299 // Try resetting the default sink.
3300 channel_->SetRawAudioSink(0, nullptr);
3301 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3302
3303 // Try setting the default sink while the default stream exists.
3304 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3305 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3306
3307 // If we remove and add a default stream, it should get the same sink.
3308 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3309 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3310 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3311}
3312
skvlad7a43d252016-03-22 15:32:27 -07003313// Test that, just like the video channel, the voice channel communicates the
3314// network state to the call.
3315TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003316 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003317
3318 EXPECT_EQ(webrtc::kNetworkUp,
3319 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3320 EXPECT_EQ(webrtc::kNetworkUp,
3321 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3322
3323 channel_->OnReadyToSend(false);
3324 EXPECT_EQ(webrtc::kNetworkDown,
3325 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3326 EXPECT_EQ(webrtc::kNetworkUp,
3327 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3328
3329 channel_->OnReadyToSend(true);
3330 EXPECT_EQ(webrtc::kNetworkUp,
3331 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3332 EXPECT_EQ(webrtc::kNetworkUp,
3333 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3334}
3335
aleloi18e0b672016-10-04 02:45:47 -07003336// Test that playout is still started after changing parameters
3337TEST_F(WebRtcVoiceEngineTestFake, PreservePlayoutWhenRecreateRecvStream) {
3338 SetupRecvStream();
3339 channel_->SetPlayout(true);
3340 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3341
3342 // Changing RTP header extensions will recreate the AudioReceiveStream.
3343 cricket::AudioRecvParameters parameters;
3344 parameters.extensions.push_back(
3345 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
3346 channel_->SetRecvParameters(parameters);
3347
3348 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3349}
3350
stefan658910c2015-09-03 05:48:32 -07003351// Tests that the library initializes and shuts down properly.
3352TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossu29b1a8d2016-06-13 07:34:51 -07003353 // If the VoiceEngine wants to gather available codecs early, that's fine but
3354 // we never want it to create a decoder at this stage.
ossuc54071d2016-08-17 02:45:41 -07003355 cricket::WebRtcVoiceEngine engine(
3356 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003357 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003358 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003359 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003360 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3361 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003362 EXPECT_TRUE(channel != nullptr);
3363 delete channel;
solenbergff976312016-03-30 23:28:51 -07003364}
stefan658910c2015-09-03 05:48:32 -07003365
solenbergff976312016-03-30 23:28:51 -07003366// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003367TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3368 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3369 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3370 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003371 {
ossuc54071d2016-08-17 02:45:41 -07003372 cricket::WebRtcVoiceEngine engine(
3373 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003374 webrtc::RtcEventLogNullImpl event_log;
solenbergff976312016-03-30 23:28:51 -07003375 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003376 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
solenbergff976312016-03-30 23:28:51 -07003377 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3378 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3379 EXPECT_TRUE(channel != nullptr);
3380 delete channel;
3381 }
stefan658910c2015-09-03 05:48:32 -07003382}
3383
3384// Tests that the library is configured with the codecs we want.
3385TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003386 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3387 // module.
3388
stefan658910c2015-09-03 05:48:32 -07003389 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003390 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003391 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003392 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003393 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003394 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003395 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003396 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003397 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003398 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003399 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003400 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003401 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003402 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003403 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003404 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003405 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003406 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003407 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003408 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003409 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003410 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003411 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003412 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003413 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003414 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003415 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003416 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003417 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003418 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003419 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003420 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003421 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003422 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003423 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003424 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003425 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003426 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003427 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003428 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003429 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003430
stefan658910c2015-09-03 05:48:32 -07003431 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossuc54071d2016-08-17 02:45:41 -07003432 // TODO(ossu): Why are the payload types of codecs with non-static payload
3433 // type assignments checked here? It shouldn't really matter.
3434 cricket::WebRtcVoiceEngine engine(
3435 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
stefan658910c2015-09-03 05:48:32 -07003436 for (std::vector<cricket::AudioCodec>::const_iterator it =
ossuc54071d2016-08-17 02:45:41 -07003437 engine.send_codecs().begin();
3438 it != engine.send_codecs().end(); ++it) {
stefan658910c2015-09-03 05:48:32 -07003439 if (it->name == "CN" && it->clockrate == 16000) {
3440 EXPECT_EQ(105, it->id);
3441 } else if (it->name == "CN" && it->clockrate == 32000) {
3442 EXPECT_EQ(106, it->id);
3443 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3444 EXPECT_EQ(103, it->id);
3445 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3446 EXPECT_EQ(104, it->id);
3447 } else if (it->name == "G722" && it->clockrate == 8000) {
3448 EXPECT_EQ(9, it->id);
3449 } else if (it->name == "telephone-event") {
3450 EXPECT_EQ(126, it->id);
stefan658910c2015-09-03 05:48:32 -07003451 } else if (it->name == "opus") {
3452 EXPECT_EQ(111, it->id);
3453 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3454 EXPECT_EQ("10", it->params.find("minptime")->second);
stefan658910c2015-09-03 05:48:32 -07003455 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3456 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3457 }
3458 }
stefan658910c2015-09-03 05:48:32 -07003459}
3460
3461// Tests that VoE supports at least 32 channels
3462TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossuc54071d2016-08-17 02:45:41 -07003463 cricket::WebRtcVoiceEngine engine(
3464 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003465 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003466 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003467 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
stefan658910c2015-09-03 05:48:32 -07003468
3469 cricket::VoiceMediaChannel* channels[32];
3470 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003471 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003472 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3473 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003474 if (!channel)
3475 break;
stefan658910c2015-09-03 05:48:32 -07003476 channels[num_channels++] = channel;
3477 }
3478
tfarina5237aaf2015-11-10 23:44:30 -08003479 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003480 EXPECT_EQ(expected, num_channels);
3481
3482 while (num_channels > 0) {
3483 delete channels[--num_channels];
3484 }
stefan658910c2015-09-03 05:48:32 -07003485}
3486
3487// Test that we set our preferred codecs properly.
3488TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003489 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3490 // - Check that our builtin codecs are usable by Channel.
3491 // - The codecs provided by the engine is usable by Channel.
3492 // It does not check that the codecs in the RecvParameters are actually
3493 // what we sent in - though it's probably reasonable to expect so, if
3494 // SetRecvParameters returns true.
3495 // I think it will become clear once audio decoder injection is completed.
3496 cricket::WebRtcVoiceEngine engine(
3497 nullptr, webrtc::CreateBuiltinAudioDecoderFactory());
skvlad11a9cbf2016-10-07 11:53:05 -07003498 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003499 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003500 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003501 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3502 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003503 cricket::AudioRecvParameters parameters;
ossudedfd282016-06-14 07:12:39 -07003504 parameters.codecs = engine.recv_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003505 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003506}