blob: 3953be6736fbab30885c3cb674966bbeedbeb801 [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
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010011#include "webrtc/pc/channel.h"
tfarina5237aaf2015-11-10 23:44:30 -080012#include "webrtc/base/arraysize.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000013#include "webrtc/base/byteorder.h"
14#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020015#include "webrtc/call.h"
stefanba4c0e42016-02-04 04:12:24 -080016#include "webrtc/p2p/base/faketransportcontroller.h"
17#include "webrtc/test/field_trial.h"
kjellandera96e2d72016-02-04 23:52:28 -080018#include "webrtc/media/base/constants.h"
19#include "webrtc/media/base/fakemediaengine.h"
20#include "webrtc/media/base/fakenetworkinterface.h"
21#include "webrtc/media/base/fakertp.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010022#include "webrtc/media/engine/fakewebrtccall.h"
23#include "webrtc/media/engine/fakewebrtcvoiceengine.h"
24#include "webrtc/media/engine/webrtcvoiceengine.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000025
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000026using cricket::kRtpAudioLevelHeaderExtension;
27using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
28
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020029namespace {
30
31const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
32const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
33const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
34const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
35const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
36const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
37const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
38const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
39const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, 0,
40 1, 0);
solenberg85a04962015-10-27 03:35:21 -070041const uint32_t kSsrc1 = 0x99;
42const uint32_t kSsrc2 = 0x98;
43const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000044
45class FakeVoEWrapper : public cricket::VoEWrapper {
46 public:
47 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
48 : cricket::VoEWrapper(engine, // processing
49 engine, // base
50 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000051 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052 engine, // network
53 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000054 engine) { // volume
55 }
56};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020057} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058
deadbeef884f5852016-01-15 09:20:04 -080059class FakeAudioSink : public webrtc::AudioSinkInterface {
60 public:
61 void OnData(const Data& audio) override {}
62};
63
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064class WebRtcVoiceEngineTestFake : public testing::Test {
65 public:
stefanba4c0e42016-02-04 04:12:24 -080066 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
67
68 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
Fredrik Solenberg709ed672015-09-15 12:26:33 +020069 : call_(webrtc::Call::Config()),
solenbergbd138382015-11-20 16:08:07 -080070 engine_(new FakeVoEWrapper(&voe_)),
stefanba4c0e42016-02-04 04:12:24 -080071 channel_(nullptr),
72 override_field_trials_(field_trials) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +020073 send_parameters_.codecs.push_back(kPcmuCodec);
74 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000075 }
solenberg1ac56142015-10-13 03:58:19 -070076 bool SetupEngine() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000077 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000078 return false;
79 }
nisse51542be2016-02-12 02:27:06 -080080 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
81 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +020082 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000083 }
solenberg1ac56142015-10-13 03:58:19 -070084 bool SetupEngineWithRecvStream() {
85 if (!SetupEngine()) {
86 return false;
87 }
88 return channel_->AddRecvStream(
89 cricket::StreamParams::CreateLegacy(kSsrc1));
90 }
91 bool SetupEngineWithSendStream() {
92 if (!SetupEngine()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000093 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000094 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000095 return channel_->AddSendStream(
96 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000097 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +000098 void SetupForMultiSendStream() {
solenberg1ac56142015-10-13 03:58:19 -070099 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700100 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800101 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700102 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700103 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800104 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000105 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000106 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200107 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000108 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000109 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200110 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000111 delete channel_;
112 engine_.Terminate();
113 }
114
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100115 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
116 const auto* send_stream = call_.GetAudioSendStream(ssrc);
117 EXPECT_TRUE(send_stream);
118 return *send_stream;
119 }
120
deadbeef884f5852016-01-15 09:20:04 -0800121 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
122 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
123 EXPECT_TRUE(recv_stream);
124 return *recv_stream;
125 }
126
solenberg3a941542015-11-16 07:34:50 -0800127 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
128 const auto* send_stream = call_.GetAudioSendStream(ssrc);
129 EXPECT_TRUE(send_stream);
130 return send_stream->GetConfig();
131 }
132
solenberg7add0582015-11-20 09:59:34 -0800133 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
134 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
135 EXPECT_TRUE(recv_stream);
136 return recv_stream->GetConfig();
137 }
138
Peter Boström0c4e06b2015-10-07 12:23:21 +0200139 void TestInsertDtmf(uint32_t ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000140 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
nisse51542be2016-02-12 02:27:06 -0800141 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
142 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200143 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000144 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700145 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000146 // send stream.
147 EXPECT_TRUE(channel_->AddSendStream(
148 cricket::StreamParams::CreateLegacy(kSsrc1)));
149 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000150
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000151 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200152 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000153 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
154 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800155 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200156 send_parameters_.codecs.push_back(kTelephoneEventCodec);
157 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000158 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000159
160 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700161 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800162 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000163 EXPECT_TRUE(channel_->AddSendStream(
164 cricket::StreamParams::CreateLegacy(kSsrc1)));
165 }
166
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000167 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800168 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000169
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100170 // Test send.
171 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
172 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
173 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800174 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100175 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
176 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
177 EXPECT_EQ(2, telephone_event.event_code);
178 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000179 }
180
181 // Test that send bandwidth is set correctly.
182 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000183 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
184 // |expected_result| is the expected result from SetMaxSendBandwidth().
185 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000186 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000187 int max_bitrate,
188 bool expected_result,
189 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200190 cricket::AudioSendParameters parameters;
191 parameters.codecs.push_back(codec);
192 parameters.max_bandwidth_bps = max_bitrate;
193 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
194
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000195 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000196 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000197 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000198 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000199 }
200
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000201 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenberg0a617e22015-10-20 15:49:38 -0700202 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000203
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000204 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800205 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000206
207 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200208 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000209 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200210 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800211 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000212
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000213 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200214 send_parameters_.extensions.clear();
215 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800216 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000217
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000218 // Ensure extension is set properly.
219 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200220 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
221 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800222 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
223 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
224 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000225
solenberg7add0582015-11-20 09:59:34 -0800226 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000227 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700228 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800229 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
230 call_.GetAudioSendStream(kSsrc2));
231 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
232 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
233 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000234
235 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200236 send_parameters_.codecs.push_back(kPcmuCodec);
237 send_parameters_.extensions.clear();
238 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800239 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
240 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000241 }
242
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000243 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700244 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000245
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000246 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800247 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000248
249 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800250 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000251 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800252 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
253 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000254
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000255 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800256 recv_parameters_.extensions.clear();
257 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
258 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000259
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000260 // Ensure extension is set properly.
261 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800262 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
263 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
264 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
265 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
266 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000267
solenberg7add0582015-11-20 09:59:34 -0800268 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000269 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700270 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800271 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
272 call_.GetAudioReceiveStream(kSsrc2));
273 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
274 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
275 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000276
277 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800278 recv_parameters_.extensions.clear();
279 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
280 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
281 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000282 }
283
solenberg85a04962015-10-27 03:35:21 -0700284 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
285 webrtc::AudioSendStream::Stats stats;
286 stats.local_ssrc = 12;
287 stats.bytes_sent = 345;
288 stats.packets_sent = 678;
289 stats.packets_lost = 9012;
290 stats.fraction_lost = 34.56f;
291 stats.codec_name = "codec_name_send";
292 stats.ext_seqnum = 789;
293 stats.jitter_ms = 12;
294 stats.rtt_ms = 345;
295 stats.audio_level = 678;
296 stats.aec_quality_min = 9.01f;
297 stats.echo_delay_median_ms = 234;
298 stats.echo_delay_std_ms = 567;
299 stats.echo_return_loss = 890;
300 stats.echo_return_loss_enhancement = 1234;
301 stats.typing_noise_detected = true;
302 return stats;
303 }
304 void SetAudioSendStreamStats() {
305 for (auto* s : call_.GetAudioSendStreams()) {
306 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200307 }
solenberg85a04962015-10-27 03:35:21 -0700308 }
solenberg566ef242015-11-06 15:34:49 -0800309 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
310 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700311 const auto stats = GetAudioSendStreamStats();
312 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
313 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
314 EXPECT_EQ(info.packets_sent, stats.packets_sent);
315 EXPECT_EQ(info.packets_lost, stats.packets_lost);
316 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
317 EXPECT_EQ(info.codec_name, stats.codec_name);
318 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
319 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
320 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
321 EXPECT_EQ(info.audio_level, stats.audio_level);
322 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
323 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
324 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
325 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
326 EXPECT_EQ(info.echo_return_loss_enhancement,
327 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800328 EXPECT_EQ(info.typing_noise_detected,
329 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700330 }
331
332 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
333 webrtc::AudioReceiveStream::Stats stats;
334 stats.remote_ssrc = 123;
335 stats.bytes_rcvd = 456;
336 stats.packets_rcvd = 768;
337 stats.packets_lost = 101;
338 stats.fraction_lost = 23.45f;
339 stats.codec_name = "codec_name_recv";
340 stats.ext_seqnum = 678;
341 stats.jitter_ms = 901;
342 stats.jitter_buffer_ms = 234;
343 stats.jitter_buffer_preferred_ms = 567;
344 stats.delay_estimate_ms = 890;
345 stats.audio_level = 1234;
346 stats.expand_rate = 5.67f;
347 stats.speech_expand_rate = 8.90f;
348 stats.secondary_decoded_rate = 1.23f;
349 stats.accelerate_rate = 4.56f;
350 stats.preemptive_expand_rate = 7.89f;
351 stats.decoding_calls_to_silence_generator = 12;
352 stats.decoding_calls_to_neteq = 345;
353 stats.decoding_normal = 67890;
354 stats.decoding_plc = 1234;
355 stats.decoding_cng = 5678;
356 stats.decoding_plc_cng = 9012;
357 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200358 return stats;
359 }
360 void SetAudioReceiveStreamStats() {
361 for (auto* s : call_.GetAudioReceiveStreams()) {
362 s->SetStats(GetAudioReceiveStreamStats());
363 }
364 }
365 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700366 const auto stats = GetAudioReceiveStreamStats();
367 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
368 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
369 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
370 EXPECT_EQ(info.packets_lost, stats.packets_lost);
371 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
372 EXPECT_EQ(info.codec_name, stats.codec_name);
373 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
374 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
375 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200376 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700377 stats.jitter_buffer_preferred_ms);
378 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
379 EXPECT_EQ(info.audio_level, stats.audio_level);
380 EXPECT_EQ(info.expand_rate, stats.expand_rate);
381 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
382 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
383 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
384 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200385 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700386 stats.decoding_calls_to_silence_generator);
387 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
388 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
389 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
390 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
391 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
392 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200393 }
394
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000395 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200396 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000397 cricket::FakeWebRtcVoiceEngine voe_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000398 cricket::WebRtcVoiceEngine engine_;
399 cricket::VoiceMediaChannel* channel_;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200400 cricket::AudioSendParameters send_parameters_;
401 cricket::AudioRecvParameters recv_parameters_;
stefanba4c0e42016-02-04 04:12:24 -0800402
403 private:
404 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000405};
406
407// Tests that our stub library "works".
408TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
409 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000410 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000411 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000412 engine_.Terminate();
413 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000414}
415
416// Tests that we can create and destroy a channel.
417TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000418 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
nisse51542be2016-02-12 02:27:06 -0800419 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
420 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200421 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000422}
423
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000424// Tests that the list of supported codecs is created properly and ordered
425// correctly
426TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
427 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
428 ASSERT_FALSE(codecs.empty());
429 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
430 EXPECT_EQ(48000, codecs[0].clockrate);
431 EXPECT_EQ(2, codecs[0].channels);
432 EXPECT_EQ(64000, codecs[0].bitrate);
433 int pref = codecs[0].preference;
434 for (size_t i = 1; i < codecs.size(); ++i) {
435 EXPECT_GT(pref, codecs[i].preference);
436 pref = codecs[i].preference;
437 }
438}
439
stefanba4c0e42016-02-04 04:12:24 -0800440TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
441 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
442 bool opus_found = false;
443 for (cricket::AudioCodec codec : codecs) {
444 if (codec.name == "opus") {
445 EXPECT_TRUE(HasTransportCc(codec));
446 opus_found = true;
447 }
448 }
449 EXPECT_TRUE(opus_found);
450}
451
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000452// Tests that we can find codecs by name or id, and that we interpret the
453// clockrate and bitrate fields properly.
454TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
455 cricket::AudioCodec codec;
456 webrtc::CodecInst codec_inst;
457 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800458 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000459 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800460 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000461 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800462 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
463 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000464 // Find ISAC with a different payload id.
465 codec = kIsacCodec;
466 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800467 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000468 EXPECT_EQ(codec.id, codec_inst.pltype);
469 // Find PCMU with a 0 clockrate.
470 codec = kPcmuCodec;
471 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800472 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000473 EXPECT_EQ(codec.id, codec_inst.pltype);
474 EXPECT_EQ(8000, codec_inst.plfreq);
475 // Find PCMU with a 0 bitrate.
476 codec = kPcmuCodec;
477 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800478 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000479 EXPECT_EQ(codec.id, codec_inst.pltype);
480 EXPECT_EQ(64000, codec_inst.rate);
481 // Find ISAC with an explicit bitrate.
482 codec = kIsacCodec;
483 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800484 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000485 EXPECT_EQ(codec.id, codec_inst.pltype);
486 EXPECT_EQ(32000, codec_inst.rate);
487}
488
489// Test that we set our inbound codecs properly, including changing PT.
490TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
491 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200492 cricket::AudioRecvParameters parameters;
493 parameters.codecs.push_back(kIsacCodec);
494 parameters.codecs.push_back(kPcmuCodec);
495 parameters.codecs.push_back(kTelephoneEventCodec);
496 parameters.codecs[0].id = 106; // collide with existing telephone-event
497 parameters.codecs[2].id = 126;
498 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700499 EXPECT_TRUE(channel_->AddRecvStream(
500 cricket::StreamParams::CreateLegacy(kSsrc1)));
501 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000502 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800503 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000504 gcodec.plfreq = 16000;
505 gcodec.channels = 1;
506 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
507 EXPECT_EQ(106, gcodec.pltype);
508 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800509 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000510 gcodec.plfreq = 8000;
511 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
512 EXPECT_EQ(126, gcodec.pltype);
513 EXPECT_STREQ("telephone-event", gcodec.plname);
514}
515
516// Test that we fail to set an unknown inbound codec.
517TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
518 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200519 cricket::AudioRecvParameters parameters;
520 parameters.codecs.push_back(kIsacCodec);
521 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
522 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000523}
524
525// Test that we fail if we have duplicate types in the inbound list.
526TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
527 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200528 cricket::AudioRecvParameters parameters;
529 parameters.codecs.push_back(kIsacCodec);
530 parameters.codecs.push_back(kCn16000Codec);
531 parameters.codecs[1].id = kIsacCodec.id;
532 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000533}
534
535// Test that we can decode OPUS without stereo parameters.
536TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
537 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200538 cricket::AudioRecvParameters parameters;
539 parameters.codecs.push_back(kIsacCodec);
540 parameters.codecs.push_back(kPcmuCodec);
541 parameters.codecs.push_back(kOpusCodec);
542 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000543 EXPECT_TRUE(channel_->AddRecvStream(
544 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700545 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000546 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800547 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000548 // Even without stereo parameters, recv codecs still specify channels = 2.
549 EXPECT_EQ(2, opus.channels);
550 EXPECT_EQ(111, opus.pltype);
551 EXPECT_STREQ("opus", opus.plname);
552 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700553 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000554 EXPECT_EQ(111, opus.pltype);
555}
556
557// Test that we can decode OPUS with stereo = 0.
558TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
559 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200560 cricket::AudioRecvParameters parameters;
561 parameters.codecs.push_back(kIsacCodec);
562 parameters.codecs.push_back(kPcmuCodec);
563 parameters.codecs.push_back(kOpusCodec);
564 parameters.codecs[2].params["stereo"] = "0";
565 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000566 EXPECT_TRUE(channel_->AddRecvStream(
567 cricket::StreamParams::CreateLegacy(kSsrc1)));
568 int channel_num2 = voe_.GetLastChannel();
569 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800570 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000571 // Even when stereo is off, recv codecs still specify channels = 2.
572 EXPECT_EQ(2, opus.channels);
573 EXPECT_EQ(111, opus.pltype);
574 EXPECT_STREQ("opus", opus.plname);
575 opus.pltype = 0;
576 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
577 EXPECT_EQ(111, opus.pltype);
578}
579
580// Test that we can decode OPUS with stereo = 1.
581TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
582 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200583 cricket::AudioRecvParameters parameters;
584 parameters.codecs.push_back(kIsacCodec);
585 parameters.codecs.push_back(kPcmuCodec);
586 parameters.codecs.push_back(kOpusCodec);
587 parameters.codecs[2].params["stereo"] = "1";
588 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000589 EXPECT_TRUE(channel_->AddRecvStream(
590 cricket::StreamParams::CreateLegacy(kSsrc1)));
591 int channel_num2 = voe_.GetLastChannel();
592 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800593 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000594 EXPECT_EQ(2, opus.channels);
595 EXPECT_EQ(111, opus.pltype);
596 EXPECT_STREQ("opus", opus.plname);
597 opus.pltype = 0;
598 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
599 EXPECT_EQ(111, opus.pltype);
600}
601
602// Test that changes to recv codecs are applied to all streams.
603TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
604 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200605 cricket::AudioRecvParameters parameters;
606 parameters.codecs.push_back(kIsacCodec);
607 parameters.codecs.push_back(kPcmuCodec);
608 parameters.codecs.push_back(kTelephoneEventCodec);
609 parameters.codecs[0].id = 106; // collide with existing telephone-event
610 parameters.codecs[2].id = 126;
611 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000612 EXPECT_TRUE(channel_->AddRecvStream(
613 cricket::StreamParams::CreateLegacy(kSsrc1)));
614 int channel_num2 = voe_.GetLastChannel();
615 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800616 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617 gcodec.plfreq = 16000;
618 gcodec.channels = 1;
619 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
620 EXPECT_EQ(106, gcodec.pltype);
621 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800622 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000623 gcodec.plfreq = 8000;
624 gcodec.channels = 1;
625 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
626 EXPECT_EQ(126, gcodec.pltype);
627 EXPECT_STREQ("telephone-event", gcodec.plname);
628}
629
630TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenberg1ac56142015-10-13 03:58:19 -0700631 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200632 cricket::AudioRecvParameters parameters;
633 parameters.codecs.push_back(kIsacCodec);
634 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200635 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000636
637 int channel_num2 = voe_.GetLastChannel();
638 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800639 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000640 gcodec.plfreq = 16000;
641 gcodec.channels = 1;
642 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
643 EXPECT_EQ(106, gcodec.pltype);
644 EXPECT_STREQ("ISAC", gcodec.plname);
645}
646
647// Test that we can apply the same set of codecs again while playing.
648TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700649 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200650 cricket::AudioRecvParameters parameters;
651 parameters.codecs.push_back(kIsacCodec);
652 parameters.codecs.push_back(kCn16000Codec);
653 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200655 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000656
657 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200658 parameters.codecs[0].id = 127;
659 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
660 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000661 EXPECT_TRUE(voe_.GetPlayout(channel_num));
662}
663
664// Test that we can add a codec while playing.
665TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700666 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200667 cricket::AudioRecvParameters parameters;
668 parameters.codecs.push_back(kIsacCodec);
669 parameters.codecs.push_back(kCn16000Codec);
670 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000671 EXPECT_TRUE(channel_->SetPlayout(true));
672
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200673 parameters.codecs.push_back(kOpusCodec);
674 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
675 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000676 EXPECT_TRUE(voe_.GetPlayout(channel_num));
677 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800678 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000679 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
680}
681
682TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenberg1ac56142015-10-13 03:58:19 -0700683 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000684
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000685 // Test that when autobw is enabled, bitrate is kept as the default
686 // value. autobw is enabled for the following tests because the target
687 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000688
689 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000690 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000691
692 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000693 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000694
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000695 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000696 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000697}
698
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000699TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700700 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000701
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000702 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000703
704 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000705 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
706 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000707
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000708 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000709 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
710 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000711}
712
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000713TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700714 EXPECT_TRUE(SetupEngineWithSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000715
716 // Test that we can only set a maximum bitrate for a fixed-rate codec
717 // if it's bigger than the fixed rate.
718
719 // PCMU, fixed bitrate == 64000.
720 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
721 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
722 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
723 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
724 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
725 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
726 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
727}
728
729TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -0700730 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200731 const int kDesiredBitrate = 128000;
732 cricket::AudioSendParameters parameters;
733 parameters.codecs = engine_.codecs();
734 parameters.max_bandwidth_bps = kDesiredBitrate;
735 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000736
737 EXPECT_TRUE(channel_->AddSendStream(
738 cricket::StreamParams::CreateLegacy(kSsrc1)));
739
740 int channel_num = voe_.GetLastChannel();
741 webrtc::CodecInst codec;
742 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200743 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000744}
745
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000746// Test that bitrate cannot be set for CBR codecs.
747// Bitrate is ignored if it is higher than the fixed bitrate.
748// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000749TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenberg1ac56142015-10-13 03:58:19 -0700750 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000751
752 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200753 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
754 int channel_num = voe_.GetLastChannel();
755 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000756 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
757 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200758
759 send_parameters_.max_bandwidth_bps = 128000;
760 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000761 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
762 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200763
764 send_parameters_.max_bandwidth_bps = 128;
765 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000766 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
767 EXPECT_EQ(64000, codec.rate);
768}
769
770// Test that we apply codecs properly.
771TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenberg1ac56142015-10-13 03:58:19 -0700772 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200773 cricket::AudioSendParameters parameters;
774 parameters.codecs.push_back(kIsacCodec);
775 parameters.codecs.push_back(kPcmuCodec);
776 parameters.codecs.push_back(kRedCodec);
777 parameters.codecs[0].id = 96;
778 parameters.codecs[0].bitrate = 48000;
779 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000780 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200781 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000782 webrtc::CodecInst gcodec;
783 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
784 EXPECT_EQ(96, gcodec.pltype);
785 EXPECT_EQ(48000, gcodec.rate);
786 EXPECT_STREQ("ISAC", gcodec.plname);
787 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000788 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000789 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
790 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100791 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000792}
793
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000794// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
795// to apply.
796TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenberg1ac56142015-10-13 03:58:19 -0700797 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200798 cricket::AudioSendParameters parameters;
799 parameters.codecs.push_back(kIsacCodec);
800 parameters.codecs.push_back(kPcmuCodec);
801 parameters.codecs.push_back(kRedCodec);
802 parameters.codecs[0].id = 96;
803 parameters.codecs[0].bitrate = 48000;
804 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000805 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
806 // Calling SetSendCodec again with same codec which is already set.
807 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200808 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000809 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
810}
811
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000812// Verify that G722 is set with 16000 samples per second to WebRTC.
813TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenberg1ac56142015-10-13 03:58:19 -0700814 EXPECT_TRUE(SetupEngineWithSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000815 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200816 cricket::AudioSendParameters parameters;
817 parameters.codecs.push_back(kG722CodecSdp);
818 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000819 webrtc::CodecInst gcodec;
820 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
821 EXPECT_STREQ("G722", gcodec.plname);
822 EXPECT_EQ(1, gcodec.channels);
823 EXPECT_EQ(16000, gcodec.plfreq);
824}
825
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000826// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000827TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenberg1ac56142015-10-13 03:58:19 -0700828 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200829 cricket::AudioSendParameters parameters;
830 parameters.codecs.push_back(kOpusCodec);
831 parameters.codecs[0].bitrate = 0;
832 parameters.codecs[0].clockrate = 50000;
833 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000834}
835
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000836// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000837TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700838 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200839 cricket::AudioSendParameters parameters;
840 parameters.codecs.push_back(kOpusCodec);
841 parameters.codecs[0].bitrate = 0;
842 parameters.codecs[0].channels = 0;
843 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000844}
845
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000846// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000847TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700848 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200849 cricket::AudioSendParameters parameters;
850 parameters.codecs.push_back(kOpusCodec);
851 parameters.codecs[0].bitrate = 0;
852 parameters.codecs[0].channels = 0;
853 parameters.codecs[0].params["stereo"] = "1";
854 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000855}
856
857// Test that if channel is 1 for opus and there's no stereo, we fail.
858TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700859 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200860 cricket::AudioSendParameters parameters;
861 parameters.codecs.push_back(kOpusCodec);
862 parameters.codecs[0].bitrate = 0;
863 parameters.codecs[0].channels = 1;
864 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000865}
866
867// Test that if channel is 1 for opus and stereo=0, we fail.
868TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700869 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200870 cricket::AudioSendParameters parameters;
871 parameters.codecs.push_back(kOpusCodec);
872 parameters.codecs[0].bitrate = 0;
873 parameters.codecs[0].channels = 1;
874 parameters.codecs[0].params["stereo"] = "0";
875 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000876}
877
878// Test that if channel is 1 for opus and stereo=1, we fail.
879TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700880 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200881 cricket::AudioSendParameters parameters;
882 parameters.codecs.push_back(kOpusCodec);
883 parameters.codecs[0].bitrate = 0;
884 parameters.codecs[0].channels = 1;
885 parameters.codecs[0].params["stereo"] = "1";
886 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000887}
888
889// Test that with bitrate=0 and no stereo,
890// channels and bitrate are 1 and 32000.
891TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700892 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000893 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200894 cricket::AudioSendParameters parameters;
895 parameters.codecs.push_back(kOpusCodec);
896 parameters.codecs[0].bitrate = 0;
897 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000898 webrtc::CodecInst gcodec;
899 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
900 EXPECT_STREQ("opus", gcodec.plname);
901 EXPECT_EQ(1, gcodec.channels);
902 EXPECT_EQ(32000, gcodec.rate);
903}
904
905// Test that with bitrate=0 and stereo=0,
906// channels and bitrate are 1 and 32000.
907TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700908 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000909 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200910 cricket::AudioSendParameters parameters;
911 parameters.codecs.push_back(kOpusCodec);
912 parameters.codecs[0].bitrate = 0;
913 parameters.codecs[0].params["stereo"] = "0";
914 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000915 webrtc::CodecInst gcodec;
916 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
917 EXPECT_STREQ("opus", gcodec.plname);
918 EXPECT_EQ(1, gcodec.channels);
919 EXPECT_EQ(32000, gcodec.rate);
920}
921
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000922// Test that with bitrate=invalid and stereo=0,
923// channels and bitrate are 1 and 32000.
924TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700925 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000926 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200927 cricket::AudioSendParameters parameters;
928 parameters.codecs.push_back(kOpusCodec);
929 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000930 webrtc::CodecInst gcodec;
931
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000932 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200933 parameters.codecs[0].bitrate = 5999;
934 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000935 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
936 EXPECT_STREQ("opus", gcodec.plname);
937 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000938 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000939
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200940 parameters.codecs[0].bitrate = 510001;
941 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000942 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
943 EXPECT_STREQ("opus", gcodec.plname);
944 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000945 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000946}
947
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000948// Test that with bitrate=0 and stereo=1,
949// channels and bitrate are 2 and 64000.
950TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700951 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000952 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200953 cricket::AudioSendParameters parameters;
954 parameters.codecs.push_back(kOpusCodec);
955 parameters.codecs[0].bitrate = 0;
956 parameters.codecs[0].params["stereo"] = "1";
957 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000958 webrtc::CodecInst gcodec;
959 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
960 EXPECT_STREQ("opus", gcodec.plname);
961 EXPECT_EQ(2, gcodec.channels);
962 EXPECT_EQ(64000, gcodec.rate);
963}
964
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000965// Test that with bitrate=invalid and stereo=1,
966// channels and bitrate are 2 and 64000.
967TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700968 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000969 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200970 cricket::AudioSendParameters parameters;
971 parameters.codecs.push_back(kOpusCodec);
972 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000973 webrtc::CodecInst gcodec;
974
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000975 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200976 parameters.codecs[0].bitrate = 5999;
977 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000978 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
979 EXPECT_STREQ("opus", gcodec.plname);
980 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000981 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000982
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200983 parameters.codecs[0].bitrate = 510001;
984 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000985 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
986 EXPECT_STREQ("opus", gcodec.plname);
987 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000988 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000989}
990
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000991// Test that with bitrate=N and stereo unset,
992// channels and bitrate are 1 and N.
993TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700994 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000995 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200996 cricket::AudioSendParameters parameters;
997 parameters.codecs.push_back(kOpusCodec);
998 parameters.codecs[0].bitrate = 96000;
999 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001000 webrtc::CodecInst gcodec;
1001 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1002 EXPECT_EQ(111, gcodec.pltype);
1003 EXPECT_EQ(96000, gcodec.rate);
1004 EXPECT_STREQ("opus", gcodec.plname);
1005 EXPECT_EQ(1, gcodec.channels);
1006 EXPECT_EQ(48000, gcodec.plfreq);
1007}
1008
1009// Test that with bitrate=N and stereo=0,
1010// channels and bitrate are 1 and N.
1011TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001012 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001013 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001014 cricket::AudioSendParameters parameters;
1015 parameters.codecs.push_back(kOpusCodec);
1016 parameters.codecs[0].bitrate = 30000;
1017 parameters.codecs[0].params["stereo"] = "0";
1018 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001019 webrtc::CodecInst gcodec;
1020 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1021 EXPECT_EQ(1, gcodec.channels);
1022 EXPECT_EQ(30000, gcodec.rate);
1023 EXPECT_STREQ("opus", gcodec.plname);
1024}
1025
1026// Test that with bitrate=N and without any parameters,
1027// channels and bitrate are 1 and N.
1028TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenberg1ac56142015-10-13 03:58:19 -07001029 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001030 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001031 cricket::AudioSendParameters parameters;
1032 parameters.codecs.push_back(kOpusCodec);
1033 parameters.codecs[0].bitrate = 30000;
1034 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001035 webrtc::CodecInst gcodec;
1036 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1037 EXPECT_EQ(1, gcodec.channels);
1038 EXPECT_EQ(30000, gcodec.rate);
1039 EXPECT_STREQ("opus", gcodec.plname);
1040}
1041
1042// Test that with bitrate=N and stereo=1,
1043// channels and bitrate are 2 and N.
1044TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001045 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001046 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001047 cricket::AudioSendParameters parameters;
1048 parameters.codecs.push_back(kOpusCodec);
1049 parameters.codecs[0].bitrate = 30000;
1050 parameters.codecs[0].params["stereo"] = "1";
1051 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001052 webrtc::CodecInst gcodec;
1053 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1054 EXPECT_EQ(2, gcodec.channels);
1055 EXPECT_EQ(30000, gcodec.rate);
1056 EXPECT_STREQ("opus", gcodec.plname);
1057}
1058
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001059// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1060// Also test that the "maxaveragebitrate" can't be set to values outside the
1061// range of 6000 and 510000
1062TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001063 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001064 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001065 cricket::AudioSendParameters parameters;
1066 parameters.codecs.push_back(kOpusCodec);
1067 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001068 webrtc::CodecInst gcodec;
1069
1070 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001071 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1072 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001073 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001074 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001075
1076 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001077 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1078 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001079 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001080 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001081
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001082 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1083 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001084 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1085 EXPECT_EQ(200000, gcodec.rate);
1086}
1087
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001088// Test that we can enable NACK with opus as caller.
1089TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001090 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001091 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001092 cricket::AudioSendParameters parameters;
1093 parameters.codecs.push_back(kOpusCodec);
1094 parameters.codecs[0].AddFeedbackParam(
1095 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1096 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001097 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001098 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001099 EXPECT_TRUE(voe_.GetNACK(channel_num));
1100}
1101
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001102// Test that we can enable NACK with opus as callee.
1103TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenberg0a617e22015-10-20 15:49:38 -07001104 EXPECT_TRUE(SetupEngineWithRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001105 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001106 cricket::AudioSendParameters parameters;
1107 parameters.codecs.push_back(kOpusCodec);
1108 parameters.codecs[0].AddFeedbackParam(
1109 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1110 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001111 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001112 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001113 EXPECT_FALSE(voe_.GetNACK(channel_num));
1114
1115 EXPECT_TRUE(channel_->AddSendStream(
1116 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001117 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001118}
1119
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001120// Test that we can enable NACK on receive streams.
1121TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001122 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001123 int channel_num1 = voe_.GetLastChannel();
1124 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1125 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001126 cricket::AudioSendParameters parameters;
1127 parameters.codecs.push_back(kOpusCodec);
1128 parameters.codecs[0].AddFeedbackParam(
1129 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1130 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001131 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1132 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001133 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001134 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1135 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1136}
1137
1138// Test that we can disable NACK.
1139TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001140 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001141 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001142 cricket::AudioSendParameters parameters;
1143 parameters.codecs.push_back(kOpusCodec);
1144 parameters.codecs[0].AddFeedbackParam(
1145 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1146 cricket::kParamValueEmpty));
1147 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001148 EXPECT_TRUE(voe_.GetNACK(channel_num));
1149
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001150 parameters.codecs.clear();
1151 parameters.codecs.push_back(kOpusCodec);
1152 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001153 EXPECT_FALSE(voe_.GetNACK(channel_num));
1154}
1155
1156// Test that we can disable NACK on receive streams.
1157TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001158 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001159 int channel_num1 = voe_.GetLastChannel();
1160 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1161 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001162 cricket::AudioSendParameters parameters;
1163 parameters.codecs.push_back(kOpusCodec);
1164 parameters.codecs[0].AddFeedbackParam(
1165 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1166 cricket::kParamValueEmpty));
1167 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001168 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1169 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1170
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001171 parameters.codecs.clear();
1172 parameters.codecs.push_back(kOpusCodec);
1173 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001174 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1175 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1176}
1177
1178// Test that NACK is enabled on a new receive stream.
1179TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001180 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001181 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001182 cricket::AudioSendParameters parameters;
1183 parameters.codecs.push_back(kIsacCodec);
1184 parameters.codecs.push_back(kCn16000Codec);
1185 parameters.codecs[0].AddFeedbackParam(
1186 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1187 cricket::kParamValueEmpty));
1188 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001189 EXPECT_TRUE(voe_.GetNACK(channel_num));
1190
1191 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1192 channel_num = voe_.GetLastChannel();
1193 EXPECT_TRUE(voe_.GetNACK(channel_num));
1194 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1195 channel_num = voe_.GetLastChannel();
1196 EXPECT_TRUE(voe_.GetNACK(channel_num));
1197}
1198
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001199// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001200TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenberg1ac56142015-10-13 03:58:19 -07001201 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001202 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001203 cricket::AudioSendParameters parameters;
1204 parameters.codecs.push_back(kOpusCodec);
1205 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001206 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1207}
1208
1209// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001210TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001211 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001212 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001213 cricket::AudioSendParameters parameters;
1214 parameters.codecs.push_back(kOpusCodec);
1215 parameters.codecs[0].bitrate = 0;
1216 parameters.codecs[0].params["useinbandfec"] = "0";
1217 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001218 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1219 webrtc::CodecInst gcodec;
1220 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1221 EXPECT_STREQ("opus", gcodec.plname);
1222 EXPECT_EQ(1, gcodec.channels);
1223 EXPECT_EQ(32000, gcodec.rate);
1224}
1225
1226// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001227TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001228 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001229 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001230 cricket::AudioSendParameters parameters;
1231 parameters.codecs.push_back(kOpusCodec);
1232 parameters.codecs[0].bitrate = 0;
1233 parameters.codecs[0].params["useinbandfec"] = "1";
1234 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001235 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1236 webrtc::CodecInst gcodec;
1237 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1238 EXPECT_STREQ("opus", gcodec.plname);
1239 EXPECT_EQ(1, gcodec.channels);
1240 EXPECT_EQ(32000, gcodec.rate);
1241}
1242
1243// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001244TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001245 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001246 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001247 cricket::AudioSendParameters parameters;
1248 parameters.codecs.push_back(kOpusCodec);
1249 parameters.codecs[0].bitrate = 0;
1250 parameters.codecs[0].params["stereo"] = "1";
1251 parameters.codecs[0].params["useinbandfec"] = "1";
1252 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001253 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1254 webrtc::CodecInst gcodec;
1255 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1256 EXPECT_STREQ("opus", gcodec.plname);
1257 EXPECT_EQ(2, gcodec.channels);
1258 EXPECT_EQ(64000, gcodec.rate);
1259}
1260
1261// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001262TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001263 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001264 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001265 cricket::AudioSendParameters parameters;
1266 parameters.codecs.push_back(kIsacCodec);
1267 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001268 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1269}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001270
1271// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1272TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001273 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001274 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001275 cricket::AudioSendParameters parameters;
1276 parameters.codecs.push_back(kIsacCodec);
1277 parameters.codecs[0].params["useinbandfec"] = "1";
1278 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001279 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1280}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001281
1282// Test that Opus FEC status can be changed.
1283TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenberg1ac56142015-10-13 03:58:19 -07001284 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001285 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001286 cricket::AudioSendParameters parameters;
1287 parameters.codecs.push_back(kOpusCodec);
1288 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001289 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001290 parameters.codecs[0].params["useinbandfec"] = "1";
1291 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001292 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1293}
1294
stefanba4c0e42016-02-04 04:12:24 -08001295TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
1296 EXPECT_TRUE(SetupEngine());
1297 cricket::AudioSendParameters send_parameters;
1298 send_parameters.codecs.push_back(kOpusCodec);
1299 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1300 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1301
1302 cricket::AudioRecvParameters recv_parameters;
1303 recv_parameters.codecs.push_back(kIsacCodec);
1304 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1305 EXPECT_TRUE(
1306 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1307 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1308 EXPECT_FALSE(
1309 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1310
1311 send_parameters.codecs = engine_.codecs();
1312 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1313 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1314 EXPECT_TRUE(
1315 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1316}
1317
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001318// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1319TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenberg1ac56142015-10-13 03:58:19 -07001320 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001321 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001322 cricket::AudioSendParameters parameters;
1323 parameters.codecs.push_back(kOpusCodec);
1324 parameters.codecs[0].bitrate = 0;
1325 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1326 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001327 EXPECT_EQ(cricket::kOpusBandwidthNb,
1328 voe_.GetMaxEncodingBandwidth(channel_num));
1329 webrtc::CodecInst gcodec;
1330 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1331 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001332
1333 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001334 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1335 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001336 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1337 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001338}
1339
1340// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1341TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenberg1ac56142015-10-13 03:58:19 -07001342 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001343 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001344 cricket::AudioSendParameters parameters;
1345 parameters.codecs.push_back(kOpusCodec);
1346 parameters.codecs[0].bitrate = 0;
1347 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1348 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001349 EXPECT_EQ(cricket::kOpusBandwidthMb,
1350 voe_.GetMaxEncodingBandwidth(channel_num));
1351 webrtc::CodecInst gcodec;
1352 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1353 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001354
1355 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001356 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1357 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001358 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1359 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001360}
1361
1362// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1363TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenberg1ac56142015-10-13 03:58:19 -07001364 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001365 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001366 cricket::AudioSendParameters parameters;
1367 parameters.codecs.push_back(kOpusCodec);
1368 parameters.codecs[0].bitrate = 0;
1369 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1370 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001371 EXPECT_EQ(cricket::kOpusBandwidthWb,
1372 voe_.GetMaxEncodingBandwidth(channel_num));
1373 webrtc::CodecInst gcodec;
1374 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1375 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001376
1377 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001378 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1379 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001380 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1381 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001382}
1383
1384// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1385TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenberg1ac56142015-10-13 03:58:19 -07001386 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001387 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001388 cricket::AudioSendParameters parameters;
1389 parameters.codecs.push_back(kOpusCodec);
1390 parameters.codecs[0].bitrate = 0;
1391 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1392 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001393 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1394 voe_.GetMaxEncodingBandwidth(channel_num));
1395 webrtc::CodecInst gcodec;
1396 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1397 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001398
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001399 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001400 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1401 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001402 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1403 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001404}
1405
1406// Test 24000 < maxplaybackrate triggers Opus full band mode.
1407TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenberg1ac56142015-10-13 03:58:19 -07001408 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001409 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001410 cricket::AudioSendParameters parameters;
1411 parameters.codecs.push_back(kOpusCodec);
1412 parameters.codecs[0].bitrate = 0;
1413 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1414 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001415 EXPECT_EQ(cricket::kOpusBandwidthFb,
1416 voe_.GetMaxEncodingBandwidth(channel_num));
1417 webrtc::CodecInst gcodec;
1418 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1419 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001420
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001421 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001422 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1423 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001424 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1425 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001426}
1427
1428// Test Opus that without maxplaybackrate, default playback rate is used.
1429TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001430 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001431 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001432 cricket::AudioSendParameters parameters;
1433 parameters.codecs.push_back(kOpusCodec);
1434 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001435 EXPECT_EQ(cricket::kOpusBandwidthFb,
1436 voe_.GetMaxEncodingBandwidth(channel_num));
1437}
1438
1439// Test the with non-Opus, maxplaybackrate has no effect.
1440TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001441 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001442 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001443 cricket::AudioSendParameters parameters;
1444 parameters.codecs.push_back(kIsacCodec);
1445 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1446 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001447 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1448}
1449
1450// Test maxplaybackrate can be set on two streams.
1451TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001452 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001453 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001454 cricket::AudioSendParameters parameters;
1455 parameters.codecs.push_back(kOpusCodec);
1456 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001457 // Default bandwidth is 24000.
1458 EXPECT_EQ(cricket::kOpusBandwidthFb,
1459 voe_.GetMaxEncodingBandwidth(channel_num));
1460
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001461 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001462
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001463 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001464 EXPECT_EQ(cricket::kOpusBandwidthNb,
1465 voe_.GetMaxEncodingBandwidth(channel_num));
1466
1467 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1468 channel_num = voe_.GetLastChannel();
1469 EXPECT_EQ(cricket::kOpusBandwidthNb,
1470 voe_.GetMaxEncodingBandwidth(channel_num));
1471}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001472
Minyue Li7100dcd2015-03-27 05:05:59 +01001473// Test that with usedtx=0, Opus DTX is off.
1474TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001475 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001476 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001477 cricket::AudioSendParameters parameters;
1478 parameters.codecs.push_back(kOpusCodec);
1479 parameters.codecs[0].params["usedtx"] = "0";
1480 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001481 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1482}
1483
1484// Test that with usedtx=1, Opus DTX is on.
1485TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001486 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001487 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001488 cricket::AudioSendParameters parameters;
1489 parameters.codecs.push_back(kOpusCodec);
1490 parameters.codecs[0].params["usedtx"] = "1";
1491 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001492 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1493 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1494}
1495
1496// Test that usedtx=1 works with stereo Opus.
1497TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001498 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001499 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001500 cricket::AudioSendParameters parameters;
1501 parameters.codecs.push_back(kOpusCodec);
1502 parameters.codecs[0].params["usedtx"] = "1";
1503 parameters.codecs[0].params["stereo"] = "1";
1504 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001505 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1506 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1507}
1508
1509// Test that usedtx=1 does not work with non Opus.
1510TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001511 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001512 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001513 cricket::AudioSendParameters parameters;
1514 parameters.codecs.push_back(kIsacCodec);
1515 parameters.codecs[0].params["usedtx"] = "1";
1516 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001517 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1518}
1519
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001520// Test that we can switch back and forth between Opus and ISAC with CN.
1521TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenberg1ac56142015-10-13 03:58:19 -07001522 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001523 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001524 cricket::AudioSendParameters opus_parameters;
1525 opus_parameters.codecs.push_back(kOpusCodec);
1526 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001527 webrtc::CodecInst gcodec;
1528 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001529 EXPECT_EQ(111, gcodec.pltype);
1530 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001531
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001532 cricket::AudioSendParameters isac_parameters;
1533 isac_parameters.codecs.push_back(kIsacCodec);
1534 isac_parameters.codecs.push_back(kCn16000Codec);
1535 isac_parameters.codecs.push_back(kOpusCodec);
1536 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001537 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1538 EXPECT_EQ(103, gcodec.pltype);
1539 EXPECT_STREQ("ISAC", gcodec.plname);
1540
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001541 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001542 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001543 EXPECT_EQ(111, gcodec.pltype);
1544 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001545}
1546
1547// Test that we handle various ways of specifying bitrate.
1548TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001549 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001550 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001551 cricket::AudioSendParameters parameters;
1552 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1553 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001554 webrtc::CodecInst gcodec;
1555 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1556 EXPECT_EQ(103, gcodec.pltype);
1557 EXPECT_STREQ("ISAC", gcodec.plname);
1558 EXPECT_EQ(32000, gcodec.rate);
1559
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001560 parameters.codecs[0].bitrate = 0; // bitrate == default
1561 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001562 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1563 EXPECT_EQ(103, gcodec.pltype);
1564 EXPECT_STREQ("ISAC", gcodec.plname);
1565 EXPECT_EQ(-1, gcodec.rate);
1566
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001567 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1568 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001569 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1570 EXPECT_EQ(103, gcodec.pltype);
1571 EXPECT_STREQ("ISAC", gcodec.plname);
1572 EXPECT_EQ(28000, gcodec.rate);
1573
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001574 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1575 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001576 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1577 EXPECT_EQ(0, gcodec.pltype);
1578 EXPECT_STREQ("PCMU", gcodec.plname);
1579 EXPECT_EQ(64000, gcodec.rate);
1580
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001581 parameters.codecs[0].bitrate = 0; // bitrate == default
1582 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001583 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1584 EXPECT_EQ(0, gcodec.pltype);
1585 EXPECT_STREQ("PCMU", gcodec.plname);
1586 EXPECT_EQ(64000, gcodec.rate);
1587
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001588 parameters.codecs[0] = kOpusCodec;
1589 parameters.codecs[0].bitrate = 0; // bitrate == default
1590 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001591 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1592 EXPECT_EQ(111, gcodec.pltype);
1593 EXPECT_STREQ("opus", gcodec.plname);
1594 EXPECT_EQ(32000, gcodec.rate);
1595}
1596
Brave Yao5225dd82015-03-26 07:39:19 +08001597// Test that we could set packet size specified in kCodecParamPTime.
1598TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenberg1ac56142015-10-13 03:58:19 -07001599 EXPECT_TRUE(SetupEngineWithSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001600 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001601 cricket::AudioSendParameters parameters;
1602 parameters.codecs.push_back(kOpusCodec);
1603 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1604 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001605 webrtc::CodecInst gcodec;
1606 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1607 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1608
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001609 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1610 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001611 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1612 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1613
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001614 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1615 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001616 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1617 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1618
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001619 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1620 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1621 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001622 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1623 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1624
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001625 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1626 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1627 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001628 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1629 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1630}
1631
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001632// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001633TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenberg1ac56142015-10-13 03:58:19 -07001634 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001635 cricket::AudioSendParameters parameters;
1636 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001637}
1638
1639// Test that we can set send codecs even with telephone-event codec as the first
1640// one on the list.
1641TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001642 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001643 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001644 cricket::AudioSendParameters parameters;
1645 parameters.codecs.push_back(kTelephoneEventCodec);
1646 parameters.codecs.push_back(kIsacCodec);
1647 parameters.codecs.push_back(kPcmuCodec);
1648 parameters.codecs[0].id = 98; // DTMF
1649 parameters.codecs[1].id = 96;
1650 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001651 webrtc::CodecInst gcodec;
1652 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001653 EXPECT_EQ(96, gcodec.pltype);
1654 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001655 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001656}
1657
1658// Test that we can set send codecs even with CN codec as the first
1659// one on the list.
1660TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001661 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001662 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001663 cricket::AudioSendParameters parameters;
1664 parameters.codecs.push_back(kCn16000Codec);
1665 parameters.codecs.push_back(kIsacCodec);
1666 parameters.codecs.push_back(kPcmuCodec);
1667 parameters.codecs[0].id = 98; // wideband CN
1668 parameters.codecs[1].id = 96;
1669 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001670 webrtc::CodecInst gcodec;
1671 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1672 EXPECT_EQ(96, gcodec.pltype);
1673 EXPECT_STREQ("ISAC", gcodec.plname);
1674 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001675}
1676
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001677// Test that we set VAD and DTMF types correctly as caller.
1678TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001679 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001680 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001681 cricket::AudioSendParameters parameters;
1682 parameters.codecs.push_back(kIsacCodec);
1683 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001684 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001685 parameters.codecs.push_back(kCn16000Codec);
1686 parameters.codecs.push_back(kCn8000Codec);
1687 parameters.codecs.push_back(kTelephoneEventCodec);
1688 parameters.codecs.push_back(kRedCodec);
1689 parameters.codecs[0].id = 96;
1690 parameters.codecs[2].id = 97; // wideband CN
1691 parameters.codecs[4].id = 98; // DTMF
1692 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001693 webrtc::CodecInst gcodec;
1694 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1695 EXPECT_EQ(96, gcodec.pltype);
1696 EXPECT_STREQ("ISAC", gcodec.plname);
1697 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001698 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001699 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1700 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001701 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001702}
1703
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001704// Test that we set VAD and DTMF types correctly as callee.
1705TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001706 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
nisse51542be2016-02-12 02:27:06 -08001707 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
1708 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001709 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001710
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001711 cricket::AudioSendParameters parameters;
1712 parameters.codecs.push_back(kIsacCodec);
1713 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001714 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001715 parameters.codecs.push_back(kCn16000Codec);
1716 parameters.codecs.push_back(kCn8000Codec);
1717 parameters.codecs.push_back(kTelephoneEventCodec);
1718 parameters.codecs.push_back(kRedCodec);
1719 parameters.codecs[0].id = 96;
1720 parameters.codecs[2].id = 97; // wideband CN
1721 parameters.codecs[4].id = 98; // DTMF
1722 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001723 EXPECT_TRUE(channel_->AddSendStream(
1724 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001725 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001726
1727 webrtc::CodecInst gcodec;
1728 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1729 EXPECT_EQ(96, gcodec.pltype);
1730 EXPECT_STREQ("ISAC", gcodec.plname);
1731 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001732 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001733 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1734 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001735 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001736}
1737
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001738// Test that we only apply VAD if we have a CN codec that matches the
1739// send codec clockrate.
1740TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenberg1ac56142015-10-13 03:58:19 -07001741 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001742 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001743 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001744 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001745 parameters.codecs.push_back(kIsacCodec);
1746 parameters.codecs.push_back(kCn16000Codec);
1747 parameters.codecs[1].id = 97;
1748 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001749 webrtc::CodecInst gcodec;
1750 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1751 EXPECT_STREQ("ISAC", gcodec.plname);
1752 EXPECT_TRUE(voe_.GetVAD(channel_num));
1753 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1754 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001755 parameters.codecs[0] = kPcmuCodec;
1756 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001757 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1758 EXPECT_STREQ("PCMU", gcodec.plname);
1759 EXPECT_FALSE(voe_.GetVAD(channel_num));
1760 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001761 parameters.codecs[1] = kCn8000Codec;
1762 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001763 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1764 EXPECT_STREQ("PCMU", gcodec.plname);
1765 EXPECT_TRUE(voe_.GetVAD(channel_num));
1766 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001767 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001768 parameters.codecs[0] = kIsacCodec;
1769 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001770 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1771 EXPECT_STREQ("ISAC", gcodec.plname);
1772 EXPECT_FALSE(voe_.GetVAD(channel_num));
1773}
1774
1775// Test that we perform case-insensitive matching of codec names.
1776TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenberg1ac56142015-10-13 03:58:19 -07001777 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001778 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001779 cricket::AudioSendParameters parameters;
1780 parameters.codecs.push_back(kIsacCodec);
1781 parameters.codecs.push_back(kPcmuCodec);
1782 parameters.codecs.push_back(kCn16000Codec);
1783 parameters.codecs.push_back(kCn8000Codec);
1784 parameters.codecs.push_back(kTelephoneEventCodec);
1785 parameters.codecs.push_back(kRedCodec);
1786 parameters.codecs[0].name = "iSaC";
1787 parameters.codecs[0].id = 96;
1788 parameters.codecs[2].id = 97; // wideband CN
1789 parameters.codecs[4].id = 98; // DTMF
1790 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001791 webrtc::CodecInst gcodec;
1792 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1793 EXPECT_EQ(96, gcodec.pltype);
1794 EXPECT_STREQ("ISAC", gcodec.plname);
1795 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001796 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001797 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1798 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001799 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001800}
1801
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001802// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001803TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001804 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001805 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001806 cricket::AudioSendParameters parameters;
1807 parameters.codecs.push_back(kRedCodec);
1808 parameters.codecs.push_back(kIsacCodec);
1809 parameters.codecs.push_back(kPcmuCodec);
1810 parameters.codecs[0].id = 127;
1811 parameters.codecs[0].params[""] = "96/96";
1812 parameters.codecs[1].id = 96;
1813 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001814 webrtc::CodecInst gcodec;
1815 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1816 EXPECT_EQ(96, gcodec.pltype);
1817 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001818 EXPECT_TRUE(voe_.GetRED(channel_num));
1819 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001820}
1821
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001822// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001823TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001824 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
nisse51542be2016-02-12 02:27:06 -08001825 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
1826 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001827 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001828
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001829 cricket::AudioSendParameters parameters;
1830 parameters.codecs.push_back(kRedCodec);
1831 parameters.codecs.push_back(kIsacCodec);
1832 parameters.codecs.push_back(kPcmuCodec);
1833 parameters.codecs[0].id = 127;
1834 parameters.codecs[0].params[""] = "96/96";
1835 parameters.codecs[1].id = 96;
1836 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001837 EXPECT_TRUE(channel_->AddSendStream(
1838 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001839 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001840 webrtc::CodecInst gcodec;
1841 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1842 EXPECT_EQ(96, gcodec.pltype);
1843 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001844 EXPECT_TRUE(voe_.GetRED(channel_num));
1845 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001846}
1847
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001848// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001849TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenberg1ac56142015-10-13 03:58:19 -07001850 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001851 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001852 cricket::AudioSendParameters parameters;
1853 parameters.codecs.push_back(kRedCodec);
1854 parameters.codecs.push_back(kIsacCodec);
1855 parameters.codecs.push_back(kPcmuCodec);
1856 parameters.codecs[0].id = 127;
1857 parameters.codecs[1].id = 96;
1858 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001859 webrtc::CodecInst gcodec;
1860 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1861 EXPECT_EQ(96, gcodec.pltype);
1862 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001863 EXPECT_TRUE(voe_.GetRED(channel_num));
1864 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001865}
1866
1867// Test that we ignore RED if the parameters aren't named the way we expect.
1868TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001869 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001870 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001871 cricket::AudioSendParameters parameters;
1872 parameters.codecs.push_back(kRedCodec);
1873 parameters.codecs.push_back(kIsacCodec);
1874 parameters.codecs.push_back(kPcmuCodec);
1875 parameters.codecs[0].id = 127;
1876 parameters.codecs[0].params["ABC"] = "96/96";
1877 parameters.codecs[1].id = 96;
1878 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001879 webrtc::CodecInst gcodec;
1880 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1881 EXPECT_EQ(96, gcodec.pltype);
1882 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001883 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001884}
1885
1886// Test that we ignore RED if it uses different primary/secondary encoding.
1887TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001888 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001889 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001890 cricket::AudioSendParameters parameters;
1891 parameters.codecs.push_back(kRedCodec);
1892 parameters.codecs.push_back(kIsacCodec);
1893 parameters.codecs.push_back(kPcmuCodec);
1894 parameters.codecs[0].id = 127;
1895 parameters.codecs[0].params[""] = "96/0";
1896 parameters.codecs[1].id = 96;
1897 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001898 webrtc::CodecInst gcodec;
1899 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1900 EXPECT_EQ(96, gcodec.pltype);
1901 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001902 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001903}
1904
1905// Test that we ignore RED if it uses more than 2 encodings.
1906TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001907 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001908 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001909 cricket::AudioSendParameters parameters;
1910 parameters.codecs.push_back(kRedCodec);
1911 parameters.codecs.push_back(kIsacCodec);
1912 parameters.codecs.push_back(kPcmuCodec);
1913 parameters.codecs[0].id = 127;
1914 parameters.codecs[0].params[""] = "96/96/96";
1915 parameters.codecs[1].id = 96;
1916 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001917 webrtc::CodecInst gcodec;
1918 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1919 EXPECT_EQ(96, gcodec.pltype);
1920 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001921 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001922}
1923
1924// Test that we ignore RED if it has bogus codec ids.
1925TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001926 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001927 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001928 cricket::AudioSendParameters parameters;
1929 parameters.codecs.push_back(kRedCodec);
1930 parameters.codecs.push_back(kIsacCodec);
1931 parameters.codecs.push_back(kPcmuCodec);
1932 parameters.codecs[0].id = 127;
1933 parameters.codecs[0].params[""] = "ABC/ABC";
1934 parameters.codecs[1].id = 96;
1935 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001936 webrtc::CodecInst gcodec;
1937 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1938 EXPECT_EQ(96, gcodec.pltype);
1939 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001940 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001941}
1942
1943// Test that we ignore RED if it refers to a codec that is not present.
1944TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001945 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001946 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001947 cricket::AudioSendParameters parameters;
1948 parameters.codecs.push_back(kRedCodec);
1949 parameters.codecs.push_back(kIsacCodec);
1950 parameters.codecs.push_back(kPcmuCodec);
1951 parameters.codecs[0].id = 127;
1952 parameters.codecs[0].params[""] = "97/97";
1953 parameters.codecs[1].id = 96;
1954 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001955 webrtc::CodecInst gcodec;
1956 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1957 EXPECT_EQ(96, gcodec.pltype);
1958 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001959 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001960}
1961
stefanba4c0e42016-02-04 04:12:24 -08001962class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
1963 public:
1964 WebRtcVoiceEngineWithSendSideBweTest()
1965 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
1966};
1967
1968TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
1969 SupportsTransportSequenceNumberHeaderExtension) {
1970 cricket::RtpCapabilities capabilities = engine_.GetCapabilities();
1971 ASSERT_FALSE(capabilities.header_extensions.empty());
1972 for (const cricket::RtpHeaderExtension& extension :
1973 capabilities.header_extensions) {
1974 if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
1975 EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
1976 extension.id);
1977 return;
1978 }
1979 }
1980 FAIL() << "Transport sequence number extension not in header-extension list.";
1981}
1982
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001983// Test support for audio level header extension.
1984TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1985 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001986}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001987TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1988 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1989}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001990
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001991// Test support for absolute send time header extension.
1992TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1993 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1994}
1995TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1996 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001997}
1998
solenberg1ac56142015-10-13 03:58:19 -07001999// Test that we can create a channel and start sending on it.
2000TEST_F(WebRtcVoiceEngineTestFake, Send) {
2001 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002002 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002003 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002004 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2005 EXPECT_TRUE(voe_.GetSend(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002006 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2007 EXPECT_FALSE(voe_.GetSend(channel_num));
solenberg1ac56142015-10-13 03:58:19 -07002008}
2009
2010// Test that we can create a channel and start playing out on it.
2011TEST_F(WebRtcVoiceEngineTestFake, Playout) {
2012 EXPECT_TRUE(SetupEngineWithRecvStream());
2013 int channel_num = voe_.GetLastChannel();
2014 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2015 EXPECT_TRUE(channel_->SetPlayout(true));
2016 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002017 EXPECT_TRUE(channel_->SetPlayout(false));
2018 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2019}
2020
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002021// Test that we can add and remove send streams.
2022TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2023 SetupForMultiSendStream();
2024
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002025 // Set the global state for sending.
2026 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2027
solenbergc96df772015-10-21 13:01:53 -07002028 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002029 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002030 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002031 // Verify that we are in a sending state for all the created streams.
solenberg3a941542015-11-16 07:34:50 -08002032 EXPECT_TRUE(voe_.GetSend(GetSendStreamConfig(ssrc).voe_channel_id));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002033 }
tfarina5237aaf2015-11-10 23:44:30 -08002034 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002035
solenbergc96df772015-10-21 13:01:53 -07002036 // Delete the send streams.
2037 for (uint32_t ssrc : kSsrcs4) {
2038 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002039 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002040 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002041 }
solenbergc96df772015-10-21 13:01:53 -07002042 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002043}
2044
2045// Test SetSendCodecs correctly configure the codecs in all send streams.
2046TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2047 SetupForMultiSendStream();
2048
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002049 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002050 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002051 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002052 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002053 }
2054
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002055 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002056 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002057 parameters.codecs.push_back(kIsacCodec);
2058 parameters.codecs.push_back(kCn16000Codec);
2059 parameters.codecs[1].id = 97;
2060 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002061
2062 // Verify ISAC and VAD are corrected configured on all send channels.
2063 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002064 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002065 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002066 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2067 EXPECT_STREQ("ISAC", gcodec.plname);
2068 EXPECT_TRUE(voe_.GetVAD(channel_num));
2069 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2070 }
2071
2072 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002073 parameters.codecs[0] = kPcmuCodec;
2074 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002075 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002076 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002077 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2078 EXPECT_STREQ("PCMU", gcodec.plname);
2079 EXPECT_FALSE(voe_.GetVAD(channel_num));
2080 }
2081}
2082
2083// Test we can SetSend on all send streams correctly.
2084TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2085 SetupForMultiSendStream();
2086
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002087 // Create the send channels and they should be a SEND_NOTHING date.
solenbergc96df772015-10-21 13:01:53 -07002088 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002089 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002090 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002091 int channel_num = voe_.GetLastChannel();
2092 EXPECT_FALSE(voe_.GetSend(channel_num));
2093 }
2094
2095 // Set the global state for starting sending.
2096 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
solenbergc96df772015-10-21 13:01:53 -07002097 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002098 // Verify that we are in a sending state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002099 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002100 EXPECT_TRUE(voe_.GetSend(channel_num));
2101 }
2102
2103 // Set the global state for stopping sending.
2104 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
solenbergc96df772015-10-21 13:01:53 -07002105 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002106 // Verify that we are in a stop state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002107 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002108 EXPECT_FALSE(voe_.GetSend(channel_num));
2109 }
2110}
2111
2112// Test we can set the correct statistics on all send streams.
2113TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2114 SetupForMultiSendStream();
2115
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002116 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002117 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002118 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002119 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002120 }
solenberg85a04962015-10-27 03:35:21 -07002121 SetAudioSendStreamStats();
2122
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002123 // Create a receive stream to check that none of the send streams end up in
2124 // the receive stream stats.
2125 EXPECT_TRUE(channel_->AddRecvStream(
2126 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002127 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002128 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2129 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002130
solenberg85a04962015-10-27 03:35:21 -07002131 // Check stats for the added streams.
2132 {
2133 cricket::VoiceMediaInfo info;
2134 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002135
solenberg85a04962015-10-27 03:35:21 -07002136 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002137 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002138 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002139 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002140 }
2141
2142 // We have added one receive stream. We should see empty stats.
2143 EXPECT_EQ(info.receivers.size(), 1u);
2144 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002145 }
solenberg1ac56142015-10-13 03:58:19 -07002146
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002147 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002148 {
2149 cricket::VoiceMediaInfo info;
2150 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2151 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002152 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002153 EXPECT_EQ(0u, info.receivers.size());
2154 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002155
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002156 // Deliver a new packet - a default receive stream should be created and we
2157 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002158 {
2159 cricket::VoiceMediaInfo info;
2160 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2161 SetAudioReceiveStreamStats();
2162 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002163 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002164 EXPECT_EQ(1u, info.receivers.size());
2165 VerifyVoiceReceiverInfo(info.receivers[0]);
2166 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002167}
2168
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002169// Test that we can add and remove receive streams, and do proper send/playout.
2170// We can receive on multiple streams while sending one stream.
2171TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002172 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002173 int channel_num1 = voe_.GetLastChannel();
2174
solenberg1ac56142015-10-13 03:58:19 -07002175 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002176 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002177 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002178 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002179
solenberg1ac56142015-10-13 03:58:19 -07002180 // Adding another stream should enable playout on the new stream only.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002181 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2182 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002183 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2184 EXPECT_TRUE(voe_.GetSend(channel_num1));
2185 EXPECT_FALSE(voe_.GetSend(channel_num2));
2186
solenberg1ac56142015-10-13 03:58:19 -07002187 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002188 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2189 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2190
2191 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2192 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2193 int channel_num3 = voe_.GetLastChannel();
2194 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2195 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2196 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2197 EXPECT_FALSE(voe_.GetSend(channel_num3));
2198
2199 // Stop sending.
2200 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2201 EXPECT_FALSE(voe_.GetSend(channel_num1));
2202 EXPECT_FALSE(voe_.GetSend(channel_num2));
2203 EXPECT_FALSE(voe_.GetSend(channel_num3));
2204
2205 // Stop playout.
2206 EXPECT_TRUE(channel_->SetPlayout(false));
2207 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2208 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2209 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2210
solenberg1ac56142015-10-13 03:58:19 -07002211 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002212 EXPECT_TRUE(channel_->SetPlayout(true));
2213 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2214 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2215 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2216
solenberg1ac56142015-10-13 03:58:19 -07002217 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002218 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2219 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002220 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002221}
2222
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002223// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002224// and start sending on it.
2225TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2226 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg246b8172015-12-08 09:50:23 -08002227 cricket::AudioOptions options_adjust_agc;
2228 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002229 int channel_num = voe_.GetLastChannel();
2230 webrtc::AgcConfig agc_config;
2231 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2232 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002233 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002234 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002235 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2236 EXPECT_TRUE(voe_.GetSend(channel_num));
2237 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2238 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002239 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2240 EXPECT_FALSE(voe_.GetSend(channel_num));
2241 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002242}
2243
wu@webrtc.org97077a32013-10-25 21:18:33 +00002244TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002245 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002246 webrtc::AgcConfig agc_config;
2247 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2248 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002249 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2250 send_parameters_.options.tx_agc_digital_compression_gain =
2251 rtc::Optional<uint16_t>(9);
2252 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2253 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2254 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002255 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2256 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2257 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2258 EXPECT_TRUE(agc_config.limiterEnable);
2259
2260 // Check interaction with adjust_agc_delta. Both should be respected, for
2261 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002262 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2263 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002264 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2265 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2266}
2267
wu@webrtc.org97077a32013-10-25 21:18:33 +00002268TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002269 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg246b8172015-12-08 09:50:23 -08002270 send_parameters_.options.recording_sample_rate =
2271 rtc::Optional<uint32_t>(48000);
2272 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2273 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002274
2275 unsigned int recording_sample_rate, playout_sample_rate;
2276 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2277 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2278 EXPECT_EQ(48000u, recording_sample_rate);
2279 EXPECT_EQ(44100u, playout_sample_rate);
2280}
2281
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002282// Test that we can set the outgoing SSRC properly.
2283// SSRC is set in SetupEngine by calling AddSendStream.
2284TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002285 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002286 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002287}
2288
2289TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2290 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002291 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002292 SetAudioSendStreamStats();
solenberg1ac56142015-10-13 03:58:19 -07002293 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2294 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002295 EXPECT_TRUE(channel_->AddRecvStream(
2296 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002297 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2298 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002299
solenberg85a04962015-10-27 03:35:21 -07002300 // Check stats for the added streams.
2301 {
2302 cricket::VoiceMediaInfo info;
2303 EXPECT_EQ(true, channel_->GetStats(&info));
2304
2305 // We have added one send stream. We should see the stats we've set.
2306 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002307 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002308 // We have added one receive stream. We should see empty stats.
2309 EXPECT_EQ(info.receivers.size(), 1u);
2310 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2311 }
solenberg1ac56142015-10-13 03:58:19 -07002312
solenberg566ef242015-11-06 15:34:49 -08002313 // Start sending - this affects some reported stats.
2314 {
2315 cricket::VoiceMediaInfo info;
2316 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2317 EXPECT_EQ(true, channel_->GetStats(&info));
2318 VerifyVoiceSenderInfo(info.senders[0], true);
2319 }
2320
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002321 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002322 {
2323 cricket::VoiceMediaInfo info;
2324 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2325 EXPECT_EQ(true, channel_->GetStats(&info));
2326 EXPECT_EQ(1u, info.senders.size());
2327 EXPECT_EQ(0u, info.receivers.size());
2328 }
solenberg1ac56142015-10-13 03:58:19 -07002329
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002330 // Deliver a new packet - a default receive stream should be created and we
2331 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002332 {
2333 cricket::VoiceMediaInfo info;
2334 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2335 SetAudioReceiveStreamStats();
2336 EXPECT_EQ(true, channel_->GetStats(&info));
2337 EXPECT_EQ(1u, info.senders.size());
2338 EXPECT_EQ(1u, info.receivers.size());
2339 VerifyVoiceReceiverInfo(info.receivers[0]);
2340 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002341}
2342
2343// Test that we can set the outgoing SSRC properly with multiple streams.
2344// SSRC is set in SetupEngine by calling AddSendStream.
2345TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002346 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002347 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002348 EXPECT_TRUE(channel_->AddRecvStream(
2349 cricket::StreamParams::CreateLegacy(kSsrc2)));
2350 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002351}
2352
2353// Test that the local SSRC is the same on sending and receiving channels if the
2354// receive channel is created before the send channel.
2355TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002356 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
nisse51542be2016-02-12 02:27:06 -08002357 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
2358 cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002359
2360 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2361 int receive_channel_num = voe_.GetLastChannel();
2362 EXPECT_TRUE(channel_->AddSendStream(
2363 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002364
solenberg3a941542015-11-16 07:34:50 -08002365 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002366 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002367}
2368
2369// Test that we can properly receive packets.
2370TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2371 EXPECT_TRUE(SetupEngine());
solenberg7e63ef02015-11-20 00:19:43 -08002372 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002373 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002374 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002375 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002376}
2377
2378// Test that we can properly receive packets on multiple streams.
2379TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg7e63ef02015-11-20 00:19:43 -08002380 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002381 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2382 int channel_num1 = voe_.GetLastChannel();
2383 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2384 int channel_num2 = voe_.GetLastChannel();
2385 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2386 int channel_num3 = voe_.GetLastChannel();
2387 // Create packets with the right SSRCs.
2388 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002389 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002390 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002391 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002392 }
2393 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2394 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2395 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002396
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002397 DeliverPacket(packets[0], sizeof(packets[0]));
2398 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2399 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2400 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002401
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002402 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002403 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002404 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2405 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002406
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002407 DeliverPacket(packets[2], sizeof(packets[2]));
2408 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002409 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002410 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002411
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002412 DeliverPacket(packets[3], sizeof(packets[3]));
2413 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2414 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002415 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2416
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002417 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2418 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2419 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2420}
2421
solenberg7e63ef02015-11-20 00:19:43 -08002422// Test that receiving on an unsignalled stream works (default channel will be
2423// created).
2424TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
2425 EXPECT_TRUE(SetupEngine());
2426 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2427 int channel_num = voe_.GetLastChannel();
2428 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2429}
2430
2431// Test that receiving on an unsignalled stream works (default channel will be
2432// created), and that packets will be forwarded to the default channel
2433// regardless of their SSRCs.
2434TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
2435 EXPECT_TRUE(SetupEngine());
2436 char packet[sizeof(kPcmuFrame)];
2437 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2438
2439 // Note that the first unknown SSRC cannot be 0, because we only support
2440 // creating receive streams for SSRC!=0.
2441 DeliverPacket(packet, sizeof(packet));
2442 int channel_num = voe_.GetLastChannel();
2443 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2444 // Once we have the default channel, SSRC==0 will be ok.
2445 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2446 rtc::SetBE32(&packet[8], ssrc);
2447 DeliverPacket(packet, sizeof(packet));
2448 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2449 }
2450}
2451
2452// Test that a default channel is created even after a signalled stream has been
2453// added, and that this stream will get any packets for unknown SSRCs.
2454TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
2455 EXPECT_TRUE(SetupEngine());
2456 char packet[sizeof(kPcmuFrame)];
2457 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2458
2459 // Add a known stream, send packet and verify we got it.
2460 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2461 int signalled_channel_num = voe_.GetLastChannel();
2462 DeliverPacket(packet, sizeof(packet));
2463 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2464
2465 // Note that the first unknown SSRC cannot be 0, because we only support
2466 // creating receive streams for SSRC!=0.
2467 rtc::SetBE32(&packet[8], 7011);
2468 DeliverPacket(packet, sizeof(packet));
2469 int channel_num = voe_.GetLastChannel();
2470 EXPECT_NE(channel_num, signalled_channel_num);
2471 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2472 // Once we have the default channel, SSRC==0 will be ok.
2473 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2474 rtc::SetBE32(&packet[8], ssrc);
2475 DeliverPacket(packet, sizeof(packet));
2476 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2477 }
2478}
2479
solenberg0a617e22015-10-20 15:49:38 -07002480// Test that we properly handle failures to add a receive stream.
2481TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
2482 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002483 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002484 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002485}
2486
solenberg0a617e22015-10-20 15:49:38 -07002487// Test that we properly handle failures to add a send stream.
2488TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
2489 EXPECT_TRUE(SetupEngine());
2490 voe_.set_fail_create_channel(true);
2491 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2492}
2493
solenberg1ac56142015-10-13 03:58:19 -07002494// Test that AddRecvStream creates new stream.
2495TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2496 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002497 int channel_num = voe_.GetLastChannel();
2498 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002499 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002500}
2501
2502// Test that after adding a recv stream, we do not decode more codecs than
2503// those previously passed into SetRecvCodecs.
2504TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002505 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002506 cricket::AudioRecvParameters parameters;
2507 parameters.codecs.push_back(kIsacCodec);
2508 parameters.codecs.push_back(kPcmuCodec);
2509 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002510 EXPECT_TRUE(channel_->AddRecvStream(
2511 cricket::StreamParams::CreateLegacy(kSsrc1)));
2512 int channel_num2 = voe_.GetLastChannel();
2513 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002514 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002515 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002516 gcodec.channels = 2;
2517 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2518}
2519
2520// Test that we properly clean up any streams that were added, even if
2521// not explicitly removed.
2522TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002523 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002524 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002525 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2526 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2527 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2528 delete channel_;
2529 channel_ = NULL;
2530 EXPECT_EQ(0, voe_.GetNumChannels());
2531}
2532
wu@webrtc.org78187522013-10-07 23:32:02 +00002533TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002534 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002535 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2536}
2537
2538TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2539 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002540 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002541 // Manually delete channel to simulate a failure.
2542 int channel = voe_.GetLastChannel();
2543 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2544 // Add recv stream 2 should work.
2545 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002546 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002547 EXPECT_NE(channel, new_channel);
2548 // The last created channel is deleted too.
2549 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002550}
2551
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002552// Test the InsertDtmf on default send stream as caller.
2553TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2554 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002555}
2556
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002557// Test the InsertDtmf on default send stream as callee
2558TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2559 TestInsertDtmf(0, false);
2560}
2561
2562// Test the InsertDtmf on specified send stream as caller.
2563TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2564 TestInsertDtmf(kSsrc1, true);
2565}
2566
2567// Test the InsertDtmf on specified send stream as callee.
2568TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2569 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002570}
2571
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002572TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002573 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002574 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002575 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2576 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2577 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2578 EXPECT_TRUE(channel_->SetPlayout(true));
2579 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2580 EXPECT_TRUE(channel_->SetPlayout(false));
2581 EXPECT_FALSE(channel_->SetPlayout(true));
2582}
2583
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002584TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002585 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002586
2587 bool ec_enabled;
2588 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002589 webrtc::AecmModes aecm_mode;
2590 bool cng_enabled;
2591 bool agc_enabled;
2592 webrtc::AgcModes agc_mode;
2593 webrtc::AgcConfig agc_config;
2594 bool ns_enabled;
2595 webrtc::NsModes ns_mode;
2596 bool highpass_filter_enabled;
2597 bool stereo_swapping_enabled;
2598 bool typing_detection_enabled;
2599 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002600 voe_.GetAecmMode(aecm_mode, cng_enabled);
2601 voe_.GetAgcStatus(agc_enabled, agc_mode);
2602 voe_.GetAgcConfig(agc_config);
2603 voe_.GetNsStatus(ns_enabled, ns_mode);
2604 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2605 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2606 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2607 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002608 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002609 EXPECT_FALSE(cng_enabled);
2610 EXPECT_TRUE(agc_enabled);
2611 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2612 EXPECT_TRUE(ns_enabled);
2613 EXPECT_TRUE(highpass_filter_enabled);
2614 EXPECT_FALSE(stereo_swapping_enabled);
2615 EXPECT_TRUE(typing_detection_enabled);
2616 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2617 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002618 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2619 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002620
solenberg246b8172015-12-08 09:50:23 -08002621 // Nothing set in AudioOptions, so everything should be as default.
2622 send_parameters_.options = cricket::AudioOptions();
2623 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002624 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002625 voe_.GetAecmMode(aecm_mode, cng_enabled);
2626 voe_.GetAgcStatus(agc_enabled, agc_mode);
2627 voe_.GetAgcConfig(agc_config);
2628 voe_.GetNsStatus(ns_enabled, ns_mode);
2629 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2630 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2631 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2632 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002633 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002634 EXPECT_FALSE(cng_enabled);
2635 EXPECT_TRUE(agc_enabled);
2636 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2637 EXPECT_TRUE(ns_enabled);
2638 EXPECT_TRUE(highpass_filter_enabled);
2639 EXPECT_FALSE(stereo_swapping_enabled);
2640 EXPECT_TRUE(typing_detection_enabled);
2641 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2642 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002643 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2644 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002645
2646 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002647 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2648 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002649 voe_.GetEcStatus(ec_enabled, ec_mode);
2650 EXPECT_FALSE(ec_enabled);
2651
2652 // Turn echo cancellation back on, with settings, and make sure
2653 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002654 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2655 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002656 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002657 voe_.GetAecmMode(aecm_mode, cng_enabled);
2658 voe_.GetAgcStatus(agc_enabled, agc_mode);
2659 voe_.GetAgcConfig(agc_config);
2660 voe_.GetNsStatus(ns_enabled, ns_mode);
2661 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2662 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2663 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2664 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002665 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002666 EXPECT_TRUE(agc_enabled);
2667 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2668 EXPECT_TRUE(ns_enabled);
2669 EXPECT_TRUE(highpass_filter_enabled);
2670 EXPECT_FALSE(stereo_swapping_enabled);
2671 EXPECT_TRUE(typing_detection_enabled);
2672 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2673 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2674
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002675 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2676 // control.
solenberg246b8172015-12-08 09:50:23 -08002677 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2678 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002679 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002680 voe_.GetAecmMode(aecm_mode, cng_enabled);
2681 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002682 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002683 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2684
2685 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002686 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2687 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2688 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2689 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002690 voe_.GetEcStatus(ec_enabled, ec_mode);
2691 EXPECT_FALSE(ec_enabled);
2692 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002693 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2694 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002695 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002696 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002697 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002698 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2699
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002700 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002701 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2702 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002703 voe_.GetAgcStatus(agc_enabled, agc_mode);
2704 EXPECT_FALSE(agc_enabled);
2705
2706 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002707 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2708 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2709 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002710 voe_.GetAgcStatus(agc_enabled, agc_mode);
2711 EXPECT_TRUE(agc_enabled);
2712 voe_.GetAgcConfig(agc_config);
2713 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2714
2715 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002716 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2717 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2718 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2719 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2720 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002721 voe_.GetNsStatus(ns_enabled, ns_mode);
2722 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2723 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2724 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2725 EXPECT_FALSE(ns_enabled);
2726 EXPECT_FALSE(highpass_filter_enabled);
2727 EXPECT_FALSE(typing_detection_enabled);
2728 EXPECT_TRUE(stereo_swapping_enabled);
2729
solenberg1ac56142015-10-13 03:58:19 -07002730 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002731 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002732 voe_.GetEcStatus(ec_enabled, ec_mode);
2733 voe_.GetNsStatus(ns_enabled, ns_mode);
2734 EXPECT_TRUE(ec_enabled);
2735 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2736 EXPECT_FALSE(ns_enabled);
2737 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2738}
2739
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002740TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002741 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002742
2743 bool ec_enabled;
2744 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002745 bool agc_enabled;
2746 webrtc::AgcModes agc_mode;
2747 bool ns_enabled;
2748 webrtc::NsModes ns_mode;
2749 bool highpass_filter_enabled;
2750 bool stereo_swapping_enabled;
2751 bool typing_detection_enabled;
2752
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002753 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002754 voe_.GetAgcStatus(agc_enabled, agc_mode);
2755 voe_.GetNsStatus(ns_enabled, ns_mode);
2756 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2757 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2758 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2759 EXPECT_TRUE(ec_enabled);
2760 EXPECT_TRUE(agc_enabled);
2761 EXPECT_TRUE(ns_enabled);
2762 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002763 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002764 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002765}
2766
2767TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2768 webrtc::AgcConfig set_config = {0};
2769 set_config.targetLeveldBOv = 3;
2770 set_config.digitalCompressionGaindB = 9;
2771 set_config.limiterEnable = true;
2772 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002773 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002774
2775 webrtc::AgcConfig config = {0};
2776 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2777 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2778 EXPECT_EQ(set_config.digitalCompressionGaindB,
2779 config.digitalCompressionGaindB);
2780 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2781}
2782
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002783TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002784 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg66f43392015-09-09 01:36:22 -07002785 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
nisse51542be2016-02-12 02:27:06 -08002786 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_.CreateChannel(
2787 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002788 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
nisse51542be2016-02-12 02:27:06 -08002789 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_.CreateChannel(
2790 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002791
2792 // Have to add a stream to make SetSend work.
2793 cricket::StreamParams stream1;
2794 stream1.ssrcs.push_back(1);
2795 channel1->AddSendStream(stream1);
2796 cricket::StreamParams stream2;
2797 stream2.ssrcs.push_back(2);
2798 channel2->AddSendStream(stream2);
2799
2800 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002801 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002802 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2803 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2804 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002805 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2806 EXPECT_EQ(parameters_options_all.options, channel1->options());
2807 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2808 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002809
2810 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002811 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002812 parameters_options_no_ns.options.noise_suppression =
2813 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002814 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2815 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002816 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2817 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2818 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002819 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002820
2821 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002822 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002823 parameters_options_no_agc.options.auto_gain_control =
2824 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002825 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002826 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2827 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2828 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002829 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002830
solenberg246b8172015-12-08 09:50:23 -08002831 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002832 bool ec_enabled;
2833 webrtc::EcModes ec_mode;
2834 bool agc_enabled;
2835 webrtc::AgcModes agc_mode;
2836 bool ns_enabled;
2837 webrtc::NsModes ns_mode;
2838 voe_.GetEcStatus(ec_enabled, ec_mode);
2839 voe_.GetAgcStatus(agc_enabled, agc_mode);
2840 voe_.GetNsStatus(ns_enabled, ns_mode);
2841 EXPECT_TRUE(ec_enabled);
2842 EXPECT_TRUE(agc_enabled);
2843 EXPECT_TRUE(ns_enabled);
2844
2845 channel1->SetSend(cricket::SEND_MICROPHONE);
2846 voe_.GetEcStatus(ec_enabled, ec_mode);
2847 voe_.GetAgcStatus(agc_enabled, agc_mode);
2848 voe_.GetNsStatus(ns_enabled, ns_mode);
2849 EXPECT_TRUE(ec_enabled);
2850 EXPECT_TRUE(agc_enabled);
2851 EXPECT_FALSE(ns_enabled);
2852
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002853 channel2->SetSend(cricket::SEND_MICROPHONE);
2854 voe_.GetEcStatus(ec_enabled, ec_mode);
2855 voe_.GetAgcStatus(agc_enabled, agc_mode);
2856 voe_.GetNsStatus(ns_enabled, ns_mode);
2857 EXPECT_TRUE(ec_enabled);
2858 EXPECT_FALSE(agc_enabled);
2859 EXPECT_TRUE(ns_enabled);
2860
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002861 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08002862 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002863 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2864 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002865 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01002866 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07002867 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01002868 rtc::Optional<bool>(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002869 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002870 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01002871 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2872 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2873 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002874 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002875 voe_.GetEcStatus(ec_enabled, ec_mode);
2876 voe_.GetAgcStatus(agc_enabled, agc_mode);
2877 voe_.GetNsStatus(ns_enabled, ns_mode);
2878 EXPECT_TRUE(ec_enabled);
2879 EXPECT_FALSE(agc_enabled);
2880 EXPECT_FALSE(ns_enabled);
2881}
2882
wu@webrtc.orgde305012013-10-31 15:40:38 +00002883// This test verifies DSCP settings are properly applied on voice media channel.
2884TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002885 EXPECT_TRUE(SetupEngineWithSendStream());
nisse51542be2016-02-12 02:27:06 -08002886 cricket::FakeNetworkInterface network_interface;
2887 cricket::MediaConfig config;
2888 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel;
2889
2890 channel.reset(engine_.CreateChannel(&call_, config, cricket::AudioOptions()));
2891 channel->SetInterface(&network_interface);
2892 // Default value when DSCP is disabled should be DSCP_DEFAULT.
2893 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
2894
2895 config.enable_dscp = true;
2896 channel.reset(engine_.CreateChannel(&call_, config, cricket::AudioOptions()));
2897 channel->SetInterface(&network_interface);
2898 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
2899
2900 // Verify that setting the option to false resets the
2901 // DiffServCodePoint.
2902 config.enable_dscp = false;
2903 channel.reset(engine_.CreateChannel(&call_, config, cricket::AudioOptions()));
2904 channel->SetInterface(&network_interface);
2905 // Default value when DSCP is disabled should be DSCP_DEFAULT.
2906 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
2907
2908 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00002909}
2910
solenberg1ac56142015-10-13 03:58:19 -07002911TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002912 EXPECT_TRUE(SetupEngine());
2913 cricket::WebRtcVoiceMediaChannel* media_channel =
2914 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002915 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2916 EXPECT_TRUE(channel_->AddRecvStream(
2917 cricket::StreamParams::CreateLegacy(kSsrc1)));
2918 int channel_id = voe_.GetLastChannel();
2919 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2920 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2921 EXPECT_TRUE(channel_->AddRecvStream(
2922 cricket::StreamParams::CreateLegacy(kSsrc2)));
2923 int channel_id2 = voe_.GetLastChannel();
2924 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002925}
2926
solenberg1ac56142015-10-13 03:58:19 -07002927TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002928 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002929 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002930 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2931 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2932 EXPECT_TRUE(channel_->AddSendStream(
2933 cricket::StreamParams::CreateLegacy(kSsrc1)));
2934 int channel_id = voe_.GetLastChannel();
2935 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2936 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2937 EXPECT_TRUE(channel_->AddSendStream(
2938 cricket::StreamParams::CreateLegacy(kSsrc2)));
2939 int channel_id2 = voe_.GetLastChannel();
2940 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002941}
2942
solenberg4bac9c52015-10-09 02:32:53 -07002943TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002944 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002945 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002946 cricket::StreamParams stream;
2947 stream.ssrcs.push_back(kSsrc2);
2948 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002949 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002950 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002951 float scale = 0;
2952 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2953 EXPECT_DOUBLE_EQ(3, scale);
2954}
2955
2956TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
2957 EXPECT_TRUE(SetupEngine());
2958 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2959 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2960 int channel_id = voe_.GetLastChannel();
2961 float scale = 0;
2962 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2963 EXPECT_DOUBLE_EQ(2, scale);
2964 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07002965 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002966 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002967}
2968
pbos8fc7fa72015-07-15 08:02:58 -07002969TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02002970 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07002971 const std::string kSyncLabel = "AvSyncLabel";
2972
solenberg1ac56142015-10-13 03:58:19 -07002973 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07002974 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
2975 sp.sync_label = kSyncLabel;
2976 // Creating two channels to make sure that sync label is set properly for both
2977 // the default voice channel and following ones.
2978 EXPECT_TRUE(channel_->AddRecvStream(sp));
2979 sp.ssrcs[0] += 1;
2980 EXPECT_TRUE(channel_->AddRecvStream(sp));
2981
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002982 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07002983 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002984 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002985 << "SyncGroup should be set based on sync_label";
2986 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002987 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002988 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07002989}
2990
solenberg3a941542015-11-16 07:34:50 -08002991// TODO(solenberg): Remove, once recv streams are configured through Call.
2992// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07002993TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002994 // Test that setting the header extensions results in the expected state
2995 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002996 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002997 ssrcs.push_back(223);
2998 ssrcs.push_back(224);
2999
solenberg1ac56142015-10-13 03:58:19 -07003000 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003001 cricket::WebRtcVoiceMediaChannel* media_channel =
3002 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003003 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003004 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003005 EXPECT_TRUE(media_channel->AddRecvStream(
3006 cricket::StreamParams::CreateLegacy(ssrc)));
3007 }
3008
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003009 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003010 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003011 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003012 EXPECT_NE(nullptr, s);
3013 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3014 }
3015
3016 // Set up receive extensions.
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003017 cricket::RtpCapabilities capabilities = engine_.GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003018 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003019 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003020 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003021 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003022 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003023 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003024 EXPECT_NE(nullptr, s);
3025 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003026 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3027 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003028 for (const auto& s_ext : s_exts) {
3029 if (e_ext.id == s_ext.id) {
3030 EXPECT_EQ(e_ext.uri, s_ext.name);
3031 }
3032 }
3033 }
3034 }
3035
3036 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003037 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003038 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003039 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003040 EXPECT_NE(nullptr, s);
3041 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3042 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003043}
3044
3045TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3046 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003047 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003048 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3049 static const unsigned char kRtcp[] = {
3050 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3051 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3052 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3053 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3054 };
3055 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3056
solenberg1ac56142015-10-13 03:58:19 -07003057 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003058 cricket::WebRtcVoiceMediaChannel* media_channel =
3059 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003060 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003061 EXPECT_TRUE(media_channel->AddRecvStream(
3062 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3063
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003064 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003065 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003066 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003067 EXPECT_EQ(0, s->received_packets());
3068 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3069 EXPECT_EQ(1, s->received_packets());
3070 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3071 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003072}
Minyue2013aec2015-05-13 14:14:42 +02003073
solenberg0a617e22015-10-20 15:49:38 -07003074// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003075// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003076TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenberg1ac56142015-10-13 03:58:19 -07003077 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003078 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003079 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003080 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3081 int recv_ch = voe_.GetLastChannel();
3082 EXPECT_NE(recv_ch, default_channel);
3083 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3084 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3085 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003086 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3087 recv_ch = voe_.GetLastChannel();
3088 EXPECT_NE(recv_ch, default_channel);
3089 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003090}
3091
3092TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003093 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003094 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003095
3096 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3097 int recv_ch = voe_.GetLastChannel();
3098
3099 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3100 int send_ch = voe_.GetLastChannel();
3101
3102 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3103 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3104 // channel of |recv_ch|.This is not a common case, since, normally, only the
3105 // default channel can be associated. However, the default is not deletable.
3106 // So we force the |recv_ch| to associate with a non-default channel.
3107 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3108 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3109
3110 EXPECT_TRUE(channel_->RemoveSendStream(2));
3111 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3112}
stefan658910c2015-09-03 05:48:32 -07003113
deadbeef884f5852016-01-15 09:20:04 -08003114TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
3115 EXPECT_TRUE(SetupEngine());
3116 rtc::scoped_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3117 rtc::scoped_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
3118
3119 // Setting the sink before a recv stream exists should do nothing.
3120 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3121 EXPECT_TRUE(
3122 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3123 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3124
3125 // Now try actually setting the sink.
3126 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3127 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3128
3129 // Now try resetting it.
3130 channel_->SetRawAudioSink(kSsrc1, nullptr);
3131 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3132}
3133
3134TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
3135 EXPECT_TRUE(SetupEngine());
3136 rtc::scoped_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3137 rtc::scoped_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
3138
3139 // Should be able to set a default sink even when no stream exists.
3140 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3141
3142 // Create default channel and ensure it's assigned the default sink.
3143 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3144 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3145
3146 // Try resetting the default sink.
3147 channel_->SetRawAudioSink(0, nullptr);
3148 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3149
3150 // Try setting the default sink while the default stream exists.
3151 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3152 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3153
3154 // If we remove and add a default stream, it should get the same sink.
3155 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3156 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3157 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3158}
3159
stefan658910c2015-09-03 05:48:32 -07003160// Tests that the library initializes and shuts down properly.
3161TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3162 cricket::WebRtcVoiceEngine engine;
3163 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003164 rtc::scoped_ptr<webrtc::Call> call(
3165 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003166 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3167 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003168 EXPECT_TRUE(channel != nullptr);
3169 delete channel;
3170 engine.Terminate();
3171
3172 // Reinit to catch regression where VoiceEngineObserver reference is lost
3173 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3174 engine.Terminate();
3175}
3176
3177// Tests that the library is configured with the codecs we want.
3178TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003179 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003180 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3181 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0), nullptr));
3182 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3183 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0), nullptr));
3184 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3185 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003186 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003187 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3188 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0), nullptr));
3189 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3190 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0), nullptr));
3191 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3192 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0), nullptr));
3193 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3194 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0), nullptr));
3195 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3196 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0), nullptr));
3197 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3198 cricket::AudioCodec(96, "red", 8000, 0, 1, 0), nullptr));
3199 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3200 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0), nullptr));
3201 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3202 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0), nullptr));
3203 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3204 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0), nullptr));
3205 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3206 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003207 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003208 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3209 cricket::AudioCodec(0, "", 8000, 0, 1, 0), nullptr)); // PCMU
3210 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3211 cricket::AudioCodec(8, "", 8000, 0, 1, 0), nullptr)); // PCMA
3212 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3213 cricket::AudioCodec(9, "", 8000, 0, 1, 0), nullptr)); // G722
3214 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3215 cricket::AudioCodec(13, "", 8000, 0, 1, 0), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003216 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003217 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3218 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003219 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003220 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3221 cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0), nullptr));
3222 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3223 cricket::AudioCodec(88, "", 0, 0, 1, 0), nullptr));
3224 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3225 cricket::AudioCodec(0, "", 0, 0, 2, 0), nullptr));
3226 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3227 cricket::AudioCodec(0, "", 5000, 0, 1, 0), nullptr));
3228 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3229 cricket::AudioCodec(0, "", 0, 5000, 1, 0), nullptr));
3230
stefan658910c2015-09-03 05:48:32 -07003231 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenberg26c8c912015-11-27 04:00:25 -08003232 cricket::WebRtcVoiceEngine engine;
stefan658910c2015-09-03 05:48:32 -07003233 for (std::vector<cricket::AudioCodec>::const_iterator it =
3234 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3235 if (it->name == "CN" && it->clockrate == 16000) {
3236 EXPECT_EQ(105, it->id);
3237 } else if (it->name == "CN" && it->clockrate == 32000) {
3238 EXPECT_EQ(106, it->id);
3239 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3240 EXPECT_EQ(103, it->id);
3241 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3242 EXPECT_EQ(104, it->id);
3243 } else if (it->name == "G722" && it->clockrate == 8000) {
3244 EXPECT_EQ(9, it->id);
3245 } else if (it->name == "telephone-event") {
3246 EXPECT_EQ(126, it->id);
3247 } else if (it->name == "red") {
3248 EXPECT_EQ(127, it->id);
3249 } else if (it->name == "opus") {
3250 EXPECT_EQ(111, it->id);
3251 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3252 EXPECT_EQ("10", it->params.find("minptime")->second);
3253 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3254 EXPECT_EQ("60", it->params.find("maxptime")->second);
3255 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3256 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3257 }
3258 }
stefan658910c2015-09-03 05:48:32 -07003259 engine.Terminate();
3260}
3261
3262// Tests that VoE supports at least 32 channels
3263TEST(WebRtcVoiceEngineTest, Has32Channels) {
3264 cricket::WebRtcVoiceEngine engine;
3265 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003266 rtc::scoped_ptr<webrtc::Call> call(
3267 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003268
3269 cricket::VoiceMediaChannel* channels[32];
3270 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003271 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003272 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3273 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003274 if (!channel)
3275 break;
stefan658910c2015-09-03 05:48:32 -07003276 channels[num_channels++] = channel;
3277 }
3278
tfarina5237aaf2015-11-10 23:44:30 -08003279 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003280 EXPECT_EQ(expected, num_channels);
3281
3282 while (num_channels > 0) {
3283 delete channels[--num_channels];
3284 }
stefan658910c2015-09-03 05:48:32 -07003285 engine.Terminate();
3286}
3287
3288// Test that we set our preferred codecs properly.
3289TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3290 cricket::WebRtcVoiceEngine engine;
3291 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003292 rtc::scoped_ptr<webrtc::Call> call(
3293 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003294 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3295 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003296 cricket::AudioRecvParameters parameters;
3297 parameters.codecs = engine.codecs();
3298 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003299}