blob: 15ac43d2e5050ee4ea7b833b032ab02a38be031d [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
kjellandera96e2d72016-02-04 23:52:28 -080011#include "talk/session/media/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 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +020080 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +020081 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000082 }
solenberg1ac56142015-10-13 03:58:19 -070083 bool SetupEngineWithRecvStream() {
84 if (!SetupEngine()) {
85 return false;
86 }
87 return channel_->AddRecvStream(
88 cricket::StreamParams::CreateLegacy(kSsrc1));
89 }
90 bool SetupEngineWithSendStream() {
91 if (!SetupEngine()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000092 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000093 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000094 return channel_->AddSendStream(
95 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000096 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +000097 void SetupForMultiSendStream() {
solenberg1ac56142015-10-13 03:58:19 -070098 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg0a617e22015-10-20 15:49:38 -070099 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800100 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700101 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700102 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800103 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000104 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000105 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200106 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000107 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000108 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200109 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000110 delete channel_;
111 engine_.Terminate();
112 }
113
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100114 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
115 const auto* send_stream = call_.GetAudioSendStream(ssrc);
116 EXPECT_TRUE(send_stream);
117 return *send_stream;
118 }
119
deadbeef884f5852016-01-15 09:20:04 -0800120 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
121 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
122 EXPECT_TRUE(recv_stream);
123 return *recv_stream;
124 }
125
solenberg3a941542015-11-16 07:34:50 -0800126 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
127 const auto* send_stream = call_.GetAudioSendStream(ssrc);
128 EXPECT_TRUE(send_stream);
129 return send_stream->GetConfig();
130 }
131
solenberg7add0582015-11-20 09:59:34 -0800132 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
133 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
134 EXPECT_TRUE(recv_stream);
135 return recv_stream->GetConfig();
136 }
137
Peter Boström0c4e06b2015-10-07 12:23:21 +0200138 void TestInsertDtmf(uint32_t ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000139 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200140 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200141 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000142 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700143 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000144 // send stream.
145 EXPECT_TRUE(channel_->AddSendStream(
146 cricket::StreamParams::CreateLegacy(kSsrc1)));
147 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000148
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000149 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200150 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000151 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
152 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800153 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200154 send_parameters_.codecs.push_back(kTelephoneEventCodec);
155 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000156 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000157
158 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700159 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800160 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000161 EXPECT_TRUE(channel_->AddSendStream(
162 cricket::StreamParams::CreateLegacy(kSsrc1)));
163 }
164
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000165 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800166 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000167
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100168 // Test send.
169 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
170 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
171 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800172 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100173 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
174 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
175 EXPECT_EQ(2, telephone_event.event_code);
176 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000177 }
178
179 // Test that send bandwidth is set correctly.
180 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000181 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
182 // |expected_result| is the expected result from SetMaxSendBandwidth().
183 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000184 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000185 int max_bitrate,
186 bool expected_result,
187 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200188 cricket::AudioSendParameters parameters;
189 parameters.codecs.push_back(codec);
190 parameters.max_bandwidth_bps = max_bitrate;
191 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
192
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000193 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000194 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000195 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000196 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000197 }
198
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000199 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenberg0a617e22015-10-20 15:49:38 -0700200 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000201
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000202 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800203 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000204
205 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200206 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000207 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200208 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800209 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000210
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000211 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200212 send_parameters_.extensions.clear();
213 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800214 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000215
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000216 // Ensure extension is set properly.
217 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200218 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
219 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800220 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
221 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
222 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000223
solenberg7add0582015-11-20 09:59:34 -0800224 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000225 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700226 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800227 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
228 call_.GetAudioSendStream(kSsrc2));
229 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
230 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
231 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000232
233 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200234 send_parameters_.codecs.push_back(kPcmuCodec);
235 send_parameters_.extensions.clear();
236 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800237 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
238 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000239 }
240
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000241 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700242 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000243
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000244 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800245 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000246
247 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800248 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000249 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800250 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
251 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000252
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000253 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800254 recv_parameters_.extensions.clear();
255 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
256 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000257
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000258 // Ensure extension is set properly.
259 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800260 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
261 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
262 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
263 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
264 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000265
solenberg7add0582015-11-20 09:59:34 -0800266 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000267 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700268 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800269 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
270 call_.GetAudioReceiveStream(kSsrc2));
271 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
272 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
273 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000274
275 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800276 recv_parameters_.extensions.clear();
277 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
278 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
279 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000280 }
281
solenberg85a04962015-10-27 03:35:21 -0700282 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
283 webrtc::AudioSendStream::Stats stats;
284 stats.local_ssrc = 12;
285 stats.bytes_sent = 345;
286 stats.packets_sent = 678;
287 stats.packets_lost = 9012;
288 stats.fraction_lost = 34.56f;
289 stats.codec_name = "codec_name_send";
290 stats.ext_seqnum = 789;
291 stats.jitter_ms = 12;
292 stats.rtt_ms = 345;
293 stats.audio_level = 678;
294 stats.aec_quality_min = 9.01f;
295 stats.echo_delay_median_ms = 234;
296 stats.echo_delay_std_ms = 567;
297 stats.echo_return_loss = 890;
298 stats.echo_return_loss_enhancement = 1234;
299 stats.typing_noise_detected = true;
300 return stats;
301 }
302 void SetAudioSendStreamStats() {
303 for (auto* s : call_.GetAudioSendStreams()) {
304 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200305 }
solenberg85a04962015-10-27 03:35:21 -0700306 }
solenberg566ef242015-11-06 15:34:49 -0800307 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
308 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700309 const auto stats = GetAudioSendStreamStats();
310 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
311 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
312 EXPECT_EQ(info.packets_sent, stats.packets_sent);
313 EXPECT_EQ(info.packets_lost, stats.packets_lost);
314 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
315 EXPECT_EQ(info.codec_name, stats.codec_name);
316 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
317 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
318 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
319 EXPECT_EQ(info.audio_level, stats.audio_level);
320 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
321 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
322 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
323 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
324 EXPECT_EQ(info.echo_return_loss_enhancement,
325 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800326 EXPECT_EQ(info.typing_noise_detected,
327 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700328 }
329
330 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
331 webrtc::AudioReceiveStream::Stats stats;
332 stats.remote_ssrc = 123;
333 stats.bytes_rcvd = 456;
334 stats.packets_rcvd = 768;
335 stats.packets_lost = 101;
336 stats.fraction_lost = 23.45f;
337 stats.codec_name = "codec_name_recv";
338 stats.ext_seqnum = 678;
339 stats.jitter_ms = 901;
340 stats.jitter_buffer_ms = 234;
341 stats.jitter_buffer_preferred_ms = 567;
342 stats.delay_estimate_ms = 890;
343 stats.audio_level = 1234;
344 stats.expand_rate = 5.67f;
345 stats.speech_expand_rate = 8.90f;
346 stats.secondary_decoded_rate = 1.23f;
347 stats.accelerate_rate = 4.56f;
348 stats.preemptive_expand_rate = 7.89f;
349 stats.decoding_calls_to_silence_generator = 12;
350 stats.decoding_calls_to_neteq = 345;
351 stats.decoding_normal = 67890;
352 stats.decoding_plc = 1234;
353 stats.decoding_cng = 5678;
354 stats.decoding_plc_cng = 9012;
355 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200356 return stats;
357 }
358 void SetAudioReceiveStreamStats() {
359 for (auto* s : call_.GetAudioReceiveStreams()) {
360 s->SetStats(GetAudioReceiveStreamStats());
361 }
362 }
363 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700364 const auto stats = GetAudioReceiveStreamStats();
365 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
366 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
367 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
368 EXPECT_EQ(info.packets_lost, stats.packets_lost);
369 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
370 EXPECT_EQ(info.codec_name, stats.codec_name);
371 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
372 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
373 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200374 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700375 stats.jitter_buffer_preferred_ms);
376 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
377 EXPECT_EQ(info.audio_level, stats.audio_level);
378 EXPECT_EQ(info.expand_rate, stats.expand_rate);
379 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
380 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
381 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
382 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200383 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700384 stats.decoding_calls_to_silence_generator);
385 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
386 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
387 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
388 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
389 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
390 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200391 }
392
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000393 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200394 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000395 cricket::FakeWebRtcVoiceEngine voe_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000396 cricket::WebRtcVoiceEngine engine_;
397 cricket::VoiceMediaChannel* channel_;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200398 cricket::AudioSendParameters send_parameters_;
399 cricket::AudioRecvParameters recv_parameters_;
stefanba4c0e42016-02-04 04:12:24 -0800400
401 private:
402 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000403};
404
405// Tests that our stub library "works".
406TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
407 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000408 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000409 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000410 engine_.Terminate();
411 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000412}
413
414// Tests that we can create and destroy a channel.
415TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000416 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200417 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200418 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000419}
420
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000421// Tests that the list of supported codecs is created properly and ordered
422// correctly
423TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
424 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
425 ASSERT_FALSE(codecs.empty());
426 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
427 EXPECT_EQ(48000, codecs[0].clockrate);
428 EXPECT_EQ(2, codecs[0].channels);
429 EXPECT_EQ(64000, codecs[0].bitrate);
430 int pref = codecs[0].preference;
431 for (size_t i = 1; i < codecs.size(); ++i) {
432 EXPECT_GT(pref, codecs[i].preference);
433 pref = codecs[i].preference;
434 }
435}
436
stefanba4c0e42016-02-04 04:12:24 -0800437TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
438 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
439 bool opus_found = false;
440 for (cricket::AudioCodec codec : codecs) {
441 if (codec.name == "opus") {
442 EXPECT_TRUE(HasTransportCc(codec));
443 opus_found = true;
444 }
445 }
446 EXPECT_TRUE(opus_found);
447}
448
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000449// Tests that we can find codecs by name or id, and that we interpret the
450// clockrate and bitrate fields properly.
451TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
452 cricket::AudioCodec codec;
453 webrtc::CodecInst codec_inst;
454 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800455 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000456 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800457 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000458 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800459 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
460 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000461 // Find ISAC with a different payload id.
462 codec = kIsacCodec;
463 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800464 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000465 EXPECT_EQ(codec.id, codec_inst.pltype);
466 // Find PCMU with a 0 clockrate.
467 codec = kPcmuCodec;
468 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800469 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000470 EXPECT_EQ(codec.id, codec_inst.pltype);
471 EXPECT_EQ(8000, codec_inst.plfreq);
472 // Find PCMU with a 0 bitrate.
473 codec = kPcmuCodec;
474 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800475 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000476 EXPECT_EQ(codec.id, codec_inst.pltype);
477 EXPECT_EQ(64000, codec_inst.rate);
478 // Find ISAC with an explicit bitrate.
479 codec = kIsacCodec;
480 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800481 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000482 EXPECT_EQ(codec.id, codec_inst.pltype);
483 EXPECT_EQ(32000, codec_inst.rate);
484}
485
486// Test that we set our inbound codecs properly, including changing PT.
487TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
488 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200489 cricket::AudioRecvParameters parameters;
490 parameters.codecs.push_back(kIsacCodec);
491 parameters.codecs.push_back(kPcmuCodec);
492 parameters.codecs.push_back(kTelephoneEventCodec);
493 parameters.codecs[0].id = 106; // collide with existing telephone-event
494 parameters.codecs[2].id = 126;
495 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700496 EXPECT_TRUE(channel_->AddRecvStream(
497 cricket::StreamParams::CreateLegacy(kSsrc1)));
498 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000499 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800500 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000501 gcodec.plfreq = 16000;
502 gcodec.channels = 1;
503 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
504 EXPECT_EQ(106, gcodec.pltype);
505 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800506 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000507 gcodec.plfreq = 8000;
508 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
509 EXPECT_EQ(126, gcodec.pltype);
510 EXPECT_STREQ("telephone-event", gcodec.plname);
511}
512
513// Test that we fail to set an unknown inbound codec.
514TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
515 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200516 cricket::AudioRecvParameters parameters;
517 parameters.codecs.push_back(kIsacCodec);
518 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
519 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000520}
521
522// Test that we fail if we have duplicate types in the inbound list.
523TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
524 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200525 cricket::AudioRecvParameters parameters;
526 parameters.codecs.push_back(kIsacCodec);
527 parameters.codecs.push_back(kCn16000Codec);
528 parameters.codecs[1].id = kIsacCodec.id;
529 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000530}
531
532// Test that we can decode OPUS without stereo parameters.
533TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
534 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200535 cricket::AudioRecvParameters parameters;
536 parameters.codecs.push_back(kIsacCodec);
537 parameters.codecs.push_back(kPcmuCodec);
538 parameters.codecs.push_back(kOpusCodec);
539 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000540 EXPECT_TRUE(channel_->AddRecvStream(
541 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700542 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000543 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800544 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000545 // Even without stereo parameters, recv codecs still specify channels = 2.
546 EXPECT_EQ(2, opus.channels);
547 EXPECT_EQ(111, opus.pltype);
548 EXPECT_STREQ("opus", opus.plname);
549 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700550 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000551 EXPECT_EQ(111, opus.pltype);
552}
553
554// Test that we can decode OPUS with stereo = 0.
555TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
556 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200557 cricket::AudioRecvParameters parameters;
558 parameters.codecs.push_back(kIsacCodec);
559 parameters.codecs.push_back(kPcmuCodec);
560 parameters.codecs.push_back(kOpusCodec);
561 parameters.codecs[2].params["stereo"] = "0";
562 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000563 EXPECT_TRUE(channel_->AddRecvStream(
564 cricket::StreamParams::CreateLegacy(kSsrc1)));
565 int channel_num2 = voe_.GetLastChannel();
566 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800567 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000568 // Even when stereo is off, recv codecs still specify channels = 2.
569 EXPECT_EQ(2, opus.channels);
570 EXPECT_EQ(111, opus.pltype);
571 EXPECT_STREQ("opus", opus.plname);
572 opus.pltype = 0;
573 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
574 EXPECT_EQ(111, opus.pltype);
575}
576
577// Test that we can decode OPUS with stereo = 1.
578TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
579 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200580 cricket::AudioRecvParameters parameters;
581 parameters.codecs.push_back(kIsacCodec);
582 parameters.codecs.push_back(kPcmuCodec);
583 parameters.codecs.push_back(kOpusCodec);
584 parameters.codecs[2].params["stereo"] = "1";
585 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000586 EXPECT_TRUE(channel_->AddRecvStream(
587 cricket::StreamParams::CreateLegacy(kSsrc1)));
588 int channel_num2 = voe_.GetLastChannel();
589 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800590 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000591 EXPECT_EQ(2, opus.channels);
592 EXPECT_EQ(111, opus.pltype);
593 EXPECT_STREQ("opus", opus.plname);
594 opus.pltype = 0;
595 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
596 EXPECT_EQ(111, opus.pltype);
597}
598
599// Test that changes to recv codecs are applied to all streams.
600TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
601 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200602 cricket::AudioRecvParameters parameters;
603 parameters.codecs.push_back(kIsacCodec);
604 parameters.codecs.push_back(kPcmuCodec);
605 parameters.codecs.push_back(kTelephoneEventCodec);
606 parameters.codecs[0].id = 106; // collide with existing telephone-event
607 parameters.codecs[2].id = 126;
608 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000609 EXPECT_TRUE(channel_->AddRecvStream(
610 cricket::StreamParams::CreateLegacy(kSsrc1)));
611 int channel_num2 = voe_.GetLastChannel();
612 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800613 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000614 gcodec.plfreq = 16000;
615 gcodec.channels = 1;
616 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
617 EXPECT_EQ(106, gcodec.pltype);
618 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800619 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000620 gcodec.plfreq = 8000;
621 gcodec.channels = 1;
622 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
623 EXPECT_EQ(126, gcodec.pltype);
624 EXPECT_STREQ("telephone-event", gcodec.plname);
625}
626
627TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenberg1ac56142015-10-13 03:58:19 -0700628 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200629 cricket::AudioRecvParameters parameters;
630 parameters.codecs.push_back(kIsacCodec);
631 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200632 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000633
634 int channel_num2 = voe_.GetLastChannel();
635 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800636 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000637 gcodec.plfreq = 16000;
638 gcodec.channels = 1;
639 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
640 EXPECT_EQ(106, gcodec.pltype);
641 EXPECT_STREQ("ISAC", gcodec.plname);
642}
643
644// Test that we can apply the same set of codecs again while playing.
645TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700646 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200647 cricket::AudioRecvParameters parameters;
648 parameters.codecs.push_back(kIsacCodec);
649 parameters.codecs.push_back(kCn16000Codec);
650 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000651 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200652 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000653
654 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200655 parameters.codecs[0].id = 127;
656 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
657 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000658 EXPECT_TRUE(voe_.GetPlayout(channel_num));
659}
660
661// Test that we can add a codec while playing.
662TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700663 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200664 cricket::AudioRecvParameters parameters;
665 parameters.codecs.push_back(kIsacCodec);
666 parameters.codecs.push_back(kCn16000Codec);
667 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000668 EXPECT_TRUE(channel_->SetPlayout(true));
669
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200670 parameters.codecs.push_back(kOpusCodec);
671 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
672 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000673 EXPECT_TRUE(voe_.GetPlayout(channel_num));
674 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800675 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000676 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
677}
678
679TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenberg1ac56142015-10-13 03:58:19 -0700680 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000681
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000682 // Test that when autobw is enabled, bitrate is kept as the default
683 // value. autobw is enabled for the following tests because the target
684 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000685
686 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000687 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000688
689 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000690 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000691
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000693 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000694}
695
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000696TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700697 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000698
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000699 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000700
701 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000702 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
703 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000704
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000705 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000706 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
707 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000708}
709
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000710TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700711 EXPECT_TRUE(SetupEngineWithSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000712
713 // Test that we can only set a maximum bitrate for a fixed-rate codec
714 // if it's bigger than the fixed rate.
715
716 // PCMU, fixed bitrate == 64000.
717 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
718 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
719 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
720 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
721 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
722 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
723 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
724}
725
726TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -0700727 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200728 const int kDesiredBitrate = 128000;
729 cricket::AudioSendParameters parameters;
730 parameters.codecs = engine_.codecs();
731 parameters.max_bandwidth_bps = kDesiredBitrate;
732 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000733
734 EXPECT_TRUE(channel_->AddSendStream(
735 cricket::StreamParams::CreateLegacy(kSsrc1)));
736
737 int channel_num = voe_.GetLastChannel();
738 webrtc::CodecInst codec;
739 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200740 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000741}
742
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000743// Test that bitrate cannot be set for CBR codecs.
744// Bitrate is ignored if it is higher than the fixed bitrate.
745// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000746TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenberg1ac56142015-10-13 03:58:19 -0700747 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000748
749 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200750 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
751 int channel_num = voe_.GetLastChannel();
752 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000753 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
754 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200755
756 send_parameters_.max_bandwidth_bps = 128000;
757 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000758 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
759 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200760
761 send_parameters_.max_bandwidth_bps = 128;
762 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000763 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
764 EXPECT_EQ(64000, codec.rate);
765}
766
767// Test that we apply codecs properly.
768TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenberg1ac56142015-10-13 03:58:19 -0700769 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200770 cricket::AudioSendParameters parameters;
771 parameters.codecs.push_back(kIsacCodec);
772 parameters.codecs.push_back(kPcmuCodec);
773 parameters.codecs.push_back(kRedCodec);
774 parameters.codecs[0].id = 96;
775 parameters.codecs[0].bitrate = 48000;
776 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000777 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200778 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000779 webrtc::CodecInst gcodec;
780 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
781 EXPECT_EQ(96, gcodec.pltype);
782 EXPECT_EQ(48000, gcodec.rate);
783 EXPECT_STREQ("ISAC", gcodec.plname);
784 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000785 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000786 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
787 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100788 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000789}
790
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000791// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
792// to apply.
793TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenberg1ac56142015-10-13 03:58:19 -0700794 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200795 cricket::AudioSendParameters parameters;
796 parameters.codecs.push_back(kIsacCodec);
797 parameters.codecs.push_back(kPcmuCodec);
798 parameters.codecs.push_back(kRedCodec);
799 parameters.codecs[0].id = 96;
800 parameters.codecs[0].bitrate = 48000;
801 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000802 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
803 // Calling SetSendCodec again with same codec which is already set.
804 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200805 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000806 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
807}
808
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000809// Verify that G722 is set with 16000 samples per second to WebRTC.
810TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenberg1ac56142015-10-13 03:58:19 -0700811 EXPECT_TRUE(SetupEngineWithSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000812 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200813 cricket::AudioSendParameters parameters;
814 parameters.codecs.push_back(kG722CodecSdp);
815 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000816 webrtc::CodecInst gcodec;
817 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
818 EXPECT_STREQ("G722", gcodec.plname);
819 EXPECT_EQ(1, gcodec.channels);
820 EXPECT_EQ(16000, gcodec.plfreq);
821}
822
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000823// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000824TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenberg1ac56142015-10-13 03:58:19 -0700825 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200826 cricket::AudioSendParameters parameters;
827 parameters.codecs.push_back(kOpusCodec);
828 parameters.codecs[0].bitrate = 0;
829 parameters.codecs[0].clockrate = 50000;
830 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000831}
832
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000833// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000834TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700835 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200836 cricket::AudioSendParameters parameters;
837 parameters.codecs.push_back(kOpusCodec);
838 parameters.codecs[0].bitrate = 0;
839 parameters.codecs[0].channels = 0;
840 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000841}
842
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000843// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000844TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700845 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200846 cricket::AudioSendParameters parameters;
847 parameters.codecs.push_back(kOpusCodec);
848 parameters.codecs[0].bitrate = 0;
849 parameters.codecs[0].channels = 0;
850 parameters.codecs[0].params["stereo"] = "1";
851 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000852}
853
854// Test that if channel is 1 for opus and there's no stereo, we fail.
855TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700856 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200857 cricket::AudioSendParameters parameters;
858 parameters.codecs.push_back(kOpusCodec);
859 parameters.codecs[0].bitrate = 0;
860 parameters.codecs[0].channels = 1;
861 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000862}
863
864// Test that if channel is 1 for opus and stereo=0, we fail.
865TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700866 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200867 cricket::AudioSendParameters parameters;
868 parameters.codecs.push_back(kOpusCodec);
869 parameters.codecs[0].bitrate = 0;
870 parameters.codecs[0].channels = 1;
871 parameters.codecs[0].params["stereo"] = "0";
872 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000873}
874
875// Test that if channel is 1 for opus and stereo=1, we fail.
876TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700877 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200878 cricket::AudioSendParameters parameters;
879 parameters.codecs.push_back(kOpusCodec);
880 parameters.codecs[0].bitrate = 0;
881 parameters.codecs[0].channels = 1;
882 parameters.codecs[0].params["stereo"] = "1";
883 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000884}
885
886// Test that with bitrate=0 and no stereo,
887// channels and bitrate are 1 and 32000.
888TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700889 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000890 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200891 cricket::AudioSendParameters parameters;
892 parameters.codecs.push_back(kOpusCodec);
893 parameters.codecs[0].bitrate = 0;
894 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000895 webrtc::CodecInst gcodec;
896 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
897 EXPECT_STREQ("opus", gcodec.plname);
898 EXPECT_EQ(1, gcodec.channels);
899 EXPECT_EQ(32000, gcodec.rate);
900}
901
902// Test that with bitrate=0 and stereo=0,
903// channels and bitrate are 1 and 32000.
904TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700905 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000906 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200907 cricket::AudioSendParameters parameters;
908 parameters.codecs.push_back(kOpusCodec);
909 parameters.codecs[0].bitrate = 0;
910 parameters.codecs[0].params["stereo"] = "0";
911 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000912 webrtc::CodecInst gcodec;
913 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
914 EXPECT_STREQ("opus", gcodec.plname);
915 EXPECT_EQ(1, gcodec.channels);
916 EXPECT_EQ(32000, gcodec.rate);
917}
918
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000919// Test that with bitrate=invalid and stereo=0,
920// channels and bitrate are 1 and 32000.
921TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700922 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000923 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200924 cricket::AudioSendParameters parameters;
925 parameters.codecs.push_back(kOpusCodec);
926 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000927 webrtc::CodecInst gcodec;
928
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000929 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200930 parameters.codecs[0].bitrate = 5999;
931 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000932 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
933 EXPECT_STREQ("opus", gcodec.plname);
934 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000935 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000936
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200937 parameters.codecs[0].bitrate = 510001;
938 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000939 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
940 EXPECT_STREQ("opus", gcodec.plname);
941 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000942 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000943}
944
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000945// Test that with bitrate=0 and stereo=1,
946// channels and bitrate are 2 and 64000.
947TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700948 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000949 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200950 cricket::AudioSendParameters parameters;
951 parameters.codecs.push_back(kOpusCodec);
952 parameters.codecs[0].bitrate = 0;
953 parameters.codecs[0].params["stereo"] = "1";
954 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000955 webrtc::CodecInst gcodec;
956 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
957 EXPECT_STREQ("opus", gcodec.plname);
958 EXPECT_EQ(2, gcodec.channels);
959 EXPECT_EQ(64000, gcodec.rate);
960}
961
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000962// Test that with bitrate=invalid and stereo=1,
963// channels and bitrate are 2 and 64000.
964TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700965 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000966 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200967 cricket::AudioSendParameters parameters;
968 parameters.codecs.push_back(kOpusCodec);
969 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000970 webrtc::CodecInst gcodec;
971
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000972 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200973 parameters.codecs[0].bitrate = 5999;
974 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000975 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
976 EXPECT_STREQ("opus", gcodec.plname);
977 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000978 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000979
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200980 parameters.codecs[0].bitrate = 510001;
981 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000982 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
983 EXPECT_STREQ("opus", gcodec.plname);
984 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000985 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000986}
987
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000988// Test that with bitrate=N and stereo unset,
989// channels and bitrate are 1 and N.
990TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700991 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000992 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200993 cricket::AudioSendParameters parameters;
994 parameters.codecs.push_back(kOpusCodec);
995 parameters.codecs[0].bitrate = 96000;
996 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000997 webrtc::CodecInst gcodec;
998 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
999 EXPECT_EQ(111, gcodec.pltype);
1000 EXPECT_EQ(96000, gcodec.rate);
1001 EXPECT_STREQ("opus", gcodec.plname);
1002 EXPECT_EQ(1, gcodec.channels);
1003 EXPECT_EQ(48000, gcodec.plfreq);
1004}
1005
1006// Test that with bitrate=N and stereo=0,
1007// channels and bitrate are 1 and N.
1008TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001009 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001010 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001011 cricket::AudioSendParameters parameters;
1012 parameters.codecs.push_back(kOpusCodec);
1013 parameters.codecs[0].bitrate = 30000;
1014 parameters.codecs[0].params["stereo"] = "0";
1015 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001016 webrtc::CodecInst gcodec;
1017 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1018 EXPECT_EQ(1, gcodec.channels);
1019 EXPECT_EQ(30000, gcodec.rate);
1020 EXPECT_STREQ("opus", gcodec.plname);
1021}
1022
1023// Test that with bitrate=N and without any parameters,
1024// channels and bitrate are 1 and N.
1025TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenberg1ac56142015-10-13 03:58:19 -07001026 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001027 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001028 cricket::AudioSendParameters parameters;
1029 parameters.codecs.push_back(kOpusCodec);
1030 parameters.codecs[0].bitrate = 30000;
1031 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001032 webrtc::CodecInst gcodec;
1033 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1034 EXPECT_EQ(1, gcodec.channels);
1035 EXPECT_EQ(30000, gcodec.rate);
1036 EXPECT_STREQ("opus", gcodec.plname);
1037}
1038
1039// Test that with bitrate=N and stereo=1,
1040// channels and bitrate are 2 and N.
1041TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001042 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001043 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001044 cricket::AudioSendParameters parameters;
1045 parameters.codecs.push_back(kOpusCodec);
1046 parameters.codecs[0].bitrate = 30000;
1047 parameters.codecs[0].params["stereo"] = "1";
1048 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001049 webrtc::CodecInst gcodec;
1050 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1051 EXPECT_EQ(2, gcodec.channels);
1052 EXPECT_EQ(30000, gcodec.rate);
1053 EXPECT_STREQ("opus", gcodec.plname);
1054}
1055
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001056// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1057// Also test that the "maxaveragebitrate" can't be set to values outside the
1058// range of 6000 and 510000
1059TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001060 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001061 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001062 cricket::AudioSendParameters parameters;
1063 parameters.codecs.push_back(kOpusCodec);
1064 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001065 webrtc::CodecInst gcodec;
1066
1067 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001068 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1069 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001070 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001071 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001072
1073 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001074 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1075 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001076 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001077 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001078
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001079 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1080 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001081 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1082 EXPECT_EQ(200000, gcodec.rate);
1083}
1084
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001085// Test that we can enable NACK with opus as caller.
1086TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001087 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001088 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001089 cricket::AudioSendParameters parameters;
1090 parameters.codecs.push_back(kOpusCodec);
1091 parameters.codecs[0].AddFeedbackParam(
1092 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1093 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001094 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001095 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001096 EXPECT_TRUE(voe_.GetNACK(channel_num));
1097}
1098
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001099// Test that we can enable NACK with opus as callee.
1100TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenberg0a617e22015-10-20 15:49:38 -07001101 EXPECT_TRUE(SetupEngineWithRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001102 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001103 cricket::AudioSendParameters parameters;
1104 parameters.codecs.push_back(kOpusCodec);
1105 parameters.codecs[0].AddFeedbackParam(
1106 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1107 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001108 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001109 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001110 EXPECT_FALSE(voe_.GetNACK(channel_num));
1111
1112 EXPECT_TRUE(channel_->AddSendStream(
1113 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001114 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001115}
1116
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001117// Test that we can enable NACK on receive streams.
1118TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001119 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001120 int channel_num1 = voe_.GetLastChannel();
1121 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1122 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001123 cricket::AudioSendParameters parameters;
1124 parameters.codecs.push_back(kOpusCodec);
1125 parameters.codecs[0].AddFeedbackParam(
1126 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1127 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001128 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1129 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001130 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001131 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1132 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1133}
1134
1135// Test that we can disable NACK.
1136TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001137 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001138 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001139 cricket::AudioSendParameters parameters;
1140 parameters.codecs.push_back(kOpusCodec);
1141 parameters.codecs[0].AddFeedbackParam(
1142 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1143 cricket::kParamValueEmpty));
1144 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001145 EXPECT_TRUE(voe_.GetNACK(channel_num));
1146
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001147 parameters.codecs.clear();
1148 parameters.codecs.push_back(kOpusCodec);
1149 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001150 EXPECT_FALSE(voe_.GetNACK(channel_num));
1151}
1152
1153// Test that we can disable NACK on receive streams.
1154TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001155 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001156 int channel_num1 = voe_.GetLastChannel();
1157 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1158 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001159 cricket::AudioSendParameters parameters;
1160 parameters.codecs.push_back(kOpusCodec);
1161 parameters.codecs[0].AddFeedbackParam(
1162 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1163 cricket::kParamValueEmpty));
1164 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001165 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1166 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1167
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001168 parameters.codecs.clear();
1169 parameters.codecs.push_back(kOpusCodec);
1170 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001171 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1172 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1173}
1174
1175// Test that NACK is enabled on a new receive stream.
1176TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001177 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001178 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001179 cricket::AudioSendParameters parameters;
1180 parameters.codecs.push_back(kIsacCodec);
1181 parameters.codecs.push_back(kCn16000Codec);
1182 parameters.codecs[0].AddFeedbackParam(
1183 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1184 cricket::kParamValueEmpty));
1185 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001186 EXPECT_TRUE(voe_.GetNACK(channel_num));
1187
1188 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1189 channel_num = voe_.GetLastChannel();
1190 EXPECT_TRUE(voe_.GetNACK(channel_num));
1191 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1192 channel_num = voe_.GetLastChannel();
1193 EXPECT_TRUE(voe_.GetNACK(channel_num));
1194}
1195
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001196// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001197TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenberg1ac56142015-10-13 03:58:19 -07001198 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001199 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001200 cricket::AudioSendParameters parameters;
1201 parameters.codecs.push_back(kOpusCodec);
1202 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001203 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1204}
1205
1206// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001207TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001208 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001209 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001210 cricket::AudioSendParameters parameters;
1211 parameters.codecs.push_back(kOpusCodec);
1212 parameters.codecs[0].bitrate = 0;
1213 parameters.codecs[0].params["useinbandfec"] = "0";
1214 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001215 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1216 webrtc::CodecInst gcodec;
1217 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1218 EXPECT_STREQ("opus", gcodec.plname);
1219 EXPECT_EQ(1, gcodec.channels);
1220 EXPECT_EQ(32000, gcodec.rate);
1221}
1222
1223// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001224TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001225 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001226 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001227 cricket::AudioSendParameters parameters;
1228 parameters.codecs.push_back(kOpusCodec);
1229 parameters.codecs[0].bitrate = 0;
1230 parameters.codecs[0].params["useinbandfec"] = "1";
1231 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001232 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1233 webrtc::CodecInst gcodec;
1234 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1235 EXPECT_STREQ("opus", gcodec.plname);
1236 EXPECT_EQ(1, gcodec.channels);
1237 EXPECT_EQ(32000, gcodec.rate);
1238}
1239
1240// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001241TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001242 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001243 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001244 cricket::AudioSendParameters parameters;
1245 parameters.codecs.push_back(kOpusCodec);
1246 parameters.codecs[0].bitrate = 0;
1247 parameters.codecs[0].params["stereo"] = "1";
1248 parameters.codecs[0].params["useinbandfec"] = "1";
1249 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001250 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1251 webrtc::CodecInst gcodec;
1252 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1253 EXPECT_STREQ("opus", gcodec.plname);
1254 EXPECT_EQ(2, gcodec.channels);
1255 EXPECT_EQ(64000, gcodec.rate);
1256}
1257
1258// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001259TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001260 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001261 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001262 cricket::AudioSendParameters parameters;
1263 parameters.codecs.push_back(kIsacCodec);
1264 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001265 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1266}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001267
1268// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1269TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001270 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001271 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001272 cricket::AudioSendParameters parameters;
1273 parameters.codecs.push_back(kIsacCodec);
1274 parameters.codecs[0].params["useinbandfec"] = "1";
1275 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001276 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1277}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001278
1279// Test that Opus FEC status can be changed.
1280TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenberg1ac56142015-10-13 03:58:19 -07001281 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001282 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001283 cricket::AudioSendParameters parameters;
1284 parameters.codecs.push_back(kOpusCodec);
1285 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001286 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001287 parameters.codecs[0].params["useinbandfec"] = "1";
1288 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001289 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1290}
1291
stefanba4c0e42016-02-04 04:12:24 -08001292TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
1293 EXPECT_TRUE(SetupEngine());
1294 cricket::AudioSendParameters send_parameters;
1295 send_parameters.codecs.push_back(kOpusCodec);
1296 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1297 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1298
1299 cricket::AudioRecvParameters recv_parameters;
1300 recv_parameters.codecs.push_back(kIsacCodec);
1301 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1302 EXPECT_TRUE(
1303 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1304 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1305 EXPECT_FALSE(
1306 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1307
1308 send_parameters.codecs = engine_.codecs();
1309 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1310 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1311 EXPECT_TRUE(
1312 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1313}
1314
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001315// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1316TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenberg1ac56142015-10-13 03:58:19 -07001317 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001318 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001319 cricket::AudioSendParameters parameters;
1320 parameters.codecs.push_back(kOpusCodec);
1321 parameters.codecs[0].bitrate = 0;
1322 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1323 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001324 EXPECT_EQ(cricket::kOpusBandwidthNb,
1325 voe_.GetMaxEncodingBandwidth(channel_num));
1326 webrtc::CodecInst gcodec;
1327 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1328 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001329
1330 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001331 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1332 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001333 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1334 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001335}
1336
1337// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1338TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenberg1ac56142015-10-13 03:58:19 -07001339 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001340 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001341 cricket::AudioSendParameters parameters;
1342 parameters.codecs.push_back(kOpusCodec);
1343 parameters.codecs[0].bitrate = 0;
1344 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1345 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001346 EXPECT_EQ(cricket::kOpusBandwidthMb,
1347 voe_.GetMaxEncodingBandwidth(channel_num));
1348 webrtc::CodecInst gcodec;
1349 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1350 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001351
1352 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001353 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1354 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001355 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1356 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001357}
1358
1359// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1360TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenberg1ac56142015-10-13 03:58:19 -07001361 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001362 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001363 cricket::AudioSendParameters parameters;
1364 parameters.codecs.push_back(kOpusCodec);
1365 parameters.codecs[0].bitrate = 0;
1366 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1367 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001368 EXPECT_EQ(cricket::kOpusBandwidthWb,
1369 voe_.GetMaxEncodingBandwidth(channel_num));
1370 webrtc::CodecInst gcodec;
1371 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1372 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001373
1374 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001375 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1376 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001377 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1378 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001379}
1380
1381// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1382TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenberg1ac56142015-10-13 03:58:19 -07001383 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001384 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001385 cricket::AudioSendParameters parameters;
1386 parameters.codecs.push_back(kOpusCodec);
1387 parameters.codecs[0].bitrate = 0;
1388 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1389 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001390 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1391 voe_.GetMaxEncodingBandwidth(channel_num));
1392 webrtc::CodecInst gcodec;
1393 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1394 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001395
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001396 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001397 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1398 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001399 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1400 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001401}
1402
1403// Test 24000 < maxplaybackrate triggers Opus full band mode.
1404TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenberg1ac56142015-10-13 03:58:19 -07001405 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001406 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001407 cricket::AudioSendParameters parameters;
1408 parameters.codecs.push_back(kOpusCodec);
1409 parameters.codecs[0].bitrate = 0;
1410 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1411 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001412 EXPECT_EQ(cricket::kOpusBandwidthFb,
1413 voe_.GetMaxEncodingBandwidth(channel_num));
1414 webrtc::CodecInst gcodec;
1415 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1416 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001417
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001418 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001419 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1420 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001421 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1422 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001423}
1424
1425// Test Opus that without maxplaybackrate, default playback rate is used.
1426TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001427 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001428 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001429 cricket::AudioSendParameters parameters;
1430 parameters.codecs.push_back(kOpusCodec);
1431 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001432 EXPECT_EQ(cricket::kOpusBandwidthFb,
1433 voe_.GetMaxEncodingBandwidth(channel_num));
1434}
1435
1436// Test the with non-Opus, maxplaybackrate has no effect.
1437TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001438 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001439 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001440 cricket::AudioSendParameters parameters;
1441 parameters.codecs.push_back(kIsacCodec);
1442 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1443 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001444 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1445}
1446
1447// Test maxplaybackrate can be set on two streams.
1448TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001449 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001450 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001451 cricket::AudioSendParameters parameters;
1452 parameters.codecs.push_back(kOpusCodec);
1453 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001454 // Default bandwidth is 24000.
1455 EXPECT_EQ(cricket::kOpusBandwidthFb,
1456 voe_.GetMaxEncodingBandwidth(channel_num));
1457
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001458 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001459
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001460 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001461 EXPECT_EQ(cricket::kOpusBandwidthNb,
1462 voe_.GetMaxEncodingBandwidth(channel_num));
1463
1464 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1465 channel_num = voe_.GetLastChannel();
1466 EXPECT_EQ(cricket::kOpusBandwidthNb,
1467 voe_.GetMaxEncodingBandwidth(channel_num));
1468}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001469
Minyue Li7100dcd2015-03-27 05:05:59 +01001470// Test that with usedtx=0, Opus DTX is off.
1471TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001472 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001473 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001474 cricket::AudioSendParameters parameters;
1475 parameters.codecs.push_back(kOpusCodec);
1476 parameters.codecs[0].params["usedtx"] = "0";
1477 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001478 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1479}
1480
1481// Test that with usedtx=1, Opus DTX is on.
1482TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001483 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001484 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001485 cricket::AudioSendParameters parameters;
1486 parameters.codecs.push_back(kOpusCodec);
1487 parameters.codecs[0].params["usedtx"] = "1";
1488 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001489 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1490 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1491}
1492
1493// Test that usedtx=1 works with stereo Opus.
1494TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001495 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001496 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001497 cricket::AudioSendParameters parameters;
1498 parameters.codecs.push_back(kOpusCodec);
1499 parameters.codecs[0].params["usedtx"] = "1";
1500 parameters.codecs[0].params["stereo"] = "1";
1501 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001502 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1503 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1504}
1505
1506// Test that usedtx=1 does not work with non Opus.
1507TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001508 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001509 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001510 cricket::AudioSendParameters parameters;
1511 parameters.codecs.push_back(kIsacCodec);
1512 parameters.codecs[0].params["usedtx"] = "1";
1513 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001514 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1515}
1516
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001517// Test that we can switch back and forth between Opus and ISAC with CN.
1518TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenberg1ac56142015-10-13 03:58:19 -07001519 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001520 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001521 cricket::AudioSendParameters opus_parameters;
1522 opus_parameters.codecs.push_back(kOpusCodec);
1523 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001524 webrtc::CodecInst gcodec;
1525 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001526 EXPECT_EQ(111, gcodec.pltype);
1527 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001528
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001529 cricket::AudioSendParameters isac_parameters;
1530 isac_parameters.codecs.push_back(kIsacCodec);
1531 isac_parameters.codecs.push_back(kCn16000Codec);
1532 isac_parameters.codecs.push_back(kOpusCodec);
1533 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001534 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1535 EXPECT_EQ(103, gcodec.pltype);
1536 EXPECT_STREQ("ISAC", gcodec.plname);
1537
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001538 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001539 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001540 EXPECT_EQ(111, gcodec.pltype);
1541 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001542}
1543
1544// Test that we handle various ways of specifying bitrate.
1545TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001546 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001547 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001548 cricket::AudioSendParameters parameters;
1549 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1550 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001551 webrtc::CodecInst gcodec;
1552 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1553 EXPECT_EQ(103, gcodec.pltype);
1554 EXPECT_STREQ("ISAC", gcodec.plname);
1555 EXPECT_EQ(32000, gcodec.rate);
1556
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001557 parameters.codecs[0].bitrate = 0; // bitrate == default
1558 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001559 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1560 EXPECT_EQ(103, gcodec.pltype);
1561 EXPECT_STREQ("ISAC", gcodec.plname);
1562 EXPECT_EQ(-1, gcodec.rate);
1563
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001564 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1565 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001566 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1567 EXPECT_EQ(103, gcodec.pltype);
1568 EXPECT_STREQ("ISAC", gcodec.plname);
1569 EXPECT_EQ(28000, gcodec.rate);
1570
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001571 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1572 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001573 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1574 EXPECT_EQ(0, gcodec.pltype);
1575 EXPECT_STREQ("PCMU", gcodec.plname);
1576 EXPECT_EQ(64000, gcodec.rate);
1577
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001578 parameters.codecs[0].bitrate = 0; // bitrate == default
1579 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001580 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1581 EXPECT_EQ(0, gcodec.pltype);
1582 EXPECT_STREQ("PCMU", gcodec.plname);
1583 EXPECT_EQ(64000, gcodec.rate);
1584
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001585 parameters.codecs[0] = kOpusCodec;
1586 parameters.codecs[0].bitrate = 0; // bitrate == default
1587 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001588 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1589 EXPECT_EQ(111, gcodec.pltype);
1590 EXPECT_STREQ("opus", gcodec.plname);
1591 EXPECT_EQ(32000, gcodec.rate);
1592}
1593
Brave Yao5225dd82015-03-26 07:39:19 +08001594// Test that we could set packet size specified in kCodecParamPTime.
1595TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenberg1ac56142015-10-13 03:58:19 -07001596 EXPECT_TRUE(SetupEngineWithSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001597 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001598 cricket::AudioSendParameters parameters;
1599 parameters.codecs.push_back(kOpusCodec);
1600 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1601 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001602 webrtc::CodecInst gcodec;
1603 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1604 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1605
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001606 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1607 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001608 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1609 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1610
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001611 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1612 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001613 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1614 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1615
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001616 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1617 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1618 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001619 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1620 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1621
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001622 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1623 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1624 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001625 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1626 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1627}
1628
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001629// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001630TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenberg1ac56142015-10-13 03:58:19 -07001631 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001632 cricket::AudioSendParameters parameters;
1633 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001634}
1635
1636// Test that we can set send codecs even with telephone-event codec as the first
1637// one on the list.
1638TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001639 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001640 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001641 cricket::AudioSendParameters parameters;
1642 parameters.codecs.push_back(kTelephoneEventCodec);
1643 parameters.codecs.push_back(kIsacCodec);
1644 parameters.codecs.push_back(kPcmuCodec);
1645 parameters.codecs[0].id = 98; // DTMF
1646 parameters.codecs[1].id = 96;
1647 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001648 webrtc::CodecInst gcodec;
1649 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001650 EXPECT_EQ(96, gcodec.pltype);
1651 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001652 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001653}
1654
1655// Test that we can set send codecs even with CN codec as the first
1656// one on the list.
1657TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001658 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001659 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001660 cricket::AudioSendParameters parameters;
1661 parameters.codecs.push_back(kCn16000Codec);
1662 parameters.codecs.push_back(kIsacCodec);
1663 parameters.codecs.push_back(kPcmuCodec);
1664 parameters.codecs[0].id = 98; // wideband CN
1665 parameters.codecs[1].id = 96;
1666 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001667 webrtc::CodecInst gcodec;
1668 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1669 EXPECT_EQ(96, gcodec.pltype);
1670 EXPECT_STREQ("ISAC", gcodec.plname);
1671 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001672}
1673
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001674// Test that we set VAD and DTMF types correctly as caller.
1675TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001676 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001677 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001678 cricket::AudioSendParameters parameters;
1679 parameters.codecs.push_back(kIsacCodec);
1680 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001681 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001682 parameters.codecs.push_back(kCn16000Codec);
1683 parameters.codecs.push_back(kCn8000Codec);
1684 parameters.codecs.push_back(kTelephoneEventCodec);
1685 parameters.codecs.push_back(kRedCodec);
1686 parameters.codecs[0].id = 96;
1687 parameters.codecs[2].id = 97; // wideband CN
1688 parameters.codecs[4].id = 98; // DTMF
1689 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001690 webrtc::CodecInst gcodec;
1691 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1692 EXPECT_EQ(96, gcodec.pltype);
1693 EXPECT_STREQ("ISAC", gcodec.plname);
1694 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001695 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001696 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1697 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001698 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001699}
1700
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001701// Test that we set VAD and DTMF types correctly as callee.
1702TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001703 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001704 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001705 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001706
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001707 cricket::AudioSendParameters parameters;
1708 parameters.codecs.push_back(kIsacCodec);
1709 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001710 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001711 parameters.codecs.push_back(kCn16000Codec);
1712 parameters.codecs.push_back(kCn8000Codec);
1713 parameters.codecs.push_back(kTelephoneEventCodec);
1714 parameters.codecs.push_back(kRedCodec);
1715 parameters.codecs[0].id = 96;
1716 parameters.codecs[2].id = 97; // wideband CN
1717 parameters.codecs[4].id = 98; // DTMF
1718 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001719 EXPECT_TRUE(channel_->AddSendStream(
1720 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001721 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001722
1723 webrtc::CodecInst gcodec;
1724 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1725 EXPECT_EQ(96, gcodec.pltype);
1726 EXPECT_STREQ("ISAC", gcodec.plname);
1727 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001728 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001729 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1730 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001731 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001732}
1733
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001734// Test that we only apply VAD if we have a CN codec that matches the
1735// send codec clockrate.
1736TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenberg1ac56142015-10-13 03:58:19 -07001737 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001738 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001739 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001740 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001741 parameters.codecs.push_back(kIsacCodec);
1742 parameters.codecs.push_back(kCn16000Codec);
1743 parameters.codecs[1].id = 97;
1744 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001745 webrtc::CodecInst gcodec;
1746 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1747 EXPECT_STREQ("ISAC", gcodec.plname);
1748 EXPECT_TRUE(voe_.GetVAD(channel_num));
1749 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1750 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001751 parameters.codecs[0] = kPcmuCodec;
1752 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001753 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1754 EXPECT_STREQ("PCMU", gcodec.plname);
1755 EXPECT_FALSE(voe_.GetVAD(channel_num));
1756 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001757 parameters.codecs[1] = kCn8000Codec;
1758 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001759 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1760 EXPECT_STREQ("PCMU", gcodec.plname);
1761 EXPECT_TRUE(voe_.GetVAD(channel_num));
1762 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001763 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001764 parameters.codecs[0] = kIsacCodec;
1765 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001766 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1767 EXPECT_STREQ("ISAC", gcodec.plname);
1768 EXPECT_FALSE(voe_.GetVAD(channel_num));
1769}
1770
1771// Test that we perform case-insensitive matching of codec names.
1772TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenberg1ac56142015-10-13 03:58:19 -07001773 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001774 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001775 cricket::AudioSendParameters parameters;
1776 parameters.codecs.push_back(kIsacCodec);
1777 parameters.codecs.push_back(kPcmuCodec);
1778 parameters.codecs.push_back(kCn16000Codec);
1779 parameters.codecs.push_back(kCn8000Codec);
1780 parameters.codecs.push_back(kTelephoneEventCodec);
1781 parameters.codecs.push_back(kRedCodec);
1782 parameters.codecs[0].name = "iSaC";
1783 parameters.codecs[0].id = 96;
1784 parameters.codecs[2].id = 97; // wideband CN
1785 parameters.codecs[4].id = 98; // DTMF
1786 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001787 webrtc::CodecInst gcodec;
1788 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1789 EXPECT_EQ(96, gcodec.pltype);
1790 EXPECT_STREQ("ISAC", gcodec.plname);
1791 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001792 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001793 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1794 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001795 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001796}
1797
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001798// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001799TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001800 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001801 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001802 cricket::AudioSendParameters parameters;
1803 parameters.codecs.push_back(kRedCodec);
1804 parameters.codecs.push_back(kIsacCodec);
1805 parameters.codecs.push_back(kPcmuCodec);
1806 parameters.codecs[0].id = 127;
1807 parameters.codecs[0].params[""] = "96/96";
1808 parameters.codecs[1].id = 96;
1809 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001810 webrtc::CodecInst gcodec;
1811 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1812 EXPECT_EQ(96, gcodec.pltype);
1813 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001814 EXPECT_TRUE(voe_.GetRED(channel_num));
1815 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001816}
1817
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001818// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001819TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001820 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001821 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001822 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001823
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001824 cricket::AudioSendParameters parameters;
1825 parameters.codecs.push_back(kRedCodec);
1826 parameters.codecs.push_back(kIsacCodec);
1827 parameters.codecs.push_back(kPcmuCodec);
1828 parameters.codecs[0].id = 127;
1829 parameters.codecs[0].params[""] = "96/96";
1830 parameters.codecs[1].id = 96;
1831 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001832 EXPECT_TRUE(channel_->AddSendStream(
1833 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001834 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001835 webrtc::CodecInst gcodec;
1836 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1837 EXPECT_EQ(96, gcodec.pltype);
1838 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001839 EXPECT_TRUE(voe_.GetRED(channel_num));
1840 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001841}
1842
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001843// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001844TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenberg1ac56142015-10-13 03:58:19 -07001845 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001846 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001847 cricket::AudioSendParameters parameters;
1848 parameters.codecs.push_back(kRedCodec);
1849 parameters.codecs.push_back(kIsacCodec);
1850 parameters.codecs.push_back(kPcmuCodec);
1851 parameters.codecs[0].id = 127;
1852 parameters.codecs[1].id = 96;
1853 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001854 webrtc::CodecInst gcodec;
1855 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1856 EXPECT_EQ(96, gcodec.pltype);
1857 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001858 EXPECT_TRUE(voe_.GetRED(channel_num));
1859 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001860}
1861
1862// Test that we ignore RED if the parameters aren't named the way we expect.
1863TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001864 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001865 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001866 cricket::AudioSendParameters parameters;
1867 parameters.codecs.push_back(kRedCodec);
1868 parameters.codecs.push_back(kIsacCodec);
1869 parameters.codecs.push_back(kPcmuCodec);
1870 parameters.codecs[0].id = 127;
1871 parameters.codecs[0].params["ABC"] = "96/96";
1872 parameters.codecs[1].id = 96;
1873 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001874 webrtc::CodecInst gcodec;
1875 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1876 EXPECT_EQ(96, gcodec.pltype);
1877 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001878 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001879}
1880
1881// Test that we ignore RED if it uses different primary/secondary encoding.
1882TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001883 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001884 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001885 cricket::AudioSendParameters parameters;
1886 parameters.codecs.push_back(kRedCodec);
1887 parameters.codecs.push_back(kIsacCodec);
1888 parameters.codecs.push_back(kPcmuCodec);
1889 parameters.codecs[0].id = 127;
1890 parameters.codecs[0].params[""] = "96/0";
1891 parameters.codecs[1].id = 96;
1892 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001893 webrtc::CodecInst gcodec;
1894 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1895 EXPECT_EQ(96, gcodec.pltype);
1896 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001897 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001898}
1899
1900// Test that we ignore RED if it uses more than 2 encodings.
1901TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001902 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001903 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001904 cricket::AudioSendParameters parameters;
1905 parameters.codecs.push_back(kRedCodec);
1906 parameters.codecs.push_back(kIsacCodec);
1907 parameters.codecs.push_back(kPcmuCodec);
1908 parameters.codecs[0].id = 127;
1909 parameters.codecs[0].params[""] = "96/96/96";
1910 parameters.codecs[1].id = 96;
1911 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001912 webrtc::CodecInst gcodec;
1913 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1914 EXPECT_EQ(96, gcodec.pltype);
1915 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001916 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001917}
1918
1919// Test that we ignore RED if it has bogus codec ids.
1920TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001921 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001922 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001923 cricket::AudioSendParameters parameters;
1924 parameters.codecs.push_back(kRedCodec);
1925 parameters.codecs.push_back(kIsacCodec);
1926 parameters.codecs.push_back(kPcmuCodec);
1927 parameters.codecs[0].id = 127;
1928 parameters.codecs[0].params[""] = "ABC/ABC";
1929 parameters.codecs[1].id = 96;
1930 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001931 webrtc::CodecInst gcodec;
1932 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1933 EXPECT_EQ(96, gcodec.pltype);
1934 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001935 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001936}
1937
1938// Test that we ignore RED if it refers to a codec that is not present.
1939TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001940 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001941 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001942 cricket::AudioSendParameters parameters;
1943 parameters.codecs.push_back(kRedCodec);
1944 parameters.codecs.push_back(kIsacCodec);
1945 parameters.codecs.push_back(kPcmuCodec);
1946 parameters.codecs[0].id = 127;
1947 parameters.codecs[0].params[""] = "97/97";
1948 parameters.codecs[1].id = 96;
1949 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001950 webrtc::CodecInst gcodec;
1951 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1952 EXPECT_EQ(96, gcodec.pltype);
1953 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001954 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001955}
1956
stefanba4c0e42016-02-04 04:12:24 -08001957class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
1958 public:
1959 WebRtcVoiceEngineWithSendSideBweTest()
1960 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
1961};
1962
1963TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
1964 SupportsTransportSequenceNumberHeaderExtension) {
1965 cricket::RtpCapabilities capabilities = engine_.GetCapabilities();
1966 ASSERT_FALSE(capabilities.header_extensions.empty());
1967 for (const cricket::RtpHeaderExtension& extension :
1968 capabilities.header_extensions) {
1969 if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
1970 EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
1971 extension.id);
1972 return;
1973 }
1974 }
1975 FAIL() << "Transport sequence number extension not in header-extension list.";
1976}
1977
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001978// Test support for audio level header extension.
1979TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1980 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001981}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001982TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1983 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1984}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001985
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001986// Test support for absolute send time header extension.
1987TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1988 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1989}
1990TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1991 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001992}
1993
solenberg1ac56142015-10-13 03:58:19 -07001994// Test that we can create a channel and start sending on it.
1995TEST_F(WebRtcVoiceEngineTestFake, Send) {
1996 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001997 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001998 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001999 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2000 EXPECT_TRUE(voe_.GetSend(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002001 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2002 EXPECT_FALSE(voe_.GetSend(channel_num));
solenberg1ac56142015-10-13 03:58:19 -07002003}
2004
2005// Test that we can create a channel and start playing out on it.
2006TEST_F(WebRtcVoiceEngineTestFake, Playout) {
2007 EXPECT_TRUE(SetupEngineWithRecvStream());
2008 int channel_num = voe_.GetLastChannel();
2009 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2010 EXPECT_TRUE(channel_->SetPlayout(true));
2011 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002012 EXPECT_TRUE(channel_->SetPlayout(false));
2013 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2014}
2015
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002016// Test that we can add and remove send streams.
2017TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2018 SetupForMultiSendStream();
2019
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002020 // Set the global state for sending.
2021 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2022
solenbergc96df772015-10-21 13:01:53 -07002023 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002024 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002025 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002026 // Verify that we are in a sending state for all the created streams.
solenberg3a941542015-11-16 07:34:50 -08002027 EXPECT_TRUE(voe_.GetSend(GetSendStreamConfig(ssrc).voe_channel_id));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002028 }
tfarina5237aaf2015-11-10 23:44:30 -08002029 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002030
solenbergc96df772015-10-21 13:01:53 -07002031 // Delete the send streams.
2032 for (uint32_t ssrc : kSsrcs4) {
2033 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002034 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002035 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002036 }
solenbergc96df772015-10-21 13:01:53 -07002037 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002038}
2039
2040// Test SetSendCodecs correctly configure the codecs in all send streams.
2041TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2042 SetupForMultiSendStream();
2043
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002044 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002045 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002046 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002047 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002048 }
2049
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002050 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002051 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002052 parameters.codecs.push_back(kIsacCodec);
2053 parameters.codecs.push_back(kCn16000Codec);
2054 parameters.codecs[1].id = 97;
2055 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002056
2057 // Verify ISAC and VAD are corrected configured on all send channels.
2058 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002059 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002060 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002061 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2062 EXPECT_STREQ("ISAC", gcodec.plname);
2063 EXPECT_TRUE(voe_.GetVAD(channel_num));
2064 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2065 }
2066
2067 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002068 parameters.codecs[0] = kPcmuCodec;
2069 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002070 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002071 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002072 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2073 EXPECT_STREQ("PCMU", gcodec.plname);
2074 EXPECT_FALSE(voe_.GetVAD(channel_num));
2075 }
2076}
2077
2078// Test we can SetSend on all send streams correctly.
2079TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2080 SetupForMultiSendStream();
2081
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002082 // Create the send channels and they should be a SEND_NOTHING date.
solenbergc96df772015-10-21 13:01:53 -07002083 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002084 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002085 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002086 int channel_num = voe_.GetLastChannel();
2087 EXPECT_FALSE(voe_.GetSend(channel_num));
2088 }
2089
2090 // Set the global state for starting sending.
2091 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
solenbergc96df772015-10-21 13:01:53 -07002092 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002093 // Verify that we are in a sending state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002094 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002095 EXPECT_TRUE(voe_.GetSend(channel_num));
2096 }
2097
2098 // Set the global state for stopping sending.
2099 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
solenbergc96df772015-10-21 13:01:53 -07002100 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002101 // Verify that we are in a stop state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002102 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002103 EXPECT_FALSE(voe_.GetSend(channel_num));
2104 }
2105}
2106
2107// Test we can set the correct statistics on all send streams.
2108TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2109 SetupForMultiSendStream();
2110
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002111 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002112 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002113 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002114 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002115 }
solenberg85a04962015-10-27 03:35:21 -07002116 SetAudioSendStreamStats();
2117
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002118 // Create a receive stream to check that none of the send streams end up in
2119 // the receive stream stats.
2120 EXPECT_TRUE(channel_->AddRecvStream(
2121 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002122 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002123 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2124 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002125
solenberg85a04962015-10-27 03:35:21 -07002126 // Check stats for the added streams.
2127 {
2128 cricket::VoiceMediaInfo info;
2129 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002130
solenberg85a04962015-10-27 03:35:21 -07002131 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002132 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002133 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002134 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002135 }
2136
2137 // We have added one receive stream. We should see empty stats.
2138 EXPECT_EQ(info.receivers.size(), 1u);
2139 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002140 }
solenberg1ac56142015-10-13 03:58:19 -07002141
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002142 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002143 {
2144 cricket::VoiceMediaInfo info;
2145 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2146 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002147 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002148 EXPECT_EQ(0u, info.receivers.size());
2149 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002150
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002151 // Deliver a new packet - a default receive stream should be created and we
2152 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002153 {
2154 cricket::VoiceMediaInfo info;
2155 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2156 SetAudioReceiveStreamStats();
2157 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002158 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002159 EXPECT_EQ(1u, info.receivers.size());
2160 VerifyVoiceReceiverInfo(info.receivers[0]);
2161 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002162}
2163
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002164// Test that we can add and remove receive streams, and do proper send/playout.
2165// We can receive on multiple streams while sending one stream.
2166TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002167 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002168 int channel_num1 = voe_.GetLastChannel();
2169
solenberg1ac56142015-10-13 03:58:19 -07002170 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002171 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002172 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002173 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002174
solenberg1ac56142015-10-13 03:58:19 -07002175 // Adding another stream should enable playout on the new stream only.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002176 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2177 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002178 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2179 EXPECT_TRUE(voe_.GetSend(channel_num1));
2180 EXPECT_FALSE(voe_.GetSend(channel_num2));
2181
solenberg1ac56142015-10-13 03:58:19 -07002182 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002183 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2184 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2185
2186 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2187 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2188 int channel_num3 = voe_.GetLastChannel();
2189 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2190 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2191 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2192 EXPECT_FALSE(voe_.GetSend(channel_num3));
2193
2194 // Stop sending.
2195 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2196 EXPECT_FALSE(voe_.GetSend(channel_num1));
2197 EXPECT_FALSE(voe_.GetSend(channel_num2));
2198 EXPECT_FALSE(voe_.GetSend(channel_num3));
2199
2200 // Stop playout.
2201 EXPECT_TRUE(channel_->SetPlayout(false));
2202 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2203 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2204 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2205
solenberg1ac56142015-10-13 03:58:19 -07002206 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002207 EXPECT_TRUE(channel_->SetPlayout(true));
2208 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2209 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2210 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2211
solenberg1ac56142015-10-13 03:58:19 -07002212 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002213 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2214 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002215 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002216}
2217
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002218// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002219// and start sending on it.
2220TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2221 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg246b8172015-12-08 09:50:23 -08002222 cricket::AudioOptions options_adjust_agc;
2223 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002224 int channel_num = voe_.GetLastChannel();
2225 webrtc::AgcConfig agc_config;
2226 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2227 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002228 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002229 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002230 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2231 EXPECT_TRUE(voe_.GetSend(channel_num));
2232 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2233 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002234 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2235 EXPECT_FALSE(voe_.GetSend(channel_num));
2236 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002237}
2238
wu@webrtc.org97077a32013-10-25 21:18:33 +00002239TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002240 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002241 webrtc::AgcConfig agc_config;
2242 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2243 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002244 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2245 send_parameters_.options.tx_agc_digital_compression_gain =
2246 rtc::Optional<uint16_t>(9);
2247 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2248 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2249 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002250 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2251 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2252 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2253 EXPECT_TRUE(agc_config.limiterEnable);
2254
2255 // Check interaction with adjust_agc_delta. Both should be respected, for
2256 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002257 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2258 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002259 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2260 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2261}
2262
wu@webrtc.org97077a32013-10-25 21:18:33 +00002263TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002264 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg246b8172015-12-08 09:50:23 -08002265 send_parameters_.options.recording_sample_rate =
2266 rtc::Optional<uint32_t>(48000);
2267 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2268 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002269
2270 unsigned int recording_sample_rate, playout_sample_rate;
2271 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2272 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2273 EXPECT_EQ(48000u, recording_sample_rate);
2274 EXPECT_EQ(44100u, playout_sample_rate);
2275}
2276
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002277// Test that we can set the outgoing SSRC properly.
2278// SSRC is set in SetupEngine by calling AddSendStream.
2279TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002280 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002281 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002282}
2283
2284TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2285 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002286 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002287 SetAudioSendStreamStats();
solenberg1ac56142015-10-13 03:58:19 -07002288 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2289 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002290 EXPECT_TRUE(channel_->AddRecvStream(
2291 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002292 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2293 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002294
solenberg85a04962015-10-27 03:35:21 -07002295 // Check stats for the added streams.
2296 {
2297 cricket::VoiceMediaInfo info;
2298 EXPECT_EQ(true, channel_->GetStats(&info));
2299
2300 // We have added one send stream. We should see the stats we've set.
2301 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002302 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002303 // We have added one receive stream. We should see empty stats.
2304 EXPECT_EQ(info.receivers.size(), 1u);
2305 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2306 }
solenberg1ac56142015-10-13 03:58:19 -07002307
solenberg566ef242015-11-06 15:34:49 -08002308 // Start sending - this affects some reported stats.
2309 {
2310 cricket::VoiceMediaInfo info;
2311 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2312 EXPECT_EQ(true, channel_->GetStats(&info));
2313 VerifyVoiceSenderInfo(info.senders[0], true);
2314 }
2315
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002316 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002317 {
2318 cricket::VoiceMediaInfo info;
2319 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2320 EXPECT_EQ(true, channel_->GetStats(&info));
2321 EXPECT_EQ(1u, info.senders.size());
2322 EXPECT_EQ(0u, info.receivers.size());
2323 }
solenberg1ac56142015-10-13 03:58:19 -07002324
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002325 // Deliver a new packet - a default receive stream should be created and we
2326 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002327 {
2328 cricket::VoiceMediaInfo info;
2329 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2330 SetAudioReceiveStreamStats();
2331 EXPECT_EQ(true, channel_->GetStats(&info));
2332 EXPECT_EQ(1u, info.senders.size());
2333 EXPECT_EQ(1u, info.receivers.size());
2334 VerifyVoiceReceiverInfo(info.receivers[0]);
2335 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002336}
2337
2338// Test that we can set the outgoing SSRC properly with multiple streams.
2339// SSRC is set in SetupEngine by calling AddSendStream.
2340TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002341 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002342 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002343 EXPECT_TRUE(channel_->AddRecvStream(
2344 cricket::StreamParams::CreateLegacy(kSsrc2)));
2345 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002346}
2347
2348// Test that the local SSRC is the same on sending and receiving channels if the
2349// receive channel is created before the send channel.
2350TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002351 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002352 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002353
2354 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2355 int receive_channel_num = voe_.GetLastChannel();
2356 EXPECT_TRUE(channel_->AddSendStream(
2357 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002358
solenberg3a941542015-11-16 07:34:50 -08002359 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002360 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002361}
2362
2363// Test that we can properly receive packets.
2364TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2365 EXPECT_TRUE(SetupEngine());
solenberg7e63ef02015-11-20 00:19:43 -08002366 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002367 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002368 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002369 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002370}
2371
2372// Test that we can properly receive packets on multiple streams.
2373TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg7e63ef02015-11-20 00:19:43 -08002374 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002375 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2376 int channel_num1 = voe_.GetLastChannel();
2377 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2378 int channel_num2 = voe_.GetLastChannel();
2379 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2380 int channel_num3 = voe_.GetLastChannel();
2381 // Create packets with the right SSRCs.
2382 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002383 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002384 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002385 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002386 }
2387 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2388 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2389 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002390
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002391 DeliverPacket(packets[0], sizeof(packets[0]));
2392 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2393 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2394 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002395
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002396 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002397 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002398 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2399 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002400
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002401 DeliverPacket(packets[2], sizeof(packets[2]));
2402 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002403 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002404 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002405
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002406 DeliverPacket(packets[3], sizeof(packets[3]));
2407 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2408 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002409 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2410
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002411 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2412 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2413 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2414}
2415
solenberg7e63ef02015-11-20 00:19:43 -08002416// Test that receiving on an unsignalled stream works (default channel will be
2417// created).
2418TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
2419 EXPECT_TRUE(SetupEngine());
2420 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2421 int channel_num = voe_.GetLastChannel();
2422 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2423}
2424
2425// Test that receiving on an unsignalled stream works (default channel will be
2426// created), and that packets will be forwarded to the default channel
2427// regardless of their SSRCs.
2428TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
2429 EXPECT_TRUE(SetupEngine());
2430 char packet[sizeof(kPcmuFrame)];
2431 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2432
2433 // Note that the first unknown SSRC cannot be 0, because we only support
2434 // creating receive streams for SSRC!=0.
2435 DeliverPacket(packet, sizeof(packet));
2436 int channel_num = voe_.GetLastChannel();
2437 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2438 // Once we have the default channel, SSRC==0 will be ok.
2439 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2440 rtc::SetBE32(&packet[8], ssrc);
2441 DeliverPacket(packet, sizeof(packet));
2442 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2443 }
2444}
2445
2446// Test that a default channel is created even after a signalled stream has been
2447// added, and that this stream will get any packets for unknown SSRCs.
2448TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
2449 EXPECT_TRUE(SetupEngine());
2450 char packet[sizeof(kPcmuFrame)];
2451 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2452
2453 // Add a known stream, send packet and verify we got it.
2454 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2455 int signalled_channel_num = voe_.GetLastChannel();
2456 DeliverPacket(packet, sizeof(packet));
2457 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2458
2459 // Note that the first unknown SSRC cannot be 0, because we only support
2460 // creating receive streams for SSRC!=0.
2461 rtc::SetBE32(&packet[8], 7011);
2462 DeliverPacket(packet, sizeof(packet));
2463 int channel_num = voe_.GetLastChannel();
2464 EXPECT_NE(channel_num, signalled_channel_num);
2465 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2466 // Once we have the default channel, SSRC==0 will be ok.
2467 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2468 rtc::SetBE32(&packet[8], ssrc);
2469 DeliverPacket(packet, sizeof(packet));
2470 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2471 }
2472}
2473
solenberg0a617e22015-10-20 15:49:38 -07002474// Test that we properly handle failures to add a receive stream.
2475TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
2476 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002477 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002478 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002479}
2480
solenberg0a617e22015-10-20 15:49:38 -07002481// Test that we properly handle failures to add a send stream.
2482TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
2483 EXPECT_TRUE(SetupEngine());
2484 voe_.set_fail_create_channel(true);
2485 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2486}
2487
solenberg1ac56142015-10-13 03:58:19 -07002488// Test that AddRecvStream creates new stream.
2489TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2490 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002491 int channel_num = voe_.GetLastChannel();
2492 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002493 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002494}
2495
2496// Test that after adding a recv stream, we do not decode more codecs than
2497// those previously passed into SetRecvCodecs.
2498TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002499 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002500 cricket::AudioRecvParameters parameters;
2501 parameters.codecs.push_back(kIsacCodec);
2502 parameters.codecs.push_back(kPcmuCodec);
2503 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002504 EXPECT_TRUE(channel_->AddRecvStream(
2505 cricket::StreamParams::CreateLegacy(kSsrc1)));
2506 int channel_num2 = voe_.GetLastChannel();
2507 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002508 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002509 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002510 gcodec.channels = 2;
2511 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2512}
2513
2514// Test that we properly clean up any streams that were added, even if
2515// not explicitly removed.
2516TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002517 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002518 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002519 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2520 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2521 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2522 delete channel_;
2523 channel_ = NULL;
2524 EXPECT_EQ(0, voe_.GetNumChannels());
2525}
2526
wu@webrtc.org78187522013-10-07 23:32:02 +00002527TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002528 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002529 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2530}
2531
2532TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2533 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002534 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002535 // Manually delete channel to simulate a failure.
2536 int channel = voe_.GetLastChannel();
2537 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2538 // Add recv stream 2 should work.
2539 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002540 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002541 EXPECT_NE(channel, new_channel);
2542 // The last created channel is deleted too.
2543 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002544}
2545
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002546// Test the InsertDtmf on default send stream as caller.
2547TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2548 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002549}
2550
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002551// Test the InsertDtmf on default send stream as callee
2552TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2553 TestInsertDtmf(0, false);
2554}
2555
2556// Test the InsertDtmf on specified send stream as caller.
2557TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2558 TestInsertDtmf(kSsrc1, true);
2559}
2560
2561// Test the InsertDtmf on specified send stream as callee.
2562TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2563 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002564}
2565
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002566TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002567 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002568 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002569 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2570 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2571 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2572 EXPECT_TRUE(channel_->SetPlayout(true));
2573 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2574 EXPECT_TRUE(channel_->SetPlayout(false));
2575 EXPECT_FALSE(channel_->SetPlayout(true));
2576}
2577
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002578TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002579 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002580
2581 bool ec_enabled;
2582 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002583 webrtc::AecmModes aecm_mode;
2584 bool cng_enabled;
2585 bool agc_enabled;
2586 webrtc::AgcModes agc_mode;
2587 webrtc::AgcConfig agc_config;
2588 bool ns_enabled;
2589 webrtc::NsModes ns_mode;
2590 bool highpass_filter_enabled;
2591 bool stereo_swapping_enabled;
2592 bool typing_detection_enabled;
2593 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002594 voe_.GetAecmMode(aecm_mode, cng_enabled);
2595 voe_.GetAgcStatus(agc_enabled, agc_mode);
2596 voe_.GetAgcConfig(agc_config);
2597 voe_.GetNsStatus(ns_enabled, ns_mode);
2598 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2599 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2600 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2601 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002602 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002603 EXPECT_FALSE(cng_enabled);
2604 EXPECT_TRUE(agc_enabled);
2605 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2606 EXPECT_TRUE(ns_enabled);
2607 EXPECT_TRUE(highpass_filter_enabled);
2608 EXPECT_FALSE(stereo_swapping_enabled);
2609 EXPECT_TRUE(typing_detection_enabled);
2610 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2611 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002612 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2613 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002614
solenberg246b8172015-12-08 09:50:23 -08002615 // Nothing set in AudioOptions, so everything should be as default.
2616 send_parameters_.options = cricket::AudioOptions();
2617 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002618 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002619 voe_.GetAecmMode(aecm_mode, cng_enabled);
2620 voe_.GetAgcStatus(agc_enabled, agc_mode);
2621 voe_.GetAgcConfig(agc_config);
2622 voe_.GetNsStatus(ns_enabled, ns_mode);
2623 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2624 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2625 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2626 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002627 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002628 EXPECT_FALSE(cng_enabled);
2629 EXPECT_TRUE(agc_enabled);
2630 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2631 EXPECT_TRUE(ns_enabled);
2632 EXPECT_TRUE(highpass_filter_enabled);
2633 EXPECT_FALSE(stereo_swapping_enabled);
2634 EXPECT_TRUE(typing_detection_enabled);
2635 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2636 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002637 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2638 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002639
2640 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002641 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2642 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002643 voe_.GetEcStatus(ec_enabled, ec_mode);
2644 EXPECT_FALSE(ec_enabled);
2645
2646 // Turn echo cancellation back on, with settings, and make sure
2647 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002648 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2649 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002650 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002651 voe_.GetAecmMode(aecm_mode, cng_enabled);
2652 voe_.GetAgcStatus(agc_enabled, agc_mode);
2653 voe_.GetAgcConfig(agc_config);
2654 voe_.GetNsStatus(ns_enabled, ns_mode);
2655 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2656 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2657 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2658 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002659 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002660 EXPECT_TRUE(agc_enabled);
2661 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2662 EXPECT_TRUE(ns_enabled);
2663 EXPECT_TRUE(highpass_filter_enabled);
2664 EXPECT_FALSE(stereo_swapping_enabled);
2665 EXPECT_TRUE(typing_detection_enabled);
2666 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2667 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2668
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002669 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2670 // control.
solenberg246b8172015-12-08 09:50:23 -08002671 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2672 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002673 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002674 voe_.GetAecmMode(aecm_mode, cng_enabled);
2675 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002676 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002677 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2678
2679 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002680 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2681 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2682 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2683 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002684 voe_.GetEcStatus(ec_enabled, ec_mode);
2685 EXPECT_FALSE(ec_enabled);
2686 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002687 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2688 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002689 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002690 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002691 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002692 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2693
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002694 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002695 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2696 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002697 voe_.GetAgcStatus(agc_enabled, agc_mode);
2698 EXPECT_FALSE(agc_enabled);
2699
2700 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002701 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2702 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2703 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002704 voe_.GetAgcStatus(agc_enabled, agc_mode);
2705 EXPECT_TRUE(agc_enabled);
2706 voe_.GetAgcConfig(agc_config);
2707 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2708
2709 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002710 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2711 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2712 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2713 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2714 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002715 voe_.GetNsStatus(ns_enabled, ns_mode);
2716 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2717 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2718 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2719 EXPECT_FALSE(ns_enabled);
2720 EXPECT_FALSE(highpass_filter_enabled);
2721 EXPECT_FALSE(typing_detection_enabled);
2722 EXPECT_TRUE(stereo_swapping_enabled);
2723
solenberg1ac56142015-10-13 03:58:19 -07002724 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002725 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002726 voe_.GetEcStatus(ec_enabled, ec_mode);
2727 voe_.GetNsStatus(ns_enabled, ns_mode);
2728 EXPECT_TRUE(ec_enabled);
2729 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2730 EXPECT_FALSE(ns_enabled);
2731 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2732}
2733
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002734TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002735 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002736
2737 bool ec_enabled;
2738 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002739 bool agc_enabled;
2740 webrtc::AgcModes agc_mode;
2741 bool ns_enabled;
2742 webrtc::NsModes ns_mode;
2743 bool highpass_filter_enabled;
2744 bool stereo_swapping_enabled;
2745 bool typing_detection_enabled;
2746
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002747 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002748 voe_.GetAgcStatus(agc_enabled, agc_mode);
2749 voe_.GetNsStatus(ns_enabled, ns_mode);
2750 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2751 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2752 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2753 EXPECT_TRUE(ec_enabled);
2754 EXPECT_TRUE(agc_enabled);
2755 EXPECT_TRUE(ns_enabled);
2756 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002757 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002758 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002759}
2760
2761TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2762 webrtc::AgcConfig set_config = {0};
2763 set_config.targetLeveldBOv = 3;
2764 set_config.digitalCompressionGaindB = 9;
2765 set_config.limiterEnable = true;
2766 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002767 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002768
2769 webrtc::AgcConfig config = {0};
2770 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2771 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2772 EXPECT_EQ(set_config.digitalCompressionGaindB,
2773 config.digitalCompressionGaindB);
2774 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2775}
2776
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002777TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002778 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg66f43392015-09-09 01:36:22 -07002779 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2780 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002781 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002782 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2783 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002784 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002785
2786 // Have to add a stream to make SetSend work.
2787 cricket::StreamParams stream1;
2788 stream1.ssrcs.push_back(1);
2789 channel1->AddSendStream(stream1);
2790 cricket::StreamParams stream2;
2791 stream2.ssrcs.push_back(2);
2792 channel2->AddSendStream(stream2);
2793
2794 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002795 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002796 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2797 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2798 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002799 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2800 EXPECT_EQ(parameters_options_all.options, channel1->options());
2801 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2802 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002803
2804 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002805 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002806 parameters_options_no_ns.options.noise_suppression =
2807 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002808 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2809 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002810 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2811 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2812 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002813 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002814
2815 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002816 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002817 parameters_options_no_agc.options.auto_gain_control =
2818 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002819 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002820 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2821 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2822 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002823 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002824
solenberg246b8172015-12-08 09:50:23 -08002825 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002826 bool ec_enabled;
2827 webrtc::EcModes ec_mode;
2828 bool agc_enabled;
2829 webrtc::AgcModes agc_mode;
2830 bool ns_enabled;
2831 webrtc::NsModes ns_mode;
2832 voe_.GetEcStatus(ec_enabled, ec_mode);
2833 voe_.GetAgcStatus(agc_enabled, agc_mode);
2834 voe_.GetNsStatus(ns_enabled, ns_mode);
2835 EXPECT_TRUE(ec_enabled);
2836 EXPECT_TRUE(agc_enabled);
2837 EXPECT_TRUE(ns_enabled);
2838
2839 channel1->SetSend(cricket::SEND_MICROPHONE);
2840 voe_.GetEcStatus(ec_enabled, ec_mode);
2841 voe_.GetAgcStatus(agc_enabled, agc_mode);
2842 voe_.GetNsStatus(ns_enabled, ns_mode);
2843 EXPECT_TRUE(ec_enabled);
2844 EXPECT_TRUE(agc_enabled);
2845 EXPECT_FALSE(ns_enabled);
2846
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002847 channel2->SetSend(cricket::SEND_MICROPHONE);
2848 voe_.GetEcStatus(ec_enabled, ec_mode);
2849 voe_.GetAgcStatus(agc_enabled, agc_mode);
2850 voe_.GetNsStatus(ns_enabled, ns_mode);
2851 EXPECT_TRUE(ec_enabled);
2852 EXPECT_FALSE(agc_enabled);
2853 EXPECT_TRUE(ns_enabled);
2854
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002855 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08002856 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002857 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2858 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002859 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01002860 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07002861 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01002862 rtc::Optional<bool>(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002863 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002864 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01002865 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2866 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2867 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002868 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002869 voe_.GetEcStatus(ec_enabled, ec_mode);
2870 voe_.GetAgcStatus(agc_enabled, agc_mode);
2871 voe_.GetNsStatus(ns_enabled, ns_mode);
2872 EXPECT_TRUE(ec_enabled);
2873 EXPECT_FALSE(agc_enabled);
2874 EXPECT_FALSE(ns_enabled);
2875}
2876
wu@webrtc.orgde305012013-10-31 15:40:38 +00002877// This test verifies DSCP settings are properly applied on voice media channel.
2878TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002879 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002880 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002881 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002882 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00002883 new cricket::FakeNetworkInterface);
2884 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002885 cricket::AudioSendParameters parameters = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002886 parameters.options.dscp = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002887 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002888 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00002889 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002890 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002891 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
Karl Wibergbe579832015-11-10 22:34:18 +01002892 parameters.options.dscp = rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002893 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002894 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00002895}
2896
solenberg1ac56142015-10-13 03:58:19 -07002897TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002898 EXPECT_TRUE(SetupEngine());
2899 cricket::WebRtcVoiceMediaChannel* media_channel =
2900 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002901 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2902 EXPECT_TRUE(channel_->AddRecvStream(
2903 cricket::StreamParams::CreateLegacy(kSsrc1)));
2904 int channel_id = voe_.GetLastChannel();
2905 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2906 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2907 EXPECT_TRUE(channel_->AddRecvStream(
2908 cricket::StreamParams::CreateLegacy(kSsrc2)));
2909 int channel_id2 = voe_.GetLastChannel();
2910 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002911}
2912
solenberg1ac56142015-10-13 03:58:19 -07002913TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002914 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002915 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002916 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2917 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2918 EXPECT_TRUE(channel_->AddSendStream(
2919 cricket::StreamParams::CreateLegacy(kSsrc1)));
2920 int channel_id = voe_.GetLastChannel();
2921 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2922 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2923 EXPECT_TRUE(channel_->AddSendStream(
2924 cricket::StreamParams::CreateLegacy(kSsrc2)));
2925 int channel_id2 = voe_.GetLastChannel();
2926 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002927}
2928
solenberg4bac9c52015-10-09 02:32:53 -07002929TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002930 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002931 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002932 cricket::StreamParams stream;
2933 stream.ssrcs.push_back(kSsrc2);
2934 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002935 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002936 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002937 float scale = 0;
2938 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2939 EXPECT_DOUBLE_EQ(3, scale);
2940}
2941
2942TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
2943 EXPECT_TRUE(SetupEngine());
2944 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2945 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2946 int channel_id = voe_.GetLastChannel();
2947 float scale = 0;
2948 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2949 EXPECT_DOUBLE_EQ(2, scale);
2950 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07002951 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002952 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002953}
2954
pbos8fc7fa72015-07-15 08:02:58 -07002955TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02002956 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07002957 const std::string kSyncLabel = "AvSyncLabel";
2958
solenberg1ac56142015-10-13 03:58:19 -07002959 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07002960 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
2961 sp.sync_label = kSyncLabel;
2962 // Creating two channels to make sure that sync label is set properly for both
2963 // the default voice channel and following ones.
2964 EXPECT_TRUE(channel_->AddRecvStream(sp));
2965 sp.ssrcs[0] += 1;
2966 EXPECT_TRUE(channel_->AddRecvStream(sp));
2967
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002968 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07002969 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002970 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002971 << "SyncGroup should be set based on sync_label";
2972 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002973 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002974 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07002975}
2976
solenberg3a941542015-11-16 07:34:50 -08002977// TODO(solenberg): Remove, once recv streams are configured through Call.
2978// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07002979TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002980 // Test that setting the header extensions results in the expected state
2981 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002982 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002983 ssrcs.push_back(223);
2984 ssrcs.push_back(224);
2985
solenberg1ac56142015-10-13 03:58:19 -07002986 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002987 cricket::WebRtcVoiceMediaChannel* media_channel =
2988 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002989 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002990 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002991 EXPECT_TRUE(media_channel->AddRecvStream(
2992 cricket::StreamParams::CreateLegacy(ssrc)));
2993 }
2994
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002995 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02002996 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002997 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002998 EXPECT_NE(nullptr, s);
2999 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3000 }
3001
3002 // Set up receive extensions.
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003003 cricket::RtpCapabilities capabilities = engine_.GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003004 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003005 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003006 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003007 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003008 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003009 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003010 EXPECT_NE(nullptr, s);
3011 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003012 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3013 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003014 for (const auto& s_ext : s_exts) {
3015 if (e_ext.id == s_ext.id) {
3016 EXPECT_EQ(e_ext.uri, s_ext.name);
3017 }
3018 }
3019 }
3020 }
3021
3022 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003023 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003024 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003025 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003026 EXPECT_NE(nullptr, s);
3027 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3028 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003029}
3030
3031TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3032 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003033 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003034 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3035 static const unsigned char kRtcp[] = {
3036 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3037 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3038 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3039 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3040 };
3041 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3042
solenberg1ac56142015-10-13 03:58:19 -07003043 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003044 cricket::WebRtcVoiceMediaChannel* media_channel =
3045 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003046 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003047 EXPECT_TRUE(media_channel->AddRecvStream(
3048 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3049
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003050 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003051 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003052 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003053 EXPECT_EQ(0, s->received_packets());
3054 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3055 EXPECT_EQ(1, s->received_packets());
3056 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3057 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003058}
Minyue2013aec2015-05-13 14:14:42 +02003059
solenberg0a617e22015-10-20 15:49:38 -07003060// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003061// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003062TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenberg1ac56142015-10-13 03:58:19 -07003063 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003064 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003065 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003066 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3067 int recv_ch = voe_.GetLastChannel();
3068 EXPECT_NE(recv_ch, default_channel);
3069 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3070 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3071 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003072 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3073 recv_ch = voe_.GetLastChannel();
3074 EXPECT_NE(recv_ch, default_channel);
3075 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003076}
3077
3078TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003079 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003080 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003081
3082 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3083 int recv_ch = voe_.GetLastChannel();
3084
3085 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3086 int send_ch = voe_.GetLastChannel();
3087
3088 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3089 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3090 // channel of |recv_ch|.This is not a common case, since, normally, only the
3091 // default channel can be associated. However, the default is not deletable.
3092 // So we force the |recv_ch| to associate with a non-default channel.
3093 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3094 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3095
3096 EXPECT_TRUE(channel_->RemoveSendStream(2));
3097 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3098}
stefan658910c2015-09-03 05:48:32 -07003099
deadbeef884f5852016-01-15 09:20:04 -08003100TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
3101 EXPECT_TRUE(SetupEngine());
3102 rtc::scoped_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3103 rtc::scoped_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
3104
3105 // Setting the sink before a recv stream exists should do nothing.
3106 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3107 EXPECT_TRUE(
3108 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3109 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3110
3111 // Now try actually setting the sink.
3112 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3113 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3114
3115 // Now try resetting it.
3116 channel_->SetRawAudioSink(kSsrc1, nullptr);
3117 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3118}
3119
3120TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
3121 EXPECT_TRUE(SetupEngine());
3122 rtc::scoped_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3123 rtc::scoped_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
3124
3125 // Should be able to set a default sink even when no stream exists.
3126 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3127
3128 // Create default channel and ensure it's assigned the default sink.
3129 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3130 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3131
3132 // Try resetting the default sink.
3133 channel_->SetRawAudioSink(0, nullptr);
3134 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3135
3136 // Try setting the default sink while the default stream exists.
3137 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3138 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3139
3140 // If we remove and add a default stream, it should get the same sink.
3141 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3142 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3143 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3144}
3145
stefan658910c2015-09-03 05:48:32 -07003146// Tests that the library initializes and shuts down properly.
3147TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3148 cricket::WebRtcVoiceEngine engine;
3149 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003150 rtc::scoped_ptr<webrtc::Call> call(
3151 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003152 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003153 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003154 EXPECT_TRUE(channel != nullptr);
3155 delete channel;
3156 engine.Terminate();
3157
3158 // Reinit to catch regression where VoiceEngineObserver reference is lost
3159 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3160 engine.Terminate();
3161}
3162
3163// Tests that the library is configured with the codecs we want.
3164TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003165 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003166 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3167 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0), nullptr));
3168 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3169 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0), nullptr));
3170 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3171 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003172 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003173 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3174 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0), nullptr));
3175 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3176 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0), nullptr));
3177 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3178 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0), nullptr));
3179 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3180 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0), nullptr));
3181 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3182 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0), nullptr));
3183 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3184 cricket::AudioCodec(96, "red", 8000, 0, 1, 0), nullptr));
3185 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3186 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0), nullptr));
3187 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3188 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0), nullptr));
3189 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3190 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0), nullptr));
3191 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3192 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003193 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003194 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3195 cricket::AudioCodec(0, "", 8000, 0, 1, 0), nullptr)); // PCMU
3196 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3197 cricket::AudioCodec(8, "", 8000, 0, 1, 0), nullptr)); // PCMA
3198 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3199 cricket::AudioCodec(9, "", 8000, 0, 1, 0), nullptr)); // G722
3200 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3201 cricket::AudioCodec(13, "", 8000, 0, 1, 0), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003202 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003203 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3204 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003205 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003206 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3207 cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0), nullptr));
3208 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3209 cricket::AudioCodec(88, "", 0, 0, 1, 0), nullptr));
3210 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3211 cricket::AudioCodec(0, "", 0, 0, 2, 0), nullptr));
3212 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3213 cricket::AudioCodec(0, "", 5000, 0, 1, 0), nullptr));
3214 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3215 cricket::AudioCodec(0, "", 0, 5000, 1, 0), nullptr));
3216
stefan658910c2015-09-03 05:48:32 -07003217 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenberg26c8c912015-11-27 04:00:25 -08003218 cricket::WebRtcVoiceEngine engine;
stefan658910c2015-09-03 05:48:32 -07003219 for (std::vector<cricket::AudioCodec>::const_iterator it =
3220 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3221 if (it->name == "CN" && it->clockrate == 16000) {
3222 EXPECT_EQ(105, it->id);
3223 } else if (it->name == "CN" && it->clockrate == 32000) {
3224 EXPECT_EQ(106, it->id);
3225 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3226 EXPECT_EQ(103, it->id);
3227 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3228 EXPECT_EQ(104, it->id);
3229 } else if (it->name == "G722" && it->clockrate == 8000) {
3230 EXPECT_EQ(9, it->id);
3231 } else if (it->name == "telephone-event") {
3232 EXPECT_EQ(126, it->id);
3233 } else if (it->name == "red") {
3234 EXPECT_EQ(127, it->id);
3235 } else if (it->name == "opus") {
3236 EXPECT_EQ(111, it->id);
3237 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3238 EXPECT_EQ("10", it->params.find("minptime")->second);
3239 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3240 EXPECT_EQ("60", it->params.find("maxptime")->second);
3241 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3242 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3243 }
3244 }
stefan658910c2015-09-03 05:48:32 -07003245 engine.Terminate();
3246}
3247
3248// Tests that VoE supports at least 32 channels
3249TEST(WebRtcVoiceEngineTest, Has32Channels) {
3250 cricket::WebRtcVoiceEngine engine;
3251 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003252 rtc::scoped_ptr<webrtc::Call> call(
3253 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003254
3255 cricket::VoiceMediaChannel* channels[32];
3256 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003257 while (num_channels < arraysize(channels)) {
stefan658910c2015-09-03 05:48:32 -07003258 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003259 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003260 if (!channel)
3261 break;
stefan658910c2015-09-03 05:48:32 -07003262 channels[num_channels++] = channel;
3263 }
3264
tfarina5237aaf2015-11-10 23:44:30 -08003265 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003266 EXPECT_EQ(expected, num_channels);
3267
3268 while (num_channels > 0) {
3269 delete channels[--num_channels];
3270 }
stefan658910c2015-09-03 05:48:32 -07003271 engine.Terminate();
3272}
3273
3274// Test that we set our preferred codecs properly.
3275TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3276 cricket::WebRtcVoiceEngine engine;
3277 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003278 rtc::scoped_ptr<webrtc::Call> call(
3279 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003280 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3281 call.get());
3282 cricket::AudioRecvParameters parameters;
3283 parameters.codecs = engine.codecs();
3284 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003285}