blob: 3ca7ec8b051cf20a8bca795efb4b1d7ff98b8dd0 [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"
ossuf515ab82016-12-07 04:52:58 -080017#include "webrtc/call/call.h"
stefanba4c0e42016-02-04 04:12:24 -080018#include "webrtc/p2p/base/faketransportcontroller.h"
19#include "webrtc/test/field_trial.h"
skvlad11a9cbf2016-10-07 11:53:05 -070020#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
kjellandera96e2d72016-02-04 23:52:28 -080021#include "webrtc/media/base/fakemediaengine.h"
22#include "webrtc/media/base/fakenetworkinterface.h"
23#include "webrtc/media/base/fakertp.h"
kjellanderf4752772016-03-02 05:42:30 -080024#include "webrtc/media/base/mediaconstants.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010025#include "webrtc/media/engine/fakewebrtccall.h"
26#include "webrtc/media/engine/fakewebrtcvoiceengine.h"
27#include "webrtc/media/engine/webrtcvoiceengine.h"
ossu29b1a8d2016-06-13 07:34:51 -070028#include "webrtc/modules/audio_coding/codecs/builtin_audio_decoder_factory.h"
29#include "webrtc/modules/audio_coding/codecs/mock/mock_audio_decoder_factory.h"
solenbergbc37fc82016-04-04 09:54:44 -070030#include "webrtc/modules/audio_device/include/mock_audio_device.h"
solenberg059fb442016-10-26 05:12:24 -070031#include "webrtc/modules/audio_processing/include/mock_audio_processing.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032
solenbergbc37fc82016-04-04 09:54:44 -070033using testing::Return;
34using testing::StrictMock;
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000035
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020036namespace {
37
deadbeef67cf2c12016-04-13 10:07:16 -070038const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1);
39const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1);
40const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2);
41const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1);
42const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1);
deadbeef67cf2c12016-04-13 10:07:16 -070043const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1);
44const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1);
solenberg2779bab2016-11-17 04:45:19 -080045const cricket::AudioCodec
46 kTelephoneEventCodec1(106, "telephone-event", 8000, 0, 1);
47const cricket::AudioCodec
48 kTelephoneEventCodec2(107, "telephone-event", 32000, 0, 1);
49
solenberg85a04962015-10-27 03:35:21 -070050const uint32_t kSsrc1 = 0x99;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080051const uint32_t kSsrc2 = 2;
52const uint32_t kSsrc3 = 3;
solenberg7602aab2016-11-14 11:30:07 -080053const uint32_t kSsrc4 = 0x42;
solenberg85a04962015-10-27 03:35:21 -070054const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000055
solenberg971cab02016-06-14 10:02:41 -070056constexpr int kRtpHistoryMs = 5000;
57
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058class FakeVoEWrapper : public cricket::VoEWrapper {
59 public:
60 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
61 : cricket::VoEWrapper(engine, // processing
62 engine, // base
63 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000065 engine) { // volume
66 }
67};
skvlad11a9cbf2016-10-07 11:53:05 -070068
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020069} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000070
solenbergff976312016-03-30 23:28:51 -070071// Tests that our stub library "works".
72TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070073 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
74 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
75 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070076 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
77 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
78 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenberg059fb442016-10-26 05:12:24 -070079 StrictMock<webrtc::test::MockAudioProcessing> apm;
80 EXPECT_CALL(apm, ApplyConfig(testing::_));
81 EXPECT_CALL(apm, SetExtraOptions(testing::_));
82 EXPECT_CALL(apm, Initialize()).WillOnce(Return(0));
83 cricket::FakeWebRtcVoiceEngine voe(&apm);
solenbergff976312016-03-30 23:28:51 -070084 EXPECT_FALSE(voe.IsInited());
85 {
ossuc54071d2016-08-17 02:45:41 -070086 cricket::WebRtcVoiceEngine engine(
gyzhou95aa9642016-12-13 14:06:26 -080087 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr,
ossuc54071d2016-08-17 02:45:41 -070088 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));
gyzhou95aa9642016-12-13 14:06:26 -0800119 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, factory, nullptr,
solenbergbc37fc82016-04-04 09:54:44 -0700120 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200121 send_parameters_.codecs.push_back(kPcmuCodec);
122 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000123 }
solenberg8189b022016-06-14 12:13:00 -0700124
solenbergff976312016-03-30 23:28:51 -0700125 bool SetupChannel() {
solenberg059fb442016-10-26 05:12:24 -0700126 EXPECT_CALL(apm_, ApplyConfig(testing::_));
127 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
solenbergbc37fc82016-04-04 09:54:44 -0700128 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
129 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200130 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000131 }
solenberg8189b022016-06-14 12:13:00 -0700132
solenbergff976312016-03-30 23:28:51 -0700133 bool SetupRecvStream() {
134 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700135 return false;
136 }
solenberg8189b022016-06-14 12:13:00 -0700137 return AddRecvStream(kSsrc1);
solenberg1ac56142015-10-13 03:58:19 -0700138 }
solenberg8189b022016-06-14 12:13:00 -0700139
solenbergff976312016-03-30 23:28:51 -0700140 bool SetupSendStream() {
141 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000142 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000143 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800144 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
145 return false;
146 }
solenberg059fb442016-10-26 05:12:24 -0700147 EXPECT_CALL(apm_, set_output_will_be_muted(false));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800148 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000149 }
solenberg8189b022016-06-14 12:13:00 -0700150
151 bool AddRecvStream(uint32_t ssrc) {
152 EXPECT_TRUE(channel_);
153 return channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(ssrc));
154 }
155
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000156 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700157 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700158 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800159 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700160 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700161 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800162 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000163 }
solenberg8189b022016-06-14 12:13:00 -0700164
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000165 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700166 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000167 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000168 }
solenberg8189b022016-06-14 12:13:00 -0700169
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200170 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000171 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000172 }
173
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100174 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
175 const auto* send_stream = call_.GetAudioSendStream(ssrc);
176 EXPECT_TRUE(send_stream);
177 return *send_stream;
178 }
179
deadbeef884f5852016-01-15 09:20:04 -0800180 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
181 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
182 EXPECT_TRUE(recv_stream);
183 return *recv_stream;
184 }
185
solenberg3a941542015-11-16 07:34:50 -0800186 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800187 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800188 }
189
solenberg7add0582015-11-20 09:59:34 -0800190 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800191 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800192 }
193
solenberg059fb442016-10-26 05:12:24 -0700194 void SetSend(bool enable) {
195 ASSERT_TRUE(channel_);
solenbergd53a3f92016-04-14 13:56:37 -0700196 if (enable) {
197 EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false));
198 EXPECT_CALL(adm_, Recording()).WillOnce(Return(false));
199 EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0));
solenberg059fb442016-10-26 05:12:24 -0700200 EXPECT_CALL(apm_, ApplyConfig(testing::_));
201 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
solenbergd53a3f92016-04-14 13:56:37 -0700202 }
solenberg059fb442016-10-26 05:12:24 -0700203 channel_->SetSend(enable);
204 }
205
206 void SetSendParameters(const cricket::AudioSendParameters& params) {
207 EXPECT_CALL(apm_, ApplyConfig(testing::_));
208 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
209 ASSERT_TRUE(channel_);
210 EXPECT_TRUE(channel_->SetSendParameters(params));
211 }
212
minyue6b825df2016-10-31 04:08:32 -0700213 void SetAudioSend(uint32_t ssrc, bool enable, cricket::AudioSource* source,
214 const cricket::AudioOptions* options = nullptr) {
solenberg059fb442016-10-26 05:12:24 -0700215 EXPECT_CALL(apm_, set_output_will_be_muted(!enable));
216 ASSERT_TRUE(channel_);
minyue6b825df2016-10-31 04:08:32 -0700217 if (enable && options) {
218 EXPECT_CALL(apm_, ApplyConfig(testing::_));
219 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
220 }
221 EXPECT_TRUE(channel_->SetAudioSend(ssrc, enable, options, source));
solenbergd53a3f92016-04-14 13:56:37 -0700222 }
223
solenbergffbbcac2016-11-17 05:25:37 -0800224 void TestInsertDtmf(uint32_t ssrc, bool caller,
225 const cricket::AudioCodec& codec) {
solenbergff976312016-03-30 23:28:51 -0700226 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000227 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700228 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000229 // send stream.
230 EXPECT_TRUE(channel_->AddSendStream(
231 cricket::StreamParams::CreateLegacy(kSsrc1)));
232 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000233
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000234 // Test we can only InsertDtmf when the other side supports telephone-event.
solenberg059fb442016-10-26 05:12:24 -0700235 SetSendParameters(send_parameters_);
236 SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000237 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800238 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
solenbergffbbcac2016-11-17 05:25:37 -0800239 send_parameters_.codecs.push_back(codec);
solenberg059fb442016-10-26 05:12:24 -0700240 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000241 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000242
243 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700244 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800245 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000246 EXPECT_TRUE(channel_->AddSendStream(
247 cricket::StreamParams::CreateLegacy(kSsrc1)));
248 }
249
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000250 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800251 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000252
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100253 // Test send.
254 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
255 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
256 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800257 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100258 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
solenbergffbbcac2016-11-17 05:25:37 -0800259 EXPECT_EQ(codec.id, telephone_event.payload_type);
260 EXPECT_EQ(codec.clockrate, telephone_event.payload_frequency);
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100261 EXPECT_EQ(2, telephone_event.event_code);
262 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000263 }
264
265 // Test that send bandwidth is set correctly.
266 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000267 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
268 // |expected_result| is the expected result from SetMaxSendBandwidth().
269 // |expected_bitrate| is the expected audio bitrate afterward.
deadbeef80346142016-04-27 14:17:10 -0700270 void TestMaxSendBandwidth(const cricket::AudioCodec& codec,
271 int max_bitrate,
272 bool expected_result,
273 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200274 cricket::AudioSendParameters parameters;
275 parameters.codecs.push_back(codec);
276 parameters.max_bandwidth_bps = max_bitrate;
solenberg059fb442016-10-26 05:12:24 -0700277 if (expected_result) {
278 SetSendParameters(parameters);
279 } else {
280 EXPECT_FALSE(channel_->SetSendParameters(parameters));
281 }
minyue7a973442016-10-20 03:27:12 -0700282 EXPECT_EQ(expected_bitrate, GetCodecBitrate(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000283 }
284
skvlade0d46372016-04-07 22:59:22 -0700285 // Sets the per-stream maximum bitrate limit for the specified SSRC.
286 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700287 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(ssrc);
skvlade0d46372016-04-07 22:59:22 -0700288 EXPECT_EQ(1UL, parameters.encodings.size());
289
290 parameters.encodings[0].max_bitrate_bps = bitrate;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700291 return channel_->SetRtpSendParameters(ssrc, parameters);
skvlade0d46372016-04-07 22:59:22 -0700292 }
293
solenberg059fb442016-10-26 05:12:24 -0700294 void SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
skvlade0d46372016-04-07 22:59:22 -0700295 cricket::AudioSendParameters send_parameters;
296 send_parameters.codecs.push_back(codec);
297 send_parameters.max_bandwidth_bps = bitrate;
solenberg059fb442016-10-26 05:12:24 -0700298 SetSendParameters(send_parameters);
skvlade0d46372016-04-07 22:59:22 -0700299 }
300
minyue7a973442016-10-20 03:27:12 -0700301 void CheckSendCodec(int32_t ssrc,
302 const char expected_name[],
303 int expected_channels,
304 int expected_bitrate) {
305 const auto& codec = GetSendStreamConfig(ssrc).send_codec_spec.codec_inst;
306 EXPECT_STREQ(expected_name, codec.plname);
307 EXPECT_EQ(expected_channels, codec.channels);
308 EXPECT_EQ(expected_bitrate, codec.rate);
309 }
310
311 int GetOpusMaxPlaybackRate(int32_t ssrc) {
312 return GetSendStreamConfig(ssrc).send_codec_spec.opus_max_playback_rate;
313 }
314
315 bool GetOpusDtx(int32_t ssrc) {
316 return GetSendStreamConfig(ssrc).send_codec_spec.enable_opus_dtx;
317 }
318
319 bool GetCodecFec(int32_t ssrc) {
320 return GetSendStreamConfig(ssrc).send_codec_spec.enable_codec_fec;
321 }
322
skvlade0d46372016-04-07 22:59:22 -0700323 int GetCodecBitrate(int32_t ssrc) {
minyue7a973442016-10-20 03:27:12 -0700324 return GetSendStreamConfig(ssrc).send_codec_spec.codec_inst.rate;
325 }
326
327 int GetCodecPacSize(int32_t ssrc) {
328 return GetSendStreamConfig(ssrc).send_codec_spec.codec_inst.pacsize;
skvlade0d46372016-04-07 22:59:22 -0700329 }
330
minyue6b825df2016-10-31 04:08:32 -0700331 const rtc::Optional<std::string>& GetAudioNetworkAdaptorConfig(int32_t ssrc) {
332 return GetSendStreamConfig(ssrc).audio_network_adaptor_config;
333 }
334
skvlade0d46372016-04-07 22:59:22 -0700335 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
336 int global_max,
337 int stream_max,
338 bool expected_result,
339 int expected_codec_bitrate) {
340 // Clear the bitrate limit from the previous test case.
341 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
342
343 // Attempt to set the requested bitrate limits.
solenberg059fb442016-10-26 05:12:24 -0700344 SetGlobalMaxBitrate(codec, global_max);
skvlade0d46372016-04-07 22:59:22 -0700345 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
346
347 // Verify that reading back the parameters gives results
348 // consistent with the Set() result.
349 webrtc::RtpParameters resulting_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700350 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700351 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
352 EXPECT_EQ(expected_result ? stream_max : -1,
353 resulting_parameters.encodings[0].max_bitrate_bps);
354
355 // Verify that the codec settings have the expected bitrate.
356 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
357 }
358
stefan13f1a0a2016-11-30 07:22:58 -0800359 void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate_kbps,
360 int expected_min_bitrate_bps,
361 const char* start_bitrate_kbps,
362 int expected_start_bitrate_bps,
363 const char* max_bitrate_kbps,
364 int expected_max_bitrate_bps) {
365 EXPECT_TRUE(SetupSendStream());
366 auto& codecs = send_parameters_.codecs;
367 codecs.clear();
368 codecs.push_back(kOpusCodec);
369 codecs[0].params[cricket::kCodecParamMinBitrate] = min_bitrate_kbps;
370 codecs[0].params[cricket::kCodecParamStartBitrate] = start_bitrate_kbps;
371 codecs[0].params[cricket::kCodecParamMaxBitrate] = max_bitrate_kbps;
372 SetSendParameters(send_parameters_);
373
374 EXPECT_EQ(expected_min_bitrate_bps,
375 call_.GetConfig().bitrate_config.min_bitrate_bps);
376 EXPECT_EQ(expected_start_bitrate_bps,
377 call_.GetConfig().bitrate_config.start_bitrate_bps);
378 EXPECT_EQ(expected_max_bitrate_bps,
379 call_.GetConfig().bitrate_config.max_bitrate_bps);
380 }
381
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000382 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700383 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000384
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000385 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800386 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000387
388 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700389 send_parameters_.extensions.push_back(
390 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg059fb442016-10-26 05:12:24 -0700391 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800392 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000393
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000394 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200395 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -0700396 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800397 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000398
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000399 // Ensure extension is set properly.
400 const int id = 1;
isheriff6f8d6862016-05-26 11:24:55 -0700401 send_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg059fb442016-10-26 05:12:24 -0700402 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800403 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700404 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800405 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000406
solenberg7add0582015-11-20 09:59:34 -0800407 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000408 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700409 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800410 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
411 call_.GetAudioSendStream(kSsrc2));
412 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700413 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800414 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000415
416 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200417 send_parameters_.codecs.push_back(kPcmuCodec);
418 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -0700419 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800420 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
421 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000422 }
423
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000424 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700425 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000426
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000427 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800428 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000429
430 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700431 recv_parameters_.extensions.push_back(
432 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800433 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
434 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000435
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000436 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800437 recv_parameters_.extensions.clear();
438 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
439 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000440
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000441 // Ensure extension is set properly.
442 const int id = 2;
isheriff6f8d6862016-05-26 11:24:55 -0700443 recv_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg7add0582015-11-20 09:59:34 -0800444 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
445 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700446 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800447 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000448
solenberg7add0582015-11-20 09:59:34 -0800449 // Ensure extension is set properly on new stream.
solenberg8189b022016-06-14 12:13:00 -0700450 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -0800451 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
452 call_.GetAudioReceiveStream(kSsrc2));
453 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700454 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800455 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000456
457 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800458 recv_parameters_.extensions.clear();
459 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
460 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
461 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000462 }
463
solenberg85a04962015-10-27 03:35:21 -0700464 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
465 webrtc::AudioSendStream::Stats stats;
466 stats.local_ssrc = 12;
467 stats.bytes_sent = 345;
468 stats.packets_sent = 678;
469 stats.packets_lost = 9012;
470 stats.fraction_lost = 34.56f;
471 stats.codec_name = "codec_name_send";
hbos1acfbd22016-11-17 23:43:29 -0800472 stats.codec_payload_type = rtc::Optional<int>(42);
solenberg85a04962015-10-27 03:35:21 -0700473 stats.ext_seqnum = 789;
474 stats.jitter_ms = 12;
475 stats.rtt_ms = 345;
476 stats.audio_level = 678;
477 stats.aec_quality_min = 9.01f;
478 stats.echo_delay_median_ms = 234;
479 stats.echo_delay_std_ms = 567;
480 stats.echo_return_loss = 890;
481 stats.echo_return_loss_enhancement = 1234;
ivoc8c63a822016-10-21 04:10:03 -0700482 stats.residual_echo_likelihood = 0.432f;
solenberg85a04962015-10-27 03:35:21 -0700483 stats.typing_noise_detected = true;
484 return stats;
485 }
486 void SetAudioSendStreamStats() {
487 for (auto* s : call_.GetAudioSendStreams()) {
488 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200489 }
solenberg85a04962015-10-27 03:35:21 -0700490 }
solenberg566ef242015-11-06 15:34:49 -0800491 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
492 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700493 const auto stats = GetAudioSendStreamStats();
494 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
495 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
496 EXPECT_EQ(info.packets_sent, stats.packets_sent);
497 EXPECT_EQ(info.packets_lost, stats.packets_lost);
498 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
499 EXPECT_EQ(info.codec_name, stats.codec_name);
hbos1acfbd22016-11-17 23:43:29 -0800500 EXPECT_EQ(info.codec_payload_type, stats.codec_payload_type);
solenberg85a04962015-10-27 03:35:21 -0700501 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
502 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
503 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
504 EXPECT_EQ(info.audio_level, stats.audio_level);
505 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
506 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
507 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
508 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
509 EXPECT_EQ(info.echo_return_loss_enhancement,
510 stats.echo_return_loss_enhancement);
ivoc8c63a822016-10-21 04:10:03 -0700511 EXPECT_EQ(info.residual_echo_likelihood, stats.residual_echo_likelihood);
solenberg566ef242015-11-06 15:34:49 -0800512 EXPECT_EQ(info.typing_noise_detected,
513 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700514 }
515
516 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
517 webrtc::AudioReceiveStream::Stats stats;
518 stats.remote_ssrc = 123;
519 stats.bytes_rcvd = 456;
520 stats.packets_rcvd = 768;
521 stats.packets_lost = 101;
522 stats.fraction_lost = 23.45f;
523 stats.codec_name = "codec_name_recv";
hbos1acfbd22016-11-17 23:43:29 -0800524 stats.codec_payload_type = rtc::Optional<int>(42);
solenberg85a04962015-10-27 03:35:21 -0700525 stats.ext_seqnum = 678;
526 stats.jitter_ms = 901;
527 stats.jitter_buffer_ms = 234;
528 stats.jitter_buffer_preferred_ms = 567;
529 stats.delay_estimate_ms = 890;
530 stats.audio_level = 1234;
531 stats.expand_rate = 5.67f;
532 stats.speech_expand_rate = 8.90f;
533 stats.secondary_decoded_rate = 1.23f;
534 stats.accelerate_rate = 4.56f;
535 stats.preemptive_expand_rate = 7.89f;
536 stats.decoding_calls_to_silence_generator = 12;
537 stats.decoding_calls_to_neteq = 345;
538 stats.decoding_normal = 67890;
539 stats.decoding_plc = 1234;
540 stats.decoding_cng = 5678;
541 stats.decoding_plc_cng = 9012;
henrik.lundin63489782016-09-20 01:47:12 -0700542 stats.decoding_muted_output = 3456;
543 stats.capture_start_ntp_time_ms = 7890;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200544 return stats;
545 }
546 void SetAudioReceiveStreamStats() {
547 for (auto* s : call_.GetAudioReceiveStreams()) {
548 s->SetStats(GetAudioReceiveStreamStats());
549 }
550 }
551 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700552 const auto stats = GetAudioReceiveStreamStats();
553 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
554 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
555 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
556 EXPECT_EQ(info.packets_lost, stats.packets_lost);
557 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
558 EXPECT_EQ(info.codec_name, stats.codec_name);
hbos1acfbd22016-11-17 23:43:29 -0800559 EXPECT_EQ(info.codec_payload_type, stats.codec_payload_type);
solenberg85a04962015-10-27 03:35:21 -0700560 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
561 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
562 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200563 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700564 stats.jitter_buffer_preferred_ms);
565 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
566 EXPECT_EQ(info.audio_level, stats.audio_level);
567 EXPECT_EQ(info.expand_rate, stats.expand_rate);
568 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
569 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
570 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
571 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200572 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700573 stats.decoding_calls_to_silence_generator);
574 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
575 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
576 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
577 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
578 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
henrik.lundin63489782016-09-20 01:47:12 -0700579 EXPECT_EQ(info.decoding_muted_output, stats.decoding_muted_output);
solenberg85a04962015-10-27 03:35:21 -0700580 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200581 }
hbos1acfbd22016-11-17 23:43:29 -0800582 void VerifyVoiceSendRecvCodecs(const cricket::VoiceMediaInfo& info) const {
583 EXPECT_EQ(send_parameters_.codecs.size(), info.send_codecs.size());
584 for (const cricket::AudioCodec& codec : send_parameters_.codecs) {
585 ASSERT_EQ(info.send_codecs.count(codec.id), 1U);
586 EXPECT_EQ(info.send_codecs.find(codec.id)->second,
587 codec.ToCodecParameters());
588 }
589 EXPECT_EQ(recv_parameters_.codecs.size(), info.receive_codecs.size());
590 for (const cricket::AudioCodec& codec : recv_parameters_.codecs) {
591 ASSERT_EQ(info.receive_codecs.count(codec.id), 1U);
592 EXPECT_EQ(info.receive_codecs.find(codec.id)->second,
593 codec.ToCodecParameters());
594 }
595 }
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200596
peah8271d042016-11-22 07:24:52 -0800597 bool IsHighPassFilterEnabled() {
598 return engine_->GetApmConfigForTest().high_pass_filter.enabled;
599 }
600
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700602 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
solenberg059fb442016-10-26 05:12:24 -0700603 StrictMock<webrtc::test::MockAudioProcessing> apm_;
skvlad11a9cbf2016-10-07 11:53:05 -0700604 webrtc::RtcEventLogNullImpl event_log_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200605 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000606 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700607 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700608 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200609 cricket::AudioSendParameters send_parameters_;
610 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800611 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800612 private:
613 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000614};
615
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000616// Tests that we can create and destroy a channel.
617TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700618 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000619}
620
solenberg31fec402016-05-06 02:13:12 -0700621// Test that we can add a send stream and that it has the correct defaults.
622TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
623 EXPECT_TRUE(SetupChannel());
624 EXPECT_TRUE(
625 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
626 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
627 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
628 EXPECT_EQ("", config.rtp.c_name);
629 EXPECT_EQ(0u, config.rtp.extensions.size());
630 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
631 config.send_transport);
632}
633
634// Test that we can add a receive stream and that it has the correct defaults.
635TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
636 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -0700637 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg31fec402016-05-06 02:13:12 -0700638 const webrtc::AudioReceiveStream::Config& config =
639 GetRecvStreamConfig(kSsrc1);
640 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
641 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
642 EXPECT_FALSE(config.rtp.transport_cc);
643 EXPECT_EQ(0u, config.rtp.extensions.size());
644 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
645 config.rtcp_send_transport);
646 EXPECT_EQ("", config.sync_group);
647}
648
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000649// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700650// correctly (such that opus appears first).
ossudedfd282016-06-14 07:12:39 -0700651// TODO(ossu): This test should move into a separate builtin audio codecs
652// module.
deadbeef67cf2c12016-04-13 10:07:16 -0700653TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
ossudedfd282016-06-14 07:12:39 -0700654 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000655 ASSERT_FALSE(codecs.empty());
656 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
657 EXPECT_EQ(48000, codecs[0].clockrate);
658 EXPECT_EQ(2, codecs[0].channels);
659 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000660}
661
stefanba4c0e42016-02-04 04:12:24 -0800662TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
ossudedfd282016-06-14 07:12:39 -0700663 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -0800664 bool opus_found = false;
665 for (cricket::AudioCodec codec : codecs) {
666 if (codec.name == "opus") {
667 EXPECT_TRUE(HasTransportCc(codec));
668 opus_found = true;
669 }
670 }
671 EXPECT_TRUE(opus_found);
672}
673
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000674// Tests that we can find codecs by name or id, and that we interpret the
675// clockrate and bitrate fields properly.
676TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
677 cricket::AudioCodec codec;
678 webrtc::CodecInst codec_inst;
679 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800680 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000681 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800682 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000683 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg2779bab2016-11-17 04:45:19 -0800684 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec1,
685 &codec_inst));
686 // Find telephone-event with explicit clockrate and 0 bitrate.
687 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec2,
solenberg26c8c912015-11-27 04:00:25 -0800688 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000689 // Find ISAC with a different payload id.
690 codec = kIsacCodec;
691 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800692 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000693 EXPECT_EQ(codec.id, codec_inst.pltype);
694 // Find PCMU with a 0 clockrate.
695 codec = kPcmuCodec;
696 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800697 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000698 EXPECT_EQ(codec.id, codec_inst.pltype);
699 EXPECT_EQ(8000, codec_inst.plfreq);
700 // Find PCMU with a 0 bitrate.
701 codec = kPcmuCodec;
702 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800703 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000704 EXPECT_EQ(codec.id, codec_inst.pltype);
705 EXPECT_EQ(64000, codec_inst.rate);
706 // Find ISAC with an explicit bitrate.
707 codec = kIsacCodec;
708 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800709 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000710 EXPECT_EQ(codec.id, codec_inst.pltype);
711 EXPECT_EQ(32000, codec_inst.rate);
712}
713
714// Test that we set our inbound codecs properly, including changing PT.
715TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700716 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200717 cricket::AudioRecvParameters parameters;
718 parameters.codecs.push_back(kIsacCodec);
719 parameters.codecs.push_back(kPcmuCodec);
solenberg2779bab2016-11-17 04:45:19 -0800720 parameters.codecs.push_back(kTelephoneEventCodec1);
721 parameters.codecs.push_back(kTelephoneEventCodec2);
722 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200723 parameters.codecs[2].id = 126;
724 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700725 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700726 int channel_num = voe_.GetLastChannel();
solenberg2779bab2016-11-17 04:45:19 -0800727
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000728 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800729 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000730 gcodec.plfreq = 16000;
731 gcodec.channels = 1;
732 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
733 EXPECT_EQ(106, gcodec.pltype);
734 EXPECT_STREQ("ISAC", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800735
tfarina5237aaf2015-11-10 23:44:30 -0800736 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000737 gcodec.plfreq = 8000;
738 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
739 EXPECT_EQ(126, gcodec.pltype);
740 EXPECT_STREQ("telephone-event", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800741
742 gcodec.plfreq = 32000;
743 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
744 EXPECT_EQ(107, gcodec.pltype);
745 EXPECT_STREQ("telephone-event", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000746}
747
748// Test that we fail to set an unknown inbound codec.
749TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700750 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200751 cricket::AudioRecvParameters parameters;
752 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700753 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200754 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000755}
756
757// Test that we fail if we have duplicate types in the inbound list.
758TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700759 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200760 cricket::AudioRecvParameters parameters;
761 parameters.codecs.push_back(kIsacCodec);
762 parameters.codecs.push_back(kCn16000Codec);
763 parameters.codecs[1].id = kIsacCodec.id;
764 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000765}
766
767// Test that we can decode OPUS without stereo parameters.
768TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700769 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200770 cricket::AudioRecvParameters parameters;
771 parameters.codecs.push_back(kIsacCodec);
772 parameters.codecs.push_back(kPcmuCodec);
773 parameters.codecs.push_back(kOpusCodec);
774 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700775 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700776 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000777 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800778 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000779 // Even without stereo parameters, recv codecs still specify channels = 2.
780 EXPECT_EQ(2, opus.channels);
781 EXPECT_EQ(111, opus.pltype);
782 EXPECT_STREQ("opus", opus.plname);
783 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700784 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000785 EXPECT_EQ(111, opus.pltype);
786}
787
788// Test that we can decode OPUS with stereo = 0.
789TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700790 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200791 cricket::AudioRecvParameters parameters;
792 parameters.codecs.push_back(kIsacCodec);
793 parameters.codecs.push_back(kPcmuCodec);
794 parameters.codecs.push_back(kOpusCodec);
795 parameters.codecs[2].params["stereo"] = "0";
796 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700797 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000798 int channel_num2 = voe_.GetLastChannel();
799 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800800 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000801 // Even when stereo is off, recv codecs still specify channels = 2.
802 EXPECT_EQ(2, opus.channels);
803 EXPECT_EQ(111, opus.pltype);
804 EXPECT_STREQ("opus", opus.plname);
805 opus.pltype = 0;
806 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
807 EXPECT_EQ(111, opus.pltype);
808}
809
810// Test that we can decode OPUS with stereo = 1.
811TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700812 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200813 cricket::AudioRecvParameters parameters;
814 parameters.codecs.push_back(kIsacCodec);
815 parameters.codecs.push_back(kPcmuCodec);
816 parameters.codecs.push_back(kOpusCodec);
817 parameters.codecs[2].params["stereo"] = "1";
818 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700819 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000820 int channel_num2 = voe_.GetLastChannel();
821 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800822 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000823 EXPECT_EQ(2, opus.channels);
824 EXPECT_EQ(111, opus.pltype);
825 EXPECT_STREQ("opus", opus.plname);
826 opus.pltype = 0;
827 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
828 EXPECT_EQ(111, opus.pltype);
829}
830
831// Test that changes to recv codecs are applied to all streams.
832TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700833 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200834 cricket::AudioRecvParameters parameters;
835 parameters.codecs.push_back(kIsacCodec);
836 parameters.codecs.push_back(kPcmuCodec);
solenberg2779bab2016-11-17 04:45:19 -0800837 parameters.codecs.push_back(kTelephoneEventCodec1);
838 parameters.codecs.push_back(kTelephoneEventCodec2);
839 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200840 parameters.codecs[2].id = 126;
841 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700842 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000843 int channel_num2 = voe_.GetLastChannel();
solenberg2779bab2016-11-17 04:45:19 -0800844
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000845 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800846 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000847 gcodec.plfreq = 16000;
848 gcodec.channels = 1;
849 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
850 EXPECT_EQ(106, gcodec.pltype);
851 EXPECT_STREQ("ISAC", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800852
tfarina5237aaf2015-11-10 23:44:30 -0800853 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000854 gcodec.plfreq = 8000;
855 gcodec.channels = 1;
856 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
857 EXPECT_EQ(126, gcodec.pltype);
858 EXPECT_STREQ("telephone-event", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800859
860 gcodec.plfreq = 32000;
861 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
862 EXPECT_EQ(107, gcodec.pltype);
863 EXPECT_STREQ("telephone-event", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000864}
865
866TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700867 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200868 cricket::AudioRecvParameters parameters;
869 parameters.codecs.push_back(kIsacCodec);
solenberg2779bab2016-11-17 04:45:19 -0800870 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200871 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000872
873 int channel_num2 = voe_.GetLastChannel();
874 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800875 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000876 gcodec.plfreq = 16000;
877 gcodec.channels = 1;
878 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
879 EXPECT_EQ(106, gcodec.pltype);
880 EXPECT_STREQ("ISAC", gcodec.plname);
881}
882
883// Test that we can apply the same set of codecs again while playing.
884TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700885 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200886 cricket::AudioRecvParameters parameters;
887 parameters.codecs.push_back(kIsacCodec);
888 parameters.codecs.push_back(kCn16000Codec);
889 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700890 channel_->SetPlayout(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200891 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000892
893 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200894 parameters.codecs[0].id = 127;
895 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700896 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000897}
898
899// Test that we can add a codec while playing.
900TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700901 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200902 cricket::AudioRecvParameters parameters;
903 parameters.codecs.push_back(kIsacCodec);
904 parameters.codecs.push_back(kCn16000Codec);
905 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700906 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000907
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200908 parameters.codecs.push_back(kOpusCodec);
909 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700910 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000911 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800912 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000913 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
914}
915
916TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700917 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000918
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000919 // Test that when autobw is enabled, bitrate is kept as the default
920 // value. autobw is enabled for the following tests because the target
921 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000922
923 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700924 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000925
926 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700927 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000928
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000929 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700930 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000931}
932
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000933TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700934 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000935
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000936 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000937
938 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700939 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
940 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
941 // Rates above the max (56000) should be capped.
942 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000943
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000944 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700945 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
946 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
947 // Rates above the max (510000) should be capped.
948 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000949}
950
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000951TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700952 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000953
954 // Test that we can only set a maximum bitrate for a fixed-rate codec
955 // if it's bigger than the fixed rate.
956
957 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700958 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
959 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
960 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
961 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
962 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
963 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
964 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000965}
966
967TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700968 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200969 const int kDesiredBitrate = 128000;
970 cricket::AudioSendParameters parameters;
ossudedfd282016-06-14 07:12:39 -0700971 parameters.codecs = engine_->send_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200972 parameters.max_bandwidth_bps = kDesiredBitrate;
solenberg059fb442016-10-26 05:12:24 -0700973 SetSendParameters(parameters);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000974
975 EXPECT_TRUE(channel_->AddSendStream(
976 cricket::StreamParams::CreateLegacy(kSsrc1)));
977
minyue7a973442016-10-20 03:27:12 -0700978 EXPECT_EQ(kDesiredBitrate, GetCodecBitrate(kSsrc1));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000979}
980
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000981// Test that bitrate cannot be set for CBR codecs.
982// Bitrate is ignored if it is higher than the fixed bitrate.
983// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000984TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700985 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000986
987 // PCMU, default bitrate == 64000.
solenberg059fb442016-10-26 05:12:24 -0700988 SetSendParameters(send_parameters_);
minyue7a973442016-10-20 03:27:12 -0700989 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200990
991 send_parameters_.max_bandwidth_bps = 128000;
solenberg059fb442016-10-26 05:12:24 -0700992 SetSendParameters(send_parameters_);
minyue7a973442016-10-20 03:27:12 -0700993 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200994
995 send_parameters_.max_bandwidth_bps = 128;
996 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
minyue7a973442016-10-20 03:27:12 -0700997 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000998}
999
skvlade0d46372016-04-07 22:59:22 -07001000// Test that the per-stream bitrate limit and the global
1001// bitrate limit both apply.
1002TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
1003 EXPECT_TRUE(SetupSendStream());
1004
1005 // opus, default bitrate == 64000.
1006 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
1007 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
1008 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
1009 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
1010
1011 // CBR codecs allow both maximums to exceed the bitrate.
1012 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
1013 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
1014 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
1015 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
1016
1017 // CBR codecs don't allow per stream maximums to be too low.
1018 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
1019 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
1020}
1021
1022// Test that an attempt to set RtpParameters for a stream that does not exist
1023// fails.
1024TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
1025 EXPECT_TRUE(SetupChannel());
1026 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001027 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -07001028 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
1029
1030 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001031 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -07001032}
1033
1034TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001035 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -07001036 // This test verifies that setting RtpParameters succeeds only if
1037 // the structure contains exactly one encoding.
1038 // TODO(skvlad): Update this test when we start supporting setting parameters
1039 // for each encoding individually.
1040
1041 EXPECT_TRUE(SetupSendStream());
1042 // Setting RtpParameters with no encoding is expected to fail.
1043 webrtc::RtpParameters parameters;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001044 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -07001045 // Setting RtpParameters with exactly one encoding should succeed.
1046 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001047 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -07001048 // Two or more encodings should result in failure.
1049 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001050 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -07001051}
1052
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001053// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001054// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001055TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
1056 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07001057 SetSend(true);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001058 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
1059 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001060 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001061 ASSERT_EQ(1u, parameters.encodings.size());
1062 ASSERT_TRUE(parameters.encodings[0].active);
1063 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001064 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001065 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
1066
1067 // Now change it back to active and verify we resume sending.
1068 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001069 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001070 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
1071}
1072
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001073// Test that SetRtpSendParameters configures the correct encoding channel for
1074// each SSRC.
skvlade0d46372016-04-07 22:59:22 -07001075TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
1076 SetupForMultiSendStream();
1077 // Create send streams.
1078 for (uint32_t ssrc : kSsrcs4) {
1079 EXPECT_TRUE(
1080 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
1081 }
1082 // Configure one stream to be limited by the stream config, another to be
1083 // limited by the global max, and the third one with no per-stream limit
1084 // (still subject to the global limit).
solenberg059fb442016-10-26 05:12:24 -07001085 SetGlobalMaxBitrate(kOpusCodec, 64000);
skvlade0d46372016-04-07 22:59:22 -07001086 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
1087 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
1088 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
1089
1090 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
1091 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
1092 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
1093
1094 // Remove the global cap; the streams should switch to their respective
1095 // maximums (or remain unchanged if there was no other limit on them.)
solenberg059fb442016-10-26 05:12:24 -07001096 SetGlobalMaxBitrate(kOpusCodec, -1);
skvlade0d46372016-04-07 22:59:22 -07001097 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
1098 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
1099 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
1100}
1101
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001102// Test that GetRtpSendParameters returns the currently configured codecs.
1103TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001104 EXPECT_TRUE(SetupSendStream());
1105 cricket::AudioSendParameters parameters;
1106 parameters.codecs.push_back(kIsacCodec);
1107 parameters.codecs.push_back(kPcmuCodec);
solenberg059fb442016-10-26 05:12:24 -07001108 SetSendParameters(parameters);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001109
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001110 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001111 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001112 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1113 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001114}
1115
deadbeefcb443432016-12-12 11:12:36 -08001116// Test that GetRtpSendParameters returns an SSRC.
1117TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersSsrc) {
1118 EXPECT_TRUE(SetupSendStream());
1119 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
1120 ASSERT_EQ(1u, rtp_parameters.encodings.size());
1121 EXPECT_EQ(kSsrc1, rtp_parameters.encodings[0].ssrc);
1122}
1123
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001124// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001125TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001126 EXPECT_TRUE(SetupSendStream());
1127 cricket::AudioSendParameters parameters;
1128 parameters.codecs.push_back(kIsacCodec);
1129 parameters.codecs.push_back(kPcmuCodec);
solenberg059fb442016-10-26 05:12:24 -07001130 SetSendParameters(parameters);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001131
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001132 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001133
1134 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001135 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001136
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001137 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1138 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1139 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1140}
1141
1142// Test that GetRtpReceiveParameters returns the currently configured codecs.
1143TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1144 EXPECT_TRUE(SetupRecvStream());
1145 cricket::AudioRecvParameters parameters;
1146 parameters.codecs.push_back(kIsacCodec);
1147 parameters.codecs.push_back(kPcmuCodec);
1148 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1149
1150 webrtc::RtpParameters rtp_parameters =
1151 channel_->GetRtpReceiveParameters(kSsrc1);
1152 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1153 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1154 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1155}
1156
deadbeefcb443432016-12-12 11:12:36 -08001157// Test that GetRtpReceiveParameters returns an SSRC.
1158TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersSsrc) {
1159 EXPECT_TRUE(SetupRecvStream());
1160 webrtc::RtpParameters rtp_parameters =
1161 channel_->GetRtpReceiveParameters(kSsrc1);
1162 ASSERT_EQ(1u, rtp_parameters.encodings.size());
1163 EXPECT_EQ(kSsrc1, rtp_parameters.encodings[0].ssrc);
1164}
1165
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001166// Test that if we set/get parameters multiple times, we get the same results.
1167TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1168 EXPECT_TRUE(SetupRecvStream());
1169 cricket::AudioRecvParameters parameters;
1170 parameters.codecs.push_back(kIsacCodec);
1171 parameters.codecs.push_back(kPcmuCodec);
1172 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1173
1174 webrtc::RtpParameters initial_params =
1175 channel_->GetRtpReceiveParameters(kSsrc1);
1176
1177 // We should be able to set the params we just got.
1178 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1179
1180 // ... And this shouldn't change the params returned by
1181 // GetRtpReceiveParameters.
1182 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1183 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001184}
1185
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001186// Test that we apply codecs properly.
1187TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001188 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001189 cricket::AudioSendParameters parameters;
1190 parameters.codecs.push_back(kIsacCodec);
1191 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001192 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001193 parameters.codecs[0].id = 96;
1194 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001195 const int initial_num = call_.GetNumCreatedSendStreams();
solenberg059fb442016-10-26 05:12:24 -07001196 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001197 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
1198 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1199 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1200 EXPECT_EQ(48000, send_codec_spec.codec_inst.rate);
1201 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1202 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1203 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
1204 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001205 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001206}
1207
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001208// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1209// to apply.
1210TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001211 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001212 cricket::AudioSendParameters parameters;
1213 parameters.codecs.push_back(kIsacCodec);
1214 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001215 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001216 parameters.codecs[0].id = 96;
1217 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001218 const int initial_num = call_.GetNumCreatedSendStreams();
solenberg059fb442016-10-26 05:12:24 -07001219 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001220 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001221 // Calling SetSendCodec again with same codec which is already set.
1222 // In this case media channel shouldn't send codec to VoE.
solenberg059fb442016-10-26 05:12:24 -07001223 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001224 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001225}
1226
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001227// Verify that G722 is set with 16000 samples per second to WebRTC.
1228TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001229 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001230 cricket::AudioSendParameters parameters;
1231 parameters.codecs.push_back(kG722CodecSdp);
solenberg059fb442016-10-26 05:12:24 -07001232 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001233 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001234 EXPECT_STREQ("G722", gcodec.plname);
1235 EXPECT_EQ(1, gcodec.channels);
1236 EXPECT_EQ(16000, gcodec.plfreq);
1237}
1238
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001239// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001240TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001241 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001242 cricket::AudioSendParameters parameters;
1243 parameters.codecs.push_back(kOpusCodec);
1244 parameters.codecs[0].bitrate = 0;
1245 parameters.codecs[0].clockrate = 50000;
1246 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001247}
1248
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001249// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001250TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001251 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001252 cricket::AudioSendParameters parameters;
1253 parameters.codecs.push_back(kOpusCodec);
1254 parameters.codecs[0].bitrate = 0;
1255 parameters.codecs[0].channels = 0;
1256 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001257}
1258
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001259// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001260TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001261 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001262 cricket::AudioSendParameters parameters;
1263 parameters.codecs.push_back(kOpusCodec);
1264 parameters.codecs[0].bitrate = 0;
1265 parameters.codecs[0].channels = 0;
1266 parameters.codecs[0].params["stereo"] = "1";
1267 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001268}
1269
1270// Test that if channel is 1 for opus and there's no stereo, we fail.
1271TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001272 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001273 cricket::AudioSendParameters parameters;
1274 parameters.codecs.push_back(kOpusCodec);
1275 parameters.codecs[0].bitrate = 0;
1276 parameters.codecs[0].channels = 1;
1277 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001278}
1279
1280// Test that if channel is 1 for opus and stereo=0, we fail.
1281TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001282 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001283 cricket::AudioSendParameters parameters;
1284 parameters.codecs.push_back(kOpusCodec);
1285 parameters.codecs[0].bitrate = 0;
1286 parameters.codecs[0].channels = 1;
1287 parameters.codecs[0].params["stereo"] = "0";
1288 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001289}
1290
1291// Test that if channel is 1 for opus and stereo=1, we fail.
1292TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001293 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001294 cricket::AudioSendParameters parameters;
1295 parameters.codecs.push_back(kOpusCodec);
1296 parameters.codecs[0].bitrate = 0;
1297 parameters.codecs[0].channels = 1;
1298 parameters.codecs[0].params["stereo"] = "1";
1299 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001300}
1301
1302// Test that with bitrate=0 and no stereo,
1303// channels and bitrate are 1 and 32000.
1304TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001305 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001306 cricket::AudioSendParameters parameters;
1307 parameters.codecs.push_back(kOpusCodec);
1308 parameters.codecs[0].bitrate = 0;
solenberg059fb442016-10-26 05:12:24 -07001309 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001310 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001311}
1312
1313// Test that with bitrate=0 and stereo=0,
1314// channels and bitrate are 1 and 32000.
1315TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001316 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001317 cricket::AudioSendParameters parameters;
1318 parameters.codecs.push_back(kOpusCodec);
1319 parameters.codecs[0].bitrate = 0;
1320 parameters.codecs[0].params["stereo"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001321 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001322 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001323}
1324
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001325// Test that with bitrate=invalid and stereo=0,
1326// channels and bitrate are 1 and 32000.
1327TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001328 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001329 cricket::AudioSendParameters parameters;
1330 parameters.codecs.push_back(kOpusCodec);
1331 parameters.codecs[0].params["stereo"] = "0";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001332 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001333 parameters.codecs[0].bitrate = 5999;
solenberg059fb442016-10-26 05:12:24 -07001334 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001335 CheckSendCodec(kSsrc1, "opus", 1, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001336
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001337 parameters.codecs[0].bitrate = 510001;
solenberg059fb442016-10-26 05:12:24 -07001338 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001339 CheckSendCodec(kSsrc1, "opus", 1, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001340}
1341
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001342// Test that with bitrate=0 and stereo=1,
1343// channels and bitrate are 2 and 64000.
1344TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001345 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001346 cricket::AudioSendParameters parameters;
1347 parameters.codecs.push_back(kOpusCodec);
1348 parameters.codecs[0].bitrate = 0;
1349 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001350 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001351 CheckSendCodec(kSsrc1, "opus", 2, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001352}
1353
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001354// Test that with bitrate=invalid and stereo=1,
1355// channels and bitrate are 2 and 64000.
1356TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001357 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001358 cricket::AudioSendParameters parameters;
1359 parameters.codecs.push_back(kOpusCodec);
1360 parameters.codecs[0].params["stereo"] = "1";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001361 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001362 parameters.codecs[0].bitrate = 5999;
solenberg059fb442016-10-26 05:12:24 -07001363 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001364 CheckSendCodec(kSsrc1, "opus", 2, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001365
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001366 parameters.codecs[0].bitrate = 510001;
solenberg059fb442016-10-26 05:12:24 -07001367 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001368 CheckSendCodec(kSsrc1, "opus", 2, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001369}
1370
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001371// Test that with bitrate=N and stereo unset,
1372// channels and bitrate are 1 and N.
1373TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001374 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001375 cricket::AudioSendParameters parameters;
1376 parameters.codecs.push_back(kOpusCodec);
1377 parameters.codecs[0].bitrate = 96000;
solenberg059fb442016-10-26 05:12:24 -07001378 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001379 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001380 EXPECT_EQ(111, gcodec.pltype);
1381 EXPECT_EQ(96000, gcodec.rate);
1382 EXPECT_STREQ("opus", gcodec.plname);
1383 EXPECT_EQ(1, gcodec.channels);
1384 EXPECT_EQ(48000, gcodec.plfreq);
1385}
1386
1387// Test that with bitrate=N and stereo=0,
1388// channels and bitrate are 1 and N.
1389TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001390 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001391 cricket::AudioSendParameters parameters;
1392 parameters.codecs.push_back(kOpusCodec);
1393 parameters.codecs[0].bitrate = 30000;
1394 parameters.codecs[0].params["stereo"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001395 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001396 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001397}
1398
1399// Test that with bitrate=N and without any parameters,
1400// channels and bitrate are 1 and N.
1401TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001402 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001403 cricket::AudioSendParameters parameters;
1404 parameters.codecs.push_back(kOpusCodec);
1405 parameters.codecs[0].bitrate = 30000;
solenberg059fb442016-10-26 05:12:24 -07001406 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001407 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001408}
1409
1410// Test that with bitrate=N and stereo=1,
1411// channels and bitrate are 2 and N.
1412TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001413 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001414 cricket::AudioSendParameters parameters;
1415 parameters.codecs.push_back(kOpusCodec);
1416 parameters.codecs[0].bitrate = 30000;
1417 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001418 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001419 CheckSendCodec(kSsrc1, "opus", 2, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001420}
1421
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001422// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1423// Also test that the "maxaveragebitrate" can't be set to values outside the
1424// range of 6000 and 510000
1425TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001426 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001427 cricket::AudioSendParameters parameters;
1428 parameters.codecs.push_back(kOpusCodec);
1429 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001430 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001431 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
solenberg059fb442016-10-26 05:12:24 -07001432 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001433 EXPECT_EQ(6000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001434
1435 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001436 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
solenberg059fb442016-10-26 05:12:24 -07001437 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001438 EXPECT_EQ(510000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001439
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001440 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
solenberg059fb442016-10-26 05:12:24 -07001441 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001442 EXPECT_EQ(200000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001443}
1444
stefan13f1a0a2016-11-30 07:22:58 -08001445TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithBitrates) {
1446 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1447 200000);
1448}
1449
1450TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithHighMaxBitrate) {
1451 SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "10000", 10000000);
1452}
1453
1454TEST_F(WebRtcVoiceEngineTestFake,
1455 SetSendCodecsWithoutBitratesUsesCorrectDefaults) {
1456 SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "", -1);
1457}
1458
1459TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCapsMinAndStartBitrate) {
1460 SetSendCodecsShouldWorkForBitrates("-1", 0, "-100", -1, "", -1);
1461}
1462
1463TEST_F(WebRtcVoiceEngineTestFake,
1464 SetMaxSendBandwidthShouldPreserveOtherBitrates) {
1465 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1466 200000);
1467 send_parameters_.max_bandwidth_bps = 300000;
1468 SetSendParameters(send_parameters_);
1469 EXPECT_EQ(100000, call_.GetConfig().bitrate_config.min_bitrate_bps)
1470 << "Setting max bitrate should keep previous min bitrate.";
1471 EXPECT_EQ(-1, call_.GetConfig().bitrate_config.start_bitrate_bps)
1472 << "Setting max bitrate should not reset start bitrate.";
1473 EXPECT_EQ(300000, call_.GetConfig().bitrate_config.max_bitrate_bps);
1474}
1475
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001476// Test that we can enable NACK with opus as caller.
1477TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001478 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001479 cricket::AudioSendParameters parameters;
1480 parameters.codecs.push_back(kOpusCodec);
1481 parameters.codecs[0].AddFeedbackParam(
1482 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1483 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001484 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001485 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001486 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001487}
1488
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001489// Test that we can enable NACK with opus as callee.
1490TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001491 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001492 cricket::AudioSendParameters parameters;
1493 parameters.codecs.push_back(kOpusCodec);
1494 parameters.codecs[0].AddFeedbackParam(
1495 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1496 cricket::kParamValueEmpty));
solenberg8189b022016-06-14 12:13:00 -07001497 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001498 SetSendParameters(parameters);
deadbeefb56069e2016-05-06 04:57:03 -07001499 // NACK should be enabled even with no send stream.
solenberg8189b022016-06-14 12:13:00 -07001500 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001501
1502 EXPECT_TRUE(channel_->AddSendStream(
1503 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg971cab02016-06-14 10:02:41 -07001504 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001505}
1506
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001507// Test that we can enable NACK on receive streams.
1508TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001509 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001510 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001511 cricket::AudioSendParameters parameters;
1512 parameters.codecs.push_back(kOpusCodec);
1513 parameters.codecs[0].AddFeedbackParam(
1514 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1515 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001516 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001517 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001518 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001519 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001520 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001521}
1522
1523// Test that we can disable NACK.
1524TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001525 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001526 cricket::AudioSendParameters parameters;
1527 parameters.codecs.push_back(kOpusCodec);
1528 parameters.codecs[0].AddFeedbackParam(
1529 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1530 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001531 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001532 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001533
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001534 parameters.codecs.clear();
1535 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001536 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001537 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001538}
1539
1540// Test that we can disable NACK on receive streams.
1541TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001542 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001543 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001544 cricket::AudioSendParameters parameters;
1545 parameters.codecs.push_back(kOpusCodec);
1546 parameters.codecs[0].AddFeedbackParam(
1547 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1548 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001549 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001550 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001551 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001552
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001553 parameters.codecs.clear();
1554 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001555 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001556 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001557 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001558}
1559
1560// Test that NACK is enabled on a new receive stream.
1561TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001562 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001563 cricket::AudioSendParameters parameters;
1564 parameters.codecs.push_back(kIsacCodec);
1565 parameters.codecs.push_back(kCn16000Codec);
1566 parameters.codecs[0].AddFeedbackParam(
1567 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1568 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001569 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001570 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001571
solenberg8189b022016-06-14 12:13:00 -07001572 EXPECT_TRUE(AddRecvStream(kSsrc2));
1573 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
1574 EXPECT_TRUE(AddRecvStream(kSsrc3));
1575 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc3).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001576}
1577
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001578// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001579TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001580 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001581 cricket::AudioSendParameters parameters;
1582 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001583 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001584 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001585}
1586
1587// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001588TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001589 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001590 cricket::AudioSendParameters parameters;
1591 parameters.codecs.push_back(kOpusCodec);
1592 parameters.codecs[0].bitrate = 0;
1593 parameters.codecs[0].params["useinbandfec"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001594 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001595 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001596}
1597
1598// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001599TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001600 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001601 cricket::AudioSendParameters parameters;
1602 parameters.codecs.push_back(kOpusCodec);
1603 parameters.codecs[0].bitrate = 0;
1604 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001605 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001606 EXPECT_TRUE(GetCodecFec(kSsrc1));
1607 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001608}
1609
1610// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001611TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001612 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001613 cricket::AudioSendParameters parameters;
1614 parameters.codecs.push_back(kOpusCodec);
1615 parameters.codecs[0].bitrate = 0;
1616 parameters.codecs[0].params["stereo"] = "1";
1617 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001618 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001619 EXPECT_TRUE(GetCodecFec(kSsrc1));
1620 CheckSendCodec(kSsrc1, "opus", 2, 64000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001621}
1622
1623// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001624TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001625 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001626 cricket::AudioSendParameters parameters;
1627 parameters.codecs.push_back(kIsacCodec);
solenberg059fb442016-10-26 05:12:24 -07001628 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001629 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001630}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001631
1632// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1633TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001634 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001635 cricket::AudioSendParameters parameters;
1636 parameters.codecs.push_back(kIsacCodec);
1637 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001638 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001639 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001640}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001641
1642// Test that Opus FEC status can be changed.
1643TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001644 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001645 cricket::AudioSendParameters parameters;
1646 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001647 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001648 EXPECT_FALSE(GetCodecFec(kSsrc1));
1649
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001650 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001651 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001652 EXPECT_TRUE(GetCodecFec(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001653}
1654
stefanba4c0e42016-02-04 04:12:24 -08001655TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001656 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001657 cricket::AudioSendParameters send_parameters;
1658 send_parameters.codecs.push_back(kOpusCodec);
1659 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
solenberg059fb442016-10-26 05:12:24 -07001660 SetSendParameters(send_parameters);
stefanba4c0e42016-02-04 04:12:24 -08001661
1662 cricket::AudioRecvParameters recv_parameters;
1663 recv_parameters.codecs.push_back(kIsacCodec);
1664 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
solenberg8189b022016-06-14 12:13:00 -07001665 EXPECT_TRUE(AddRecvStream(kSsrc1));
stefanba4c0e42016-02-04 04:12:24 -08001666 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1667 EXPECT_FALSE(
1668 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1669
ossudedfd282016-06-14 07:12:39 -07001670 send_parameters.codecs = engine_->send_codecs();
solenberg059fb442016-10-26 05:12:24 -07001671 SetSendParameters(send_parameters);
stefanba4c0e42016-02-04 04:12:24 -08001672 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1673 EXPECT_TRUE(
1674 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1675}
1676
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001677// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1678TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001679 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001680 cricket::AudioSendParameters parameters;
1681 parameters.codecs.push_back(kOpusCodec);
1682 parameters.codecs[0].bitrate = 0;
1683 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
solenberg059fb442016-10-26 05:12:24 -07001684 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001685 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
1686 EXPECT_EQ(12000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001687
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001688 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001689 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001690 EXPECT_EQ(24000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001691}
1692
1693// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1694TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001695 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001696 cricket::AudioSendParameters parameters;
1697 parameters.codecs.push_back(kOpusCodec);
1698 parameters.codecs[0].bitrate = 0;
1699 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
solenberg059fb442016-10-26 05:12:24 -07001700 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001701 EXPECT_EQ(8001, GetOpusMaxPlaybackRate(kSsrc1));
1702 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001703
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001704 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001705 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001706 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001707}
1708
1709// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1710TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001711 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001712 cricket::AudioSendParameters parameters;
1713 parameters.codecs.push_back(kOpusCodec);
1714 parameters.codecs[0].bitrate = 0;
1715 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
solenberg059fb442016-10-26 05:12:24 -07001716 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001717 EXPECT_EQ(12001, GetOpusMaxPlaybackRate(kSsrc1));
1718 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001719
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001720 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001721 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001722 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001723}
1724
1725// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1726TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001727 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001728 cricket::AudioSendParameters parameters;
1729 parameters.codecs.push_back(kOpusCodec);
1730 parameters.codecs[0].bitrate = 0;
1731 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
solenberg059fb442016-10-26 05:12:24 -07001732 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001733 EXPECT_EQ(16001, GetOpusMaxPlaybackRate(kSsrc1));
1734 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001735
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001736 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001737 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001738 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001739}
1740
1741// Test 24000 < maxplaybackrate triggers Opus full band mode.
1742TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001743 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001744 cricket::AudioSendParameters parameters;
1745 parameters.codecs.push_back(kOpusCodec);
1746 parameters.codecs[0].bitrate = 0;
1747 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
solenberg059fb442016-10-26 05:12:24 -07001748 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001749 EXPECT_EQ(24001, GetOpusMaxPlaybackRate(kSsrc1));
1750 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001751
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001752 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001753 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001754 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001755}
1756
1757// Test Opus that without maxplaybackrate, default playback rate is used.
1758TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001759 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001760 cricket::AudioSendParameters parameters;
1761 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001762 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001763 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001764}
1765
1766// Test the with non-Opus, maxplaybackrate has no effect.
1767TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001768 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001769 cricket::AudioSendParameters parameters;
1770 parameters.codecs.push_back(kIsacCodec);
1771 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
solenberg059fb442016-10-26 05:12:24 -07001772 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001773 EXPECT_EQ(0, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001774}
1775
1776// Test maxplaybackrate can be set on two streams.
1777TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001778 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001779 cricket::AudioSendParameters parameters;
1780 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001781 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001782 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001783
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001784 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
solenberg059fb442016-10-26 05:12:24 -07001785 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001786 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001787
1788 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
minyue7a973442016-10-20 03:27:12 -07001789 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc2));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001790}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001791
Minyue Li7100dcd2015-03-27 05:05:59 +01001792// Test that with usedtx=0, Opus DTX is off.
1793TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001794 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001795 cricket::AudioSendParameters parameters;
1796 parameters.codecs.push_back(kOpusCodec);
1797 parameters.codecs[0].params["usedtx"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001798 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001799 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001800}
1801
1802// Test that with usedtx=1, Opus DTX is on.
1803TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001804 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001805 cricket::AudioSendParameters parameters;
1806 parameters.codecs.push_back(kOpusCodec);
1807 parameters.codecs[0].params["usedtx"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001808 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001809 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001810}
1811
1812// Test that usedtx=1 works with stereo Opus.
1813TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001814 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001815 cricket::AudioSendParameters parameters;
1816 parameters.codecs.push_back(kOpusCodec);
1817 parameters.codecs[0].params["usedtx"] = "1";
1818 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001819 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001820 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001821}
1822
1823// Test that usedtx=1 does not work with non Opus.
1824TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001825 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001826 cricket::AudioSendParameters parameters;
1827 parameters.codecs.push_back(kIsacCodec);
1828 parameters.codecs[0].params["usedtx"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001829 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001830 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001831}
1832
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001833// Test that we can switch back and forth between Opus and ISAC with CN.
1834TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001835 EXPECT_TRUE(SetupSendStream());
minyue7a973442016-10-20 03:27:12 -07001836
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001837 cricket::AudioSendParameters opus_parameters;
1838 opus_parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001839 SetSendParameters(opus_parameters);
minyue7a973442016-10-20 03:27:12 -07001840 {
1841 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1842 EXPECT_EQ(111, gcodec.pltype);
1843 EXPECT_STREQ("opus", gcodec.plname);
1844 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001845
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001846 cricket::AudioSendParameters isac_parameters;
1847 isac_parameters.codecs.push_back(kIsacCodec);
1848 isac_parameters.codecs.push_back(kCn16000Codec);
1849 isac_parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001850 SetSendParameters(isac_parameters);
minyue7a973442016-10-20 03:27:12 -07001851 {
1852 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1853 EXPECT_EQ(103, gcodec.pltype);
1854 EXPECT_STREQ("ISAC", gcodec.plname);
1855 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001856
solenberg059fb442016-10-26 05:12:24 -07001857 SetSendParameters(opus_parameters);
minyue7a973442016-10-20 03:27:12 -07001858 {
1859 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1860 EXPECT_EQ(111, gcodec.pltype);
1861 EXPECT_STREQ("opus", gcodec.plname);
1862 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001863}
1864
1865// Test that we handle various ways of specifying bitrate.
1866TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001867 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001868 cricket::AudioSendParameters parameters;
1869 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
solenberg059fb442016-10-26 05:12:24 -07001870 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001871 {
1872 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1873 EXPECT_EQ(103, gcodec.pltype);
1874 EXPECT_STREQ("ISAC", gcodec.plname);
1875 EXPECT_EQ(32000, gcodec.rate);
1876 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001877
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001878 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001879 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001880 {
1881 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1882 EXPECT_EQ(103, gcodec.pltype);
1883 EXPECT_STREQ("ISAC", gcodec.plname);
1884 EXPECT_EQ(-1, gcodec.rate);
1885 }
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001886 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
solenberg059fb442016-10-26 05:12:24 -07001887 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001888 {
1889 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1890 EXPECT_EQ(103, gcodec.pltype);
1891 EXPECT_STREQ("ISAC", gcodec.plname);
1892 EXPECT_EQ(28000, gcodec.rate);
1893 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001894
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001895 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
solenberg059fb442016-10-26 05:12:24 -07001896 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001897 {
1898 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1899 EXPECT_EQ(0, gcodec.pltype);
1900 EXPECT_STREQ("PCMU", gcodec.plname);
1901 EXPECT_EQ(64000, gcodec.rate);
1902 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001903
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001904 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001905 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001906 {
1907 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1908 EXPECT_EQ(0, gcodec.pltype);
1909 EXPECT_STREQ("PCMU", gcodec.plname);
1910 EXPECT_EQ(64000, gcodec.rate);
1911 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001912
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001913 parameters.codecs[0] = kOpusCodec;
1914 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001915 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001916 {
1917 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1918 EXPECT_EQ(111, gcodec.pltype);
1919 EXPECT_STREQ("opus", gcodec.plname);
1920 EXPECT_EQ(32000, gcodec.rate);
1921 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001922}
1923
Brave Yao5225dd82015-03-26 07:39:19 +08001924// Test that we could set packet size specified in kCodecParamPTime.
1925TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001926 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001927 cricket::AudioSendParameters parameters;
1928 parameters.codecs.push_back(kOpusCodec);
1929 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
solenberg059fb442016-10-26 05:12:24 -07001930 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001931 EXPECT_EQ(1920, GetCodecPacSize(kSsrc1)); // Opus gets 40ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001932
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001933 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
solenberg059fb442016-10-26 05:12:24 -07001934 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001935 EXPECT_EQ(480, GetCodecPacSize(kSsrc1)); // Opus gets 10ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001936
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001937 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
solenberg059fb442016-10-26 05:12:24 -07001938 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001939 EXPECT_EQ(2880, GetCodecPacSize(kSsrc1)); // Opus gets 60ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001940
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001941 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1942 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
solenberg059fb442016-10-26 05:12:24 -07001943 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001944 EXPECT_EQ(480, GetCodecPacSize(
1945 kSsrc1)); // Isac gets 30ms as the next smallest value.
Brave Yao5225dd82015-03-26 07:39:19 +08001946
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001947 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1948 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
solenberg059fb442016-10-26 05:12:24 -07001949 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001950 EXPECT_EQ(640, GetCodecPacSize(
1951 kSsrc1)); // G722 gets 40ms @16kHz as defined in VoE.
Brave Yao5225dd82015-03-26 07:39:19 +08001952}
1953
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001954// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001955TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001956 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001957 cricket::AudioSendParameters parameters;
1958 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001959}
1960
1961// Test that we can set send codecs even with telephone-event codec as the first
1962// one on the list.
1963TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001964 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001965 cricket::AudioSendParameters parameters;
solenberg2779bab2016-11-17 04:45:19 -08001966 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001967 parameters.codecs.push_back(kIsacCodec);
1968 parameters.codecs.push_back(kPcmuCodec);
1969 parameters.codecs[0].id = 98; // DTMF
1970 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001971 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001972 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001973 EXPECT_EQ(96, gcodec.pltype);
1974 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001975 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001976}
1977
solenberg31642aa2016-03-14 08:00:37 -07001978// Test that payload type range is limited for telephone-event codec.
1979TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001980 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001981 cricket::AudioSendParameters parameters;
solenbergffbbcac2016-11-17 05:25:37 -08001982 parameters.codecs.push_back(kTelephoneEventCodec2);
solenberg31642aa2016-03-14 08:00:37 -07001983 parameters.codecs.push_back(kIsacCodec);
1984 parameters.codecs[0].id = 0; // DTMF
1985 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001986 SetSendParameters(parameters);
solenberg31642aa2016-03-14 08:00:37 -07001987 EXPECT_TRUE(channel_->CanInsertDtmf());
1988 parameters.codecs[0].id = 128; // DTMF
1989 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1990 EXPECT_FALSE(channel_->CanInsertDtmf());
1991 parameters.codecs[0].id = 127;
solenberg059fb442016-10-26 05:12:24 -07001992 SetSendParameters(parameters);
solenberg31642aa2016-03-14 08:00:37 -07001993 EXPECT_TRUE(channel_->CanInsertDtmf());
1994 parameters.codecs[0].id = -1; // DTMF
1995 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1996 EXPECT_FALSE(channel_->CanInsertDtmf());
1997}
1998
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001999// Test that we can set send codecs even with CN codec as the first
2000// one on the list.
2001TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07002002 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002003 cricket::AudioSendParameters parameters;
2004 parameters.codecs.push_back(kCn16000Codec);
2005 parameters.codecs.push_back(kIsacCodec);
2006 parameters.codecs.push_back(kPcmuCodec);
2007 parameters.codecs[0].id = 98; // wideband CN
2008 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07002009 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002010 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2011 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2012 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2013 EXPECT_EQ(98, send_codec_spec.cng_payload_type);
2014 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002015}
2016
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002017// Test that we set VAD and DTMF types correctly as caller.
2018TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07002019 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002020 cricket::AudioSendParameters parameters;
2021 parameters.codecs.push_back(kIsacCodec);
2022 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002023 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002024 parameters.codecs.push_back(kCn16000Codec);
2025 parameters.codecs.push_back(kCn8000Codec);
solenberg2779bab2016-11-17 04:45:19 -08002026 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002027 parameters.codecs[0].id = 96;
2028 parameters.codecs[2].id = 97; // wideband CN
2029 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07002030 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002031 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2032 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2033 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2034 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2035 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2036 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2037 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002038 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002039}
2040
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002041// Test that we set VAD and DTMF types correctly as callee.
2042TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07002043 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002044 cricket::AudioSendParameters parameters;
2045 parameters.codecs.push_back(kIsacCodec);
2046 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002047 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002048 parameters.codecs.push_back(kCn16000Codec);
2049 parameters.codecs.push_back(kCn8000Codec);
solenbergffbbcac2016-11-17 05:25:37 -08002050 parameters.codecs.push_back(kTelephoneEventCodec2);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002051 parameters.codecs[0].id = 96;
2052 parameters.codecs[2].id = 97; // wideband CN
2053 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07002054 SetSendParameters(parameters);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002055 EXPECT_TRUE(channel_->AddSendStream(
2056 cricket::StreamParams::CreateLegacy(kSsrc1)));
2057
minyue7a973442016-10-20 03:27:12 -07002058 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2059 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2060 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2061 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2062 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2063 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2064 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002065 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002066}
2067
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002068// Test that we only apply VAD if we have a CN codec that matches the
2069// send codec clockrate.
2070TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07002071 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002072 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002073 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002074 parameters.codecs.push_back(kIsacCodec);
2075 parameters.codecs.push_back(kCn16000Codec);
2076 parameters.codecs[1].id = 97;
solenberg059fb442016-10-26 05:12:24 -07002077 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002078 {
2079 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2080 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2081 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2082 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2083 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2084 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
2085 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002086 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002087 parameters.codecs[0] = kPcmuCodec;
solenberg059fb442016-10-26 05:12:24 -07002088 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002089 {
2090 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2091 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2092 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2093 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002094 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002095 parameters.codecs[1] = kCn8000Codec;
solenberg059fb442016-10-26 05:12:24 -07002096 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002097 {
2098 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2099 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2100 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2101 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2102 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
2103 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
2104 }
Brave Yao5225dd82015-03-26 07:39:19 +08002105 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002106 parameters.codecs[0] = kIsacCodec;
solenberg059fb442016-10-26 05:12:24 -07002107 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002108 {
2109 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2110 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2111 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2112 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002113}
2114
2115// Test that we perform case-insensitive matching of codec names.
2116TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002117 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002118 cricket::AudioSendParameters parameters;
2119 parameters.codecs.push_back(kIsacCodec);
2120 parameters.codecs.push_back(kPcmuCodec);
2121 parameters.codecs.push_back(kCn16000Codec);
2122 parameters.codecs.push_back(kCn8000Codec);
solenberg2779bab2016-11-17 04:45:19 -08002123 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002124 parameters.codecs[0].name = "iSaC";
2125 parameters.codecs[0].id = 96;
2126 parameters.codecs[2].id = 97; // wideband CN
2127 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07002128 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002129 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2130 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2131 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2132 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2133 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2134 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2135 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002136 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002137}
2138
stefanba4c0e42016-02-04 04:12:24 -08002139class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2140 public:
2141 WebRtcVoiceEngineWithSendSideBweTest()
2142 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2143};
2144
2145TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2146 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002147 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002148 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07002149 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
2150 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
2151 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08002152 extension.id);
2153 return;
2154 }
2155 }
2156 FAIL() << "Transport sequence number extension not in header-extension list.";
2157}
2158
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002159// Test support for audio level header extension.
2160TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002161 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002162}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002163TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002164 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002165}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002166
solenbergd4adce42016-11-17 06:26:52 -08002167// Test support for transport sequence number header extension.
2168TEST_F(WebRtcVoiceEngineTestFake, SendTransportSequenceNumberHeaderExtensions) {
2169 TestSetSendRtpHeaderExtensions(
2170 webrtc::RtpExtension::kTransportSequenceNumberUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002171}
solenbergd4adce42016-11-17 06:26:52 -08002172TEST_F(WebRtcVoiceEngineTestFake, RecvTransportSequenceNumberHeaderExtensions) {
2173 TestSetRecvRtpHeaderExtensions(
2174 webrtc::RtpExtension::kTransportSequenceNumberUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002175}
2176
solenberg1ac56142015-10-13 03:58:19 -07002177// Test that we can create a channel and start sending on it.
2178TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002179 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002180 SetSendParameters(send_parameters_);
2181 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002182 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002183 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002184 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2185}
2186
2187// Test that a channel will send if and only if it has a source and is enabled
2188// for sending.
2189TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002190 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002191 SetSendParameters(send_parameters_);
2192 SetAudioSend(kSsrc1, true, nullptr);
2193 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002194 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002195 SetAudioSend(kSsrc1, true, &fake_source_);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002196 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002197 SetAudioSend(kSsrc1, true, nullptr);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002198 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002199}
2200
solenberg94218532016-06-16 10:53:22 -07002201// Test that a channel is muted/unmuted.
2202TEST_F(WebRtcVoiceEngineTestFake, SendStateMuteUnmute) {
2203 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002204 SetSendParameters(send_parameters_);
solenberg94218532016-06-16 10:53:22 -07002205 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
solenberg059fb442016-10-26 05:12:24 -07002206 SetAudioSend(kSsrc1, true, nullptr);
solenberg94218532016-06-16 10:53:22 -07002207 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
solenberg059fb442016-10-26 05:12:24 -07002208 SetAudioSend(kSsrc1, false, nullptr);
solenberg94218532016-06-16 10:53:22 -07002209 EXPECT_TRUE(GetSendStream(kSsrc1).muted());
2210}
2211
solenberg6d6e7c52016-04-13 09:07:30 -07002212// Test that SetSendParameters() does not alter a stream's send state.
2213TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2214 EXPECT_TRUE(SetupSendStream());
2215 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2216
2217 // Turn on sending.
solenberg059fb442016-10-26 05:12:24 -07002218 SetSend(true);
solenberg6d6e7c52016-04-13 09:07:30 -07002219 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2220
2221 // Changing RTP header extensions will recreate the AudioSendStream.
2222 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002223 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg059fb442016-10-26 05:12:24 -07002224 SetSendParameters(send_parameters_);
solenberg6d6e7c52016-04-13 09:07:30 -07002225 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2226
2227 // Turn off sending.
solenberg059fb442016-10-26 05:12:24 -07002228 SetSend(false);
solenberg6d6e7c52016-04-13 09:07:30 -07002229 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2230
2231 // Changing RTP header extensions will recreate the AudioSendStream.
2232 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -07002233 SetSendParameters(send_parameters_);
solenberg6d6e7c52016-04-13 09:07:30 -07002234 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2235}
2236
solenberg1ac56142015-10-13 03:58:19 -07002237// Test that we can create a channel and start playing out on it.
2238TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002239 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002240 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
aleloi84ef6152016-08-04 05:28:21 -07002241 channel_->SetPlayout(true);
2242 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
2243 channel_->SetPlayout(false);
2244 EXPECT_FALSE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002245}
2246
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002247// Test that we can add and remove send streams.
2248TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2249 SetupForMultiSendStream();
2250
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002251 // Set the global state for sending.
solenberg059fb442016-10-26 05:12:24 -07002252 SetSend(true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002253
solenbergc96df772015-10-21 13:01:53 -07002254 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002255 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002256 cricket::StreamParams::CreateLegacy(ssrc)));
solenberg059fb442016-10-26 05:12:24 -07002257 SetAudioSend(ssrc, true, &fake_source_);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002258 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002259 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002260 }
tfarina5237aaf2015-11-10 23:44:30 -08002261 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002262
solenbergc96df772015-10-21 13:01:53 -07002263 // Delete the send streams.
2264 for (uint32_t ssrc : kSsrcs4) {
2265 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002266 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002267 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002268 }
solenbergc96df772015-10-21 13:01:53 -07002269 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002270}
2271
2272// Test SetSendCodecs correctly configure the codecs in all send streams.
2273TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2274 SetupForMultiSendStream();
2275
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002276 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002277 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002278 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002279 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002280 }
2281
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002282 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002283 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002284 parameters.codecs.push_back(kIsacCodec);
2285 parameters.codecs.push_back(kCn16000Codec);
2286 parameters.codecs[1].id = 97;
solenberg059fb442016-10-26 05:12:24 -07002287 SetSendParameters(parameters);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002288
2289 // Verify ISAC and VAD are corrected configured on all send channels.
solenbergc96df772015-10-21 13:01:53 -07002290 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002291 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2292 const auto& send_codec_spec =
2293 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2294 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2295 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2296 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2297 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2298 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002299 }
2300
minyue7a973442016-10-20 03:27:12 -07002301 // Change to PCMU(8K) and CN(16K).
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002302 parameters.codecs[0] = kPcmuCodec;
solenberg059fb442016-10-26 05:12:24 -07002303 SetSendParameters(parameters);
solenbergc96df772015-10-21 13:01:53 -07002304 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002305 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2306 const auto& send_codec_spec =
2307 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2308 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2309 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2310 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2311 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002312 }
2313}
2314
2315// Test we can SetSend on all send streams correctly.
2316TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2317 SetupForMultiSendStream();
2318
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002319 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002320 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002321 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002322 cricket::StreamParams::CreateLegacy(ssrc)));
solenberg059fb442016-10-26 05:12:24 -07002323 SetAudioSend(ssrc, true, &fake_source_);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002324 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002325 }
2326
2327 // Set the global state for starting sending.
solenberg059fb442016-10-26 05:12:24 -07002328 SetSend(true);
solenbergc96df772015-10-21 13:01:53 -07002329 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002330 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002331 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002332 }
2333
2334 // Set the global state for stopping sending.
solenberg059fb442016-10-26 05:12:24 -07002335 SetSend(false);
solenbergc96df772015-10-21 13:01:53 -07002336 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002337 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002338 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002339 }
2340}
2341
2342// Test we can set the correct statistics on all send streams.
2343TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2344 SetupForMultiSendStream();
2345
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002346 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002347 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002348 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002349 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002350 }
solenberg85a04962015-10-27 03:35:21 -07002351
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002352 // Create a receive stream to check that none of the send streams end up in
2353 // the receive stream stats.
solenberg8189b022016-06-14 12:13:00 -07002354 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg971cab02016-06-14 10:02:41 -07002355
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002356 // We need send codec to be set to get all stats.
solenberg059fb442016-10-26 05:12:24 -07002357 SetSendParameters(send_parameters_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002358 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002359 SetAudioSendStreamStats();
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002360
solenberg85a04962015-10-27 03:35:21 -07002361 // Check stats for the added streams.
2362 {
2363 cricket::VoiceMediaInfo info;
2364 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002365
solenberg85a04962015-10-27 03:35:21 -07002366 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002367 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002368 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002369 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002370 }
hbos1acfbd22016-11-17 23:43:29 -08002371 VerifyVoiceSendRecvCodecs(info);
solenberg85a04962015-10-27 03:35:21 -07002372
2373 // We have added one receive stream. We should see empty stats.
2374 EXPECT_EQ(info.receivers.size(), 1u);
2375 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002376 }
solenberg1ac56142015-10-13 03:58:19 -07002377
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002378 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002379 {
2380 cricket::VoiceMediaInfo info;
2381 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2382 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002383 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002384 EXPECT_EQ(0u, info.receivers.size());
2385 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002386
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002387 // Deliver a new packet - a default receive stream should be created and we
2388 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002389 {
2390 cricket::VoiceMediaInfo info;
2391 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2392 SetAudioReceiveStreamStats();
2393 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002394 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002395 EXPECT_EQ(1u, info.receivers.size());
2396 VerifyVoiceReceiverInfo(info.receivers[0]);
hbos1acfbd22016-11-17 23:43:29 -08002397 VerifyVoiceSendRecvCodecs(info);
solenberg85a04962015-10-27 03:35:21 -07002398 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002399}
2400
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002401// Test that we can add and remove receive streams, and do proper send/playout.
2402// We can receive on multiple streams while sending one stream.
2403TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002404 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002405
solenberg1ac56142015-10-13 03:58:19 -07002406 // Start playout without a receive stream.
solenberg059fb442016-10-26 05:12:24 -07002407 SetSendParameters(send_parameters_);
aleloi84ef6152016-08-04 05:28:21 -07002408 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002409
solenberg1ac56142015-10-13 03:58:19 -07002410 // Adding another stream should enable playout on the new stream only.
solenberg8189b022016-06-14 12:13:00 -07002411 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg059fb442016-10-26 05:12:24 -07002412 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002413 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002414
solenberg1ac56142015-10-13 03:58:19 -07002415 // Make sure only the new stream is played out.
aleloi84ef6152016-08-04 05:28:21 -07002416 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002417
2418 // Adding yet another stream should have stream 2 and 3 enabled for playout.
solenberg8189b022016-06-14 12:13:00 -07002419 EXPECT_TRUE(AddRecvStream(kSsrc3));
aleloi84ef6152016-08-04 05:28:21 -07002420 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2421 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002422
2423 // Stop sending.
solenberg059fb442016-10-26 05:12:24 -07002424 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002425 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002426
2427 // Stop playout.
aleloi84ef6152016-08-04 05:28:21 -07002428 channel_->SetPlayout(false);
2429 EXPECT_FALSE(GetRecvStream(kSsrc2).started());
2430 EXPECT_FALSE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002431
aleloi84ef6152016-08-04 05:28:21 -07002432 // Restart playout and make sure recv streams are played out.
2433 channel_->SetPlayout(true);
2434 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2435 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002436
aleloi84ef6152016-08-04 05:28:21 -07002437 // Now remove the recv streams.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002438 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2439 EXPECT_TRUE(channel_->RemoveRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002440}
2441
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002442// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002443// and start sending on it.
2444TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002445 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002446 cricket::AudioOptions options_adjust_agc;
2447 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002448 webrtc::AgcConfig agc_config;
2449 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2450 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002451 send_parameters_.options = options_adjust_agc;
solenberg059fb442016-10-26 05:12:24 -07002452 SetSendParameters(send_parameters_);
2453 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002454 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002455 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2456 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenberg059fb442016-10-26 05:12:24 -07002457 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002458 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002459 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002460}
2461
wu@webrtc.org97077a32013-10-25 21:18:33 +00002462TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002463 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002464 EXPECT_CALL(adm_,
2465 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002466 webrtc::AgcConfig agc_config;
2467 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2468 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002469 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2470 send_parameters_.options.tx_agc_digital_compression_gain =
2471 rtc::Optional<uint16_t>(9);
2472 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2473 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002474 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002475 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2476 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2477 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2478 EXPECT_TRUE(agc_config.limiterEnable);
2479
2480 // Check interaction with adjust_agc_delta. Both should be respected, for
2481 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002482 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
solenberg059fb442016-10-26 05:12:24 -07002483 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002484 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2485 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2486}
2487
wu@webrtc.org97077a32013-10-25 21:18:33 +00002488TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002489 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002490 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2491 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002492 send_parameters_.options.recording_sample_rate =
2493 rtc::Optional<uint32_t>(48000);
2494 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
solenberg059fb442016-10-26 05:12:24 -07002495 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002496}
2497
minyue6b825df2016-10-31 04:08:32 -07002498TEST_F(WebRtcVoiceEngineTestFake, SetAudioNetworkAdaptorViaOptions) {
2499 EXPECT_TRUE(SetupSendStream());
2500 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2501 send_parameters_.options.audio_network_adaptor_config =
2502 rtc::Optional<std::string>("1234");
2503 SetSendParameters(send_parameters_);
2504 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2505 GetAudioNetworkAdaptorConfig(kSsrc1));
2506}
2507
2508TEST_F(WebRtcVoiceEngineTestFake, AudioSendResetAudioNetworkAdaptor) {
2509 EXPECT_TRUE(SetupSendStream());
2510 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2511 send_parameters_.options.audio_network_adaptor_config =
2512 rtc::Optional<std::string>("1234");
2513 SetSendParameters(send_parameters_);
2514 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2515 GetAudioNetworkAdaptorConfig(kSsrc1));
2516 const int initial_num = call_.GetNumCreatedSendStreams();
2517 cricket::AudioOptions options;
2518 options.audio_network_adaptor = rtc::Optional<bool>(false);
2519 SetAudioSend(kSsrc1, true, nullptr, &options);
2520 // AudioSendStream expected to be recreated.
2521 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
2522 EXPECT_EQ(rtc::Optional<std::string>(), GetAudioNetworkAdaptorConfig(kSsrc1));
2523}
2524
2525TEST_F(WebRtcVoiceEngineTestFake, AudioNetworkAdaptorNotGetOverridden) {
2526 EXPECT_TRUE(SetupSendStream());
2527 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2528 send_parameters_.options.audio_network_adaptor_config =
2529 rtc::Optional<std::string>("1234");
2530 SetSendParameters(send_parameters_);
2531 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2532 GetAudioNetworkAdaptorConfig(kSsrc1));
2533 const int initial_num = call_.GetNumCreatedSendStreams();
2534 cricket::AudioOptions options;
2535 options.audio_network_adaptor = rtc::Optional<bool>();
2536 // Unvalued |options.audio_network_adaptor|.should not reset audio network
2537 // adaptor.
2538 SetAudioSend(kSsrc1, true, nullptr, &options);
2539 // AudioSendStream not expected to be recreated.
2540 EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
2541 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2542 GetAudioNetworkAdaptorConfig(kSsrc1));
2543}
2544
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002545// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002546// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002547TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002548 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002549 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002550}
2551
2552TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2553 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002554 EXPECT_TRUE(SetupSendStream());
solenbergff976312016-03-30 23:28:51 -07002555 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002556 // stream has to use a different SSRC.
solenberg8189b022016-06-14 12:13:00 -07002557 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg059fb442016-10-26 05:12:24 -07002558 SetSendParameters(send_parameters_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002559 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002560 SetAudioSendStreamStats();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002561
solenberg85a04962015-10-27 03:35:21 -07002562 // Check stats for the added streams.
2563 {
2564 cricket::VoiceMediaInfo info;
2565 EXPECT_EQ(true, channel_->GetStats(&info));
2566
2567 // We have added one send stream. We should see the stats we've set.
2568 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002569 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002570 // We have added one receive stream. We should see empty stats.
2571 EXPECT_EQ(info.receivers.size(), 1u);
2572 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2573 }
solenberg1ac56142015-10-13 03:58:19 -07002574
solenberg566ef242015-11-06 15:34:49 -08002575 // Start sending - this affects some reported stats.
2576 {
2577 cricket::VoiceMediaInfo info;
solenberg059fb442016-10-26 05:12:24 -07002578 SetSend(true);
solenberg566ef242015-11-06 15:34:49 -08002579 EXPECT_EQ(true, channel_->GetStats(&info));
2580 VerifyVoiceSenderInfo(info.senders[0], true);
hbos1acfbd22016-11-17 23:43:29 -08002581 VerifyVoiceSendRecvCodecs(info);
solenberg566ef242015-11-06 15:34:49 -08002582 }
2583
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002584 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002585 {
2586 cricket::VoiceMediaInfo info;
2587 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2588 EXPECT_EQ(true, channel_->GetStats(&info));
2589 EXPECT_EQ(1u, info.senders.size());
2590 EXPECT_EQ(0u, info.receivers.size());
2591 }
solenberg1ac56142015-10-13 03:58:19 -07002592
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002593 // Deliver a new packet - a default receive stream should be created and we
2594 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002595 {
2596 cricket::VoiceMediaInfo info;
2597 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2598 SetAudioReceiveStreamStats();
2599 EXPECT_EQ(true, channel_->GetStats(&info));
2600 EXPECT_EQ(1u, info.senders.size());
2601 EXPECT_EQ(1u, info.receivers.size());
2602 VerifyVoiceReceiverInfo(info.receivers[0]);
hbos1acfbd22016-11-17 23:43:29 -08002603 VerifyVoiceSendRecvCodecs(info);
solenberg85a04962015-10-27 03:35:21 -07002604 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002605}
2606
2607// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002608// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002609TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002610 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002611 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg8189b022016-06-14 12:13:00 -07002612 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -08002613 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002614}
2615
2616// Test that the local SSRC is the same on sending and receiving channels if the
2617// receive channel is created before the send channel.
2618TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002619 EXPECT_TRUE(SetupChannel());
solenberg4a0f7b52016-06-16 13:07:33 -07002620 EXPECT_TRUE(AddRecvStream(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002621 EXPECT_TRUE(channel_->AddSendStream(
solenberg4a0f7b52016-06-16 13:07:33 -07002622 cricket::StreamParams::CreateLegacy(kSsrc1)));
2623 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
2624 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002625}
2626
2627// Test that we can properly receive packets.
2628TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002629 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002630 EXPECT_TRUE(AddRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002631 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002632
2633 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2634 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002635}
2636
2637// Test that we can properly receive packets on multiple streams.
2638TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002639 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002640 const uint32_t ssrc1 = 1;
2641 const uint32_t ssrc2 = 2;
2642 const uint32_t ssrc3 = 3;
solenberg8189b022016-06-14 12:13:00 -07002643 EXPECT_TRUE(AddRecvStream(ssrc1));
2644 EXPECT_TRUE(AddRecvStream(ssrc2));
2645 EXPECT_TRUE(AddRecvStream(ssrc3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002646 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002647 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002648 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002649 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002650 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002651 }
mflodman3d7db262016-04-29 00:57:13 -07002652
2653 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2654 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2655 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2656
2657 EXPECT_EQ(s1.received_packets(), 0);
2658 EXPECT_EQ(s2.received_packets(), 0);
2659 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002660
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002661 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002662 EXPECT_EQ(s1.received_packets(), 0);
2663 EXPECT_EQ(s2.received_packets(), 0);
2664 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002665
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002666 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002667 EXPECT_EQ(s1.received_packets(), 1);
2668 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2669 EXPECT_EQ(s2.received_packets(), 0);
2670 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002671
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002672 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002673 EXPECT_EQ(s1.received_packets(), 1);
2674 EXPECT_EQ(s2.received_packets(), 1);
2675 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2676 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002677
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002678 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002679 EXPECT_EQ(s1.received_packets(), 1);
2680 EXPECT_EQ(s2.received_packets(), 1);
2681 EXPECT_EQ(s3.received_packets(), 1);
2682 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002683
mflodman3d7db262016-04-29 00:57:13 -07002684 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2685 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2686 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002687}
2688
solenberg7e63ef02015-11-20 00:19:43 -08002689// Test that receiving on an unsignalled stream works (default channel will be
2690// created).
2691TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002692 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002693 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2694
solenberg7e63ef02015-11-20 00:19:43 -08002695 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002696
2697 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2698 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2699 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002700}
2701
2702// Test that receiving on an unsignalled stream works (default channel will be
2703// created), and that packets will be forwarded to the default channel
2704// regardless of their SSRCs.
2705TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002706 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002707 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002708 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2709
mflodman3d7db262016-04-29 00:57:13 -07002710 // Note that ssrc = 0 is not supported.
2711 uint32_t ssrc = 1;
2712 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002713 rtc::SetBE32(&packet[8], ssrc);
2714 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002715
2716 // Verify we only have one default stream.
2717 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2718 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2719 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002720 }
mflodman3d7db262016-04-29 00:57:13 -07002721
2722 // Sending the same ssrc again should not create a new stream.
2723 --ssrc;
2724 DeliverPacket(packet, sizeof(packet));
2725 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2726 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2727 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002728}
2729
2730// Test that a default channel is created even after a signalled stream has been
2731// added, and that this stream will get any packets for unknown SSRCs.
2732TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002733 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002734 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002735 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2736
2737 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002738 const uint32_t signaled_ssrc = 1;
2739 rtc::SetBE32(&packet[8], signaled_ssrc);
solenberg8189b022016-06-14 12:13:00 -07002740 EXPECT_TRUE(AddRecvStream(signaled_ssrc));
solenberg7e63ef02015-11-20 00:19:43 -08002741 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002742 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2743 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002744
2745 // Note that the first unknown SSRC cannot be 0, because we only support
2746 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002747 const uint32_t unsignaled_ssrc = 7011;
2748 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002749 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002750 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2751 packet, sizeof(packet)));
2752 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2753
2754 DeliverPacket(packet, sizeof(packet));
2755 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2756
2757 rtc::SetBE32(&packet[8], signaled_ssrc);
2758 DeliverPacket(packet, sizeof(packet));
2759 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2760 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002761}
2762
solenberg0a617e22015-10-20 15:49:38 -07002763// Test that we properly handle failures to add a receive stream.
2764TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002765 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002766 voe_.set_fail_create_channel(true);
solenberg8189b022016-06-14 12:13:00 -07002767 EXPECT_FALSE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002768}
2769
solenberg0a617e22015-10-20 15:49:38 -07002770// Test that we properly handle failures to add a send stream.
2771TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002772 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002773 voe_.set_fail_create_channel(true);
2774 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2775}
2776
solenberg1ac56142015-10-13 03:58:19 -07002777// Test that AddRecvStream creates new stream.
2778TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002779 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002780 int channel_num = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07002781 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002782 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002783}
2784
2785// Test that after adding a recv stream, we do not decode more codecs than
2786// those previously passed into SetRecvCodecs.
2787TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002788 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002789 cricket::AudioRecvParameters parameters;
2790 parameters.codecs.push_back(kIsacCodec);
2791 parameters.codecs.push_back(kPcmuCodec);
2792 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -07002793 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002794 int channel_num2 = voe_.GetLastChannel();
2795 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002796 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002797 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002798 gcodec.channels = 2;
2799 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2800}
2801
2802// Test that we properly clean up any streams that were added, even if
2803// not explicitly removed.
2804TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002805 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002806 SetSendParameters(send_parameters_);
solenberg8189b022016-06-14 12:13:00 -07002807 EXPECT_TRUE(AddRecvStream(1));
2808 EXPECT_TRUE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002809 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2810 delete channel_;
2811 channel_ = NULL;
2812 EXPECT_EQ(0, voe_.GetNumChannels());
2813}
2814
wu@webrtc.org78187522013-10-07 23:32:02 +00002815TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002816 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07002817 EXPECT_FALSE(AddRecvStream(0));
wu@webrtc.org78187522013-10-07 23:32:02 +00002818}
2819
2820TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002821 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002822 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002823 // Manually delete channel to simulate a failure.
2824 int channel = voe_.GetLastChannel();
2825 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2826 // Add recv stream 2 should work.
solenberg8189b022016-06-14 12:13:00 -07002827 EXPECT_TRUE(AddRecvStream(2));
wu@webrtc.org78187522013-10-07 23:32:02 +00002828 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002829 EXPECT_NE(channel, new_channel);
2830 // The last created channel is deleted too.
2831 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002832}
2833
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002834// Test the InsertDtmf on default send stream as caller.
2835TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
solenbergffbbcac2016-11-17 05:25:37 -08002836 TestInsertDtmf(0, true, kTelephoneEventCodec1);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002837}
2838
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002839// Test the InsertDtmf on default send stream as callee
2840TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
solenbergffbbcac2016-11-17 05:25:37 -08002841 TestInsertDtmf(0, false, kTelephoneEventCodec2);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002842}
2843
2844// Test the InsertDtmf on specified send stream as caller.
2845TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
solenbergffbbcac2016-11-17 05:25:37 -08002846 TestInsertDtmf(kSsrc1, true, kTelephoneEventCodec2);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002847}
2848
2849// Test the InsertDtmf on specified send stream as callee.
2850TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
solenbergffbbcac2016-11-17 05:25:37 -08002851 TestInsertDtmf(kSsrc1, false, kTelephoneEventCodec1);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002852}
2853
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002854TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002855 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002856 EXPECT_CALL(adm_,
2857 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2858 EXPECT_CALL(adm_,
2859 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2860 EXPECT_CALL(adm_,
2861 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002862 bool ec_enabled;
2863 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002864 webrtc::AecmModes aecm_mode;
2865 bool cng_enabled;
2866 bool agc_enabled;
2867 webrtc::AgcModes agc_mode;
2868 webrtc::AgcConfig agc_config;
2869 bool ns_enabled;
2870 webrtc::NsModes ns_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002871 bool stereo_swapping_enabled;
2872 bool typing_detection_enabled;
2873 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002874 voe_.GetAecmMode(aecm_mode, cng_enabled);
2875 voe_.GetAgcStatus(agc_enabled, agc_mode);
2876 voe_.GetAgcConfig(agc_config);
2877 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002878 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2879 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2880 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002881 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002882 EXPECT_FALSE(cng_enabled);
2883 EXPECT_TRUE(agc_enabled);
2884 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2885 EXPECT_TRUE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08002886 EXPECT_TRUE(IsHighPassFilterEnabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002887 EXPECT_FALSE(stereo_swapping_enabled);
2888 EXPECT_TRUE(typing_detection_enabled);
2889 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2890 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002891 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2892 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002893
solenberg246b8172015-12-08 09:50:23 -08002894 // Nothing set in AudioOptions, so everything should be as default.
2895 send_parameters_.options = cricket::AudioOptions();
solenberg059fb442016-10-26 05:12:24 -07002896 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002897 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002898 voe_.GetAecmMode(aecm_mode, cng_enabled);
2899 voe_.GetAgcStatus(agc_enabled, agc_mode);
2900 voe_.GetAgcConfig(agc_config);
2901 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002902 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2903 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2904 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002905 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002906 EXPECT_FALSE(cng_enabled);
2907 EXPECT_TRUE(agc_enabled);
2908 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2909 EXPECT_TRUE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08002910 EXPECT_TRUE(IsHighPassFilterEnabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002911 EXPECT_FALSE(stereo_swapping_enabled);
2912 EXPECT_TRUE(typing_detection_enabled);
2913 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2914 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002915 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2916 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002917
2918 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002919 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002920 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002921 voe_.GetEcStatus(ec_enabled, ec_mode);
2922 EXPECT_FALSE(ec_enabled);
2923
2924 // Turn echo cancellation back on, with settings, and make sure
2925 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002926 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002927 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002928 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002929 voe_.GetAecmMode(aecm_mode, cng_enabled);
2930 voe_.GetAgcStatus(agc_enabled, agc_mode);
2931 voe_.GetAgcConfig(agc_config);
2932 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002933 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2934 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2935 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002936 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002937 EXPECT_TRUE(agc_enabled);
2938 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2939 EXPECT_TRUE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08002940 EXPECT_TRUE(IsHighPassFilterEnabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002941 EXPECT_FALSE(stereo_swapping_enabled);
2942 EXPECT_TRUE(typing_detection_enabled);
2943 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2944 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2945
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002946 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2947 // control.
solenberg246b8172015-12-08 09:50:23 -08002948 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002949 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002950 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002951 voe_.GetAecmMode(aecm_mode, cng_enabled);
2952 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002953 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002954 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2955
2956 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002957 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2958 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2959 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002960 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002961 voe_.GetEcStatus(ec_enabled, ec_mode);
2962 EXPECT_FALSE(ec_enabled);
2963 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002964 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002965 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002966 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002967 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002968 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002969 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2970
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002971 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002972 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002973 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002974 voe_.GetAgcStatus(agc_enabled, agc_mode);
2975 EXPECT_FALSE(agc_enabled);
2976
2977 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002978 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2979 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
solenberg059fb442016-10-26 05:12:24 -07002980 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002981 voe_.GetAgcStatus(agc_enabled, agc_mode);
2982 EXPECT_TRUE(agc_enabled);
2983 voe_.GetAgcConfig(agc_config);
2984 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2985
2986 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002987 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2988 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2989 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2990 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002991 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002992 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002993 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2994 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2995 EXPECT_FALSE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08002996 EXPECT_FALSE(IsHighPassFilterEnabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002997 EXPECT_FALSE(typing_detection_enabled);
2998 EXPECT_TRUE(stereo_swapping_enabled);
2999
solenberg1ac56142015-10-13 03:58:19 -07003000 // Set options again to ensure it has no impact.
solenberg059fb442016-10-26 05:12:24 -07003001 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003002 voe_.GetEcStatus(ec_enabled, ec_mode);
3003 voe_.GetNsStatus(ns_enabled, ns_mode);
3004 EXPECT_TRUE(ec_enabled);
3005 EXPECT_EQ(webrtc::kEcConference, ec_mode);
3006 EXPECT_FALSE(ns_enabled);
3007 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
3008}
3009
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003010TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07003011 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003012
3013 bool ec_enabled;
3014 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003015 bool agc_enabled;
3016 webrtc::AgcModes agc_mode;
3017 bool ns_enabled;
3018 webrtc::NsModes ns_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003019 bool stereo_swapping_enabled;
3020 bool typing_detection_enabled;
3021
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003022 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003023 voe_.GetAgcStatus(agc_enabled, agc_mode);
3024 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003025 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3026 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3027 EXPECT_TRUE(ec_enabled);
3028 EXPECT_TRUE(agc_enabled);
3029 EXPECT_TRUE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08003030 EXPECT_TRUE(IsHighPassFilterEnabled());
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003031 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003032 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003033}
3034
3035TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
3036 webrtc::AgcConfig set_config = {0};
3037 set_config.targetLeveldBOv = 3;
3038 set_config.digitalCompressionGaindB = 9;
3039 set_config.limiterEnable = true;
3040 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003041
3042 webrtc::AgcConfig config = {0};
3043 EXPECT_EQ(0, voe_.GetAgcConfig(config));
3044 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
3045 EXPECT_EQ(set_config.digitalCompressionGaindB,
3046 config.digitalCompressionGaindB);
3047 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
3048}
3049
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003050TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07003051 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07003052 EXPECT_CALL(adm_,
3053 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
3054 EXPECT_CALL(adm_,
3055 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
3056 EXPECT_CALL(adm_,
3057 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
solenberg059fb442016-10-26 05:12:24 -07003058 EXPECT_CALL(adm_,
3059 RecordingIsInitialized()).Times(2).WillRepeatedly(Return(false));
3060 EXPECT_CALL(adm_, Recording()).Times(2).WillRepeatedly(Return(false));
3061 EXPECT_CALL(adm_, InitRecording()).Times(2).WillRepeatedly(Return(0));
3062 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(10);
3063 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(10);
solenberg5b5129a2016-04-08 05:35:48 -07003064
kwiberg686a8ef2016-02-26 03:00:35 -08003065 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07003066 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003067 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08003068 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07003069 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003070 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003071
3072 // Have to add a stream to make SetSend work.
3073 cricket::StreamParams stream1;
3074 stream1.ssrcs.push_back(1);
3075 channel1->AddSendStream(stream1);
3076 cricket::StreamParams stream2;
3077 stream2.ssrcs.push_back(2);
3078 channel2->AddSendStream(stream2);
3079
3080 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003081 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003082 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
3083 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
3084 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07003085 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003086 EXPECT_EQ(parameters_options_all.options, channel1->options());
solenberg059fb442016-10-26 05:12:24 -07003087 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003088 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003089
3090 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003091 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003092 parameters_options_no_ns.options.noise_suppression =
3093 rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07003094 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003095 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003096 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3097 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3098 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003099 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003100
3101 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003102 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003103 parameters_options_no_agc.options.auto_gain_control =
3104 rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07003105 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003106 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3107 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3108 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003109 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003110
solenberg059fb442016-10-26 05:12:24 -07003111 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003112 bool ec_enabled;
3113 webrtc::EcModes ec_mode;
3114 bool agc_enabled;
3115 webrtc::AgcModes agc_mode;
3116 bool ns_enabled;
3117 webrtc::NsModes ns_mode;
3118 voe_.GetEcStatus(ec_enabled, ec_mode);
3119 voe_.GetAgcStatus(agc_enabled, agc_mode);
3120 voe_.GetNsStatus(ns_enabled, ns_mode);
3121 EXPECT_TRUE(ec_enabled);
3122 EXPECT_TRUE(agc_enabled);
3123 EXPECT_TRUE(ns_enabled);
3124
solenberg059fb442016-10-26 05:12:24 -07003125 channel1->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003126 voe_.GetEcStatus(ec_enabled, ec_mode);
3127 voe_.GetAgcStatus(agc_enabled, agc_mode);
3128 voe_.GetNsStatus(ns_enabled, ns_mode);
3129 EXPECT_TRUE(ec_enabled);
3130 EXPECT_TRUE(agc_enabled);
3131 EXPECT_FALSE(ns_enabled);
3132
solenberg059fb442016-10-26 05:12:24 -07003133 channel2->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003134 voe_.GetEcStatus(ec_enabled, ec_mode);
3135 voe_.GetAgcStatus(agc_enabled, agc_mode);
3136 voe_.GetNsStatus(ns_enabled, ns_mode);
3137 EXPECT_TRUE(ec_enabled);
3138 EXPECT_FALSE(agc_enabled);
3139 EXPECT_TRUE(ns_enabled);
3140
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003141 // Make sure settings take effect while we are sending.
solenberg059fb442016-10-26 05:12:24 -07003142 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
3143 EXPECT_CALL(apm_, ApplyConfig(testing::_));
3144 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003145 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3146 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003147 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003148 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003149 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003150 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003151 channel2->SetSend(true);
solenberg059fb442016-10-26 05:12:24 -07003152 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc_nor_ns));
Karl Wibergbe579832015-11-10 22:34:18 +01003153 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3154 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3155 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003156 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003157 voe_.GetEcStatus(ec_enabled, ec_mode);
3158 voe_.GetAgcStatus(agc_enabled, agc_mode);
3159 voe_.GetNsStatus(ns_enabled, ns_mode);
3160 EXPECT_TRUE(ec_enabled);
3161 EXPECT_FALSE(agc_enabled);
3162 EXPECT_FALSE(ns_enabled);
3163}
3164
wu@webrtc.orgde305012013-10-31 15:40:38 +00003165// This test verifies DSCP settings are properly applied on voice media channel.
3166TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003167 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003168 cricket::FakeNetworkInterface network_interface;
3169 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003170 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003171
solenberg059fb442016-10-26 05:12:24 -07003172 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(3);
3173 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(3);
3174
solenbergbc37fc82016-04-04 09:54:44 -07003175 channel.reset(
3176 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003177 channel->SetInterface(&network_interface);
3178 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3179 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3180
3181 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003182 channel.reset(
3183 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003184 channel->SetInterface(&network_interface);
3185 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3186
3187 // Verify that setting the option to false resets the
3188 // DiffServCodePoint.
3189 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003190 channel.reset(
3191 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003192 channel->SetInterface(&network_interface);
3193 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3194 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3195
3196 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003197}
3198
solenberg1ac56142015-10-13 03:58:19 -07003199TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003200 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003201 cricket::WebRtcVoiceMediaChannel* media_channel =
3202 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003203 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
solenberg8189b022016-06-14 12:13:00 -07003204 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -07003205 int channel_id = voe_.GetLastChannel();
3206 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3207 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
solenberg8189b022016-06-14 12:13:00 -07003208 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07003209 int channel_id2 = voe_.GetLastChannel();
3210 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003211}
3212
solenberg1ac56142015-10-13 03:58:19 -07003213TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003214 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003215 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003216 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3217 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3218 EXPECT_TRUE(channel_->AddSendStream(
3219 cricket::StreamParams::CreateLegacy(kSsrc1)));
3220 int channel_id = voe_.GetLastChannel();
3221 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3222 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3223 EXPECT_TRUE(channel_->AddSendStream(
3224 cricket::StreamParams::CreateLegacy(kSsrc2)));
3225 int channel_id2 = voe_.GetLastChannel();
3226 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003227}
3228
solenberg4bac9c52015-10-09 02:32:53 -07003229TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003230 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003231 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003232 cricket::StreamParams stream;
3233 stream.ssrcs.push_back(kSsrc2);
3234 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg217fb662016-06-17 08:30:54 -07003235 EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrc2).gain());
solenberg4bac9c52015-10-09 02:32:53 -07003236 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg217fb662016-06-17 08:30:54 -07003237 EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc2).gain());
solenberg1ac56142015-10-13 03:58:19 -07003238}
3239
3240TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003241 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003242 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3243 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg217fb662016-06-17 08:30:54 -07003244 EXPECT_DOUBLE_EQ(2, GetRecvStream(1).gain());
solenberg1ac56142015-10-13 03:58:19 -07003245 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenberg217fb662016-06-17 08:30:54 -07003246 EXPECT_DOUBLE_EQ(3, GetRecvStream(1).gain());
3247 EXPECT_TRUE(channel_->SetOutputVolume(1, 4));
3248 EXPECT_DOUBLE_EQ(4, GetRecvStream(1).gain());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003249}
3250
pbos8fc7fa72015-07-15 08:02:58 -07003251TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003252 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003253 const std::string kSyncLabel = "AvSyncLabel";
3254
solenbergff976312016-03-30 23:28:51 -07003255 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003256 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3257 sp.sync_label = kSyncLabel;
3258 // Creating two channels to make sure that sync label is set properly for both
3259 // the default voice channel and following ones.
3260 EXPECT_TRUE(channel_->AddRecvStream(sp));
3261 sp.ssrcs[0] += 1;
3262 EXPECT_TRUE(channel_->AddRecvStream(sp));
3263
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003264 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003265 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003266 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003267 << "SyncGroup should be set based on sync_label";
3268 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003269 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003270 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003271}
3272
solenberg3a941542015-11-16 07:34:50 -08003273// TODO(solenberg): Remove, once recv streams are configured through Call.
3274// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003275TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003276 // Test that setting the header extensions results in the expected state
3277 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003278 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003279 ssrcs.push_back(223);
3280 ssrcs.push_back(224);
3281
solenbergff976312016-03-30 23:28:51 -07003282 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07003283 SetSendParameters(send_parameters_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02003284 for (uint32_t ssrc : ssrcs) {
solenberg059fb442016-10-26 05:12:24 -07003285 EXPECT_TRUE(channel_->AddRecvStream(
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003286 cricket::StreamParams::CreateLegacy(ssrc)));
3287 }
3288
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003289 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003290 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003291 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003292 EXPECT_NE(nullptr, s);
3293 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3294 }
3295
3296 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003297 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003298 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003299 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003300 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003301 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003302 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003303 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003304 EXPECT_NE(nullptr, s);
3305 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003306 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3307 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003308 for (const auto& s_ext : s_exts) {
3309 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003310 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003311 }
3312 }
3313 }
3314 }
3315
3316 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003317 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003318 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003319 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003320 EXPECT_NE(nullptr, s);
3321 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3322 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003323}
3324
3325TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3326 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003327 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003328 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003329 static const unsigned char kRtcp[] = {
3330 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3331 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3332 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3334 };
jbaucheec21bd2016-03-20 06:15:43 -07003335 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003336
solenbergff976312016-03-30 23:28:51 -07003337 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003338 cricket::WebRtcVoiceMediaChannel* media_channel =
3339 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg059fb442016-10-26 05:12:24 -07003340 SetSendParameters(send_parameters_);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003341 EXPECT_TRUE(media_channel->AddRecvStream(
3342 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3343
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003344 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003345 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003346 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003347 EXPECT_EQ(0, s->received_packets());
3348 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3349 EXPECT_EQ(1, s->received_packets());
3350 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3351 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003352}
Minyue2013aec2015-05-13 14:14:42 +02003353
solenberg0a617e22015-10-20 15:49:38 -07003354// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003355// since they do not send RTCP SR.
solenberg7602aab2016-11-14 11:30:07 -08003356TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_SendCreatedFirst) {
solenbergff976312016-03-30 23:28:51 -07003357 EXPECT_TRUE(SetupSendStream());
solenberg7602aab2016-11-14 11:30:07 -08003358 EXPECT_TRUE(AddRecvStream(kSsrc2));
3359 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
3360 EXPECT_TRUE(channel_->AddSendStream(
3361 cricket::StreamParams::CreateLegacy(kSsrc3)));
3362 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
3363 EXPECT_TRUE(AddRecvStream(kSsrc4));
3364 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc4).rtp.local_ssrc);
Minyue2013aec2015-05-13 14:14:42 +02003365}
3366
solenberg7602aab2016-11-14 11:30:07 -08003367TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_RecvCreatedFirst) {
3368 EXPECT_TRUE(SetupRecvStream());
3369 EXPECT_EQ(0xFA17FA17u, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3370 EXPECT_TRUE(channel_->AddSendStream(
3371 cricket::StreamParams::CreateLegacy(kSsrc2)));
3372 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3373 EXPECT_TRUE(AddRecvStream(kSsrc3));
3374 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc3).rtp.local_ssrc);
3375 EXPECT_TRUE(channel_->AddSendStream(
3376 cricket::StreamParams::CreateLegacy(kSsrc4)));
3377 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3378 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc3).rtp.local_ssrc);
Minyue2013aec2015-05-13 14:14:42 +02003379}
stefan658910c2015-09-03 05:48:32 -07003380
deadbeef884f5852016-01-15 09:20:04 -08003381TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003382 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003383 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3384 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003385
3386 // Setting the sink before a recv stream exists should do nothing.
3387 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
solenberg8189b022016-06-14 12:13:00 -07003388 EXPECT_TRUE(AddRecvStream(kSsrc1));
deadbeef884f5852016-01-15 09:20:04 -08003389 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3390
3391 // Now try actually setting the sink.
3392 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3393 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3394
3395 // Now try resetting it.
3396 channel_->SetRawAudioSink(kSsrc1, nullptr);
3397 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3398}
3399
3400TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003401 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003402 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3403 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003404
3405 // Should be able to set a default sink even when no stream exists.
3406 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3407
3408 // Create default channel and ensure it's assigned the default sink.
3409 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3410 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3411
3412 // Try resetting the default sink.
3413 channel_->SetRawAudioSink(0, nullptr);
3414 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3415
3416 // Try setting the default sink while the default stream exists.
3417 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3418 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3419
3420 // If we remove and add a default stream, it should get the same sink.
3421 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3422 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3423 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3424}
3425
skvlad7a43d252016-03-22 15:32:27 -07003426// Test that, just like the video channel, the voice channel communicates the
3427// network state to the call.
3428TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003429 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003430
3431 EXPECT_EQ(webrtc::kNetworkUp,
3432 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3433 EXPECT_EQ(webrtc::kNetworkUp,
3434 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3435
3436 channel_->OnReadyToSend(false);
3437 EXPECT_EQ(webrtc::kNetworkDown,
3438 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3439 EXPECT_EQ(webrtc::kNetworkUp,
3440 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3441
3442 channel_->OnReadyToSend(true);
3443 EXPECT_EQ(webrtc::kNetworkUp,
3444 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3445 EXPECT_EQ(webrtc::kNetworkUp,
3446 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3447}
3448
aleloi18e0b672016-10-04 02:45:47 -07003449// Test that playout is still started after changing parameters
3450TEST_F(WebRtcVoiceEngineTestFake, PreservePlayoutWhenRecreateRecvStream) {
3451 SetupRecvStream();
3452 channel_->SetPlayout(true);
3453 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3454
3455 // Changing RTP header extensions will recreate the AudioReceiveStream.
3456 cricket::AudioRecvParameters parameters;
3457 parameters.extensions.push_back(
3458 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
3459 channel_->SetRecvParameters(parameters);
3460
3461 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3462}
3463
stefan658910c2015-09-03 05:48:32 -07003464// Tests that the library initializes and shuts down properly.
3465TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossu29b1a8d2016-06-13 07:34:51 -07003466 // If the VoiceEngine wants to gather available codecs early, that's fine but
3467 // we never want it to create a decoder at this stage.
ossuc54071d2016-08-17 02:45:41 -07003468 cricket::WebRtcVoiceEngine engine(
gyzhou95aa9642016-12-13 14:06:26 -08003469 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr);
skvlad11a9cbf2016-10-07 11:53:05 -07003470 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003471 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003472 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003473 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3474 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003475 EXPECT_TRUE(channel != nullptr);
3476 delete channel;
solenbergff976312016-03-30 23:28:51 -07003477}
stefan658910c2015-09-03 05:48:32 -07003478
solenbergff976312016-03-30 23:28:51 -07003479// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003480TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3481 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3482 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3483 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003484 {
ossuc54071d2016-08-17 02:45:41 -07003485 cricket::WebRtcVoiceEngine engine(
gyzhou95aa9642016-12-13 14:06:26 -08003486 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr);
skvlad11a9cbf2016-10-07 11:53:05 -07003487 webrtc::RtcEventLogNullImpl event_log;
solenbergff976312016-03-30 23:28:51 -07003488 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003489 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
solenbergff976312016-03-30 23:28:51 -07003490 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3491 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3492 EXPECT_TRUE(channel != nullptr);
3493 delete channel;
3494 }
stefan658910c2015-09-03 05:48:32 -07003495}
3496
3497// Tests that the library is configured with the codecs we want.
3498TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003499 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3500 // module.
3501
stefan658910c2015-09-03 05:48:32 -07003502 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003503 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003504 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003505 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003506 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003507 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003508 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003509 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003510 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003511 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003512 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003513 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003514 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003515 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003516 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003517 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003518 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003519 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
solenberg2779bab2016-11-17 04:45:19 -08003520 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3521 cricket::AudioCodec(96, "telephone-event", 16000, 0, 1), nullptr));
3522 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3523 cricket::AudioCodec(96, "telephone-event", 32000, 0, 1), nullptr));
3524 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3525 cricket::AudioCodec(96, "telephone-event", 48000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003526 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003527 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003528 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003529 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003530 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003531 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003532 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003533 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003534 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003535 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003536 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003537 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003538 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003539 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003540 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003541 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003542 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003543 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003544 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003545 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003546 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003547 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003548 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003549
stefan658910c2015-09-03 05:48:32 -07003550 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossuc54071d2016-08-17 02:45:41 -07003551 // TODO(ossu): Why are the payload types of codecs with non-static payload
3552 // type assignments checked here? It shouldn't really matter.
3553 cricket::WebRtcVoiceEngine engine(
gyzhou95aa9642016-12-13 14:06:26 -08003554 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr);
solenberg2779bab2016-11-17 04:45:19 -08003555 for (const cricket::AudioCodec& codec : engine.send_codecs()) {
3556 if (codec.name == "CN" && codec.clockrate == 16000) {
3557 EXPECT_EQ(105, codec.id);
3558 } else if (codec.name == "CN" && codec.clockrate == 32000) {
3559 EXPECT_EQ(106, codec.id);
3560 } else if (codec.name == "ISAC" && codec.clockrate == 16000) {
3561 EXPECT_EQ(103, codec.id);
3562 } else if (codec.name == "ISAC" && codec.clockrate == 32000) {
3563 EXPECT_EQ(104, codec.id);
3564 } else if (codec.name == "G722" && codec.clockrate == 8000) {
3565 EXPECT_EQ(9, codec.id);
3566 } else if (codec.name == "telephone-event" && codec.clockrate == 8000) {
3567 EXPECT_EQ(126, codec.id);
3568 // TODO(solenberg): 16k, 32k, 48k DTMF should be dynamically assigned.
3569 // Remove these checks once both send and receive side assigns payload types
3570 // dynamically.
3571 } else if (codec.name == "telephone-event" && codec.clockrate == 16000) {
3572 EXPECT_EQ(113, codec.id);
3573 } else if (codec.name == "telephone-event" && codec.clockrate == 32000) {
3574 EXPECT_EQ(112, codec.id);
3575 } else if (codec.name == "telephone-event" && codec.clockrate == 48000) {
3576 EXPECT_EQ(110, codec.id);
3577 } else if (codec.name == "opus") {
3578 EXPECT_EQ(111, codec.id);
3579 ASSERT_TRUE(codec.params.find("minptime") != codec.params.end());
3580 EXPECT_EQ("10", codec.params.find("minptime")->second);
3581 ASSERT_TRUE(codec.params.find("useinbandfec") != codec.params.end());
3582 EXPECT_EQ("1", codec.params.find("useinbandfec")->second);
stefan658910c2015-09-03 05:48:32 -07003583 }
3584 }
stefan658910c2015-09-03 05:48:32 -07003585}
3586
3587// Tests that VoE supports at least 32 channels
3588TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossuc54071d2016-08-17 02:45:41 -07003589 cricket::WebRtcVoiceEngine engine(
gyzhou95aa9642016-12-13 14:06:26 -08003590 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr);
skvlad11a9cbf2016-10-07 11:53:05 -07003591 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003592 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003593 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
stefan658910c2015-09-03 05:48:32 -07003594
3595 cricket::VoiceMediaChannel* channels[32];
3596 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003597 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003598 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3599 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003600 if (!channel)
3601 break;
stefan658910c2015-09-03 05:48:32 -07003602 channels[num_channels++] = channel;
3603 }
3604
tfarina5237aaf2015-11-10 23:44:30 -08003605 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003606 EXPECT_EQ(expected, num_channels);
3607
3608 while (num_channels > 0) {
3609 delete channels[--num_channels];
3610 }
stefan658910c2015-09-03 05:48:32 -07003611}
3612
3613// Test that we set our preferred codecs properly.
3614TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003615 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3616 // - Check that our builtin codecs are usable by Channel.
3617 // - The codecs provided by the engine is usable by Channel.
3618 // It does not check that the codecs in the RecvParameters are actually
3619 // what we sent in - though it's probably reasonable to expect so, if
3620 // SetRecvParameters returns true.
3621 // I think it will become clear once audio decoder injection is completed.
3622 cricket::WebRtcVoiceEngine engine(
gyzhou95aa9642016-12-13 14:06:26 -08003623 nullptr, webrtc::CreateBuiltinAudioDecoderFactory(), nullptr);
skvlad11a9cbf2016-10-07 11:53:05 -07003624 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003625 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003626 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003627 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3628 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003629 cricket::AudioRecvParameters parameters;
ossudedfd282016-06-14 07:12:39 -07003630 parameters.codecs = engine.recv_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003631 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003632}