blob: f639e74b5c2d547127959d17c9aaad048a9585e7 [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
2 * libjingle
3 * Copyright 2008 Google Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000027
tfarina5237aaf2015-11-10 23:44:30 -080028#include "webrtc/base/arraysize.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000029#include "webrtc/base/byteorder.h"
30#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020031#include "webrtc/call.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032#include "talk/media/base/constants.h"
33#include "talk/media/base/fakemediaengine.h"
wu@webrtc.orgde305012013-10-31 15:40:38 +000034#include "talk/media/base/fakenetworkinterface.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035#include "talk/media/base/fakertp.h"
Fredrik Solenberg4b60c732015-05-07 14:07:48 +020036#include "talk/media/webrtc/fakewebrtccall.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000037#include "talk/media/webrtc/fakewebrtcvoiceengine.h"
38#include "talk/media/webrtc/webrtcvoiceengine.h"
deadbeefcbecd352015-09-23 11:50:27 -070039#include "webrtc/p2p/base/faketransportcontroller.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000040#include "talk/session/media/channel.h"
41
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000042using cricket::kRtpAudioLevelHeaderExtension;
43using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
44
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020045namespace {
46
47const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
48const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
49const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
50const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
51const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
52const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
53const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
54const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
55const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, 0,
56 1, 0);
solenberg85a04962015-10-27 03:35:21 -070057const uint32_t kSsrc1 = 0x99;
58const uint32_t kSsrc2 = 0x98;
59const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060
61class FakeVoEWrapper : public cricket::VoEWrapper {
62 public:
63 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
64 : cricket::VoEWrapper(engine, // processing
65 engine, // base
66 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000067 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000068 engine, // network
69 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000070 engine) { // volume
71 }
72};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020073} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000074
75class WebRtcVoiceEngineTestFake : public testing::Test {
76 public:
henrike@webrtc.org28e20752013-07-10 00:45:36 +000077 WebRtcVoiceEngineTestFake()
Fredrik Solenberg709ed672015-09-15 12:26:33 +020078 : call_(webrtc::Call::Config()),
solenbergbd138382015-11-20 16:08:07 -080079 engine_(new FakeVoEWrapper(&voe_)),
Jelena Marusicc28a8962015-05-29 15:05:44 +020080 channel_(nullptr) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +020081 send_parameters_.codecs.push_back(kPcmuCodec);
82 recv_parameters_.codecs.push_back(kPcmuCodec);
Karl Wibergbe579832015-11-10 22:34:18 +010083 options_adjust_agc_.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000084 }
solenberg1ac56142015-10-13 03:58:19 -070085 bool SetupEngine() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000086 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000087 return false;
88 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +020089 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +020090 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000091 }
solenberg1ac56142015-10-13 03:58:19 -070092 bool SetupEngineWithRecvStream() {
93 if (!SetupEngine()) {
94 return false;
95 }
96 return channel_->AddRecvStream(
97 cricket::StreamParams::CreateLegacy(kSsrc1));
98 }
99 bool SetupEngineWithSendStream() {
100 if (!SetupEngine()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000101 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000102 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000103 return channel_->AddSendStream(
104 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000105 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000106 void SetupForMultiSendStream() {
solenberg1ac56142015-10-13 03:58:19 -0700107 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700108 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800109 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700110 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700111 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800112 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000113 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000114 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200115 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000116 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000117 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200118 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000119 delete channel_;
120 engine_.Terminate();
121 }
122
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100123 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
124 const auto* send_stream = call_.GetAudioSendStream(ssrc);
125 EXPECT_TRUE(send_stream);
126 return *send_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()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200143 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200144 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000145 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700146 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000147 // send stream.
148 EXPECT_TRUE(channel_->AddSendStream(
149 cricket::StreamParams::CreateLegacy(kSsrc1)));
150 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000151
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000152 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200153 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000154 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
155 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800156 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200157 send_parameters_.codecs.push_back(kTelephoneEventCodec);
158 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000159 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000160
161 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700162 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800163 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000164 EXPECT_TRUE(channel_->AddSendStream(
165 cricket::StreamParams::CreateLegacy(kSsrc1)));
166 }
167
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000168 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800169 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000170
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100171 // Test send.
172 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
173 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
174 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800175 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100176 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
177 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
178 EXPECT_EQ(2, telephone_event.event_code);
179 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000180 }
181
182 // Test that send bandwidth is set correctly.
183 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000184 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
185 // |expected_result| is the expected result from SetMaxSendBandwidth().
186 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000187 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000188 int max_bitrate,
189 bool expected_result,
190 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200191 cricket::AudioSendParameters parameters;
192 parameters.codecs.push_back(codec);
193 parameters.max_bandwidth_bps = max_bitrate;
194 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
195
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000196 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000197 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000198 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000199 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000200 }
201
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000202 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenberg0a617e22015-10-20 15:49:38 -0700203 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000204
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000205 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800206 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000207
208 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200209 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000210 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200211 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800212 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000213
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000214 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200215 send_parameters_.extensions.clear();
216 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800217 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000218
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000219 // Ensure extension is set properly.
220 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200221 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
222 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800223 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
224 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
225 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000226
solenberg7add0582015-11-20 09:59:34 -0800227 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000228 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700229 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800230 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
231 call_.GetAudioSendStream(kSsrc2));
232 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
233 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
234 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000235
236 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200237 send_parameters_.codecs.push_back(kPcmuCodec);
238 send_parameters_.extensions.clear();
239 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800240 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
241 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000242 }
243
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000244 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700245 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000246
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000247 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800248 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000249
250 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800251 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000252 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800253 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
254 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000255
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000256 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800257 recv_parameters_.extensions.clear();
258 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
259 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000260
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000261 // Ensure extension is set properly.
262 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800263 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
264 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
265 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
266 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
267 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000268
solenberg7add0582015-11-20 09:59:34 -0800269 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000270 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700271 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800272 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
273 call_.GetAudioReceiveStream(kSsrc2));
274 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
275 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
276 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000277
278 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800279 recv_parameters_.extensions.clear();
280 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
281 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
282 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000283 }
284
solenberg85a04962015-10-27 03:35:21 -0700285 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
286 webrtc::AudioSendStream::Stats stats;
287 stats.local_ssrc = 12;
288 stats.bytes_sent = 345;
289 stats.packets_sent = 678;
290 stats.packets_lost = 9012;
291 stats.fraction_lost = 34.56f;
292 stats.codec_name = "codec_name_send";
293 stats.ext_seqnum = 789;
294 stats.jitter_ms = 12;
295 stats.rtt_ms = 345;
296 stats.audio_level = 678;
297 stats.aec_quality_min = 9.01f;
298 stats.echo_delay_median_ms = 234;
299 stats.echo_delay_std_ms = 567;
300 stats.echo_return_loss = 890;
301 stats.echo_return_loss_enhancement = 1234;
302 stats.typing_noise_detected = true;
303 return stats;
304 }
305 void SetAudioSendStreamStats() {
306 for (auto* s : call_.GetAudioSendStreams()) {
307 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200308 }
solenberg85a04962015-10-27 03:35:21 -0700309 }
solenberg566ef242015-11-06 15:34:49 -0800310 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
311 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700312 const auto stats = GetAudioSendStreamStats();
313 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
314 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
315 EXPECT_EQ(info.packets_sent, stats.packets_sent);
316 EXPECT_EQ(info.packets_lost, stats.packets_lost);
317 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
318 EXPECT_EQ(info.codec_name, stats.codec_name);
319 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
320 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
321 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
322 EXPECT_EQ(info.audio_level, stats.audio_level);
323 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
324 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
325 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
326 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
327 EXPECT_EQ(info.echo_return_loss_enhancement,
328 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800329 EXPECT_EQ(info.typing_noise_detected,
330 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700331 }
332
333 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
334 webrtc::AudioReceiveStream::Stats stats;
335 stats.remote_ssrc = 123;
336 stats.bytes_rcvd = 456;
337 stats.packets_rcvd = 768;
338 stats.packets_lost = 101;
339 stats.fraction_lost = 23.45f;
340 stats.codec_name = "codec_name_recv";
341 stats.ext_seqnum = 678;
342 stats.jitter_ms = 901;
343 stats.jitter_buffer_ms = 234;
344 stats.jitter_buffer_preferred_ms = 567;
345 stats.delay_estimate_ms = 890;
346 stats.audio_level = 1234;
347 stats.expand_rate = 5.67f;
348 stats.speech_expand_rate = 8.90f;
349 stats.secondary_decoded_rate = 1.23f;
350 stats.accelerate_rate = 4.56f;
351 stats.preemptive_expand_rate = 7.89f;
352 stats.decoding_calls_to_silence_generator = 12;
353 stats.decoding_calls_to_neteq = 345;
354 stats.decoding_normal = 67890;
355 stats.decoding_plc = 1234;
356 stats.decoding_cng = 5678;
357 stats.decoding_plc_cng = 9012;
358 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200359 return stats;
360 }
361 void SetAudioReceiveStreamStats() {
362 for (auto* s : call_.GetAudioReceiveStreams()) {
363 s->SetStats(GetAudioReceiveStreamStats());
364 }
365 }
366 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700367 const auto stats = GetAudioReceiveStreamStats();
368 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
369 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
370 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
371 EXPECT_EQ(info.packets_lost, stats.packets_lost);
372 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
373 EXPECT_EQ(info.codec_name, stats.codec_name);
374 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
375 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
376 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200377 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700378 stats.jitter_buffer_preferred_ms);
379 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
380 EXPECT_EQ(info.audio_level, stats.audio_level);
381 EXPECT_EQ(info.expand_rate, stats.expand_rate);
382 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
383 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
384 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
385 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200386 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700387 stats.decoding_calls_to_silence_generator);
388 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
389 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
390 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
391 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
392 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
393 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200394 }
395
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000396 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200397 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000398 cricket::FakeWebRtcVoiceEngine voe_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000399 cricket::WebRtcVoiceEngine engine_;
400 cricket::VoiceMediaChannel* channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000401
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200402 cricket::AudioSendParameters send_parameters_;
403 cricket::AudioRecvParameters recv_parameters_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000404 cricket::AudioOptions options_adjust_agc_;
405};
406
407// Tests that our stub library "works".
408TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
409 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000410 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000411 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000412 engine_.Terminate();
413 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000414}
415
416// Tests that we can create and destroy a channel.
417TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000418 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200419 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200420 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000421}
422
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000423// Tests that the list of supported codecs is created properly and ordered
424// correctly
425TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
426 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
427 ASSERT_FALSE(codecs.empty());
428 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
429 EXPECT_EQ(48000, codecs[0].clockrate);
430 EXPECT_EQ(2, codecs[0].channels);
431 EXPECT_EQ(64000, codecs[0].bitrate);
432 int pref = codecs[0].preference;
433 for (size_t i = 1; i < codecs.size(); ++i) {
434 EXPECT_GT(pref, codecs[i].preference);
435 pref = codecs[i].preference;
436 }
437}
438
439// Tests that we can find codecs by name or id, and that we interpret the
440// clockrate and bitrate fields properly.
441TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
442 cricket::AudioCodec codec;
443 webrtc::CodecInst codec_inst;
444 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800445 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000446 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800447 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000448 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800449 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
450 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000451 // Find ISAC with a different payload id.
452 codec = kIsacCodec;
453 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800454 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000455 EXPECT_EQ(codec.id, codec_inst.pltype);
456 // Find PCMU with a 0 clockrate.
457 codec = kPcmuCodec;
458 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800459 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000460 EXPECT_EQ(codec.id, codec_inst.pltype);
461 EXPECT_EQ(8000, codec_inst.plfreq);
462 // Find PCMU with a 0 bitrate.
463 codec = kPcmuCodec;
464 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800465 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000466 EXPECT_EQ(codec.id, codec_inst.pltype);
467 EXPECT_EQ(64000, codec_inst.rate);
468 // Find ISAC with an explicit bitrate.
469 codec = kIsacCodec;
470 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800471 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000472 EXPECT_EQ(codec.id, codec_inst.pltype);
473 EXPECT_EQ(32000, codec_inst.rate);
474}
475
476// Test that we set our inbound codecs properly, including changing PT.
477TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
478 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200479 cricket::AudioRecvParameters parameters;
480 parameters.codecs.push_back(kIsacCodec);
481 parameters.codecs.push_back(kPcmuCodec);
482 parameters.codecs.push_back(kTelephoneEventCodec);
483 parameters.codecs[0].id = 106; // collide with existing telephone-event
484 parameters.codecs[2].id = 126;
485 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700486 EXPECT_TRUE(channel_->AddRecvStream(
487 cricket::StreamParams::CreateLegacy(kSsrc1)));
488 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000489 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800490 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000491 gcodec.plfreq = 16000;
492 gcodec.channels = 1;
493 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
494 EXPECT_EQ(106, gcodec.pltype);
495 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800496 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000497 gcodec.plfreq = 8000;
498 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
499 EXPECT_EQ(126, gcodec.pltype);
500 EXPECT_STREQ("telephone-event", gcodec.plname);
501}
502
503// Test that we fail to set an unknown inbound codec.
504TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
505 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200506 cricket::AudioRecvParameters parameters;
507 parameters.codecs.push_back(kIsacCodec);
508 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
509 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000510}
511
512// Test that we fail if we have duplicate types in the inbound list.
513TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
514 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200515 cricket::AudioRecvParameters parameters;
516 parameters.codecs.push_back(kIsacCodec);
517 parameters.codecs.push_back(kCn16000Codec);
518 parameters.codecs[1].id = kIsacCodec.id;
519 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000520}
521
522// Test that we can decode OPUS without stereo parameters.
523TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
524 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200525 cricket::AudioRecvParameters parameters;
526 parameters.codecs.push_back(kIsacCodec);
527 parameters.codecs.push_back(kPcmuCodec);
528 parameters.codecs.push_back(kOpusCodec);
529 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000530 EXPECT_TRUE(channel_->AddRecvStream(
531 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700532 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000533 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800534 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000535 // Even without stereo parameters, recv codecs still specify channels = 2.
536 EXPECT_EQ(2, opus.channels);
537 EXPECT_EQ(111, opus.pltype);
538 EXPECT_STREQ("opus", opus.plname);
539 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700540 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000541 EXPECT_EQ(111, opus.pltype);
542}
543
544// Test that we can decode OPUS with stereo = 0.
545TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
546 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200547 cricket::AudioRecvParameters parameters;
548 parameters.codecs.push_back(kIsacCodec);
549 parameters.codecs.push_back(kPcmuCodec);
550 parameters.codecs.push_back(kOpusCodec);
551 parameters.codecs[2].params["stereo"] = "0";
552 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000553 EXPECT_TRUE(channel_->AddRecvStream(
554 cricket::StreamParams::CreateLegacy(kSsrc1)));
555 int channel_num2 = voe_.GetLastChannel();
556 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800557 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000558 // Even when stereo is off, recv codecs still specify channels = 2.
559 EXPECT_EQ(2, opus.channels);
560 EXPECT_EQ(111, opus.pltype);
561 EXPECT_STREQ("opus", opus.plname);
562 opus.pltype = 0;
563 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
564 EXPECT_EQ(111, opus.pltype);
565}
566
567// Test that we can decode OPUS with stereo = 1.
568TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
569 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200570 cricket::AudioRecvParameters parameters;
571 parameters.codecs.push_back(kIsacCodec);
572 parameters.codecs.push_back(kPcmuCodec);
573 parameters.codecs.push_back(kOpusCodec);
574 parameters.codecs[2].params["stereo"] = "1";
575 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000576 EXPECT_TRUE(channel_->AddRecvStream(
577 cricket::StreamParams::CreateLegacy(kSsrc1)));
578 int channel_num2 = voe_.GetLastChannel();
579 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800580 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000581 EXPECT_EQ(2, opus.channels);
582 EXPECT_EQ(111, opus.pltype);
583 EXPECT_STREQ("opus", opus.plname);
584 opus.pltype = 0;
585 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
586 EXPECT_EQ(111, opus.pltype);
587}
588
589// Test that changes to recv codecs are applied to all streams.
590TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
591 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200592 cricket::AudioRecvParameters parameters;
593 parameters.codecs.push_back(kIsacCodec);
594 parameters.codecs.push_back(kPcmuCodec);
595 parameters.codecs.push_back(kTelephoneEventCodec);
596 parameters.codecs[0].id = 106; // collide with existing telephone-event
597 parameters.codecs[2].id = 126;
598 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000599 EXPECT_TRUE(channel_->AddRecvStream(
600 cricket::StreamParams::CreateLegacy(kSsrc1)));
601 int channel_num2 = voe_.GetLastChannel();
602 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800603 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000604 gcodec.plfreq = 16000;
605 gcodec.channels = 1;
606 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
607 EXPECT_EQ(106, gcodec.pltype);
608 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800609 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000610 gcodec.plfreq = 8000;
611 gcodec.channels = 1;
612 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
613 EXPECT_EQ(126, gcodec.pltype);
614 EXPECT_STREQ("telephone-event", gcodec.plname);
615}
616
617TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenberg1ac56142015-10-13 03:58:19 -0700618 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200619 cricket::AudioRecvParameters parameters;
620 parameters.codecs.push_back(kIsacCodec);
621 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200622 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000623
624 int channel_num2 = voe_.GetLastChannel();
625 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800626 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000627 gcodec.plfreq = 16000;
628 gcodec.channels = 1;
629 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
630 EXPECT_EQ(106, gcodec.pltype);
631 EXPECT_STREQ("ISAC", gcodec.plname);
632}
633
634// Test that we can apply the same set of codecs again while playing.
635TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700636 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200637 cricket::AudioRecvParameters parameters;
638 parameters.codecs.push_back(kIsacCodec);
639 parameters.codecs.push_back(kCn16000Codec);
640 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000641 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200642 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000643
644 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200645 parameters.codecs[0].id = 127;
646 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
647 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 EXPECT_TRUE(voe_.GetPlayout(channel_num));
649}
650
651// Test that we can add a codec while playing.
652TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700653 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200654 cricket::AudioRecvParameters parameters;
655 parameters.codecs.push_back(kIsacCodec);
656 parameters.codecs.push_back(kCn16000Codec);
657 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000658 EXPECT_TRUE(channel_->SetPlayout(true));
659
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200660 parameters.codecs.push_back(kOpusCodec);
661 EXPECT_TRUE(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 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800665 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000666 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
667}
668
669TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenberg1ac56142015-10-13 03:58:19 -0700670 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000671
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000672 // Test that when autobw is enabled, bitrate is kept as the default
673 // value. autobw is enabled for the following tests because the target
674 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000675
676 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000677 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000678
679 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000680 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000681
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000682 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000683 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000684}
685
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000686TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700687 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000688
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000689 // Test that the bitrate of a multi-rate codec is always the maximum.
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, 128000, true, 128000);
693 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000694
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000695 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000696 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
697 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000698}
699
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000700TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700701 EXPECT_TRUE(SetupEngineWithSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000702
703 // Test that we can only set a maximum bitrate for a fixed-rate codec
704 // if it's bigger than the fixed rate.
705
706 // PCMU, fixed bitrate == 64000.
707 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
708 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
709 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
710 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
711 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
712 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
713 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
714}
715
716TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -0700717 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200718 const int kDesiredBitrate = 128000;
719 cricket::AudioSendParameters parameters;
720 parameters.codecs = engine_.codecs();
721 parameters.max_bandwidth_bps = kDesiredBitrate;
722 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000723
724 EXPECT_TRUE(channel_->AddSendStream(
725 cricket::StreamParams::CreateLegacy(kSsrc1)));
726
727 int channel_num = voe_.GetLastChannel();
728 webrtc::CodecInst codec;
729 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200730 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000731}
732
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000733// Test that bitrate cannot be set for CBR codecs.
734// Bitrate is ignored if it is higher than the fixed bitrate.
735// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000736TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenberg1ac56142015-10-13 03:58:19 -0700737 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000738
739 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200740 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
741 int channel_num = voe_.GetLastChannel();
742 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000743 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
744 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200745
746 send_parameters_.max_bandwidth_bps = 128000;
747 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000748 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
749 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200750
751 send_parameters_.max_bandwidth_bps = 128;
752 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000753 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
754 EXPECT_EQ(64000, codec.rate);
755}
756
757// Test that we apply codecs properly.
758TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenberg1ac56142015-10-13 03:58:19 -0700759 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200760 cricket::AudioSendParameters parameters;
761 parameters.codecs.push_back(kIsacCodec);
762 parameters.codecs.push_back(kPcmuCodec);
763 parameters.codecs.push_back(kRedCodec);
764 parameters.codecs[0].id = 96;
765 parameters.codecs[0].bitrate = 48000;
766 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000767 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200768 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000769 webrtc::CodecInst gcodec;
770 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
771 EXPECT_EQ(96, gcodec.pltype);
772 EXPECT_EQ(48000, gcodec.rate);
773 EXPECT_STREQ("ISAC", gcodec.plname);
774 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000775 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000776 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
777 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100778 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000779}
780
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000781// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
782// to apply.
783TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenberg1ac56142015-10-13 03:58:19 -0700784 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200785 cricket::AudioSendParameters parameters;
786 parameters.codecs.push_back(kIsacCodec);
787 parameters.codecs.push_back(kPcmuCodec);
788 parameters.codecs.push_back(kRedCodec);
789 parameters.codecs[0].id = 96;
790 parameters.codecs[0].bitrate = 48000;
791 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000792 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
793 // Calling SetSendCodec again with same codec which is already set.
794 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200795 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000796 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
797}
798
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000799// Verify that G722 is set with 16000 samples per second to WebRTC.
800TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenberg1ac56142015-10-13 03:58:19 -0700801 EXPECT_TRUE(SetupEngineWithSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000802 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200803 cricket::AudioSendParameters parameters;
804 parameters.codecs.push_back(kG722CodecSdp);
805 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000806 webrtc::CodecInst gcodec;
807 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
808 EXPECT_STREQ("G722", gcodec.plname);
809 EXPECT_EQ(1, gcodec.channels);
810 EXPECT_EQ(16000, gcodec.plfreq);
811}
812
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000813// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000814TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenberg1ac56142015-10-13 03:58:19 -0700815 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200816 cricket::AudioSendParameters parameters;
817 parameters.codecs.push_back(kOpusCodec);
818 parameters.codecs[0].bitrate = 0;
819 parameters.codecs[0].clockrate = 50000;
820 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000821}
822
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000823// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000824TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700825 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200826 cricket::AudioSendParameters parameters;
827 parameters.codecs.push_back(kOpusCodec);
828 parameters.codecs[0].bitrate = 0;
829 parameters.codecs[0].channels = 0;
830 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000831}
832
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000833// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000834TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700835 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200836 cricket::AudioSendParameters parameters;
837 parameters.codecs.push_back(kOpusCodec);
838 parameters.codecs[0].bitrate = 0;
839 parameters.codecs[0].channels = 0;
840 parameters.codecs[0].params["stereo"] = "1";
841 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000842}
843
844// Test that if channel is 1 for opus and there's no stereo, we fail.
845TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700846 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200847 cricket::AudioSendParameters parameters;
848 parameters.codecs.push_back(kOpusCodec);
849 parameters.codecs[0].bitrate = 0;
850 parameters.codecs[0].channels = 1;
851 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000852}
853
854// Test that if channel is 1 for opus and stereo=0, we fail.
855TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700856 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200857 cricket::AudioSendParameters parameters;
858 parameters.codecs.push_back(kOpusCodec);
859 parameters.codecs[0].bitrate = 0;
860 parameters.codecs[0].channels = 1;
861 parameters.codecs[0].params["stereo"] = "0";
862 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000863}
864
865// Test that if channel is 1 for opus and stereo=1, we fail.
866TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700867 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200868 cricket::AudioSendParameters parameters;
869 parameters.codecs.push_back(kOpusCodec);
870 parameters.codecs[0].bitrate = 0;
871 parameters.codecs[0].channels = 1;
872 parameters.codecs[0].params["stereo"] = "1";
873 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000874}
875
876// Test that with bitrate=0 and no stereo,
877// channels and bitrate are 1 and 32000.
878TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700879 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000880 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200881 cricket::AudioSendParameters parameters;
882 parameters.codecs.push_back(kOpusCodec);
883 parameters.codecs[0].bitrate = 0;
884 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000885 webrtc::CodecInst gcodec;
886 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
887 EXPECT_STREQ("opus", gcodec.plname);
888 EXPECT_EQ(1, gcodec.channels);
889 EXPECT_EQ(32000, gcodec.rate);
890}
891
892// Test that with bitrate=0 and stereo=0,
893// channels and bitrate are 1 and 32000.
894TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700895 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000896 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200897 cricket::AudioSendParameters parameters;
898 parameters.codecs.push_back(kOpusCodec);
899 parameters.codecs[0].bitrate = 0;
900 parameters.codecs[0].params["stereo"] = "0";
901 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000902 webrtc::CodecInst gcodec;
903 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
904 EXPECT_STREQ("opus", gcodec.plname);
905 EXPECT_EQ(1, gcodec.channels);
906 EXPECT_EQ(32000, gcodec.rate);
907}
908
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000909// Test that with bitrate=invalid and stereo=0,
910// channels and bitrate are 1 and 32000.
911TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700912 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000913 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200914 cricket::AudioSendParameters parameters;
915 parameters.codecs.push_back(kOpusCodec);
916 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000917 webrtc::CodecInst gcodec;
918
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000919 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200920 parameters.codecs[0].bitrate = 5999;
921 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000922 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
923 EXPECT_STREQ("opus", gcodec.plname);
924 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000925 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000926
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200927 parameters.codecs[0].bitrate = 510001;
928 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000929 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
930 EXPECT_STREQ("opus", gcodec.plname);
931 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000932 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000933}
934
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000935// Test that with bitrate=0 and stereo=1,
936// channels and bitrate are 2 and 64000.
937TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700938 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000939 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200940 cricket::AudioSendParameters parameters;
941 parameters.codecs.push_back(kOpusCodec);
942 parameters.codecs[0].bitrate = 0;
943 parameters.codecs[0].params["stereo"] = "1";
944 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000945 webrtc::CodecInst gcodec;
946 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
947 EXPECT_STREQ("opus", gcodec.plname);
948 EXPECT_EQ(2, gcodec.channels);
949 EXPECT_EQ(64000, gcodec.rate);
950}
951
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000952// Test that with bitrate=invalid and stereo=1,
953// channels and bitrate are 2 and 64000.
954TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700955 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000956 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200957 cricket::AudioSendParameters parameters;
958 parameters.codecs.push_back(kOpusCodec);
959 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000960 webrtc::CodecInst gcodec;
961
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000962 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200963 parameters.codecs[0].bitrate = 5999;
964 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000965 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
966 EXPECT_STREQ("opus", gcodec.plname);
967 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000968 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000969
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200970 parameters.codecs[0].bitrate = 510001;
971 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000972 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
973 EXPECT_STREQ("opus", gcodec.plname);
974 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000975 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000976}
977
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000978// Test that with bitrate=N and stereo unset,
979// channels and bitrate are 1 and N.
980TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700981 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000982 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200983 cricket::AudioSendParameters parameters;
984 parameters.codecs.push_back(kOpusCodec);
985 parameters.codecs[0].bitrate = 96000;
986 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000987 webrtc::CodecInst gcodec;
988 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
989 EXPECT_EQ(111, gcodec.pltype);
990 EXPECT_EQ(96000, gcodec.rate);
991 EXPECT_STREQ("opus", gcodec.plname);
992 EXPECT_EQ(1, gcodec.channels);
993 EXPECT_EQ(48000, gcodec.plfreq);
994}
995
996// Test that with bitrate=N and stereo=0,
997// channels and bitrate are 1 and N.
998TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700999 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001000 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001001 cricket::AudioSendParameters parameters;
1002 parameters.codecs.push_back(kOpusCodec);
1003 parameters.codecs[0].bitrate = 30000;
1004 parameters.codecs[0].params["stereo"] = "0";
1005 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001006 webrtc::CodecInst gcodec;
1007 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1008 EXPECT_EQ(1, gcodec.channels);
1009 EXPECT_EQ(30000, gcodec.rate);
1010 EXPECT_STREQ("opus", gcodec.plname);
1011}
1012
1013// Test that with bitrate=N and without any parameters,
1014// channels and bitrate are 1 and N.
1015TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenberg1ac56142015-10-13 03:58:19 -07001016 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001017 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001018 cricket::AudioSendParameters parameters;
1019 parameters.codecs.push_back(kOpusCodec);
1020 parameters.codecs[0].bitrate = 30000;
1021 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001022 webrtc::CodecInst gcodec;
1023 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1024 EXPECT_EQ(1, gcodec.channels);
1025 EXPECT_EQ(30000, gcodec.rate);
1026 EXPECT_STREQ("opus", gcodec.plname);
1027}
1028
1029// Test that with bitrate=N and stereo=1,
1030// channels and bitrate are 2 and N.
1031TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001032 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001033 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001034 cricket::AudioSendParameters parameters;
1035 parameters.codecs.push_back(kOpusCodec);
1036 parameters.codecs[0].bitrate = 30000;
1037 parameters.codecs[0].params["stereo"] = "1";
1038 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001039 webrtc::CodecInst gcodec;
1040 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1041 EXPECT_EQ(2, gcodec.channels);
1042 EXPECT_EQ(30000, gcodec.rate);
1043 EXPECT_STREQ("opus", gcodec.plname);
1044}
1045
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001046// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1047// Also test that the "maxaveragebitrate" can't be set to values outside the
1048// range of 6000 and 510000
1049TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001050 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001051 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001052 cricket::AudioSendParameters parameters;
1053 parameters.codecs.push_back(kOpusCodec);
1054 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001055 webrtc::CodecInst gcodec;
1056
1057 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001058 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1059 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001060 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001061 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001062
1063 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001064 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1065 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001066 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001067 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001068
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001069 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1070 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001071 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1072 EXPECT_EQ(200000, gcodec.rate);
1073}
1074
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001075// Test that we can enable NACK with opus as caller.
1076TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001077 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001078 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001079 cricket::AudioSendParameters parameters;
1080 parameters.codecs.push_back(kOpusCodec);
1081 parameters.codecs[0].AddFeedbackParam(
1082 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1083 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001084 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001085 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001086 EXPECT_TRUE(voe_.GetNACK(channel_num));
1087}
1088
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001089// Test that we can enable NACK with opus as callee.
1090TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenberg0a617e22015-10-20 15:49:38 -07001091 EXPECT_TRUE(SetupEngineWithRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001092 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001093 cricket::AudioSendParameters parameters;
1094 parameters.codecs.push_back(kOpusCodec);
1095 parameters.codecs[0].AddFeedbackParam(
1096 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1097 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001098 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001099 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001100 EXPECT_FALSE(voe_.GetNACK(channel_num));
1101
1102 EXPECT_TRUE(channel_->AddSendStream(
1103 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001104 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001105}
1106
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001107// Test that we can enable NACK on receive streams.
1108TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001109 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001110 int channel_num1 = voe_.GetLastChannel();
1111 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1112 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001113 cricket::AudioSendParameters parameters;
1114 parameters.codecs.push_back(kOpusCodec);
1115 parameters.codecs[0].AddFeedbackParam(
1116 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1117 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001118 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1119 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001120 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001121 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1122 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1123}
1124
1125// Test that we can disable NACK.
1126TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001127 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001128 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001129 cricket::AudioSendParameters parameters;
1130 parameters.codecs.push_back(kOpusCodec);
1131 parameters.codecs[0].AddFeedbackParam(
1132 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1133 cricket::kParamValueEmpty));
1134 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001135 EXPECT_TRUE(voe_.GetNACK(channel_num));
1136
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001137 parameters.codecs.clear();
1138 parameters.codecs.push_back(kOpusCodec);
1139 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001140 EXPECT_FALSE(voe_.GetNACK(channel_num));
1141}
1142
1143// Test that we can disable NACK on receive streams.
1144TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001145 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001146 int channel_num1 = voe_.GetLastChannel();
1147 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1148 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001149 cricket::AudioSendParameters parameters;
1150 parameters.codecs.push_back(kOpusCodec);
1151 parameters.codecs[0].AddFeedbackParam(
1152 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1153 cricket::kParamValueEmpty));
1154 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001155 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1156 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1157
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001158 parameters.codecs.clear();
1159 parameters.codecs.push_back(kOpusCodec);
1160 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001161 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1162 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1163}
1164
1165// Test that NACK is enabled on a new receive stream.
1166TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001167 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001168 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001169 cricket::AudioSendParameters parameters;
1170 parameters.codecs.push_back(kIsacCodec);
1171 parameters.codecs.push_back(kCn16000Codec);
1172 parameters.codecs[0].AddFeedbackParam(
1173 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1174 cricket::kParamValueEmpty));
1175 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001176 EXPECT_TRUE(voe_.GetNACK(channel_num));
1177
1178 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1179 channel_num = voe_.GetLastChannel();
1180 EXPECT_TRUE(voe_.GetNACK(channel_num));
1181 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1182 channel_num = voe_.GetLastChannel();
1183 EXPECT_TRUE(voe_.GetNACK(channel_num));
1184}
1185
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001186// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001187TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenberg1ac56142015-10-13 03:58:19 -07001188 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001189 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001190 cricket::AudioSendParameters parameters;
1191 parameters.codecs.push_back(kOpusCodec);
1192 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001193 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1194}
1195
1196// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001197TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001198 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001199 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001200 cricket::AudioSendParameters parameters;
1201 parameters.codecs.push_back(kOpusCodec);
1202 parameters.codecs[0].bitrate = 0;
1203 parameters.codecs[0].params["useinbandfec"] = "0";
1204 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001205 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1206 webrtc::CodecInst gcodec;
1207 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1208 EXPECT_STREQ("opus", gcodec.plname);
1209 EXPECT_EQ(1, gcodec.channels);
1210 EXPECT_EQ(32000, gcodec.rate);
1211}
1212
1213// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001214TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001215 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001216 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001217 cricket::AudioSendParameters parameters;
1218 parameters.codecs.push_back(kOpusCodec);
1219 parameters.codecs[0].bitrate = 0;
1220 parameters.codecs[0].params["useinbandfec"] = "1";
1221 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001222 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1223 webrtc::CodecInst gcodec;
1224 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1225 EXPECT_STREQ("opus", gcodec.plname);
1226 EXPECT_EQ(1, gcodec.channels);
1227 EXPECT_EQ(32000, gcodec.rate);
1228}
1229
1230// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001231TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001232 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001233 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001234 cricket::AudioSendParameters parameters;
1235 parameters.codecs.push_back(kOpusCodec);
1236 parameters.codecs[0].bitrate = 0;
1237 parameters.codecs[0].params["stereo"] = "1";
1238 parameters.codecs[0].params["useinbandfec"] = "1";
1239 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001240 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1241 webrtc::CodecInst gcodec;
1242 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1243 EXPECT_STREQ("opus", gcodec.plname);
1244 EXPECT_EQ(2, gcodec.channels);
1245 EXPECT_EQ(64000, gcodec.rate);
1246}
1247
1248// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001249TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001250 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001251 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001252 cricket::AudioSendParameters parameters;
1253 parameters.codecs.push_back(kIsacCodec);
1254 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001255 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1256}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001257
1258// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1259TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001260 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001261 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001262 cricket::AudioSendParameters parameters;
1263 parameters.codecs.push_back(kIsacCodec);
1264 parameters.codecs[0].params["useinbandfec"] = "1";
1265 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001266 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1267}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001268
1269// Test that Opus FEC status can be changed.
1270TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenberg1ac56142015-10-13 03:58:19 -07001271 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001272 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001273 cricket::AudioSendParameters parameters;
1274 parameters.codecs.push_back(kOpusCodec);
1275 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001276 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001277 parameters.codecs[0].params["useinbandfec"] = "1";
1278 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001279 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1280}
1281
1282// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1283TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenberg1ac56142015-10-13 03:58:19 -07001284 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001285 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001286 cricket::AudioSendParameters parameters;
1287 parameters.codecs.push_back(kOpusCodec);
1288 parameters.codecs[0].bitrate = 0;
1289 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1290 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001291 EXPECT_EQ(cricket::kOpusBandwidthNb,
1292 voe_.GetMaxEncodingBandwidth(channel_num));
1293 webrtc::CodecInst gcodec;
1294 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1295 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001296
1297 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001298 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1299 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001300 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1301 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001302}
1303
1304// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1305TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenberg1ac56142015-10-13 03:58:19 -07001306 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001307 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001308 cricket::AudioSendParameters parameters;
1309 parameters.codecs.push_back(kOpusCodec);
1310 parameters.codecs[0].bitrate = 0;
1311 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1312 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001313 EXPECT_EQ(cricket::kOpusBandwidthMb,
1314 voe_.GetMaxEncodingBandwidth(channel_num));
1315 webrtc::CodecInst gcodec;
1316 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1317 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001318
1319 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001320 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1321 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001322 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1323 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001324}
1325
1326// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1327TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenberg1ac56142015-10-13 03:58:19 -07001328 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001329 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001330 cricket::AudioSendParameters parameters;
1331 parameters.codecs.push_back(kOpusCodec);
1332 parameters.codecs[0].bitrate = 0;
1333 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1334 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001335 EXPECT_EQ(cricket::kOpusBandwidthWb,
1336 voe_.GetMaxEncodingBandwidth(channel_num));
1337 webrtc::CodecInst gcodec;
1338 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1339 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001340
1341 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001342 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1343 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001344 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1345 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001346}
1347
1348// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1349TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenberg1ac56142015-10-13 03:58:19 -07001350 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001351 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001352 cricket::AudioSendParameters parameters;
1353 parameters.codecs.push_back(kOpusCodec);
1354 parameters.codecs[0].bitrate = 0;
1355 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1356 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001357 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1358 voe_.GetMaxEncodingBandwidth(channel_num));
1359 webrtc::CodecInst gcodec;
1360 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1361 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001362
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001363 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001364 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1365 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001366 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1367 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001368}
1369
1370// Test 24000 < maxplaybackrate triggers Opus full band mode.
1371TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenberg1ac56142015-10-13 03:58:19 -07001372 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001373 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001374 cricket::AudioSendParameters parameters;
1375 parameters.codecs.push_back(kOpusCodec);
1376 parameters.codecs[0].bitrate = 0;
1377 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1378 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001379 EXPECT_EQ(cricket::kOpusBandwidthFb,
1380 voe_.GetMaxEncodingBandwidth(channel_num));
1381 webrtc::CodecInst gcodec;
1382 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1383 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001384
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001385 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001386 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1387 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001388 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1389 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001390}
1391
1392// Test Opus that without maxplaybackrate, default playback rate is used.
1393TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001394 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001395 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001396 cricket::AudioSendParameters parameters;
1397 parameters.codecs.push_back(kOpusCodec);
1398 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001399 EXPECT_EQ(cricket::kOpusBandwidthFb,
1400 voe_.GetMaxEncodingBandwidth(channel_num));
1401}
1402
1403// Test the with non-Opus, maxplaybackrate has no effect.
1404TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001405 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001406 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001407 cricket::AudioSendParameters parameters;
1408 parameters.codecs.push_back(kIsacCodec);
1409 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1410 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001411 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1412}
1413
1414// Test maxplaybackrate can be set on two streams.
1415TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001416 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001417 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001418 cricket::AudioSendParameters parameters;
1419 parameters.codecs.push_back(kOpusCodec);
1420 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001421 // Default bandwidth is 24000.
1422 EXPECT_EQ(cricket::kOpusBandwidthFb,
1423 voe_.GetMaxEncodingBandwidth(channel_num));
1424
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001425 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001426
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001427 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001428 EXPECT_EQ(cricket::kOpusBandwidthNb,
1429 voe_.GetMaxEncodingBandwidth(channel_num));
1430
1431 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1432 channel_num = voe_.GetLastChannel();
1433 EXPECT_EQ(cricket::kOpusBandwidthNb,
1434 voe_.GetMaxEncodingBandwidth(channel_num));
1435}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001436
Minyue Li7100dcd2015-03-27 05:05:59 +01001437// Test that with usedtx=0, Opus DTX is off.
1438TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001439 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001440 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001441 cricket::AudioSendParameters parameters;
1442 parameters.codecs.push_back(kOpusCodec);
1443 parameters.codecs[0].params["usedtx"] = "0";
1444 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001445 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1446}
1447
1448// Test that with usedtx=1, Opus DTX is on.
1449TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001450 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001451 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001452 cricket::AudioSendParameters parameters;
1453 parameters.codecs.push_back(kOpusCodec);
1454 parameters.codecs[0].params["usedtx"] = "1";
1455 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001456 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1457 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1458}
1459
1460// Test that usedtx=1 works with stereo Opus.
1461TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001462 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001463 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001464 cricket::AudioSendParameters parameters;
1465 parameters.codecs.push_back(kOpusCodec);
1466 parameters.codecs[0].params["usedtx"] = "1";
1467 parameters.codecs[0].params["stereo"] = "1";
1468 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001469 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1470 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1471}
1472
1473// Test that usedtx=1 does not work with non Opus.
1474TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001475 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001476 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001477 cricket::AudioSendParameters parameters;
1478 parameters.codecs.push_back(kIsacCodec);
1479 parameters.codecs[0].params["usedtx"] = "1";
1480 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001481 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1482}
1483
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001484// Test that we can switch back and forth between Opus and ISAC with CN.
1485TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenberg1ac56142015-10-13 03:58:19 -07001486 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001487 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001488 cricket::AudioSendParameters opus_parameters;
1489 opus_parameters.codecs.push_back(kOpusCodec);
1490 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001491 webrtc::CodecInst gcodec;
1492 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001493 EXPECT_EQ(111, gcodec.pltype);
1494 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001495
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001496 cricket::AudioSendParameters isac_parameters;
1497 isac_parameters.codecs.push_back(kIsacCodec);
1498 isac_parameters.codecs.push_back(kCn16000Codec);
1499 isac_parameters.codecs.push_back(kOpusCodec);
1500 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001501 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1502 EXPECT_EQ(103, gcodec.pltype);
1503 EXPECT_STREQ("ISAC", gcodec.plname);
1504
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001505 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001506 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001507 EXPECT_EQ(111, gcodec.pltype);
1508 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001509}
1510
1511// Test that we handle various ways of specifying bitrate.
1512TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001513 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001514 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001515 cricket::AudioSendParameters parameters;
1516 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1517 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001518 webrtc::CodecInst gcodec;
1519 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1520 EXPECT_EQ(103, gcodec.pltype);
1521 EXPECT_STREQ("ISAC", gcodec.plname);
1522 EXPECT_EQ(32000, gcodec.rate);
1523
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001524 parameters.codecs[0].bitrate = 0; // bitrate == default
1525 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001526 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1527 EXPECT_EQ(103, gcodec.pltype);
1528 EXPECT_STREQ("ISAC", gcodec.plname);
1529 EXPECT_EQ(-1, gcodec.rate);
1530
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001531 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1532 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001533 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1534 EXPECT_EQ(103, gcodec.pltype);
1535 EXPECT_STREQ("ISAC", gcodec.plname);
1536 EXPECT_EQ(28000, gcodec.rate);
1537
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001538 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1539 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001540 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1541 EXPECT_EQ(0, gcodec.pltype);
1542 EXPECT_STREQ("PCMU", gcodec.plname);
1543 EXPECT_EQ(64000, gcodec.rate);
1544
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001545 parameters.codecs[0].bitrate = 0; // bitrate == default
1546 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001547 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1548 EXPECT_EQ(0, gcodec.pltype);
1549 EXPECT_STREQ("PCMU", gcodec.plname);
1550 EXPECT_EQ(64000, gcodec.rate);
1551
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001552 parameters.codecs[0] = kOpusCodec;
1553 parameters.codecs[0].bitrate = 0; // bitrate == default
1554 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001555 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1556 EXPECT_EQ(111, gcodec.pltype);
1557 EXPECT_STREQ("opus", gcodec.plname);
1558 EXPECT_EQ(32000, gcodec.rate);
1559}
1560
Brave Yao5225dd82015-03-26 07:39:19 +08001561// Test that we could set packet size specified in kCodecParamPTime.
1562TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenberg1ac56142015-10-13 03:58:19 -07001563 EXPECT_TRUE(SetupEngineWithSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001564 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001565 cricket::AudioSendParameters parameters;
1566 parameters.codecs.push_back(kOpusCodec);
1567 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1568 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001569 webrtc::CodecInst gcodec;
1570 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1571 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1572
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001573 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1574 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001575 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1576 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1577
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001578 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1579 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001580 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1581 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1582
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001583 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1584 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1585 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001586 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1587 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1588
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001589 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1590 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1591 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001592 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1593 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1594}
1595
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001596// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001597TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenberg1ac56142015-10-13 03:58:19 -07001598 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001599 cricket::AudioSendParameters parameters;
1600 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001601}
1602
1603// Test that we can set send codecs even with telephone-event codec as the first
1604// one on the list.
1605TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001606 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001607 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001608 cricket::AudioSendParameters parameters;
1609 parameters.codecs.push_back(kTelephoneEventCodec);
1610 parameters.codecs.push_back(kIsacCodec);
1611 parameters.codecs.push_back(kPcmuCodec);
1612 parameters.codecs[0].id = 98; // DTMF
1613 parameters.codecs[1].id = 96;
1614 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001615 webrtc::CodecInst gcodec;
1616 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001617 EXPECT_EQ(96, gcodec.pltype);
1618 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001619 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001620}
1621
1622// Test that we can set send codecs even with CN codec as the first
1623// one on the list.
1624TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001625 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001626 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001627 cricket::AudioSendParameters parameters;
1628 parameters.codecs.push_back(kCn16000Codec);
1629 parameters.codecs.push_back(kIsacCodec);
1630 parameters.codecs.push_back(kPcmuCodec);
1631 parameters.codecs[0].id = 98; // wideband CN
1632 parameters.codecs[1].id = 96;
1633 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001634 webrtc::CodecInst gcodec;
1635 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1636 EXPECT_EQ(96, gcodec.pltype);
1637 EXPECT_STREQ("ISAC", gcodec.plname);
1638 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001639}
1640
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001641// Test that we set VAD and DTMF types correctly as caller.
1642TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001643 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001644 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001645 cricket::AudioSendParameters parameters;
1646 parameters.codecs.push_back(kIsacCodec);
1647 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001648 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001649 parameters.codecs.push_back(kCn16000Codec);
1650 parameters.codecs.push_back(kCn8000Codec);
1651 parameters.codecs.push_back(kTelephoneEventCodec);
1652 parameters.codecs.push_back(kRedCodec);
1653 parameters.codecs[0].id = 96;
1654 parameters.codecs[2].id = 97; // wideband CN
1655 parameters.codecs[4].id = 98; // DTMF
1656 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001657 webrtc::CodecInst gcodec;
1658 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1659 EXPECT_EQ(96, gcodec.pltype);
1660 EXPECT_STREQ("ISAC", gcodec.plname);
1661 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001662 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001663 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1664 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001665 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001666}
1667
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001668// Test that we set VAD and DTMF types correctly as callee.
1669TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001670 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001671 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001672 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001673
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001674 cricket::AudioSendParameters parameters;
1675 parameters.codecs.push_back(kIsacCodec);
1676 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001677 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001678 parameters.codecs.push_back(kCn16000Codec);
1679 parameters.codecs.push_back(kCn8000Codec);
1680 parameters.codecs.push_back(kTelephoneEventCodec);
1681 parameters.codecs.push_back(kRedCodec);
1682 parameters.codecs[0].id = 96;
1683 parameters.codecs[2].id = 97; // wideband CN
1684 parameters.codecs[4].id = 98; // DTMF
1685 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001686 EXPECT_TRUE(channel_->AddSendStream(
1687 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001688 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001689
1690 webrtc::CodecInst gcodec;
1691 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1692 EXPECT_EQ(96, gcodec.pltype);
1693 EXPECT_STREQ("ISAC", gcodec.plname);
1694 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001695 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001696 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1697 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001698 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001699}
1700
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001701// Test that we only apply VAD if we have a CN codec that matches the
1702// send codec clockrate.
1703TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenberg1ac56142015-10-13 03:58:19 -07001704 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001705 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001706 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001707 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001708 parameters.codecs.push_back(kIsacCodec);
1709 parameters.codecs.push_back(kCn16000Codec);
1710 parameters.codecs[1].id = 97;
1711 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001712 webrtc::CodecInst gcodec;
1713 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1714 EXPECT_STREQ("ISAC", gcodec.plname);
1715 EXPECT_TRUE(voe_.GetVAD(channel_num));
1716 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1717 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001718 parameters.codecs[0] = kPcmuCodec;
1719 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001720 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1721 EXPECT_STREQ("PCMU", gcodec.plname);
1722 EXPECT_FALSE(voe_.GetVAD(channel_num));
1723 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001724 parameters.codecs[1] = kCn8000Codec;
1725 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001726 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1727 EXPECT_STREQ("PCMU", gcodec.plname);
1728 EXPECT_TRUE(voe_.GetVAD(channel_num));
1729 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001730 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001731 parameters.codecs[0] = kIsacCodec;
1732 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001733 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1734 EXPECT_STREQ("ISAC", gcodec.plname);
1735 EXPECT_FALSE(voe_.GetVAD(channel_num));
1736}
1737
1738// Test that we perform case-insensitive matching of codec names.
1739TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenberg1ac56142015-10-13 03:58:19 -07001740 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001741 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001742 cricket::AudioSendParameters parameters;
1743 parameters.codecs.push_back(kIsacCodec);
1744 parameters.codecs.push_back(kPcmuCodec);
1745 parameters.codecs.push_back(kCn16000Codec);
1746 parameters.codecs.push_back(kCn8000Codec);
1747 parameters.codecs.push_back(kTelephoneEventCodec);
1748 parameters.codecs.push_back(kRedCodec);
1749 parameters.codecs[0].name = "iSaC";
1750 parameters.codecs[0].id = 96;
1751 parameters.codecs[2].id = 97; // wideband CN
1752 parameters.codecs[4].id = 98; // DTMF
1753 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001754 webrtc::CodecInst gcodec;
1755 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1756 EXPECT_EQ(96, gcodec.pltype);
1757 EXPECT_STREQ("ISAC", gcodec.plname);
1758 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001759 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001760 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1761 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001762 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001763}
1764
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001765// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001766TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001767 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001768 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001769 cricket::AudioSendParameters parameters;
1770 parameters.codecs.push_back(kRedCodec);
1771 parameters.codecs.push_back(kIsacCodec);
1772 parameters.codecs.push_back(kPcmuCodec);
1773 parameters.codecs[0].id = 127;
1774 parameters.codecs[0].params[""] = "96/96";
1775 parameters.codecs[1].id = 96;
1776 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001777 webrtc::CodecInst gcodec;
1778 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1779 EXPECT_EQ(96, gcodec.pltype);
1780 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001781 EXPECT_TRUE(voe_.GetRED(channel_num));
1782 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001783}
1784
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001785// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001786TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001787 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001788 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001789 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001790
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001791 cricket::AudioSendParameters parameters;
1792 parameters.codecs.push_back(kRedCodec);
1793 parameters.codecs.push_back(kIsacCodec);
1794 parameters.codecs.push_back(kPcmuCodec);
1795 parameters.codecs[0].id = 127;
1796 parameters.codecs[0].params[""] = "96/96";
1797 parameters.codecs[1].id = 96;
1798 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001799 EXPECT_TRUE(channel_->AddSendStream(
1800 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001801 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001802 webrtc::CodecInst gcodec;
1803 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1804 EXPECT_EQ(96, gcodec.pltype);
1805 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001806 EXPECT_TRUE(voe_.GetRED(channel_num));
1807 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001808}
1809
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001810// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001811TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenberg1ac56142015-10-13 03:58:19 -07001812 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001813 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001814 cricket::AudioSendParameters parameters;
1815 parameters.codecs.push_back(kRedCodec);
1816 parameters.codecs.push_back(kIsacCodec);
1817 parameters.codecs.push_back(kPcmuCodec);
1818 parameters.codecs[0].id = 127;
1819 parameters.codecs[1].id = 96;
1820 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001821 webrtc::CodecInst gcodec;
1822 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1823 EXPECT_EQ(96, gcodec.pltype);
1824 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001825 EXPECT_TRUE(voe_.GetRED(channel_num));
1826 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001827}
1828
1829// Test that we ignore RED if the parameters aren't named the way we expect.
1830TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001831 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001832 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001833 cricket::AudioSendParameters parameters;
1834 parameters.codecs.push_back(kRedCodec);
1835 parameters.codecs.push_back(kIsacCodec);
1836 parameters.codecs.push_back(kPcmuCodec);
1837 parameters.codecs[0].id = 127;
1838 parameters.codecs[0].params["ABC"] = "96/96";
1839 parameters.codecs[1].id = 96;
1840 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001841 webrtc::CodecInst gcodec;
1842 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1843 EXPECT_EQ(96, gcodec.pltype);
1844 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001845 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001846}
1847
1848// Test that we ignore RED if it uses different primary/secondary encoding.
1849TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001850 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001851 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001852 cricket::AudioSendParameters parameters;
1853 parameters.codecs.push_back(kRedCodec);
1854 parameters.codecs.push_back(kIsacCodec);
1855 parameters.codecs.push_back(kPcmuCodec);
1856 parameters.codecs[0].id = 127;
1857 parameters.codecs[0].params[""] = "96/0";
1858 parameters.codecs[1].id = 96;
1859 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001860 webrtc::CodecInst gcodec;
1861 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1862 EXPECT_EQ(96, gcodec.pltype);
1863 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001864 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001865}
1866
1867// Test that we ignore RED if it uses more than 2 encodings.
1868TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001869 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001870 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001871 cricket::AudioSendParameters parameters;
1872 parameters.codecs.push_back(kRedCodec);
1873 parameters.codecs.push_back(kIsacCodec);
1874 parameters.codecs.push_back(kPcmuCodec);
1875 parameters.codecs[0].id = 127;
1876 parameters.codecs[0].params[""] = "96/96/96";
1877 parameters.codecs[1].id = 96;
1878 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001879 webrtc::CodecInst gcodec;
1880 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1881 EXPECT_EQ(96, gcodec.pltype);
1882 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001883 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001884}
1885
1886// Test that we ignore RED if it has bogus codec ids.
1887TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001888 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001889 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001890 cricket::AudioSendParameters parameters;
1891 parameters.codecs.push_back(kRedCodec);
1892 parameters.codecs.push_back(kIsacCodec);
1893 parameters.codecs.push_back(kPcmuCodec);
1894 parameters.codecs[0].id = 127;
1895 parameters.codecs[0].params[""] = "ABC/ABC";
1896 parameters.codecs[1].id = 96;
1897 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001898 webrtc::CodecInst gcodec;
1899 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1900 EXPECT_EQ(96, gcodec.pltype);
1901 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001902 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001903}
1904
1905// Test that we ignore RED if it refers to a codec that is not present.
1906TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001907 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001908 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001909 cricket::AudioSendParameters parameters;
1910 parameters.codecs.push_back(kRedCodec);
1911 parameters.codecs.push_back(kIsacCodec);
1912 parameters.codecs.push_back(kPcmuCodec);
1913 parameters.codecs[0].id = 127;
1914 parameters.codecs[0].params[""] = "97/97";
1915 parameters.codecs[1].id = 96;
1916 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001917 webrtc::CodecInst gcodec;
1918 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1919 EXPECT_EQ(96, gcodec.pltype);
1920 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001921 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001922}
1923
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001924// Test support for audio level header extension.
1925TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1926 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001927}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001928TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1929 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1930}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001931
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001932// Test support for absolute send time header extension.
1933TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1934 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1935}
1936TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1937 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001938}
1939
solenberg1ac56142015-10-13 03:58:19 -07001940// Test that we can create a channel and start sending on it.
1941TEST_F(WebRtcVoiceEngineTestFake, Send) {
1942 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001943 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001944 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001945 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1946 EXPECT_TRUE(voe_.GetSend(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001947 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1948 EXPECT_FALSE(voe_.GetSend(channel_num));
solenberg1ac56142015-10-13 03:58:19 -07001949}
1950
1951// Test that we can create a channel and start playing out on it.
1952TEST_F(WebRtcVoiceEngineTestFake, Playout) {
1953 EXPECT_TRUE(SetupEngineWithRecvStream());
1954 int channel_num = voe_.GetLastChannel();
1955 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
1956 EXPECT_TRUE(channel_->SetPlayout(true));
1957 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001958 EXPECT_TRUE(channel_->SetPlayout(false));
1959 EXPECT_FALSE(voe_.GetPlayout(channel_num));
1960}
1961
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001962// Test that we can add and remove send streams.
1963TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
1964 SetupForMultiSendStream();
1965
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001966 // Set the global state for sending.
1967 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1968
solenbergc96df772015-10-21 13:01:53 -07001969 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001970 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07001971 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001972 // Verify that we are in a sending state for all the created streams.
solenberg3a941542015-11-16 07:34:50 -08001973 EXPECT_TRUE(voe_.GetSend(GetSendStreamConfig(ssrc).voe_channel_id));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001974 }
tfarina5237aaf2015-11-10 23:44:30 -08001975 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001976
solenbergc96df772015-10-21 13:01:53 -07001977 // Delete the send streams.
1978 for (uint32_t ssrc : kSsrcs4) {
1979 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08001980 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07001981 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001982 }
solenbergc96df772015-10-21 13:01:53 -07001983 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001984}
1985
1986// Test SetSendCodecs correctly configure the codecs in all send streams.
1987TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
1988 SetupForMultiSendStream();
1989
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001990 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07001991 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001992 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07001993 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001994 }
1995
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001996 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001997 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001998 parameters.codecs.push_back(kIsacCodec);
1999 parameters.codecs.push_back(kCn16000Codec);
2000 parameters.codecs[1].id = 97;
2001 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002002
2003 // Verify ISAC and VAD are corrected configured on all send channels.
2004 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002005 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002006 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002007 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2008 EXPECT_STREQ("ISAC", gcodec.plname);
2009 EXPECT_TRUE(voe_.GetVAD(channel_num));
2010 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2011 }
2012
2013 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002014 parameters.codecs[0] = kPcmuCodec;
2015 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002016 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002017 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002018 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2019 EXPECT_STREQ("PCMU", gcodec.plname);
2020 EXPECT_FALSE(voe_.GetVAD(channel_num));
2021 }
2022}
2023
2024// Test we can SetSend on all send streams correctly.
2025TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2026 SetupForMultiSendStream();
2027
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002028 // Create the send channels and they should be a SEND_NOTHING date.
solenbergc96df772015-10-21 13:01:53 -07002029 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002030 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002031 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002032 int channel_num = voe_.GetLastChannel();
2033 EXPECT_FALSE(voe_.GetSend(channel_num));
2034 }
2035
2036 // Set the global state for starting sending.
2037 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
solenbergc96df772015-10-21 13:01:53 -07002038 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002039 // Verify that we are in a sending state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002040 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002041 EXPECT_TRUE(voe_.GetSend(channel_num));
2042 }
2043
2044 // Set the global state for stopping sending.
2045 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
solenbergc96df772015-10-21 13:01:53 -07002046 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002047 // Verify that we are in a stop state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002048 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002049 EXPECT_FALSE(voe_.GetSend(channel_num));
2050 }
2051}
2052
2053// Test we can set the correct statistics on all send streams.
2054TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2055 SetupForMultiSendStream();
2056
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002057 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002058 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002059 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002060 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002061 }
solenberg85a04962015-10-27 03:35:21 -07002062 SetAudioSendStreamStats();
2063
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002064 // Create a receive stream to check that none of the send streams end up in
2065 // the receive stream stats.
2066 EXPECT_TRUE(channel_->AddRecvStream(
2067 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002068 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002069 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2070 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002071
solenberg85a04962015-10-27 03:35:21 -07002072 // Check stats for the added streams.
2073 {
2074 cricket::VoiceMediaInfo info;
2075 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002076
solenberg85a04962015-10-27 03:35:21 -07002077 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002078 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002079 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002080 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002081 }
2082
2083 // We have added one receive stream. We should see empty stats.
2084 EXPECT_EQ(info.receivers.size(), 1u);
2085 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002086 }
solenberg1ac56142015-10-13 03:58:19 -07002087
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002088 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002089 {
2090 cricket::VoiceMediaInfo info;
2091 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2092 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002093 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002094 EXPECT_EQ(0u, info.receivers.size());
2095 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002096
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002097 // Deliver a new packet - a default receive stream should be created and we
2098 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002099 {
2100 cricket::VoiceMediaInfo info;
2101 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2102 SetAudioReceiveStreamStats();
2103 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002104 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002105 EXPECT_EQ(1u, info.receivers.size());
2106 VerifyVoiceReceiverInfo(info.receivers[0]);
2107 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002108}
2109
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002110// Test that we can add and remove receive streams, and do proper send/playout.
2111// We can receive on multiple streams while sending one stream.
2112TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002113 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002114 int channel_num1 = voe_.GetLastChannel();
2115
solenberg1ac56142015-10-13 03:58:19 -07002116 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002117 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002118 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002119 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002120
solenberg1ac56142015-10-13 03:58:19 -07002121 // Adding another stream should enable playout on the new stream only.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002122 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2123 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002124 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2125 EXPECT_TRUE(voe_.GetSend(channel_num1));
2126 EXPECT_FALSE(voe_.GetSend(channel_num2));
2127
solenberg1ac56142015-10-13 03:58:19 -07002128 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002129 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2130 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2131
2132 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2133 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2134 int channel_num3 = voe_.GetLastChannel();
2135 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2136 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2137 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2138 EXPECT_FALSE(voe_.GetSend(channel_num3));
2139
2140 // Stop sending.
2141 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2142 EXPECT_FALSE(voe_.GetSend(channel_num1));
2143 EXPECT_FALSE(voe_.GetSend(channel_num2));
2144 EXPECT_FALSE(voe_.GetSend(channel_num3));
2145
2146 // Stop playout.
2147 EXPECT_TRUE(channel_->SetPlayout(false));
2148 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2149 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2150 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2151
solenberg1ac56142015-10-13 03:58:19 -07002152 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002153 EXPECT_TRUE(channel_->SetPlayout(true));
2154 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2155 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2156 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2157
solenberg1ac56142015-10-13 03:58:19 -07002158 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002159 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2160 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002161 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002162}
2163
2164// Test that we can set the devices to use.
2165TEST_F(WebRtcVoiceEngineTestFake, SetDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002166 EXPECT_TRUE(SetupEngineWithSendStream());
2167 int send_channel = voe_.GetLastChannel();
2168 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2169 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002170 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002171
2172 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2173 cricket::kFakeDefaultDeviceId);
2174 cricket::Device dev(cricket::kFakeDeviceName,
2175 cricket::kFakeDeviceId);
2176
2177 // Test SetDevices() while not sending or playing.
2178 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2179
2180 // Test SetDevices() while sending and playing.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002181 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2182 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002183 EXPECT_TRUE(voe_.GetSend(send_channel));
2184 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002185
2186 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2187
solenberg1ac56142015-10-13 03:58:19 -07002188 EXPECT_TRUE(voe_.GetSend(send_channel));
2189 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002190
2191 // Test that failure to open newly selected devices does not prevent opening
2192 // ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002193 voe_.set_playout_fail_channel(recv_channel);
2194 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002195
2196 EXPECT_FALSE(engine_.SetDevices(&default_dev, &default_dev));
2197
solenberg1ac56142015-10-13 03:58:19 -07002198 EXPECT_FALSE(voe_.GetSend(send_channel));
2199 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002200
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002201 voe_.set_playout_fail_channel(-1);
2202 voe_.set_send_fail_channel(-1);
2203
2204 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2205
solenberg1ac56142015-10-13 03:58:19 -07002206 EXPECT_TRUE(voe_.GetSend(send_channel));
2207 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002208}
2209
2210// Test that we can set the devices to use even if we failed to
2211// open the initial ones.
2212TEST_F(WebRtcVoiceEngineTestFake, SetDevicesWithInitiallyBadDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002213 EXPECT_TRUE(SetupEngineWithSendStream());
2214 int send_channel = voe_.GetLastChannel();
2215 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2216 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002217 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002218
2219 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2220 cricket::kFakeDefaultDeviceId);
2221 cricket::Device dev(cricket::kFakeDeviceName,
2222 cricket::kFakeDeviceId);
2223
2224 // Test that failure to open devices selected before starting
2225 // send/play does not prevent opening newly selected ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002226 voe_.set_playout_fail_channel(recv_channel);
2227 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002228
2229 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2230
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002231 EXPECT_FALSE(channel_->SetSend(cricket::SEND_MICROPHONE));
2232 EXPECT_FALSE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002233 EXPECT_FALSE(voe_.GetSend(send_channel));
2234 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002235
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002236 voe_.set_playout_fail_channel(-1);
2237 voe_.set_send_fail_channel(-1);
2238
2239 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2240
solenberg1ac56142015-10-13 03:58:19 -07002241 EXPECT_TRUE(voe_.GetSend(send_channel));
2242 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002243}
2244
2245// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002246// and start sending on it.
2247TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2248 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002249 int channel_num = voe_.GetLastChannel();
2250 webrtc::AgcConfig agc_config;
2251 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2252 EXPECT_EQ(0, agc_config.targetLeveldBOv);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002253 send_parameters_.options = options_adjust_agc_;
2254 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002255 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2256 EXPECT_TRUE(voe_.GetSend(channel_num));
2257 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2258 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002259 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2260 EXPECT_FALSE(voe_.GetSend(channel_num));
2261 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2262 EXPECT_EQ(0, agc_config.targetLeveldBOv); // level was restored
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002263}
2264
wu@webrtc.org97077a32013-10-25 21:18:33 +00002265TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002266 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002267 webrtc::AgcConfig agc_config;
2268 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2269 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2270
2271 cricket::AudioOptions options;
Karl Wibergbe579832015-11-10 22:34:18 +01002272 options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2273 options.tx_agc_digital_compression_gain = rtc::Optional<uint16_t>(9);
2274 options.tx_agc_limiter = rtc::Optional<bool>(true);
2275 options.auto_gain_control = rtc::Optional<bool>(true);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002276 EXPECT_TRUE(engine_.SetOptions(options));
2277
2278 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2279 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2280 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2281 EXPECT_TRUE(agc_config.limiterEnable);
2282
2283 // Check interaction with adjust_agc_delta. Both should be respected, for
2284 // backwards compatibility.
Karl Wibergbe579832015-11-10 22:34:18 +01002285 options.adjust_agc_delta = rtc::Optional<int>(-10);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002286 EXPECT_TRUE(engine_.SetOptions(options));
2287
2288 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2289 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2290}
2291
wu@webrtc.org97077a32013-10-25 21:18:33 +00002292TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002293 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002294 cricket::AudioOptions options;
Karl Wibergbe579832015-11-10 22:34:18 +01002295 options.recording_sample_rate = rtc::Optional<uint32_t>(48000);
2296 options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002297 EXPECT_TRUE(engine_.SetOptions(options));
2298
2299 unsigned int recording_sample_rate, playout_sample_rate;
2300 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2301 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2302 EXPECT_EQ(48000u, recording_sample_rate);
2303 EXPECT_EQ(44100u, playout_sample_rate);
2304}
2305
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002306// Test that we can set the outgoing SSRC properly.
2307// SSRC is set in SetupEngine by calling AddSendStream.
2308TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002309 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002310 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002311}
2312
2313TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2314 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002315 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002316 SetAudioSendStreamStats();
solenberg1ac56142015-10-13 03:58:19 -07002317 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2318 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002319 EXPECT_TRUE(channel_->AddRecvStream(
2320 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002321 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2322 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002323
solenberg85a04962015-10-27 03:35:21 -07002324 // Check stats for the added streams.
2325 {
2326 cricket::VoiceMediaInfo info;
2327 EXPECT_EQ(true, channel_->GetStats(&info));
2328
2329 // We have added one send stream. We should see the stats we've set.
2330 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002331 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002332 // We have added one receive stream. We should see empty stats.
2333 EXPECT_EQ(info.receivers.size(), 1u);
2334 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2335 }
solenberg1ac56142015-10-13 03:58:19 -07002336
solenberg566ef242015-11-06 15:34:49 -08002337 // Start sending - this affects some reported stats.
2338 {
2339 cricket::VoiceMediaInfo info;
2340 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2341 EXPECT_EQ(true, channel_->GetStats(&info));
2342 VerifyVoiceSenderInfo(info.senders[0], true);
2343 }
2344
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002345 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002346 {
2347 cricket::VoiceMediaInfo info;
2348 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2349 EXPECT_EQ(true, channel_->GetStats(&info));
2350 EXPECT_EQ(1u, info.senders.size());
2351 EXPECT_EQ(0u, info.receivers.size());
2352 }
solenberg1ac56142015-10-13 03:58:19 -07002353
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002354 // Deliver a new packet - a default receive stream should be created and we
2355 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002356 {
2357 cricket::VoiceMediaInfo info;
2358 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2359 SetAudioReceiveStreamStats();
2360 EXPECT_EQ(true, channel_->GetStats(&info));
2361 EXPECT_EQ(1u, info.senders.size());
2362 EXPECT_EQ(1u, info.receivers.size());
2363 VerifyVoiceReceiverInfo(info.receivers[0]);
2364 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002365}
2366
2367// Test that we can set the outgoing SSRC properly with multiple streams.
2368// SSRC is set in SetupEngine by calling AddSendStream.
2369TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002370 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002371 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002372 EXPECT_TRUE(channel_->AddRecvStream(
2373 cricket::StreamParams::CreateLegacy(kSsrc2)));
2374 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002375}
2376
2377// Test that the local SSRC is the same on sending and receiving channels if the
2378// receive channel is created before the send channel.
2379TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002380 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002381 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002382
2383 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2384 int receive_channel_num = voe_.GetLastChannel();
2385 EXPECT_TRUE(channel_->AddSendStream(
2386 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002387
solenberg3a941542015-11-16 07:34:50 -08002388 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002389 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002390}
2391
2392// Test that we can properly receive packets.
2393TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2394 EXPECT_TRUE(SetupEngine());
solenberg7e63ef02015-11-20 00:19:43 -08002395 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002396 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002397 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002398 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002399}
2400
2401// Test that we can properly receive packets on multiple streams.
2402TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg7e63ef02015-11-20 00:19:43 -08002403 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002404 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2405 int channel_num1 = voe_.GetLastChannel();
2406 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2407 int channel_num2 = voe_.GetLastChannel();
2408 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2409 int channel_num3 = voe_.GetLastChannel();
2410 // Create packets with the right SSRCs.
2411 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002412 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002413 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002414 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002415 }
2416 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2417 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2418 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002419
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002420 DeliverPacket(packets[0], sizeof(packets[0]));
2421 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2422 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2423 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002424
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002425 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002426 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002427 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2428 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002429
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002430 DeliverPacket(packets[2], sizeof(packets[2]));
2431 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002432 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002433 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002434
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002435 DeliverPacket(packets[3], sizeof(packets[3]));
2436 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2437 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002438 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2439
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002440 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2441 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2442 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2443}
2444
solenberg7e63ef02015-11-20 00:19:43 -08002445// Test that receiving on an unsignalled stream works (default channel will be
2446// created).
2447TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
2448 EXPECT_TRUE(SetupEngine());
2449 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2450 int channel_num = voe_.GetLastChannel();
2451 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2452}
2453
2454// Test that receiving on an unsignalled stream works (default channel will be
2455// created), and that packets will be forwarded to the default channel
2456// regardless of their SSRCs.
2457TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
2458 EXPECT_TRUE(SetupEngine());
2459 char packet[sizeof(kPcmuFrame)];
2460 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2461
2462 // Note that the first unknown SSRC cannot be 0, because we only support
2463 // creating receive streams for SSRC!=0.
2464 DeliverPacket(packet, sizeof(packet));
2465 int channel_num = voe_.GetLastChannel();
2466 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2467 // Once we have the default channel, SSRC==0 will be ok.
2468 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2469 rtc::SetBE32(&packet[8], ssrc);
2470 DeliverPacket(packet, sizeof(packet));
2471 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2472 }
2473}
2474
2475// Test that a default channel is created even after a signalled stream has been
2476// added, and that this stream will get any packets for unknown SSRCs.
2477TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
2478 EXPECT_TRUE(SetupEngine());
2479 char packet[sizeof(kPcmuFrame)];
2480 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2481
2482 // Add a known stream, send packet and verify we got it.
2483 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2484 int signalled_channel_num = voe_.GetLastChannel();
2485 DeliverPacket(packet, sizeof(packet));
2486 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2487
2488 // Note that the first unknown SSRC cannot be 0, because we only support
2489 // creating receive streams for SSRC!=0.
2490 rtc::SetBE32(&packet[8], 7011);
2491 DeliverPacket(packet, sizeof(packet));
2492 int channel_num = voe_.GetLastChannel();
2493 EXPECT_NE(channel_num, signalled_channel_num);
2494 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2495 // Once we have the default channel, SSRC==0 will be ok.
2496 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2497 rtc::SetBE32(&packet[8], ssrc);
2498 DeliverPacket(packet, sizeof(packet));
2499 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2500 }
2501}
2502
solenberg0a617e22015-10-20 15:49:38 -07002503// Test that we properly handle failures to add a receive stream.
2504TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
2505 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002506 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002507 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002508}
2509
solenberg0a617e22015-10-20 15:49:38 -07002510// Test that we properly handle failures to add a send stream.
2511TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
2512 EXPECT_TRUE(SetupEngine());
2513 voe_.set_fail_create_channel(true);
2514 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2515}
2516
solenberg1ac56142015-10-13 03:58:19 -07002517// Test that AddRecvStream creates new stream.
2518TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2519 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002520 int channel_num = voe_.GetLastChannel();
2521 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002522 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002523}
2524
2525// Test that after adding a recv stream, we do not decode more codecs than
2526// those previously passed into SetRecvCodecs.
2527TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002528 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002529 cricket::AudioRecvParameters parameters;
2530 parameters.codecs.push_back(kIsacCodec);
2531 parameters.codecs.push_back(kPcmuCodec);
2532 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002533 EXPECT_TRUE(channel_->AddRecvStream(
2534 cricket::StreamParams::CreateLegacy(kSsrc1)));
2535 int channel_num2 = voe_.GetLastChannel();
2536 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002537 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002538 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002539 gcodec.channels = 2;
2540 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2541}
2542
2543// Test that we properly clean up any streams that were added, even if
2544// not explicitly removed.
2545TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002546 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002547 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002548 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2549 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2550 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2551 delete channel_;
2552 channel_ = NULL;
2553 EXPECT_EQ(0, voe_.GetNumChannels());
2554}
2555
wu@webrtc.org78187522013-10-07 23:32:02 +00002556TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002557 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002558 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2559}
2560
2561TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2562 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002563 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002564 // Manually delete channel to simulate a failure.
2565 int channel = voe_.GetLastChannel();
2566 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2567 // Add recv stream 2 should work.
2568 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002569 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002570 EXPECT_NE(channel, new_channel);
2571 // The last created channel is deleted too.
2572 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002573}
2574
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002575// Test the InsertDtmf on default send stream as caller.
2576TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2577 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002578}
2579
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002580// Test the InsertDtmf on default send stream as callee
2581TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2582 TestInsertDtmf(0, false);
2583}
2584
2585// Test the InsertDtmf on specified send stream as caller.
2586TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2587 TestInsertDtmf(kSsrc1, true);
2588}
2589
2590// Test the InsertDtmf on specified send stream as callee.
2591TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2592 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002593}
2594
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002595TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002596 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002597 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002598 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2599 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2600 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2601 EXPECT_TRUE(channel_->SetPlayout(true));
2602 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2603 EXPECT_TRUE(channel_->SetPlayout(false));
2604 EXPECT_FALSE(channel_->SetPlayout(true));
2605}
2606
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002607TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002608 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002609
2610 bool ec_enabled;
2611 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002612 webrtc::AecmModes aecm_mode;
2613 bool cng_enabled;
2614 bool agc_enabled;
2615 webrtc::AgcModes agc_mode;
2616 webrtc::AgcConfig agc_config;
2617 bool ns_enabled;
2618 webrtc::NsModes ns_mode;
2619 bool highpass_filter_enabled;
2620 bool stereo_swapping_enabled;
2621 bool typing_detection_enabled;
2622 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002623 voe_.GetAecmMode(aecm_mode, cng_enabled);
2624 voe_.GetAgcStatus(agc_enabled, agc_mode);
2625 voe_.GetAgcConfig(agc_config);
2626 voe_.GetNsStatus(ns_enabled, ns_mode);
2627 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2628 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2629 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2630 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002631 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002632 EXPECT_FALSE(cng_enabled);
2633 EXPECT_TRUE(agc_enabled);
2634 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2635 EXPECT_TRUE(ns_enabled);
2636 EXPECT_TRUE(highpass_filter_enabled);
2637 EXPECT_FALSE(stereo_swapping_enabled);
2638 EXPECT_TRUE(typing_detection_enabled);
2639 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2640 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2641
2642 // Nothing set, so all ignored.
2643 cricket::AudioOptions options;
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002644 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002645 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002646 voe_.GetAecmMode(aecm_mode, cng_enabled);
2647 voe_.GetAgcStatus(agc_enabled, agc_mode);
2648 voe_.GetAgcConfig(agc_config);
2649 voe_.GetNsStatus(ns_enabled, ns_mode);
2650 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2651 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2652 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2653 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002654 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002655 EXPECT_FALSE(cng_enabled);
2656 EXPECT_TRUE(agc_enabled);
2657 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2658 EXPECT_TRUE(ns_enabled);
2659 EXPECT_TRUE(highpass_filter_enabled);
2660 EXPECT_FALSE(stereo_swapping_enabled);
2661 EXPECT_TRUE(typing_detection_enabled);
2662 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2663 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
Henrik Lundin64dad832015-05-11 12:44:23 +02002664 EXPECT_EQ(50, voe_.GetNetEqCapacity()); // From GetDefaultEngineOptions().
Henrik Lundin5263b3c2015-06-01 10:29:41 +02002665 EXPECT_FALSE(
2666 voe_.GetNetEqFastAccelerate()); // From GetDefaultEngineOptions().
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002667
2668 // Turn echo cancellation off
Karl Wibergbe579832015-11-10 22:34:18 +01002669 options.echo_cancellation = rtc::Optional<bool>(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002670 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002671 voe_.GetEcStatus(ec_enabled, ec_mode);
2672 EXPECT_FALSE(ec_enabled);
2673
2674 // Turn echo cancellation back on, with settings, and make sure
2675 // nothing else changed.
Karl Wibergbe579832015-11-10 22:34:18 +01002676 options.echo_cancellation = rtc::Optional<bool>(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002677 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002678 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002679 voe_.GetAecmMode(aecm_mode, cng_enabled);
2680 voe_.GetAgcStatus(agc_enabled, agc_mode);
2681 voe_.GetAgcConfig(agc_config);
2682 voe_.GetNsStatus(ns_enabled, ns_mode);
2683 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2684 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2685 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2686 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002687 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002688 EXPECT_TRUE(agc_enabled);
2689 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2690 EXPECT_TRUE(ns_enabled);
2691 EXPECT_TRUE(highpass_filter_enabled);
2692 EXPECT_FALSE(stereo_swapping_enabled);
2693 EXPECT_TRUE(typing_detection_enabled);
2694 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2695 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2696
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002697 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2698 // control.
Karl Wibergbe579832015-11-10 22:34:18 +01002699 options.delay_agnostic_aec = rtc::Optional<bool>(true);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002700 ASSERT_TRUE(engine_.SetOptions(options));
2701 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002702 voe_.GetAecmMode(aecm_mode, cng_enabled);
2703 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002704 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002705 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2706
2707 // Turn off echo cancellation and delay agnostic aec.
Karl Wibergbe579832015-11-10 22:34:18 +01002708 options.delay_agnostic_aec = rtc::Optional<bool>(false);
2709 options.extended_filter_aec = rtc::Optional<bool>(false);
2710 options.echo_cancellation = rtc::Optional<bool>(false);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002711 ASSERT_TRUE(engine_.SetOptions(options));
2712 voe_.GetEcStatus(ec_enabled, ec_mode);
2713 EXPECT_FALSE(ec_enabled);
2714 // Turning delay agnostic aec back on should also turn on echo cancellation.
Karl Wibergbe579832015-11-10 22:34:18 +01002715 options.delay_agnostic_aec = rtc::Optional<bool>(true);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002716 ASSERT_TRUE(engine_.SetOptions(options));
2717 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002718 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002719 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002720 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2721
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002722 // Turn off AGC
Karl Wibergbe579832015-11-10 22:34:18 +01002723 options.auto_gain_control = rtc::Optional<bool>(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002724 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002725 voe_.GetAgcStatus(agc_enabled, agc_mode);
2726 EXPECT_FALSE(agc_enabled);
2727
2728 // Turn AGC back on
Karl Wibergbe579832015-11-10 22:34:18 +01002729 options.auto_gain_control = rtc::Optional<bool>(true);
2730 options.adjust_agc_delta = rtc::Optional<int>();
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002731 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002732 voe_.GetAgcStatus(agc_enabled, agc_mode);
2733 EXPECT_TRUE(agc_enabled);
2734 voe_.GetAgcConfig(agc_config);
2735 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2736
2737 // Turn off other options (and stereo swapping on).
Karl Wibergbe579832015-11-10 22:34:18 +01002738 options.noise_suppression = rtc::Optional<bool>(false);
2739 options.highpass_filter = rtc::Optional<bool>(false);
2740 options.typing_detection = rtc::Optional<bool>(false);
2741 options.stereo_swapping = rtc::Optional<bool>(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002742 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002743 voe_.GetNsStatus(ns_enabled, ns_mode);
2744 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2745 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2746 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2747 EXPECT_FALSE(ns_enabled);
2748 EXPECT_FALSE(highpass_filter_enabled);
2749 EXPECT_FALSE(typing_detection_enabled);
2750 EXPECT_TRUE(stereo_swapping_enabled);
2751
solenberg1ac56142015-10-13 03:58:19 -07002752 // Set options again to ensure it has no impact.
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002753 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002754 voe_.GetEcStatus(ec_enabled, ec_mode);
2755 voe_.GetNsStatus(ns_enabled, ns_mode);
2756 EXPECT_TRUE(ec_enabled);
2757 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2758 EXPECT_FALSE(ns_enabled);
2759 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2760}
2761
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002762TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002763 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002764
2765 bool ec_enabled;
2766 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002767 bool agc_enabled;
2768 webrtc::AgcModes agc_mode;
2769 bool ns_enabled;
2770 webrtc::NsModes ns_mode;
2771 bool highpass_filter_enabled;
2772 bool stereo_swapping_enabled;
2773 bool typing_detection_enabled;
2774
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002775 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002776 voe_.GetAgcStatus(agc_enabled, agc_mode);
2777 voe_.GetNsStatus(ns_enabled, ns_mode);
2778 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2779 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2780 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2781 EXPECT_TRUE(ec_enabled);
2782 EXPECT_TRUE(agc_enabled);
2783 EXPECT_TRUE(ns_enabled);
2784 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002785 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002786 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002787}
2788
2789TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2790 webrtc::AgcConfig set_config = {0};
2791 set_config.targetLeveldBOv = 3;
2792 set_config.digitalCompressionGaindB = 9;
2793 set_config.limiterEnable = true;
2794 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002795 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002796
2797 webrtc::AgcConfig config = {0};
2798 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2799 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2800 EXPECT_EQ(set_config.digitalCompressionGaindB,
2801 config.digitalCompressionGaindB);
2802 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2803}
2804
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002805TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002806 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg66f43392015-09-09 01:36:22 -07002807 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2808 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002809 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002810 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2811 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002812 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002813
2814 // Have to add a stream to make SetSend work.
2815 cricket::StreamParams stream1;
2816 stream1.ssrcs.push_back(1);
2817 channel1->AddSendStream(stream1);
2818 cricket::StreamParams stream2;
2819 stream2.ssrcs.push_back(2);
2820 channel2->AddSendStream(stream2);
2821
2822 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002823 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002824 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2825 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2826 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002827 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2828 EXPECT_EQ(parameters_options_all.options, channel1->options());
2829 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2830 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002831
2832 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002833 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002834 parameters_options_no_ns.options.noise_suppression =
2835 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002836 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2837 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002838 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2839 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2840 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002841 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002842
2843 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002844 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002845 parameters_options_no_agc.options.auto_gain_control =
2846 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002847 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002848 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2849 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2850 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002851 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002852
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002853 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002854 bool ec_enabled;
2855 webrtc::EcModes ec_mode;
2856 bool agc_enabled;
2857 webrtc::AgcModes agc_mode;
2858 bool ns_enabled;
2859 webrtc::NsModes ns_mode;
2860 voe_.GetEcStatus(ec_enabled, ec_mode);
2861 voe_.GetAgcStatus(agc_enabled, agc_mode);
2862 voe_.GetNsStatus(ns_enabled, ns_mode);
2863 EXPECT_TRUE(ec_enabled);
2864 EXPECT_TRUE(agc_enabled);
2865 EXPECT_TRUE(ns_enabled);
2866
2867 channel1->SetSend(cricket::SEND_MICROPHONE);
2868 voe_.GetEcStatus(ec_enabled, ec_mode);
2869 voe_.GetAgcStatus(agc_enabled, agc_mode);
2870 voe_.GetNsStatus(ns_enabled, ns_mode);
2871 EXPECT_TRUE(ec_enabled);
2872 EXPECT_TRUE(agc_enabled);
2873 EXPECT_FALSE(ns_enabled);
2874
2875 channel1->SetSend(cricket::SEND_NOTHING);
2876 voe_.GetEcStatus(ec_enabled, ec_mode);
2877 voe_.GetAgcStatus(agc_enabled, agc_mode);
2878 voe_.GetNsStatus(ns_enabled, ns_mode);
2879 EXPECT_TRUE(ec_enabled);
2880 EXPECT_TRUE(agc_enabled);
2881 EXPECT_TRUE(ns_enabled);
2882
2883 channel2->SetSend(cricket::SEND_MICROPHONE);
2884 voe_.GetEcStatus(ec_enabled, ec_mode);
2885 voe_.GetAgcStatus(agc_enabled, agc_mode);
2886 voe_.GetNsStatus(ns_enabled, ns_mode);
2887 EXPECT_TRUE(ec_enabled);
2888 EXPECT_FALSE(agc_enabled);
2889 EXPECT_TRUE(ns_enabled);
2890
2891 channel2->SetSend(cricket::SEND_NOTHING);
2892 voe_.GetEcStatus(ec_enabled, ec_mode);
2893 voe_.GetAgcStatus(agc_enabled, agc_mode);
2894 voe_.GetNsStatus(ns_enabled, ns_mode);
2895 EXPECT_TRUE(ec_enabled);
2896 EXPECT_TRUE(agc_enabled);
2897 EXPECT_TRUE(ns_enabled);
2898
2899 // Make sure settings take effect while we are sending.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002900 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
2901 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2902 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002903 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01002904 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07002905 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01002906 rtc::Optional<bool>(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002907 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002908 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01002909 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2910 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2911 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002912 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002913 voe_.GetEcStatus(ec_enabled, ec_mode);
2914 voe_.GetAgcStatus(agc_enabled, agc_mode);
2915 voe_.GetNsStatus(ns_enabled, ns_mode);
2916 EXPECT_TRUE(ec_enabled);
2917 EXPECT_FALSE(agc_enabled);
2918 EXPECT_FALSE(ns_enabled);
2919}
2920
wu@webrtc.orgde305012013-10-31 15:40:38 +00002921// This test verifies DSCP settings are properly applied on voice media channel.
2922TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002923 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002924 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002925 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002926 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00002927 new cricket::FakeNetworkInterface);
2928 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002929 cricket::AudioSendParameters parameters = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002930 parameters.options.dscp = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002931 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002932 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00002933 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002934 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002935 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
Karl Wibergbe579832015-11-10 22:34:18 +01002936 parameters.options.dscp = rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002937 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002938 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00002939}
2940
solenberg1ac56142015-10-13 03:58:19 -07002941TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002942 EXPECT_TRUE(SetupEngine());
2943 cricket::WebRtcVoiceMediaChannel* media_channel =
2944 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002945 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2946 EXPECT_TRUE(channel_->AddRecvStream(
2947 cricket::StreamParams::CreateLegacy(kSsrc1)));
2948 int channel_id = voe_.GetLastChannel();
2949 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2950 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2951 EXPECT_TRUE(channel_->AddRecvStream(
2952 cricket::StreamParams::CreateLegacy(kSsrc2)));
2953 int channel_id2 = voe_.GetLastChannel();
2954 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002955}
2956
solenberg1ac56142015-10-13 03:58:19 -07002957TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002958 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002959 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002960 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2961 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2962 EXPECT_TRUE(channel_->AddSendStream(
2963 cricket::StreamParams::CreateLegacy(kSsrc1)));
2964 int channel_id = voe_.GetLastChannel();
2965 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2966 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2967 EXPECT_TRUE(channel_->AddSendStream(
2968 cricket::StreamParams::CreateLegacy(kSsrc2)));
2969 int channel_id2 = voe_.GetLastChannel();
2970 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002971}
2972
solenberg4bac9c52015-10-09 02:32:53 -07002973TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002974 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002975 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002976 cricket::StreamParams stream;
2977 stream.ssrcs.push_back(kSsrc2);
2978 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002979 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002980 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002981 float scale = 0;
2982 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2983 EXPECT_DOUBLE_EQ(3, scale);
2984}
2985
2986TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
2987 EXPECT_TRUE(SetupEngine());
2988 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2989 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2990 int channel_id = voe_.GetLastChannel();
2991 float scale = 0;
2992 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2993 EXPECT_DOUBLE_EQ(2, scale);
2994 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07002995 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002996 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002997}
2998
pbos8fc7fa72015-07-15 08:02:58 -07002999TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003000 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003001 const std::string kSyncLabel = "AvSyncLabel";
3002
solenberg1ac56142015-10-13 03:58:19 -07003003 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003004 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3005 sp.sync_label = kSyncLabel;
3006 // Creating two channels to make sure that sync label is set properly for both
3007 // the default voice channel and following ones.
3008 EXPECT_TRUE(channel_->AddRecvStream(sp));
3009 sp.ssrcs[0] += 1;
3010 EXPECT_TRUE(channel_->AddRecvStream(sp));
3011
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003012 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003013 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003014 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003015 << "SyncGroup should be set based on sync_label";
3016 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003017 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003018 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003019}
3020
pbos6bb1b6e2015-07-24 07:10:18 -07003021TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003022 // Test that changing the combined_audio_video_bwe option results in the
3023 // expected state changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003024 std::vector<uint32_t> ssrcs;
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003025 ssrcs.push_back(223);
3026 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003027
solenberg1ac56142015-10-13 03:58:19 -07003028 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003029 cricket::WebRtcVoiceMediaChannel* media_channel =
3030 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02003031 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003032 EXPECT_TRUE(media_channel->AddRecvStream(
3033 cricket::StreamParams::CreateLegacy(ssrc)));
3034 }
3035 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003036
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003037 // Combined BWE should be disabled.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003038 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003039 const auto* s = call_.GetAudioReceiveStream(ssrc);
3040 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07003041 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003042 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003043
3044 // Enable combined BWE option - now it should be set up.
Karl Wibergbe579832015-11-10 22:34:18 +01003045 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003046 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003047 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003048 const auto* s = call_.GetAudioReceiveStream(ssrc);
3049 EXPECT_NE(nullptr, s);
3050 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
3051 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003052
3053 // Disable combined BWE option - should be disabled again.
Karl Wibergbe579832015-11-10 22:34:18 +01003054 send_parameters_.options.combined_audio_video_bwe =
3055 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003056 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003057 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003058 const auto* s = call_.GetAudioReceiveStream(ssrc);
3059 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07003060 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003061 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003062
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003063 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003064}
3065
pbos6bb1b6e2015-07-24 07:10:18 -07003066TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003067 // Test that adding receive streams after enabling combined bandwidth
3068 // estimation will correctly configure each channel.
solenberg1ac56142015-10-13 03:58:19 -07003069 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003070 cricket::WebRtcVoiceMediaChannel* media_channel =
3071 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003072 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003073 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003074
Peter Boström0c4e06b2015-10-07 12:23:21 +02003075 static const uint32_t kSsrcs[] = {1, 2, 3, 4};
tfarina5237aaf2015-11-10 23:44:30 -08003076 for (unsigned int i = 0; i < arraysize(kSsrcs); ++i) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003077 EXPECT_TRUE(media_channel->AddRecvStream(
3078 cricket::StreamParams::CreateLegacy(kSsrcs[i])));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003079 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(kSsrcs[i]));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003080 }
tfarina5237aaf2015-11-10 23:44:30 -08003081 EXPECT_EQ(arraysize(kSsrcs), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003082}
3083
solenberg3a941542015-11-16 07:34:50 -08003084// TODO(solenberg): Remove, once recv streams are configured through Call.
3085// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003086TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003087 // Test that setting the header extensions results in the expected state
3088 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003089 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003090 ssrcs.push_back(223);
3091 ssrcs.push_back(224);
3092
solenberg1ac56142015-10-13 03:58:19 -07003093 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003094 cricket::WebRtcVoiceMediaChannel* media_channel =
3095 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003096 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003097 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003098 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003099 EXPECT_TRUE(media_channel->AddRecvStream(
3100 cricket::StreamParams::CreateLegacy(ssrc)));
3101 }
3102
3103 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003104 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003105 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003106 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003107 EXPECT_NE(nullptr, s);
3108 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3109 }
3110
3111 // Set up receive extensions.
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003112 cricket::RtpCapabilities capabilities = engine_.GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003113 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003114 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003115 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003116 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003117 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003118 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003119 EXPECT_NE(nullptr, s);
3120 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003121 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3122 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003123 for (const auto& s_ext : s_exts) {
3124 if (e_ext.id == s_ext.id) {
3125 EXPECT_EQ(e_ext.uri, s_ext.name);
3126 }
3127 }
3128 }
3129 }
3130
3131 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003132 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003133 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003134 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003135 EXPECT_NE(nullptr, s);
3136 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3137 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003138}
3139
3140TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3141 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003142 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003143 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3144 static const unsigned char kRtcp[] = {
3145 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3146 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3147 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3148 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3149 };
3150 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3151
solenberg1ac56142015-10-13 03:58:19 -07003152 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003153 cricket::WebRtcVoiceMediaChannel* media_channel =
3154 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003155 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003156 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003157 EXPECT_TRUE(media_channel->AddRecvStream(
3158 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3159
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003160 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003161 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003162 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003163 EXPECT_EQ(0, s->received_packets());
3164 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3165 EXPECT_EQ(1, s->received_packets());
3166 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3167 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003168}
Minyue2013aec2015-05-13 14:14:42 +02003169
solenberg0a617e22015-10-20 15:49:38 -07003170// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003171// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003172TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenberg1ac56142015-10-13 03:58:19 -07003173 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003174 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003175 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003176 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3177 int recv_ch = voe_.GetLastChannel();
3178 EXPECT_NE(recv_ch, default_channel);
3179 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3180 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3181 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003182 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3183 recv_ch = voe_.GetLastChannel();
3184 EXPECT_NE(recv_ch, default_channel);
3185 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003186}
3187
3188TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003189 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003190 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003191
3192 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3193 int recv_ch = voe_.GetLastChannel();
3194
3195 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3196 int send_ch = voe_.GetLastChannel();
3197
3198 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3199 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3200 // channel of |recv_ch|.This is not a common case, since, normally, only the
3201 // default channel can be associated. However, the default is not deletable.
3202 // So we force the |recv_ch| to associate with a non-default channel.
3203 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3204 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3205
3206 EXPECT_TRUE(channel_->RemoveSendStream(2));
3207 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3208}
stefan658910c2015-09-03 05:48:32 -07003209
3210// Tests for the actual WebRtc VoE library.
3211
3212TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
3213 cricket::WebRtcVoiceEngine engine;
3214 cricket::AudioOptions options = engine.GetOptions();
3215 // The default options should have at least a few things set. We purposefully
3216 // don't check the option values here, though.
kwiberg102c6a62015-10-30 02:47:38 -07003217 EXPECT_TRUE(options.echo_cancellation);
3218 EXPECT_TRUE(options.auto_gain_control);
3219 EXPECT_TRUE(options.noise_suppression);
stefan658910c2015-09-03 05:48:32 -07003220}
3221
3222// Tests that the library initializes and shuts down properly.
3223TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3224 cricket::WebRtcVoiceEngine engine;
3225 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003226 rtc::scoped_ptr<webrtc::Call> call(
3227 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003228 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003229 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003230 EXPECT_TRUE(channel != nullptr);
3231 delete channel;
3232 engine.Terminate();
3233
3234 // Reinit to catch regression where VoiceEngineObserver reference is lost
3235 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3236 engine.Terminate();
3237}
3238
3239// Tests that the library is configured with the codecs we want.
3240TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003241 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003242 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3243 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0), nullptr));
3244 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3245 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0), nullptr));
3246 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3247 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003248 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003249 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3250 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0), nullptr));
3251 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3252 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0), nullptr));
3253 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3254 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0), nullptr));
3255 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3256 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0), nullptr));
3257 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3258 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0), nullptr));
3259 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3260 cricket::AudioCodec(96, "red", 8000, 0, 1, 0), nullptr));
3261 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3262 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0), nullptr));
3263 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3264 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0), nullptr));
3265 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3266 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0), nullptr));
3267 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3268 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003269 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003270 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3271 cricket::AudioCodec(0, "", 8000, 0, 1, 0), nullptr)); // PCMU
3272 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3273 cricket::AudioCodec(8, "", 8000, 0, 1, 0), nullptr)); // PCMA
3274 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3275 cricket::AudioCodec(9, "", 8000, 0, 1, 0), nullptr)); // G722
3276 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3277 cricket::AudioCodec(13, "", 8000, 0, 1, 0), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003278 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003279 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3280 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003281 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003282 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3283 cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0), nullptr));
3284 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3285 cricket::AudioCodec(88, "", 0, 0, 1, 0), nullptr));
3286 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3287 cricket::AudioCodec(0, "", 0, 0, 2, 0), nullptr));
3288 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3289 cricket::AudioCodec(0, "", 5000, 0, 1, 0), nullptr));
3290 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3291 cricket::AudioCodec(0, "", 0, 5000, 1, 0), nullptr));
3292
stefan658910c2015-09-03 05:48:32 -07003293 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenberg26c8c912015-11-27 04:00:25 -08003294 cricket::WebRtcVoiceEngine engine;
stefan658910c2015-09-03 05:48:32 -07003295 for (std::vector<cricket::AudioCodec>::const_iterator it =
3296 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3297 if (it->name == "CN" && it->clockrate == 16000) {
3298 EXPECT_EQ(105, it->id);
3299 } else if (it->name == "CN" && it->clockrate == 32000) {
3300 EXPECT_EQ(106, it->id);
3301 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3302 EXPECT_EQ(103, it->id);
3303 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3304 EXPECT_EQ(104, it->id);
3305 } else if (it->name == "G722" && it->clockrate == 8000) {
3306 EXPECT_EQ(9, it->id);
3307 } else if (it->name == "telephone-event") {
3308 EXPECT_EQ(126, it->id);
3309 } else if (it->name == "red") {
3310 EXPECT_EQ(127, it->id);
3311 } else if (it->name == "opus") {
3312 EXPECT_EQ(111, it->id);
3313 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3314 EXPECT_EQ("10", it->params.find("minptime")->second);
3315 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3316 EXPECT_EQ("60", it->params.find("maxptime")->second);
3317 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3318 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3319 }
3320 }
stefan658910c2015-09-03 05:48:32 -07003321 engine.Terminate();
3322}
3323
3324// Tests that VoE supports at least 32 channels
3325TEST(WebRtcVoiceEngineTest, Has32Channels) {
3326 cricket::WebRtcVoiceEngine engine;
3327 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003328 rtc::scoped_ptr<webrtc::Call> call(
3329 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003330
3331 cricket::VoiceMediaChannel* channels[32];
3332 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003333 while (num_channels < arraysize(channels)) {
stefan658910c2015-09-03 05:48:32 -07003334 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003335 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003336 if (!channel)
3337 break;
stefan658910c2015-09-03 05:48:32 -07003338 channels[num_channels++] = channel;
3339 }
3340
tfarina5237aaf2015-11-10 23:44:30 -08003341 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003342 EXPECT_EQ(expected, num_channels);
3343
3344 while (num_channels > 0) {
3345 delete channels[--num_channels];
3346 }
stefan658910c2015-09-03 05:48:32 -07003347 engine.Terminate();
3348}
3349
3350// Test that we set our preferred codecs properly.
3351TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3352 cricket::WebRtcVoiceEngine engine;
3353 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003354 rtc::scoped_ptr<webrtc::Call> call(
3355 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003356 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3357 call.get());
3358 cricket::AudioRecvParameters parameters;
3359 parameters.codecs = engine.codecs();
3360 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003361}