blob: 1e23d381cd1ca7298c3ed9d21da840910f418d6f [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2008 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00003 *
kjellander1afca732016-02-07 20:46:45 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
kwiberg686a8ef2016-02-26 03:00:35 -080011#include <memory>
12
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010013#include "webrtc/pc/channel.h"
tfarina5237aaf2015-11-10 23:44:30 -080014#include "webrtc/base/arraysize.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000015#include "webrtc/base/byteorder.h"
16#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020017#include "webrtc/call.h"
stefanba4c0e42016-02-04 04:12:24 -080018#include "webrtc/p2p/base/faketransportcontroller.h"
19#include "webrtc/test/field_trial.h"
kjellandera96e2d72016-02-04 23:52:28 -080020#include "webrtc/media/base/constants.h"
21#include "webrtc/media/base/fakemediaengine.h"
22#include "webrtc/media/base/fakenetworkinterface.h"
23#include "webrtc/media/base/fakertp.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010024#include "webrtc/media/engine/fakewebrtccall.h"
25#include "webrtc/media/engine/fakewebrtcvoiceengine.h"
26#include "webrtc/media/engine/webrtcvoiceengine.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000027
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000028using cricket::kRtpAudioLevelHeaderExtension;
29using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
30
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020031namespace {
32
33const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
34const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
35const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
36const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
37const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
38const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
39const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
40const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
41const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, 0,
42 1, 0);
solenberg85a04962015-10-27 03:35:21 -070043const uint32_t kSsrc1 = 0x99;
44const uint32_t kSsrc2 = 0x98;
45const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000046
47class FakeVoEWrapper : public cricket::VoEWrapper {
48 public:
49 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
50 : cricket::VoEWrapper(engine, // processing
51 engine, // base
52 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000053 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000054 engine, // network
55 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000056 engine) { // volume
57 }
58};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020059} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060
deadbeef884f5852016-01-15 09:20:04 -080061class FakeAudioSink : public webrtc::AudioSinkInterface {
62 public:
63 void OnData(const Data& audio) override {}
64};
65
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066class WebRtcVoiceEngineTestFake : public testing::Test {
67 public:
stefanba4c0e42016-02-04 04:12:24 -080068 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
69
70 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
Fredrik Solenberg709ed672015-09-15 12:26:33 +020071 : call_(webrtc::Call::Config()),
solenbergbd138382015-11-20 16:08:07 -080072 engine_(new FakeVoEWrapper(&voe_)),
stefanba4c0e42016-02-04 04:12:24 -080073 channel_(nullptr),
74 override_field_trials_(field_trials) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +020075 send_parameters_.codecs.push_back(kPcmuCodec);
76 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000077 }
solenberg1ac56142015-10-13 03:58:19 -070078 bool SetupEngine() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000079 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000080 return false;
81 }
nisse51542be2016-02-12 02:27:06 -080082 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
83 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +020084 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000085 }
solenberg1ac56142015-10-13 03:58:19 -070086 bool SetupEngineWithRecvStream() {
87 if (!SetupEngine()) {
88 return false;
89 }
90 return channel_->AddRecvStream(
91 cricket::StreamParams::CreateLegacy(kSsrc1));
92 }
93 bool SetupEngineWithSendStream() {
94 if (!SetupEngine()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000095 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000096 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000097 return channel_->AddSendStream(
98 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000099 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000100 void SetupForMultiSendStream() {
solenberg1ac56142015-10-13 03:58:19 -0700101 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700102 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800103 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700104 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700105 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800106 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000107 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000108 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200109 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000110 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000111 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200112 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000113 delete channel_;
114 engine_.Terminate();
115 }
116
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100117 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
118 const auto* send_stream = call_.GetAudioSendStream(ssrc);
119 EXPECT_TRUE(send_stream);
120 return *send_stream;
121 }
122
deadbeef884f5852016-01-15 09:20:04 -0800123 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
124 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
125 EXPECT_TRUE(recv_stream);
126 return *recv_stream;
127 }
128
solenberg3a941542015-11-16 07:34:50 -0800129 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
130 const auto* send_stream = call_.GetAudioSendStream(ssrc);
131 EXPECT_TRUE(send_stream);
132 return send_stream->GetConfig();
133 }
134
solenberg7add0582015-11-20 09:59:34 -0800135 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
136 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
137 EXPECT_TRUE(recv_stream);
138 return recv_stream->GetConfig();
139 }
140
Peter Boström0c4e06b2015-10-07 12:23:21 +0200141 void TestInsertDtmf(uint32_t ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000142 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
nisse51542be2016-02-12 02:27:06 -0800143 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
144 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200145 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000146 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700147 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000148 // send stream.
149 EXPECT_TRUE(channel_->AddSendStream(
150 cricket::StreamParams::CreateLegacy(kSsrc1)));
151 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000152
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000153 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200154 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000155 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
156 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800157 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200158 send_parameters_.codecs.push_back(kTelephoneEventCodec);
159 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000160 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000161
162 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700163 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800164 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000165 EXPECT_TRUE(channel_->AddSendStream(
166 cricket::StreamParams::CreateLegacy(kSsrc1)));
167 }
168
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000169 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800170 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000171
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100172 // Test send.
173 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
174 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
175 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800176 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100177 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
178 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
179 EXPECT_EQ(2, telephone_event.event_code);
180 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000181 }
182
183 // Test that send bandwidth is set correctly.
184 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000185 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
186 // |expected_result| is the expected result from SetMaxSendBandwidth().
187 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000188 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000189 int max_bitrate,
190 bool expected_result,
191 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200192 cricket::AudioSendParameters parameters;
193 parameters.codecs.push_back(codec);
194 parameters.max_bandwidth_bps = max_bitrate;
195 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
196
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000197 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000198 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000199 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000200 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000201 }
202
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000203 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenberg0a617e22015-10-20 15:49:38 -0700204 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000205
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000206 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800207 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000208
209 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200210 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000211 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200212 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800213 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000214
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000215 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200216 send_parameters_.extensions.clear();
217 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800218 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000219
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000220 // Ensure extension is set properly.
221 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200222 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
223 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800224 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
225 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
226 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000227
solenberg7add0582015-11-20 09:59:34 -0800228 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000229 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700230 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800231 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
232 call_.GetAudioSendStream(kSsrc2));
233 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
234 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
235 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000236
237 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200238 send_parameters_.codecs.push_back(kPcmuCodec);
239 send_parameters_.extensions.clear();
240 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800241 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
242 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000243 }
244
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000245 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700246 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000247
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000248 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800249 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000250
251 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800252 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000253 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800254 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
255 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000256
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000257 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800258 recv_parameters_.extensions.clear();
259 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
260 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000261
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000262 // Ensure extension is set properly.
263 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800264 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
265 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
266 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
267 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
268 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000269
solenberg7add0582015-11-20 09:59:34 -0800270 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000271 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700272 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800273 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
274 call_.GetAudioReceiveStream(kSsrc2));
275 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
276 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
277 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000278
279 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800280 recv_parameters_.extensions.clear();
281 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
282 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
283 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000284 }
285
solenberg85a04962015-10-27 03:35:21 -0700286 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
287 webrtc::AudioSendStream::Stats stats;
288 stats.local_ssrc = 12;
289 stats.bytes_sent = 345;
290 stats.packets_sent = 678;
291 stats.packets_lost = 9012;
292 stats.fraction_lost = 34.56f;
293 stats.codec_name = "codec_name_send";
294 stats.ext_seqnum = 789;
295 stats.jitter_ms = 12;
296 stats.rtt_ms = 345;
297 stats.audio_level = 678;
298 stats.aec_quality_min = 9.01f;
299 stats.echo_delay_median_ms = 234;
300 stats.echo_delay_std_ms = 567;
301 stats.echo_return_loss = 890;
302 stats.echo_return_loss_enhancement = 1234;
303 stats.typing_noise_detected = true;
304 return stats;
305 }
306 void SetAudioSendStreamStats() {
307 for (auto* s : call_.GetAudioSendStreams()) {
308 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200309 }
solenberg85a04962015-10-27 03:35:21 -0700310 }
solenberg566ef242015-11-06 15:34:49 -0800311 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
312 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700313 const auto stats = GetAudioSendStreamStats();
314 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
315 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
316 EXPECT_EQ(info.packets_sent, stats.packets_sent);
317 EXPECT_EQ(info.packets_lost, stats.packets_lost);
318 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
319 EXPECT_EQ(info.codec_name, stats.codec_name);
320 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
321 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
322 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
323 EXPECT_EQ(info.audio_level, stats.audio_level);
324 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
325 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
326 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
327 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
328 EXPECT_EQ(info.echo_return_loss_enhancement,
329 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800330 EXPECT_EQ(info.typing_noise_detected,
331 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700332 }
333
334 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
335 webrtc::AudioReceiveStream::Stats stats;
336 stats.remote_ssrc = 123;
337 stats.bytes_rcvd = 456;
338 stats.packets_rcvd = 768;
339 stats.packets_lost = 101;
340 stats.fraction_lost = 23.45f;
341 stats.codec_name = "codec_name_recv";
342 stats.ext_seqnum = 678;
343 stats.jitter_ms = 901;
344 stats.jitter_buffer_ms = 234;
345 stats.jitter_buffer_preferred_ms = 567;
346 stats.delay_estimate_ms = 890;
347 stats.audio_level = 1234;
348 stats.expand_rate = 5.67f;
349 stats.speech_expand_rate = 8.90f;
350 stats.secondary_decoded_rate = 1.23f;
351 stats.accelerate_rate = 4.56f;
352 stats.preemptive_expand_rate = 7.89f;
353 stats.decoding_calls_to_silence_generator = 12;
354 stats.decoding_calls_to_neteq = 345;
355 stats.decoding_normal = 67890;
356 stats.decoding_plc = 1234;
357 stats.decoding_cng = 5678;
358 stats.decoding_plc_cng = 9012;
359 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200360 return stats;
361 }
362 void SetAudioReceiveStreamStats() {
363 for (auto* s : call_.GetAudioReceiveStreams()) {
364 s->SetStats(GetAudioReceiveStreamStats());
365 }
366 }
367 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700368 const auto stats = GetAudioReceiveStreamStats();
369 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
370 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
371 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
372 EXPECT_EQ(info.packets_lost, stats.packets_lost);
373 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
374 EXPECT_EQ(info.codec_name, stats.codec_name);
375 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
376 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
377 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200378 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700379 stats.jitter_buffer_preferred_ms);
380 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
381 EXPECT_EQ(info.audio_level, stats.audio_level);
382 EXPECT_EQ(info.expand_rate, stats.expand_rate);
383 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
384 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
385 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
386 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200387 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700388 stats.decoding_calls_to_silence_generator);
389 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
390 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
391 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
392 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
393 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
394 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200395 }
396
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000397 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200398 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000399 cricket::FakeWebRtcVoiceEngine voe_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000400 cricket::WebRtcVoiceEngine engine_;
401 cricket::VoiceMediaChannel* channel_;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200402 cricket::AudioSendParameters send_parameters_;
403 cricket::AudioRecvParameters recv_parameters_;
stefanba4c0e42016-02-04 04:12:24 -0800404
405 private:
406 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000407};
408
409// Tests that our stub library "works".
410TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
411 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000412 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000413 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000414 engine_.Terminate();
415 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000416}
417
418// Tests that we can create and destroy a channel.
419TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000420 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
nisse51542be2016-02-12 02:27:06 -0800421 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
422 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200423 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000424}
425
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000426// Tests that the list of supported codecs is created properly and ordered
427// correctly
428TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
429 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
430 ASSERT_FALSE(codecs.empty());
431 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
432 EXPECT_EQ(48000, codecs[0].clockrate);
433 EXPECT_EQ(2, codecs[0].channels);
434 EXPECT_EQ(64000, codecs[0].bitrate);
435 int pref = codecs[0].preference;
436 for (size_t i = 1; i < codecs.size(); ++i) {
437 EXPECT_GT(pref, codecs[i].preference);
438 pref = codecs[i].preference;
439 }
440}
441
stefanba4c0e42016-02-04 04:12:24 -0800442TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
443 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
444 bool opus_found = false;
445 for (cricket::AudioCodec codec : codecs) {
446 if (codec.name == "opus") {
447 EXPECT_TRUE(HasTransportCc(codec));
448 opus_found = true;
449 }
450 }
451 EXPECT_TRUE(opus_found);
452}
453
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000454// Tests that we can find codecs by name or id, and that we interpret the
455// clockrate and bitrate fields properly.
456TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
457 cricket::AudioCodec codec;
458 webrtc::CodecInst codec_inst;
459 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800460 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000461 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800462 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000463 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800464 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
465 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000466 // Find ISAC with a different payload id.
467 codec = kIsacCodec;
468 codec.id = 127;
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 // Find PCMU with a 0 clockrate.
472 codec = kPcmuCodec;
473 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800474 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000475 EXPECT_EQ(codec.id, codec_inst.pltype);
476 EXPECT_EQ(8000, codec_inst.plfreq);
477 // Find PCMU with a 0 bitrate.
478 codec = kPcmuCodec;
479 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800480 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000481 EXPECT_EQ(codec.id, codec_inst.pltype);
482 EXPECT_EQ(64000, codec_inst.rate);
483 // Find ISAC with an explicit bitrate.
484 codec = kIsacCodec;
485 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800486 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000487 EXPECT_EQ(codec.id, codec_inst.pltype);
488 EXPECT_EQ(32000, codec_inst.rate);
489}
490
491// Test that we set our inbound codecs properly, including changing PT.
492TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
493 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200494 cricket::AudioRecvParameters parameters;
495 parameters.codecs.push_back(kIsacCodec);
496 parameters.codecs.push_back(kPcmuCodec);
497 parameters.codecs.push_back(kTelephoneEventCodec);
498 parameters.codecs[0].id = 106; // collide with existing telephone-event
499 parameters.codecs[2].id = 126;
500 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700501 EXPECT_TRUE(channel_->AddRecvStream(
502 cricket::StreamParams::CreateLegacy(kSsrc1)));
503 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000504 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800505 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000506 gcodec.plfreq = 16000;
507 gcodec.channels = 1;
508 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
509 EXPECT_EQ(106, gcodec.pltype);
510 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800511 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000512 gcodec.plfreq = 8000;
513 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
514 EXPECT_EQ(126, gcodec.pltype);
515 EXPECT_STREQ("telephone-event", gcodec.plname);
516}
517
518// Test that we fail to set an unknown inbound codec.
519TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
520 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200521 cricket::AudioRecvParameters parameters;
522 parameters.codecs.push_back(kIsacCodec);
523 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
524 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000525}
526
527// Test that we fail if we have duplicate types in the inbound list.
528TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
529 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200530 cricket::AudioRecvParameters parameters;
531 parameters.codecs.push_back(kIsacCodec);
532 parameters.codecs.push_back(kCn16000Codec);
533 parameters.codecs[1].id = kIsacCodec.id;
534 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000535}
536
537// Test that we can decode OPUS without stereo parameters.
538TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
539 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200540 cricket::AudioRecvParameters parameters;
541 parameters.codecs.push_back(kIsacCodec);
542 parameters.codecs.push_back(kPcmuCodec);
543 parameters.codecs.push_back(kOpusCodec);
544 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000545 EXPECT_TRUE(channel_->AddRecvStream(
546 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700547 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000548 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800549 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000550 // Even without stereo parameters, recv codecs still specify channels = 2.
551 EXPECT_EQ(2, opus.channels);
552 EXPECT_EQ(111, opus.pltype);
553 EXPECT_STREQ("opus", opus.plname);
554 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700555 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000556 EXPECT_EQ(111, opus.pltype);
557}
558
559// Test that we can decode OPUS with stereo = 0.
560TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
561 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200562 cricket::AudioRecvParameters parameters;
563 parameters.codecs.push_back(kIsacCodec);
564 parameters.codecs.push_back(kPcmuCodec);
565 parameters.codecs.push_back(kOpusCodec);
566 parameters.codecs[2].params["stereo"] = "0";
567 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000568 EXPECT_TRUE(channel_->AddRecvStream(
569 cricket::StreamParams::CreateLegacy(kSsrc1)));
570 int channel_num2 = voe_.GetLastChannel();
571 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800572 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000573 // Even when stereo is off, recv codecs still specify channels = 2.
574 EXPECT_EQ(2, opus.channels);
575 EXPECT_EQ(111, opus.pltype);
576 EXPECT_STREQ("opus", opus.plname);
577 opus.pltype = 0;
578 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
579 EXPECT_EQ(111, opus.pltype);
580}
581
582// Test that we can decode OPUS with stereo = 1.
583TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
584 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200585 cricket::AudioRecvParameters parameters;
586 parameters.codecs.push_back(kIsacCodec);
587 parameters.codecs.push_back(kPcmuCodec);
588 parameters.codecs.push_back(kOpusCodec);
589 parameters.codecs[2].params["stereo"] = "1";
590 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000591 EXPECT_TRUE(channel_->AddRecvStream(
592 cricket::StreamParams::CreateLegacy(kSsrc1)));
593 int channel_num2 = voe_.GetLastChannel();
594 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800595 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000596 EXPECT_EQ(2, opus.channels);
597 EXPECT_EQ(111, opus.pltype);
598 EXPECT_STREQ("opus", opus.plname);
599 opus.pltype = 0;
600 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
601 EXPECT_EQ(111, opus.pltype);
602}
603
604// Test that changes to recv codecs are applied to all streams.
605TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
606 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200607 cricket::AudioRecvParameters parameters;
608 parameters.codecs.push_back(kIsacCodec);
609 parameters.codecs.push_back(kPcmuCodec);
610 parameters.codecs.push_back(kTelephoneEventCodec);
611 parameters.codecs[0].id = 106; // collide with existing telephone-event
612 parameters.codecs[2].id = 126;
613 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000614 EXPECT_TRUE(channel_->AddRecvStream(
615 cricket::StreamParams::CreateLegacy(kSsrc1)));
616 int channel_num2 = voe_.GetLastChannel();
617 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800618 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000619 gcodec.plfreq = 16000;
620 gcodec.channels = 1;
621 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
622 EXPECT_EQ(106, gcodec.pltype);
623 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800624 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000625 gcodec.plfreq = 8000;
626 gcodec.channels = 1;
627 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
628 EXPECT_EQ(126, gcodec.pltype);
629 EXPECT_STREQ("telephone-event", gcodec.plname);
630}
631
632TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenberg1ac56142015-10-13 03:58:19 -0700633 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200634 cricket::AudioRecvParameters parameters;
635 parameters.codecs.push_back(kIsacCodec);
636 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200637 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000638
639 int channel_num2 = voe_.GetLastChannel();
640 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800641 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000642 gcodec.plfreq = 16000;
643 gcodec.channels = 1;
644 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
645 EXPECT_EQ(106, gcodec.pltype);
646 EXPECT_STREQ("ISAC", gcodec.plname);
647}
648
649// Test that we can apply the same set of codecs again while playing.
650TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700651 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200652 cricket::AudioRecvParameters parameters;
653 parameters.codecs.push_back(kIsacCodec);
654 parameters.codecs.push_back(kCn16000Codec);
655 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000656 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200657 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000658
659 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200660 parameters.codecs[0].id = 127;
661 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
662 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000663 EXPECT_TRUE(voe_.GetPlayout(channel_num));
664}
665
666// Test that we can add a codec while playing.
667TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700668 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200669 cricket::AudioRecvParameters parameters;
670 parameters.codecs.push_back(kIsacCodec);
671 parameters.codecs.push_back(kCn16000Codec);
672 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000673 EXPECT_TRUE(channel_->SetPlayout(true));
674
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200675 parameters.codecs.push_back(kOpusCodec);
676 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
677 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000678 EXPECT_TRUE(voe_.GetPlayout(channel_num));
679 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800680 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000681 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
682}
683
684TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenberg1ac56142015-10-13 03:58:19 -0700685 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000686
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000687 // Test that when autobw is enabled, bitrate is kept as the default
688 // value. autobw is enabled for the following tests because the target
689 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000690
691 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000692 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000693
694 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000695 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000696
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000697 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000698 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000699}
700
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000701TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700702 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000703
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000704 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000705
706 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000707 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
708 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000709
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000710 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000711 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
712 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000713}
714
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000715TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700716 EXPECT_TRUE(SetupEngineWithSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000717
718 // Test that we can only set a maximum bitrate for a fixed-rate codec
719 // if it's bigger than the fixed rate.
720
721 // PCMU, fixed bitrate == 64000.
722 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
723 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
724 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
725 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
726 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
727 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
728 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
729}
730
731TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -0700732 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200733 const int kDesiredBitrate = 128000;
734 cricket::AudioSendParameters parameters;
735 parameters.codecs = engine_.codecs();
736 parameters.max_bandwidth_bps = kDesiredBitrate;
737 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000738
739 EXPECT_TRUE(channel_->AddSendStream(
740 cricket::StreamParams::CreateLegacy(kSsrc1)));
741
742 int channel_num = voe_.GetLastChannel();
743 webrtc::CodecInst codec;
744 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200745 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000746}
747
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000748// Test that bitrate cannot be set for CBR codecs.
749// Bitrate is ignored if it is higher than the fixed bitrate.
750// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000751TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenberg1ac56142015-10-13 03:58:19 -0700752 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000753
754 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200755 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
756 int channel_num = voe_.GetLastChannel();
757 webrtc::CodecInst codec;
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 = 128000;
762 EXPECT_TRUE(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);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200765
766 send_parameters_.max_bandwidth_bps = 128;
767 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000768 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
769 EXPECT_EQ(64000, codec.rate);
770}
771
772// Test that we apply codecs properly.
773TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenberg1ac56142015-10-13 03:58:19 -0700774 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200775 cricket::AudioSendParameters parameters;
776 parameters.codecs.push_back(kIsacCodec);
777 parameters.codecs.push_back(kPcmuCodec);
778 parameters.codecs.push_back(kRedCodec);
779 parameters.codecs[0].id = 96;
780 parameters.codecs[0].bitrate = 48000;
781 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000782 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200783 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000784 webrtc::CodecInst gcodec;
785 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
786 EXPECT_EQ(96, gcodec.pltype);
787 EXPECT_EQ(48000, gcodec.rate);
788 EXPECT_STREQ("ISAC", gcodec.plname);
789 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000790 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000791 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
792 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100793 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000794}
795
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000796// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
797// to apply.
798TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenberg1ac56142015-10-13 03:58:19 -0700799 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200800 cricket::AudioSendParameters parameters;
801 parameters.codecs.push_back(kIsacCodec);
802 parameters.codecs.push_back(kPcmuCodec);
803 parameters.codecs.push_back(kRedCodec);
804 parameters.codecs[0].id = 96;
805 parameters.codecs[0].bitrate = 48000;
806 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000807 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
808 // Calling SetSendCodec again with same codec which is already set.
809 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200810 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000811 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
812}
813
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000814// Verify that G722 is set with 16000 samples per second to WebRTC.
815TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenberg1ac56142015-10-13 03:58:19 -0700816 EXPECT_TRUE(SetupEngineWithSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000817 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200818 cricket::AudioSendParameters parameters;
819 parameters.codecs.push_back(kG722CodecSdp);
820 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000821 webrtc::CodecInst gcodec;
822 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
823 EXPECT_STREQ("G722", gcodec.plname);
824 EXPECT_EQ(1, gcodec.channels);
825 EXPECT_EQ(16000, gcodec.plfreq);
826}
827
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000828// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000829TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenberg1ac56142015-10-13 03:58:19 -0700830 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200831 cricket::AudioSendParameters parameters;
832 parameters.codecs.push_back(kOpusCodec);
833 parameters.codecs[0].bitrate = 0;
834 parameters.codecs[0].clockrate = 50000;
835 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000836}
837
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000838// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000839TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700840 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200841 cricket::AudioSendParameters parameters;
842 parameters.codecs.push_back(kOpusCodec);
843 parameters.codecs[0].bitrate = 0;
844 parameters.codecs[0].channels = 0;
845 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000846}
847
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000848// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000849TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700850 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200851 cricket::AudioSendParameters parameters;
852 parameters.codecs.push_back(kOpusCodec);
853 parameters.codecs[0].bitrate = 0;
854 parameters.codecs[0].channels = 0;
855 parameters.codecs[0].params["stereo"] = "1";
856 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000857}
858
859// Test that if channel is 1 for opus and there's no stereo, we fail.
860TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700861 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200862 cricket::AudioSendParameters parameters;
863 parameters.codecs.push_back(kOpusCodec);
864 parameters.codecs[0].bitrate = 0;
865 parameters.codecs[0].channels = 1;
866 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000867}
868
869// Test that if channel is 1 for opus and stereo=0, we fail.
870TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700871 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200872 cricket::AudioSendParameters parameters;
873 parameters.codecs.push_back(kOpusCodec);
874 parameters.codecs[0].bitrate = 0;
875 parameters.codecs[0].channels = 1;
876 parameters.codecs[0].params["stereo"] = "0";
877 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000878}
879
880// Test that if channel is 1 for opus and stereo=1, we fail.
881TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700882 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200883 cricket::AudioSendParameters parameters;
884 parameters.codecs.push_back(kOpusCodec);
885 parameters.codecs[0].bitrate = 0;
886 parameters.codecs[0].channels = 1;
887 parameters.codecs[0].params["stereo"] = "1";
888 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000889}
890
891// Test that with bitrate=0 and no stereo,
892// channels and bitrate are 1 and 32000.
893TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700894 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000895 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200896 cricket::AudioSendParameters parameters;
897 parameters.codecs.push_back(kOpusCodec);
898 parameters.codecs[0].bitrate = 0;
899 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000900 webrtc::CodecInst gcodec;
901 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
902 EXPECT_STREQ("opus", gcodec.plname);
903 EXPECT_EQ(1, gcodec.channels);
904 EXPECT_EQ(32000, gcodec.rate);
905}
906
907// Test that with bitrate=0 and stereo=0,
908// channels and bitrate are 1 and 32000.
909TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700910 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000911 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200912 cricket::AudioSendParameters parameters;
913 parameters.codecs.push_back(kOpusCodec);
914 parameters.codecs[0].bitrate = 0;
915 parameters.codecs[0].params["stereo"] = "0";
916 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000917 webrtc::CodecInst gcodec;
918 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
919 EXPECT_STREQ("opus", gcodec.plname);
920 EXPECT_EQ(1, gcodec.channels);
921 EXPECT_EQ(32000, gcodec.rate);
922}
923
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000924// Test that with bitrate=invalid and stereo=0,
925// channels and bitrate are 1 and 32000.
926TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700927 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000928 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200929 cricket::AudioSendParameters parameters;
930 parameters.codecs.push_back(kOpusCodec);
931 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000932 webrtc::CodecInst gcodec;
933
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000934 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200935 parameters.codecs[0].bitrate = 5999;
936 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000937 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
938 EXPECT_STREQ("opus", gcodec.plname);
939 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000940 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000941
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200942 parameters.codecs[0].bitrate = 510001;
943 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000944 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
945 EXPECT_STREQ("opus", gcodec.plname);
946 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000947 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000948}
949
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000950// Test that with bitrate=0 and stereo=1,
951// channels and bitrate are 2 and 64000.
952TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700953 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000954 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200955 cricket::AudioSendParameters parameters;
956 parameters.codecs.push_back(kOpusCodec);
957 parameters.codecs[0].bitrate = 0;
958 parameters.codecs[0].params["stereo"] = "1";
959 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000960 webrtc::CodecInst gcodec;
961 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
962 EXPECT_STREQ("opus", gcodec.plname);
963 EXPECT_EQ(2, gcodec.channels);
964 EXPECT_EQ(64000, gcodec.rate);
965}
966
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000967// Test that with bitrate=invalid and stereo=1,
968// channels and bitrate are 2 and 64000.
969TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700970 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000971 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200972 cricket::AudioSendParameters parameters;
973 parameters.codecs.push_back(kOpusCodec);
974 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000975 webrtc::CodecInst gcodec;
976
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000977 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200978 parameters.codecs[0].bitrate = 5999;
979 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000980 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
981 EXPECT_STREQ("opus", gcodec.plname);
982 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000983 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000984
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200985 parameters.codecs[0].bitrate = 510001;
986 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000987 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
988 EXPECT_STREQ("opus", gcodec.plname);
989 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000990 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000991}
992
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000993// Test that with bitrate=N and stereo unset,
994// channels and bitrate are 1 and N.
995TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700996 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000997 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200998 cricket::AudioSendParameters parameters;
999 parameters.codecs.push_back(kOpusCodec);
1000 parameters.codecs[0].bitrate = 96000;
1001 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001002 webrtc::CodecInst gcodec;
1003 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1004 EXPECT_EQ(111, gcodec.pltype);
1005 EXPECT_EQ(96000, gcodec.rate);
1006 EXPECT_STREQ("opus", gcodec.plname);
1007 EXPECT_EQ(1, gcodec.channels);
1008 EXPECT_EQ(48000, gcodec.plfreq);
1009}
1010
1011// Test that with bitrate=N and stereo=0,
1012// channels and bitrate are 1 and N.
1013TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001014 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001015 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001016 cricket::AudioSendParameters parameters;
1017 parameters.codecs.push_back(kOpusCodec);
1018 parameters.codecs[0].bitrate = 30000;
1019 parameters.codecs[0].params["stereo"] = "0";
1020 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001021 webrtc::CodecInst gcodec;
1022 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1023 EXPECT_EQ(1, gcodec.channels);
1024 EXPECT_EQ(30000, gcodec.rate);
1025 EXPECT_STREQ("opus", gcodec.plname);
1026}
1027
1028// Test that with bitrate=N and without any parameters,
1029// channels and bitrate are 1 and N.
1030TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenberg1ac56142015-10-13 03:58:19 -07001031 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001032 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001033 cricket::AudioSendParameters parameters;
1034 parameters.codecs.push_back(kOpusCodec);
1035 parameters.codecs[0].bitrate = 30000;
1036 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001037 webrtc::CodecInst gcodec;
1038 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1039 EXPECT_EQ(1, gcodec.channels);
1040 EXPECT_EQ(30000, gcodec.rate);
1041 EXPECT_STREQ("opus", gcodec.plname);
1042}
1043
1044// Test that with bitrate=N and stereo=1,
1045// channels and bitrate are 2 and N.
1046TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001047 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001048 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001049 cricket::AudioSendParameters parameters;
1050 parameters.codecs.push_back(kOpusCodec);
1051 parameters.codecs[0].bitrate = 30000;
1052 parameters.codecs[0].params["stereo"] = "1";
1053 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001054 webrtc::CodecInst gcodec;
1055 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1056 EXPECT_EQ(2, gcodec.channels);
1057 EXPECT_EQ(30000, gcodec.rate);
1058 EXPECT_STREQ("opus", gcodec.plname);
1059}
1060
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001061// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1062// Also test that the "maxaveragebitrate" can't be set to values outside the
1063// range of 6000 and 510000
1064TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001065 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001066 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001067 cricket::AudioSendParameters parameters;
1068 parameters.codecs.push_back(kOpusCodec);
1069 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001070 webrtc::CodecInst gcodec;
1071
1072 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001073 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1074 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001075 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001076 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001077
1078 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001079 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1080 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001081 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001082 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001083
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001084 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1085 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001086 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1087 EXPECT_EQ(200000, gcodec.rate);
1088}
1089
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001090// Test that we can enable NACK with opus as caller.
1091TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001092 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001093 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001094 cricket::AudioSendParameters parameters;
1095 parameters.codecs.push_back(kOpusCodec);
1096 parameters.codecs[0].AddFeedbackParam(
1097 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1098 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001099 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001100 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001101 EXPECT_TRUE(voe_.GetNACK(channel_num));
1102}
1103
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001104// Test that we can enable NACK with opus as callee.
1105TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenberg0a617e22015-10-20 15:49:38 -07001106 EXPECT_TRUE(SetupEngineWithRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001107 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001108 cricket::AudioSendParameters parameters;
1109 parameters.codecs.push_back(kOpusCodec);
1110 parameters.codecs[0].AddFeedbackParam(
1111 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1112 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001113 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001114 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001115 EXPECT_FALSE(voe_.GetNACK(channel_num));
1116
1117 EXPECT_TRUE(channel_->AddSendStream(
1118 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001119 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001120}
1121
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001122// Test that we can enable NACK on receive streams.
1123TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001124 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001125 int channel_num1 = voe_.GetLastChannel();
1126 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1127 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001128 cricket::AudioSendParameters parameters;
1129 parameters.codecs.push_back(kOpusCodec);
1130 parameters.codecs[0].AddFeedbackParam(
1131 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1132 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001133 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1134 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001135 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001136 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1137 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1138}
1139
1140// Test that we can disable NACK.
1141TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001142 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001143 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001144 cricket::AudioSendParameters parameters;
1145 parameters.codecs.push_back(kOpusCodec);
1146 parameters.codecs[0].AddFeedbackParam(
1147 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1148 cricket::kParamValueEmpty));
1149 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001150 EXPECT_TRUE(voe_.GetNACK(channel_num));
1151
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001152 parameters.codecs.clear();
1153 parameters.codecs.push_back(kOpusCodec);
1154 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001155 EXPECT_FALSE(voe_.GetNACK(channel_num));
1156}
1157
1158// Test that we can disable NACK on receive streams.
1159TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001160 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001161 int channel_num1 = voe_.GetLastChannel();
1162 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1163 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001164 cricket::AudioSendParameters parameters;
1165 parameters.codecs.push_back(kOpusCodec);
1166 parameters.codecs[0].AddFeedbackParam(
1167 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1168 cricket::kParamValueEmpty));
1169 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001170 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1171 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1172
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001173 parameters.codecs.clear();
1174 parameters.codecs.push_back(kOpusCodec);
1175 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001176 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1177 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1178}
1179
1180// Test that NACK is enabled on a new receive stream.
1181TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001182 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001183 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001184 cricket::AudioSendParameters parameters;
1185 parameters.codecs.push_back(kIsacCodec);
1186 parameters.codecs.push_back(kCn16000Codec);
1187 parameters.codecs[0].AddFeedbackParam(
1188 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1189 cricket::kParamValueEmpty));
1190 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001191 EXPECT_TRUE(voe_.GetNACK(channel_num));
1192
1193 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1194 channel_num = voe_.GetLastChannel();
1195 EXPECT_TRUE(voe_.GetNACK(channel_num));
1196 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1197 channel_num = voe_.GetLastChannel();
1198 EXPECT_TRUE(voe_.GetNACK(channel_num));
1199}
1200
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001201// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001202TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenberg1ac56142015-10-13 03:58:19 -07001203 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001204 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001205 cricket::AudioSendParameters parameters;
1206 parameters.codecs.push_back(kOpusCodec);
1207 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001208 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1209}
1210
1211// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001212TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001213 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001214 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001215 cricket::AudioSendParameters parameters;
1216 parameters.codecs.push_back(kOpusCodec);
1217 parameters.codecs[0].bitrate = 0;
1218 parameters.codecs[0].params["useinbandfec"] = "0";
1219 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001220 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1221 webrtc::CodecInst gcodec;
1222 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1223 EXPECT_STREQ("opus", gcodec.plname);
1224 EXPECT_EQ(1, gcodec.channels);
1225 EXPECT_EQ(32000, gcodec.rate);
1226}
1227
1228// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001229TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001230 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001231 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001232 cricket::AudioSendParameters parameters;
1233 parameters.codecs.push_back(kOpusCodec);
1234 parameters.codecs[0].bitrate = 0;
1235 parameters.codecs[0].params["useinbandfec"] = "1";
1236 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001237 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1238 webrtc::CodecInst gcodec;
1239 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1240 EXPECT_STREQ("opus", gcodec.plname);
1241 EXPECT_EQ(1, gcodec.channels);
1242 EXPECT_EQ(32000, gcodec.rate);
1243}
1244
1245// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001246TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001247 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001248 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001249 cricket::AudioSendParameters parameters;
1250 parameters.codecs.push_back(kOpusCodec);
1251 parameters.codecs[0].bitrate = 0;
1252 parameters.codecs[0].params["stereo"] = "1";
1253 parameters.codecs[0].params["useinbandfec"] = "1";
1254 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001255 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1256 webrtc::CodecInst gcodec;
1257 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1258 EXPECT_STREQ("opus", gcodec.plname);
1259 EXPECT_EQ(2, gcodec.channels);
1260 EXPECT_EQ(64000, gcodec.rate);
1261}
1262
1263// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001264TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001265 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001266 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001267 cricket::AudioSendParameters parameters;
1268 parameters.codecs.push_back(kIsacCodec);
1269 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001270 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1271}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001272
1273// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1274TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001275 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001276 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001277 cricket::AudioSendParameters parameters;
1278 parameters.codecs.push_back(kIsacCodec);
1279 parameters.codecs[0].params["useinbandfec"] = "1";
1280 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001281 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1282}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001283
1284// Test that Opus FEC status can be changed.
1285TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenberg1ac56142015-10-13 03:58:19 -07001286 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001287 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001288 cricket::AudioSendParameters parameters;
1289 parameters.codecs.push_back(kOpusCodec);
1290 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001291 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001292 parameters.codecs[0].params["useinbandfec"] = "1";
1293 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001294 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1295}
1296
stefanba4c0e42016-02-04 04:12:24 -08001297TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
1298 EXPECT_TRUE(SetupEngine());
1299 cricket::AudioSendParameters send_parameters;
1300 send_parameters.codecs.push_back(kOpusCodec);
1301 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1302 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1303
1304 cricket::AudioRecvParameters recv_parameters;
1305 recv_parameters.codecs.push_back(kIsacCodec);
1306 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1307 EXPECT_TRUE(
1308 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1309 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1310 EXPECT_FALSE(
1311 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1312
1313 send_parameters.codecs = engine_.codecs();
1314 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1315 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1316 EXPECT_TRUE(
1317 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1318}
1319
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001320// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1321TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenberg1ac56142015-10-13 03:58:19 -07001322 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001323 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001324 cricket::AudioSendParameters parameters;
1325 parameters.codecs.push_back(kOpusCodec);
1326 parameters.codecs[0].bitrate = 0;
1327 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1328 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001329 EXPECT_EQ(cricket::kOpusBandwidthNb,
1330 voe_.GetMaxEncodingBandwidth(channel_num));
1331 webrtc::CodecInst gcodec;
1332 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1333 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001334
1335 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001336 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1337 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001338 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1339 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001340}
1341
1342// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1343TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenberg1ac56142015-10-13 03:58:19 -07001344 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001345 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001346 cricket::AudioSendParameters parameters;
1347 parameters.codecs.push_back(kOpusCodec);
1348 parameters.codecs[0].bitrate = 0;
1349 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1350 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001351 EXPECT_EQ(cricket::kOpusBandwidthMb,
1352 voe_.GetMaxEncodingBandwidth(channel_num));
1353 webrtc::CodecInst gcodec;
1354 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1355 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001356
1357 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001358 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1359 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001360 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1361 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001362}
1363
1364// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1365TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenberg1ac56142015-10-13 03:58:19 -07001366 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001367 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001368 cricket::AudioSendParameters parameters;
1369 parameters.codecs.push_back(kOpusCodec);
1370 parameters.codecs[0].bitrate = 0;
1371 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1372 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001373 EXPECT_EQ(cricket::kOpusBandwidthWb,
1374 voe_.GetMaxEncodingBandwidth(channel_num));
1375 webrtc::CodecInst gcodec;
1376 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1377 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001378
1379 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001380 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1381 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001382 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1383 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001384}
1385
1386// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1387TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenberg1ac56142015-10-13 03:58:19 -07001388 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001389 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001390 cricket::AudioSendParameters parameters;
1391 parameters.codecs.push_back(kOpusCodec);
1392 parameters.codecs[0].bitrate = 0;
1393 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1394 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001395 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1396 voe_.GetMaxEncodingBandwidth(channel_num));
1397 webrtc::CodecInst gcodec;
1398 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1399 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001400
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001401 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001402 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1403 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001404 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1405 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001406}
1407
1408// Test 24000 < maxplaybackrate triggers Opus full band mode.
1409TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenberg1ac56142015-10-13 03:58:19 -07001410 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001411 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001412 cricket::AudioSendParameters parameters;
1413 parameters.codecs.push_back(kOpusCodec);
1414 parameters.codecs[0].bitrate = 0;
1415 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1416 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001417 EXPECT_EQ(cricket::kOpusBandwidthFb,
1418 voe_.GetMaxEncodingBandwidth(channel_num));
1419 webrtc::CodecInst gcodec;
1420 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1421 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001422
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001423 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001424 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1425 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001426 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1427 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001428}
1429
1430// Test Opus that without maxplaybackrate, default playback rate is used.
1431TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001432 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001433 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001434 cricket::AudioSendParameters parameters;
1435 parameters.codecs.push_back(kOpusCodec);
1436 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001437 EXPECT_EQ(cricket::kOpusBandwidthFb,
1438 voe_.GetMaxEncodingBandwidth(channel_num));
1439}
1440
1441// Test the with non-Opus, maxplaybackrate has no effect.
1442TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001443 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001444 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001445 cricket::AudioSendParameters parameters;
1446 parameters.codecs.push_back(kIsacCodec);
1447 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1448 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001449 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1450}
1451
1452// Test maxplaybackrate can be set on two streams.
1453TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001454 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001455 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001456 cricket::AudioSendParameters parameters;
1457 parameters.codecs.push_back(kOpusCodec);
1458 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001459 // Default bandwidth is 24000.
1460 EXPECT_EQ(cricket::kOpusBandwidthFb,
1461 voe_.GetMaxEncodingBandwidth(channel_num));
1462
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001463 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001464
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001465 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001466 EXPECT_EQ(cricket::kOpusBandwidthNb,
1467 voe_.GetMaxEncodingBandwidth(channel_num));
1468
1469 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1470 channel_num = voe_.GetLastChannel();
1471 EXPECT_EQ(cricket::kOpusBandwidthNb,
1472 voe_.GetMaxEncodingBandwidth(channel_num));
1473}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001474
Minyue Li7100dcd2015-03-27 05:05:59 +01001475// Test that with usedtx=0, Opus DTX is off.
1476TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001477 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001478 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001479 cricket::AudioSendParameters parameters;
1480 parameters.codecs.push_back(kOpusCodec);
1481 parameters.codecs[0].params["usedtx"] = "0";
1482 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001483 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1484}
1485
1486// Test that with usedtx=1, Opus DTX is on.
1487TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001488 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001489 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001490 cricket::AudioSendParameters parameters;
1491 parameters.codecs.push_back(kOpusCodec);
1492 parameters.codecs[0].params["usedtx"] = "1";
1493 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001494 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1495 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1496}
1497
1498// Test that usedtx=1 works with stereo Opus.
1499TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001500 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001501 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001502 cricket::AudioSendParameters parameters;
1503 parameters.codecs.push_back(kOpusCodec);
1504 parameters.codecs[0].params["usedtx"] = "1";
1505 parameters.codecs[0].params["stereo"] = "1";
1506 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001507 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1508 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1509}
1510
1511// Test that usedtx=1 does not work with non Opus.
1512TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001513 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001514 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001515 cricket::AudioSendParameters parameters;
1516 parameters.codecs.push_back(kIsacCodec);
1517 parameters.codecs[0].params["usedtx"] = "1";
1518 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001519 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1520}
1521
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001522// Test that we can switch back and forth between Opus and ISAC with CN.
1523TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenberg1ac56142015-10-13 03:58:19 -07001524 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001525 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001526 cricket::AudioSendParameters opus_parameters;
1527 opus_parameters.codecs.push_back(kOpusCodec);
1528 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001529 webrtc::CodecInst gcodec;
1530 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001531 EXPECT_EQ(111, gcodec.pltype);
1532 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001533
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001534 cricket::AudioSendParameters isac_parameters;
1535 isac_parameters.codecs.push_back(kIsacCodec);
1536 isac_parameters.codecs.push_back(kCn16000Codec);
1537 isac_parameters.codecs.push_back(kOpusCodec);
1538 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001539 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1540 EXPECT_EQ(103, gcodec.pltype);
1541 EXPECT_STREQ("ISAC", gcodec.plname);
1542
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001543 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001544 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001545 EXPECT_EQ(111, gcodec.pltype);
1546 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001547}
1548
1549// Test that we handle various ways of specifying bitrate.
1550TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001551 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001552 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001553 cricket::AudioSendParameters parameters;
1554 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1555 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001556 webrtc::CodecInst gcodec;
1557 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1558 EXPECT_EQ(103, gcodec.pltype);
1559 EXPECT_STREQ("ISAC", gcodec.plname);
1560 EXPECT_EQ(32000, gcodec.rate);
1561
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001562 parameters.codecs[0].bitrate = 0; // bitrate == default
1563 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001564 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1565 EXPECT_EQ(103, gcodec.pltype);
1566 EXPECT_STREQ("ISAC", gcodec.plname);
1567 EXPECT_EQ(-1, gcodec.rate);
1568
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001569 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1570 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001571 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1572 EXPECT_EQ(103, gcodec.pltype);
1573 EXPECT_STREQ("ISAC", gcodec.plname);
1574 EXPECT_EQ(28000, gcodec.rate);
1575
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001576 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1577 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001578 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1579 EXPECT_EQ(0, gcodec.pltype);
1580 EXPECT_STREQ("PCMU", gcodec.plname);
1581 EXPECT_EQ(64000, gcodec.rate);
1582
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001583 parameters.codecs[0].bitrate = 0; // bitrate == default
1584 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001585 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1586 EXPECT_EQ(0, gcodec.pltype);
1587 EXPECT_STREQ("PCMU", gcodec.plname);
1588 EXPECT_EQ(64000, gcodec.rate);
1589
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001590 parameters.codecs[0] = kOpusCodec;
1591 parameters.codecs[0].bitrate = 0; // bitrate == default
1592 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001593 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1594 EXPECT_EQ(111, gcodec.pltype);
1595 EXPECT_STREQ("opus", gcodec.plname);
1596 EXPECT_EQ(32000, gcodec.rate);
1597}
1598
Brave Yao5225dd82015-03-26 07:39:19 +08001599// Test that we could set packet size specified in kCodecParamPTime.
1600TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenberg1ac56142015-10-13 03:58:19 -07001601 EXPECT_TRUE(SetupEngineWithSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001602 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001603 cricket::AudioSendParameters parameters;
1604 parameters.codecs.push_back(kOpusCodec);
1605 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1606 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001607 webrtc::CodecInst gcodec;
1608 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1609 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1610
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001611 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below 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(480, gcodec.pacsize); // Opus gets 10ms.
1615
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001616 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1617 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001618 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1619 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1620
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001621 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1622 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1623 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001624 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1625 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1626
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001627 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1628 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1629 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001630 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1631 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1632}
1633
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001634// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001635TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenberg1ac56142015-10-13 03:58:19 -07001636 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001637 cricket::AudioSendParameters parameters;
1638 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001639}
1640
1641// Test that we can set send codecs even with telephone-event codec as the first
1642// one on the list.
1643TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001644 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001645 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001646 cricket::AudioSendParameters parameters;
1647 parameters.codecs.push_back(kTelephoneEventCodec);
1648 parameters.codecs.push_back(kIsacCodec);
1649 parameters.codecs.push_back(kPcmuCodec);
1650 parameters.codecs[0].id = 98; // DTMF
1651 parameters.codecs[1].id = 96;
1652 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001653 webrtc::CodecInst gcodec;
1654 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001655 EXPECT_EQ(96, gcodec.pltype);
1656 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001657 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001658}
1659
1660// Test that we can set send codecs even with CN codec as the first
1661// one on the list.
1662TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001663 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001664 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001665 cricket::AudioSendParameters parameters;
1666 parameters.codecs.push_back(kCn16000Codec);
1667 parameters.codecs.push_back(kIsacCodec);
1668 parameters.codecs.push_back(kPcmuCodec);
1669 parameters.codecs[0].id = 98; // wideband CN
1670 parameters.codecs[1].id = 96;
1671 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001672 webrtc::CodecInst gcodec;
1673 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1674 EXPECT_EQ(96, gcodec.pltype);
1675 EXPECT_STREQ("ISAC", gcodec.plname);
1676 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001677}
1678
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001679// Test that we set VAD and DTMF types correctly as caller.
1680TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001681 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001682 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001683 cricket::AudioSendParameters parameters;
1684 parameters.codecs.push_back(kIsacCodec);
1685 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001686 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001687 parameters.codecs.push_back(kCn16000Codec);
1688 parameters.codecs.push_back(kCn8000Codec);
1689 parameters.codecs.push_back(kTelephoneEventCodec);
1690 parameters.codecs.push_back(kRedCodec);
1691 parameters.codecs[0].id = 96;
1692 parameters.codecs[2].id = 97; // wideband CN
1693 parameters.codecs[4].id = 98; // DTMF
1694 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001695 webrtc::CodecInst gcodec;
1696 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1697 EXPECT_EQ(96, gcodec.pltype);
1698 EXPECT_STREQ("ISAC", gcodec.plname);
1699 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001700 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001701 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1702 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001703 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001704}
1705
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001706// Test that we set VAD and DTMF types correctly as callee.
1707TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001708 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
nisse51542be2016-02-12 02:27:06 -08001709 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
1710 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001711 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001712
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001713 cricket::AudioSendParameters parameters;
1714 parameters.codecs.push_back(kIsacCodec);
1715 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001716 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001717 parameters.codecs.push_back(kCn16000Codec);
1718 parameters.codecs.push_back(kCn8000Codec);
1719 parameters.codecs.push_back(kTelephoneEventCodec);
1720 parameters.codecs.push_back(kRedCodec);
1721 parameters.codecs[0].id = 96;
1722 parameters.codecs[2].id = 97; // wideband CN
1723 parameters.codecs[4].id = 98; // DTMF
1724 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001725 EXPECT_TRUE(channel_->AddSendStream(
1726 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001727 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001728
1729 webrtc::CodecInst gcodec;
1730 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1731 EXPECT_EQ(96, gcodec.pltype);
1732 EXPECT_STREQ("ISAC", gcodec.plname);
1733 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001734 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001735 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1736 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001737 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001738}
1739
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001740// Test that we only apply VAD if we have a CN codec that matches the
1741// send codec clockrate.
1742TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenberg1ac56142015-10-13 03:58:19 -07001743 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001744 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001745 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001746 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001747 parameters.codecs.push_back(kIsacCodec);
1748 parameters.codecs.push_back(kCn16000Codec);
1749 parameters.codecs[1].id = 97;
1750 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001751 webrtc::CodecInst gcodec;
1752 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1753 EXPECT_STREQ("ISAC", gcodec.plname);
1754 EXPECT_TRUE(voe_.GetVAD(channel_num));
1755 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1756 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001757 parameters.codecs[0] = kPcmuCodec;
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_FALSE(voe_.GetVAD(channel_num));
1762 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001763 parameters.codecs[1] = kCn8000Codec;
1764 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001765 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1766 EXPECT_STREQ("PCMU", gcodec.plname);
1767 EXPECT_TRUE(voe_.GetVAD(channel_num));
1768 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001769 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001770 parameters.codecs[0] = kIsacCodec;
1771 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001772 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1773 EXPECT_STREQ("ISAC", gcodec.plname);
1774 EXPECT_FALSE(voe_.GetVAD(channel_num));
1775}
1776
1777// Test that we perform case-insensitive matching of codec names.
1778TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenberg1ac56142015-10-13 03:58:19 -07001779 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001780 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001781 cricket::AudioSendParameters parameters;
1782 parameters.codecs.push_back(kIsacCodec);
1783 parameters.codecs.push_back(kPcmuCodec);
1784 parameters.codecs.push_back(kCn16000Codec);
1785 parameters.codecs.push_back(kCn8000Codec);
1786 parameters.codecs.push_back(kTelephoneEventCodec);
1787 parameters.codecs.push_back(kRedCodec);
1788 parameters.codecs[0].name = "iSaC";
1789 parameters.codecs[0].id = 96;
1790 parameters.codecs[2].id = 97; // wideband CN
1791 parameters.codecs[4].id = 98; // DTMF
1792 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001793 webrtc::CodecInst gcodec;
1794 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1795 EXPECT_EQ(96, gcodec.pltype);
1796 EXPECT_STREQ("ISAC", gcodec.plname);
1797 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001798 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001799 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1800 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001801 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001802}
1803
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001804// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001805TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001806 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001807 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001808 cricket::AudioSendParameters parameters;
1809 parameters.codecs.push_back(kRedCodec);
1810 parameters.codecs.push_back(kIsacCodec);
1811 parameters.codecs.push_back(kPcmuCodec);
1812 parameters.codecs[0].id = 127;
1813 parameters.codecs[0].params[""] = "96/96";
1814 parameters.codecs[1].id = 96;
1815 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001816 webrtc::CodecInst gcodec;
1817 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1818 EXPECT_EQ(96, gcodec.pltype);
1819 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001820 EXPECT_TRUE(voe_.GetRED(channel_num));
1821 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001822}
1823
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001824// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001825TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001826 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
nisse51542be2016-02-12 02:27:06 -08001827 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
1828 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001829 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001830
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001831 cricket::AudioSendParameters parameters;
1832 parameters.codecs.push_back(kRedCodec);
1833 parameters.codecs.push_back(kIsacCodec);
1834 parameters.codecs.push_back(kPcmuCodec);
1835 parameters.codecs[0].id = 127;
1836 parameters.codecs[0].params[""] = "96/96";
1837 parameters.codecs[1].id = 96;
1838 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001839 EXPECT_TRUE(channel_->AddSendStream(
1840 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001841 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001842 webrtc::CodecInst gcodec;
1843 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1844 EXPECT_EQ(96, gcodec.pltype);
1845 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001846 EXPECT_TRUE(voe_.GetRED(channel_num));
1847 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001848}
1849
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001850// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001851TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenberg1ac56142015-10-13 03:58:19 -07001852 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001853 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001854 cricket::AudioSendParameters parameters;
1855 parameters.codecs.push_back(kRedCodec);
1856 parameters.codecs.push_back(kIsacCodec);
1857 parameters.codecs.push_back(kPcmuCodec);
1858 parameters.codecs[0].id = 127;
1859 parameters.codecs[1].id = 96;
1860 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001861 webrtc::CodecInst gcodec;
1862 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1863 EXPECT_EQ(96, gcodec.pltype);
1864 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001865 EXPECT_TRUE(voe_.GetRED(channel_num));
1866 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001867}
1868
1869// Test that we ignore RED if the parameters aren't named the way we expect.
1870TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001871 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001872 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001873 cricket::AudioSendParameters parameters;
1874 parameters.codecs.push_back(kRedCodec);
1875 parameters.codecs.push_back(kIsacCodec);
1876 parameters.codecs.push_back(kPcmuCodec);
1877 parameters.codecs[0].id = 127;
1878 parameters.codecs[0].params["ABC"] = "96/96";
1879 parameters.codecs[1].id = 96;
1880 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001881 webrtc::CodecInst gcodec;
1882 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1883 EXPECT_EQ(96, gcodec.pltype);
1884 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001885 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001886}
1887
1888// Test that we ignore RED if it uses different primary/secondary encoding.
1889TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001890 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001891 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001892 cricket::AudioSendParameters parameters;
1893 parameters.codecs.push_back(kRedCodec);
1894 parameters.codecs.push_back(kIsacCodec);
1895 parameters.codecs.push_back(kPcmuCodec);
1896 parameters.codecs[0].id = 127;
1897 parameters.codecs[0].params[""] = "96/0";
1898 parameters.codecs[1].id = 96;
1899 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001900 webrtc::CodecInst gcodec;
1901 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1902 EXPECT_EQ(96, gcodec.pltype);
1903 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001904 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001905}
1906
1907// Test that we ignore RED if it uses more than 2 encodings.
1908TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001909 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001910 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001911 cricket::AudioSendParameters parameters;
1912 parameters.codecs.push_back(kRedCodec);
1913 parameters.codecs.push_back(kIsacCodec);
1914 parameters.codecs.push_back(kPcmuCodec);
1915 parameters.codecs[0].id = 127;
1916 parameters.codecs[0].params[""] = "96/96/96";
1917 parameters.codecs[1].id = 96;
1918 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001919 webrtc::CodecInst gcodec;
1920 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1921 EXPECT_EQ(96, gcodec.pltype);
1922 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001923 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001924}
1925
1926// Test that we ignore RED if it has bogus codec ids.
1927TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001928 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001929 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001930 cricket::AudioSendParameters parameters;
1931 parameters.codecs.push_back(kRedCodec);
1932 parameters.codecs.push_back(kIsacCodec);
1933 parameters.codecs.push_back(kPcmuCodec);
1934 parameters.codecs[0].id = 127;
1935 parameters.codecs[0].params[""] = "ABC/ABC";
1936 parameters.codecs[1].id = 96;
1937 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001938 webrtc::CodecInst gcodec;
1939 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1940 EXPECT_EQ(96, gcodec.pltype);
1941 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001942 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001943}
1944
1945// Test that we ignore RED if it refers to a codec that is not present.
1946TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001947 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001948 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001949 cricket::AudioSendParameters parameters;
1950 parameters.codecs.push_back(kRedCodec);
1951 parameters.codecs.push_back(kIsacCodec);
1952 parameters.codecs.push_back(kPcmuCodec);
1953 parameters.codecs[0].id = 127;
1954 parameters.codecs[0].params[""] = "97/97";
1955 parameters.codecs[1].id = 96;
1956 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001957 webrtc::CodecInst gcodec;
1958 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1959 EXPECT_EQ(96, gcodec.pltype);
1960 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001961 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001962}
1963
stefanba4c0e42016-02-04 04:12:24 -08001964class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
1965 public:
1966 WebRtcVoiceEngineWithSendSideBweTest()
1967 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
1968};
1969
1970TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
1971 SupportsTransportSequenceNumberHeaderExtension) {
1972 cricket::RtpCapabilities capabilities = engine_.GetCapabilities();
1973 ASSERT_FALSE(capabilities.header_extensions.empty());
1974 for (const cricket::RtpHeaderExtension& extension :
1975 capabilities.header_extensions) {
1976 if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
1977 EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
1978 extension.id);
1979 return;
1980 }
1981 }
1982 FAIL() << "Transport sequence number extension not in header-extension list.";
1983}
1984
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001985// Test support for audio level header extension.
1986TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1987 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001988}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001989TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1990 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1991}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001992
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001993// Test support for absolute send time header extension.
1994TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1995 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1996}
1997TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1998 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001999}
2000
solenberg1ac56142015-10-13 03:58:19 -07002001// Test that we can create a channel and start sending on it.
2002TEST_F(WebRtcVoiceEngineTestFake, Send) {
2003 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002004 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002005 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002006 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2007 EXPECT_TRUE(voe_.GetSend(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002008 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2009 EXPECT_FALSE(voe_.GetSend(channel_num));
solenberg1ac56142015-10-13 03:58:19 -07002010}
2011
2012// Test that we can create a channel and start playing out on it.
2013TEST_F(WebRtcVoiceEngineTestFake, Playout) {
2014 EXPECT_TRUE(SetupEngineWithRecvStream());
2015 int channel_num = voe_.GetLastChannel();
2016 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2017 EXPECT_TRUE(channel_->SetPlayout(true));
2018 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002019 EXPECT_TRUE(channel_->SetPlayout(false));
2020 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2021}
2022
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002023// Test that we can add and remove send streams.
2024TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2025 SetupForMultiSendStream();
2026
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002027 // Set the global state for sending.
2028 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2029
solenbergc96df772015-10-21 13:01:53 -07002030 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002031 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002032 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002033 // Verify that we are in a sending state for all the created streams.
solenberg3a941542015-11-16 07:34:50 -08002034 EXPECT_TRUE(voe_.GetSend(GetSendStreamConfig(ssrc).voe_channel_id));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002035 }
tfarina5237aaf2015-11-10 23:44:30 -08002036 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002037
solenbergc96df772015-10-21 13:01:53 -07002038 // Delete the send streams.
2039 for (uint32_t ssrc : kSsrcs4) {
2040 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002041 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002042 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002043 }
solenbergc96df772015-10-21 13:01:53 -07002044 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002045}
2046
2047// Test SetSendCodecs correctly configure the codecs in all send streams.
2048TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2049 SetupForMultiSendStream();
2050
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002051 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002052 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002053 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002054 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002055 }
2056
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002057 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002058 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002059 parameters.codecs.push_back(kIsacCodec);
2060 parameters.codecs.push_back(kCn16000Codec);
2061 parameters.codecs[1].id = 97;
2062 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002063
2064 // Verify ISAC and VAD are corrected configured on all send channels.
2065 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002066 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002067 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002068 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2069 EXPECT_STREQ("ISAC", gcodec.plname);
2070 EXPECT_TRUE(voe_.GetVAD(channel_num));
2071 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2072 }
2073
2074 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002075 parameters.codecs[0] = kPcmuCodec;
2076 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002077 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002078 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002079 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2080 EXPECT_STREQ("PCMU", gcodec.plname);
2081 EXPECT_FALSE(voe_.GetVAD(channel_num));
2082 }
2083}
2084
2085// Test we can SetSend on all send streams correctly.
2086TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2087 SetupForMultiSendStream();
2088
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002089 // Create the send channels and they should be a SEND_NOTHING date.
solenbergc96df772015-10-21 13:01:53 -07002090 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002091 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002092 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002093 int channel_num = voe_.GetLastChannel();
2094 EXPECT_FALSE(voe_.GetSend(channel_num));
2095 }
2096
2097 // Set the global state for starting sending.
2098 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
solenbergc96df772015-10-21 13:01:53 -07002099 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002100 // Verify that we are in a sending state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002101 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002102 EXPECT_TRUE(voe_.GetSend(channel_num));
2103 }
2104
2105 // Set the global state for stopping sending.
2106 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
solenbergc96df772015-10-21 13:01:53 -07002107 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002108 // Verify that we are in a stop state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002109 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002110 EXPECT_FALSE(voe_.GetSend(channel_num));
2111 }
2112}
2113
2114// Test we can set the correct statistics on all send streams.
2115TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2116 SetupForMultiSendStream();
2117
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002118 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002119 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002120 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002121 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002122 }
solenberg85a04962015-10-27 03:35:21 -07002123 SetAudioSendStreamStats();
2124
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002125 // Create a receive stream to check that none of the send streams end up in
2126 // the receive stream stats.
2127 EXPECT_TRUE(channel_->AddRecvStream(
2128 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002129 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002130 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2131 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002132
solenberg85a04962015-10-27 03:35:21 -07002133 // Check stats for the added streams.
2134 {
2135 cricket::VoiceMediaInfo info;
2136 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002137
solenberg85a04962015-10-27 03:35:21 -07002138 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002139 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002140 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002141 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002142 }
2143
2144 // We have added one receive stream. We should see empty stats.
2145 EXPECT_EQ(info.receivers.size(), 1u);
2146 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002147 }
solenberg1ac56142015-10-13 03:58:19 -07002148
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002149 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002150 {
2151 cricket::VoiceMediaInfo info;
2152 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2153 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002154 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002155 EXPECT_EQ(0u, info.receivers.size());
2156 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002157
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002158 // Deliver a new packet - a default receive stream should be created and we
2159 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002160 {
2161 cricket::VoiceMediaInfo info;
2162 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2163 SetAudioReceiveStreamStats();
2164 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002165 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002166 EXPECT_EQ(1u, info.receivers.size());
2167 VerifyVoiceReceiverInfo(info.receivers[0]);
2168 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002169}
2170
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002171// Test that we can add and remove receive streams, and do proper send/playout.
2172// We can receive on multiple streams while sending one stream.
2173TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002174 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002175 int channel_num1 = voe_.GetLastChannel();
2176
solenberg1ac56142015-10-13 03:58:19 -07002177 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002178 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002179 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002180 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002181
solenberg1ac56142015-10-13 03:58:19 -07002182 // Adding another stream should enable playout on the new stream only.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002183 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2184 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002185 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2186 EXPECT_TRUE(voe_.GetSend(channel_num1));
2187 EXPECT_FALSE(voe_.GetSend(channel_num2));
2188
solenberg1ac56142015-10-13 03:58:19 -07002189 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002190 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2191 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2192
2193 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2194 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2195 int channel_num3 = voe_.GetLastChannel();
2196 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2197 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2198 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2199 EXPECT_FALSE(voe_.GetSend(channel_num3));
2200
2201 // Stop sending.
2202 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2203 EXPECT_FALSE(voe_.GetSend(channel_num1));
2204 EXPECT_FALSE(voe_.GetSend(channel_num2));
2205 EXPECT_FALSE(voe_.GetSend(channel_num3));
2206
2207 // Stop playout.
2208 EXPECT_TRUE(channel_->SetPlayout(false));
2209 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2210 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2211 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2212
solenberg1ac56142015-10-13 03:58:19 -07002213 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002214 EXPECT_TRUE(channel_->SetPlayout(true));
2215 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2216 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2217 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2218
solenberg1ac56142015-10-13 03:58:19 -07002219 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002220 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2221 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002222 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002223}
2224
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002225// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002226// and start sending on it.
2227TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2228 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg246b8172015-12-08 09:50:23 -08002229 cricket::AudioOptions options_adjust_agc;
2230 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002231 int channel_num = voe_.GetLastChannel();
2232 webrtc::AgcConfig agc_config;
2233 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2234 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002235 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002236 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002237 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2238 EXPECT_TRUE(voe_.GetSend(channel_num));
2239 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2240 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002241 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2242 EXPECT_FALSE(voe_.GetSend(channel_num));
2243 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002244}
2245
wu@webrtc.org97077a32013-10-25 21:18:33 +00002246TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002247 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002248 webrtc::AgcConfig agc_config;
2249 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2250 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002251 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2252 send_parameters_.options.tx_agc_digital_compression_gain =
2253 rtc::Optional<uint16_t>(9);
2254 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2255 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2256 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002257 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2258 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2259 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2260 EXPECT_TRUE(agc_config.limiterEnable);
2261
2262 // Check interaction with adjust_agc_delta. Both should be respected, for
2263 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002264 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2265 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002266 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2267 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2268}
2269
wu@webrtc.org97077a32013-10-25 21:18:33 +00002270TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002271 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg246b8172015-12-08 09:50:23 -08002272 send_parameters_.options.recording_sample_rate =
2273 rtc::Optional<uint32_t>(48000);
2274 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2275 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002276
2277 unsigned int recording_sample_rate, playout_sample_rate;
2278 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2279 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2280 EXPECT_EQ(48000u, recording_sample_rate);
2281 EXPECT_EQ(44100u, playout_sample_rate);
2282}
2283
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002284// Test that we can set the outgoing SSRC properly.
2285// SSRC is set in SetupEngine by calling AddSendStream.
2286TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002287 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002288 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002289}
2290
2291TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2292 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002293 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002294 SetAudioSendStreamStats();
solenberg1ac56142015-10-13 03:58:19 -07002295 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2296 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002297 EXPECT_TRUE(channel_->AddRecvStream(
2298 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002299 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2300 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002301
solenberg85a04962015-10-27 03:35:21 -07002302 // Check stats for the added streams.
2303 {
2304 cricket::VoiceMediaInfo info;
2305 EXPECT_EQ(true, channel_->GetStats(&info));
2306
2307 // We have added one send stream. We should see the stats we've set.
2308 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002309 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002310 // We have added one receive stream. We should see empty stats.
2311 EXPECT_EQ(info.receivers.size(), 1u);
2312 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2313 }
solenberg1ac56142015-10-13 03:58:19 -07002314
solenberg566ef242015-11-06 15:34:49 -08002315 // Start sending - this affects some reported stats.
2316 {
2317 cricket::VoiceMediaInfo info;
2318 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2319 EXPECT_EQ(true, channel_->GetStats(&info));
2320 VerifyVoiceSenderInfo(info.senders[0], true);
2321 }
2322
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002323 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002324 {
2325 cricket::VoiceMediaInfo info;
2326 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2327 EXPECT_EQ(true, channel_->GetStats(&info));
2328 EXPECT_EQ(1u, info.senders.size());
2329 EXPECT_EQ(0u, info.receivers.size());
2330 }
solenberg1ac56142015-10-13 03:58:19 -07002331
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002332 // Deliver a new packet - a default receive stream should be created and we
2333 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002334 {
2335 cricket::VoiceMediaInfo info;
2336 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2337 SetAudioReceiveStreamStats();
2338 EXPECT_EQ(true, channel_->GetStats(&info));
2339 EXPECT_EQ(1u, info.senders.size());
2340 EXPECT_EQ(1u, info.receivers.size());
2341 VerifyVoiceReceiverInfo(info.receivers[0]);
2342 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002343}
2344
2345// Test that we can set the outgoing SSRC properly with multiple streams.
2346// SSRC is set in SetupEngine by calling AddSendStream.
2347TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002348 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002349 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002350 EXPECT_TRUE(channel_->AddRecvStream(
2351 cricket::StreamParams::CreateLegacy(kSsrc2)));
2352 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002353}
2354
2355// Test that the local SSRC is the same on sending and receiving channels if the
2356// receive channel is created before the send channel.
2357TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002358 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
nisse51542be2016-02-12 02:27:06 -08002359 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
2360 cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002361
2362 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2363 int receive_channel_num = voe_.GetLastChannel();
2364 EXPECT_TRUE(channel_->AddSendStream(
2365 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002366
solenberg3a941542015-11-16 07:34:50 -08002367 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002368 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002369}
2370
2371// Test that we can properly receive packets.
2372TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2373 EXPECT_TRUE(SetupEngine());
solenberg7e63ef02015-11-20 00:19:43 -08002374 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002375 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002376 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002377 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002378}
2379
2380// Test that we can properly receive packets on multiple streams.
2381TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg7e63ef02015-11-20 00:19:43 -08002382 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002383 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2384 int channel_num1 = voe_.GetLastChannel();
2385 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2386 int channel_num2 = voe_.GetLastChannel();
2387 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2388 int channel_num3 = voe_.GetLastChannel();
2389 // Create packets with the right SSRCs.
2390 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002391 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002392 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002393 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002394 }
2395 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2396 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2397 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002398
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002399 DeliverPacket(packets[0], sizeof(packets[0]));
2400 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2401 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2402 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002403
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002404 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002405 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002406 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2407 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002408
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002409 DeliverPacket(packets[2], sizeof(packets[2]));
2410 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002411 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002412 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002413
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002414 DeliverPacket(packets[3], sizeof(packets[3]));
2415 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2416 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002417 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2418
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002419 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2420 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2421 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2422}
2423
solenberg7e63ef02015-11-20 00:19:43 -08002424// Test that receiving on an unsignalled stream works (default channel will be
2425// created).
2426TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
2427 EXPECT_TRUE(SetupEngine());
2428 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2429 int channel_num = voe_.GetLastChannel();
2430 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2431}
2432
2433// Test that receiving on an unsignalled stream works (default channel will be
2434// created), and that packets will be forwarded to the default channel
2435// regardless of their SSRCs.
2436TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
2437 EXPECT_TRUE(SetupEngine());
2438 char packet[sizeof(kPcmuFrame)];
2439 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2440
2441 // Note that the first unknown SSRC cannot be 0, because we only support
2442 // creating receive streams for SSRC!=0.
2443 DeliverPacket(packet, sizeof(packet));
2444 int channel_num = voe_.GetLastChannel();
2445 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2446 // Once we have the default channel, SSRC==0 will be ok.
2447 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2448 rtc::SetBE32(&packet[8], ssrc);
2449 DeliverPacket(packet, sizeof(packet));
2450 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2451 }
2452}
2453
2454// Test that a default channel is created even after a signalled stream has been
2455// added, and that this stream will get any packets for unknown SSRCs.
2456TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
2457 EXPECT_TRUE(SetupEngine());
2458 char packet[sizeof(kPcmuFrame)];
2459 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2460
2461 // Add a known stream, send packet and verify we got it.
2462 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2463 int signalled_channel_num = voe_.GetLastChannel();
2464 DeliverPacket(packet, sizeof(packet));
2465 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2466
2467 // Note that the first unknown SSRC cannot be 0, because we only support
2468 // creating receive streams for SSRC!=0.
2469 rtc::SetBE32(&packet[8], 7011);
2470 DeliverPacket(packet, sizeof(packet));
2471 int channel_num = voe_.GetLastChannel();
2472 EXPECT_NE(channel_num, signalled_channel_num);
2473 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2474 // Once we have the default channel, SSRC==0 will be ok.
2475 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2476 rtc::SetBE32(&packet[8], ssrc);
2477 DeliverPacket(packet, sizeof(packet));
2478 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2479 }
2480}
2481
solenberg0a617e22015-10-20 15:49:38 -07002482// Test that we properly handle failures to add a receive stream.
2483TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
2484 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002485 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002486 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002487}
2488
solenberg0a617e22015-10-20 15:49:38 -07002489// Test that we properly handle failures to add a send stream.
2490TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
2491 EXPECT_TRUE(SetupEngine());
2492 voe_.set_fail_create_channel(true);
2493 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2494}
2495
solenberg1ac56142015-10-13 03:58:19 -07002496// Test that AddRecvStream creates new stream.
2497TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2498 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002499 int channel_num = voe_.GetLastChannel();
2500 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002501 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002502}
2503
2504// Test that after adding a recv stream, we do not decode more codecs than
2505// those previously passed into SetRecvCodecs.
2506TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002507 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002508 cricket::AudioRecvParameters parameters;
2509 parameters.codecs.push_back(kIsacCodec);
2510 parameters.codecs.push_back(kPcmuCodec);
2511 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002512 EXPECT_TRUE(channel_->AddRecvStream(
2513 cricket::StreamParams::CreateLegacy(kSsrc1)));
2514 int channel_num2 = voe_.GetLastChannel();
2515 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002516 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002517 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002518 gcodec.channels = 2;
2519 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2520}
2521
2522// Test that we properly clean up any streams that were added, even if
2523// not explicitly removed.
2524TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002525 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002526 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002527 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2528 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2529 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2530 delete channel_;
2531 channel_ = NULL;
2532 EXPECT_EQ(0, voe_.GetNumChannels());
2533}
2534
wu@webrtc.org78187522013-10-07 23:32:02 +00002535TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002536 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002537 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2538}
2539
2540TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2541 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002542 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002543 // Manually delete channel to simulate a failure.
2544 int channel = voe_.GetLastChannel();
2545 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2546 // Add recv stream 2 should work.
2547 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002548 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002549 EXPECT_NE(channel, new_channel);
2550 // The last created channel is deleted too.
2551 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002552}
2553
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002554// Test the InsertDtmf on default send stream as caller.
2555TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2556 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002557}
2558
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002559// Test the InsertDtmf on default send stream as callee
2560TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2561 TestInsertDtmf(0, false);
2562}
2563
2564// Test the InsertDtmf on specified send stream as caller.
2565TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2566 TestInsertDtmf(kSsrc1, true);
2567}
2568
2569// Test the InsertDtmf on specified send stream as callee.
2570TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2571 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002572}
2573
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002574TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002575 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002576 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002577 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2578 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2579 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2580 EXPECT_TRUE(channel_->SetPlayout(true));
2581 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2582 EXPECT_TRUE(channel_->SetPlayout(false));
2583 EXPECT_FALSE(channel_->SetPlayout(true));
2584}
2585
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002586TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002587 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002588
2589 bool ec_enabled;
2590 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002591 webrtc::AecmModes aecm_mode;
2592 bool cng_enabled;
2593 bool agc_enabled;
2594 webrtc::AgcModes agc_mode;
2595 webrtc::AgcConfig agc_config;
2596 bool ns_enabled;
2597 webrtc::NsModes ns_mode;
2598 bool highpass_filter_enabled;
2599 bool stereo_swapping_enabled;
2600 bool typing_detection_enabled;
2601 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002602 voe_.GetAecmMode(aecm_mode, cng_enabled);
2603 voe_.GetAgcStatus(agc_enabled, agc_mode);
2604 voe_.GetAgcConfig(agc_config);
2605 voe_.GetNsStatus(ns_enabled, ns_mode);
2606 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2607 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2608 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2609 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002610 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002611 EXPECT_FALSE(cng_enabled);
2612 EXPECT_TRUE(agc_enabled);
2613 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2614 EXPECT_TRUE(ns_enabled);
2615 EXPECT_TRUE(highpass_filter_enabled);
2616 EXPECT_FALSE(stereo_swapping_enabled);
2617 EXPECT_TRUE(typing_detection_enabled);
2618 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2619 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002620 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2621 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002622
solenberg246b8172015-12-08 09:50:23 -08002623 // Nothing set in AudioOptions, so everything should be as default.
2624 send_parameters_.options = cricket::AudioOptions();
2625 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002626 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002627 voe_.GetAecmMode(aecm_mode, cng_enabled);
2628 voe_.GetAgcStatus(agc_enabled, agc_mode);
2629 voe_.GetAgcConfig(agc_config);
2630 voe_.GetNsStatus(ns_enabled, ns_mode);
2631 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2632 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2633 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2634 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002635 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002636 EXPECT_FALSE(cng_enabled);
2637 EXPECT_TRUE(agc_enabled);
2638 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2639 EXPECT_TRUE(ns_enabled);
2640 EXPECT_TRUE(highpass_filter_enabled);
2641 EXPECT_FALSE(stereo_swapping_enabled);
2642 EXPECT_TRUE(typing_detection_enabled);
2643 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2644 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002645 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2646 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002647
2648 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002649 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2650 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002651 voe_.GetEcStatus(ec_enabled, ec_mode);
2652 EXPECT_FALSE(ec_enabled);
2653
2654 // Turn echo cancellation back on, with settings, and make sure
2655 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002656 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2657 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002658 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002659 voe_.GetAecmMode(aecm_mode, cng_enabled);
2660 voe_.GetAgcStatus(agc_enabled, agc_mode);
2661 voe_.GetAgcConfig(agc_config);
2662 voe_.GetNsStatus(ns_enabled, ns_mode);
2663 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2664 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2665 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2666 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002667 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002668 EXPECT_TRUE(agc_enabled);
2669 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2670 EXPECT_TRUE(ns_enabled);
2671 EXPECT_TRUE(highpass_filter_enabled);
2672 EXPECT_FALSE(stereo_swapping_enabled);
2673 EXPECT_TRUE(typing_detection_enabled);
2674 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2675 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2676
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002677 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2678 // control.
solenberg246b8172015-12-08 09:50:23 -08002679 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2680 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002681 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002682 voe_.GetAecmMode(aecm_mode, cng_enabled);
2683 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002684 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002685 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2686
2687 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002688 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2689 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2690 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2691 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002692 voe_.GetEcStatus(ec_enabled, ec_mode);
2693 EXPECT_FALSE(ec_enabled);
2694 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002695 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2696 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002697 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002698 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002699 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002700 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2701
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002702 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002703 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2704 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002705 voe_.GetAgcStatus(agc_enabled, agc_mode);
2706 EXPECT_FALSE(agc_enabled);
2707
2708 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002709 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2710 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2711 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002712 voe_.GetAgcStatus(agc_enabled, agc_mode);
2713 EXPECT_TRUE(agc_enabled);
2714 voe_.GetAgcConfig(agc_config);
2715 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2716
2717 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002718 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2719 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2720 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2721 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2722 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002723 voe_.GetNsStatus(ns_enabled, ns_mode);
2724 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2725 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2726 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2727 EXPECT_FALSE(ns_enabled);
2728 EXPECT_FALSE(highpass_filter_enabled);
2729 EXPECT_FALSE(typing_detection_enabled);
2730 EXPECT_TRUE(stereo_swapping_enabled);
2731
solenberg1ac56142015-10-13 03:58:19 -07002732 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002733 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002734 voe_.GetEcStatus(ec_enabled, ec_mode);
2735 voe_.GetNsStatus(ns_enabled, ns_mode);
2736 EXPECT_TRUE(ec_enabled);
2737 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2738 EXPECT_FALSE(ns_enabled);
2739 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2740}
2741
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002742TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002743 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002744
2745 bool ec_enabled;
2746 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002747 bool agc_enabled;
2748 webrtc::AgcModes agc_mode;
2749 bool ns_enabled;
2750 webrtc::NsModes ns_mode;
2751 bool highpass_filter_enabled;
2752 bool stereo_swapping_enabled;
2753 bool typing_detection_enabled;
2754
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002755 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002756 voe_.GetAgcStatus(agc_enabled, agc_mode);
2757 voe_.GetNsStatus(ns_enabled, ns_mode);
2758 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2759 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2760 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2761 EXPECT_TRUE(ec_enabled);
2762 EXPECT_TRUE(agc_enabled);
2763 EXPECT_TRUE(ns_enabled);
2764 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002765 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002766 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002767}
2768
2769TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2770 webrtc::AgcConfig set_config = {0};
2771 set_config.targetLeveldBOv = 3;
2772 set_config.digitalCompressionGaindB = 9;
2773 set_config.limiterEnable = true;
2774 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002775 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002776
2777 webrtc::AgcConfig config = {0};
2778 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2779 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2780 EXPECT_EQ(set_config.digitalCompressionGaindB,
2781 config.digitalCompressionGaindB);
2782 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2783}
2784
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002785TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002786 EXPECT_TRUE(SetupEngineWithSendStream());
kwiberg686a8ef2016-02-26 03:00:35 -08002787 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
nisse51542be2016-02-12 02:27:06 -08002788 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_.CreateChannel(
2789 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002790 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
nisse51542be2016-02-12 02:27:06 -08002791 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_.CreateChannel(
2792 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002793
2794 // Have to add a stream to make SetSend work.
2795 cricket::StreamParams stream1;
2796 stream1.ssrcs.push_back(1);
2797 channel1->AddSendStream(stream1);
2798 cricket::StreamParams stream2;
2799 stream2.ssrcs.push_back(2);
2800 channel2->AddSendStream(stream2);
2801
2802 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002803 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002804 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2805 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2806 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002807 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2808 EXPECT_EQ(parameters_options_all.options, channel1->options());
2809 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2810 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002811
2812 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002813 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002814 parameters_options_no_ns.options.noise_suppression =
2815 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002816 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2817 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002818 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2819 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2820 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002821 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002822
2823 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002824 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002825 parameters_options_no_agc.options.auto_gain_control =
2826 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002827 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002828 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2829 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2830 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002831 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002832
solenberg246b8172015-12-08 09:50:23 -08002833 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002834 bool ec_enabled;
2835 webrtc::EcModes ec_mode;
2836 bool agc_enabled;
2837 webrtc::AgcModes agc_mode;
2838 bool ns_enabled;
2839 webrtc::NsModes ns_mode;
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_TRUE(ns_enabled);
2846
2847 channel1->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_TRUE(agc_enabled);
2853 EXPECT_FALSE(ns_enabled);
2854
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002855 channel2->SetSend(cricket::SEND_MICROPHONE);
2856 voe_.GetEcStatus(ec_enabled, ec_mode);
2857 voe_.GetAgcStatus(agc_enabled, agc_mode);
2858 voe_.GetNsStatus(ns_enabled, ns_mode);
2859 EXPECT_TRUE(ec_enabled);
2860 EXPECT_FALSE(agc_enabled);
2861 EXPECT_TRUE(ns_enabled);
2862
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002863 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08002864 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002865 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2866 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002867 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01002868 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07002869 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01002870 rtc::Optional<bool>(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002871 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002872 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01002873 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2874 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2875 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002876 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002877 voe_.GetEcStatus(ec_enabled, ec_mode);
2878 voe_.GetAgcStatus(agc_enabled, agc_mode);
2879 voe_.GetNsStatus(ns_enabled, ns_mode);
2880 EXPECT_TRUE(ec_enabled);
2881 EXPECT_FALSE(agc_enabled);
2882 EXPECT_FALSE(ns_enabled);
2883}
2884
wu@webrtc.orgde305012013-10-31 15:40:38 +00002885// This test verifies DSCP settings are properly applied on voice media channel.
2886TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002887 EXPECT_TRUE(SetupEngineWithSendStream());
nisse51542be2016-02-12 02:27:06 -08002888 cricket::FakeNetworkInterface network_interface;
2889 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08002890 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08002891
2892 channel.reset(engine_.CreateChannel(&call_, config, cricket::AudioOptions()));
2893 channel->SetInterface(&network_interface);
2894 // Default value when DSCP is disabled should be DSCP_DEFAULT.
2895 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
2896
2897 config.enable_dscp = true;
2898 channel.reset(engine_.CreateChannel(&call_, config, cricket::AudioOptions()));
2899 channel->SetInterface(&network_interface);
2900 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
2901
2902 // Verify that setting the option to false resets the
2903 // DiffServCodePoint.
2904 config.enable_dscp = false;
2905 channel.reset(engine_.CreateChannel(&call_, config, cricket::AudioOptions()));
2906 channel->SetInterface(&network_interface);
2907 // Default value when DSCP is disabled should be DSCP_DEFAULT.
2908 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
2909
2910 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00002911}
2912
solenberg1ac56142015-10-13 03:58:19 -07002913TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002914 EXPECT_TRUE(SetupEngine());
2915 cricket::WebRtcVoiceMediaChannel* media_channel =
2916 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002917 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2918 EXPECT_TRUE(channel_->AddRecvStream(
2919 cricket::StreamParams::CreateLegacy(kSsrc1)));
2920 int channel_id = voe_.GetLastChannel();
2921 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2922 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2923 EXPECT_TRUE(channel_->AddRecvStream(
2924 cricket::StreamParams::CreateLegacy(kSsrc2)));
2925 int channel_id2 = voe_.GetLastChannel();
2926 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002927}
2928
solenberg1ac56142015-10-13 03:58:19 -07002929TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002930 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002931 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002932 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2933 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2934 EXPECT_TRUE(channel_->AddSendStream(
2935 cricket::StreamParams::CreateLegacy(kSsrc1)));
2936 int channel_id = voe_.GetLastChannel();
2937 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2938 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2939 EXPECT_TRUE(channel_->AddSendStream(
2940 cricket::StreamParams::CreateLegacy(kSsrc2)));
2941 int channel_id2 = voe_.GetLastChannel();
2942 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002943}
2944
solenberg4bac9c52015-10-09 02:32:53 -07002945TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002946 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002947 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002948 cricket::StreamParams stream;
2949 stream.ssrcs.push_back(kSsrc2);
2950 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002951 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002952 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002953 float scale = 0;
2954 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2955 EXPECT_DOUBLE_EQ(3, scale);
2956}
2957
2958TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
2959 EXPECT_TRUE(SetupEngine());
2960 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2961 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2962 int channel_id = voe_.GetLastChannel();
2963 float scale = 0;
2964 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2965 EXPECT_DOUBLE_EQ(2, scale);
2966 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07002967 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002968 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002969}
2970
pbos8fc7fa72015-07-15 08:02:58 -07002971TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02002972 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07002973 const std::string kSyncLabel = "AvSyncLabel";
2974
solenberg1ac56142015-10-13 03:58:19 -07002975 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07002976 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
2977 sp.sync_label = kSyncLabel;
2978 // Creating two channels to make sure that sync label is set properly for both
2979 // the default voice channel and following ones.
2980 EXPECT_TRUE(channel_->AddRecvStream(sp));
2981 sp.ssrcs[0] += 1;
2982 EXPECT_TRUE(channel_->AddRecvStream(sp));
2983
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002984 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07002985 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002986 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002987 << "SyncGroup should be set based on sync_label";
2988 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002989 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002990 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07002991}
2992
solenberg3a941542015-11-16 07:34:50 -08002993// TODO(solenberg): Remove, once recv streams are configured through Call.
2994// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07002995TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002996 // Test that setting the header extensions results in the expected state
2997 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002998 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002999 ssrcs.push_back(223);
3000 ssrcs.push_back(224);
3001
solenberg1ac56142015-10-13 03:58:19 -07003002 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003003 cricket::WebRtcVoiceMediaChannel* media_channel =
3004 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003005 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003006 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003007 EXPECT_TRUE(media_channel->AddRecvStream(
3008 cricket::StreamParams::CreateLegacy(ssrc)));
3009 }
3010
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003011 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003012 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003013 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003014 EXPECT_NE(nullptr, s);
3015 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3016 }
3017
3018 // Set up receive extensions.
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003019 cricket::RtpCapabilities capabilities = engine_.GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003020 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003021 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003022 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003023 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
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 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003028 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3029 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003030 for (const auto& s_ext : s_exts) {
3031 if (e_ext.id == s_ext.id) {
3032 EXPECT_EQ(e_ext.uri, s_ext.name);
3033 }
3034 }
3035 }
3036 }
3037
3038 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003039 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003040 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003041 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003042 EXPECT_NE(nullptr, s);
3043 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3044 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003045}
3046
3047TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3048 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003049 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003050 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3051 static const unsigned char kRtcp[] = {
3052 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3053 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3054 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3055 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3056 };
3057 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3058
solenberg1ac56142015-10-13 03:58:19 -07003059 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003060 cricket::WebRtcVoiceMediaChannel* media_channel =
3061 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003062 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003063 EXPECT_TRUE(media_channel->AddRecvStream(
3064 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3065
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003066 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003067 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003068 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003069 EXPECT_EQ(0, s->received_packets());
3070 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3071 EXPECT_EQ(1, s->received_packets());
3072 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3073 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003074}
Minyue2013aec2015-05-13 14:14:42 +02003075
solenberg0a617e22015-10-20 15:49:38 -07003076// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003077// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003078TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenberg1ac56142015-10-13 03:58:19 -07003079 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003080 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003081 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003082 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3083 int recv_ch = voe_.GetLastChannel();
3084 EXPECT_NE(recv_ch, default_channel);
3085 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3086 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3087 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003088 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3089 recv_ch = voe_.GetLastChannel();
3090 EXPECT_NE(recv_ch, default_channel);
3091 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003092}
3093
3094TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003095 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003096 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003097
3098 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3099 int recv_ch = voe_.GetLastChannel();
3100
3101 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3102 int send_ch = voe_.GetLastChannel();
3103
3104 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3105 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3106 // channel of |recv_ch|.This is not a common case, since, normally, only the
3107 // default channel can be associated. However, the default is not deletable.
3108 // So we force the |recv_ch| to associate with a non-default channel.
3109 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3110 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3111
3112 EXPECT_TRUE(channel_->RemoveSendStream(2));
3113 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3114}
stefan658910c2015-09-03 05:48:32 -07003115
deadbeef884f5852016-01-15 09:20:04 -08003116TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
3117 EXPECT_TRUE(SetupEngine());
kwiberg686a8ef2016-02-26 03:00:35 -08003118 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3119 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003120
3121 // Setting the sink before a recv stream exists should do nothing.
3122 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3123 EXPECT_TRUE(
3124 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3125 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3126
3127 // Now try actually setting the sink.
3128 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3129 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3130
3131 // Now try resetting it.
3132 channel_->SetRawAudioSink(kSsrc1, nullptr);
3133 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3134}
3135
3136TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
3137 EXPECT_TRUE(SetupEngine());
kwiberg686a8ef2016-02-26 03:00:35 -08003138 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3139 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003140
3141 // Should be able to set a default sink even when no stream exists.
3142 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3143
3144 // Create default channel and ensure it's assigned the default sink.
3145 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3146 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3147
3148 // Try resetting the default sink.
3149 channel_->SetRawAudioSink(0, nullptr);
3150 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3151
3152 // Try setting the default sink while the default stream exists.
3153 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3154 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3155
3156 // If we remove and add a default stream, it should get the same sink.
3157 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3158 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3159 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3160}
3161
stefan658910c2015-09-03 05:48:32 -07003162// Tests that the library initializes and shuts down properly.
3163TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3164 cricket::WebRtcVoiceEngine engine;
3165 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
kwiberg686a8ef2016-02-26 03:00:35 -08003166 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003167 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003168 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3169 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003170 EXPECT_TRUE(channel != nullptr);
3171 delete channel;
3172 engine.Terminate();
3173
3174 // Reinit to catch regression where VoiceEngineObserver reference is lost
3175 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3176 engine.Terminate();
3177}
3178
3179// Tests that the library is configured with the codecs we want.
3180TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003181 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003182 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3183 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0), nullptr));
3184 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3185 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0), nullptr));
3186 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3187 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003188 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003189 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3190 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0), nullptr));
3191 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3192 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0), nullptr));
3193 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3194 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0), nullptr));
3195 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3196 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0), nullptr));
3197 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3198 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0), nullptr));
3199 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3200 cricket::AudioCodec(96, "red", 8000, 0, 1, 0), nullptr));
3201 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3202 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0), nullptr));
3203 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3204 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0), nullptr));
3205 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3206 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0), nullptr));
3207 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3208 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003209 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003210 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3211 cricket::AudioCodec(0, "", 8000, 0, 1, 0), nullptr)); // PCMU
3212 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3213 cricket::AudioCodec(8, "", 8000, 0, 1, 0), nullptr)); // PCMA
3214 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3215 cricket::AudioCodec(9, "", 8000, 0, 1, 0), nullptr)); // G722
3216 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3217 cricket::AudioCodec(13, "", 8000, 0, 1, 0), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003218 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003219 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3220 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003221 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003222 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3223 cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0), nullptr));
3224 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3225 cricket::AudioCodec(88, "", 0, 0, 1, 0), nullptr));
3226 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3227 cricket::AudioCodec(0, "", 0, 0, 2, 0), nullptr));
3228 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3229 cricket::AudioCodec(0, "", 5000, 0, 1, 0), nullptr));
3230 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3231 cricket::AudioCodec(0, "", 0, 5000, 1, 0), nullptr));
3232
stefan658910c2015-09-03 05:48:32 -07003233 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenberg26c8c912015-11-27 04:00:25 -08003234 cricket::WebRtcVoiceEngine engine;
stefan658910c2015-09-03 05:48:32 -07003235 for (std::vector<cricket::AudioCodec>::const_iterator it =
3236 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3237 if (it->name == "CN" && it->clockrate == 16000) {
3238 EXPECT_EQ(105, it->id);
3239 } else if (it->name == "CN" && it->clockrate == 32000) {
3240 EXPECT_EQ(106, it->id);
3241 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3242 EXPECT_EQ(103, it->id);
3243 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3244 EXPECT_EQ(104, it->id);
3245 } else if (it->name == "G722" && it->clockrate == 8000) {
3246 EXPECT_EQ(9, it->id);
3247 } else if (it->name == "telephone-event") {
3248 EXPECT_EQ(126, it->id);
3249 } else if (it->name == "red") {
3250 EXPECT_EQ(127, it->id);
3251 } else if (it->name == "opus") {
3252 EXPECT_EQ(111, it->id);
3253 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3254 EXPECT_EQ("10", it->params.find("minptime")->second);
3255 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3256 EXPECT_EQ("60", it->params.find("maxptime")->second);
3257 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3258 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3259 }
3260 }
stefan658910c2015-09-03 05:48:32 -07003261 engine.Terminate();
3262}
3263
3264// Tests that VoE supports at least 32 channels
3265TEST(WebRtcVoiceEngineTest, Has32Channels) {
3266 cricket::WebRtcVoiceEngine engine;
3267 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
kwiberg686a8ef2016-02-26 03:00:35 -08003268 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003269 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003270
3271 cricket::VoiceMediaChannel* channels[32];
3272 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003273 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003274 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3275 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003276 if (!channel)
3277 break;
stefan658910c2015-09-03 05:48:32 -07003278 channels[num_channels++] = channel;
3279 }
3280
tfarina5237aaf2015-11-10 23:44:30 -08003281 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003282 EXPECT_EQ(expected, num_channels);
3283
3284 while (num_channels > 0) {
3285 delete channels[--num_channels];
3286 }
stefan658910c2015-09-03 05:48:32 -07003287 engine.Terminate();
3288}
3289
3290// Test that we set our preferred codecs properly.
3291TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3292 cricket::WebRtcVoiceEngine engine;
3293 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
kwiberg686a8ef2016-02-26 03:00:35 -08003294 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003295 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003296 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3297 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003298 cricket::AudioRecvParameters parameters;
3299 parameters.codecs = engine.codecs();
3300 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003301}