blob: 0cfbeab42beeb0473a3b5fae3daf066a76749ca2 [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2008 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00003 *
kjellander1afca732016-02-07 20:46:45 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
kwiberg686a8ef2016-02-26 03:00:35 -080011#include <memory>
12
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010013#include "webrtc/pc/channel.h"
tfarina5237aaf2015-11-10 23:44:30 -080014#include "webrtc/base/arraysize.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000015#include "webrtc/base/byteorder.h"
16#include "webrtc/base/gunit.h"
ossuf515ab82016-12-07 04:52:58 -080017#include "webrtc/call/call.h"
stefanba4c0e42016-02-04 04:12:24 -080018#include "webrtc/p2p/base/faketransportcontroller.h"
19#include "webrtc/test/field_trial.h"
skvlad11a9cbf2016-10-07 11:53:05 -070020#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
kjellandera96e2d72016-02-04 23:52:28 -080021#include "webrtc/media/base/fakemediaengine.h"
22#include "webrtc/media/base/fakenetworkinterface.h"
23#include "webrtc/media/base/fakertp.h"
kjellanderf4752772016-03-02 05:42:30 -080024#include "webrtc/media/base/mediaconstants.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010025#include "webrtc/media/engine/fakewebrtccall.h"
26#include "webrtc/media/engine/fakewebrtcvoiceengine.h"
27#include "webrtc/media/engine/webrtcvoiceengine.h"
ossu29b1a8d2016-06-13 07:34:51 -070028#include "webrtc/modules/audio_coding/codecs/builtin_audio_decoder_factory.h"
29#include "webrtc/modules/audio_coding/codecs/mock/mock_audio_decoder_factory.h"
solenbergbc37fc82016-04-04 09:54:44 -070030#include "webrtc/modules/audio_device/include/mock_audio_device.h"
solenberg059fb442016-10-26 05:12:24 -070031#include "webrtc/modules/audio_processing/include/mock_audio_processing.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032
solenbergbc37fc82016-04-04 09:54:44 -070033using testing::Return;
34using testing::StrictMock;
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000035
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020036namespace {
37
deadbeef67cf2c12016-04-13 10:07:16 -070038const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1);
39const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1);
40const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2);
41const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1);
42const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1);
deadbeef67cf2c12016-04-13 10:07:16 -070043const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1);
44const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1);
solenberg2779bab2016-11-17 04:45:19 -080045const cricket::AudioCodec
46 kTelephoneEventCodec1(106, "telephone-event", 8000, 0, 1);
47const cricket::AudioCodec
48 kTelephoneEventCodec2(107, "telephone-event", 32000, 0, 1);
49
solenberg85a04962015-10-27 03:35:21 -070050const uint32_t kSsrc1 = 0x99;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080051const uint32_t kSsrc2 = 2;
52const uint32_t kSsrc3 = 3;
solenberg7602aab2016-11-14 11:30:07 -080053const uint32_t kSsrc4 = 0x42;
solenberg85a04962015-10-27 03:35:21 -070054const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000055
solenberg971cab02016-06-14 10:02:41 -070056constexpr int kRtpHistoryMs = 5000;
57
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058class FakeVoEWrapper : public cricket::VoEWrapper {
59 public:
60 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
61 : cricket::VoEWrapper(engine, // processing
62 engine, // base
63 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000065 engine) { // volume
66 }
67};
skvlad11a9cbf2016-10-07 11:53:05 -070068
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020069} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000070
solenbergff976312016-03-30 23:28:51 -070071// Tests that our stub library "works".
72TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070073 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
74 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
75 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -070076 EXPECT_CALL(adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
77 EXPECT_CALL(adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
78 EXPECT_CALL(adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenberg059fb442016-10-26 05:12:24 -070079 StrictMock<webrtc::test::MockAudioProcessing> apm;
80 EXPECT_CALL(apm, ApplyConfig(testing::_));
81 EXPECT_CALL(apm, SetExtraOptions(testing::_));
82 EXPECT_CALL(apm, Initialize()).WillOnce(Return(0));
83 cricket::FakeWebRtcVoiceEngine voe(&apm);
solenbergff976312016-03-30 23:28:51 -070084 EXPECT_FALSE(voe.IsInited());
85 {
ossuc54071d2016-08-17 02:45:41 -070086 cricket::WebRtcVoiceEngine engine(
gyzhou95aa9642016-12-13 14:06:26 -080087 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr,
ossuc54071d2016-08-17 02:45:41 -070088 new FakeVoEWrapper(&voe));
solenbergff976312016-03-30 23:28:51 -070089 EXPECT_TRUE(voe.IsInited());
90 }
91 EXPECT_FALSE(voe.IsInited());
92}
93
deadbeef884f5852016-01-15 09:20:04 -080094class FakeAudioSink : public webrtc::AudioSinkInterface {
95 public:
96 void OnData(const Data& audio) override {}
97};
98
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080099class FakeAudioSource : public cricket::AudioSource {
100 void SetSink(Sink* sink) override {}
101};
102
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000103class WebRtcVoiceEngineTestFake : public testing::Test {
104 public:
stefanba4c0e42016-02-04 04:12:24 -0800105 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
106
107 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
solenberg059fb442016-10-26 05:12:24 -0700108 : call_(webrtc::Call::Config(&event_log_)), voe_(&apm_),
skvlad11a9cbf2016-10-07 11:53:05 -0700109 override_field_trials_(field_trials) {
ossuc54071d2016-08-17 02:45:41 -0700110 auto factory = webrtc::MockAudioDecoderFactory::CreateUnusedFactory();
solenbergbc37fc82016-04-04 09:54:44 -0700111 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
112 EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
solenberg5b5129a2016-04-08 05:35:48 -0700113 EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false));
114 EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false));
115 EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false));
solenberg059fb442016-10-26 05:12:24 -0700116 EXPECT_CALL(apm_, ApplyConfig(testing::_));
117 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
118 EXPECT_CALL(apm_, Initialize()).WillOnce(Return(0));
gyzhou95aa9642016-12-13 14:06:26 -0800119 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, factory, nullptr,
solenbergbc37fc82016-04-04 09:54:44 -0700120 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200121 send_parameters_.codecs.push_back(kPcmuCodec);
122 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000123 }
solenberg8189b022016-06-14 12:13:00 -0700124
solenbergff976312016-03-30 23:28:51 -0700125 bool SetupChannel() {
solenberg059fb442016-10-26 05:12:24 -0700126 EXPECT_CALL(apm_, ApplyConfig(testing::_));
127 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
solenbergbc37fc82016-04-04 09:54:44 -0700128 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
129 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200130 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000131 }
solenberg8189b022016-06-14 12:13:00 -0700132
solenbergff976312016-03-30 23:28:51 -0700133 bool SetupRecvStream() {
134 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700135 return false;
136 }
solenberg8189b022016-06-14 12:13:00 -0700137 return AddRecvStream(kSsrc1);
solenberg1ac56142015-10-13 03:58:19 -0700138 }
solenberg8189b022016-06-14 12:13:00 -0700139
solenbergff976312016-03-30 23:28:51 -0700140 bool SetupSendStream() {
141 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000142 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000143 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800144 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
145 return false;
146 }
solenberg059fb442016-10-26 05:12:24 -0700147 EXPECT_CALL(apm_, set_output_will_be_muted(false));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800148 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000149 }
solenberg8189b022016-06-14 12:13:00 -0700150
151 bool AddRecvStream(uint32_t ssrc) {
152 EXPECT_TRUE(channel_);
153 return channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(ssrc));
154 }
155
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000156 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700157 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700158 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800159 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700160 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700161 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800162 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000163 }
solenberg8189b022016-06-14 12:13:00 -0700164
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000165 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700166 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000167 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000168 }
solenberg8189b022016-06-14 12:13:00 -0700169
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200170 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000171 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000172 }
173
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100174 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
175 const auto* send_stream = call_.GetAudioSendStream(ssrc);
176 EXPECT_TRUE(send_stream);
177 return *send_stream;
178 }
179
deadbeef884f5852016-01-15 09:20:04 -0800180 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
181 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
182 EXPECT_TRUE(recv_stream);
183 return *recv_stream;
184 }
185
solenberg3a941542015-11-16 07:34:50 -0800186 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800187 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800188 }
189
solenberg7add0582015-11-20 09:59:34 -0800190 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800191 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800192 }
193
solenberg059fb442016-10-26 05:12:24 -0700194 void SetSend(bool enable) {
195 ASSERT_TRUE(channel_);
solenbergd53a3f92016-04-14 13:56:37 -0700196 if (enable) {
197 EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false));
198 EXPECT_CALL(adm_, Recording()).WillOnce(Return(false));
199 EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0));
solenberg059fb442016-10-26 05:12:24 -0700200 EXPECT_CALL(apm_, ApplyConfig(testing::_));
201 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
solenbergd53a3f92016-04-14 13:56:37 -0700202 }
solenberg059fb442016-10-26 05:12:24 -0700203 channel_->SetSend(enable);
204 }
205
206 void SetSendParameters(const cricket::AudioSendParameters& params) {
207 EXPECT_CALL(apm_, ApplyConfig(testing::_));
208 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
209 ASSERT_TRUE(channel_);
210 EXPECT_TRUE(channel_->SetSendParameters(params));
211 }
212
minyue6b825df2016-10-31 04:08:32 -0700213 void SetAudioSend(uint32_t ssrc, bool enable, cricket::AudioSource* source,
214 const cricket::AudioOptions* options = nullptr) {
solenberg059fb442016-10-26 05:12:24 -0700215 EXPECT_CALL(apm_, set_output_will_be_muted(!enable));
216 ASSERT_TRUE(channel_);
minyue6b825df2016-10-31 04:08:32 -0700217 if (enable && options) {
218 EXPECT_CALL(apm_, ApplyConfig(testing::_));
219 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
220 }
221 EXPECT_TRUE(channel_->SetAudioSend(ssrc, enable, options, source));
solenbergd53a3f92016-04-14 13:56:37 -0700222 }
223
solenbergffbbcac2016-11-17 05:25:37 -0800224 void TestInsertDtmf(uint32_t ssrc, bool caller,
225 const cricket::AudioCodec& codec) {
solenbergff976312016-03-30 23:28:51 -0700226 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000227 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700228 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000229 // send stream.
230 EXPECT_TRUE(channel_->AddSendStream(
231 cricket::StreamParams::CreateLegacy(kSsrc1)));
232 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000233
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000234 // Test we can only InsertDtmf when the other side supports telephone-event.
solenberg059fb442016-10-26 05:12:24 -0700235 SetSendParameters(send_parameters_);
236 SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000237 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800238 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
solenbergffbbcac2016-11-17 05:25:37 -0800239 send_parameters_.codecs.push_back(codec);
solenberg059fb442016-10-26 05:12:24 -0700240 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000241 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000242
243 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700244 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800245 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000246 EXPECT_TRUE(channel_->AddSendStream(
247 cricket::StreamParams::CreateLegacy(kSsrc1)));
248 }
249
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000250 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800251 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000252
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100253 // Test send.
254 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
255 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
256 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800257 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100258 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
solenbergffbbcac2016-11-17 05:25:37 -0800259 EXPECT_EQ(codec.id, telephone_event.payload_type);
260 EXPECT_EQ(codec.clockrate, telephone_event.payload_frequency);
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100261 EXPECT_EQ(2, telephone_event.event_code);
262 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000263 }
264
265 // Test that send bandwidth is set correctly.
266 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000267 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
268 // |expected_result| is the expected result from SetMaxSendBandwidth().
269 // |expected_bitrate| is the expected audio bitrate afterward.
deadbeef80346142016-04-27 14:17:10 -0700270 void TestMaxSendBandwidth(const cricket::AudioCodec& codec,
271 int max_bitrate,
272 bool expected_result,
273 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200274 cricket::AudioSendParameters parameters;
275 parameters.codecs.push_back(codec);
276 parameters.max_bandwidth_bps = max_bitrate;
solenberg059fb442016-10-26 05:12:24 -0700277 if (expected_result) {
278 SetSendParameters(parameters);
279 } else {
280 EXPECT_FALSE(channel_->SetSendParameters(parameters));
281 }
minyue7a973442016-10-20 03:27:12 -0700282 EXPECT_EQ(expected_bitrate, GetCodecBitrate(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000283 }
284
skvlade0d46372016-04-07 22:59:22 -0700285 // Sets the per-stream maximum bitrate limit for the specified SSRC.
286 bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700287 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(ssrc);
skvlade0d46372016-04-07 22:59:22 -0700288 EXPECT_EQ(1UL, parameters.encodings.size());
289
290 parameters.encodings[0].max_bitrate_bps = bitrate;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700291 return channel_->SetRtpSendParameters(ssrc, parameters);
skvlade0d46372016-04-07 22:59:22 -0700292 }
293
solenberg059fb442016-10-26 05:12:24 -0700294 void SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
skvlade0d46372016-04-07 22:59:22 -0700295 cricket::AudioSendParameters send_parameters;
296 send_parameters.codecs.push_back(codec);
297 send_parameters.max_bandwidth_bps = bitrate;
solenberg059fb442016-10-26 05:12:24 -0700298 SetSendParameters(send_parameters);
skvlade0d46372016-04-07 22:59:22 -0700299 }
300
minyue7a973442016-10-20 03:27:12 -0700301 void CheckSendCodec(int32_t ssrc,
302 const char expected_name[],
303 int expected_channels,
304 int expected_bitrate) {
305 const auto& codec = GetSendStreamConfig(ssrc).send_codec_spec.codec_inst;
306 EXPECT_STREQ(expected_name, codec.plname);
307 EXPECT_EQ(expected_channels, codec.channels);
308 EXPECT_EQ(expected_bitrate, codec.rate);
309 }
310
311 int GetOpusMaxPlaybackRate(int32_t ssrc) {
312 return GetSendStreamConfig(ssrc).send_codec_spec.opus_max_playback_rate;
313 }
314
315 bool GetOpusDtx(int32_t ssrc) {
316 return GetSendStreamConfig(ssrc).send_codec_spec.enable_opus_dtx;
317 }
318
319 bool GetCodecFec(int32_t ssrc) {
320 return GetSendStreamConfig(ssrc).send_codec_spec.enable_codec_fec;
321 }
322
skvlade0d46372016-04-07 22:59:22 -0700323 int GetCodecBitrate(int32_t ssrc) {
minyue7a973442016-10-20 03:27:12 -0700324 return GetSendStreamConfig(ssrc).send_codec_spec.codec_inst.rate;
325 }
326
327 int GetCodecPacSize(int32_t ssrc) {
328 return GetSendStreamConfig(ssrc).send_codec_spec.codec_inst.pacsize;
skvlade0d46372016-04-07 22:59:22 -0700329 }
330
minyue6b825df2016-10-31 04:08:32 -0700331 const rtc::Optional<std::string>& GetAudioNetworkAdaptorConfig(int32_t ssrc) {
332 return GetSendStreamConfig(ssrc).audio_network_adaptor_config;
333 }
334
skvlade0d46372016-04-07 22:59:22 -0700335 void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
336 int global_max,
337 int stream_max,
338 bool expected_result,
339 int expected_codec_bitrate) {
340 // Clear the bitrate limit from the previous test case.
341 EXPECT_TRUE(SetMaxBitrateForStream(kSsrc1, -1));
342
343 // Attempt to set the requested bitrate limits.
solenberg059fb442016-10-26 05:12:24 -0700344 SetGlobalMaxBitrate(codec, global_max);
skvlade0d46372016-04-07 22:59:22 -0700345 EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrc1, stream_max));
346
347 // Verify that reading back the parameters gives results
348 // consistent with the Set() result.
349 webrtc::RtpParameters resulting_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700350 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -0700351 EXPECT_EQ(1UL, resulting_parameters.encodings.size());
352 EXPECT_EQ(expected_result ? stream_max : -1,
353 resulting_parameters.encodings[0].max_bitrate_bps);
354
355 // Verify that the codec settings have the expected bitrate.
356 EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrc1));
357 }
358
stefan13f1a0a2016-11-30 07:22:58 -0800359 void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate_kbps,
360 int expected_min_bitrate_bps,
361 const char* start_bitrate_kbps,
362 int expected_start_bitrate_bps,
363 const char* max_bitrate_kbps,
364 int expected_max_bitrate_bps) {
365 EXPECT_TRUE(SetupSendStream());
366 auto& codecs = send_parameters_.codecs;
367 codecs.clear();
368 codecs.push_back(kOpusCodec);
369 codecs[0].params[cricket::kCodecParamMinBitrate] = min_bitrate_kbps;
370 codecs[0].params[cricket::kCodecParamStartBitrate] = start_bitrate_kbps;
371 codecs[0].params[cricket::kCodecParamMaxBitrate] = max_bitrate_kbps;
372 SetSendParameters(send_parameters_);
373
374 EXPECT_EQ(expected_min_bitrate_bps,
375 call_.GetConfig().bitrate_config.min_bitrate_bps);
376 EXPECT_EQ(expected_start_bitrate_bps,
377 call_.GetConfig().bitrate_config.start_bitrate_bps);
378 EXPECT_EQ(expected_max_bitrate_bps,
379 call_.GetConfig().bitrate_config.max_bitrate_bps);
380 }
381
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000382 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700383 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000384
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000385 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800386 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000387
388 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700389 send_parameters_.extensions.push_back(
390 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg059fb442016-10-26 05:12:24 -0700391 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800392 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000393
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000394 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200395 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -0700396 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800397 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000398
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000399 // Ensure extension is set properly.
400 const int id = 1;
isheriff6f8d6862016-05-26 11:24:55 -0700401 send_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg059fb442016-10-26 05:12:24 -0700402 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800403 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700404 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800405 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000406
solenberg7add0582015-11-20 09:59:34 -0800407 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000408 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700409 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800410 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
411 call_.GetAudioSendStream(kSsrc2));
412 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700413 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg3a941542015-11-16 07:34:50 -0800414 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000415
416 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200417 send_parameters_.codecs.push_back(kPcmuCodec);
418 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -0700419 SetSendParameters(send_parameters_);
solenberg3a941542015-11-16 07:34:50 -0800420 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
421 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000422 }
423
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000424 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700425 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000426
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000427 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800428 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000429
430 // Ensure unknown extensions won't cause an error.
isheriff6f8d6862016-05-26 11:24:55 -0700431 recv_parameters_.extensions.push_back(
432 webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800433 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
434 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000435
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000436 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800437 recv_parameters_.extensions.clear();
438 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
439 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000440
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000441 // Ensure extension is set properly.
442 const int id = 2;
isheriff6f8d6862016-05-26 11:24:55 -0700443 recv_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
solenberg7add0582015-11-20 09:59:34 -0800444 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
445 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700446 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800447 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000448
solenberg7add0582015-11-20 09:59:34 -0800449 // Ensure extension is set properly on new stream.
solenberg8189b022016-06-14 12:13:00 -0700450 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -0800451 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
452 call_.GetAudioReceiveStream(kSsrc2));
453 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
isheriff6f8d6862016-05-26 11:24:55 -0700454 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].uri);
solenberg7add0582015-11-20 09:59:34 -0800455 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000456
457 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800458 recv_parameters_.extensions.clear();
459 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
460 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
461 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000462 }
463
solenberg85a04962015-10-27 03:35:21 -0700464 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
465 webrtc::AudioSendStream::Stats stats;
466 stats.local_ssrc = 12;
467 stats.bytes_sent = 345;
468 stats.packets_sent = 678;
469 stats.packets_lost = 9012;
470 stats.fraction_lost = 34.56f;
471 stats.codec_name = "codec_name_send";
hbos1acfbd22016-11-17 23:43:29 -0800472 stats.codec_payload_type = rtc::Optional<int>(42);
solenberg85a04962015-10-27 03:35:21 -0700473 stats.ext_seqnum = 789;
474 stats.jitter_ms = 12;
475 stats.rtt_ms = 345;
476 stats.audio_level = 678;
477 stats.aec_quality_min = 9.01f;
478 stats.echo_delay_median_ms = 234;
479 stats.echo_delay_std_ms = 567;
480 stats.echo_return_loss = 890;
481 stats.echo_return_loss_enhancement = 1234;
ivoc8c63a822016-10-21 04:10:03 -0700482 stats.residual_echo_likelihood = 0.432f;
solenberg85a04962015-10-27 03:35:21 -0700483 stats.typing_noise_detected = true;
484 return stats;
485 }
486 void SetAudioSendStreamStats() {
487 for (auto* s : call_.GetAudioSendStreams()) {
488 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200489 }
solenberg85a04962015-10-27 03:35:21 -0700490 }
solenberg566ef242015-11-06 15:34:49 -0800491 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
492 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700493 const auto stats = GetAudioSendStreamStats();
494 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
495 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
496 EXPECT_EQ(info.packets_sent, stats.packets_sent);
497 EXPECT_EQ(info.packets_lost, stats.packets_lost);
498 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
499 EXPECT_EQ(info.codec_name, stats.codec_name);
hbos1acfbd22016-11-17 23:43:29 -0800500 EXPECT_EQ(info.codec_payload_type, stats.codec_payload_type);
solenberg85a04962015-10-27 03:35:21 -0700501 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
502 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
503 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
504 EXPECT_EQ(info.audio_level, stats.audio_level);
505 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
506 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
507 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
508 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
509 EXPECT_EQ(info.echo_return_loss_enhancement,
510 stats.echo_return_loss_enhancement);
ivoc8c63a822016-10-21 04:10:03 -0700511 EXPECT_EQ(info.residual_echo_likelihood, stats.residual_echo_likelihood);
solenberg566ef242015-11-06 15:34:49 -0800512 EXPECT_EQ(info.typing_noise_detected,
513 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700514 }
515
516 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
517 webrtc::AudioReceiveStream::Stats stats;
518 stats.remote_ssrc = 123;
519 stats.bytes_rcvd = 456;
520 stats.packets_rcvd = 768;
521 stats.packets_lost = 101;
522 stats.fraction_lost = 23.45f;
523 stats.codec_name = "codec_name_recv";
hbos1acfbd22016-11-17 23:43:29 -0800524 stats.codec_payload_type = rtc::Optional<int>(42);
solenberg85a04962015-10-27 03:35:21 -0700525 stats.ext_seqnum = 678;
526 stats.jitter_ms = 901;
527 stats.jitter_buffer_ms = 234;
528 stats.jitter_buffer_preferred_ms = 567;
529 stats.delay_estimate_ms = 890;
530 stats.audio_level = 1234;
531 stats.expand_rate = 5.67f;
532 stats.speech_expand_rate = 8.90f;
533 stats.secondary_decoded_rate = 1.23f;
534 stats.accelerate_rate = 4.56f;
535 stats.preemptive_expand_rate = 7.89f;
536 stats.decoding_calls_to_silence_generator = 12;
537 stats.decoding_calls_to_neteq = 345;
538 stats.decoding_normal = 67890;
539 stats.decoding_plc = 1234;
540 stats.decoding_cng = 5678;
541 stats.decoding_plc_cng = 9012;
henrik.lundin63489782016-09-20 01:47:12 -0700542 stats.decoding_muted_output = 3456;
543 stats.capture_start_ntp_time_ms = 7890;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200544 return stats;
545 }
546 void SetAudioReceiveStreamStats() {
547 for (auto* s : call_.GetAudioReceiveStreams()) {
548 s->SetStats(GetAudioReceiveStreamStats());
549 }
550 }
551 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700552 const auto stats = GetAudioReceiveStreamStats();
553 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
554 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
555 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
556 EXPECT_EQ(info.packets_lost, stats.packets_lost);
557 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
558 EXPECT_EQ(info.codec_name, stats.codec_name);
hbos1acfbd22016-11-17 23:43:29 -0800559 EXPECT_EQ(info.codec_payload_type, stats.codec_payload_type);
solenberg85a04962015-10-27 03:35:21 -0700560 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
561 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
562 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200563 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700564 stats.jitter_buffer_preferred_ms);
565 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
566 EXPECT_EQ(info.audio_level, stats.audio_level);
567 EXPECT_EQ(info.expand_rate, stats.expand_rate);
568 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
569 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
570 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
571 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200572 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700573 stats.decoding_calls_to_silence_generator);
574 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
575 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
576 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
577 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
578 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
henrik.lundin63489782016-09-20 01:47:12 -0700579 EXPECT_EQ(info.decoding_muted_output, stats.decoding_muted_output);
solenberg85a04962015-10-27 03:35:21 -0700580 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200581 }
hbos1acfbd22016-11-17 23:43:29 -0800582 void VerifyVoiceSendRecvCodecs(const cricket::VoiceMediaInfo& info) const {
583 EXPECT_EQ(send_parameters_.codecs.size(), info.send_codecs.size());
584 for (const cricket::AudioCodec& codec : send_parameters_.codecs) {
585 ASSERT_EQ(info.send_codecs.count(codec.id), 1U);
586 EXPECT_EQ(info.send_codecs.find(codec.id)->second,
587 codec.ToCodecParameters());
588 }
589 EXPECT_EQ(recv_parameters_.codecs.size(), info.receive_codecs.size());
590 for (const cricket::AudioCodec& codec : recv_parameters_.codecs) {
591 ASSERT_EQ(info.receive_codecs.count(codec.id), 1U);
592 EXPECT_EQ(info.receive_codecs.find(codec.id)->second,
593 codec.ToCodecParameters());
594 }
595 }
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200596
peah8271d042016-11-22 07:24:52 -0800597 bool IsHighPassFilterEnabled() {
598 return engine_->GetApmConfigForTest().high_pass_filter.enabled;
599 }
600
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700602 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
solenberg059fb442016-10-26 05:12:24 -0700603 StrictMock<webrtc::test::MockAudioProcessing> apm_;
skvlad11a9cbf2016-10-07 11:53:05 -0700604 webrtc::RtcEventLogNullImpl event_log_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200605 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000606 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700607 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700608 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200609 cricket::AudioSendParameters send_parameters_;
610 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800611 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800612 private:
613 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000614};
615
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000616// Tests that we can create and destroy a channel.
617TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700618 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000619}
620
solenberg31fec402016-05-06 02:13:12 -0700621// Test that we can add a send stream and that it has the correct defaults.
622TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
623 EXPECT_TRUE(SetupChannel());
624 EXPECT_TRUE(
625 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
626 const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrc1);
627 EXPECT_EQ(kSsrc1, config.rtp.ssrc);
628 EXPECT_EQ("", config.rtp.c_name);
629 EXPECT_EQ(0u, config.rtp.extensions.size());
630 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
631 config.send_transport);
632}
633
634// Test that we can add a receive stream and that it has the correct defaults.
635TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
636 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -0700637 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg31fec402016-05-06 02:13:12 -0700638 const webrtc::AudioReceiveStream::Config& config =
639 GetRecvStreamConfig(kSsrc1);
640 EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
641 EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
642 EXPECT_FALSE(config.rtp.transport_cc);
643 EXPECT_EQ(0u, config.rtp.extensions.size());
644 EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
645 config.rtcp_send_transport);
646 EXPECT_EQ("", config.sync_group);
647}
648
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000649// Tests that the list of supported codecs is created properly and ordered
deadbeef67cf2c12016-04-13 10:07:16 -0700650// correctly (such that opus appears first).
ossudedfd282016-06-14 07:12:39 -0700651// TODO(ossu): This test should move into a separate builtin audio codecs
652// module.
deadbeef67cf2c12016-04-13 10:07:16 -0700653TEST_F(WebRtcVoiceEngineTestFake, CodecOrder) {
ossudedfd282016-06-14 07:12:39 -0700654 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000655 ASSERT_FALSE(codecs.empty());
656 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
657 EXPECT_EQ(48000, codecs[0].clockrate);
658 EXPECT_EQ(2, codecs[0].channels);
659 EXPECT_EQ(64000, codecs[0].bitrate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000660}
661
stefanba4c0e42016-02-04 04:12:24 -0800662TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
ossudedfd282016-06-14 07:12:39 -0700663 const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
stefanba4c0e42016-02-04 04:12:24 -0800664 bool opus_found = false;
665 for (cricket::AudioCodec codec : codecs) {
666 if (codec.name == "opus") {
667 EXPECT_TRUE(HasTransportCc(codec));
668 opus_found = true;
669 }
670 }
671 EXPECT_TRUE(opus_found);
672}
673
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000674// Tests that we can find codecs by name or id, and that we interpret the
675// clockrate and bitrate fields properly.
676TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
677 cricket::AudioCodec codec;
678 webrtc::CodecInst codec_inst;
679 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800680 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000681 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800682 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000683 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg2779bab2016-11-17 04:45:19 -0800684 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec1,
685 &codec_inst));
686 // Find telephone-event with explicit clockrate and 0 bitrate.
687 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec2,
solenberg26c8c912015-11-27 04:00:25 -0800688 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000689 // Find ISAC with a different payload id.
690 codec = kIsacCodec;
691 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800692 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000693 EXPECT_EQ(codec.id, codec_inst.pltype);
694 // Find PCMU with a 0 clockrate.
695 codec = kPcmuCodec;
696 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800697 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000698 EXPECT_EQ(codec.id, codec_inst.pltype);
699 EXPECT_EQ(8000, codec_inst.plfreq);
700 // Find PCMU with a 0 bitrate.
701 codec = kPcmuCodec;
702 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800703 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000704 EXPECT_EQ(codec.id, codec_inst.pltype);
705 EXPECT_EQ(64000, codec_inst.rate);
706 // Find ISAC with an explicit bitrate.
707 codec = kIsacCodec;
708 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800709 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000710 EXPECT_EQ(codec.id, codec_inst.pltype);
711 EXPECT_EQ(32000, codec_inst.rate);
712}
713
714// Test that we set our inbound codecs properly, including changing PT.
715TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700716 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200717 cricket::AudioRecvParameters parameters;
718 parameters.codecs.push_back(kIsacCodec);
719 parameters.codecs.push_back(kPcmuCodec);
solenberg2779bab2016-11-17 04:45:19 -0800720 parameters.codecs.push_back(kTelephoneEventCodec1);
721 parameters.codecs.push_back(kTelephoneEventCodec2);
722 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200723 parameters.codecs[2].id = 126;
724 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700725 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700726 int channel_num = voe_.GetLastChannel();
solenberg2779bab2016-11-17 04:45:19 -0800727
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000728 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800729 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000730 gcodec.plfreq = 16000;
731 gcodec.channels = 1;
732 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
733 EXPECT_EQ(106, gcodec.pltype);
734 EXPECT_STREQ("ISAC", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800735
tfarina5237aaf2015-11-10 23:44:30 -0800736 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000737 gcodec.plfreq = 8000;
738 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
739 EXPECT_EQ(126, gcodec.pltype);
740 EXPECT_STREQ("telephone-event", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800741
742 gcodec.plfreq = 32000;
743 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
744 EXPECT_EQ(107, gcodec.pltype);
745 EXPECT_STREQ("telephone-event", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000746}
747
748// Test that we fail to set an unknown inbound codec.
749TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700750 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200751 cricket::AudioRecvParameters parameters;
752 parameters.codecs.push_back(kIsacCodec);
deadbeef67cf2c12016-04-13 10:07:16 -0700753 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200754 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000755}
756
757// Test that we fail if we have duplicate types in the inbound list.
758TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700759 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200760 cricket::AudioRecvParameters parameters;
761 parameters.codecs.push_back(kIsacCodec);
762 parameters.codecs.push_back(kCn16000Codec);
763 parameters.codecs[1].id = kIsacCodec.id;
764 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000765}
766
767// Test that we can decode OPUS without stereo parameters.
768TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700769 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200770 cricket::AudioRecvParameters parameters;
771 parameters.codecs.push_back(kIsacCodec);
772 parameters.codecs.push_back(kPcmuCodec);
773 parameters.codecs.push_back(kOpusCodec);
774 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700775 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -0700776 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000777 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800778 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000779 // Even without stereo parameters, recv codecs still specify channels = 2.
780 EXPECT_EQ(2, opus.channels);
781 EXPECT_EQ(111, opus.pltype);
782 EXPECT_STREQ("opus", opus.plname);
783 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700784 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000785 EXPECT_EQ(111, opus.pltype);
786}
787
788// Test that we can decode OPUS with stereo = 0.
789TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700790 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200791 cricket::AudioRecvParameters parameters;
792 parameters.codecs.push_back(kIsacCodec);
793 parameters.codecs.push_back(kPcmuCodec);
794 parameters.codecs.push_back(kOpusCodec);
795 parameters.codecs[2].params["stereo"] = "0";
796 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700797 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000798 int channel_num2 = voe_.GetLastChannel();
799 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800800 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000801 // Even when stereo is off, recv codecs still specify channels = 2.
802 EXPECT_EQ(2, opus.channels);
803 EXPECT_EQ(111, opus.pltype);
804 EXPECT_STREQ("opus", opus.plname);
805 opus.pltype = 0;
806 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
807 EXPECT_EQ(111, opus.pltype);
808}
809
810// Test that we can decode OPUS with stereo = 1.
811TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700812 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200813 cricket::AudioRecvParameters parameters;
814 parameters.codecs.push_back(kIsacCodec);
815 parameters.codecs.push_back(kPcmuCodec);
816 parameters.codecs.push_back(kOpusCodec);
817 parameters.codecs[2].params["stereo"] = "1";
818 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700819 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000820 int channel_num2 = voe_.GetLastChannel();
821 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800822 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000823 EXPECT_EQ(2, opus.channels);
824 EXPECT_EQ(111, opus.pltype);
825 EXPECT_STREQ("opus", opus.plname);
826 opus.pltype = 0;
827 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
828 EXPECT_EQ(111, opus.pltype);
829}
830
831// Test that changes to recv codecs are applied to all streams.
832TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700833 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200834 cricket::AudioRecvParameters parameters;
835 parameters.codecs.push_back(kIsacCodec);
836 parameters.codecs.push_back(kPcmuCodec);
solenberg2779bab2016-11-17 04:45:19 -0800837 parameters.codecs.push_back(kTelephoneEventCodec1);
838 parameters.codecs.push_back(kTelephoneEventCodec2);
839 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200840 parameters.codecs[2].id = 126;
841 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -0700842 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000843 int channel_num2 = voe_.GetLastChannel();
solenberg2779bab2016-11-17 04:45:19 -0800844
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000845 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800846 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000847 gcodec.plfreq = 16000;
848 gcodec.channels = 1;
849 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
850 EXPECT_EQ(106, gcodec.pltype);
851 EXPECT_STREQ("ISAC", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800852
tfarina5237aaf2015-11-10 23:44:30 -0800853 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000854 gcodec.plfreq = 8000;
855 gcodec.channels = 1;
856 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
857 EXPECT_EQ(126, gcodec.pltype);
858 EXPECT_STREQ("telephone-event", gcodec.plname);
solenberg2779bab2016-11-17 04:45:19 -0800859
860 gcodec.plfreq = 32000;
861 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
862 EXPECT_EQ(107, gcodec.pltype);
863 EXPECT_STREQ("telephone-event", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000864}
865
866TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700867 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200868 cricket::AudioRecvParameters parameters;
869 parameters.codecs.push_back(kIsacCodec);
solenberg2779bab2016-11-17 04:45:19 -0800870 parameters.codecs[0].id = 106; // collide with existing CN 32k
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200871 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000872
873 int channel_num2 = voe_.GetLastChannel();
874 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800875 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000876 gcodec.plfreq = 16000;
877 gcodec.channels = 1;
878 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
879 EXPECT_EQ(106, gcodec.pltype);
880 EXPECT_STREQ("ISAC", gcodec.plname);
881}
882
883// Test that we can apply the same set of codecs again while playing.
884TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700885 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200886 cricket::AudioRecvParameters parameters;
887 parameters.codecs.push_back(kIsacCodec);
888 parameters.codecs.push_back(kCn16000Codec);
889 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700890 channel_->SetPlayout(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200891 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000892
893 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200894 parameters.codecs[0].id = 127;
895 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700896 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000897}
898
899// Test that we can add a codec while playing.
900TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700901 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200902 cricket::AudioRecvParameters parameters;
903 parameters.codecs.push_back(kIsacCodec);
904 parameters.codecs.push_back(kCn16000Codec);
905 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700906 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000907
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200908 parameters.codecs.push_back(kOpusCodec);
909 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
aleloi84ef6152016-08-04 05:28:21 -0700910 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000911 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800912 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000913 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
914}
915
916TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700917 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000918
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000919 // Test that when autobw is enabled, bitrate is kept as the default
920 // value. autobw is enabled for the following tests because the target
921 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000922
923 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700924 TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000925
926 // PCMU, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700927 TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000928
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000929 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700930 TestMaxSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000931}
932
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000933TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700934 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000935
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000936 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000937
938 // ISAC, default bitrate == 32000.
deadbeef80346142016-04-27 14:17:10 -0700939 TestMaxSendBandwidth(kIsacCodec, 40000, true, 40000);
940 TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
941 // Rates above the max (56000) should be capped.
942 TestMaxSendBandwidth(kIsacCodec, 100000, true, 56000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000943
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000944 // opus, default bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700945 TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
946 TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
947 // Rates above the max (510000) should be capped.
948 TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000949}
950
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000951TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700952 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000953
954 // Test that we can only set a maximum bitrate for a fixed-rate codec
955 // if it's bigger than the fixed rate.
956
957 // PCMU, fixed bitrate == 64000.
deadbeef80346142016-04-27 14:17:10 -0700958 TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
959 TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
960 TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
961 TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
962 TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
963 TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
964 TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000965}
966
967TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700968 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200969 const int kDesiredBitrate = 128000;
970 cricket::AudioSendParameters parameters;
ossudedfd282016-06-14 07:12:39 -0700971 parameters.codecs = engine_->send_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200972 parameters.max_bandwidth_bps = kDesiredBitrate;
solenberg059fb442016-10-26 05:12:24 -0700973 SetSendParameters(parameters);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000974
975 EXPECT_TRUE(channel_->AddSendStream(
976 cricket::StreamParams::CreateLegacy(kSsrc1)));
977
minyue7a973442016-10-20 03:27:12 -0700978 EXPECT_EQ(kDesiredBitrate, GetCodecBitrate(kSsrc1));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000979}
980
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000981// Test that bitrate cannot be set for CBR codecs.
982// Bitrate is ignored if it is higher than the fixed bitrate.
983// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000984TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700985 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000986
987 // PCMU, default bitrate == 64000.
solenberg059fb442016-10-26 05:12:24 -0700988 SetSendParameters(send_parameters_);
minyue7a973442016-10-20 03:27:12 -0700989 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200990
991 send_parameters_.max_bandwidth_bps = 128000;
solenberg059fb442016-10-26 05:12:24 -0700992 SetSendParameters(send_parameters_);
minyue7a973442016-10-20 03:27:12 -0700993 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200994
995 send_parameters_.max_bandwidth_bps = 128;
996 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
minyue7a973442016-10-20 03:27:12 -0700997 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000998}
999
skvlade0d46372016-04-07 22:59:22 -07001000// Test that the per-stream bitrate limit and the global
1001// bitrate limit both apply.
1002TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
1003 EXPECT_TRUE(SetupSendStream());
1004
1005 // opus, default bitrate == 64000.
1006 SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 64000);
1007 SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
1008 SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
1009 SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
1010
1011 // CBR codecs allow both maximums to exceed the bitrate.
1012 SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
1013 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
1014 SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
1015 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
1016
1017 // CBR codecs don't allow per stream maximums to be too low.
1018 SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
1019 SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
1020}
1021
1022// Test that an attempt to set RtpParameters for a stream that does not exist
1023// fails.
1024TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
1025 EXPECT_TRUE(SetupChannel());
1026 webrtc::RtpParameters nonexistent_parameters =
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001027 channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -07001028 EXPECT_EQ(0, nonexistent_parameters.encodings.size());
1029
1030 nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001031 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, nonexistent_parameters));
skvlade0d46372016-04-07 22:59:22 -07001032}
1033
1034TEST_F(WebRtcVoiceEngineTestFake,
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001035 CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
skvlade0d46372016-04-07 22:59:22 -07001036 // This test verifies that setting RtpParameters succeeds only if
1037 // the structure contains exactly one encoding.
1038 // TODO(skvlad): Update this test when we start supporting setting parameters
1039 // for each encoding individually.
1040
1041 EXPECT_TRUE(SetupSendStream());
deadbeeffb2aced2017-01-06 23:05:37 -08001042 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
skvlade0d46372016-04-07 22:59:22 -07001043 // Two or more encodings should result in failure.
1044 parameters.encodings.push_back(webrtc::RtpEncodingParameters());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001045 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
deadbeeffb2aced2017-01-06 23:05:37 -08001046 // Zero encodings should also fail.
1047 parameters.encodings.clear();
1048 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
1049}
1050
1051// Changing the SSRC through RtpParameters is not allowed.
1052TEST_F(WebRtcVoiceEngineTestFake, CannotSetSsrcInRtpSendParameters) {
1053 EXPECT_TRUE(SetupSendStream());
1054 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
1055 parameters.encodings[0].ssrc = rtc::Optional<uint32_t>(0xdeadbeef);
1056 EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrc1, parameters));
skvlade0d46372016-04-07 22:59:22 -07001057}
1058
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001059// Test that a stream will not be sending if its encoding is made
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001060// inactive through SetRtpSendParameters.
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001061TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
1062 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07001063 SetSend(true);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001064 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
1065 // Get current parameters and change "active" to false.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001066 webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001067 ASSERT_EQ(1u, parameters.encodings.size());
1068 ASSERT_TRUE(parameters.encodings[0].active);
1069 parameters.encodings[0].active = false;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001070 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001071 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
1072
1073 // Now change it back to active and verify we resume sending.
1074 parameters.encodings[0].active = true;
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001075 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, parameters));
Taylor Brandstetter55dd7082016-05-03 13:50:11 -07001076 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
1077}
1078
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001079// Test that SetRtpSendParameters configures the correct encoding channel for
1080// each SSRC.
skvlade0d46372016-04-07 22:59:22 -07001081TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
1082 SetupForMultiSendStream();
1083 // Create send streams.
1084 for (uint32_t ssrc : kSsrcs4) {
1085 EXPECT_TRUE(
1086 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
1087 }
1088 // Configure one stream to be limited by the stream config, another to be
1089 // limited by the global max, and the third one with no per-stream limit
1090 // (still subject to the global limit).
solenberg059fb442016-10-26 05:12:24 -07001091 SetGlobalMaxBitrate(kOpusCodec, 64000);
skvlade0d46372016-04-07 22:59:22 -07001092 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 48000));
1093 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 96000));
1094 EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
1095
1096 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
1097 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[1]));
1098 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
1099
1100 // Remove the global cap; the streams should switch to their respective
1101 // maximums (or remain unchanged if there was no other limit on them.)
solenberg059fb442016-10-26 05:12:24 -07001102 SetGlobalMaxBitrate(kOpusCodec, -1);
skvlade0d46372016-04-07 22:59:22 -07001103 EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[0]));
1104 EXPECT_EQ(96000, GetCodecBitrate(kSsrcs4[1]));
1105 EXPECT_EQ(64000, GetCodecBitrate(kSsrcs4[2]));
1106}
1107
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001108// Test that GetRtpSendParameters returns the currently configured codecs.
1109TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001110 EXPECT_TRUE(SetupSendStream());
1111 cricket::AudioSendParameters parameters;
1112 parameters.codecs.push_back(kIsacCodec);
1113 parameters.codecs.push_back(kPcmuCodec);
solenberg059fb442016-10-26 05:12:24 -07001114 SetSendParameters(parameters);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001115
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001116 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001117 ASSERT_EQ(2u, rtp_parameters.codecs.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001118 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1119 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001120}
1121
deadbeefcb443432016-12-12 11:12:36 -08001122// Test that GetRtpSendParameters returns an SSRC.
1123TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersSsrc) {
1124 EXPECT_TRUE(SetupSendStream());
1125 webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrc1);
1126 ASSERT_EQ(1u, rtp_parameters.encodings.size());
1127 EXPECT_EQ(kSsrc1, rtp_parameters.encodings[0].ssrc);
1128}
1129
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001130// Test that if we set/get parameters multiple times, we get the same results.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001131TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001132 EXPECT_TRUE(SetupSendStream());
1133 cricket::AudioSendParameters parameters;
1134 parameters.codecs.push_back(kIsacCodec);
1135 parameters.codecs.push_back(kPcmuCodec);
solenberg059fb442016-10-26 05:12:24 -07001136 SetSendParameters(parameters);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001137
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001138 webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrc1);
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001139
1140 // We should be able to set the params we just got.
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001141 EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrc1, initial_params));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001142
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001143 // ... And this shouldn't change the params returned by GetRtpSendParameters.
1144 webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrc1);
1145 EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrc1));
1146}
1147
1148// Test that GetRtpReceiveParameters returns the currently configured codecs.
1149TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
1150 EXPECT_TRUE(SetupRecvStream());
1151 cricket::AudioRecvParameters parameters;
1152 parameters.codecs.push_back(kIsacCodec);
1153 parameters.codecs.push_back(kPcmuCodec);
1154 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1155
1156 webrtc::RtpParameters rtp_parameters =
1157 channel_->GetRtpReceiveParameters(kSsrc1);
1158 ASSERT_EQ(2u, rtp_parameters.codecs.size());
1159 EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
1160 EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
1161}
1162
deadbeefcb443432016-12-12 11:12:36 -08001163// Test that GetRtpReceiveParameters returns an SSRC.
1164TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersSsrc) {
1165 EXPECT_TRUE(SetupRecvStream());
1166 webrtc::RtpParameters rtp_parameters =
1167 channel_->GetRtpReceiveParameters(kSsrc1);
1168 ASSERT_EQ(1u, rtp_parameters.encodings.size());
1169 EXPECT_EQ(kSsrc1, rtp_parameters.encodings[0].ssrc);
1170}
1171
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001172// Test that if we set/get parameters multiple times, we get the same results.
1173TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
1174 EXPECT_TRUE(SetupRecvStream());
1175 cricket::AudioRecvParameters parameters;
1176 parameters.codecs.push_back(kIsacCodec);
1177 parameters.codecs.push_back(kPcmuCodec);
1178 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
1179
1180 webrtc::RtpParameters initial_params =
1181 channel_->GetRtpReceiveParameters(kSsrc1);
1182
1183 // We should be able to set the params we just got.
1184 EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrc1, initial_params));
1185
1186 // ... And this shouldn't change the params returned by
1187 // GetRtpReceiveParameters.
1188 webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrc1);
1189 EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrc1));
Taylor Brandstetter0cd086b2016-04-20 16:23:10 -07001190}
1191
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001192// Test that we apply codecs properly.
1193TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -07001194 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001195 cricket::AudioSendParameters parameters;
1196 parameters.codecs.push_back(kIsacCodec);
1197 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001198 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001199 parameters.codecs[0].id = 96;
1200 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001201 const int initial_num = call_.GetNumCreatedSendStreams();
solenberg059fb442016-10-26 05:12:24 -07001202 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001203 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
1204 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
1205 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
1206 EXPECT_EQ(48000, send_codec_spec.codec_inst.rate);
1207 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
1208 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
1209 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
1210 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001211 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001212}
1213
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001214// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
1215// to apply.
1216TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -07001217 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001218 cricket::AudioSendParameters parameters;
1219 parameters.codecs.push_back(kIsacCodec);
1220 parameters.codecs.push_back(kPcmuCodec);
kwiberg68061362016-06-14 08:04:47 -07001221 parameters.codecs.push_back(kCn8000Codec);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001222 parameters.codecs[0].id = 96;
1223 parameters.codecs[0].bitrate = 48000;
minyue7a973442016-10-20 03:27:12 -07001224 const int initial_num = call_.GetNumCreatedSendStreams();
solenberg059fb442016-10-26 05:12:24 -07001225 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001226 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001227 // Calling SetSendCodec again with same codec which is already set.
1228 // In this case media channel shouldn't send codec to VoE.
solenberg059fb442016-10-26 05:12:24 -07001229 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001230 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
wu@webrtc.org05e7b442014-04-01 17:44:24 +00001231}
1232
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001233// Verify that G722 is set with 16000 samples per second to WebRTC.
1234TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -07001235 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001236 cricket::AudioSendParameters parameters;
1237 parameters.codecs.push_back(kG722CodecSdp);
solenberg059fb442016-10-26 05:12:24 -07001238 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001239 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +00001240 EXPECT_STREQ("G722", gcodec.plname);
1241 EXPECT_EQ(1, gcodec.channels);
1242 EXPECT_EQ(16000, gcodec.plfreq);
1243}
1244
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001245// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001246TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -07001247 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001248 cricket::AudioSendParameters parameters;
1249 parameters.codecs.push_back(kOpusCodec);
1250 parameters.codecs[0].bitrate = 0;
1251 parameters.codecs[0].clockrate = 50000;
1252 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001253}
1254
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001255// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001256TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001257 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001258 cricket::AudioSendParameters parameters;
1259 parameters.codecs.push_back(kOpusCodec);
1260 parameters.codecs[0].bitrate = 0;
1261 parameters.codecs[0].channels = 0;
1262 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001263}
1264
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001265// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001266TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001267 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001268 cricket::AudioSendParameters parameters;
1269 parameters.codecs.push_back(kOpusCodec);
1270 parameters.codecs[0].bitrate = 0;
1271 parameters.codecs[0].channels = 0;
1272 parameters.codecs[0].params["stereo"] = "1";
1273 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001274}
1275
1276// Test that if channel is 1 for opus and there's no stereo, we fail.
1277TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001278 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001279 cricket::AudioSendParameters parameters;
1280 parameters.codecs.push_back(kOpusCodec);
1281 parameters.codecs[0].bitrate = 0;
1282 parameters.codecs[0].channels = 1;
1283 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001284}
1285
1286// Test that if channel is 1 for opus and stereo=0, we fail.
1287TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001288 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001289 cricket::AudioSendParameters parameters;
1290 parameters.codecs.push_back(kOpusCodec);
1291 parameters.codecs[0].bitrate = 0;
1292 parameters.codecs[0].channels = 1;
1293 parameters.codecs[0].params["stereo"] = "0";
1294 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001295}
1296
1297// Test that if channel is 1 for opus and stereo=1, we fail.
1298TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001299 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001300 cricket::AudioSendParameters parameters;
1301 parameters.codecs.push_back(kOpusCodec);
1302 parameters.codecs[0].bitrate = 0;
1303 parameters.codecs[0].channels = 1;
1304 parameters.codecs[0].params["stereo"] = "1";
1305 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001306}
1307
1308// Test that with bitrate=0 and no stereo,
1309// channels and bitrate are 1 and 32000.
1310TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001311 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001312 cricket::AudioSendParameters parameters;
1313 parameters.codecs.push_back(kOpusCodec);
1314 parameters.codecs[0].bitrate = 0;
solenberg059fb442016-10-26 05:12:24 -07001315 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001316 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001317}
1318
1319// Test that with bitrate=0 and stereo=0,
1320// channels and bitrate are 1 and 32000.
1321TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001322 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001323 cricket::AudioSendParameters parameters;
1324 parameters.codecs.push_back(kOpusCodec);
1325 parameters.codecs[0].bitrate = 0;
1326 parameters.codecs[0].params["stereo"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001327 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001328 CheckSendCodec(kSsrc1, "opus", 1, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001329}
1330
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001331// Test that with bitrate=invalid and stereo=0,
1332// channels and bitrate are 1 and 32000.
1333TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001334 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001335 cricket::AudioSendParameters parameters;
1336 parameters.codecs.push_back(kOpusCodec);
1337 parameters.codecs[0].params["stereo"] = "0";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001338 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001339 parameters.codecs[0].bitrate = 5999;
solenberg059fb442016-10-26 05:12:24 -07001340 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001341 CheckSendCodec(kSsrc1, "opus", 1, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001342
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001343 parameters.codecs[0].bitrate = 510001;
solenberg059fb442016-10-26 05:12:24 -07001344 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001345 CheckSendCodec(kSsrc1, "opus", 1, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001346}
1347
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001348// Test that with bitrate=0 and stereo=1,
1349// channels and bitrate are 2 and 64000.
1350TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001351 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001352 cricket::AudioSendParameters parameters;
1353 parameters.codecs.push_back(kOpusCodec);
1354 parameters.codecs[0].bitrate = 0;
1355 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001356 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001357 CheckSendCodec(kSsrc1, "opus", 2, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001358}
1359
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001360// Test that with bitrate=invalid and stereo=1,
1361// channels and bitrate are 2 and 64000.
1362TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001363 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001364 cricket::AudioSendParameters parameters;
1365 parameters.codecs.push_back(kOpusCodec);
1366 parameters.codecs[0].params["stereo"] = "1";
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001367 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001368 parameters.codecs[0].bitrate = 5999;
solenberg059fb442016-10-26 05:12:24 -07001369 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001370 CheckSendCodec(kSsrc1, "opus", 2, 6000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001371
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001372 parameters.codecs[0].bitrate = 510001;
solenberg059fb442016-10-26 05:12:24 -07001373 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001374 CheckSendCodec(kSsrc1, "opus", 2, 510000);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001375}
1376
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001377// Test that with bitrate=N and stereo unset,
1378// channels and bitrate are 1 and N.
1379TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -07001380 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001381 cricket::AudioSendParameters parameters;
1382 parameters.codecs.push_back(kOpusCodec);
1383 parameters.codecs[0].bitrate = 96000;
solenberg059fb442016-10-26 05:12:24 -07001384 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001385 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001386 EXPECT_EQ(111, gcodec.pltype);
1387 EXPECT_EQ(96000, gcodec.rate);
1388 EXPECT_STREQ("opus", gcodec.plname);
1389 EXPECT_EQ(1, gcodec.channels);
1390 EXPECT_EQ(48000, gcodec.plfreq);
1391}
1392
1393// Test that with bitrate=N and stereo=0,
1394// channels and bitrate are 1 and N.
1395TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001396 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001397 cricket::AudioSendParameters parameters;
1398 parameters.codecs.push_back(kOpusCodec);
1399 parameters.codecs[0].bitrate = 30000;
1400 parameters.codecs[0].params["stereo"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001401 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001402 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001403}
1404
1405// Test that with bitrate=N and without any parameters,
1406// channels and bitrate are 1 and N.
1407TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001408 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001409 cricket::AudioSendParameters parameters;
1410 parameters.codecs.push_back(kOpusCodec);
1411 parameters.codecs[0].bitrate = 30000;
solenberg059fb442016-10-26 05:12:24 -07001412 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001413 CheckSendCodec(kSsrc1, "opus", 1, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001414}
1415
1416// Test that with bitrate=N and stereo=1,
1417// channels and bitrate are 2 and N.
1418TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001419 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001420 cricket::AudioSendParameters parameters;
1421 parameters.codecs.push_back(kOpusCodec);
1422 parameters.codecs[0].bitrate = 30000;
1423 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001424 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001425 CheckSendCodec(kSsrc1, "opus", 2, 30000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001426}
1427
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001428// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1429// Also test that the "maxaveragebitrate" can't be set to values outside the
1430// range of 6000 and 510000
1431TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001432 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001433 cricket::AudioSendParameters parameters;
1434 parameters.codecs.push_back(kOpusCodec);
1435 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001436 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001437 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
solenberg059fb442016-10-26 05:12:24 -07001438 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001439 EXPECT_EQ(6000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001440
1441 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001442 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
solenberg059fb442016-10-26 05:12:24 -07001443 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001444 EXPECT_EQ(510000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001445
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001446 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
solenberg059fb442016-10-26 05:12:24 -07001447 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001448 EXPECT_EQ(200000, GetCodecBitrate(kSsrc1));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001449}
1450
stefan13f1a0a2016-11-30 07:22:58 -08001451TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithBitrates) {
1452 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1453 200000);
1454}
1455
1456TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithHighMaxBitrate) {
1457 SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "10000", 10000000);
1458}
1459
1460TEST_F(WebRtcVoiceEngineTestFake,
1461 SetSendCodecsWithoutBitratesUsesCorrectDefaults) {
1462 SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "", -1);
1463}
1464
1465TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCapsMinAndStartBitrate) {
1466 SetSendCodecsShouldWorkForBitrates("-1", 0, "-100", -1, "", -1);
1467}
1468
1469TEST_F(WebRtcVoiceEngineTestFake,
1470 SetMaxSendBandwidthShouldPreserveOtherBitrates) {
1471 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1472 200000);
1473 send_parameters_.max_bandwidth_bps = 300000;
1474 SetSendParameters(send_parameters_);
1475 EXPECT_EQ(100000, call_.GetConfig().bitrate_config.min_bitrate_bps)
1476 << "Setting max bitrate should keep previous min bitrate.";
1477 EXPECT_EQ(-1, call_.GetConfig().bitrate_config.start_bitrate_bps)
1478 << "Setting max bitrate should not reset start bitrate.";
1479 EXPECT_EQ(300000, call_.GetConfig().bitrate_config.max_bitrate_bps);
1480}
1481
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001482// Test that we can enable NACK with opus as caller.
1483TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001484 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001485 cricket::AudioSendParameters parameters;
1486 parameters.codecs.push_back(kOpusCodec);
1487 parameters.codecs[0].AddFeedbackParam(
1488 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1489 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001490 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001491 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001492 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001493}
1494
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001495// Test that we can enable NACK with opus as callee.
1496TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001497 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001498 cricket::AudioSendParameters parameters;
1499 parameters.codecs.push_back(kOpusCodec);
1500 parameters.codecs[0].AddFeedbackParam(
1501 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1502 cricket::kParamValueEmpty));
solenberg8189b022016-06-14 12:13:00 -07001503 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001504 SetSendParameters(parameters);
deadbeefb56069e2016-05-06 04:57:03 -07001505 // NACK should be enabled even with no send stream.
solenberg8189b022016-06-14 12:13:00 -07001506 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001507
1508 EXPECT_TRUE(channel_->AddSendStream(
1509 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg971cab02016-06-14 10:02:41 -07001510 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001511}
1512
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001513// Test that we can enable NACK on receive streams.
1514TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001515 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001516 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001517 cricket::AudioSendParameters parameters;
1518 parameters.codecs.push_back(kOpusCodec);
1519 parameters.codecs[0].AddFeedbackParam(
1520 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1521 cricket::kParamValueEmpty));
solenberg971cab02016-06-14 10:02:41 -07001522 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001523 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
solenberg059fb442016-10-26 05:12:24 -07001524 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001525 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001526 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001527}
1528
1529// Test that we can disable NACK.
1530TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001531 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001532 cricket::AudioSendParameters parameters;
1533 parameters.codecs.push_back(kOpusCodec);
1534 parameters.codecs[0].AddFeedbackParam(
1535 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1536 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001537 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001538 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001539
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001540 parameters.codecs.clear();
1541 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001542 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001543 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001544}
1545
1546// Test that we can disable NACK on receive streams.
1547TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001548 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07001549 EXPECT_TRUE(AddRecvStream(kSsrc2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001550 cricket::AudioSendParameters parameters;
1551 parameters.codecs.push_back(kOpusCodec);
1552 parameters.codecs[0].AddFeedbackParam(
1553 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1554 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001555 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001556 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001557 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001558
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001559 parameters.codecs.clear();
1560 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001561 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001562 EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
solenberg8189b022016-06-14 12:13:00 -07001563 EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001564}
1565
1566// Test that NACK is enabled on a new receive stream.
1567TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001568 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001569 cricket::AudioSendParameters parameters;
1570 parameters.codecs.push_back(kIsacCodec);
1571 parameters.codecs.push_back(kCn16000Codec);
1572 parameters.codecs[0].AddFeedbackParam(
1573 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1574 cricket::kParamValueEmpty));
solenberg059fb442016-10-26 05:12:24 -07001575 SetSendParameters(parameters);
solenberg971cab02016-06-14 10:02:41 -07001576 EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001577
solenberg8189b022016-06-14 12:13:00 -07001578 EXPECT_TRUE(AddRecvStream(kSsrc2));
1579 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
1580 EXPECT_TRUE(AddRecvStream(kSsrc3));
1581 EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc3).rtp.nack.rtp_history_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001582}
1583
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001584// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001585TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001586 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001587 cricket::AudioSendParameters parameters;
1588 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001589 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001590 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001591}
1592
1593// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001594TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001595 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001596 cricket::AudioSendParameters parameters;
1597 parameters.codecs.push_back(kOpusCodec);
1598 parameters.codecs[0].bitrate = 0;
1599 parameters.codecs[0].params["useinbandfec"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001600 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001601 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001602}
1603
1604// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001605TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001606 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001607 cricket::AudioSendParameters parameters;
1608 parameters.codecs.push_back(kOpusCodec);
1609 parameters.codecs[0].bitrate = 0;
1610 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001611 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001612 EXPECT_TRUE(GetCodecFec(kSsrc1));
1613 CheckSendCodec(kSsrc1, "opus", 1, 32000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001614}
1615
1616// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001617TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001618 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001619 cricket::AudioSendParameters parameters;
1620 parameters.codecs.push_back(kOpusCodec);
1621 parameters.codecs[0].bitrate = 0;
1622 parameters.codecs[0].params["stereo"] = "1";
1623 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001624 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001625 EXPECT_TRUE(GetCodecFec(kSsrc1));
1626 CheckSendCodec(kSsrc1, "opus", 2, 64000);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001627}
1628
1629// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001630TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001631 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001632 cricket::AudioSendParameters parameters;
1633 parameters.codecs.push_back(kIsacCodec);
solenberg059fb442016-10-26 05:12:24 -07001634 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001635 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001636}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001637
1638// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1639TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001640 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001641 cricket::AudioSendParameters parameters;
1642 parameters.codecs.push_back(kIsacCodec);
1643 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001644 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001645 EXPECT_FALSE(GetCodecFec(kSsrc1));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001646}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001647
1648// Test that Opus FEC status can be changed.
1649TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001650 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001651 cricket::AudioSendParameters parameters;
1652 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001653 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001654 EXPECT_FALSE(GetCodecFec(kSsrc1));
1655
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001656 parameters.codecs[0].params["useinbandfec"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001657 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001658 EXPECT_TRUE(GetCodecFec(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001659}
1660
stefanba4c0e42016-02-04 04:12:24 -08001661TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001662 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001663 cricket::AudioSendParameters send_parameters;
1664 send_parameters.codecs.push_back(kOpusCodec);
1665 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
solenberg059fb442016-10-26 05:12:24 -07001666 SetSendParameters(send_parameters);
stefanba4c0e42016-02-04 04:12:24 -08001667
1668 cricket::AudioRecvParameters recv_parameters;
1669 recv_parameters.codecs.push_back(kIsacCodec);
1670 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
solenberg8189b022016-06-14 12:13:00 -07001671 EXPECT_TRUE(AddRecvStream(kSsrc1));
stefanba4c0e42016-02-04 04:12:24 -08001672 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1673 EXPECT_FALSE(
1674 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1675
ossudedfd282016-06-14 07:12:39 -07001676 send_parameters.codecs = engine_->send_codecs();
solenberg059fb442016-10-26 05:12:24 -07001677 SetSendParameters(send_parameters);
stefanba4c0e42016-02-04 04:12:24 -08001678 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1679 EXPECT_TRUE(
1680 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1681}
1682
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001683// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1684TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001685 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001686 cricket::AudioSendParameters parameters;
1687 parameters.codecs.push_back(kOpusCodec);
1688 parameters.codecs[0].bitrate = 0;
1689 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
solenberg059fb442016-10-26 05:12:24 -07001690 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001691 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
1692 EXPECT_EQ(12000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001693
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001694 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001695 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001696 EXPECT_EQ(24000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001697}
1698
1699// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1700TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001701 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001702 cricket::AudioSendParameters parameters;
1703 parameters.codecs.push_back(kOpusCodec);
1704 parameters.codecs[0].bitrate = 0;
1705 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
solenberg059fb442016-10-26 05:12:24 -07001706 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001707 EXPECT_EQ(8001, GetOpusMaxPlaybackRate(kSsrc1));
1708 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001709
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001710 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001711 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001712 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001713}
1714
1715// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1716TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001717 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001718 cricket::AudioSendParameters parameters;
1719 parameters.codecs.push_back(kOpusCodec);
1720 parameters.codecs[0].bitrate = 0;
1721 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
solenberg059fb442016-10-26 05:12:24 -07001722 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001723 EXPECT_EQ(12001, GetOpusMaxPlaybackRate(kSsrc1));
1724 EXPECT_EQ(20000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001725
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001726 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001727 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001728 EXPECT_EQ(40000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001729}
1730
1731// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1732TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001733 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001734 cricket::AudioSendParameters parameters;
1735 parameters.codecs.push_back(kOpusCodec);
1736 parameters.codecs[0].bitrate = 0;
1737 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
solenberg059fb442016-10-26 05:12:24 -07001738 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001739 EXPECT_EQ(16001, GetOpusMaxPlaybackRate(kSsrc1));
1740 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001741
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001742 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001743 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001744 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001745}
1746
1747// Test 24000 < maxplaybackrate triggers Opus full band mode.
1748TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001749 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001750 cricket::AudioSendParameters parameters;
1751 parameters.codecs.push_back(kOpusCodec);
1752 parameters.codecs[0].bitrate = 0;
1753 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
solenberg059fb442016-10-26 05:12:24 -07001754 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001755 EXPECT_EQ(24001, GetOpusMaxPlaybackRate(kSsrc1));
1756 EXPECT_EQ(32000, GetCodecBitrate(kSsrc1));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001757
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001758 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
solenberg059fb442016-10-26 05:12:24 -07001759 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001760 EXPECT_EQ(64000, GetCodecBitrate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001761}
1762
1763// Test Opus that without maxplaybackrate, default playback rate is used.
1764TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001765 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001766 cricket::AudioSendParameters parameters;
1767 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001768 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001769 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001770}
1771
1772// Test the with non-Opus, maxplaybackrate has no effect.
1773TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001774 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001775 cricket::AudioSendParameters parameters;
1776 parameters.codecs.push_back(kIsacCodec);
1777 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
solenberg059fb442016-10-26 05:12:24 -07001778 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001779 EXPECT_EQ(0, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001780}
1781
1782// Test maxplaybackrate can be set on two streams.
1783TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001784 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001785 cricket::AudioSendParameters parameters;
1786 parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001787 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001788 EXPECT_EQ(48000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001789
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001790 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
solenberg059fb442016-10-26 05:12:24 -07001791 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001792 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc1));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001793
1794 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
minyue7a973442016-10-20 03:27:12 -07001795 EXPECT_EQ(8000, GetOpusMaxPlaybackRate(kSsrc2));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001796}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001797
Minyue Li7100dcd2015-03-27 05:05:59 +01001798// Test that with usedtx=0, Opus DTX is off.
1799TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001800 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001801 cricket::AudioSendParameters parameters;
1802 parameters.codecs.push_back(kOpusCodec);
1803 parameters.codecs[0].params["usedtx"] = "0";
solenberg059fb442016-10-26 05:12:24 -07001804 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001805 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001806}
1807
1808// Test that with usedtx=1, Opus DTX is on.
1809TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001810 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001811 cricket::AudioSendParameters parameters;
1812 parameters.codecs.push_back(kOpusCodec);
1813 parameters.codecs[0].params["usedtx"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001814 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001815 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001816}
1817
1818// Test that usedtx=1 works with stereo Opus.
1819TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001820 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001821 cricket::AudioSendParameters parameters;
1822 parameters.codecs.push_back(kOpusCodec);
1823 parameters.codecs[0].params["usedtx"] = "1";
1824 parameters.codecs[0].params["stereo"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001825 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001826 EXPECT_TRUE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001827}
1828
1829// Test that usedtx=1 does not work with non Opus.
1830TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001831 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001832 cricket::AudioSendParameters parameters;
1833 parameters.codecs.push_back(kIsacCodec);
1834 parameters.codecs[0].params["usedtx"] = "1";
solenberg059fb442016-10-26 05:12:24 -07001835 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001836 EXPECT_FALSE(GetOpusDtx(kSsrc1));
Minyue Li7100dcd2015-03-27 05:05:59 +01001837}
1838
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001839// Test that we can switch back and forth between Opus and ISAC with CN.
1840TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001841 EXPECT_TRUE(SetupSendStream());
minyue7a973442016-10-20 03:27:12 -07001842
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001843 cricket::AudioSendParameters opus_parameters;
1844 opus_parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001845 SetSendParameters(opus_parameters);
minyue7a973442016-10-20 03:27:12 -07001846 {
1847 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1848 EXPECT_EQ(111, gcodec.pltype);
1849 EXPECT_STREQ("opus", gcodec.plname);
1850 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001851
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001852 cricket::AudioSendParameters isac_parameters;
1853 isac_parameters.codecs.push_back(kIsacCodec);
1854 isac_parameters.codecs.push_back(kCn16000Codec);
1855 isac_parameters.codecs.push_back(kOpusCodec);
solenberg059fb442016-10-26 05:12:24 -07001856 SetSendParameters(isac_parameters);
minyue7a973442016-10-20 03:27:12 -07001857 {
1858 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1859 EXPECT_EQ(103, gcodec.pltype);
1860 EXPECT_STREQ("ISAC", gcodec.plname);
1861 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001862
solenberg059fb442016-10-26 05:12:24 -07001863 SetSendParameters(opus_parameters);
minyue7a973442016-10-20 03:27:12 -07001864 {
1865 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1866 EXPECT_EQ(111, gcodec.pltype);
1867 EXPECT_STREQ("opus", gcodec.plname);
1868 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001869}
1870
1871// Test that we handle various ways of specifying bitrate.
1872TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001873 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001874 cricket::AudioSendParameters parameters;
1875 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
solenberg059fb442016-10-26 05:12:24 -07001876 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001877 {
1878 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1879 EXPECT_EQ(103, gcodec.pltype);
1880 EXPECT_STREQ("ISAC", gcodec.plname);
1881 EXPECT_EQ(32000, gcodec.rate);
1882 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001883
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001884 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001885 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001886 {
1887 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1888 EXPECT_EQ(103, gcodec.pltype);
1889 EXPECT_STREQ("ISAC", gcodec.plname);
1890 EXPECT_EQ(-1, gcodec.rate);
1891 }
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001892 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
solenberg059fb442016-10-26 05:12:24 -07001893 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001894 {
1895 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1896 EXPECT_EQ(103, gcodec.pltype);
1897 EXPECT_STREQ("ISAC", gcodec.plname);
1898 EXPECT_EQ(28000, gcodec.rate);
1899 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001900
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001901 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
solenberg059fb442016-10-26 05:12:24 -07001902 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001903 {
1904 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1905 EXPECT_EQ(0, gcodec.pltype);
1906 EXPECT_STREQ("PCMU", gcodec.plname);
1907 EXPECT_EQ(64000, gcodec.rate);
1908 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001909
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001910 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001911 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001912 {
1913 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1914 EXPECT_EQ(0, gcodec.pltype);
1915 EXPECT_STREQ("PCMU", gcodec.plname);
1916 EXPECT_EQ(64000, gcodec.rate);
1917 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001918
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001919 parameters.codecs[0] = kOpusCodec;
1920 parameters.codecs[0].bitrate = 0; // bitrate == default
solenberg059fb442016-10-26 05:12:24 -07001921 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001922 {
1923 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
1924 EXPECT_EQ(111, gcodec.pltype);
1925 EXPECT_STREQ("opus", gcodec.plname);
1926 EXPECT_EQ(32000, gcodec.rate);
1927 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001928}
1929
Brave Yao5225dd82015-03-26 07:39:19 +08001930// Test that we could set packet size specified in kCodecParamPTime.
1931TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001932 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001933 cricket::AudioSendParameters parameters;
1934 parameters.codecs.push_back(kOpusCodec);
1935 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
solenberg059fb442016-10-26 05:12:24 -07001936 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001937 EXPECT_EQ(1920, GetCodecPacSize(kSsrc1)); // Opus gets 40ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001938
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001939 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
solenberg059fb442016-10-26 05:12:24 -07001940 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001941 EXPECT_EQ(480, GetCodecPacSize(kSsrc1)); // Opus gets 10ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001942
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001943 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
solenberg059fb442016-10-26 05:12:24 -07001944 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001945 EXPECT_EQ(2880, GetCodecPacSize(kSsrc1)); // Opus gets 60ms.
Brave Yao5225dd82015-03-26 07:39:19 +08001946
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001947 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1948 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
solenberg059fb442016-10-26 05:12:24 -07001949 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001950 EXPECT_EQ(480, GetCodecPacSize(
1951 kSsrc1)); // Isac gets 30ms as the next smallest value.
Brave Yao5225dd82015-03-26 07:39:19 +08001952
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001953 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1954 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
solenberg059fb442016-10-26 05:12:24 -07001955 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001956 EXPECT_EQ(640, GetCodecPacSize(
1957 kSsrc1)); // G722 gets 40ms @16kHz as defined in VoE.
Brave Yao5225dd82015-03-26 07:39:19 +08001958}
1959
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001960// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001961TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001962 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001963 cricket::AudioSendParameters parameters;
1964 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001965}
1966
1967// Test that we can set send codecs even with telephone-event codec as the first
1968// one on the list.
1969TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001970 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001971 cricket::AudioSendParameters parameters;
solenberg2779bab2016-11-17 04:45:19 -08001972 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001973 parameters.codecs.push_back(kIsacCodec);
1974 parameters.codecs.push_back(kPcmuCodec);
1975 parameters.codecs[0].id = 98; // DTMF
1976 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001977 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07001978 const auto& gcodec = GetSendStreamConfig(kSsrc1).send_codec_spec.codec_inst;
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001979 EXPECT_EQ(96, gcodec.pltype);
1980 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001981 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001982}
1983
solenberg31642aa2016-03-14 08:00:37 -07001984// Test that payload type range is limited for telephone-event codec.
1985TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001986 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001987 cricket::AudioSendParameters parameters;
solenbergffbbcac2016-11-17 05:25:37 -08001988 parameters.codecs.push_back(kTelephoneEventCodec2);
solenberg31642aa2016-03-14 08:00:37 -07001989 parameters.codecs.push_back(kIsacCodec);
1990 parameters.codecs[0].id = 0; // DTMF
1991 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07001992 SetSendParameters(parameters);
solenberg31642aa2016-03-14 08:00:37 -07001993 EXPECT_TRUE(channel_->CanInsertDtmf());
1994 parameters.codecs[0].id = 128; // DTMF
1995 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1996 EXPECT_FALSE(channel_->CanInsertDtmf());
1997 parameters.codecs[0].id = 127;
solenberg059fb442016-10-26 05:12:24 -07001998 SetSendParameters(parameters);
solenberg31642aa2016-03-14 08:00:37 -07001999 EXPECT_TRUE(channel_->CanInsertDtmf());
2000 parameters.codecs[0].id = -1; // DTMF
2001 EXPECT_FALSE(channel_->SetSendParameters(parameters));
2002 EXPECT_FALSE(channel_->CanInsertDtmf());
2003}
2004
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00002005// Test that we can set send codecs even with CN codec as the first
2006// one on the list.
2007TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07002008 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002009 cricket::AudioSendParameters parameters;
2010 parameters.codecs.push_back(kCn16000Codec);
2011 parameters.codecs.push_back(kIsacCodec);
2012 parameters.codecs.push_back(kPcmuCodec);
2013 parameters.codecs[0].id = 98; // wideband CN
2014 parameters.codecs[1].id = 96;
solenberg059fb442016-10-26 05:12:24 -07002015 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002016 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2017 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2018 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2019 EXPECT_EQ(98, send_codec_spec.cng_payload_type);
2020 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002021}
2022
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002023// Test that we set VAD and DTMF types correctly as caller.
2024TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07002025 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002026 cricket::AudioSendParameters parameters;
2027 parameters.codecs.push_back(kIsacCodec);
2028 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002029 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002030 parameters.codecs.push_back(kCn16000Codec);
2031 parameters.codecs.push_back(kCn8000Codec);
solenberg2779bab2016-11-17 04:45:19 -08002032 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002033 parameters.codecs[0].id = 96;
2034 parameters.codecs[2].id = 97; // wideband CN
2035 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07002036 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002037 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2038 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2039 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2040 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2041 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2042 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2043 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002044 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002045}
2046
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002047// Test that we set VAD and DTMF types correctly as callee.
2048TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07002049 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002050 cricket::AudioSendParameters parameters;
2051 parameters.codecs.push_back(kIsacCodec);
2052 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002053 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002054 parameters.codecs.push_back(kCn16000Codec);
2055 parameters.codecs.push_back(kCn8000Codec);
solenbergffbbcac2016-11-17 05:25:37 -08002056 parameters.codecs.push_back(kTelephoneEventCodec2);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002057 parameters.codecs[0].id = 96;
2058 parameters.codecs[2].id = 97; // wideband CN
2059 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07002060 SetSendParameters(parameters);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002061 EXPECT_TRUE(channel_->AddSendStream(
2062 cricket::StreamParams::CreateLegacy(kSsrc1)));
2063
minyue7a973442016-10-20 03:27:12 -07002064 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2065 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2066 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2067 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2068 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2069 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2070 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002071 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002072}
2073
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002074// Test that we only apply VAD if we have a CN codec that matches the
2075// send codec clockrate.
2076TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07002077 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002078 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002079 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002080 parameters.codecs.push_back(kIsacCodec);
2081 parameters.codecs.push_back(kCn16000Codec);
2082 parameters.codecs[1].id = 97;
solenberg059fb442016-10-26 05:12:24 -07002083 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002084 {
2085 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2086 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2087 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2088 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2089 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2090 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
2091 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002092 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002093 parameters.codecs[0] = kPcmuCodec;
solenberg059fb442016-10-26 05:12:24 -07002094 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002095 {
2096 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2097 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2098 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2099 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002100 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002101 parameters.codecs[1] = kCn8000Codec;
solenberg059fb442016-10-26 05:12:24 -07002102 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002103 {
2104 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2105 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2106 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2107 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2108 EXPECT_EQ(13, send_codec_spec.cng_payload_type);
2109 EXPECT_EQ(webrtc::kFreq8000Hz, send_codec_spec.cng_plfreq);
2110 }
Brave Yao5225dd82015-03-26 07:39:19 +08002111 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002112 parameters.codecs[0] = kIsacCodec;
solenberg059fb442016-10-26 05:12:24 -07002113 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002114 {
2115 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2116 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2117 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2118 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002119}
2120
2121// Test that we perform case-insensitive matching of codec names.
2122TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07002123 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002124 cricket::AudioSendParameters parameters;
2125 parameters.codecs.push_back(kIsacCodec);
2126 parameters.codecs.push_back(kPcmuCodec);
2127 parameters.codecs.push_back(kCn16000Codec);
2128 parameters.codecs.push_back(kCn8000Codec);
solenberg2779bab2016-11-17 04:45:19 -08002129 parameters.codecs.push_back(kTelephoneEventCodec1);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002130 parameters.codecs[0].name = "iSaC";
2131 parameters.codecs[0].id = 96;
2132 parameters.codecs[2].id = 97; // wideband CN
2133 parameters.codecs[4].id = 98; // DTMF
solenberg059fb442016-10-26 05:12:24 -07002134 SetSendParameters(parameters);
minyue7a973442016-10-20 03:27:12 -07002135 const auto& send_codec_spec = GetSendStreamConfig(kSsrc1).send_codec_spec;
2136 EXPECT_EQ(96, send_codec_spec.codec_inst.pltype);
2137 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2138 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2139 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2140 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2141 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01002142 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002143}
2144
stefanba4c0e42016-02-04 04:12:24 -08002145class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
2146 public:
2147 WebRtcVoiceEngineWithSendSideBweTest()
2148 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
2149};
2150
2151TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
2152 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07002153 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08002154 ASSERT_FALSE(capabilities.header_extensions.empty());
isheriff6f8d6862016-05-26 11:24:55 -07002155 for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
2156 if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
2157 EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
stefanba4c0e42016-02-04 04:12:24 -08002158 extension.id);
2159 return;
2160 }
2161 }
2162 FAIL() << "Transport sequence number extension not in header-extension list.";
2163}
2164
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002165// Test support for audio level header extension.
2166TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002167 TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002168}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002169TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
isheriff6f8d6862016-05-26 11:24:55 -07002170 TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002171}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002172
solenbergd4adce42016-11-17 06:26:52 -08002173// Test support for transport sequence number header extension.
2174TEST_F(WebRtcVoiceEngineTestFake, SendTransportSequenceNumberHeaderExtensions) {
2175 TestSetSendRtpHeaderExtensions(
2176 webrtc::RtpExtension::kTransportSequenceNumberUri);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002177}
solenbergd4adce42016-11-17 06:26:52 -08002178TEST_F(WebRtcVoiceEngineTestFake, RecvTransportSequenceNumberHeaderExtensions) {
2179 TestSetRecvRtpHeaderExtensions(
2180 webrtc::RtpExtension::kTransportSequenceNumberUri);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002181}
2182
solenberg1ac56142015-10-13 03:58:19 -07002183// Test that we can create a channel and start sending on it.
2184TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002185 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002186 SetSendParameters(send_parameters_);
2187 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002188 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002189 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002190 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2191}
2192
2193// Test that a channel will send if and only if it has a source and is enabled
2194// for sending.
2195TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002196 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002197 SetSendParameters(send_parameters_);
2198 SetAudioSend(kSsrc1, true, nullptr);
2199 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002200 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002201 SetAudioSend(kSsrc1, true, &fake_source_);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002202 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
solenberg059fb442016-10-26 05:12:24 -07002203 SetAudioSend(kSsrc1, true, nullptr);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002204 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002205}
2206
solenberg94218532016-06-16 10:53:22 -07002207// Test that a channel is muted/unmuted.
2208TEST_F(WebRtcVoiceEngineTestFake, SendStateMuteUnmute) {
2209 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002210 SetSendParameters(send_parameters_);
solenberg94218532016-06-16 10:53:22 -07002211 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
solenberg059fb442016-10-26 05:12:24 -07002212 SetAudioSend(kSsrc1, true, nullptr);
solenberg94218532016-06-16 10:53:22 -07002213 EXPECT_FALSE(GetSendStream(kSsrc1).muted());
solenberg059fb442016-10-26 05:12:24 -07002214 SetAudioSend(kSsrc1, false, nullptr);
solenberg94218532016-06-16 10:53:22 -07002215 EXPECT_TRUE(GetSendStream(kSsrc1).muted());
2216}
2217
solenberg6d6e7c52016-04-13 09:07:30 -07002218// Test that SetSendParameters() does not alter a stream's send state.
2219TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
2220 EXPECT_TRUE(SetupSendStream());
2221 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2222
2223 // Turn on sending.
solenberg059fb442016-10-26 05:12:24 -07002224 SetSend(true);
solenberg6d6e7c52016-04-13 09:07:30 -07002225 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2226
2227 // Changing RTP header extensions will recreate the AudioSendStream.
2228 send_parameters_.extensions.push_back(
isheriff6f8d6862016-05-26 11:24:55 -07002229 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
solenberg059fb442016-10-26 05:12:24 -07002230 SetSendParameters(send_parameters_);
solenberg6d6e7c52016-04-13 09:07:30 -07002231 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2232
2233 // Turn off sending.
solenberg059fb442016-10-26 05:12:24 -07002234 SetSend(false);
solenberg6d6e7c52016-04-13 09:07:30 -07002235 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2236
2237 // Changing RTP header extensions will recreate the AudioSendStream.
2238 send_parameters_.extensions.clear();
solenberg059fb442016-10-26 05:12:24 -07002239 SetSendParameters(send_parameters_);
solenberg6d6e7c52016-04-13 09:07:30 -07002240 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2241}
2242
solenberg1ac56142015-10-13 03:58:19 -07002243// Test that we can create a channel and start playing out on it.
2244TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002245 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002246 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
aleloi84ef6152016-08-04 05:28:21 -07002247 channel_->SetPlayout(true);
2248 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
2249 channel_->SetPlayout(false);
2250 EXPECT_FALSE(GetRecvStream(kSsrc1).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002251}
2252
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002253// Test that we can add and remove send streams.
2254TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2255 SetupForMultiSendStream();
2256
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002257 // Set the global state for sending.
solenberg059fb442016-10-26 05:12:24 -07002258 SetSend(true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002259
solenbergc96df772015-10-21 13:01:53 -07002260 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002261 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002262 cricket::StreamParams::CreateLegacy(ssrc)));
solenberg059fb442016-10-26 05:12:24 -07002263 SetAudioSend(ssrc, true, &fake_source_);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002264 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002265 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002266 }
tfarina5237aaf2015-11-10 23:44:30 -08002267 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002268
solenbergc96df772015-10-21 13:01:53 -07002269 // Delete the send streams.
2270 for (uint32_t ssrc : kSsrcs4) {
2271 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002272 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002273 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002274 }
solenbergc96df772015-10-21 13:01:53 -07002275 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002276}
2277
2278// Test SetSendCodecs correctly configure the codecs in all send streams.
2279TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2280 SetupForMultiSendStream();
2281
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002282 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002283 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002284 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002285 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002286 }
2287
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002288 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002289 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002290 parameters.codecs.push_back(kIsacCodec);
2291 parameters.codecs.push_back(kCn16000Codec);
2292 parameters.codecs[1].id = 97;
solenberg059fb442016-10-26 05:12:24 -07002293 SetSendParameters(parameters);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002294
2295 // Verify ISAC and VAD are corrected configured on all send channels.
solenbergc96df772015-10-21 13:01:53 -07002296 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002297 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2298 const auto& send_codec_spec =
2299 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2300 EXPECT_STREQ("ISAC", send_codec_spec.codec_inst.plname);
2301 EXPECT_EQ(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2302 EXPECT_EQ(1, send_codec_spec.codec_inst.channels);
2303 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2304 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002305 }
2306
minyue7a973442016-10-20 03:27:12 -07002307 // Change to PCMU(8K) and CN(16K).
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002308 parameters.codecs[0] = kPcmuCodec;
solenberg059fb442016-10-26 05:12:24 -07002309 SetSendParameters(parameters);
solenbergc96df772015-10-21 13:01:53 -07002310 for (uint32_t ssrc : kSsrcs4) {
minyue7a973442016-10-20 03:27:12 -07002311 ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
2312 const auto& send_codec_spec =
2313 call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
2314 EXPECT_STREQ("PCMU", send_codec_spec.codec_inst.plname);
2315 EXPECT_NE(send_codec_spec.codec_inst.plfreq, send_codec_spec.cng_plfreq);
2316 EXPECT_EQ(97, send_codec_spec.cng_payload_type);
2317 EXPECT_EQ(webrtc::kFreq16000Hz, send_codec_spec.cng_plfreq);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002318 }
2319}
2320
2321// Test we can SetSend on all send streams correctly.
2322TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2323 SetupForMultiSendStream();
2324
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002325 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002326 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002327 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002328 cricket::StreamParams::CreateLegacy(ssrc)));
solenberg059fb442016-10-26 05:12:24 -07002329 SetAudioSend(ssrc, true, &fake_source_);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002330 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002331 }
2332
2333 // Set the global state for starting sending.
solenberg059fb442016-10-26 05:12:24 -07002334 SetSend(true);
solenbergc96df772015-10-21 13:01:53 -07002335 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002336 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002337 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002338 }
2339
2340 // Set the global state for stopping sending.
solenberg059fb442016-10-26 05:12:24 -07002341 SetSend(false);
solenbergc96df772015-10-21 13:01:53 -07002342 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002343 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002344 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002345 }
2346}
2347
2348// Test we can set the correct statistics on all send streams.
2349TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2350 SetupForMultiSendStream();
2351
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002352 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002353 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002354 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002355 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002356 }
solenberg85a04962015-10-27 03:35:21 -07002357
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002358 // Create a receive stream to check that none of the send streams end up in
2359 // the receive stream stats.
solenberg8189b022016-06-14 12:13:00 -07002360 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg971cab02016-06-14 10:02:41 -07002361
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002362 // We need send codec to be set to get all stats.
solenberg059fb442016-10-26 05:12:24 -07002363 SetSendParameters(send_parameters_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002364 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002365 SetAudioSendStreamStats();
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002366
solenberg85a04962015-10-27 03:35:21 -07002367 // Check stats for the added streams.
2368 {
2369 cricket::VoiceMediaInfo info;
2370 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002371
solenberg85a04962015-10-27 03:35:21 -07002372 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002373 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002374 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002375 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002376 }
hbos1acfbd22016-11-17 23:43:29 -08002377 VerifyVoiceSendRecvCodecs(info);
solenberg85a04962015-10-27 03:35:21 -07002378
2379 // We have added one receive stream. We should see empty stats.
2380 EXPECT_EQ(info.receivers.size(), 1u);
2381 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002382 }
solenberg1ac56142015-10-13 03:58:19 -07002383
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002384 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002385 {
2386 cricket::VoiceMediaInfo info;
2387 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2388 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002389 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002390 EXPECT_EQ(0u, info.receivers.size());
2391 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002392
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002393 // Deliver a new packet - a default receive stream should be created and we
2394 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002395 {
2396 cricket::VoiceMediaInfo info;
2397 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2398 SetAudioReceiveStreamStats();
2399 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002400 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002401 EXPECT_EQ(1u, info.receivers.size());
2402 VerifyVoiceReceiverInfo(info.receivers[0]);
hbos1acfbd22016-11-17 23:43:29 -08002403 VerifyVoiceSendRecvCodecs(info);
solenberg85a04962015-10-27 03:35:21 -07002404 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002405}
2406
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002407// Test that we can add and remove receive streams, and do proper send/playout.
2408// We can receive on multiple streams while sending one stream.
2409TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002410 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002411
solenberg1ac56142015-10-13 03:58:19 -07002412 // Start playout without a receive stream.
solenberg059fb442016-10-26 05:12:24 -07002413 SetSendParameters(send_parameters_);
aleloi84ef6152016-08-04 05:28:21 -07002414 channel_->SetPlayout(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002415
solenberg1ac56142015-10-13 03:58:19 -07002416 // Adding another stream should enable playout on the new stream only.
solenberg8189b022016-06-14 12:13:00 -07002417 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg059fb442016-10-26 05:12:24 -07002418 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002419 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002420
solenberg1ac56142015-10-13 03:58:19 -07002421 // Make sure only the new stream is played out.
aleloi84ef6152016-08-04 05:28:21 -07002422 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002423
2424 // Adding yet another stream should have stream 2 and 3 enabled for playout.
solenberg8189b022016-06-14 12:13:00 -07002425 EXPECT_TRUE(AddRecvStream(kSsrc3));
aleloi84ef6152016-08-04 05:28:21 -07002426 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2427 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002428
2429 // Stop sending.
solenberg059fb442016-10-26 05:12:24 -07002430 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002431 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002432
2433 // Stop playout.
aleloi84ef6152016-08-04 05:28:21 -07002434 channel_->SetPlayout(false);
2435 EXPECT_FALSE(GetRecvStream(kSsrc2).started());
2436 EXPECT_FALSE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002437
aleloi84ef6152016-08-04 05:28:21 -07002438 // Restart playout and make sure recv streams are played out.
2439 channel_->SetPlayout(true);
2440 EXPECT_TRUE(GetRecvStream(kSsrc2).started());
2441 EXPECT_TRUE(GetRecvStream(kSsrc3).started());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002442
aleloi84ef6152016-08-04 05:28:21 -07002443 // Now remove the recv streams.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002444 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2445 EXPECT_TRUE(channel_->RemoveRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002446}
2447
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002448// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002449// and start sending on it.
2450TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002451 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002452 cricket::AudioOptions options_adjust_agc;
2453 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002454 webrtc::AgcConfig agc_config;
2455 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2456 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002457 send_parameters_.options = options_adjust_agc;
solenberg059fb442016-10-26 05:12:24 -07002458 SetSendParameters(send_parameters_);
2459 SetSend(true);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002460 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002461 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2462 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
solenberg059fb442016-10-26 05:12:24 -07002463 SetSend(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002464 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002465 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002466}
2467
wu@webrtc.org97077a32013-10-25 21:18:33 +00002468TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002469 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002470 EXPECT_CALL(adm_,
2471 BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002472 webrtc::AgcConfig agc_config;
2473 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2474 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002475 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2476 send_parameters_.options.tx_agc_digital_compression_gain =
2477 rtc::Optional<uint16_t>(9);
2478 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2479 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002480 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002481 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2482 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2483 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2484 EXPECT_TRUE(agc_config.limiterEnable);
2485
2486 // Check interaction with adjust_agc_delta. Both should be respected, for
2487 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002488 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
solenberg059fb442016-10-26 05:12:24 -07002489 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002490 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2491 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2492}
2493
wu@webrtc.org97077a32013-10-25 21:18:33 +00002494TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002495 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002496 EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
2497 EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
solenberg246b8172015-12-08 09:50:23 -08002498 send_parameters_.options.recording_sample_rate =
2499 rtc::Optional<uint32_t>(48000);
2500 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
solenberg059fb442016-10-26 05:12:24 -07002501 SetSendParameters(send_parameters_);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002502}
2503
minyue6b825df2016-10-31 04:08:32 -07002504TEST_F(WebRtcVoiceEngineTestFake, SetAudioNetworkAdaptorViaOptions) {
2505 EXPECT_TRUE(SetupSendStream());
2506 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2507 send_parameters_.options.audio_network_adaptor_config =
2508 rtc::Optional<std::string>("1234");
2509 SetSendParameters(send_parameters_);
2510 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2511 GetAudioNetworkAdaptorConfig(kSsrc1));
2512}
2513
2514TEST_F(WebRtcVoiceEngineTestFake, AudioSendResetAudioNetworkAdaptor) {
2515 EXPECT_TRUE(SetupSendStream());
2516 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2517 send_parameters_.options.audio_network_adaptor_config =
2518 rtc::Optional<std::string>("1234");
2519 SetSendParameters(send_parameters_);
2520 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2521 GetAudioNetworkAdaptorConfig(kSsrc1));
2522 const int initial_num = call_.GetNumCreatedSendStreams();
2523 cricket::AudioOptions options;
2524 options.audio_network_adaptor = rtc::Optional<bool>(false);
2525 SetAudioSend(kSsrc1, true, nullptr, &options);
2526 // AudioSendStream expected to be recreated.
2527 EXPECT_EQ(initial_num + 1, call_.GetNumCreatedSendStreams());
2528 EXPECT_EQ(rtc::Optional<std::string>(), GetAudioNetworkAdaptorConfig(kSsrc1));
2529}
2530
2531TEST_F(WebRtcVoiceEngineTestFake, AudioNetworkAdaptorNotGetOverridden) {
2532 EXPECT_TRUE(SetupSendStream());
2533 send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
2534 send_parameters_.options.audio_network_adaptor_config =
2535 rtc::Optional<std::string>("1234");
2536 SetSendParameters(send_parameters_);
2537 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2538 GetAudioNetworkAdaptorConfig(kSsrc1));
2539 const int initial_num = call_.GetNumCreatedSendStreams();
2540 cricket::AudioOptions options;
2541 options.audio_network_adaptor = rtc::Optional<bool>();
2542 // Unvalued |options.audio_network_adaptor|.should not reset audio network
2543 // adaptor.
2544 SetAudioSend(kSsrc1, true, nullptr, &options);
2545 // AudioSendStream not expected to be recreated.
2546 EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
2547 EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
2548 GetAudioNetworkAdaptorConfig(kSsrc1));
2549}
2550
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002551// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002552// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002553TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002554 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002555 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002556}
2557
2558TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2559 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002560 EXPECT_TRUE(SetupSendStream());
solenbergff976312016-03-30 23:28:51 -07002561 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002562 // stream has to use a different SSRC.
solenberg8189b022016-06-14 12:13:00 -07002563 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg059fb442016-10-26 05:12:24 -07002564 SetSendParameters(send_parameters_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002565 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
solenberg971cab02016-06-14 10:02:41 -07002566 SetAudioSendStreamStats();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002567
solenberg85a04962015-10-27 03:35:21 -07002568 // Check stats for the added streams.
2569 {
2570 cricket::VoiceMediaInfo info;
2571 EXPECT_EQ(true, channel_->GetStats(&info));
2572
2573 // We have added one send stream. We should see the stats we've set.
2574 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002575 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002576 // We have added one receive stream. We should see empty stats.
2577 EXPECT_EQ(info.receivers.size(), 1u);
2578 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2579 }
solenberg1ac56142015-10-13 03:58:19 -07002580
solenberg566ef242015-11-06 15:34:49 -08002581 // Start sending - this affects some reported stats.
2582 {
2583 cricket::VoiceMediaInfo info;
solenberg059fb442016-10-26 05:12:24 -07002584 SetSend(true);
solenberg566ef242015-11-06 15:34:49 -08002585 EXPECT_EQ(true, channel_->GetStats(&info));
2586 VerifyVoiceSenderInfo(info.senders[0], true);
hbos1acfbd22016-11-17 23:43:29 -08002587 VerifyVoiceSendRecvCodecs(info);
solenberg566ef242015-11-06 15:34:49 -08002588 }
2589
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002590 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002591 {
2592 cricket::VoiceMediaInfo info;
2593 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2594 EXPECT_EQ(true, channel_->GetStats(&info));
2595 EXPECT_EQ(1u, info.senders.size());
2596 EXPECT_EQ(0u, info.receivers.size());
2597 }
solenberg1ac56142015-10-13 03:58:19 -07002598
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002599 // Deliver a new packet - a default receive stream should be created and we
2600 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002601 {
2602 cricket::VoiceMediaInfo info;
2603 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2604 SetAudioReceiveStreamStats();
2605 EXPECT_EQ(true, channel_->GetStats(&info));
2606 EXPECT_EQ(1u, info.senders.size());
2607 EXPECT_EQ(1u, info.receivers.size());
2608 VerifyVoiceReceiverInfo(info.receivers[0]);
hbos1acfbd22016-11-17 23:43:29 -08002609 VerifyVoiceSendRecvCodecs(info);
solenberg85a04962015-10-27 03:35:21 -07002610 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002611}
2612
2613// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002614// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002615TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002616 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002617 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg8189b022016-06-14 12:13:00 -07002618 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg7add0582015-11-20 09:59:34 -08002619 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002620}
2621
2622// Test that the local SSRC is the same on sending and receiving channels if the
2623// receive channel is created before the send channel.
2624TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002625 EXPECT_TRUE(SetupChannel());
solenberg4a0f7b52016-06-16 13:07:33 -07002626 EXPECT_TRUE(AddRecvStream(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002627 EXPECT_TRUE(channel_->AddSendStream(
solenberg4a0f7b52016-06-16 13:07:33 -07002628 cricket::StreamParams::CreateLegacy(kSsrc1)));
2629 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
2630 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002631}
2632
2633// Test that we can properly receive packets.
2634TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002635 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002636 EXPECT_TRUE(AddRecvStream(1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002637 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002638
2639 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2640 sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002641}
2642
2643// Test that we can properly receive packets on multiple streams.
2644TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002645 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002646 const uint32_t ssrc1 = 1;
2647 const uint32_t ssrc2 = 2;
2648 const uint32_t ssrc3 = 3;
solenberg8189b022016-06-14 12:13:00 -07002649 EXPECT_TRUE(AddRecvStream(ssrc1));
2650 EXPECT_TRUE(AddRecvStream(ssrc2));
2651 EXPECT_TRUE(AddRecvStream(ssrc3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002652 // Create packets with the right SSRCs.
mflodman3d7db262016-04-29 00:57:13 -07002653 unsigned char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002654 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002655 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002656 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002657 }
mflodman3d7db262016-04-29 00:57:13 -07002658
2659 const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
2660 const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
2661 const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
2662
2663 EXPECT_EQ(s1.received_packets(), 0);
2664 EXPECT_EQ(s2.received_packets(), 0);
2665 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002666
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002667 DeliverPacket(packets[0], sizeof(packets[0]));
mflodman3d7db262016-04-29 00:57:13 -07002668 EXPECT_EQ(s1.received_packets(), 0);
2669 EXPECT_EQ(s2.received_packets(), 0);
2670 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002671
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002672 DeliverPacket(packets[1], sizeof(packets[1]));
mflodman3d7db262016-04-29 00:57:13 -07002673 EXPECT_EQ(s1.received_packets(), 1);
2674 EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
2675 EXPECT_EQ(s2.received_packets(), 0);
2676 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002677
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002678 DeliverPacket(packets[2], sizeof(packets[2]));
mflodman3d7db262016-04-29 00:57:13 -07002679 EXPECT_EQ(s1.received_packets(), 1);
2680 EXPECT_EQ(s2.received_packets(), 1);
2681 EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
2682 EXPECT_EQ(s3.received_packets(), 0);
solenberg7e63ef02015-11-20 00:19:43 -08002683
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002684 DeliverPacket(packets[3], sizeof(packets[3]));
mflodman3d7db262016-04-29 00:57:13 -07002685 EXPECT_EQ(s1.received_packets(), 1);
2686 EXPECT_EQ(s2.received_packets(), 1);
2687 EXPECT_EQ(s3.received_packets(), 1);
2688 EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
solenberg7e63ef02015-11-20 00:19:43 -08002689
mflodman3d7db262016-04-29 00:57:13 -07002690 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
2691 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
2692 EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002693}
2694
solenberg7e63ef02015-11-20 00:19:43 -08002695// Test that receiving on an unsignalled stream works (default channel will be
2696// created).
2697TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002698 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002699 EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
2700
solenberg7e63ef02015-11-20 00:19:43 -08002701 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
mflodman3d7db262016-04-29 00:57:13 -07002702
2703 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2704 EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
2705 sizeof(kPcmuFrame)));
solenberg7e63ef02015-11-20 00:19:43 -08002706}
2707
2708// Test that receiving on an unsignalled stream works (default channel will be
2709// created), and that packets will be forwarded to the default channel
2710// regardless of their SSRCs.
2711TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002712 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002713 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002714 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2715
mflodman3d7db262016-04-29 00:57:13 -07002716 // Note that ssrc = 0 is not supported.
2717 uint32_t ssrc = 1;
2718 for (; ssrc < 10; ++ssrc) {
solenberg7e63ef02015-11-20 00:19:43 -08002719 rtc::SetBE32(&packet[8], ssrc);
2720 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002721
2722 // Verify we only have one default stream.
2723 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2724 EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
2725 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002726 }
mflodman3d7db262016-04-29 00:57:13 -07002727
2728 // Sending the same ssrc again should not create a new stream.
2729 --ssrc;
2730 DeliverPacket(packet, sizeof(packet));
2731 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
2732 EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
2733 EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002734}
2735
2736// Test that a default channel is created even after a signalled stream has been
2737// added, and that this stream will get any packets for unknown SSRCs.
2738TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002739 EXPECT_TRUE(SetupChannel());
mflodman3d7db262016-04-29 00:57:13 -07002740 unsigned char packet[sizeof(kPcmuFrame)];
solenberg7e63ef02015-11-20 00:19:43 -08002741 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2742
2743 // Add a known stream, send packet and verify we got it.
mflodman3d7db262016-04-29 00:57:13 -07002744 const uint32_t signaled_ssrc = 1;
2745 rtc::SetBE32(&packet[8], signaled_ssrc);
solenberg8189b022016-06-14 12:13:00 -07002746 EXPECT_TRUE(AddRecvStream(signaled_ssrc));
solenberg7e63ef02015-11-20 00:19:43 -08002747 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002748 EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
2749 packet, sizeof(packet)));
solenberg7e63ef02015-11-20 00:19:43 -08002750
2751 // Note that the first unknown SSRC cannot be 0, because we only support
2752 // creating receive streams for SSRC!=0.
mflodman3d7db262016-04-29 00:57:13 -07002753 const uint32_t unsignaled_ssrc = 7011;
2754 rtc::SetBE32(&packet[8], unsignaled_ssrc);
solenberg7e63ef02015-11-20 00:19:43 -08002755 DeliverPacket(packet, sizeof(packet));
mflodman3d7db262016-04-29 00:57:13 -07002756 EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
2757 packet, sizeof(packet)));
2758 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
2759
2760 DeliverPacket(packet, sizeof(packet));
2761 EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
2762
2763 rtc::SetBE32(&packet[8], signaled_ssrc);
2764 DeliverPacket(packet, sizeof(packet));
2765 EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
2766 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
solenberg7e63ef02015-11-20 00:19:43 -08002767}
2768
solenberg0a617e22015-10-20 15:49:38 -07002769// Test that we properly handle failures to add a receive stream.
2770TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002771 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002772 voe_.set_fail_create_channel(true);
solenberg8189b022016-06-14 12:13:00 -07002773 EXPECT_FALSE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002774}
2775
solenberg0a617e22015-10-20 15:49:38 -07002776// Test that we properly handle failures to add a send stream.
2777TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002778 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002779 voe_.set_fail_create_channel(true);
2780 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2781}
2782
solenberg1ac56142015-10-13 03:58:19 -07002783// Test that AddRecvStream creates new stream.
2784TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002785 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002786 int channel_num = voe_.GetLastChannel();
solenberg8189b022016-06-14 12:13:00 -07002787 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002788 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002789}
2790
2791// Test that after adding a recv stream, we do not decode more codecs than
2792// those previously passed into SetRecvCodecs.
2793TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002794 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002795 cricket::AudioRecvParameters parameters;
2796 parameters.codecs.push_back(kIsacCodec);
2797 parameters.codecs.push_back(kPcmuCodec);
2798 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg8189b022016-06-14 12:13:00 -07002799 EXPECT_TRUE(AddRecvStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002800 int channel_num2 = voe_.GetLastChannel();
2801 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002802 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002803 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002804 gcodec.channels = 2;
2805 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2806}
2807
2808// Test that we properly clean up any streams that were added, even if
2809// not explicitly removed.
2810TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002811 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07002812 SetSendParameters(send_parameters_);
solenberg8189b022016-06-14 12:13:00 -07002813 EXPECT_TRUE(AddRecvStream(1));
2814 EXPECT_TRUE(AddRecvStream(2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002815 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2816 delete channel_;
2817 channel_ = NULL;
2818 EXPECT_EQ(0, voe_.GetNumChannels());
2819}
2820
wu@webrtc.org78187522013-10-07 23:32:02 +00002821TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002822 EXPECT_TRUE(SetupSendStream());
solenberg8189b022016-06-14 12:13:00 -07002823 EXPECT_FALSE(AddRecvStream(0));
wu@webrtc.org78187522013-10-07 23:32:02 +00002824}
2825
2826TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002827 EXPECT_TRUE(SetupChannel());
solenberg8189b022016-06-14 12:13:00 -07002828 EXPECT_TRUE(AddRecvStream(1));
solenberg1ac56142015-10-13 03:58:19 -07002829 // Manually delete channel to simulate a failure.
2830 int channel = voe_.GetLastChannel();
2831 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2832 // Add recv stream 2 should work.
solenberg8189b022016-06-14 12:13:00 -07002833 EXPECT_TRUE(AddRecvStream(2));
wu@webrtc.org78187522013-10-07 23:32:02 +00002834 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002835 EXPECT_NE(channel, new_channel);
2836 // The last created channel is deleted too.
2837 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002838}
2839
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002840// Test the InsertDtmf on default send stream as caller.
2841TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
solenbergffbbcac2016-11-17 05:25:37 -08002842 TestInsertDtmf(0, true, kTelephoneEventCodec1);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002843}
2844
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002845// Test the InsertDtmf on default send stream as callee
2846TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
solenbergffbbcac2016-11-17 05:25:37 -08002847 TestInsertDtmf(0, false, kTelephoneEventCodec2);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002848}
2849
2850// Test the InsertDtmf on specified send stream as caller.
2851TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
solenbergffbbcac2016-11-17 05:25:37 -08002852 TestInsertDtmf(kSsrc1, true, kTelephoneEventCodec2);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002853}
2854
2855// Test the InsertDtmf on specified send stream as callee.
2856TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
solenbergffbbcac2016-11-17 05:25:37 -08002857 TestInsertDtmf(kSsrc1, false, kTelephoneEventCodec1);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002858}
2859
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002860TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002861 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07002862 EXPECT_CALL(adm_,
2863 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
2864 EXPECT_CALL(adm_,
2865 BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
2866 EXPECT_CALL(adm_,
2867 BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002868 bool ec_enabled;
2869 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002870 webrtc::AecmModes aecm_mode;
2871 bool cng_enabled;
2872 bool agc_enabled;
2873 webrtc::AgcModes agc_mode;
2874 webrtc::AgcConfig agc_config;
2875 bool ns_enabled;
2876 webrtc::NsModes ns_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002877 bool stereo_swapping_enabled;
2878 bool typing_detection_enabled;
2879 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002880 voe_.GetAecmMode(aecm_mode, cng_enabled);
2881 voe_.GetAgcStatus(agc_enabled, agc_mode);
2882 voe_.GetAgcConfig(agc_config);
2883 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002884 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2885 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2886 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002887 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002888 EXPECT_FALSE(cng_enabled);
2889 EXPECT_TRUE(agc_enabled);
2890 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2891 EXPECT_TRUE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08002892 EXPECT_TRUE(IsHighPassFilterEnabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002893 EXPECT_FALSE(stereo_swapping_enabled);
2894 EXPECT_TRUE(typing_detection_enabled);
2895 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2896 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002897 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2898 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002899
solenberg246b8172015-12-08 09:50:23 -08002900 // Nothing set in AudioOptions, so everything should be as default.
2901 send_parameters_.options = cricket::AudioOptions();
solenberg059fb442016-10-26 05:12:24 -07002902 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002903 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002904 voe_.GetAecmMode(aecm_mode, cng_enabled);
2905 voe_.GetAgcStatus(agc_enabled, agc_mode);
2906 voe_.GetAgcConfig(agc_config);
2907 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002908 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2909 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2910 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002911 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002912 EXPECT_FALSE(cng_enabled);
2913 EXPECT_TRUE(agc_enabled);
2914 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2915 EXPECT_TRUE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08002916 EXPECT_TRUE(IsHighPassFilterEnabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002917 EXPECT_FALSE(stereo_swapping_enabled);
2918 EXPECT_TRUE(typing_detection_enabled);
2919 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2920 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002921 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2922 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002923
2924 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002925 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002926 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002927 voe_.GetEcStatus(ec_enabled, ec_mode);
2928 EXPECT_FALSE(ec_enabled);
2929
2930 // Turn echo cancellation back on, with settings, and make sure
2931 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002932 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002933 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002934 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002935 voe_.GetAecmMode(aecm_mode, cng_enabled);
2936 voe_.GetAgcStatus(agc_enabled, agc_mode);
2937 voe_.GetAgcConfig(agc_config);
2938 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002939 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2940 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2941 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002942 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002943 EXPECT_TRUE(agc_enabled);
2944 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2945 EXPECT_TRUE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08002946 EXPECT_TRUE(IsHighPassFilterEnabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002947 EXPECT_FALSE(stereo_swapping_enabled);
2948 EXPECT_TRUE(typing_detection_enabled);
2949 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2950 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2951
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002952 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2953 // control.
solenberg246b8172015-12-08 09:50:23 -08002954 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002955 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002956 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002957 voe_.GetAecmMode(aecm_mode, cng_enabled);
2958 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002959 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002960 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2961
2962 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002963 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2964 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2965 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002966 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002967 voe_.GetEcStatus(ec_enabled, ec_mode);
2968 EXPECT_FALSE(ec_enabled);
2969 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002970 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002971 SetSendParameters(send_parameters_);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002972 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002973 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002974 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002975 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2976
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002977 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002978 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07002979 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002980 voe_.GetAgcStatus(agc_enabled, agc_mode);
2981 EXPECT_FALSE(agc_enabled);
2982
2983 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002984 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2985 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
solenberg059fb442016-10-26 05:12:24 -07002986 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002987 voe_.GetAgcStatus(agc_enabled, agc_mode);
2988 EXPECT_TRUE(agc_enabled);
2989 voe_.GetAgcConfig(agc_config);
2990 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2991
2992 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002993 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2994 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2995 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2996 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07002997 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002998 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002999 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3000 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3001 EXPECT_FALSE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08003002 EXPECT_FALSE(IsHighPassFilterEnabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003003 EXPECT_FALSE(typing_detection_enabled);
3004 EXPECT_TRUE(stereo_swapping_enabled);
3005
solenberg1ac56142015-10-13 03:58:19 -07003006 // Set options again to ensure it has no impact.
solenberg059fb442016-10-26 05:12:24 -07003007 SetSendParameters(send_parameters_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003008 voe_.GetEcStatus(ec_enabled, ec_mode);
3009 voe_.GetNsStatus(ns_enabled, ns_mode);
3010 EXPECT_TRUE(ec_enabled);
3011 EXPECT_EQ(webrtc::kEcConference, ec_mode);
3012 EXPECT_FALSE(ns_enabled);
3013 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
3014}
3015
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003016TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07003017 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003018
3019 bool ec_enabled;
3020 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003021 bool agc_enabled;
3022 webrtc::AgcModes agc_mode;
3023 bool ns_enabled;
3024 webrtc::NsModes ns_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003025 bool stereo_swapping_enabled;
3026 bool typing_detection_enabled;
3027
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003028 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003029 voe_.GetAgcStatus(agc_enabled, agc_mode);
3030 voe_.GetNsStatus(ns_enabled, ns_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003031 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
3032 voe_.GetTypingDetectionStatus(typing_detection_enabled);
3033 EXPECT_TRUE(ec_enabled);
3034 EXPECT_TRUE(agc_enabled);
3035 EXPECT_TRUE(ns_enabled);
peah8271d042016-11-22 07:24:52 -08003036 EXPECT_TRUE(IsHighPassFilterEnabled());
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00003037 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003038 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003039}
3040
3041TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
3042 webrtc::AgcConfig set_config = {0};
3043 set_config.targetLeveldBOv = 3;
3044 set_config.digitalCompressionGaindB = 9;
3045 set_config.limiterEnable = true;
3046 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003047
3048 webrtc::AgcConfig config = {0};
3049 EXPECT_EQ(0, voe_.GetAgcConfig(config));
3050 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
3051 EXPECT_EQ(set_config.digitalCompressionGaindB,
3052 config.digitalCompressionGaindB);
3053 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
3054}
3055
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003056TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07003057 EXPECT_TRUE(SetupSendStream());
solenberg5b5129a2016-04-08 05:35:48 -07003058 EXPECT_CALL(adm_,
3059 BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
3060 EXPECT_CALL(adm_,
3061 BuiltInAGCIsAvailable()).Times(9).WillRepeatedly(Return(false));
3062 EXPECT_CALL(adm_,
3063 BuiltInNSIsAvailable()).Times(9).WillRepeatedly(Return(false));
solenberg059fb442016-10-26 05:12:24 -07003064 EXPECT_CALL(adm_,
3065 RecordingIsInitialized()).Times(2).WillRepeatedly(Return(false));
3066 EXPECT_CALL(adm_, Recording()).Times(2).WillRepeatedly(Return(false));
3067 EXPECT_CALL(adm_, InitRecording()).Times(2).WillRepeatedly(Return(0));
3068 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(10);
3069 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(10);
solenberg5b5129a2016-04-08 05:35:48 -07003070
kwiberg686a8ef2016-02-26 03:00:35 -08003071 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07003072 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003073 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08003074 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07003075 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08003076 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003077
3078 // Have to add a stream to make SetSend work.
3079 cricket::StreamParams stream1;
3080 stream1.ssrcs.push_back(1);
3081 channel1->AddSendStream(stream1);
3082 cricket::StreamParams stream2;
3083 stream2.ssrcs.push_back(2);
3084 channel2->AddSendStream(stream2);
3085
3086 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003087 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003088 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
3089 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
3090 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
solenberg059fb442016-10-26 05:12:24 -07003091 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003092 EXPECT_EQ(parameters_options_all.options, channel1->options());
solenberg059fb442016-10-26 05:12:24 -07003093 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003094 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003095
3096 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003097 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003098 parameters_options_no_ns.options.noise_suppression =
3099 rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07003100 EXPECT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003101 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01003102 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3103 expected_options.auto_gain_control = rtc::Optional<bool>(true);
3104 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07003105 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003106
3107 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003108 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01003109 parameters_options_no_agc.options.auto_gain_control =
3110 rtc::Optional<bool>(false);
solenberg059fb442016-10-26 05:12:24 -07003111 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01003112 expected_options.echo_cancellation = rtc::Optional<bool>(true);
3113 expected_options.auto_gain_control = rtc::Optional<bool>(false);
3114 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07003115 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003116
solenberg059fb442016-10-26 05:12:24 -07003117 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003118 bool ec_enabled;
3119 webrtc::EcModes ec_mode;
3120 bool agc_enabled;
3121 webrtc::AgcModes agc_mode;
3122 bool ns_enabled;
3123 webrtc::NsModes ns_mode;
3124 voe_.GetEcStatus(ec_enabled, ec_mode);
3125 voe_.GetAgcStatus(agc_enabled, agc_mode);
3126 voe_.GetNsStatus(ns_enabled, ns_mode);
3127 EXPECT_TRUE(ec_enabled);
3128 EXPECT_TRUE(agc_enabled);
3129 EXPECT_TRUE(ns_enabled);
3130
solenberg059fb442016-10-26 05:12:24 -07003131 channel1->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003132 voe_.GetEcStatus(ec_enabled, ec_mode);
3133 voe_.GetAgcStatus(agc_enabled, agc_mode);
3134 voe_.GetNsStatus(ns_enabled, ns_mode);
3135 EXPECT_TRUE(ec_enabled);
3136 EXPECT_TRUE(agc_enabled);
3137 EXPECT_FALSE(ns_enabled);
3138
solenberg059fb442016-10-26 05:12:24 -07003139 channel2->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003140 voe_.GetEcStatus(ec_enabled, ec_mode);
3141 voe_.GetAgcStatus(agc_enabled, agc_mode);
3142 voe_.GetNsStatus(ns_enabled, ns_mode);
3143 EXPECT_TRUE(ec_enabled);
3144 EXPECT_FALSE(agc_enabled);
3145 EXPECT_TRUE(ns_enabled);
3146
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003147 // Make sure settings take effect while we are sending.
solenberg059fb442016-10-26 05:12:24 -07003148 EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
3149 EXPECT_CALL(apm_, ApplyConfig(testing::_));
3150 EXPECT_CALL(apm_, SetExtraOptions(testing::_));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003151 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3152 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07003153 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01003154 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07003155 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01003156 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08003157 channel2->SetSend(true);
solenberg059fb442016-10-26 05:12:24 -07003158 EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc_nor_ns));
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>(false);
solenberg66f43392015-09-09 01:36:22 -07003162 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003163 voe_.GetEcStatus(ec_enabled, ec_mode);
3164 voe_.GetAgcStatus(agc_enabled, agc_mode);
3165 voe_.GetNsStatus(ns_enabled, ns_mode);
3166 EXPECT_TRUE(ec_enabled);
3167 EXPECT_FALSE(agc_enabled);
3168 EXPECT_FALSE(ns_enabled);
3169}
3170
wu@webrtc.orgde305012013-10-31 15:40:38 +00003171// This test verifies DSCP settings are properly applied on voice media channel.
3172TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07003173 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08003174 cricket::FakeNetworkInterface network_interface;
3175 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08003176 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08003177
solenberg059fb442016-10-26 05:12:24 -07003178 EXPECT_CALL(apm_, ApplyConfig(testing::_)).Times(3);
3179 EXPECT_CALL(apm_, SetExtraOptions(testing::_)).Times(3);
3180
solenbergbc37fc82016-04-04 09:54:44 -07003181 channel.reset(
3182 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003183 channel->SetInterface(&network_interface);
3184 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3185 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3186
3187 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07003188 channel.reset(
3189 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003190 channel->SetInterface(&network_interface);
3191 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
3192
3193 // Verify that setting the option to false resets the
3194 // DiffServCodePoint.
3195 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07003196 channel.reset(
3197 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08003198 channel->SetInterface(&network_interface);
3199 // Default value when DSCP is disabled should be DSCP_DEFAULT.
3200 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
3201
3202 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00003203}
3204
solenberg1ac56142015-10-13 03:58:19 -07003205TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07003206 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003207 cricket::WebRtcVoiceMediaChannel* media_channel =
3208 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07003209 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
solenberg8189b022016-06-14 12:13:00 -07003210 EXPECT_TRUE(AddRecvStream(kSsrc1));
solenberg1ac56142015-10-13 03:58:19 -07003211 int channel_id = voe_.GetLastChannel();
3212 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
3213 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
solenberg8189b022016-06-14 12:13:00 -07003214 EXPECT_TRUE(AddRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07003215 int channel_id2 = voe_.GetLastChannel();
3216 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003217}
3218
solenberg1ac56142015-10-13 03:58:19 -07003219TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07003220 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003221 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003222 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3223 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3224 EXPECT_TRUE(channel_->AddSendStream(
3225 cricket::StreamParams::CreateLegacy(kSsrc1)));
3226 int channel_id = voe_.GetLastChannel();
3227 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3228 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3229 EXPECT_TRUE(channel_->AddSendStream(
3230 cricket::StreamParams::CreateLegacy(kSsrc2)));
3231 int channel_id2 = voe_.GetLastChannel();
3232 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003233}
3234
solenberg4bac9c52015-10-09 02:32:53 -07003235TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07003236 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07003237 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003238 cricket::StreamParams stream;
3239 stream.ssrcs.push_back(kSsrc2);
3240 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg217fb662016-06-17 08:30:54 -07003241 EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrc2).gain());
solenberg4bac9c52015-10-09 02:32:53 -07003242 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg217fb662016-06-17 08:30:54 -07003243 EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc2).gain());
solenberg1ac56142015-10-13 03:58:19 -07003244}
3245
3246TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003247 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07003248 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3249 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg217fb662016-06-17 08:30:54 -07003250 EXPECT_DOUBLE_EQ(2, GetRecvStream(1).gain());
solenberg1ac56142015-10-13 03:58:19 -07003251 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenberg217fb662016-06-17 08:30:54 -07003252 EXPECT_DOUBLE_EQ(3, GetRecvStream(1).gain());
3253 EXPECT_TRUE(channel_->SetOutputVolume(1, 4));
3254 EXPECT_DOUBLE_EQ(4, GetRecvStream(1).gain());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003255}
3256
pbos8fc7fa72015-07-15 08:02:58 -07003257TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003258 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003259 const std::string kSyncLabel = "AvSyncLabel";
3260
solenbergff976312016-03-30 23:28:51 -07003261 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003262 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3263 sp.sync_label = kSyncLabel;
3264 // Creating two channels to make sure that sync label is set properly for both
3265 // the default voice channel and following ones.
3266 EXPECT_TRUE(channel_->AddRecvStream(sp));
3267 sp.ssrcs[0] += 1;
3268 EXPECT_TRUE(channel_->AddRecvStream(sp));
3269
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003270 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003271 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003272 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003273 << "SyncGroup should be set based on sync_label";
3274 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003275 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003276 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003277}
3278
solenberg3a941542015-11-16 07:34:50 -08003279// TODO(solenberg): Remove, once recv streams are configured through Call.
3280// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003281TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003282 // Test that setting the header extensions results in the expected state
3283 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003284 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003285 ssrcs.push_back(223);
3286 ssrcs.push_back(224);
3287
solenbergff976312016-03-30 23:28:51 -07003288 EXPECT_TRUE(SetupSendStream());
solenberg059fb442016-10-26 05:12:24 -07003289 SetSendParameters(send_parameters_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02003290 for (uint32_t ssrc : ssrcs) {
solenberg059fb442016-10-26 05:12:24 -07003291 EXPECT_TRUE(channel_->AddRecvStream(
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003292 cricket::StreamParams::CreateLegacy(ssrc)));
3293 }
3294
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003295 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003296 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003297 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003298 EXPECT_NE(nullptr, s);
3299 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3300 }
3301
3302 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003303 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003304 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003305 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003306 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003307 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003308 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003309 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003310 EXPECT_NE(nullptr, s);
3311 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003312 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3313 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003314 for (const auto& s_ext : s_exts) {
3315 if (e_ext.id == s_ext.id) {
isheriff6f8d6862016-05-26 11:24:55 -07003316 EXPECT_EQ(e_ext.uri, s_ext.uri);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003317 }
3318 }
3319 }
3320 }
3321
3322 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003323 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003324 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003325 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003326 EXPECT_NE(nullptr, s);
3327 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3328 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003329}
3330
3331TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3332 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003333 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003334 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003335 static const unsigned char kRtcp[] = {
3336 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3337 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3340 };
jbaucheec21bd2016-03-20 06:15:43 -07003341 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003342
solenbergff976312016-03-30 23:28:51 -07003343 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003344 cricket::WebRtcVoiceMediaChannel* media_channel =
3345 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg059fb442016-10-26 05:12:24 -07003346 SetSendParameters(send_parameters_);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003347 EXPECT_TRUE(media_channel->AddRecvStream(
3348 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3349
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003350 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003351 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003352 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003353 EXPECT_EQ(0, s->received_packets());
3354 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3355 EXPECT_EQ(1, s->received_packets());
3356 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3357 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003358}
Minyue2013aec2015-05-13 14:14:42 +02003359
solenberg0a617e22015-10-20 15:49:38 -07003360// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003361// since they do not send RTCP SR.
solenberg7602aab2016-11-14 11:30:07 -08003362TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_SendCreatedFirst) {
solenbergff976312016-03-30 23:28:51 -07003363 EXPECT_TRUE(SetupSendStream());
solenberg7602aab2016-11-14 11:30:07 -08003364 EXPECT_TRUE(AddRecvStream(kSsrc2));
3365 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
3366 EXPECT_TRUE(channel_->AddSendStream(
3367 cricket::StreamParams::CreateLegacy(kSsrc3)));
3368 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
3369 EXPECT_TRUE(AddRecvStream(kSsrc4));
3370 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc4).rtp.local_ssrc);
Minyue2013aec2015-05-13 14:14:42 +02003371}
3372
solenberg7602aab2016-11-14 11:30:07 -08003373TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_RecvCreatedFirst) {
3374 EXPECT_TRUE(SetupRecvStream());
3375 EXPECT_EQ(0xFA17FA17u, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3376 EXPECT_TRUE(channel_->AddSendStream(
3377 cricket::StreamParams::CreateLegacy(kSsrc2)));
3378 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3379 EXPECT_TRUE(AddRecvStream(kSsrc3));
3380 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc3).rtp.local_ssrc);
3381 EXPECT_TRUE(channel_->AddSendStream(
3382 cricket::StreamParams::CreateLegacy(kSsrc4)));
3383 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc1).rtp.local_ssrc);
3384 EXPECT_EQ(kSsrc2, GetRecvStreamConfig(kSsrc3).rtp.local_ssrc);
Minyue2013aec2015-05-13 14:14:42 +02003385}
stefan658910c2015-09-03 05:48:32 -07003386
deadbeef884f5852016-01-15 09:20:04 -08003387TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003388 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003389 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3390 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003391
3392 // Setting the sink before a recv stream exists should do nothing.
3393 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
solenberg8189b022016-06-14 12:13:00 -07003394 EXPECT_TRUE(AddRecvStream(kSsrc1));
deadbeef884f5852016-01-15 09:20:04 -08003395 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3396
3397 // Now try actually setting the sink.
3398 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3399 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3400
3401 // Now try resetting it.
3402 channel_->SetRawAudioSink(kSsrc1, nullptr);
3403 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3404}
3405
3406TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003407 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003408 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3409 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003410
3411 // Should be able to set a default sink even when no stream exists.
3412 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3413
3414 // Create default channel and ensure it's assigned the default sink.
3415 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3416 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3417
3418 // Try resetting the default sink.
3419 channel_->SetRawAudioSink(0, nullptr);
3420 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3421
3422 // Try setting the default sink while the default stream exists.
3423 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3424 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3425
3426 // If we remove and add a default stream, it should get the same sink.
3427 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3428 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3429 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3430}
3431
skvlad7a43d252016-03-22 15:32:27 -07003432// Test that, just like the video channel, the voice channel communicates the
3433// network state to the call.
3434TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003435 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003436
3437 EXPECT_EQ(webrtc::kNetworkUp,
3438 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3439 EXPECT_EQ(webrtc::kNetworkUp,
3440 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3441
3442 channel_->OnReadyToSend(false);
3443 EXPECT_EQ(webrtc::kNetworkDown,
3444 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3445 EXPECT_EQ(webrtc::kNetworkUp,
3446 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3447
3448 channel_->OnReadyToSend(true);
3449 EXPECT_EQ(webrtc::kNetworkUp,
3450 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3451 EXPECT_EQ(webrtc::kNetworkUp,
3452 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3453}
3454
aleloi18e0b672016-10-04 02:45:47 -07003455// Test that playout is still started after changing parameters
3456TEST_F(WebRtcVoiceEngineTestFake, PreservePlayoutWhenRecreateRecvStream) {
3457 SetupRecvStream();
3458 channel_->SetPlayout(true);
3459 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3460
3461 // Changing RTP header extensions will recreate the AudioReceiveStream.
3462 cricket::AudioRecvParameters parameters;
3463 parameters.extensions.push_back(
3464 webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
3465 channel_->SetRecvParameters(parameters);
3466
3467 EXPECT_TRUE(GetRecvStream(kSsrc1).started());
3468}
3469
stefan658910c2015-09-03 05:48:32 -07003470// Tests that the library initializes and shuts down properly.
3471TEST(WebRtcVoiceEngineTest, StartupShutdown) {
ossu29b1a8d2016-06-13 07:34:51 -07003472 // If the VoiceEngine wants to gather available codecs early, that's fine but
3473 // we never want it to create a decoder at this stage.
ossuc54071d2016-08-17 02:45:41 -07003474 cricket::WebRtcVoiceEngine engine(
gyzhou95aa9642016-12-13 14:06:26 -08003475 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr);
skvlad11a9cbf2016-10-07 11:53:05 -07003476 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003477 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003478 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003479 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3480 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003481 EXPECT_TRUE(channel != nullptr);
3482 delete channel;
solenbergff976312016-03-30 23:28:51 -07003483}
stefan658910c2015-09-03 05:48:32 -07003484
solenbergff976312016-03-30 23:28:51 -07003485// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003486TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3487 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3488 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3489 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003490 {
ossuc54071d2016-08-17 02:45:41 -07003491 cricket::WebRtcVoiceEngine engine(
gyzhou95aa9642016-12-13 14:06:26 -08003492 &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr);
skvlad11a9cbf2016-10-07 11:53:05 -07003493 webrtc::RtcEventLogNullImpl event_log;
solenbergff976312016-03-30 23:28:51 -07003494 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003495 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
solenbergff976312016-03-30 23:28:51 -07003496 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3497 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3498 EXPECT_TRUE(channel != nullptr);
3499 delete channel;
3500 }
stefan658910c2015-09-03 05:48:32 -07003501}
3502
3503// Tests that the library is configured with the codecs we want.
3504TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003505 // TODO(ossu): These tests should move into a future "builtin audio codecs"
3506 // module.
3507
stefan658910c2015-09-03 05:48:32 -07003508 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003509 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003510 cricket::AudioCodec(96, "OPUS", 48000, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003511 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003512 cricket::AudioCodec(96, "ISAC", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003513 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003514 cricket::AudioCodec(96, "ISAC", 32000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003515 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003516 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003517 cricket::AudioCodec(96, "ILBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003518 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003519 cricket::AudioCodec(96, "iLBC", 8000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003520 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003521 cricket::AudioCodec(96, "CN", 32000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003522 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003523 cricket::AudioCodec(96, "CN", 16000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003524 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003525 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1), nullptr));
solenberg2779bab2016-11-17 04:45:19 -08003526 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3527 cricket::AudioCodec(96, "telephone-event", 16000, 0, 1), nullptr));
3528 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3529 cricket::AudioCodec(96, "telephone-event", 32000, 0, 1), nullptr));
3530 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3531 cricket::AudioCodec(96, "telephone-event", 48000, 0, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003532 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003533 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003534 cricket::AudioCodec(0, "", 8000, 0, 1), nullptr)); // PCMU
solenberg26c8c912015-11-27 04:00:25 -08003535 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003536 cricket::AudioCodec(8, "", 8000, 0, 1), nullptr)); // PCMA
solenberg26c8c912015-11-27 04:00:25 -08003537 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003538 cricket::AudioCodec(9, "", 8000, 0, 1), nullptr)); // G722
solenberg26c8c912015-11-27 04:00:25 -08003539 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003540 cricket::AudioCodec(13, "", 8000, 0, 1), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003541 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003542 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003543 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1), nullptr));
stefan658910c2015-09-03 05:48:32 -07003544 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003545 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003546 cricket::AudioCodec(99, "ABCD", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003547 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003548 cricket::AudioCodec(88, "", 0, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003549 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003550 cricket::AudioCodec(0, "", 0, 0, 2), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003551 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003552 cricket::AudioCodec(0, "", 5000, 0, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003553 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
deadbeef67cf2c12016-04-13 10:07:16 -07003554 cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
solenberg26c8c912015-11-27 04:00:25 -08003555
stefan658910c2015-09-03 05:48:32 -07003556 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
ossuc54071d2016-08-17 02:45:41 -07003557 // TODO(ossu): Why are the payload types of codecs with non-static payload
3558 // type assignments checked here? It shouldn't really matter.
3559 cricket::WebRtcVoiceEngine engine(
gyzhou95aa9642016-12-13 14:06:26 -08003560 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr);
solenberg2779bab2016-11-17 04:45:19 -08003561 for (const cricket::AudioCodec& codec : engine.send_codecs()) {
3562 if (codec.name == "CN" && codec.clockrate == 16000) {
3563 EXPECT_EQ(105, codec.id);
3564 } else if (codec.name == "CN" && codec.clockrate == 32000) {
3565 EXPECT_EQ(106, codec.id);
3566 } else if (codec.name == "ISAC" && codec.clockrate == 16000) {
3567 EXPECT_EQ(103, codec.id);
3568 } else if (codec.name == "ISAC" && codec.clockrate == 32000) {
3569 EXPECT_EQ(104, codec.id);
3570 } else if (codec.name == "G722" && codec.clockrate == 8000) {
3571 EXPECT_EQ(9, codec.id);
3572 } else if (codec.name == "telephone-event" && codec.clockrate == 8000) {
3573 EXPECT_EQ(126, codec.id);
3574 // TODO(solenberg): 16k, 32k, 48k DTMF should be dynamically assigned.
3575 // Remove these checks once both send and receive side assigns payload types
3576 // dynamically.
3577 } else if (codec.name == "telephone-event" && codec.clockrate == 16000) {
3578 EXPECT_EQ(113, codec.id);
3579 } else if (codec.name == "telephone-event" && codec.clockrate == 32000) {
3580 EXPECT_EQ(112, codec.id);
3581 } else if (codec.name == "telephone-event" && codec.clockrate == 48000) {
3582 EXPECT_EQ(110, codec.id);
3583 } else if (codec.name == "opus") {
3584 EXPECT_EQ(111, codec.id);
3585 ASSERT_TRUE(codec.params.find("minptime") != codec.params.end());
3586 EXPECT_EQ("10", codec.params.find("minptime")->second);
3587 ASSERT_TRUE(codec.params.find("useinbandfec") != codec.params.end());
3588 EXPECT_EQ("1", codec.params.find("useinbandfec")->second);
stefan658910c2015-09-03 05:48:32 -07003589 }
3590 }
stefan658910c2015-09-03 05:48:32 -07003591}
3592
3593// Tests that VoE supports at least 32 channels
3594TEST(WebRtcVoiceEngineTest, Has32Channels) {
ossuc54071d2016-08-17 02:45:41 -07003595 cricket::WebRtcVoiceEngine engine(
gyzhou95aa9642016-12-13 14:06:26 -08003596 nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr);
skvlad11a9cbf2016-10-07 11:53:05 -07003597 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003598 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003599 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
stefan658910c2015-09-03 05:48:32 -07003600
3601 cricket::VoiceMediaChannel* channels[32];
3602 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003603 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003604 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3605 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003606 if (!channel)
3607 break;
stefan658910c2015-09-03 05:48:32 -07003608 channels[num_channels++] = channel;
3609 }
3610
tfarina5237aaf2015-11-10 23:44:30 -08003611 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003612 EXPECT_EQ(expected, num_channels);
3613
3614 while (num_channels > 0) {
3615 delete channels[--num_channels];
3616 }
stefan658910c2015-09-03 05:48:32 -07003617}
3618
3619// Test that we set our preferred codecs properly.
3620TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
ossu29b1a8d2016-06-13 07:34:51 -07003621 // TODO(ossu): I'm not sure of the intent of this test. It's either:
3622 // - Check that our builtin codecs are usable by Channel.
3623 // - The codecs provided by the engine is usable by Channel.
3624 // It does not check that the codecs in the RecvParameters are actually
3625 // what we sent in - though it's probably reasonable to expect so, if
3626 // SetRecvParameters returns true.
3627 // I think it will become clear once audio decoder injection is completed.
3628 cricket::WebRtcVoiceEngine engine(
gyzhou95aa9642016-12-13 14:06:26 -08003629 nullptr, webrtc::CreateBuiltinAudioDecoderFactory(), nullptr);
skvlad11a9cbf2016-10-07 11:53:05 -07003630 webrtc::RtcEventLogNullImpl event_log;
kwiberg686a8ef2016-02-26 03:00:35 -08003631 std::unique_ptr<webrtc::Call> call(
skvlad11a9cbf2016-10-07 11:53:05 -07003632 webrtc::Call::Create(webrtc::Call::Config(&event_log)));
nisse51542be2016-02-12 02:27:06 -08003633 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3634 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003635 cricket::AudioRecvParameters parameters;
ossudedfd282016-06-14 07:12:39 -07003636 parameters.codecs = engine.recv_codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003637 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003638}