blob: f15bde68b734964577ce9ba7215a10124ee43464 [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;
ivoc4e477a12017-01-15 08:29:46 -0800483 stats.residual_echo_likelihood_recent_max = 0.6f;
solenberg85a04962015-10-27 03:35:21 -0700484 stats.typing_noise_detected = true;
485 return stats;
486 }
487 void SetAudioSendStreamStats() {
488 for (auto* s : call_.GetAudioSendStreams()) {
489 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200490 }
solenberg85a04962015-10-27 03:35:21 -0700491 }
solenberg566ef242015-11-06 15:34:49 -0800492 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
493 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700494 const auto stats = GetAudioSendStreamStats();
495 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
496 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
497 EXPECT_EQ(info.packets_sent, stats.packets_sent);
498 EXPECT_EQ(info.packets_lost, stats.packets_lost);
499 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
500 EXPECT_EQ(info.codec_name, stats.codec_name);
hbos1acfbd22016-11-17 23:43:29 -0800501 EXPECT_EQ(info.codec_payload_type, stats.codec_payload_type);
solenberg85a04962015-10-27 03:35:21 -0700502 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
503 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
504 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
505 EXPECT_EQ(info.audio_level, stats.audio_level);
506 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
507 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
508 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
509 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
510 EXPECT_EQ(info.echo_return_loss_enhancement,
511 stats.echo_return_loss_enhancement);
ivoc8c63a822016-10-21 04:10:03 -0700512 EXPECT_EQ(info.residual_echo_likelihood, stats.residual_echo_likelihood);
ivoc4e477a12017-01-15 08:29:46 -0800513 EXPECT_EQ(info.residual_echo_likelihood_recent_max,
514 stats.residual_echo_likelihood_recent_max);
solenberg566ef242015-11-06 15:34:49 -0800515 EXPECT_EQ(info.typing_noise_detected,
516 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700517 }
518
519 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
520 webrtc::AudioReceiveStream::Stats stats;
521 stats.remote_ssrc = 123;
522 stats.bytes_rcvd = 456;
523 stats.packets_rcvd = 768;
524 stats.packets_lost = 101;
525 stats.fraction_lost = 23.45f;
526 stats.codec_name = "codec_name_recv";
hbos1acfbd22016-11-17 23:43:29 -0800527 stats.codec_payload_type = rtc::Optional<int>(42);
solenberg85a04962015-10-27 03:35:21 -0700528 stats.ext_seqnum = 678;
529 stats.jitter_ms = 901;
530 stats.jitter_buffer_ms = 234;
531 stats.jitter_buffer_preferred_ms = 567;
532 stats.delay_estimate_ms = 890;
533 stats.audio_level = 1234;
534 stats.expand_rate = 5.67f;
535 stats.speech_expand_rate = 8.90f;
536 stats.secondary_decoded_rate = 1.23f;
537 stats.accelerate_rate = 4.56f;
538 stats.preemptive_expand_rate = 7.89f;
539 stats.decoding_calls_to_silence_generator = 12;
540 stats.decoding_calls_to_neteq = 345;
541 stats.decoding_normal = 67890;
542 stats.decoding_plc = 1234;
543 stats.decoding_cng = 5678;
544 stats.decoding_plc_cng = 9012;
henrik.lundin63489782016-09-20 01:47:12 -0700545 stats.decoding_muted_output = 3456;
546 stats.capture_start_ntp_time_ms = 7890;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200547 return stats;
548 }
549 void SetAudioReceiveStreamStats() {
550 for (auto* s : call_.GetAudioReceiveStreams()) {
551 s->SetStats(GetAudioReceiveStreamStats());
552 }
553 }
554 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700555 const auto stats = GetAudioReceiveStreamStats();
556 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
557 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
558 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
559 EXPECT_EQ(info.packets_lost, stats.packets_lost);
560 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
561 EXPECT_EQ(info.codec_name, stats.codec_name);
hbos1acfbd22016-11-17 23:43:29 -0800562 EXPECT_EQ(info.codec_payload_type, stats.codec_payload_type);
solenberg85a04962015-10-27 03:35:21 -0700563 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
564 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
565 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200566 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700567 stats.jitter_buffer_preferred_ms);
568 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
569 EXPECT_EQ(info.audio_level, stats.audio_level);
570 EXPECT_EQ(info.expand_rate, stats.expand_rate);
571 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
572 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
573 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
574 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200575 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700576 stats.decoding_calls_to_silence_generator);
577 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
578 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
579 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
580 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
581 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
henrik.lundin63489782016-09-20 01:47:12 -0700582 EXPECT_EQ(info.decoding_muted_output, stats.decoding_muted_output);
solenberg85a04962015-10-27 03:35:21 -0700583 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200584 }
hbos1acfbd22016-11-17 23:43:29 -0800585 void VerifyVoiceSendRecvCodecs(const cricket::VoiceMediaInfo& info) const {
586 EXPECT_EQ(send_parameters_.codecs.size(), info.send_codecs.size());
587 for (const cricket::AudioCodec& codec : send_parameters_.codecs) {
588 ASSERT_EQ(info.send_codecs.count(codec.id), 1U);
589 EXPECT_EQ(info.send_codecs.find(codec.id)->second,
590 codec.ToCodecParameters());
591 }
592 EXPECT_EQ(recv_parameters_.codecs.size(), info.receive_codecs.size());
593 for (const cricket::AudioCodec& codec : recv_parameters_.codecs) {
594 ASSERT_EQ(info.receive_codecs.count(codec.id), 1U);
595 EXPECT_EQ(info.receive_codecs.find(codec.id)->second,
596 codec.ToCodecParameters());
597 }
598 }
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200599
peah8271d042016-11-22 07:24:52 -0800600 bool IsHighPassFilterEnabled() {
601 return engine_->GetApmConfigForTest().high_pass_filter.enabled;
602 }
603
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000604 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700605 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
solenberg059fb442016-10-26 05:12:24 -0700606 StrictMock<webrtc::test::MockAudioProcessing> apm_;
skvlad11a9cbf2016-10-07 11:53:05 -0700607 webrtc::RtcEventLogNullImpl event_log_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200608 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000609 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700610 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700611 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200612 cricket::AudioSendParameters send_parameters_;
613 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800614 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800615 private:
616 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617};
618
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000619// Tests that we can create and destroy a channel.
620TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700621 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000622}
623
solenberg31fec402016-05-06 02:13:12 -0700624// Test that we can add a send stream and that it has the correct defaults.
625TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
626 EXPECT_TRUE(SetupChannel());
627 EXPECT_TRUE(
628 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
629 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
630 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
631 EXPECT_EQ("", config.rtp.c_name);
632 EXPECT_EQ(0u, config.rtp.extensions.size());
633 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
634 config.send_transport);
635}
636
637// Test that we can add a receive stream and that it has the correct defaults.
638TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
639 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -0700640 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg31fec402016-05-06 02:13:12 -0700641 const webrtc::AudioReceiveStream::Config& config =
642 GetRecvStreamConfig(kSsrc1);
643 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
644 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
645 EXPECT_FALSE(config.rtp.transport_cc);
646 EXPECT_EQ(0u, config.rtp.extensions.size());
647 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
648 config.rtcp_send_transport);
649 EXPECT_EQ("", config.sync_group);
650}
651
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000652// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700653// correctly (such that opus appears first).
ossudedfd282016-06-14 07:12:39 -0700654// TODO(ossu): This test should move into a separate builtin audio codecs
655// module.
deadbeef67cf2c12016-04-13 10:07:16 -0700656TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
ossudedfd282016-06-14 07:12:39 -0700657 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000658 ASSERT_FALSE(codecs.empty());
659 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
660 EXPECT_EQ(48000, codecs[0].clockrate);
661 EXPECT_EQ(2, codecs[0].channels);
662 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000663}
664
stefanba4c0e42016-02-04 04:12:24 -0800665TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
ossudedfd282016-06-14 07:12:39 -0700666 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -0800667 bool opus_found = false;
668 for (cricket::AudioCodec codec : codecs) {
669 if (codec.name == "opus") {
670 EXPECT_TRUE(HasTransportCc(codec));
671 opus_found = true;
672 }
673 }
674 EXPECT_TRUE(opus_found);
675}
676
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000677// Tests that we can find codecs by name or id, and that we interpret the
678// clockrate and bitrate fields properly.
679TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
680 cricket::AudioCodec codec;
681 webrtc::CodecInst codec_inst;
682 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800683 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000684 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800685 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000686 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg2779bab2016-11-17 04:45:19 -0800687 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec1,
688 &codec_inst));
689 // Find telephone-event with explicit clockrate and 0 bitrate.
690 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec2,
solenberg26c8c912015-11-27 04:00:25 -0800691 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692 // Find ISAC with a different payload id.
693 codec = kIsacCodec;
694 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800695 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000696 EXPECT_EQ(codec.id, codec_inst.pltype);
697 // Find PCMU with a 0 clockrate.
698 codec = kPcmuCodec;
699 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800700 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000701 EXPECT_EQ(codec.id, codec_inst.pltype);
702 EXPECT_EQ(8000, codec_inst.plfreq);
703 // Find PCMU with a 0 bitrate.
704 codec = kPcmuCodec;
705 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800706 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000707 EXPECT_EQ(codec.id, codec_inst.pltype);
708 EXPECT_EQ(64000, codec_inst.rate);
709 // Find ISAC with an explicit bitrate.
710 codec = kIsacCodec;
711 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800712 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000713 EXPECT_EQ(codec.id, codec_inst.pltype);
714 EXPECT_EQ(32000, codec_inst.rate);
715}
716
717// Test that we set our inbound codecs properly, including changing PT.
718TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700719 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200720 cricket::AudioRecvParameters parameters;
721 parameters.codecs.push_back(kIsacCodec);
722 parameters.codecs.push_back(kPcmuCodec);
solenberg2779bab2016-11-17 04:45:19 -0800723 parameters.codecs.push_back(kTelephoneEventCodec1);
724 parameters.codecs.push_back(kTelephoneEventCodec2);
725 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200726 parameters.codecs[2].id = 126;
727 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700728 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700729 int channel_num = voe_.GetLastChannel();
solenberg2779bab2016-11-17 04:45:19 -0800730
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000731 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800732 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000733 gcodec.plfreq = 16000;
734 gcodec.channels = 1;
735 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
736 EXPECT_EQ(106, gcodec.pltype);
737 EXPECT_STREQ("ISAC", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800738
tfarina5237aaf2015-11-10 23:44:30 -0800739 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000740 gcodec.plfreq = 8000;
741 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
742 EXPECT_EQ(126, gcodec.pltype);
743 EXPECT_STREQ("telephone-event", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800744
745 gcodec.plfreq = 32000;
746 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
747 EXPECT_EQ(107, gcodec.pltype);
748 EXPECT_STREQ("telephone-event", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000749}
750
751// Test that we fail to set an unknown inbound codec.
752TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700753 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200754 cricket::AudioRecvParameters parameters;
755 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700756 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200757 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000758}
759
760// Test that we fail if we have duplicate types in the inbound list.
761TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700762 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200763 cricket::AudioRecvParameters parameters;
764 parameters.codecs.push_back(kIsacCodec);
765 parameters.codecs.push_back(kCn16000Codec);
766 parameters.codecs[1].id = kIsacCodec.id;
767 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000768}
769
770// Test that we can decode OPUS without stereo parameters.
771TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700772 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200773 cricket::AudioRecvParameters parameters;
774 parameters.codecs.push_back(kIsacCodec);
775 parameters.codecs.push_back(kPcmuCodec);
776 parameters.codecs.push_back(kOpusCodec);
777 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700778 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700779 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000780 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800781 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000782 // Even without stereo parameters, recv codecs still specify channels = 2.
783 EXPECT_EQ(2, opus.channels);
784 EXPECT_EQ(111, opus.pltype);
785 EXPECT_STREQ("opus", opus.plname);
786 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700787 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000788 EXPECT_EQ(111, opus.pltype);
789}
790
791// Test that we can decode OPUS with stereo = 0.
792TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700793 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200794 cricket::AudioRecvParameters parameters;
795 parameters.codecs.push_back(kIsacCodec);
796 parameters.codecs.push_back(kPcmuCodec);
797 parameters.codecs.push_back(kOpusCodec);
798 parameters.codecs[2].params["stereo"] = "0";
799 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700800 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000801 int channel_num2 = voe_.GetLastChannel();
802 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800803 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000804 // Even when stereo is off, recv codecs still specify channels = 2.
805 EXPECT_EQ(2, opus.channels);
806 EXPECT_EQ(111, opus.pltype);
807 EXPECT_STREQ("opus", opus.plname);
808 opus.pltype = 0;
809 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
810 EXPECT_EQ(111, opus.pltype);
811}
812
813// Test that we can decode OPUS with stereo = 1.
814TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700815 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200816 cricket::AudioRecvParameters parameters;
817 parameters.codecs.push_back(kIsacCodec);
818 parameters.codecs.push_back(kPcmuCodec);
819 parameters.codecs.push_back(kOpusCodec);
820 parameters.codecs[2].params["stereo"] = "1";
821 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700822 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000823 int channel_num2 = voe_.GetLastChannel();
824 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800825 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000826 EXPECT_EQ(2, opus.channels);
827 EXPECT_EQ(111, opus.pltype);
828 EXPECT_STREQ("opus", opus.plname);
829 opus.pltype = 0;
830 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
831 EXPECT_EQ(111, opus.pltype);
832}
833
834// Test that changes to recv codecs are applied to all streams.
835TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700836 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200837 cricket::AudioRecvParameters parameters;
838 parameters.codecs.push_back(kIsacCodec);
839 parameters.codecs.push_back(kPcmuCodec);
solenberg2779bab2016-11-17 04:45:19 -0800840 parameters.codecs.push_back(kTelephoneEventCodec1);
841 parameters.codecs.push_back(kTelephoneEventCodec2);
842 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200843 parameters.codecs[2].id = 126;
844 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700845 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000846 int channel_num2 = voe_.GetLastChannel();
solenberg2779bab2016-11-17 04:45:19 -0800847
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000848 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800849 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000850 gcodec.plfreq = 16000;
851 gcodec.channels = 1;
852 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
853 EXPECT_EQ(106, gcodec.pltype);
854 EXPECT_STREQ("ISAC", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800855
tfarina5237aaf2015-11-10 23:44:30 -0800856 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000857 gcodec.plfreq = 8000;
858 gcodec.channels = 1;
859 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
860 EXPECT_EQ(126, gcodec.pltype);
861 EXPECT_STREQ("telephone-event", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800862
863 gcodec.plfreq = 32000;
864 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
865 EXPECT_EQ(107, gcodec.pltype);
866 EXPECT_STREQ("telephone-event", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000867}
868
869TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700870 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200871 cricket::AudioRecvParameters parameters;
872 parameters.codecs.push_back(kIsacCodec);
solenberg2779bab2016-11-17 04:45:19 -0800873 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200874 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000875
876 int channel_num2 = voe_.GetLastChannel();
877 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800878 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000879 gcodec.plfreq = 16000;
880 gcodec.channels = 1;
881 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
882 EXPECT_EQ(106, gcodec.pltype);
883 EXPECT_STREQ("ISAC", gcodec.plname);
884}
885
886// Test that we can apply the same set of codecs again while playing.
887TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700888 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200889 cricket::AudioRecvParameters parameters;
890 parameters.codecs.push_back(kIsacCodec);
891 parameters.codecs.push_back(kCn16000Codec);
892 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700893 channel_->SetPlayout(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200894 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000895
896 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200897 parameters.codecs[0].id = 127;
898 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700899 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000900}
901
902// Test that we can add a codec while playing.
903TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700904 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200905 cricket::AudioRecvParameters parameters;
906 parameters.codecs.push_back(kIsacCodec);
907 parameters.codecs.push_back(kCn16000Codec);
908 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700909 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000910
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200911 parameters.codecs.push_back(kOpusCodec);
912 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700913 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000914 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800915 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000916 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
917}
918
919TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700920 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000921
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000922 // Test that when autobw is enabled, bitrate is kept as the default
923 // value. autobw is enabled for the following tests because the target
924 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000925
926 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700927 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000928
929 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700930 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000931
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000932 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700933 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000934}
935
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000936TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700937 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000938
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000939 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000940
941 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700942 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
943 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
944 // Rates above the max (56000) should be capped.
945 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000946
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000947 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700948 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
949 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
950 // Rates above the max (510000) should be capped.
951 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000952}
953
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000954TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700955 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000956
957 // Test that we can only set a maximum bitrate for a fixed-rate codec
958 // if it's bigger than the fixed rate.
959
960 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700961 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
962 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
963 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
964 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
965 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
966 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
967 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000968}
969
970TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700971 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200972 const int kDesiredBitrate = 128000;
973 cricket::AudioSendParameters parameters;
ossudedfd282016-06-14 07:12:39 -0700974 parameters.codecs = engine_->send_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200975 parameters.max_bandwidth_bps = kDesiredBitrate;
solenberg059fb442016-10-26 05:12:24 -0700976 SetSendParameters(parameters);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000977
978 EXPECT_TRUE(channel_->AddSendStream(
979 cricket::StreamParams::CreateLegacy(kSsrc1)));
980
minyue7a973442016-10-20 03:27:12 -0700981 EXPECT_EQ(kDesiredBitrate, GetCodecBitrate(kSsrc1));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000982}
983
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000984// Test that bitrate cannot be set for CBR codecs.
985// Bitrate is ignored if it is higher than the fixed bitrate.
986// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000987TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700988 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000989
990 // PCMU, default bitrate == 64000.
solenberg059fb442016-10-26 05:12:24 -0700991 SetSendParameters(send_parameters_);
minyue7a973442016-10-20 03:27:12 -0700992 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200993
994 send_parameters_.max_bandwidth_bps = 128000;
solenberg059fb442016-10-26 05:12:24 -0700995 SetSendParameters(send_parameters_);
minyue7a973442016-10-20 03:27:12 -0700996 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200997
998 send_parameters_.max_bandwidth_bps = 128;
999 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
minyue7a973442016-10-20 03:27:12 -07001000 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001001}
1002
skvlade0d46372016-04-07 22:59:22 -07001003// Test that the per-stream bitrate limit and the global
1004// bitrate limit both apply.
1005TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
1006 EXPECT_TRUE(SetupSendStream());
1007
1008 // opus, default bitrate == 64000.
1009 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
1010 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
1011 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
1012 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
1013
1014 // CBR codecs allow both maximums to exceed the bitrate.
1015 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
1016 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
1017 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
1018 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
1019
1020 // CBR codecs don't allow per stream maximums to be too low.
1021 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
1022 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
1023}
1024
1025// Test that an attempt to set RtpParameters for a stream that does not exist
1026// fails.
1027TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
1028 EXPECT_TRUE(SetupChannel());
1029 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001030 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -07001031 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
1032
1033 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001034 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -07001035}
1036
1037TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001038 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -07001039 // This test verifies that setting RtpParameters succeeds only if
1040 // the structure contains exactly one encoding.
1041 // TODO(skvlad): Update this test when we start supporting setting parameters
1042 // for each encoding individually.
1043
1044 EXPECT_TRUE(SetupSendStream());
deadbeeffb2aced2017-01-06 23:05:37 -08001045 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -07001046 // Two or more encodings should result in failure.
1047 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001048 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
deadbeeffb2aced2017-01-06 23:05:37 -08001049 // Zero encodings should also fail.
1050 parameters.encodings.clear();
1051 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
1052}
1053
1054// Changing the SSRC through RtpParameters is not allowed.
1055TEST_F(WebRtcVoiceEngineTestFake, CannotSetSsrcInRtpSendParameters) {
1056 EXPECT_TRUE(SetupSendStream());
1057 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
1058 parameters.encodings[0].ssrc = rtc::Optional<uint32_t>(0xdeadbeef);
1059 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -07001060}
1061
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001062// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001063// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001064TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
1065 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07001066 SetSend(true);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001067 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
1068 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001069 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001070 ASSERT_EQ(1u, parameters.encodings.size());
1071 ASSERT_TRUE(parameters.encodings[0].active);
1072 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001073 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001074 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
1075
1076 // Now change it back to active and verify we resume sending.
1077 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001078 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001079 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
1080}
1081
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001082// Test that SetRtpSendParameters configures the correct encoding channel for
1083// each SSRC.
skvlade0d46372016-04-07 22:59:22 -07001084TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
1085 SetupForMultiSendStream();
1086 // Create send streams.
1087 for (uint32_t ssrc : kSsrcs4) {
1088 EXPECT_TRUE(
1089 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
1090 }
1091 // Configure one stream to be limited by the stream config, another to be
1092 // limited by the global max, and the third one with no per-stream limit
1093 // (still subject to the global limit).
solenberg059fb442016-10-26 05:12:24 -07001094 SetGlobalMaxBitrate(kOpusCodec, 64000);
skvlade0d46372016-04-07 22:59:22 -07001095 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
1096 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
1097 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
1098
1099 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
1100 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
1101 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
1102
1103 // Remove the global cap; the streams should switch to their respective
1104 // maximums (or remain unchanged if there was no other limit on them.)
solenberg059fb442016-10-26 05:12:24 -07001105 SetGlobalMaxBitrate(kOpusCodec, -1);
skvlade0d46372016-04-07 22:59:22 -07001106 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
1107 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
1108 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
1109}
1110
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001111// Test that GetRtpSendParameters returns the currently configured codecs.
1112TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001113 EXPECT_TRUE(SetupSendStream());
1114 cricket::AudioSendParameters parameters;
1115 parameters.codecs.push_back(kIsacCodec);
1116 parameters.codecs.push_back(kPcmuCodec);
solenberg059fb442016-10-26 05:12:24 -07001117 SetSendParameters(parameters);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001118
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001119 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001120 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001121 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1122 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001123}
1124
deadbeefcb443432016-12-12 11:12:36 -08001125// Test that GetRtpSendParameters returns an SSRC.
1126TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersSsrc) {
1127 EXPECT_TRUE(SetupSendStream());
1128 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
1129 ASSERT_EQ(1u, rtp_parameters.encodings.size());
1130 EXPECT_EQ(kSsrc1, rtp_parameters.encodings[0].ssrc);
1131}
1132
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001133// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001134TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001135 EXPECT_TRUE(SetupSendStream());
1136 cricket::AudioSendParameters parameters;
1137 parameters.codecs.push_back(kIsacCodec);
1138 parameters.codecs.push_back(kPcmuCodec);
solenberg059fb442016-10-26 05:12:24 -07001139 SetSendParameters(parameters);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001140
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001141 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001142
1143 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001144 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001145
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001146 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1147 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1148 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1149}
1150
1151// Test that GetRtpReceiveParameters returns the currently configured codecs.
1152TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1153 EXPECT_TRUE(SetupRecvStream());
1154 cricket::AudioRecvParameters parameters;
1155 parameters.codecs.push_back(kIsacCodec);
1156 parameters.codecs.push_back(kPcmuCodec);
1157 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1158
1159 webrtc::RtpParameters rtp_parameters =
1160 channel_->GetRtpReceiveParameters(kSsrc1);
1161 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1162 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1163 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1164}
1165
deadbeefcb443432016-12-12 11:12:36 -08001166// Test that GetRtpReceiveParameters returns an SSRC.
1167TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersSsrc) {
1168 EXPECT_TRUE(SetupRecvStream());
1169 webrtc::RtpParameters rtp_parameters =
1170 channel_->GetRtpReceiveParameters(kSsrc1);
1171 ASSERT_EQ(1u, rtp_parameters.encodings.size());
1172 EXPECT_EQ(kSsrc1, rtp_parameters.encodings[0].ssrc);
1173}
1174
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001175// Test that if we set/get parameters multiple times, we get the same results.
1176TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1177 EXPECT_TRUE(SetupRecvStream());
1178 cricket::AudioRecvParameters parameters;
1179 parameters.codecs.push_back(kIsacCodec);
1180 parameters.codecs.push_back(kPcmuCodec);
1181 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1182
1183 webrtc::RtpParameters initial_params =
1184 channel_->GetRtpReceiveParameters(kSsrc1);
1185
1186 // We should be able to set the params we just got.
1187 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1188
1189 // ... And this shouldn't change the params returned by
1190 // GetRtpReceiveParameters.
1191 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1192 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001193}
1194
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001195// Test that we apply codecs properly.
1196TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001197 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001198 cricket::AudioSendParameters parameters;
1199 parameters.codecs.push_back(kIsacCodec);
1200 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001201 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001202 parameters.codecs[0].id = 96;
1203 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001204 const int initial_num = call_.GetNumCreatedSendStreams();
solenberg059fb442016-10-26 05:12:24 -07001205 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001206 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
1207 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1208 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1209 EXPECT_EQ(48000, send_codec_spec.codec_inst.rate);
1210 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1211 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1212 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
1213 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001214 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001215}
1216
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001217// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1218// to apply.
1219TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001220 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001221 cricket::AudioSendParameters parameters;
1222 parameters.codecs.push_back(kIsacCodec);
1223 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001224 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001225 parameters.codecs[0].id = 96;
1226 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001227 const int initial_num = call_.GetNumCreatedSendStreams();
solenberg059fb442016-10-26 05:12:24 -07001228 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001229 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001230 // Calling SetSendCodec again with same codec which is already set.
1231 // In this case media channel shouldn't send codec to VoE.
solenberg059fb442016-10-26 05:12:24 -07001232 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001233 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001234}
1235
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001236// Verify that G722 is set with 16000 samples per second to WebRTC.
1237TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001238 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001239 cricket::AudioSendParameters parameters;
1240 parameters.codecs.push_back(kG722CodecSdp);
solenberg059fb442016-10-26 05:12:24 -07001241 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001242 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001243 EXPECT_STREQ("G722", gcodec.plname);
1244 EXPECT_EQ(1, gcodec.channels);
1245 EXPECT_EQ(16000, gcodec.plfreq);
1246}
1247
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001248// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001249TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001250 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001251 cricket::AudioSendParameters parameters;
1252 parameters.codecs.push_back(kOpusCodec);
1253 parameters.codecs[0].bitrate = 0;
1254 parameters.codecs[0].clockrate = 50000;
1255 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001256}
1257
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001258// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001259TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001260 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001261 cricket::AudioSendParameters parameters;
1262 parameters.codecs.push_back(kOpusCodec);
1263 parameters.codecs[0].bitrate = 0;
1264 parameters.codecs[0].channels = 0;
1265 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001266}
1267
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001268// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001269TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001270 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001271 cricket::AudioSendParameters parameters;
1272 parameters.codecs.push_back(kOpusCodec);
1273 parameters.codecs[0].bitrate = 0;
1274 parameters.codecs[0].channels = 0;
1275 parameters.codecs[0].params["stereo"] = "1";
1276 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001277}
1278
1279// Test that if channel is 1 for opus and there's no stereo, we fail.
1280TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001281 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001282 cricket::AudioSendParameters parameters;
1283 parameters.codecs.push_back(kOpusCodec);
1284 parameters.codecs[0].bitrate = 0;
1285 parameters.codecs[0].channels = 1;
1286 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001287}
1288
1289// Test that if channel is 1 for opus and stereo=0, we fail.
1290TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001291 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001292 cricket::AudioSendParameters parameters;
1293 parameters.codecs.push_back(kOpusCodec);
1294 parameters.codecs[0].bitrate = 0;
1295 parameters.codecs[0].channels = 1;
1296 parameters.codecs[0].params["stereo"] = "0";
1297 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001298}
1299
1300// Test that if channel is 1 for opus and stereo=1, we fail.
1301TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001302 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001303 cricket::AudioSendParameters parameters;
1304 parameters.codecs.push_back(kOpusCodec);
1305 parameters.codecs[0].bitrate = 0;
1306 parameters.codecs[0].channels = 1;
1307 parameters.codecs[0].params["stereo"] = "1";
1308 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001309}
1310
1311// Test that with bitrate=0 and no stereo,
1312// channels and bitrate are 1 and 32000.
1313TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001314 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001315 cricket::AudioSendParameters parameters;
1316 parameters.codecs.push_back(kOpusCodec);
1317 parameters.codecs[0].bitrate = 0;
solenberg059fb442016-10-26 05:12:24 -07001318 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001319 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001320}
1321
1322// Test that with bitrate=0 and stereo=0,
1323// channels and bitrate are 1 and 32000.
1324TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001325 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001326 cricket::AudioSendParameters parameters;
1327 parameters.codecs.push_back(kOpusCodec);
1328 parameters.codecs[0].bitrate = 0;
1329 parameters.codecs[0].params["stereo"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001330 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001331 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001332}
1333
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001334// Test that with bitrate=invalid and stereo=0,
1335// channels and bitrate are 1 and 32000.
1336TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001337 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001338 cricket::AudioSendParameters parameters;
1339 parameters.codecs.push_back(kOpusCodec);
1340 parameters.codecs[0].params["stereo"] = "0";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001341 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001342 parameters.codecs[0].bitrate = 5999;
solenberg059fb442016-10-26 05:12:24 -07001343 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001344 CheckSendCodec(kSsrc1, "opus", 1, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001345
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001346 parameters.codecs[0].bitrate = 510001;
solenberg059fb442016-10-26 05:12:24 -07001347 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001348 CheckSendCodec(kSsrc1, "opus", 1, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001349}
1350
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001351// Test that with bitrate=0 and stereo=1,
1352// channels and bitrate are 2 and 64000.
1353TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001354 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001355 cricket::AudioSendParameters parameters;
1356 parameters.codecs.push_back(kOpusCodec);
1357 parameters.codecs[0].bitrate = 0;
1358 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001359 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001360 CheckSendCodec(kSsrc1, "opus", 2, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001361}
1362
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001363// Test that with bitrate=invalid and stereo=1,
1364// channels and bitrate are 2 and 64000.
1365TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001366 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001367 cricket::AudioSendParameters parameters;
1368 parameters.codecs.push_back(kOpusCodec);
1369 parameters.codecs[0].params["stereo"] = "1";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001370 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001371 parameters.codecs[0].bitrate = 5999;
solenberg059fb442016-10-26 05:12:24 -07001372 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001373 CheckSendCodec(kSsrc1, "opus", 2, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001374
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001375 parameters.codecs[0].bitrate = 510001;
solenberg059fb442016-10-26 05:12:24 -07001376 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001377 CheckSendCodec(kSsrc1, "opus", 2, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001378}
1379
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001380// Test that with bitrate=N and stereo unset,
1381// channels and bitrate are 1 and N.
1382TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001383 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001384 cricket::AudioSendParameters parameters;
1385 parameters.codecs.push_back(kOpusCodec);
1386 parameters.codecs[0].bitrate = 96000;
solenberg059fb442016-10-26 05:12:24 -07001387 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001388 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001389 EXPECT_EQ(111, gcodec.pltype);
1390 EXPECT_EQ(96000, gcodec.rate);
1391 EXPECT_STREQ("opus", gcodec.plname);
1392 EXPECT_EQ(1, gcodec.channels);
1393 EXPECT_EQ(48000, gcodec.plfreq);
1394}
1395
1396// Test that with bitrate=N and stereo=0,
1397// channels and bitrate are 1 and N.
1398TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001399 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001400 cricket::AudioSendParameters parameters;
1401 parameters.codecs.push_back(kOpusCodec);
1402 parameters.codecs[0].bitrate = 30000;
1403 parameters.codecs[0].params["stereo"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001404 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001405 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001406}
1407
1408// Test that with bitrate=N and without any parameters,
1409// channels and bitrate are 1 and N.
1410TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001411 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001412 cricket::AudioSendParameters parameters;
1413 parameters.codecs.push_back(kOpusCodec);
1414 parameters.codecs[0].bitrate = 30000;
solenberg059fb442016-10-26 05:12:24 -07001415 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001416 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001417}
1418
1419// Test that with bitrate=N and stereo=1,
1420// channels and bitrate are 2 and N.
1421TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001422 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001423 cricket::AudioSendParameters parameters;
1424 parameters.codecs.push_back(kOpusCodec);
1425 parameters.codecs[0].bitrate = 30000;
1426 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001427 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001428 CheckSendCodec(kSsrc1, "opus", 2, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001429}
1430
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001431// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1432// Also test that the "maxaveragebitrate" can't be set to values outside the
1433// range of 6000 and 510000
1434TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001435 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001436 cricket::AudioSendParameters parameters;
1437 parameters.codecs.push_back(kOpusCodec);
1438 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001439 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001440 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
solenberg059fb442016-10-26 05:12:24 -07001441 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001442 EXPECT_EQ(6000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001443
1444 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001445 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
solenberg059fb442016-10-26 05:12:24 -07001446 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001447 EXPECT_EQ(510000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001448
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001449 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
solenberg059fb442016-10-26 05:12:24 -07001450 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001451 EXPECT_EQ(200000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001452}
1453
stefan13f1a0a2016-11-30 07:22:58 -08001454TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithBitrates) {
1455 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1456 200000);
1457}
1458
1459TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithHighMaxBitrate) {
1460 SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "10000", 10000000);
1461}
1462
1463TEST_F(WebRtcVoiceEngineTestFake,
1464 SetSendCodecsWithoutBitratesUsesCorrectDefaults) {
1465 SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "", -1);
1466}
1467
1468TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCapsMinAndStartBitrate) {
1469 SetSendCodecsShouldWorkForBitrates("-1", 0, "-100", -1, "", -1);
1470}
1471
1472TEST_F(WebRtcVoiceEngineTestFake,
1473 SetMaxSendBandwidthShouldPreserveOtherBitrates) {
1474 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1475 200000);
1476 send_parameters_.max_bandwidth_bps = 300000;
1477 SetSendParameters(send_parameters_);
1478 EXPECT_EQ(100000, call_.GetConfig().bitrate_config.min_bitrate_bps)
1479 << "Setting max bitrate should keep previous min bitrate.";
1480 EXPECT_EQ(-1, call_.GetConfig().bitrate_config.start_bitrate_bps)
1481 << "Setting max bitrate should not reset start bitrate.";
1482 EXPECT_EQ(300000, call_.GetConfig().bitrate_config.max_bitrate_bps);
1483}
1484
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001485// Test that we can enable NACK with opus as caller.
1486TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001487 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001488 cricket::AudioSendParameters parameters;
1489 parameters.codecs.push_back(kOpusCodec);
1490 parameters.codecs[0].AddFeedbackParam(
1491 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1492 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001493 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001494 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001495 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001496}
1497
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001498// Test that we can enable NACK with opus as callee.
1499TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001500 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001501 cricket::AudioSendParameters parameters;
1502 parameters.codecs.push_back(kOpusCodec);
1503 parameters.codecs[0].AddFeedbackParam(
1504 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1505 cricket::kParamValueEmpty));
solenberg8189b022016-06-14 12:13:00 -07001506 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001507 SetSendParameters(parameters);
deadbeefb56069e2016-05-06 04:57:03 -07001508 // NACK should be enabled even with no send stream.
solenberg8189b022016-06-14 12:13:00 -07001509 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001510
1511 EXPECT_TRUE(channel_->AddSendStream(
1512 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg971cab02016-06-14 10:02:41 -07001513 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001514}
1515
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001516// Test that we can enable NACK on receive streams.
1517TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001518 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001519 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001520 cricket::AudioSendParameters parameters;
1521 parameters.codecs.push_back(kOpusCodec);
1522 parameters.codecs[0].AddFeedbackParam(
1523 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1524 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001525 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001526 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001527 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001528 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001529 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001530}
1531
1532// Test that we can disable NACK.
1533TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001534 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001535 cricket::AudioSendParameters parameters;
1536 parameters.codecs.push_back(kOpusCodec);
1537 parameters.codecs[0].AddFeedbackParam(
1538 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1539 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001540 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001541 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001542
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001543 parameters.codecs.clear();
1544 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001545 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001546 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001547}
1548
1549// Test that we can disable NACK on receive streams.
1550TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001551 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001552 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001553 cricket::AudioSendParameters parameters;
1554 parameters.codecs.push_back(kOpusCodec);
1555 parameters.codecs[0].AddFeedbackParam(
1556 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1557 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001558 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001559 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001560 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001561
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001562 parameters.codecs.clear();
1563 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001564 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001565 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001566 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001567}
1568
1569// Test that NACK is enabled on a new receive stream.
1570TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001571 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001572 cricket::AudioSendParameters parameters;
1573 parameters.codecs.push_back(kIsacCodec);
1574 parameters.codecs.push_back(kCn16000Codec);
1575 parameters.codecs[0].AddFeedbackParam(
1576 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1577 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001578 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001579 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001580
solenberg8189b022016-06-14 12:13:00 -07001581 EXPECT_TRUE(AddRecvStream(kSsrc2));
1582 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
1583 EXPECT_TRUE(AddRecvStream(kSsrc3));
1584 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc3).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001585}
1586
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001587// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001588TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
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);
solenberg059fb442016-10-26 05:12:24 -07001592 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001593 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001594}
1595
1596// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001597TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001598 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001599 cricket::AudioSendParameters parameters;
1600 parameters.codecs.push_back(kOpusCodec);
1601 parameters.codecs[0].bitrate = 0;
1602 parameters.codecs[0].params["useinbandfec"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001603 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001604 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001605}
1606
1607// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001608TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001609 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001610 cricket::AudioSendParameters parameters;
1611 parameters.codecs.push_back(kOpusCodec);
1612 parameters.codecs[0].bitrate = 0;
1613 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001614 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001615 EXPECT_TRUE(GetCodecFec(kSsrc1));
1616 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001617}
1618
1619// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001620TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001621 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001622 cricket::AudioSendParameters parameters;
1623 parameters.codecs.push_back(kOpusCodec);
1624 parameters.codecs[0].bitrate = 0;
1625 parameters.codecs[0].params["stereo"] = "1";
1626 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001627 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001628 EXPECT_TRUE(GetCodecFec(kSsrc1));
1629 CheckSendCodec(kSsrc1, "opus", 2, 64000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001630}
1631
1632// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001633TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
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);
solenberg059fb442016-10-26 05:12:24 -07001637 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001638 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001639}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001640
1641// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1642TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001643 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001644 cricket::AudioSendParameters parameters;
1645 parameters.codecs.push_back(kIsacCodec);
1646 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001647 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001648 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001649}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001650
1651// Test that Opus FEC status can be changed.
1652TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001653 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001654 cricket::AudioSendParameters parameters;
1655 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001656 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001657 EXPECT_FALSE(GetCodecFec(kSsrc1));
1658
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001659 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001660 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001661 EXPECT_TRUE(GetCodecFec(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001662}
1663
stefanba4c0e42016-02-04 04:12:24 -08001664TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001665 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001666 cricket::AudioSendParameters send_parameters;
1667 send_parameters.codecs.push_back(kOpusCodec);
1668 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
solenberg059fb442016-10-26 05:12:24 -07001669 SetSendParameters(send_parameters);
stefanba4c0e42016-02-04 04:12:24 -08001670
1671 cricket::AudioRecvParameters recv_parameters;
1672 recv_parameters.codecs.push_back(kIsacCodec);
1673 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
solenberg8189b022016-06-14 12:13:00 -07001674 EXPECT_TRUE(AddRecvStream(kSsrc1));
stefanba4c0e42016-02-04 04:12:24 -08001675 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1676 EXPECT_FALSE(
1677 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1678
ossudedfd282016-06-14 07:12:39 -07001679 send_parameters.codecs = engine_->send_codecs();
solenberg059fb442016-10-26 05:12:24 -07001680 SetSendParameters(send_parameters);
stefanba4c0e42016-02-04 04:12:24 -08001681 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1682 EXPECT_TRUE(
1683 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1684}
1685
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001686// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1687TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001688 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001689 cricket::AudioSendParameters parameters;
1690 parameters.codecs.push_back(kOpusCodec);
1691 parameters.codecs[0].bitrate = 0;
1692 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
solenberg059fb442016-10-26 05:12:24 -07001693 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001694 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
1695 EXPECT_EQ(12000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001696
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001697 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001698 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001699 EXPECT_EQ(24000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001700}
1701
1702// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1703TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001704 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001705 cricket::AudioSendParameters parameters;
1706 parameters.codecs.push_back(kOpusCodec);
1707 parameters.codecs[0].bitrate = 0;
1708 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
solenberg059fb442016-10-26 05:12:24 -07001709 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001710 EXPECT_EQ(8001, GetOpusMaxPlaybackRate(kSsrc1));
1711 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001712
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001713 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001714 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001715 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001716}
1717
1718// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1719TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001720 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001721 cricket::AudioSendParameters parameters;
1722 parameters.codecs.push_back(kOpusCodec);
1723 parameters.codecs[0].bitrate = 0;
1724 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
solenberg059fb442016-10-26 05:12:24 -07001725 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001726 EXPECT_EQ(12001, GetOpusMaxPlaybackRate(kSsrc1));
1727 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001728
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001729 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001730 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001731 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001732}
1733
1734// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1735TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001736 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001737 cricket::AudioSendParameters parameters;
1738 parameters.codecs.push_back(kOpusCodec);
1739 parameters.codecs[0].bitrate = 0;
1740 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
solenberg059fb442016-10-26 05:12:24 -07001741 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001742 EXPECT_EQ(16001, GetOpusMaxPlaybackRate(kSsrc1));
1743 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001744
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001745 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001746 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001747 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001748}
1749
1750// Test 24000 < maxplaybackrate triggers Opus full band mode.
1751TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001752 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001753 cricket::AudioSendParameters parameters;
1754 parameters.codecs.push_back(kOpusCodec);
1755 parameters.codecs[0].bitrate = 0;
1756 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
solenberg059fb442016-10-26 05:12:24 -07001757 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001758 EXPECT_EQ(24001, GetOpusMaxPlaybackRate(kSsrc1));
1759 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001760
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001761 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001762 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001763 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001764}
1765
1766// Test Opus that without maxplaybackrate, default playback rate is used.
1767TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
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(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001771 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001772 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001773}
1774
1775// Test the with non-Opus, maxplaybackrate has no effect.
1776TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001777 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001778 cricket::AudioSendParameters parameters;
1779 parameters.codecs.push_back(kIsacCodec);
1780 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
solenberg059fb442016-10-26 05:12:24 -07001781 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001782 EXPECT_EQ(0, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001783}
1784
1785// Test maxplaybackrate can be set on two streams.
1786TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001787 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001788 cricket::AudioSendParameters parameters;
1789 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001790 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001791 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001792
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001793 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
solenberg059fb442016-10-26 05:12:24 -07001794 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001795 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001796
1797 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
minyue7a973442016-10-20 03:27:12 -07001798 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc2));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001799}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001800
Minyue Li7100dcd2015-03-27 05:05:59 +01001801// Test that with usedtx=0, Opus DTX is off.
1802TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001803 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001804 cricket::AudioSendParameters parameters;
1805 parameters.codecs.push_back(kOpusCodec);
1806 parameters.codecs[0].params["usedtx"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001807 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001808 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001809}
1810
1811// Test that with usedtx=1, Opus DTX is on.
1812TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001813 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001814 cricket::AudioSendParameters parameters;
1815 parameters.codecs.push_back(kOpusCodec);
1816 parameters.codecs[0].params["usedtx"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001817 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001818 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001819}
1820
1821// Test that usedtx=1 works with stereo Opus.
1822TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001823 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001824 cricket::AudioSendParameters parameters;
1825 parameters.codecs.push_back(kOpusCodec);
1826 parameters.codecs[0].params["usedtx"] = "1";
1827 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001828 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001829 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001830}
1831
1832// Test that usedtx=1 does not work with non Opus.
1833TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001834 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001835 cricket::AudioSendParameters parameters;
1836 parameters.codecs.push_back(kIsacCodec);
1837 parameters.codecs[0].params["usedtx"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001838 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001839 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001840}
1841
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001842// Test that we can switch back and forth between Opus and ISAC with CN.
1843TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001844 EXPECT_TRUE(SetupSendStream());
minyue7a973442016-10-20 03:27:12 -07001845
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001846 cricket::AudioSendParameters opus_parameters;
1847 opus_parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001848 SetSendParameters(opus_parameters);
minyue7a973442016-10-20 03:27:12 -07001849 {
1850 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1851 EXPECT_EQ(111, gcodec.pltype);
1852 EXPECT_STREQ("opus", gcodec.plname);
1853 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001854
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001855 cricket::AudioSendParameters isac_parameters;
1856 isac_parameters.codecs.push_back(kIsacCodec);
1857 isac_parameters.codecs.push_back(kCn16000Codec);
1858 isac_parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001859 SetSendParameters(isac_parameters);
minyue7a973442016-10-20 03:27:12 -07001860 {
1861 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1862 EXPECT_EQ(103, gcodec.pltype);
1863 EXPECT_STREQ("ISAC", gcodec.plname);
1864 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001865
solenberg059fb442016-10-26 05:12:24 -07001866 SetSendParameters(opus_parameters);
minyue7a973442016-10-20 03:27:12 -07001867 {
1868 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1869 EXPECT_EQ(111, gcodec.pltype);
1870 EXPECT_STREQ("opus", gcodec.plname);
1871 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001872}
1873
1874// Test that we handle various ways of specifying bitrate.
1875TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001876 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001877 cricket::AudioSendParameters parameters;
1878 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
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(32000, gcodec.rate);
1885 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001886
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001887 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001888 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001889 {
1890 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1891 EXPECT_EQ(103, gcodec.pltype);
1892 EXPECT_STREQ("ISAC", gcodec.plname);
1893 EXPECT_EQ(-1, gcodec.rate);
1894 }
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001895 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
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(103, gcodec.pltype);
1900 EXPECT_STREQ("ISAC", gcodec.plname);
1901 EXPECT_EQ(28000, gcodec.rate);
1902 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001903
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001904 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
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].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001914 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001915 {
1916 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1917 EXPECT_EQ(0, gcodec.pltype);
1918 EXPECT_STREQ("PCMU", gcodec.plname);
1919 EXPECT_EQ(64000, gcodec.rate);
1920 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001921
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001922 parameters.codecs[0] = kOpusCodec;
1923 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001924 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001925 {
1926 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1927 EXPECT_EQ(111, gcodec.pltype);
1928 EXPECT_STREQ("opus", gcodec.plname);
1929 EXPECT_EQ(32000, gcodec.rate);
1930 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001931}
1932
Brave Yao5225dd82015-03-26 07:39:19 +08001933// Test that we could set packet size specified in kCodecParamPTime.
1934TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001935 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001936 cricket::AudioSendParameters parameters;
1937 parameters.codecs.push_back(kOpusCodec);
1938 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
solenberg059fb442016-10-26 05:12:24 -07001939 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001940 EXPECT_EQ(1920, GetCodecPacSize(kSsrc1)); // Opus gets 40ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001941
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001942 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
solenberg059fb442016-10-26 05:12:24 -07001943 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001944 EXPECT_EQ(480, GetCodecPacSize(kSsrc1)); // Opus gets 10ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001945
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001946 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
solenberg059fb442016-10-26 05:12:24 -07001947 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001948 EXPECT_EQ(2880, GetCodecPacSize(kSsrc1)); // Opus gets 60ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001949
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001950 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1951 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
solenberg059fb442016-10-26 05:12:24 -07001952 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001953 EXPECT_EQ(480, GetCodecPacSize(
1954 kSsrc1)); // Isac gets 30ms as the next smallest value.
Brave Yao5225dd82015-03-26 07:39:19 +08001955
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001956 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1957 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
solenberg059fb442016-10-26 05:12:24 -07001958 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001959 EXPECT_EQ(640, GetCodecPacSize(
1960 kSsrc1)); // G722 gets 40ms @16kHz as defined in VoE.
Brave Yao5225dd82015-03-26 07:39:19 +08001961}
1962
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001963// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001964TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001965 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001966 cricket::AudioSendParameters parameters;
1967 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001968}
1969
1970// Test that we can set send codecs even with telephone-event codec as the first
1971// one on the list.
1972TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001973 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001974 cricket::AudioSendParameters parameters;
solenberg2779bab2016-11-17 04:45:19 -08001975 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001976 parameters.codecs.push_back(kIsacCodec);
1977 parameters.codecs.push_back(kPcmuCodec);
1978 parameters.codecs[0].id = 98; // DTMF
1979 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001980 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001981 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001982 EXPECT_EQ(96, gcodec.pltype);
1983 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001984 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001985}
1986
solenberg31642aa2016-03-14 08:00:37 -07001987// Test that payload type range is limited for telephone-event codec.
1988TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001989 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001990 cricket::AudioSendParameters parameters;
solenbergffbbcac2016-11-17 05:25:37 -08001991 parameters.codecs.push_back(kTelephoneEventCodec2);
solenberg31642aa2016-03-14 08:00:37 -07001992 parameters.codecs.push_back(kIsacCodec);
1993 parameters.codecs[0].id = 0; // DTMF
1994 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001995 SetSendParameters(parameters);
solenberg31642aa2016-03-14 08:00:37 -07001996 EXPECT_TRUE(channel_->CanInsertDtmf());
1997 parameters.codecs[0].id = 128; // DTMF
1998 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1999 EXPECT_FALSE(channel_->CanInsertDtmf());
2000 parameters.codecs[0].id = 127;
solenberg059fb442016-10-26 05:12:24 -07002001 SetSendParameters(parameters);
solenberg31642aa2016-03-14 08:00:37 -07002002 EXPECT_TRUE(channel_->CanInsertDtmf());
2003 parameters.codecs[0].id = -1; // DTMF
2004 EXPECT_FALSE(channel_->SetSendParameters(parameters));
2005 EXPECT_FALSE(channel_->CanInsertDtmf());
2006}
2007
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00002008// Test that we can set send codecs even with CN codec as the first
2009// one on the list.
2010TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07002011 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002012 cricket::AudioSendParameters parameters;
2013 parameters.codecs.push_back(kCn16000Codec);
2014 parameters.codecs.push_back(kIsacCodec);
2015 parameters.codecs.push_back(kPcmuCodec);
2016 parameters.codecs[0].id = 98; // wideband CN
2017 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07002018 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002019 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2020 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2021 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2022 EXPECT_EQ(98, send_codec_spec.cng_payload_type);
2023 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002024}
2025
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002026// Test that we set VAD and DTMF types correctly as caller.
2027TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07002028 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002029 cricket::AudioSendParameters parameters;
2030 parameters.codecs.push_back(kIsacCodec);
2031 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002032 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002033 parameters.codecs.push_back(kCn16000Codec);
2034 parameters.codecs.push_back(kCn8000Codec);
solenberg2779bab2016-11-17 04:45:19 -08002035 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002036 parameters.codecs[0].id = 96;
2037 parameters.codecs[2].id = 97; // wideband CN
2038 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07002039 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002040 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2041 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2042 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2043 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2044 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2045 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2046 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002047 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002048}
2049
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002050// Test that we set VAD and DTMF types correctly as callee.
2051TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07002052 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002053 cricket::AudioSendParameters parameters;
2054 parameters.codecs.push_back(kIsacCodec);
2055 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002056 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002057 parameters.codecs.push_back(kCn16000Codec);
2058 parameters.codecs.push_back(kCn8000Codec);
solenbergffbbcac2016-11-17 05:25:37 -08002059 parameters.codecs.push_back(kTelephoneEventCodec2);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002060 parameters.codecs[0].id = 96;
2061 parameters.codecs[2].id = 97; // wideband CN
2062 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07002063 SetSendParameters(parameters);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002064 EXPECT_TRUE(channel_->AddSendStream(
2065 cricket::StreamParams::CreateLegacy(kSsrc1)));
2066
minyue7a973442016-10-20 03:27:12 -07002067 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2068 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2069 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2070 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2071 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2072 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2073 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002074 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002075}
2076
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002077// Test that we only apply VAD if we have a CN codec that matches the
2078// send codec clockrate.
2079TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07002080 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002081 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002082 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002083 parameters.codecs.push_back(kIsacCodec);
2084 parameters.codecs.push_back(kCn16000Codec);
2085 parameters.codecs[1].id = 97;
solenberg059fb442016-10-26 05:12:24 -07002086 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002087 {
2088 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2089 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2090 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2091 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2092 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2093 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
2094 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002095 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002096 parameters.codecs[0] = kPcmuCodec;
solenberg059fb442016-10-26 05:12:24 -07002097 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002098 {
2099 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2100 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2101 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2102 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002103 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002104 parameters.codecs[1] = kCn8000Codec;
solenberg059fb442016-10-26 05:12:24 -07002105 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002106 {
2107 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2108 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2109 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2110 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2111 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
2112 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
2113 }
Brave Yao5225dd82015-03-26 07:39:19 +08002114 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002115 parameters.codecs[0] = kIsacCodec;
solenberg059fb442016-10-26 05:12:24 -07002116 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002117 {
2118 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2119 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2120 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2121 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002122}
2123
2124// Test that we perform case-insensitive matching of codec names.
2125TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002126 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002127 cricket::AudioSendParameters parameters;
2128 parameters.codecs.push_back(kIsacCodec);
2129 parameters.codecs.push_back(kPcmuCodec);
2130 parameters.codecs.push_back(kCn16000Codec);
2131 parameters.codecs.push_back(kCn8000Codec);
solenberg2779bab2016-11-17 04:45:19 -08002132 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002133 parameters.codecs[0].name = "iSaC";
2134 parameters.codecs[0].id = 96;
2135 parameters.codecs[2].id = 97; // wideband CN
2136 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07002137 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002138 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2139 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2140 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2141 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2142 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2143 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2144 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002145 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002146}
2147
stefanba4c0e42016-02-04 04:12:24 -08002148class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2149 public:
2150 WebRtcVoiceEngineWithSendSideBweTest()
2151 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2152};
2153
2154TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2155 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002156 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002157 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07002158 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
2159 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
2160 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08002161 extension.id);
2162 return;
2163 }
2164 }
2165 FAIL() << "Transport sequence number extension not in header-extension list.";
2166}
2167
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002168// Test support for audio level header extension.
2169TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002170 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002171}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002172TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002173 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002174}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002175
solenbergd4adce42016-11-17 06:26:52 -08002176// Test support for transport sequence number header extension.
2177TEST_F(WebRtcVoiceEngineTestFake, SendTransportSequenceNumberHeaderExtensions) {
2178 TestSetSendRtpHeaderExtensions(
2179 webrtc::RtpExtension::kTransportSequenceNumberUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002180}
solenbergd4adce42016-11-17 06:26:52 -08002181TEST_F(WebRtcVoiceEngineTestFake, RecvTransportSequenceNumberHeaderExtensions) {
2182 TestSetRecvRtpHeaderExtensions(
2183 webrtc::RtpExtension::kTransportSequenceNumberUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002184}
2185
solenberg1ac56142015-10-13 03:58:19 -07002186// Test that we can create a channel and start sending on it.
2187TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002188 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002189 SetSendParameters(send_parameters_);
2190 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002191 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002192 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002193 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2194}
2195
2196// Test that a channel will send if and only if it has a source and is enabled
2197// for sending.
2198TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002199 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002200 SetSendParameters(send_parameters_);
2201 SetAudioSend(kSsrc1, true, nullptr);
2202 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002203 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002204 SetAudioSend(kSsrc1, true, &fake_source_);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002205 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002206 SetAudioSend(kSsrc1, true, nullptr);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002207 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002208}
2209
solenberg94218532016-06-16 10:53:22 -07002210// Test that a channel is muted/unmuted.
2211TEST_F(WebRtcVoiceEngineTestFake, SendStateMuteUnmute) {
2212 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002213 SetSendParameters(send_parameters_);
solenberg94218532016-06-16 10:53:22 -07002214 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
solenberg059fb442016-10-26 05:12:24 -07002215 SetAudioSend(kSsrc1, true, nullptr);
solenberg94218532016-06-16 10:53:22 -07002216 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
solenberg059fb442016-10-26 05:12:24 -07002217 SetAudioSend(kSsrc1, false, nullptr);
solenberg94218532016-06-16 10:53:22 -07002218 EXPECT_TRUE(GetSendStream(kSsrc1).muted());
2219}
2220
solenberg6d6e7c52016-04-13 09:07:30 -07002221// Test that SetSendParameters() does not alter a stream's send state.
2222TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2223 EXPECT_TRUE(SetupSendStream());
2224 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2225
2226 // Turn on sending.
solenberg059fb442016-10-26 05:12:24 -07002227 SetSend(true);
solenberg6d6e7c52016-04-13 09:07:30 -07002228 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2229
2230 // Changing RTP header extensions will recreate the AudioSendStream.
2231 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002232 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg059fb442016-10-26 05:12:24 -07002233 SetSendParameters(send_parameters_);
solenberg6d6e7c52016-04-13 09:07:30 -07002234 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2235
2236 // Turn off sending.
solenberg059fb442016-10-26 05:12:24 -07002237 SetSend(false);
solenberg6d6e7c52016-04-13 09:07:30 -07002238 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2239
2240 // Changing RTP header extensions will recreate the AudioSendStream.
2241 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -07002242 SetSendParameters(send_parameters_);
solenberg6d6e7c52016-04-13 09:07:30 -07002243 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2244}
2245
solenberg1ac56142015-10-13 03:58:19 -07002246// Test that we can create a channel and start playing out on it.
2247TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002248 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002249 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
aleloi84ef6152016-08-04 05:28:21 -07002250 channel_->SetPlayout(true);
2251 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
2252 channel_->SetPlayout(false);
2253 EXPECT_FALSE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002254}
2255
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002256// Test that we can add and remove send streams.
2257TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2258 SetupForMultiSendStream();
2259
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002260 // Set the global state for sending.
solenberg059fb442016-10-26 05:12:24 -07002261 SetSend(true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002262
solenbergc96df772015-10-21 13:01:53 -07002263 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002264 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002265 cricket::StreamParams::CreateLegacy(ssrc)));
solenberg059fb442016-10-26 05:12:24 -07002266 SetAudioSend(ssrc, true, &fake_source_);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002267 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002268 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002269 }
tfarina5237aaf2015-11-10 23:44:30 -08002270 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002271
solenbergc96df772015-10-21 13:01:53 -07002272 // Delete the send streams.
2273 for (uint32_t ssrc : kSsrcs4) {
2274 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002275 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002276 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002277 }
solenbergc96df772015-10-21 13:01:53 -07002278 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002279}
2280
2281// Test SetSendCodecs correctly configure the codecs in all send streams.
2282TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2283 SetupForMultiSendStream();
2284
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002285 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002286 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002287 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002288 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002289 }
2290
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002291 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002292 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002293 parameters.codecs.push_back(kIsacCodec);
2294 parameters.codecs.push_back(kCn16000Codec);
2295 parameters.codecs[1].id = 97;
solenberg059fb442016-10-26 05:12:24 -07002296 SetSendParameters(parameters);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002297
2298 // Verify ISAC and VAD are corrected configured on all send channels.
solenbergc96df772015-10-21 13:01:53 -07002299 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002300 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2301 const auto& send_codec_spec =
2302 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2303 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2304 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2305 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2306 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2307 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002308 }
2309
minyue7a973442016-10-20 03:27:12 -07002310 // Change to PCMU(8K) and CN(16K).
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002311 parameters.codecs[0] = kPcmuCodec;
solenberg059fb442016-10-26 05:12:24 -07002312 SetSendParameters(parameters);
solenbergc96df772015-10-21 13:01:53 -07002313 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002314 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2315 const auto& send_codec_spec =
2316 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2317 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2318 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2319 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2320 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002321 }
2322}
2323
2324// Test we can SetSend on all send streams correctly.
2325TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2326 SetupForMultiSendStream();
2327
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002328 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002329 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002330 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002331 cricket::StreamParams::CreateLegacy(ssrc)));
solenberg059fb442016-10-26 05:12:24 -07002332 SetAudioSend(ssrc, true, &fake_source_);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002333 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002334 }
2335
2336 // Set the global state for starting sending.
solenberg059fb442016-10-26 05:12:24 -07002337 SetSend(true);
solenbergc96df772015-10-21 13:01:53 -07002338 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002339 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002340 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002341 }
2342
2343 // Set the global state for stopping sending.
solenberg059fb442016-10-26 05:12:24 -07002344 SetSend(false);
solenbergc96df772015-10-21 13:01:53 -07002345 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002346 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002347 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002348 }
2349}
2350
2351// Test we can set the correct statistics on all send streams.
2352TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2353 SetupForMultiSendStream();
2354
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002355 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002356 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002357 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002358 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002359 }
solenberg85a04962015-10-27 03:35:21 -07002360
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002361 // Create a receive stream to check that none of the send streams end up in
2362 // the receive stream stats.
solenberg8189b022016-06-14 12:13:00 -07002363 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg971cab02016-06-14 10:02:41 -07002364
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002365 // We need send codec to be set to get all stats.
solenberg059fb442016-10-26 05:12:24 -07002366 SetSendParameters(send_parameters_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002367 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002368 SetAudioSendStreamStats();
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002369
solenberg85a04962015-10-27 03:35:21 -07002370 // Check stats for the added streams.
2371 {
2372 cricket::VoiceMediaInfo info;
2373 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002374
solenberg85a04962015-10-27 03:35:21 -07002375 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002376 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002377 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002378 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002379 }
hbos1acfbd22016-11-17 23:43:29 -08002380 VerifyVoiceSendRecvCodecs(info);
solenberg85a04962015-10-27 03:35:21 -07002381
2382 // We have added one receive stream. We should see empty stats.
2383 EXPECT_EQ(info.receivers.size(), 1u);
2384 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002385 }
solenberg1ac56142015-10-13 03:58:19 -07002386
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002387 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002388 {
2389 cricket::VoiceMediaInfo info;
2390 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2391 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002392 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002393 EXPECT_EQ(0u, info.receivers.size());
2394 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002395
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002396 // Deliver a new packet - a default receive stream should be created and we
2397 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002398 {
2399 cricket::VoiceMediaInfo info;
2400 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2401 SetAudioReceiveStreamStats();
2402 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002403 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002404 EXPECT_EQ(1u, info.receivers.size());
2405 VerifyVoiceReceiverInfo(info.receivers[0]);
hbos1acfbd22016-11-17 23:43:29 -08002406 VerifyVoiceSendRecvCodecs(info);
solenberg85a04962015-10-27 03:35:21 -07002407 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002408}
2409
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002410// Test that we can add and remove receive streams, and do proper send/playout.
2411// We can receive on multiple streams while sending one stream.
2412TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002413 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002414
solenberg1ac56142015-10-13 03:58:19 -07002415 // Start playout without a receive stream.
solenberg059fb442016-10-26 05:12:24 -07002416 SetSendParameters(send_parameters_);
aleloi84ef6152016-08-04 05:28:21 -07002417 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002418
solenberg1ac56142015-10-13 03:58:19 -07002419 // Adding another stream should enable playout on the new stream only.
solenberg8189b022016-06-14 12:13:00 -07002420 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg059fb442016-10-26 05:12:24 -07002421 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002422 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002423
solenberg1ac56142015-10-13 03:58:19 -07002424 // Make sure only the new stream is played out.
aleloi84ef6152016-08-04 05:28:21 -07002425 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002426
2427 // Adding yet another stream should have stream 2 and 3 enabled for playout.
solenberg8189b022016-06-14 12:13:00 -07002428 EXPECT_TRUE(AddRecvStream(kSsrc3));
aleloi84ef6152016-08-04 05:28:21 -07002429 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2430 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002431
2432 // Stop sending.
solenberg059fb442016-10-26 05:12:24 -07002433 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002434 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002435
2436 // Stop playout.
aleloi84ef6152016-08-04 05:28:21 -07002437 channel_->SetPlayout(false);
2438 EXPECT_FALSE(GetRecvStream(kSsrc2).started());
2439 EXPECT_FALSE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002440
aleloi84ef6152016-08-04 05:28:21 -07002441 // Restart playout and make sure recv streams are played out.
2442 channel_->SetPlayout(true);
2443 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2444 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002445
aleloi84ef6152016-08-04 05:28:21 -07002446 // Now remove the recv streams.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002447 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2448 EXPECT_TRUE(channel_->RemoveRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002449}
2450
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002451// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002452// and start sending on it.
2453TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002454 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002455 cricket::AudioOptions options_adjust_agc;
2456 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002457 webrtc::AgcConfig agc_config;
2458 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2459 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002460 send_parameters_.options = options_adjust_agc;
solenberg059fb442016-10-26 05:12:24 -07002461 SetSendParameters(send_parameters_);
2462 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002463 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002464 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2465 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenberg059fb442016-10-26 05:12:24 -07002466 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002467 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002468 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002469}
2470
wu@webrtc.org97077a32013-10-25 21:18:33 +00002471TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002472 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002473 EXPECT_CALL(adm_,
2474 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002475 webrtc::AgcConfig agc_config;
2476 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2477 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002478 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2479 send_parameters_.options.tx_agc_digital_compression_gain =
2480 rtc::Optional<uint16_t>(9);
2481 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2482 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
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(3, agc_config.targetLeveldBOv);
2486 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2487 EXPECT_TRUE(agc_config.limiterEnable);
2488
2489 // Check interaction with adjust_agc_delta. Both should be respected, for
2490 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002491 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
solenberg059fb442016-10-26 05:12:24 -07002492 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002493 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2494 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2495}
2496
wu@webrtc.org97077a32013-10-25 21:18:33 +00002497TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002498 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002499 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2500 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002501 send_parameters_.options.recording_sample_rate =
2502 rtc::Optional<uint32_t>(48000);
2503 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
solenberg059fb442016-10-26 05:12:24 -07002504 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002505}
2506
minyue6b825df2016-10-31 04:08:32 -07002507TEST_F(WebRtcVoiceEngineTestFake, SetAudioNetworkAdaptorViaOptions) {
2508 EXPECT_TRUE(SetupSendStream());
2509 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2510 send_parameters_.options.audio_network_adaptor_config =
2511 rtc::Optional<std::string>("1234");
2512 SetSendParameters(send_parameters_);
2513 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2514 GetAudioNetworkAdaptorConfig(kSsrc1));
2515}
2516
2517TEST_F(WebRtcVoiceEngineTestFake, AudioSendResetAudioNetworkAdaptor) {
2518 EXPECT_TRUE(SetupSendStream());
2519 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2520 send_parameters_.options.audio_network_adaptor_config =
2521 rtc::Optional<std::string>("1234");
2522 SetSendParameters(send_parameters_);
2523 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2524 GetAudioNetworkAdaptorConfig(kSsrc1));
2525 const int initial_num = call_.GetNumCreatedSendStreams();
2526 cricket::AudioOptions options;
2527 options.audio_network_adaptor = rtc::Optional<bool>(false);
2528 SetAudioSend(kSsrc1, true, nullptr, &options);
2529 // AudioSendStream expected to be recreated.
2530 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
2531 EXPECT_EQ(rtc::Optional<std::string>(), GetAudioNetworkAdaptorConfig(kSsrc1));
2532}
2533
2534TEST_F(WebRtcVoiceEngineTestFake, AudioNetworkAdaptorNotGetOverridden) {
2535 EXPECT_TRUE(SetupSendStream());
2536 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2537 send_parameters_.options.audio_network_adaptor_config =
2538 rtc::Optional<std::string>("1234");
2539 SetSendParameters(send_parameters_);
2540 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2541 GetAudioNetworkAdaptorConfig(kSsrc1));
2542 const int initial_num = call_.GetNumCreatedSendStreams();
2543 cricket::AudioOptions options;
2544 options.audio_network_adaptor = rtc::Optional<bool>();
2545 // Unvalued |options.audio_network_adaptor|.should not reset audio network
2546 // adaptor.
2547 SetAudioSend(kSsrc1, true, nullptr, &options);
2548 // AudioSendStream not expected to be recreated.
2549 EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
2550 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2551 GetAudioNetworkAdaptorConfig(kSsrc1));
2552}
2553
michaelt6672b262017-01-11 10:17:59 -08002554class WebRtcVoiceEngineWithSendSideBweWithOverheadTest
2555 : public WebRtcVoiceEngineTestFake {
2556 public:
2557 WebRtcVoiceEngineWithSendSideBweWithOverheadTest()
2558 : WebRtcVoiceEngineTestFake(
2559 "WebRTC-Audio-SendSideBwe/Enabled/WebRTC-SendSideBwe-WithOverhead/"
2560 "Enabled/") {}
2561};
2562
2563TEST_F(WebRtcVoiceEngineWithSendSideBweWithOverheadTest, MinAndMaxBitrate) {
2564 EXPECT_TRUE(SetupSendStream());
2565 cricket::AudioSendParameters parameters;
2566 parameters.codecs.push_back(kOpusCodec);
2567 SetSendParameters(parameters);
2568 const int initial_num = call_.GetNumCreatedSendStreams();
2569 EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
2570
2571 // OverheadPerPacket = Ipv4(20B) + UDP(8B) + SRTP(10B) + RTP(12)
2572 constexpr int kOverheadPerPacket = 20 + 8 + 10 + 12;
2573 constexpr int kMinOverheadBps = kOverheadPerPacket * 8 * 1000 / 60;
2574 constexpr int kMaxOverheadBps = kOverheadPerPacket * 8 * 1000 / 10;
2575
2576 constexpr int kOpusMinBitrateBps = 6000;
2577 EXPECT_EQ(kOpusMinBitrateBps + kMinOverheadBps,
2578 GetSendStreamConfig(kSsrc1).min_bitrate_bps);
2579 constexpr int kOpusBitrateFbBps = 32000;
2580 EXPECT_EQ(kOpusBitrateFbBps + kMaxOverheadBps,
2581 GetSendStreamConfig(kSsrc1).max_bitrate_bps);
2582
2583 parameters.options.audio_network_adaptor = rtc::Optional<bool>(true);
2584 parameters.options.audio_network_adaptor_config =
2585 rtc::Optional<std::string>("1234");
2586 SetSendParameters(parameters);
2587
2588 constexpr int kMinOverheadWithAnaBps = kOverheadPerPacket * 8 * 1000 / 60;
2589 constexpr int kMaxOverheadWithAnaBps = kOverheadPerPacket * 8 * 1000 / 20;
2590
2591 EXPECT_EQ(kOpusMinBitrateBps + kMinOverheadWithAnaBps,
2592 GetSendStreamConfig(kSsrc1).min_bitrate_bps);
2593
2594 EXPECT_EQ(kOpusBitrateFbBps + kMaxOverheadWithAnaBps,
2595 GetSendStreamConfig(kSsrc1).max_bitrate_bps);
2596}
2597
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002598// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002599// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002600TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002601 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002602 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002603}
2604
2605TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2606 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002607 EXPECT_TRUE(SetupSendStream());
solenbergff976312016-03-30 23:28:51 -07002608 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002609 // stream has to use a different SSRC.
solenberg8189b022016-06-14 12:13:00 -07002610 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg059fb442016-10-26 05:12:24 -07002611 SetSendParameters(send_parameters_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002612 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002613 SetAudioSendStreamStats();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002614
solenberg85a04962015-10-27 03:35:21 -07002615 // Check stats for the added streams.
2616 {
2617 cricket::VoiceMediaInfo info;
2618 EXPECT_EQ(true, channel_->GetStats(&info));
2619
2620 // We have added one send stream. We should see the stats we've set.
2621 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002622 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002623 // We have added one receive stream. We should see empty stats.
2624 EXPECT_EQ(info.receivers.size(), 1u);
2625 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2626 }
solenberg1ac56142015-10-13 03:58:19 -07002627
solenberg566ef242015-11-06 15:34:49 -08002628 // Start sending - this affects some reported stats.
2629 {
2630 cricket::VoiceMediaInfo info;
solenberg059fb442016-10-26 05:12:24 -07002631 SetSend(true);
solenberg566ef242015-11-06 15:34:49 -08002632 EXPECT_EQ(true, channel_->GetStats(&info));
2633 VerifyVoiceSenderInfo(info.senders[0], true);
hbos1acfbd22016-11-17 23:43:29 -08002634 VerifyVoiceSendRecvCodecs(info);
solenberg566ef242015-11-06 15:34:49 -08002635 }
2636
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002637 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002638 {
2639 cricket::VoiceMediaInfo info;
2640 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2641 EXPECT_EQ(true, channel_->GetStats(&info));
2642 EXPECT_EQ(1u, info.senders.size());
2643 EXPECT_EQ(0u, info.receivers.size());
2644 }
solenberg1ac56142015-10-13 03:58:19 -07002645
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002646 // Deliver a new packet - a default receive stream should be created and we
2647 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002648 {
2649 cricket::VoiceMediaInfo info;
2650 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2651 SetAudioReceiveStreamStats();
2652 EXPECT_EQ(true, channel_->GetStats(&info));
2653 EXPECT_EQ(1u, info.senders.size());
2654 EXPECT_EQ(1u, info.receivers.size());
2655 VerifyVoiceReceiverInfo(info.receivers[0]);
hbos1acfbd22016-11-17 23:43:29 -08002656 VerifyVoiceSendRecvCodecs(info);
solenberg85a04962015-10-27 03:35:21 -07002657 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002658}
2659
2660// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002661// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002662TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002663 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002664 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg8189b022016-06-14 12:13:00 -07002665 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -08002666 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002667}
2668
2669// Test that the local SSRC is the same on sending and receiving channels if the
2670// receive channel is created before the send channel.
2671TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002672 EXPECT_TRUE(SetupChannel());
solenberg4a0f7b52016-06-16 13:07:33 -07002673 EXPECT_TRUE(AddRecvStream(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002674 EXPECT_TRUE(channel_->AddSendStream(
solenberg4a0f7b52016-06-16 13:07:33 -07002675 cricket::StreamParams::CreateLegacy(kSsrc1)));
2676 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
2677 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002678}
2679
2680// Test that we can properly receive packets.
2681TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002682 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002683 EXPECT_TRUE(AddRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002684 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002685
2686 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2687 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002688}
2689
2690// Test that we can properly receive packets on multiple streams.
2691TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002692 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002693 const uint32_t ssrc1 = 1;
2694 const uint32_t ssrc2 = 2;
2695 const uint32_t ssrc3 = 3;
solenberg8189b022016-06-14 12:13:00 -07002696 EXPECT_TRUE(AddRecvStream(ssrc1));
2697 EXPECT_TRUE(AddRecvStream(ssrc2));
2698 EXPECT_TRUE(AddRecvStream(ssrc3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002699 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002700 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002701 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002702 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002703 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002704 }
mflodman3d7db262016-04-29 00:57:13 -07002705
2706 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2707 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2708 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2709
2710 EXPECT_EQ(s1.received_packets(), 0);
2711 EXPECT_EQ(s2.received_packets(), 0);
2712 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002713
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002714 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002715 EXPECT_EQ(s1.received_packets(), 0);
2716 EXPECT_EQ(s2.received_packets(), 0);
2717 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002718
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002719 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002720 EXPECT_EQ(s1.received_packets(), 1);
2721 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2722 EXPECT_EQ(s2.received_packets(), 0);
2723 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002724
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002725 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002726 EXPECT_EQ(s1.received_packets(), 1);
2727 EXPECT_EQ(s2.received_packets(), 1);
2728 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2729 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002730
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002731 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002732 EXPECT_EQ(s1.received_packets(), 1);
2733 EXPECT_EQ(s2.received_packets(), 1);
2734 EXPECT_EQ(s3.received_packets(), 1);
2735 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002736
mflodman3d7db262016-04-29 00:57:13 -07002737 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2738 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2739 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002740}
2741
solenberg7e63ef02015-11-20 00:19:43 -08002742// Test that receiving on an unsignalled stream works (default channel will be
2743// created).
2744TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002745 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002746 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2747
solenberg7e63ef02015-11-20 00:19:43 -08002748 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002749
2750 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2751 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2752 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002753}
2754
2755// Test that receiving on an unsignalled stream works (default channel will be
2756// created), and that packets will be forwarded to the default channel
2757// regardless of their SSRCs.
2758TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002759 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002760 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002761 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2762
mflodman3d7db262016-04-29 00:57:13 -07002763 // Note that ssrc = 0 is not supported.
2764 uint32_t ssrc = 1;
2765 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002766 rtc::SetBE32(&packet[8], ssrc);
2767 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002768
2769 // Verify we only have one default stream.
2770 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2771 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2772 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002773 }
mflodman3d7db262016-04-29 00:57:13 -07002774
2775 // Sending the same ssrc again should not create a new stream.
2776 --ssrc;
2777 DeliverPacket(packet, sizeof(packet));
2778 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2779 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2780 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002781}
2782
2783// Test that a default channel is created even after a signalled stream has been
2784// added, and that this stream will get any packets for unknown SSRCs.
2785TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002786 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002787 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002788 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2789
2790 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002791 const uint32_t signaled_ssrc = 1;
2792 rtc::SetBE32(&packet[8], signaled_ssrc);
solenberg8189b022016-06-14 12:13:00 -07002793 EXPECT_TRUE(AddRecvStream(signaled_ssrc));
solenberg7e63ef02015-11-20 00:19:43 -08002794 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002795 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2796 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002797
2798 // Note that the first unknown SSRC cannot be 0, because we only support
2799 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002800 const uint32_t unsignaled_ssrc = 7011;
2801 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002802 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002803 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2804 packet, sizeof(packet)));
2805 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2806
2807 DeliverPacket(packet, sizeof(packet));
2808 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2809
2810 rtc::SetBE32(&packet[8], signaled_ssrc);
2811 DeliverPacket(packet, sizeof(packet));
2812 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2813 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002814}
2815
solenberg0a617e22015-10-20 15:49:38 -07002816// Test that we properly handle failures to add a receive stream.
2817TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002818 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002819 voe_.set_fail_create_channel(true);
solenberg8189b022016-06-14 12:13:00 -07002820 EXPECT_FALSE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002821}
2822
solenberg0a617e22015-10-20 15:49:38 -07002823// Test that we properly handle failures to add a send stream.
2824TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002825 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002826 voe_.set_fail_create_channel(true);
2827 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2828}
2829
solenberg1ac56142015-10-13 03:58:19 -07002830// Test that AddRecvStream creates new stream.
2831TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002832 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002833 int channel_num = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07002834 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002835 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002836}
2837
2838// Test that after adding a recv stream, we do not decode more codecs than
2839// those previously passed into SetRecvCodecs.
2840TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002841 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002842 cricket::AudioRecvParameters parameters;
2843 parameters.codecs.push_back(kIsacCodec);
2844 parameters.codecs.push_back(kPcmuCodec);
2845 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -07002846 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002847 int channel_num2 = voe_.GetLastChannel();
2848 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002849 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002850 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002851 gcodec.channels = 2;
2852 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2853}
2854
2855// Test that we properly clean up any streams that were added, even if
2856// not explicitly removed.
2857TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002858 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002859 SetSendParameters(send_parameters_);
solenberg8189b022016-06-14 12:13:00 -07002860 EXPECT_TRUE(AddRecvStream(1));
2861 EXPECT_TRUE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002862 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2863 delete channel_;
2864 channel_ = NULL;
2865 EXPECT_EQ(0, voe_.GetNumChannels());
2866}
2867
wu@webrtc.org78187522013-10-07 23:32:02 +00002868TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002869 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07002870 EXPECT_FALSE(AddRecvStream(0));
wu@webrtc.org78187522013-10-07 23:32:02 +00002871}
2872
2873TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002874 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002875 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002876 // Manually delete channel to simulate a failure.
2877 int channel = voe_.GetLastChannel();
2878 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2879 // Add recv stream 2 should work.
solenberg8189b022016-06-14 12:13:00 -07002880 EXPECT_TRUE(AddRecvStream(2));
wu@webrtc.org78187522013-10-07 23:32:02 +00002881 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002882 EXPECT_NE(channel, new_channel);
2883 // The last created channel is deleted too.
2884 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002885}
2886
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002887// Test the InsertDtmf on default send stream as caller.
2888TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
solenbergffbbcac2016-11-17 05:25:37 -08002889 TestInsertDtmf(0, true, kTelephoneEventCodec1);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002890}
2891
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002892// Test the InsertDtmf on default send stream as callee
2893TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
solenbergffbbcac2016-11-17 05:25:37 -08002894 TestInsertDtmf(0, false, kTelephoneEventCodec2);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002895}
2896
2897// Test the InsertDtmf on specified send stream as caller.
2898TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
solenbergffbbcac2016-11-17 05:25:37 -08002899 TestInsertDtmf(kSsrc1, true, kTelephoneEventCodec2);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002900}
2901
2902// Test the InsertDtmf on specified send stream as callee.
2903TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
solenbergffbbcac2016-11-17 05:25:37 -08002904 TestInsertDtmf(kSsrc1, false, kTelephoneEventCodec1);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002905}
2906
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002907TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002908 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002909 EXPECT_CALL(adm_,
2910 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2911 EXPECT_CALL(adm_,
2912 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2913 EXPECT_CALL(adm_,
2914 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002915 bool ec_enabled;
2916 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002917 webrtc::AecmModes aecm_mode;
2918 bool cng_enabled;
2919 bool agc_enabled;
2920 webrtc::AgcModes agc_mode;
2921 webrtc::AgcConfig agc_config;
2922 bool ns_enabled;
2923 webrtc::NsModes ns_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002924 bool stereo_swapping_enabled;
2925 bool typing_detection_enabled;
2926 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002927 voe_.GetAecmMode(aecm_mode, cng_enabled);
2928 voe_.GetAgcStatus(agc_enabled, agc_mode);
2929 voe_.GetAgcConfig(agc_config);
2930 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002931 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2932 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2933 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002934 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002935 EXPECT_FALSE(cng_enabled);
2936 EXPECT_TRUE(agc_enabled);
2937 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2938 EXPECT_TRUE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08002939 EXPECT_TRUE(IsHighPassFilterEnabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002940 EXPECT_FALSE(stereo_swapping_enabled);
2941 EXPECT_TRUE(typing_detection_enabled);
2942 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2943 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002944 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2945 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002946
solenberg246b8172015-12-08 09:50:23 -08002947 // Nothing set in AudioOptions, so everything should be as default.
2948 send_parameters_.options = cricket::AudioOptions();
solenberg059fb442016-10-26 05:12:24 -07002949 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002950 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002951 voe_.GetAecmMode(aecm_mode, cng_enabled);
2952 voe_.GetAgcStatus(agc_enabled, agc_mode);
2953 voe_.GetAgcConfig(agc_config);
2954 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002955 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2956 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2957 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002958 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002959 EXPECT_FALSE(cng_enabled);
2960 EXPECT_TRUE(agc_enabled);
2961 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2962 EXPECT_TRUE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08002963 EXPECT_TRUE(IsHighPassFilterEnabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002964 EXPECT_FALSE(stereo_swapping_enabled);
2965 EXPECT_TRUE(typing_detection_enabled);
2966 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2967 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002968 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2969 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002970
2971 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002972 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002973 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002974 voe_.GetEcStatus(ec_enabled, ec_mode);
2975 EXPECT_FALSE(ec_enabled);
2976
2977 // Turn echo cancellation back on, with settings, and make sure
2978 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002979 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002980 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002981 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002982 voe_.GetAecmMode(aecm_mode, cng_enabled);
2983 voe_.GetAgcStatus(agc_enabled, agc_mode);
2984 voe_.GetAgcConfig(agc_config);
2985 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002986 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2987 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2988 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002989 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002990 EXPECT_TRUE(agc_enabled);
2991 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2992 EXPECT_TRUE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08002993 EXPECT_TRUE(IsHighPassFilterEnabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002994 EXPECT_FALSE(stereo_swapping_enabled);
2995 EXPECT_TRUE(typing_detection_enabled);
2996 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2997 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2998
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002999 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
3000 // control.
solenberg246b8172015-12-08 09:50:23 -08003001 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07003002 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003003 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003004 voe_.GetAecmMode(aecm_mode, cng_enabled);
3005 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07003006 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003007 EXPECT_EQ(ec_mode, webrtc::kEcConference);
3008
3009 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08003010 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
3011 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
3012 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07003013 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003014 voe_.GetEcStatus(ec_enabled, ec_mode);
3015 EXPECT_FALSE(ec_enabled);
3016 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08003017 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07003018 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003019 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003020 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07003021 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01003022 EXPECT_EQ(ec_mode, webrtc::kEcConference);
3023
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003024 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08003025 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07003026 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003027 voe_.GetAgcStatus(agc_enabled, agc_mode);
3028 EXPECT_FALSE(agc_enabled);
3029
3030 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08003031 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
3032 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
solenberg059fb442016-10-26 05:12:24 -07003033 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003034 voe_.GetAgcStatus(agc_enabled, agc_mode);
3035 EXPECT_TRUE(agc_enabled);
3036 voe_.GetAgcConfig(agc_config);
3037 EXPECT_EQ(0, agc_config.targetLeveldBOv);
3038
3039 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08003040 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
3041 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
3042 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
3043 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07003044 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003045 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003046 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3047 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3048 EXPECT_FALSE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08003049 EXPECT_FALSE(IsHighPassFilterEnabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003050 EXPECT_FALSE(typing_detection_enabled);
3051 EXPECT_TRUE(stereo_swapping_enabled);
3052
solenberg1ac56142015-10-13 03:58:19 -07003053 // Set options again to ensure it has no impact.
solenberg059fb442016-10-26 05:12:24 -07003054 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003055 voe_.GetEcStatus(ec_enabled, ec_mode);
3056 voe_.GetNsStatus(ns_enabled, ns_mode);
3057 EXPECT_TRUE(ec_enabled);
3058 EXPECT_EQ(webrtc::kEcConference, ec_mode);
3059 EXPECT_FALSE(ns_enabled);
3060 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
3061}
3062
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003063TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07003064 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003065
3066 bool ec_enabled;
3067 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003068 bool agc_enabled;
3069 webrtc::AgcModes agc_mode;
3070 bool ns_enabled;
3071 webrtc::NsModes ns_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003072 bool stereo_swapping_enabled;
3073 bool typing_detection_enabled;
3074
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003075 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003076 voe_.GetAgcStatus(agc_enabled, agc_mode);
3077 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003078 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3079 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3080 EXPECT_TRUE(ec_enabled);
3081 EXPECT_TRUE(agc_enabled);
3082 EXPECT_TRUE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08003083 EXPECT_TRUE(IsHighPassFilterEnabled());
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003084 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003085 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003086}
3087
3088TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
3089 webrtc::AgcConfig set_config = {0};
3090 set_config.targetLeveldBOv = 3;
3091 set_config.digitalCompressionGaindB = 9;
3092 set_config.limiterEnable = true;
3093 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003094
3095 webrtc::AgcConfig config = {0};
3096 EXPECT_EQ(0, voe_.GetAgcConfig(config));
3097 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
3098 EXPECT_EQ(set_config.digitalCompressionGaindB,
3099 config.digitalCompressionGaindB);
3100 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
3101}
3102
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003103TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07003104 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07003105 EXPECT_CALL(adm_,
3106 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
3107 EXPECT_CALL(adm_,
3108 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
3109 EXPECT_CALL(adm_,
3110 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
solenberg059fb442016-10-26 05:12:24 -07003111 EXPECT_CALL(adm_,
3112 RecordingIsInitialized()).Times(2).WillRepeatedly(Return(false));
3113 EXPECT_CALL(adm_, Recording()).Times(2).WillRepeatedly(Return(false));
3114 EXPECT_CALL(adm_, InitRecording()).Times(2).WillRepeatedly(Return(0));
3115 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(10);
3116 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(10);
solenberg5b5129a2016-04-08 05:35:48 -07003117
kwiberg686a8ef2016-02-26 03:00:35 -08003118 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07003119 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003120 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08003121 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07003122 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003123 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003124
3125 // Have to add a stream to make SetSend work.
3126 cricket::StreamParams stream1;
3127 stream1.ssrcs.push_back(1);
3128 channel1->AddSendStream(stream1);
3129 cricket::StreamParams stream2;
3130 stream2.ssrcs.push_back(2);
3131 channel2->AddSendStream(stream2);
3132
3133 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003134 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003135 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
3136 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
3137 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07003138 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003139 EXPECT_EQ(parameters_options_all.options, channel1->options());
solenberg059fb442016-10-26 05:12:24 -07003140 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003141 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003142
3143 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003144 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003145 parameters_options_no_ns.options.noise_suppression =
3146 rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07003147 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003148 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003149 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3150 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3151 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003152 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003153
3154 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003155 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003156 parameters_options_no_agc.options.auto_gain_control =
3157 rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07003158 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003159 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3160 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3161 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003162 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003163
solenberg059fb442016-10-26 05:12:24 -07003164 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003165 bool ec_enabled;
3166 webrtc::EcModes ec_mode;
3167 bool agc_enabled;
3168 webrtc::AgcModes agc_mode;
3169 bool ns_enabled;
3170 webrtc::NsModes ns_mode;
3171 voe_.GetEcStatus(ec_enabled, ec_mode);
3172 voe_.GetAgcStatus(agc_enabled, agc_mode);
3173 voe_.GetNsStatus(ns_enabled, ns_mode);
3174 EXPECT_TRUE(ec_enabled);
3175 EXPECT_TRUE(agc_enabled);
3176 EXPECT_TRUE(ns_enabled);
3177
solenberg059fb442016-10-26 05:12:24 -07003178 channel1->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003179 voe_.GetEcStatus(ec_enabled, ec_mode);
3180 voe_.GetAgcStatus(agc_enabled, agc_mode);
3181 voe_.GetNsStatus(ns_enabled, ns_mode);
3182 EXPECT_TRUE(ec_enabled);
3183 EXPECT_TRUE(agc_enabled);
3184 EXPECT_FALSE(ns_enabled);
3185
solenberg059fb442016-10-26 05:12:24 -07003186 channel2->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003187 voe_.GetEcStatus(ec_enabled, ec_mode);
3188 voe_.GetAgcStatus(agc_enabled, agc_mode);
3189 voe_.GetNsStatus(ns_enabled, ns_mode);
3190 EXPECT_TRUE(ec_enabled);
3191 EXPECT_FALSE(agc_enabled);
3192 EXPECT_TRUE(ns_enabled);
3193
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003194 // Make sure settings take effect while we are sending.
solenberg059fb442016-10-26 05:12:24 -07003195 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
3196 EXPECT_CALL(apm_, ApplyConfig(testing::_));
3197 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003198 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3199 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003200 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003201 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003202 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003203 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003204 channel2->SetSend(true);
solenberg059fb442016-10-26 05:12:24 -07003205 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc_nor_ns));
Karl Wibergbe579832015-11-10 22:34:18 +01003206 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3207 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3208 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003209 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003210 voe_.GetEcStatus(ec_enabled, ec_mode);
3211 voe_.GetAgcStatus(agc_enabled, agc_mode);
3212 voe_.GetNsStatus(ns_enabled, ns_mode);
3213 EXPECT_TRUE(ec_enabled);
3214 EXPECT_FALSE(agc_enabled);
3215 EXPECT_FALSE(ns_enabled);
3216}
3217
wu@webrtc.orgde305012013-10-31 15:40:38 +00003218// This test verifies DSCP settings are properly applied on voice media channel.
3219TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003220 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003221 cricket::FakeNetworkInterface network_interface;
3222 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003223 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003224
solenberg059fb442016-10-26 05:12:24 -07003225 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(3);
3226 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(3);
3227
solenbergbc37fc82016-04-04 09:54:44 -07003228 channel.reset(
3229 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003230 channel->SetInterface(&network_interface);
3231 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3232 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3233
3234 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003235 channel.reset(
3236 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003237 channel->SetInterface(&network_interface);
3238 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3239
3240 // Verify that setting the option to false resets the
3241 // DiffServCodePoint.
3242 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003243 channel.reset(
3244 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003245 channel->SetInterface(&network_interface);
3246 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3247 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3248
3249 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003250}
3251
solenberg1ac56142015-10-13 03:58:19 -07003252TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003253 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003254 cricket::WebRtcVoiceMediaChannel* media_channel =
3255 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003256 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
solenberg8189b022016-06-14 12:13:00 -07003257 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -07003258 int channel_id = voe_.GetLastChannel();
3259 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3260 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
solenberg8189b022016-06-14 12:13:00 -07003261 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07003262 int channel_id2 = voe_.GetLastChannel();
3263 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003264}
3265
solenberg1ac56142015-10-13 03:58:19 -07003266TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003267 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003268 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003269 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3270 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3271 EXPECT_TRUE(channel_->AddSendStream(
3272 cricket::StreamParams::CreateLegacy(kSsrc1)));
3273 int channel_id = voe_.GetLastChannel();
3274 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3275 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3276 EXPECT_TRUE(channel_->AddSendStream(
3277 cricket::StreamParams::CreateLegacy(kSsrc2)));
3278 int channel_id2 = voe_.GetLastChannel();
3279 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003280}
3281
solenberg4bac9c52015-10-09 02:32:53 -07003282TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003283 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003284 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003285 cricket::StreamParams stream;
3286 stream.ssrcs.push_back(kSsrc2);
3287 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg217fb662016-06-17 08:30:54 -07003288 EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrc2).gain());
solenberg4bac9c52015-10-09 02:32:53 -07003289 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg217fb662016-06-17 08:30:54 -07003290 EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc2).gain());
solenberg1ac56142015-10-13 03:58:19 -07003291}
3292
3293TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003294 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003295 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3296 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg217fb662016-06-17 08:30:54 -07003297 EXPECT_DOUBLE_EQ(2, GetRecvStream(1).gain());
solenberg1ac56142015-10-13 03:58:19 -07003298 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenberg217fb662016-06-17 08:30:54 -07003299 EXPECT_DOUBLE_EQ(3, GetRecvStream(1).gain());
3300 EXPECT_TRUE(channel_->SetOutputVolume(1, 4));
3301 EXPECT_DOUBLE_EQ(4, GetRecvStream(1).gain());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003302}
3303
pbos8fc7fa72015-07-15 08:02:58 -07003304TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003305 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003306 const std::string kSyncLabel = "AvSyncLabel";
3307
solenbergff976312016-03-30 23:28:51 -07003308 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003309 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3310 sp.sync_label = kSyncLabel;
3311 // Creating two channels to make sure that sync label is set properly for both
3312 // the default voice channel and following ones.
3313 EXPECT_TRUE(channel_->AddRecvStream(sp));
3314 sp.ssrcs[0] += 1;
3315 EXPECT_TRUE(channel_->AddRecvStream(sp));
3316
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003317 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003318 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003319 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003320 << "SyncGroup should be set based on sync_label";
3321 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003322 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003323 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003324}
3325
solenberg3a941542015-11-16 07:34:50 -08003326// TODO(solenberg): Remove, once recv streams are configured through Call.
3327// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003328TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003329 // Test that setting the header extensions results in the expected state
3330 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003331 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003332 ssrcs.push_back(223);
3333 ssrcs.push_back(224);
3334
solenbergff976312016-03-30 23:28:51 -07003335 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07003336 SetSendParameters(send_parameters_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02003337 for (uint32_t ssrc : ssrcs) {
solenberg059fb442016-10-26 05:12:24 -07003338 EXPECT_TRUE(channel_->AddRecvStream(
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003339 cricket::StreamParams::CreateLegacy(ssrc)));
3340 }
3341
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003342 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003343 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003344 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003345 EXPECT_NE(nullptr, s);
3346 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3347 }
3348
3349 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003350 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003351 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003352 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003353 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003354 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003355 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003356 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003357 EXPECT_NE(nullptr, s);
3358 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003359 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3360 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003361 for (const auto& s_ext : s_exts) {
3362 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003363 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003364 }
3365 }
3366 }
3367 }
3368
3369 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003370 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003371 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003372 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003373 EXPECT_NE(nullptr, s);
3374 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3375 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003376}
3377
3378TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3379 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003380 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003381 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003382 static const unsigned char kRtcp[] = {
3383 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3384 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3385 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3386 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3387 };
jbaucheec21bd2016-03-20 06:15:43 -07003388 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003389
solenbergff976312016-03-30 23:28:51 -07003390 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003391 cricket::WebRtcVoiceMediaChannel* media_channel =
3392 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg059fb442016-10-26 05:12:24 -07003393 SetSendParameters(send_parameters_);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003394 EXPECT_TRUE(media_channel->AddRecvStream(
3395 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3396
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003397 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003398 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003399 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003400 EXPECT_EQ(0, s->received_packets());
3401 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3402 EXPECT_EQ(1, s->received_packets());
3403 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3404 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003405}
Minyue2013aec2015-05-13 14:14:42 +02003406
solenberg0a617e22015-10-20 15:49:38 -07003407// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003408// since they do not send RTCP SR.
solenberg7602aab2016-11-14 11:30:07 -08003409TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_SendCreatedFirst) {
solenbergff976312016-03-30 23:28:51 -07003410 EXPECT_TRUE(SetupSendStream());
solenberg7602aab2016-11-14 11:30:07 -08003411 EXPECT_TRUE(AddRecvStream(kSsrc2));
3412 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
3413 EXPECT_TRUE(channel_->AddSendStream(
3414 cricket::StreamParams::CreateLegacy(kSsrc3)));
3415 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
3416 EXPECT_TRUE(AddRecvStream(kSsrc4));
3417 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc4).rtp.local_ssrc);
Minyue2013aec2015-05-13 14:14:42 +02003418}
3419
solenberg7602aab2016-11-14 11:30:07 -08003420TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_RecvCreatedFirst) {
3421 EXPECT_TRUE(SetupRecvStream());
3422 EXPECT_EQ(0xFA17FA17u, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3423 EXPECT_TRUE(channel_->AddSendStream(
3424 cricket::StreamParams::CreateLegacy(kSsrc2)));
3425 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3426 EXPECT_TRUE(AddRecvStream(kSsrc3));
3427 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc3).rtp.local_ssrc);
3428 EXPECT_TRUE(channel_->AddSendStream(
3429 cricket::StreamParams::CreateLegacy(kSsrc4)));
3430 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3431 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc3).rtp.local_ssrc);
Minyue2013aec2015-05-13 14:14:42 +02003432}
stefan658910c2015-09-03 05:48:32 -07003433
deadbeef884f5852016-01-15 09:20:04 -08003434TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003435 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003436 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3437 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003438
3439 // Setting the sink before a recv stream exists should do nothing.
3440 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
solenberg8189b022016-06-14 12:13:00 -07003441 EXPECT_TRUE(AddRecvStream(kSsrc1));
deadbeef884f5852016-01-15 09:20:04 -08003442 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3443
3444 // Now try actually setting the sink.
3445 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3446 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3447
3448 // Now try resetting it.
3449 channel_->SetRawAudioSink(kSsrc1, nullptr);
3450 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3451}
3452
3453TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003454 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003455 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3456 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003457
3458 // Should be able to set a default sink even when no stream exists.
3459 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3460
3461 // Create default channel and ensure it's assigned the default sink.
3462 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3463 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3464
3465 // Try resetting the default sink.
3466 channel_->SetRawAudioSink(0, nullptr);
3467 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3468
3469 // Try setting the default sink while the default stream exists.
3470 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3471 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3472
3473 // If we remove and add a default stream, it should get the same sink.
3474 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3475 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3476 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3477}
3478
skvlad7a43d252016-03-22 15:32:27 -07003479// Test that, just like the video channel, the voice channel communicates the
3480// network state to the call.
3481TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003482 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003483
3484 EXPECT_EQ(webrtc::kNetworkUp,
3485 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3486 EXPECT_EQ(webrtc::kNetworkUp,
3487 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3488
3489 channel_->OnReadyToSend(false);
3490 EXPECT_EQ(webrtc::kNetworkDown,
3491 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3492 EXPECT_EQ(webrtc::kNetworkUp,
3493 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3494
3495 channel_->OnReadyToSend(true);
3496 EXPECT_EQ(webrtc::kNetworkUp,
3497 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3498 EXPECT_EQ(webrtc::kNetworkUp,
3499 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3500}
3501
aleloi18e0b672016-10-04 02:45:47 -07003502// Test that playout is still started after changing parameters
3503TEST_F(WebRtcVoiceEngineTestFake, PreservePlayoutWhenRecreateRecvStream) {
3504 SetupRecvStream();
3505 channel_->SetPlayout(true);
3506 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3507
3508 // Changing RTP header extensions will recreate the AudioReceiveStream.
3509 cricket::AudioRecvParameters parameters;
3510 parameters.extensions.push_back(
3511 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
3512 channel_->SetRecvParameters(parameters);
3513
3514 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3515}
3516
stefan658910c2015-09-03 05:48:32 -07003517// Tests that the library initializes and shuts down properly.
3518TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossu29b1a8d2016-06-13 07:34:51 -07003519 // If the VoiceEngine wants to gather available codecs early, that's fine but
3520 // we never want it to create a decoder at this stage.
ossuc54071d2016-08-17 02:45:41 -07003521 cricket::WebRtcVoiceEngine engine(
gyzhou95aa9642016-12-13 14:06:26 -08003522 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr);
skvlad11a9cbf2016-10-07 11:53:05 -07003523 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003524 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003525 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003526 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3527 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003528 EXPECT_TRUE(channel != nullptr);
3529 delete channel;
solenbergff976312016-03-30 23:28:51 -07003530}
stefan658910c2015-09-03 05:48:32 -07003531
solenbergff976312016-03-30 23:28:51 -07003532// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003533TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3534 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3535 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3536 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003537 {
ossuc54071d2016-08-17 02:45:41 -07003538 cricket::WebRtcVoiceEngine engine(
gyzhou95aa9642016-12-13 14:06:26 -08003539 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr);
skvlad11a9cbf2016-10-07 11:53:05 -07003540 webrtc::RtcEventLogNullImpl event_log;
solenbergff976312016-03-30 23:28:51 -07003541 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003542 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
solenbergff976312016-03-30 23:28:51 -07003543 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3544 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3545 EXPECT_TRUE(channel != nullptr);
3546 delete channel;
3547 }
stefan658910c2015-09-03 05:48:32 -07003548}
3549
3550// Tests that the library is configured with the codecs we want.
3551TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003552 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3553 // module.
3554
stefan658910c2015-09-03 05:48:32 -07003555 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003556 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003557 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003558 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003559 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003560 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003561 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003562 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003563 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003564 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003565 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003566 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003567 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003568 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003569 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003570 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003571 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003572 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
solenberg2779bab2016-11-17 04:45:19 -08003573 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3574 cricket::AudioCodec(96, "telephone-event", 16000, 0, 1), nullptr));
3575 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3576 cricket::AudioCodec(96, "telephone-event", 32000, 0, 1), nullptr));
3577 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3578 cricket::AudioCodec(96, "telephone-event", 48000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003579 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003580 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003581 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003582 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003583 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003584 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003585 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003586 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003587 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003588 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003589 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003590 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003591 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003592 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003593 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003594 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003595 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003596 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003597 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003598 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003599 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003600 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003601 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003602
stefan658910c2015-09-03 05:48:32 -07003603 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossuc54071d2016-08-17 02:45:41 -07003604 // TODO(ossu): Why are the payload types of codecs with non-static payload
3605 // type assignments checked here? It shouldn't really matter.
3606 cricket::WebRtcVoiceEngine engine(
gyzhou95aa9642016-12-13 14:06:26 -08003607 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr);
solenberg2779bab2016-11-17 04:45:19 -08003608 for (const cricket::AudioCodec& codec : engine.send_codecs()) {
3609 if (codec.name == "CN" && codec.clockrate == 16000) {
3610 EXPECT_EQ(105, codec.id);
3611 } else if (codec.name == "CN" && codec.clockrate == 32000) {
3612 EXPECT_EQ(106, codec.id);
3613 } else if (codec.name == "ISAC" && codec.clockrate == 16000) {
3614 EXPECT_EQ(103, codec.id);
3615 } else if (codec.name == "ISAC" && codec.clockrate == 32000) {
3616 EXPECT_EQ(104, codec.id);
3617 } else if (codec.name == "G722" && codec.clockrate == 8000) {
3618 EXPECT_EQ(9, codec.id);
3619 } else if (codec.name == "telephone-event" && codec.clockrate == 8000) {
3620 EXPECT_EQ(126, codec.id);
3621 // TODO(solenberg): 16k, 32k, 48k DTMF should be dynamically assigned.
3622 // Remove these checks once both send and receive side assigns payload types
3623 // dynamically.
3624 } else if (codec.name == "telephone-event" && codec.clockrate == 16000) {
3625 EXPECT_EQ(113, codec.id);
3626 } else if (codec.name == "telephone-event" && codec.clockrate == 32000) {
3627 EXPECT_EQ(112, codec.id);
3628 } else if (codec.name == "telephone-event" && codec.clockrate == 48000) {
3629 EXPECT_EQ(110, codec.id);
3630 } else if (codec.name == "opus") {
3631 EXPECT_EQ(111, codec.id);
3632 ASSERT_TRUE(codec.params.find("minptime") != codec.params.end());
3633 EXPECT_EQ("10", codec.params.find("minptime")->second);
3634 ASSERT_TRUE(codec.params.find("useinbandfec") != codec.params.end());
3635 EXPECT_EQ("1", codec.params.find("useinbandfec")->second);
stefan658910c2015-09-03 05:48:32 -07003636 }
3637 }
stefan658910c2015-09-03 05:48:32 -07003638}
3639
3640// Tests that VoE supports at least 32 channels
3641TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossuc54071d2016-08-17 02:45:41 -07003642 cricket::WebRtcVoiceEngine engine(
gyzhou95aa9642016-12-13 14:06:26 -08003643 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr);
skvlad11a9cbf2016-10-07 11:53:05 -07003644 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003645 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003646 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
stefan658910c2015-09-03 05:48:32 -07003647
3648 cricket::VoiceMediaChannel* channels[32];
3649 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003650 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003651 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3652 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003653 if (!channel)
3654 break;
stefan658910c2015-09-03 05:48:32 -07003655 channels[num_channels++] = channel;
3656 }
3657
tfarina5237aaf2015-11-10 23:44:30 -08003658 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003659 EXPECT_EQ(expected, num_channels);
3660
3661 while (num_channels > 0) {
3662 delete channels[--num_channels];
3663 }
stefan658910c2015-09-03 05:48:32 -07003664}
3665
3666// Test that we set our preferred codecs properly.
3667TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003668 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3669 // - Check that our builtin codecs are usable by Channel.
3670 // - The codecs provided by the engine is usable by Channel.
3671 // It does not check that the codecs in the RecvParameters are actually
3672 // what we sent in - though it's probably reasonable to expect so, if
3673 // SetRecvParameters returns true.
3674 // I think it will become clear once audio decoder injection is completed.
3675 cricket::WebRtcVoiceEngine engine(
gyzhou95aa9642016-12-13 14:06:26 -08003676 nullptr, webrtc::CreateBuiltinAudioDecoderFactory(), nullptr);
skvlad11a9cbf2016-10-07 11:53:05 -07003677 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003678 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003679 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003680 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3681 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003682 cricket::AudioRecvParameters parameters;
ossudedfd282016-06-14 07:12:39 -07003683 parameters.codecs = engine.recv_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003684 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003685}