blob: a62bcb225fc7c6111fed44c0a43507f1ecf7b353 [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);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083 }
solenberg1ac56142015-10-13 03:58:19 -070084 bool SetupEngine() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000085 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000086 return false;
87 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +020088 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +020089 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000090 }
solenberg1ac56142015-10-13 03:58:19 -070091 bool SetupEngineWithRecvStream() {
92 if (!SetupEngine()) {
93 return false;
94 }
95 return channel_->AddRecvStream(
96 cricket::StreamParams::CreateLegacy(kSsrc1));
97 }
98 bool SetupEngineWithSendStream() {
99 if (!SetupEngine()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000100 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000101 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000102 return channel_->AddSendStream(
103 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000104 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000105 void SetupForMultiSendStream() {
solenberg1ac56142015-10-13 03:58:19 -0700106 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700107 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800108 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700109 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700110 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800111 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000112 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000113 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200114 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000115 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000116 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200117 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000118 delete channel_;
119 engine_.Terminate();
120 }
121
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100122 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
123 const auto* send_stream = call_.GetAudioSendStream(ssrc);
124 EXPECT_TRUE(send_stream);
125 return *send_stream;
126 }
127
solenberg3a941542015-11-16 07:34:50 -0800128 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
129 const auto* send_stream = call_.GetAudioSendStream(ssrc);
130 EXPECT_TRUE(send_stream);
131 return send_stream->GetConfig();
132 }
133
solenberg7add0582015-11-20 09:59:34 -0800134 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
135 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
136 EXPECT_TRUE(recv_stream);
137 return recv_stream->GetConfig();
138 }
139
Peter Boström0c4e06b2015-10-07 12:23:21 +0200140 void TestInsertDtmf(uint32_t ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000141 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200142 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200143 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000144 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700145 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000146 // send stream.
147 EXPECT_TRUE(channel_->AddSendStream(
148 cricket::StreamParams::CreateLegacy(kSsrc1)));
149 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000150
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000151 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200152 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000153 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
154 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800155 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200156 send_parameters_.codecs.push_back(kTelephoneEventCodec);
157 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000158 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000159
160 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700161 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800162 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000163 EXPECT_TRUE(channel_->AddSendStream(
164 cricket::StreamParams::CreateLegacy(kSsrc1)));
165 }
166
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000167 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800168 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000169
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100170 // Test send.
171 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
172 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
173 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800174 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100175 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
176 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
177 EXPECT_EQ(2, telephone_event.event_code);
178 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000179 }
180
181 // Test that send bandwidth is set correctly.
182 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000183 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
184 // |expected_result| is the expected result from SetMaxSendBandwidth().
185 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000186 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000187 int max_bitrate,
188 bool expected_result,
189 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200190 cricket::AudioSendParameters parameters;
191 parameters.codecs.push_back(codec);
192 parameters.max_bandwidth_bps = max_bitrate;
193 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
194
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000195 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000196 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000197 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000198 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000199 }
200
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000201 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenberg0a617e22015-10-20 15:49:38 -0700202 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000203
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000204 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800205 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000206
207 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200208 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000209 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200210 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800211 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000212
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000213 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200214 send_parameters_.extensions.clear();
215 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800216 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000217
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000218 // Ensure extension is set properly.
219 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200220 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
221 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800222 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
223 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
224 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000225
solenberg7add0582015-11-20 09:59:34 -0800226 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000227 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700228 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800229 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
230 call_.GetAudioSendStream(kSsrc2));
231 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
232 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
233 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000234
235 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200236 send_parameters_.codecs.push_back(kPcmuCodec);
237 send_parameters_.extensions.clear();
238 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800239 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
240 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000241 }
242
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000243 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700244 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000245
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000246 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800247 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000248
249 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800250 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000251 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800252 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
253 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000254
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000255 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800256 recv_parameters_.extensions.clear();
257 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
258 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000259
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000260 // Ensure extension is set properly.
261 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800262 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
263 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
264 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
265 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
266 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000267
solenberg7add0582015-11-20 09:59:34 -0800268 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000269 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700270 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800271 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
272 call_.GetAudioReceiveStream(kSsrc2));
273 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
274 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
275 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000276
277 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800278 recv_parameters_.extensions.clear();
279 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
280 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
281 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000282 }
283
solenberg85a04962015-10-27 03:35:21 -0700284 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
285 webrtc::AudioSendStream::Stats stats;
286 stats.local_ssrc = 12;
287 stats.bytes_sent = 345;
288 stats.packets_sent = 678;
289 stats.packets_lost = 9012;
290 stats.fraction_lost = 34.56f;
291 stats.codec_name = "codec_name_send";
292 stats.ext_seqnum = 789;
293 stats.jitter_ms = 12;
294 stats.rtt_ms = 345;
295 stats.audio_level = 678;
296 stats.aec_quality_min = 9.01f;
297 stats.echo_delay_median_ms = 234;
298 stats.echo_delay_std_ms = 567;
299 stats.echo_return_loss = 890;
300 stats.echo_return_loss_enhancement = 1234;
301 stats.typing_noise_detected = true;
302 return stats;
303 }
304 void SetAudioSendStreamStats() {
305 for (auto* s : call_.GetAudioSendStreams()) {
306 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200307 }
solenberg85a04962015-10-27 03:35:21 -0700308 }
solenberg566ef242015-11-06 15:34:49 -0800309 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
310 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700311 const auto stats = GetAudioSendStreamStats();
312 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
313 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
314 EXPECT_EQ(info.packets_sent, stats.packets_sent);
315 EXPECT_EQ(info.packets_lost, stats.packets_lost);
316 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
317 EXPECT_EQ(info.codec_name, stats.codec_name);
318 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
319 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
320 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
321 EXPECT_EQ(info.audio_level, stats.audio_level);
322 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
323 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
324 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
325 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
326 EXPECT_EQ(info.echo_return_loss_enhancement,
327 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800328 EXPECT_EQ(info.typing_noise_detected,
329 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700330 }
331
332 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
333 webrtc::AudioReceiveStream::Stats stats;
334 stats.remote_ssrc = 123;
335 stats.bytes_rcvd = 456;
336 stats.packets_rcvd = 768;
337 stats.packets_lost = 101;
338 stats.fraction_lost = 23.45f;
339 stats.codec_name = "codec_name_recv";
340 stats.ext_seqnum = 678;
341 stats.jitter_ms = 901;
342 stats.jitter_buffer_ms = 234;
343 stats.jitter_buffer_preferred_ms = 567;
344 stats.delay_estimate_ms = 890;
345 stats.audio_level = 1234;
346 stats.expand_rate = 5.67f;
347 stats.speech_expand_rate = 8.90f;
348 stats.secondary_decoded_rate = 1.23f;
349 stats.accelerate_rate = 4.56f;
350 stats.preemptive_expand_rate = 7.89f;
351 stats.decoding_calls_to_silence_generator = 12;
352 stats.decoding_calls_to_neteq = 345;
353 stats.decoding_normal = 67890;
354 stats.decoding_plc = 1234;
355 stats.decoding_cng = 5678;
356 stats.decoding_plc_cng = 9012;
357 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200358 return stats;
359 }
360 void SetAudioReceiveStreamStats() {
361 for (auto* s : call_.GetAudioReceiveStreams()) {
362 s->SetStats(GetAudioReceiveStreamStats());
363 }
364 }
365 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700366 const auto stats = GetAudioReceiveStreamStats();
367 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
368 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
369 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
370 EXPECT_EQ(info.packets_lost, stats.packets_lost);
371 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
372 EXPECT_EQ(info.codec_name, stats.codec_name);
373 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
374 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
375 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200376 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700377 stats.jitter_buffer_preferred_ms);
378 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
379 EXPECT_EQ(info.audio_level, stats.audio_level);
380 EXPECT_EQ(info.expand_rate, stats.expand_rate);
381 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
382 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
383 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
384 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200385 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700386 stats.decoding_calls_to_silence_generator);
387 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
388 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
389 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
390 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
391 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
392 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200393 }
394
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000395 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200396 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000397 cricket::FakeWebRtcVoiceEngine voe_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000398 cricket::WebRtcVoiceEngine engine_;
399 cricket::VoiceMediaChannel* channel_;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200400 cricket::AudioSendParameters send_parameters_;
401 cricket::AudioRecvParameters recv_parameters_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000402};
403
404// Tests that our stub library "works".
405TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
406 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000407 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000408 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000409 engine_.Terminate();
410 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000411}
412
413// Tests that we can create and destroy a channel.
414TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000415 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200416 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200417 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000418}
419
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000420// Tests that the list of supported codecs is created properly and ordered
421// correctly
422TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
423 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
424 ASSERT_FALSE(codecs.empty());
425 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
426 EXPECT_EQ(48000, codecs[0].clockrate);
427 EXPECT_EQ(2, codecs[0].channels);
428 EXPECT_EQ(64000, codecs[0].bitrate);
429 int pref = codecs[0].preference;
430 for (size_t i = 1; i < codecs.size(); ++i) {
431 EXPECT_GT(pref, codecs[i].preference);
432 pref = codecs[i].preference;
433 }
434}
435
436// Tests that we can find codecs by name or id, and that we interpret the
437// clockrate and bitrate fields properly.
438TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
439 cricket::AudioCodec codec;
440 webrtc::CodecInst codec_inst;
441 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800442 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000443 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800444 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000445 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800446 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
447 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000448 // Find ISAC with a different payload id.
449 codec = kIsacCodec;
450 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800451 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000452 EXPECT_EQ(codec.id, codec_inst.pltype);
453 // Find PCMU with a 0 clockrate.
454 codec = kPcmuCodec;
455 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800456 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000457 EXPECT_EQ(codec.id, codec_inst.pltype);
458 EXPECT_EQ(8000, codec_inst.plfreq);
459 // Find PCMU with a 0 bitrate.
460 codec = kPcmuCodec;
461 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800462 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000463 EXPECT_EQ(codec.id, codec_inst.pltype);
464 EXPECT_EQ(64000, codec_inst.rate);
465 // Find ISAC with an explicit bitrate.
466 codec = kIsacCodec;
467 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800468 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000469 EXPECT_EQ(codec.id, codec_inst.pltype);
470 EXPECT_EQ(32000, codec_inst.rate);
471}
472
473// Test that we set our inbound codecs properly, including changing PT.
474TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
475 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200476 cricket::AudioRecvParameters parameters;
477 parameters.codecs.push_back(kIsacCodec);
478 parameters.codecs.push_back(kPcmuCodec);
479 parameters.codecs.push_back(kTelephoneEventCodec);
480 parameters.codecs[0].id = 106; // collide with existing telephone-event
481 parameters.codecs[2].id = 126;
482 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700483 EXPECT_TRUE(channel_->AddRecvStream(
484 cricket::StreamParams::CreateLegacy(kSsrc1)));
485 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000486 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800487 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000488 gcodec.plfreq = 16000;
489 gcodec.channels = 1;
490 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
491 EXPECT_EQ(106, gcodec.pltype);
492 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800493 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000494 gcodec.plfreq = 8000;
495 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
496 EXPECT_EQ(126, gcodec.pltype);
497 EXPECT_STREQ("telephone-event", gcodec.plname);
498}
499
500// Test that we fail to set an unknown inbound codec.
501TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
502 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200503 cricket::AudioRecvParameters parameters;
504 parameters.codecs.push_back(kIsacCodec);
505 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
506 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000507}
508
509// Test that we fail if we have duplicate types in the inbound list.
510TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
511 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200512 cricket::AudioRecvParameters parameters;
513 parameters.codecs.push_back(kIsacCodec);
514 parameters.codecs.push_back(kCn16000Codec);
515 parameters.codecs[1].id = kIsacCodec.id;
516 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000517}
518
519// Test that we can decode OPUS without stereo parameters.
520TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
521 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200522 cricket::AudioRecvParameters parameters;
523 parameters.codecs.push_back(kIsacCodec);
524 parameters.codecs.push_back(kPcmuCodec);
525 parameters.codecs.push_back(kOpusCodec);
526 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000527 EXPECT_TRUE(channel_->AddRecvStream(
528 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700529 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000530 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800531 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000532 // Even without stereo parameters, recv codecs still specify channels = 2.
533 EXPECT_EQ(2, opus.channels);
534 EXPECT_EQ(111, opus.pltype);
535 EXPECT_STREQ("opus", opus.plname);
536 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700537 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000538 EXPECT_EQ(111, opus.pltype);
539}
540
541// Test that we can decode OPUS with stereo = 0.
542TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
543 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200544 cricket::AudioRecvParameters parameters;
545 parameters.codecs.push_back(kIsacCodec);
546 parameters.codecs.push_back(kPcmuCodec);
547 parameters.codecs.push_back(kOpusCodec);
548 parameters.codecs[2].params["stereo"] = "0";
549 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000550 EXPECT_TRUE(channel_->AddRecvStream(
551 cricket::StreamParams::CreateLegacy(kSsrc1)));
552 int channel_num2 = voe_.GetLastChannel();
553 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800554 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000555 // Even when stereo is off, recv codecs still specify channels = 2.
556 EXPECT_EQ(2, opus.channels);
557 EXPECT_EQ(111, opus.pltype);
558 EXPECT_STREQ("opus", opus.plname);
559 opus.pltype = 0;
560 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
561 EXPECT_EQ(111, opus.pltype);
562}
563
564// Test that we can decode OPUS with stereo = 1.
565TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
566 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200567 cricket::AudioRecvParameters parameters;
568 parameters.codecs.push_back(kIsacCodec);
569 parameters.codecs.push_back(kPcmuCodec);
570 parameters.codecs.push_back(kOpusCodec);
571 parameters.codecs[2].params["stereo"] = "1";
572 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000573 EXPECT_TRUE(channel_->AddRecvStream(
574 cricket::StreamParams::CreateLegacy(kSsrc1)));
575 int channel_num2 = voe_.GetLastChannel();
576 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800577 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000578 EXPECT_EQ(2, opus.channels);
579 EXPECT_EQ(111, opus.pltype);
580 EXPECT_STREQ("opus", opus.plname);
581 opus.pltype = 0;
582 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
583 EXPECT_EQ(111, opus.pltype);
584}
585
586// Test that changes to recv codecs are applied to all streams.
587TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
588 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200589 cricket::AudioRecvParameters parameters;
590 parameters.codecs.push_back(kIsacCodec);
591 parameters.codecs.push_back(kPcmuCodec);
592 parameters.codecs.push_back(kTelephoneEventCodec);
593 parameters.codecs[0].id = 106; // collide with existing telephone-event
594 parameters.codecs[2].id = 126;
595 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000596 EXPECT_TRUE(channel_->AddRecvStream(
597 cricket::StreamParams::CreateLegacy(kSsrc1)));
598 int channel_num2 = voe_.GetLastChannel();
599 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800600 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601 gcodec.plfreq = 16000;
602 gcodec.channels = 1;
603 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
604 EXPECT_EQ(106, gcodec.pltype);
605 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800606 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000607 gcodec.plfreq = 8000;
608 gcodec.channels = 1;
609 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
610 EXPECT_EQ(126, gcodec.pltype);
611 EXPECT_STREQ("telephone-event", gcodec.plname);
612}
613
614TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenberg1ac56142015-10-13 03:58:19 -0700615 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200616 cricket::AudioRecvParameters parameters;
617 parameters.codecs.push_back(kIsacCodec);
618 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200619 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000620
621 int channel_num2 = voe_.GetLastChannel();
622 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800623 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000624 gcodec.plfreq = 16000;
625 gcodec.channels = 1;
626 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
627 EXPECT_EQ(106, gcodec.pltype);
628 EXPECT_STREQ("ISAC", gcodec.plname);
629}
630
631// Test that we can apply the same set of codecs again while playing.
632TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700633 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200634 cricket::AudioRecvParameters parameters;
635 parameters.codecs.push_back(kIsacCodec);
636 parameters.codecs.push_back(kCn16000Codec);
637 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000638 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200639 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000640
641 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200642 parameters.codecs[0].id = 127;
643 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
644 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645 EXPECT_TRUE(voe_.GetPlayout(channel_num));
646}
647
648// Test that we can add a codec while playing.
649TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700650 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200651 cricket::AudioRecvParameters parameters;
652 parameters.codecs.push_back(kIsacCodec);
653 parameters.codecs.push_back(kCn16000Codec);
654 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000655 EXPECT_TRUE(channel_->SetPlayout(true));
656
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200657 parameters.codecs.push_back(kOpusCodec);
658 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
659 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000660 EXPECT_TRUE(voe_.GetPlayout(channel_num));
661 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800662 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000663 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
664}
665
666TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenberg1ac56142015-10-13 03:58:19 -0700667 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000668
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000669 // Test that when autobw is enabled, bitrate is kept as the default
670 // value. autobw is enabled for the following tests because the target
671 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000672
673 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000674 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000675
676 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000677 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000678
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000679 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000680 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000681}
682
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000683TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700684 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000685
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000686 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000687
688 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000689 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
690 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000691
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000693 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
694 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000695}
696
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000697TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700698 EXPECT_TRUE(SetupEngineWithSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000699
700 // Test that we can only set a maximum bitrate for a fixed-rate codec
701 // if it's bigger than the fixed rate.
702
703 // PCMU, fixed bitrate == 64000.
704 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
705 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
706 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
707 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
708 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
709 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
710 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
711}
712
713TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -0700714 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200715 const int kDesiredBitrate = 128000;
716 cricket::AudioSendParameters parameters;
717 parameters.codecs = engine_.codecs();
718 parameters.max_bandwidth_bps = kDesiredBitrate;
719 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000720
721 EXPECT_TRUE(channel_->AddSendStream(
722 cricket::StreamParams::CreateLegacy(kSsrc1)));
723
724 int channel_num = voe_.GetLastChannel();
725 webrtc::CodecInst codec;
726 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200727 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000728}
729
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000730// Test that bitrate cannot be set for CBR codecs.
731// Bitrate is ignored if it is higher than the fixed bitrate.
732// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000733TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenberg1ac56142015-10-13 03:58:19 -0700734 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000735
736 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200737 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
738 int channel_num = voe_.GetLastChannel();
739 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000740 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
741 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200742
743 send_parameters_.max_bandwidth_bps = 128000;
744 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000745 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
746 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200747
748 send_parameters_.max_bandwidth_bps = 128;
749 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000750 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
751 EXPECT_EQ(64000, codec.rate);
752}
753
754// Test that we apply codecs properly.
755TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenberg1ac56142015-10-13 03:58:19 -0700756 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200757 cricket::AudioSendParameters parameters;
758 parameters.codecs.push_back(kIsacCodec);
759 parameters.codecs.push_back(kPcmuCodec);
760 parameters.codecs.push_back(kRedCodec);
761 parameters.codecs[0].id = 96;
762 parameters.codecs[0].bitrate = 48000;
763 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000764 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200765 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000766 webrtc::CodecInst gcodec;
767 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
768 EXPECT_EQ(96, gcodec.pltype);
769 EXPECT_EQ(48000, gcodec.rate);
770 EXPECT_STREQ("ISAC", gcodec.plname);
771 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000772 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000773 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
774 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100775 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000776}
777
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000778// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
779// to apply.
780TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenberg1ac56142015-10-13 03:58:19 -0700781 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200782 cricket::AudioSendParameters parameters;
783 parameters.codecs.push_back(kIsacCodec);
784 parameters.codecs.push_back(kPcmuCodec);
785 parameters.codecs.push_back(kRedCodec);
786 parameters.codecs[0].id = 96;
787 parameters.codecs[0].bitrate = 48000;
788 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000789 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
790 // Calling SetSendCodec again with same codec which is already set.
791 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200792 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000793 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
794}
795
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000796// Verify that G722 is set with 16000 samples per second to WebRTC.
797TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenberg1ac56142015-10-13 03:58:19 -0700798 EXPECT_TRUE(SetupEngineWithSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000799 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200800 cricket::AudioSendParameters parameters;
801 parameters.codecs.push_back(kG722CodecSdp);
802 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000803 webrtc::CodecInst gcodec;
804 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
805 EXPECT_STREQ("G722", gcodec.plname);
806 EXPECT_EQ(1, gcodec.channels);
807 EXPECT_EQ(16000, gcodec.plfreq);
808}
809
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000810// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000811TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenberg1ac56142015-10-13 03:58:19 -0700812 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200813 cricket::AudioSendParameters parameters;
814 parameters.codecs.push_back(kOpusCodec);
815 parameters.codecs[0].bitrate = 0;
816 parameters.codecs[0].clockrate = 50000;
817 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000818}
819
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000820// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000821TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700822 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200823 cricket::AudioSendParameters parameters;
824 parameters.codecs.push_back(kOpusCodec);
825 parameters.codecs[0].bitrate = 0;
826 parameters.codecs[0].channels = 0;
827 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000828}
829
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000830// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000831TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700832 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200833 cricket::AudioSendParameters parameters;
834 parameters.codecs.push_back(kOpusCodec);
835 parameters.codecs[0].bitrate = 0;
836 parameters.codecs[0].channels = 0;
837 parameters.codecs[0].params["stereo"] = "1";
838 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000839}
840
841// Test that if channel is 1 for opus and there's no stereo, we fail.
842TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700843 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200844 cricket::AudioSendParameters parameters;
845 parameters.codecs.push_back(kOpusCodec);
846 parameters.codecs[0].bitrate = 0;
847 parameters.codecs[0].channels = 1;
848 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000849}
850
851// Test that if channel is 1 for opus and stereo=0, we fail.
852TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700853 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200854 cricket::AudioSendParameters parameters;
855 parameters.codecs.push_back(kOpusCodec);
856 parameters.codecs[0].bitrate = 0;
857 parameters.codecs[0].channels = 1;
858 parameters.codecs[0].params["stereo"] = "0";
859 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000860}
861
862// Test that if channel is 1 for opus and stereo=1, we fail.
863TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700864 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200865 cricket::AudioSendParameters parameters;
866 parameters.codecs.push_back(kOpusCodec);
867 parameters.codecs[0].bitrate = 0;
868 parameters.codecs[0].channels = 1;
869 parameters.codecs[0].params["stereo"] = "1";
870 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000871}
872
873// Test that with bitrate=0 and no stereo,
874// channels and bitrate are 1 and 32000.
875TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700876 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000877 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200878 cricket::AudioSendParameters parameters;
879 parameters.codecs.push_back(kOpusCodec);
880 parameters.codecs[0].bitrate = 0;
881 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000882 webrtc::CodecInst gcodec;
883 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
884 EXPECT_STREQ("opus", gcodec.plname);
885 EXPECT_EQ(1, gcodec.channels);
886 EXPECT_EQ(32000, gcodec.rate);
887}
888
889// Test that with bitrate=0 and stereo=0,
890// channels and bitrate are 1 and 32000.
891TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700892 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000893 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200894 cricket::AudioSendParameters parameters;
895 parameters.codecs.push_back(kOpusCodec);
896 parameters.codecs[0].bitrate = 0;
897 parameters.codecs[0].params["stereo"] = "0";
898 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000899 webrtc::CodecInst gcodec;
900 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
901 EXPECT_STREQ("opus", gcodec.plname);
902 EXPECT_EQ(1, gcodec.channels);
903 EXPECT_EQ(32000, gcodec.rate);
904}
905
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000906// Test that with bitrate=invalid and stereo=0,
907// channels and bitrate are 1 and 32000.
908TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700909 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000910 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200911 cricket::AudioSendParameters parameters;
912 parameters.codecs.push_back(kOpusCodec);
913 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000914 webrtc::CodecInst gcodec;
915
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000916 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200917 parameters.codecs[0].bitrate = 5999;
918 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000919 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
920 EXPECT_STREQ("opus", gcodec.plname);
921 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000922 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000923
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200924 parameters.codecs[0].bitrate = 510001;
925 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000926 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
927 EXPECT_STREQ("opus", gcodec.plname);
928 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000929 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000930}
931
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000932// Test that with bitrate=0 and stereo=1,
933// channels and bitrate are 2 and 64000.
934TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700935 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000936 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200937 cricket::AudioSendParameters parameters;
938 parameters.codecs.push_back(kOpusCodec);
939 parameters.codecs[0].bitrate = 0;
940 parameters.codecs[0].params["stereo"] = "1";
941 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000942 webrtc::CodecInst gcodec;
943 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
944 EXPECT_STREQ("opus", gcodec.plname);
945 EXPECT_EQ(2, gcodec.channels);
946 EXPECT_EQ(64000, gcodec.rate);
947}
948
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000949// Test that with bitrate=invalid and stereo=1,
950// channels and bitrate are 2 and 64000.
951TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700952 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000953 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200954 cricket::AudioSendParameters parameters;
955 parameters.codecs.push_back(kOpusCodec);
956 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000957 webrtc::CodecInst gcodec;
958
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000959 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200960 parameters.codecs[0].bitrate = 5999;
961 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000962 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
963 EXPECT_STREQ("opus", gcodec.plname);
964 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000965 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000966
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200967 parameters.codecs[0].bitrate = 510001;
968 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000969 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
970 EXPECT_STREQ("opus", gcodec.plname);
971 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000972 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000973}
974
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000975// Test that with bitrate=N and stereo unset,
976// channels and bitrate are 1 and N.
977TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700978 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000979 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200980 cricket::AudioSendParameters parameters;
981 parameters.codecs.push_back(kOpusCodec);
982 parameters.codecs[0].bitrate = 96000;
983 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000984 webrtc::CodecInst gcodec;
985 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
986 EXPECT_EQ(111, gcodec.pltype);
987 EXPECT_EQ(96000, gcodec.rate);
988 EXPECT_STREQ("opus", gcodec.plname);
989 EXPECT_EQ(1, gcodec.channels);
990 EXPECT_EQ(48000, gcodec.plfreq);
991}
992
993// Test that with bitrate=N and stereo=0,
994// channels and bitrate are 1 and N.
995TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700996 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000997 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200998 cricket::AudioSendParameters parameters;
999 parameters.codecs.push_back(kOpusCodec);
1000 parameters.codecs[0].bitrate = 30000;
1001 parameters.codecs[0].params["stereo"] = "0";
1002 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001003 webrtc::CodecInst gcodec;
1004 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1005 EXPECT_EQ(1, gcodec.channels);
1006 EXPECT_EQ(30000, gcodec.rate);
1007 EXPECT_STREQ("opus", gcodec.plname);
1008}
1009
1010// Test that with bitrate=N and without any parameters,
1011// channels and bitrate are 1 and N.
1012TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenberg1ac56142015-10-13 03:58:19 -07001013 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001014 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001015 cricket::AudioSendParameters parameters;
1016 parameters.codecs.push_back(kOpusCodec);
1017 parameters.codecs[0].bitrate = 30000;
1018 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001019 webrtc::CodecInst gcodec;
1020 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1021 EXPECT_EQ(1, gcodec.channels);
1022 EXPECT_EQ(30000, gcodec.rate);
1023 EXPECT_STREQ("opus", gcodec.plname);
1024}
1025
1026// Test that with bitrate=N and stereo=1,
1027// channels and bitrate are 2 and N.
1028TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001029 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001030 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001031 cricket::AudioSendParameters parameters;
1032 parameters.codecs.push_back(kOpusCodec);
1033 parameters.codecs[0].bitrate = 30000;
1034 parameters.codecs[0].params["stereo"] = "1";
1035 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001036 webrtc::CodecInst gcodec;
1037 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1038 EXPECT_EQ(2, gcodec.channels);
1039 EXPECT_EQ(30000, gcodec.rate);
1040 EXPECT_STREQ("opus", gcodec.plname);
1041}
1042
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001043// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1044// Also test that the "maxaveragebitrate" can't be set to values outside the
1045// range of 6000 and 510000
1046TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001047 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001048 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001049 cricket::AudioSendParameters parameters;
1050 parameters.codecs.push_back(kOpusCodec);
1051 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001052 webrtc::CodecInst gcodec;
1053
1054 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001055 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1056 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001057 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001058 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001059
1060 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001061 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1062 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001063 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001064 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001065
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001066 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1067 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001068 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1069 EXPECT_EQ(200000, gcodec.rate);
1070}
1071
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001072// Test that we can enable NACK with opus as caller.
1073TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001074 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001075 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001076 cricket::AudioSendParameters parameters;
1077 parameters.codecs.push_back(kOpusCodec);
1078 parameters.codecs[0].AddFeedbackParam(
1079 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1080 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001081 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001082 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001083 EXPECT_TRUE(voe_.GetNACK(channel_num));
1084}
1085
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001086// Test that we can enable NACK with opus as callee.
1087TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenberg0a617e22015-10-20 15:49:38 -07001088 EXPECT_TRUE(SetupEngineWithRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001089 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001090 cricket::AudioSendParameters parameters;
1091 parameters.codecs.push_back(kOpusCodec);
1092 parameters.codecs[0].AddFeedbackParam(
1093 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1094 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001095 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001096 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001097 EXPECT_FALSE(voe_.GetNACK(channel_num));
1098
1099 EXPECT_TRUE(channel_->AddSendStream(
1100 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001101 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001102}
1103
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001104// Test that we can enable NACK on receive streams.
1105TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001106 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001107 int channel_num1 = voe_.GetLastChannel();
1108 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1109 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001110 cricket::AudioSendParameters parameters;
1111 parameters.codecs.push_back(kOpusCodec);
1112 parameters.codecs[0].AddFeedbackParam(
1113 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1114 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001115 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1116 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001117 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001118 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1119 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1120}
1121
1122// Test that we can disable NACK.
1123TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001124 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001125 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001126 cricket::AudioSendParameters parameters;
1127 parameters.codecs.push_back(kOpusCodec);
1128 parameters.codecs[0].AddFeedbackParam(
1129 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1130 cricket::kParamValueEmpty));
1131 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001132 EXPECT_TRUE(voe_.GetNACK(channel_num));
1133
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001134 parameters.codecs.clear();
1135 parameters.codecs.push_back(kOpusCodec);
1136 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001137 EXPECT_FALSE(voe_.GetNACK(channel_num));
1138}
1139
1140// Test that we can disable NACK on receive streams.
1141TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001142 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001143 int channel_num1 = voe_.GetLastChannel();
1144 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1145 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001146 cricket::AudioSendParameters parameters;
1147 parameters.codecs.push_back(kOpusCodec);
1148 parameters.codecs[0].AddFeedbackParam(
1149 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1150 cricket::kParamValueEmpty));
1151 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001152 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1153 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1154
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001155 parameters.codecs.clear();
1156 parameters.codecs.push_back(kOpusCodec);
1157 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001158 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1159 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1160}
1161
1162// Test that NACK is enabled on a new receive stream.
1163TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001164 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001165 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001166 cricket::AudioSendParameters parameters;
1167 parameters.codecs.push_back(kIsacCodec);
1168 parameters.codecs.push_back(kCn16000Codec);
1169 parameters.codecs[0].AddFeedbackParam(
1170 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1171 cricket::kParamValueEmpty));
1172 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001173 EXPECT_TRUE(voe_.GetNACK(channel_num));
1174
1175 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1176 channel_num = voe_.GetLastChannel();
1177 EXPECT_TRUE(voe_.GetNACK(channel_num));
1178 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1179 channel_num = voe_.GetLastChannel();
1180 EXPECT_TRUE(voe_.GetNACK(channel_num));
1181}
1182
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001183// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001184TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenberg1ac56142015-10-13 03:58:19 -07001185 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001186 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001187 cricket::AudioSendParameters parameters;
1188 parameters.codecs.push_back(kOpusCodec);
1189 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001190 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1191}
1192
1193// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001194TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001195 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001196 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001197 cricket::AudioSendParameters parameters;
1198 parameters.codecs.push_back(kOpusCodec);
1199 parameters.codecs[0].bitrate = 0;
1200 parameters.codecs[0].params["useinbandfec"] = "0";
1201 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001202 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1203 webrtc::CodecInst gcodec;
1204 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1205 EXPECT_STREQ("opus", gcodec.plname);
1206 EXPECT_EQ(1, gcodec.channels);
1207 EXPECT_EQ(32000, gcodec.rate);
1208}
1209
1210// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001211TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001212 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001213 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001214 cricket::AudioSendParameters parameters;
1215 parameters.codecs.push_back(kOpusCodec);
1216 parameters.codecs[0].bitrate = 0;
1217 parameters.codecs[0].params["useinbandfec"] = "1";
1218 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001219 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1220 webrtc::CodecInst gcodec;
1221 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1222 EXPECT_STREQ("opus", gcodec.plname);
1223 EXPECT_EQ(1, gcodec.channels);
1224 EXPECT_EQ(32000, gcodec.rate);
1225}
1226
1227// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001228TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001229 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001230 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001231 cricket::AudioSendParameters parameters;
1232 parameters.codecs.push_back(kOpusCodec);
1233 parameters.codecs[0].bitrate = 0;
1234 parameters.codecs[0].params["stereo"] = "1";
1235 parameters.codecs[0].params["useinbandfec"] = "1";
1236 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001237 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1238 webrtc::CodecInst gcodec;
1239 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1240 EXPECT_STREQ("opus", gcodec.plname);
1241 EXPECT_EQ(2, gcodec.channels);
1242 EXPECT_EQ(64000, gcodec.rate);
1243}
1244
1245// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001246TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001247 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001248 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001249 cricket::AudioSendParameters parameters;
1250 parameters.codecs.push_back(kIsacCodec);
1251 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001252 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1253}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001254
1255// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1256TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001257 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001258 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001259 cricket::AudioSendParameters parameters;
1260 parameters.codecs.push_back(kIsacCodec);
1261 parameters.codecs[0].params["useinbandfec"] = "1";
1262 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001263 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1264}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001265
1266// Test that Opus FEC status can be changed.
1267TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenberg1ac56142015-10-13 03:58:19 -07001268 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001269 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001270 cricket::AudioSendParameters parameters;
1271 parameters.codecs.push_back(kOpusCodec);
1272 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001273 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001274 parameters.codecs[0].params["useinbandfec"] = "1";
1275 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001276 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1277}
1278
1279// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1280TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenberg1ac56142015-10-13 03:58:19 -07001281 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001282 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001283 cricket::AudioSendParameters parameters;
1284 parameters.codecs.push_back(kOpusCodec);
1285 parameters.codecs[0].bitrate = 0;
1286 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1287 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001288 EXPECT_EQ(cricket::kOpusBandwidthNb,
1289 voe_.GetMaxEncodingBandwidth(channel_num));
1290 webrtc::CodecInst gcodec;
1291 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1292 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001293
1294 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001295 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1296 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001297 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1298 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001299}
1300
1301// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1302TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenberg1ac56142015-10-13 03:58:19 -07001303 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001304 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001305 cricket::AudioSendParameters parameters;
1306 parameters.codecs.push_back(kOpusCodec);
1307 parameters.codecs[0].bitrate = 0;
1308 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1309 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001310 EXPECT_EQ(cricket::kOpusBandwidthMb,
1311 voe_.GetMaxEncodingBandwidth(channel_num));
1312 webrtc::CodecInst gcodec;
1313 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1314 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001315
1316 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001317 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1318 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001319 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1320 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001321}
1322
1323// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1324TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenberg1ac56142015-10-13 03:58:19 -07001325 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001326 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001327 cricket::AudioSendParameters parameters;
1328 parameters.codecs.push_back(kOpusCodec);
1329 parameters.codecs[0].bitrate = 0;
1330 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1331 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001332 EXPECT_EQ(cricket::kOpusBandwidthWb,
1333 voe_.GetMaxEncodingBandwidth(channel_num));
1334 webrtc::CodecInst gcodec;
1335 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1336 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001337
1338 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001339 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1340 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001341 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1342 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001343}
1344
1345// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1346TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenberg1ac56142015-10-13 03:58:19 -07001347 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001348 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001349 cricket::AudioSendParameters parameters;
1350 parameters.codecs.push_back(kOpusCodec);
1351 parameters.codecs[0].bitrate = 0;
1352 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1353 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001354 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1355 voe_.GetMaxEncodingBandwidth(channel_num));
1356 webrtc::CodecInst gcodec;
1357 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1358 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001359
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001360 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001361 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1362 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001363 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1364 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001365}
1366
1367// Test 24000 < maxplaybackrate triggers Opus full band mode.
1368TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenberg1ac56142015-10-13 03:58:19 -07001369 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001370 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001371 cricket::AudioSendParameters parameters;
1372 parameters.codecs.push_back(kOpusCodec);
1373 parameters.codecs[0].bitrate = 0;
1374 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1375 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001376 EXPECT_EQ(cricket::kOpusBandwidthFb,
1377 voe_.GetMaxEncodingBandwidth(channel_num));
1378 webrtc::CodecInst gcodec;
1379 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1380 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001381
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001382 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001383 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1384 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001385 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1386 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001387}
1388
1389// Test Opus that without maxplaybackrate, default playback rate is used.
1390TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001391 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001392 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001393 cricket::AudioSendParameters parameters;
1394 parameters.codecs.push_back(kOpusCodec);
1395 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001396 EXPECT_EQ(cricket::kOpusBandwidthFb,
1397 voe_.GetMaxEncodingBandwidth(channel_num));
1398}
1399
1400// Test the with non-Opus, maxplaybackrate has no effect.
1401TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001402 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001403 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001404 cricket::AudioSendParameters parameters;
1405 parameters.codecs.push_back(kIsacCodec);
1406 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1407 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001408 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1409}
1410
1411// Test maxplaybackrate can be set on two streams.
1412TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001413 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001414 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001415 cricket::AudioSendParameters parameters;
1416 parameters.codecs.push_back(kOpusCodec);
1417 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001418 // Default bandwidth is 24000.
1419 EXPECT_EQ(cricket::kOpusBandwidthFb,
1420 voe_.GetMaxEncodingBandwidth(channel_num));
1421
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001422 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001423
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001424 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001425 EXPECT_EQ(cricket::kOpusBandwidthNb,
1426 voe_.GetMaxEncodingBandwidth(channel_num));
1427
1428 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1429 channel_num = voe_.GetLastChannel();
1430 EXPECT_EQ(cricket::kOpusBandwidthNb,
1431 voe_.GetMaxEncodingBandwidth(channel_num));
1432}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001433
Minyue Li7100dcd2015-03-27 05:05:59 +01001434// Test that with usedtx=0, Opus DTX is off.
1435TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001436 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001437 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001438 cricket::AudioSendParameters parameters;
1439 parameters.codecs.push_back(kOpusCodec);
1440 parameters.codecs[0].params["usedtx"] = "0";
1441 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001442 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1443}
1444
1445// Test that with usedtx=1, Opus DTX is on.
1446TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001447 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001448 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001449 cricket::AudioSendParameters parameters;
1450 parameters.codecs.push_back(kOpusCodec);
1451 parameters.codecs[0].params["usedtx"] = "1";
1452 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001453 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1454 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1455}
1456
1457// Test that usedtx=1 works with stereo Opus.
1458TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001459 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001460 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001461 cricket::AudioSendParameters parameters;
1462 parameters.codecs.push_back(kOpusCodec);
1463 parameters.codecs[0].params["usedtx"] = "1";
1464 parameters.codecs[0].params["stereo"] = "1";
1465 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001466 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1467 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1468}
1469
1470// Test that usedtx=1 does not work with non Opus.
1471TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001472 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001473 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001474 cricket::AudioSendParameters parameters;
1475 parameters.codecs.push_back(kIsacCodec);
1476 parameters.codecs[0].params["usedtx"] = "1";
1477 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001478 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1479}
1480
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001481// Test that we can switch back and forth between Opus and ISAC with CN.
1482TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenberg1ac56142015-10-13 03:58:19 -07001483 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001484 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001485 cricket::AudioSendParameters opus_parameters;
1486 opus_parameters.codecs.push_back(kOpusCodec);
1487 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001488 webrtc::CodecInst gcodec;
1489 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001490 EXPECT_EQ(111, gcodec.pltype);
1491 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001492
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001493 cricket::AudioSendParameters isac_parameters;
1494 isac_parameters.codecs.push_back(kIsacCodec);
1495 isac_parameters.codecs.push_back(kCn16000Codec);
1496 isac_parameters.codecs.push_back(kOpusCodec);
1497 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001498 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1499 EXPECT_EQ(103, gcodec.pltype);
1500 EXPECT_STREQ("ISAC", gcodec.plname);
1501
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001502 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001503 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001504 EXPECT_EQ(111, gcodec.pltype);
1505 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001506}
1507
1508// Test that we handle various ways of specifying bitrate.
1509TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001510 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001511 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001512 cricket::AudioSendParameters parameters;
1513 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1514 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001515 webrtc::CodecInst gcodec;
1516 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1517 EXPECT_EQ(103, gcodec.pltype);
1518 EXPECT_STREQ("ISAC", gcodec.plname);
1519 EXPECT_EQ(32000, gcodec.rate);
1520
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001521 parameters.codecs[0].bitrate = 0; // bitrate == default
1522 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001523 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1524 EXPECT_EQ(103, gcodec.pltype);
1525 EXPECT_STREQ("ISAC", gcodec.plname);
1526 EXPECT_EQ(-1, gcodec.rate);
1527
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001528 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1529 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001530 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1531 EXPECT_EQ(103, gcodec.pltype);
1532 EXPECT_STREQ("ISAC", gcodec.plname);
1533 EXPECT_EQ(28000, gcodec.rate);
1534
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001535 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1536 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001537 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1538 EXPECT_EQ(0, gcodec.pltype);
1539 EXPECT_STREQ("PCMU", gcodec.plname);
1540 EXPECT_EQ(64000, gcodec.rate);
1541
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001542 parameters.codecs[0].bitrate = 0; // bitrate == default
1543 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001544 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1545 EXPECT_EQ(0, gcodec.pltype);
1546 EXPECT_STREQ("PCMU", gcodec.plname);
1547 EXPECT_EQ(64000, gcodec.rate);
1548
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001549 parameters.codecs[0] = kOpusCodec;
1550 parameters.codecs[0].bitrate = 0; // bitrate == default
1551 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001552 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1553 EXPECT_EQ(111, gcodec.pltype);
1554 EXPECT_STREQ("opus", gcodec.plname);
1555 EXPECT_EQ(32000, gcodec.rate);
1556}
1557
Brave Yao5225dd82015-03-26 07:39:19 +08001558// Test that we could set packet size specified in kCodecParamPTime.
1559TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenberg1ac56142015-10-13 03:58:19 -07001560 EXPECT_TRUE(SetupEngineWithSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001561 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001562 cricket::AudioSendParameters parameters;
1563 parameters.codecs.push_back(kOpusCodec);
1564 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1565 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001566 webrtc::CodecInst gcodec;
1567 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1568 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1569
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001570 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1571 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001572 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1573 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1574
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001575 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1576 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001577 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1578 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1579
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001580 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1581 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1582 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001583 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1584 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1585
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001586 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1587 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1588 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001589 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1590 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1591}
1592
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001593// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001594TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenberg1ac56142015-10-13 03:58:19 -07001595 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001596 cricket::AudioSendParameters parameters;
1597 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001598}
1599
1600// Test that we can set send codecs even with telephone-event codec as the first
1601// one on the list.
1602TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001603 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001604 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001605 cricket::AudioSendParameters parameters;
1606 parameters.codecs.push_back(kTelephoneEventCodec);
1607 parameters.codecs.push_back(kIsacCodec);
1608 parameters.codecs.push_back(kPcmuCodec);
1609 parameters.codecs[0].id = 98; // DTMF
1610 parameters.codecs[1].id = 96;
1611 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001612 webrtc::CodecInst gcodec;
1613 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001614 EXPECT_EQ(96, gcodec.pltype);
1615 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001616 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001617}
1618
1619// Test that we can set send codecs even with CN codec as the first
1620// one on the list.
1621TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001622 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001623 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001624 cricket::AudioSendParameters parameters;
1625 parameters.codecs.push_back(kCn16000Codec);
1626 parameters.codecs.push_back(kIsacCodec);
1627 parameters.codecs.push_back(kPcmuCodec);
1628 parameters.codecs[0].id = 98; // wideband CN
1629 parameters.codecs[1].id = 96;
1630 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001631 webrtc::CodecInst gcodec;
1632 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1633 EXPECT_EQ(96, gcodec.pltype);
1634 EXPECT_STREQ("ISAC", gcodec.plname);
1635 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001636}
1637
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001638// Test that we set VAD and DTMF types correctly as caller.
1639TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001640 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001641 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001642 cricket::AudioSendParameters parameters;
1643 parameters.codecs.push_back(kIsacCodec);
1644 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001645 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001646 parameters.codecs.push_back(kCn16000Codec);
1647 parameters.codecs.push_back(kCn8000Codec);
1648 parameters.codecs.push_back(kTelephoneEventCodec);
1649 parameters.codecs.push_back(kRedCodec);
1650 parameters.codecs[0].id = 96;
1651 parameters.codecs[2].id = 97; // wideband CN
1652 parameters.codecs[4].id = 98; // DTMF
1653 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001654 webrtc::CodecInst gcodec;
1655 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1656 EXPECT_EQ(96, gcodec.pltype);
1657 EXPECT_STREQ("ISAC", gcodec.plname);
1658 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001659 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001660 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1661 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001662 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001663}
1664
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001665// Test that we set VAD and DTMF types correctly as callee.
1666TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001667 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001668 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001669 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001670
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001671 cricket::AudioSendParameters parameters;
1672 parameters.codecs.push_back(kIsacCodec);
1673 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001674 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001675 parameters.codecs.push_back(kCn16000Codec);
1676 parameters.codecs.push_back(kCn8000Codec);
1677 parameters.codecs.push_back(kTelephoneEventCodec);
1678 parameters.codecs.push_back(kRedCodec);
1679 parameters.codecs[0].id = 96;
1680 parameters.codecs[2].id = 97; // wideband CN
1681 parameters.codecs[4].id = 98; // DTMF
1682 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001683 EXPECT_TRUE(channel_->AddSendStream(
1684 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001685 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001686
1687 webrtc::CodecInst gcodec;
1688 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1689 EXPECT_EQ(96, gcodec.pltype);
1690 EXPECT_STREQ("ISAC", gcodec.plname);
1691 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001692 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001693 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1694 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001695 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001696}
1697
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001698// Test that we only apply VAD if we have a CN codec that matches the
1699// send codec clockrate.
1700TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenberg1ac56142015-10-13 03:58:19 -07001701 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001702 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001703 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001704 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001705 parameters.codecs.push_back(kIsacCodec);
1706 parameters.codecs.push_back(kCn16000Codec);
1707 parameters.codecs[1].id = 97;
1708 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001709 webrtc::CodecInst gcodec;
1710 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1711 EXPECT_STREQ("ISAC", gcodec.plname);
1712 EXPECT_TRUE(voe_.GetVAD(channel_num));
1713 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1714 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001715 parameters.codecs[0] = kPcmuCodec;
1716 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001717 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1718 EXPECT_STREQ("PCMU", gcodec.plname);
1719 EXPECT_FALSE(voe_.GetVAD(channel_num));
1720 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001721 parameters.codecs[1] = kCn8000Codec;
1722 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001723 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1724 EXPECT_STREQ("PCMU", gcodec.plname);
1725 EXPECT_TRUE(voe_.GetVAD(channel_num));
1726 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001727 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001728 parameters.codecs[0] = kIsacCodec;
1729 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001730 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1731 EXPECT_STREQ("ISAC", gcodec.plname);
1732 EXPECT_FALSE(voe_.GetVAD(channel_num));
1733}
1734
1735// Test that we perform case-insensitive matching of codec names.
1736TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenberg1ac56142015-10-13 03:58:19 -07001737 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001738 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001739 cricket::AudioSendParameters parameters;
1740 parameters.codecs.push_back(kIsacCodec);
1741 parameters.codecs.push_back(kPcmuCodec);
1742 parameters.codecs.push_back(kCn16000Codec);
1743 parameters.codecs.push_back(kCn8000Codec);
1744 parameters.codecs.push_back(kTelephoneEventCodec);
1745 parameters.codecs.push_back(kRedCodec);
1746 parameters.codecs[0].name = "iSaC";
1747 parameters.codecs[0].id = 96;
1748 parameters.codecs[2].id = 97; // wideband CN
1749 parameters.codecs[4].id = 98; // DTMF
1750 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001751 webrtc::CodecInst gcodec;
1752 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1753 EXPECT_EQ(96, gcodec.pltype);
1754 EXPECT_STREQ("ISAC", gcodec.plname);
1755 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001756 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001757 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1758 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001759 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001760}
1761
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001762// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001763TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001764 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001765 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001766 cricket::AudioSendParameters parameters;
1767 parameters.codecs.push_back(kRedCodec);
1768 parameters.codecs.push_back(kIsacCodec);
1769 parameters.codecs.push_back(kPcmuCodec);
1770 parameters.codecs[0].id = 127;
1771 parameters.codecs[0].params[""] = "96/96";
1772 parameters.codecs[1].id = 96;
1773 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001774 webrtc::CodecInst gcodec;
1775 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1776 EXPECT_EQ(96, gcodec.pltype);
1777 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001778 EXPECT_TRUE(voe_.GetRED(channel_num));
1779 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001780}
1781
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001782// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001783TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001784 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001785 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001786 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001787
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001788 cricket::AudioSendParameters parameters;
1789 parameters.codecs.push_back(kRedCodec);
1790 parameters.codecs.push_back(kIsacCodec);
1791 parameters.codecs.push_back(kPcmuCodec);
1792 parameters.codecs[0].id = 127;
1793 parameters.codecs[0].params[""] = "96/96";
1794 parameters.codecs[1].id = 96;
1795 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001796 EXPECT_TRUE(channel_->AddSendStream(
1797 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001798 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001799 webrtc::CodecInst gcodec;
1800 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1801 EXPECT_EQ(96, gcodec.pltype);
1802 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001803 EXPECT_TRUE(voe_.GetRED(channel_num));
1804 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001805}
1806
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001807// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001808TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenberg1ac56142015-10-13 03:58:19 -07001809 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001810 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001811 cricket::AudioSendParameters parameters;
1812 parameters.codecs.push_back(kRedCodec);
1813 parameters.codecs.push_back(kIsacCodec);
1814 parameters.codecs.push_back(kPcmuCodec);
1815 parameters.codecs[0].id = 127;
1816 parameters.codecs[1].id = 96;
1817 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001818 webrtc::CodecInst gcodec;
1819 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1820 EXPECT_EQ(96, gcodec.pltype);
1821 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001822 EXPECT_TRUE(voe_.GetRED(channel_num));
1823 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001824}
1825
1826// Test that we ignore RED if the parameters aren't named the way we expect.
1827TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001828 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001829 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001830 cricket::AudioSendParameters parameters;
1831 parameters.codecs.push_back(kRedCodec);
1832 parameters.codecs.push_back(kIsacCodec);
1833 parameters.codecs.push_back(kPcmuCodec);
1834 parameters.codecs[0].id = 127;
1835 parameters.codecs[0].params["ABC"] = "96/96";
1836 parameters.codecs[1].id = 96;
1837 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001838 webrtc::CodecInst gcodec;
1839 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1840 EXPECT_EQ(96, gcodec.pltype);
1841 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001842 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001843}
1844
1845// Test that we ignore RED if it uses different primary/secondary encoding.
1846TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001847 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001848 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001849 cricket::AudioSendParameters parameters;
1850 parameters.codecs.push_back(kRedCodec);
1851 parameters.codecs.push_back(kIsacCodec);
1852 parameters.codecs.push_back(kPcmuCodec);
1853 parameters.codecs[0].id = 127;
1854 parameters.codecs[0].params[""] = "96/0";
1855 parameters.codecs[1].id = 96;
1856 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001857 webrtc::CodecInst gcodec;
1858 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1859 EXPECT_EQ(96, gcodec.pltype);
1860 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001861 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001862}
1863
1864// Test that we ignore RED if it uses more than 2 encodings.
1865TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001866 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001867 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001868 cricket::AudioSendParameters parameters;
1869 parameters.codecs.push_back(kRedCodec);
1870 parameters.codecs.push_back(kIsacCodec);
1871 parameters.codecs.push_back(kPcmuCodec);
1872 parameters.codecs[0].id = 127;
1873 parameters.codecs[0].params[""] = "96/96/96";
1874 parameters.codecs[1].id = 96;
1875 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001876 webrtc::CodecInst gcodec;
1877 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1878 EXPECT_EQ(96, gcodec.pltype);
1879 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001880 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001881}
1882
1883// Test that we ignore RED if it has bogus codec ids.
1884TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001885 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001886 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001887 cricket::AudioSendParameters parameters;
1888 parameters.codecs.push_back(kRedCodec);
1889 parameters.codecs.push_back(kIsacCodec);
1890 parameters.codecs.push_back(kPcmuCodec);
1891 parameters.codecs[0].id = 127;
1892 parameters.codecs[0].params[""] = "ABC/ABC";
1893 parameters.codecs[1].id = 96;
1894 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001895 webrtc::CodecInst gcodec;
1896 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1897 EXPECT_EQ(96, gcodec.pltype);
1898 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001899 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001900}
1901
1902// Test that we ignore RED if it refers to a codec that is not present.
1903TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001904 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001905 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001906 cricket::AudioSendParameters parameters;
1907 parameters.codecs.push_back(kRedCodec);
1908 parameters.codecs.push_back(kIsacCodec);
1909 parameters.codecs.push_back(kPcmuCodec);
1910 parameters.codecs[0].id = 127;
1911 parameters.codecs[0].params[""] = "97/97";
1912 parameters.codecs[1].id = 96;
1913 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001914 webrtc::CodecInst gcodec;
1915 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1916 EXPECT_EQ(96, gcodec.pltype);
1917 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001918 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001919}
1920
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001921// Test support for audio level header extension.
1922TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1923 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001924}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001925TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1926 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1927}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001928
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001929// Test support for absolute send time header extension.
1930TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1931 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1932}
1933TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1934 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001935}
1936
solenberg1ac56142015-10-13 03:58:19 -07001937// Test that we can create a channel and start sending on it.
1938TEST_F(WebRtcVoiceEngineTestFake, Send) {
1939 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001940 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001941 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001942 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1943 EXPECT_TRUE(voe_.GetSend(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001944 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1945 EXPECT_FALSE(voe_.GetSend(channel_num));
solenberg1ac56142015-10-13 03:58:19 -07001946}
1947
1948// Test that we can create a channel and start playing out on it.
1949TEST_F(WebRtcVoiceEngineTestFake, Playout) {
1950 EXPECT_TRUE(SetupEngineWithRecvStream());
1951 int channel_num = voe_.GetLastChannel();
1952 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
1953 EXPECT_TRUE(channel_->SetPlayout(true));
1954 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001955 EXPECT_TRUE(channel_->SetPlayout(false));
1956 EXPECT_FALSE(voe_.GetPlayout(channel_num));
1957}
1958
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001959// Test that we can add and remove send streams.
1960TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
1961 SetupForMultiSendStream();
1962
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001963 // Set the global state for sending.
1964 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1965
solenbergc96df772015-10-21 13:01:53 -07001966 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001967 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07001968 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001969 // Verify that we are in a sending state for all the created streams.
solenberg3a941542015-11-16 07:34:50 -08001970 EXPECT_TRUE(voe_.GetSend(GetSendStreamConfig(ssrc).voe_channel_id));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001971 }
tfarina5237aaf2015-11-10 23:44:30 -08001972 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001973
solenbergc96df772015-10-21 13:01:53 -07001974 // Delete the send streams.
1975 for (uint32_t ssrc : kSsrcs4) {
1976 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08001977 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07001978 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001979 }
solenbergc96df772015-10-21 13:01:53 -07001980 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001981}
1982
1983// Test SetSendCodecs correctly configure the codecs in all send streams.
1984TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
1985 SetupForMultiSendStream();
1986
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001987 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07001988 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001989 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07001990 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001991 }
1992
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001993 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001994 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001995 parameters.codecs.push_back(kIsacCodec);
1996 parameters.codecs.push_back(kCn16000Codec);
1997 parameters.codecs[1].id = 97;
1998 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001999
2000 // Verify ISAC and VAD are corrected configured on all send channels.
2001 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002002 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002003 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002004 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2005 EXPECT_STREQ("ISAC", gcodec.plname);
2006 EXPECT_TRUE(voe_.GetVAD(channel_num));
2007 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2008 }
2009
2010 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002011 parameters.codecs[0] = kPcmuCodec;
2012 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002013 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002014 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002015 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2016 EXPECT_STREQ("PCMU", gcodec.plname);
2017 EXPECT_FALSE(voe_.GetVAD(channel_num));
2018 }
2019}
2020
2021// Test we can SetSend on all send streams correctly.
2022TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2023 SetupForMultiSendStream();
2024
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002025 // Create the send channels and they should be a SEND_NOTHING date.
solenbergc96df772015-10-21 13:01:53 -07002026 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002027 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002028 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002029 int channel_num = voe_.GetLastChannel();
2030 EXPECT_FALSE(voe_.GetSend(channel_num));
2031 }
2032
2033 // Set the global state for starting sending.
2034 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
solenbergc96df772015-10-21 13:01:53 -07002035 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002036 // Verify that we are in a sending state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002037 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002038 EXPECT_TRUE(voe_.GetSend(channel_num));
2039 }
2040
2041 // Set the global state for stopping sending.
2042 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
solenbergc96df772015-10-21 13:01:53 -07002043 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002044 // Verify that we are in a stop state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002045 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002046 EXPECT_FALSE(voe_.GetSend(channel_num));
2047 }
2048}
2049
2050// Test we can set the correct statistics on all send streams.
2051TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2052 SetupForMultiSendStream();
2053
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002054 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002055 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002056 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002057 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002058 }
solenberg85a04962015-10-27 03:35:21 -07002059 SetAudioSendStreamStats();
2060
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002061 // Create a receive stream to check that none of the send streams end up in
2062 // the receive stream stats.
2063 EXPECT_TRUE(channel_->AddRecvStream(
2064 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002065 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002066 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2067 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002068
solenberg85a04962015-10-27 03:35:21 -07002069 // Check stats for the added streams.
2070 {
2071 cricket::VoiceMediaInfo info;
2072 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002073
solenberg85a04962015-10-27 03:35:21 -07002074 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002075 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002076 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002077 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002078 }
2079
2080 // We have added one receive stream. We should see empty stats.
2081 EXPECT_EQ(info.receivers.size(), 1u);
2082 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002083 }
solenberg1ac56142015-10-13 03:58:19 -07002084
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002085 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002086 {
2087 cricket::VoiceMediaInfo info;
2088 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2089 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002090 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002091 EXPECT_EQ(0u, info.receivers.size());
2092 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002093
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002094 // Deliver a new packet - a default receive stream should be created and we
2095 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002096 {
2097 cricket::VoiceMediaInfo info;
2098 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2099 SetAudioReceiveStreamStats();
2100 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002101 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002102 EXPECT_EQ(1u, info.receivers.size());
2103 VerifyVoiceReceiverInfo(info.receivers[0]);
2104 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002105}
2106
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002107// Test that we can add and remove receive streams, and do proper send/playout.
2108// We can receive on multiple streams while sending one stream.
2109TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002110 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002111 int channel_num1 = voe_.GetLastChannel();
2112
solenberg1ac56142015-10-13 03:58:19 -07002113 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002114 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002115 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002116 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002117
solenberg1ac56142015-10-13 03:58:19 -07002118 // Adding another stream should enable playout on the new stream only.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002119 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2120 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002121 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2122 EXPECT_TRUE(voe_.GetSend(channel_num1));
2123 EXPECT_FALSE(voe_.GetSend(channel_num2));
2124
solenberg1ac56142015-10-13 03:58:19 -07002125 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002126 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2127 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2128
2129 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2130 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2131 int channel_num3 = voe_.GetLastChannel();
2132 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2133 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2134 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2135 EXPECT_FALSE(voe_.GetSend(channel_num3));
2136
2137 // Stop sending.
2138 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2139 EXPECT_FALSE(voe_.GetSend(channel_num1));
2140 EXPECT_FALSE(voe_.GetSend(channel_num2));
2141 EXPECT_FALSE(voe_.GetSend(channel_num3));
2142
2143 // Stop playout.
2144 EXPECT_TRUE(channel_->SetPlayout(false));
2145 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2146 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2147 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2148
solenberg1ac56142015-10-13 03:58:19 -07002149 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002150 EXPECT_TRUE(channel_->SetPlayout(true));
2151 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2152 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2153 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2154
solenberg1ac56142015-10-13 03:58:19 -07002155 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002156 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2157 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002158 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002159}
2160
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002161// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002162// and start sending on it.
2163TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2164 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg246b8172015-12-08 09:50:23 -08002165 cricket::AudioOptions options_adjust_agc;
2166 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002167 int channel_num = voe_.GetLastChannel();
2168 webrtc::AgcConfig agc_config;
2169 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2170 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002171 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002172 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002173 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2174 EXPECT_TRUE(voe_.GetSend(channel_num));
2175 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2176 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002177 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2178 EXPECT_FALSE(voe_.GetSend(channel_num));
2179 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002180}
2181
wu@webrtc.org97077a32013-10-25 21:18:33 +00002182TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002183 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002184 webrtc::AgcConfig agc_config;
2185 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2186 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002187 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2188 send_parameters_.options.tx_agc_digital_compression_gain =
2189 rtc::Optional<uint16_t>(9);
2190 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2191 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2192 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002193 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2194 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2195 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2196 EXPECT_TRUE(agc_config.limiterEnable);
2197
2198 // Check interaction with adjust_agc_delta. Both should be respected, for
2199 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002200 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2201 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002202 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2203 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2204}
2205
wu@webrtc.org97077a32013-10-25 21:18:33 +00002206TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002207 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg246b8172015-12-08 09:50:23 -08002208 send_parameters_.options.recording_sample_rate =
2209 rtc::Optional<uint32_t>(48000);
2210 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2211 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002212
2213 unsigned int recording_sample_rate, playout_sample_rate;
2214 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2215 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2216 EXPECT_EQ(48000u, recording_sample_rate);
2217 EXPECT_EQ(44100u, playout_sample_rate);
2218}
2219
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002220// Test that we can set the outgoing SSRC properly.
2221// SSRC is set in SetupEngine by calling AddSendStream.
2222TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002223 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002224 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002225}
2226
2227TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2228 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002229 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002230 SetAudioSendStreamStats();
solenberg1ac56142015-10-13 03:58:19 -07002231 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2232 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002233 EXPECT_TRUE(channel_->AddRecvStream(
2234 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002235 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2236 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002237
solenberg85a04962015-10-27 03:35:21 -07002238 // Check stats for the added streams.
2239 {
2240 cricket::VoiceMediaInfo info;
2241 EXPECT_EQ(true, channel_->GetStats(&info));
2242
2243 // We have added one send stream. We should see the stats we've set.
2244 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002245 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002246 // We have added one receive stream. We should see empty stats.
2247 EXPECT_EQ(info.receivers.size(), 1u);
2248 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2249 }
solenberg1ac56142015-10-13 03:58:19 -07002250
solenberg566ef242015-11-06 15:34:49 -08002251 // Start sending - this affects some reported stats.
2252 {
2253 cricket::VoiceMediaInfo info;
2254 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2255 EXPECT_EQ(true, channel_->GetStats(&info));
2256 VerifyVoiceSenderInfo(info.senders[0], true);
2257 }
2258
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002259 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002260 {
2261 cricket::VoiceMediaInfo info;
2262 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2263 EXPECT_EQ(true, channel_->GetStats(&info));
2264 EXPECT_EQ(1u, info.senders.size());
2265 EXPECT_EQ(0u, info.receivers.size());
2266 }
solenberg1ac56142015-10-13 03:58:19 -07002267
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002268 // Deliver a new packet - a default receive stream should be created and we
2269 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002270 {
2271 cricket::VoiceMediaInfo info;
2272 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2273 SetAudioReceiveStreamStats();
2274 EXPECT_EQ(true, channel_->GetStats(&info));
2275 EXPECT_EQ(1u, info.senders.size());
2276 EXPECT_EQ(1u, info.receivers.size());
2277 VerifyVoiceReceiverInfo(info.receivers[0]);
2278 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002279}
2280
2281// Test that we can set the outgoing SSRC properly with multiple streams.
2282// SSRC is set in SetupEngine by calling AddSendStream.
2283TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002284 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002285 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002286 EXPECT_TRUE(channel_->AddRecvStream(
2287 cricket::StreamParams::CreateLegacy(kSsrc2)));
2288 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002289}
2290
2291// Test that the local SSRC is the same on sending and receiving channels if the
2292// receive channel is created before the send channel.
2293TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002294 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002295 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002296
2297 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2298 int receive_channel_num = voe_.GetLastChannel();
2299 EXPECT_TRUE(channel_->AddSendStream(
2300 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002301
solenberg3a941542015-11-16 07:34:50 -08002302 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002303 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002304}
2305
2306// Test that we can properly receive packets.
2307TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2308 EXPECT_TRUE(SetupEngine());
solenberg7e63ef02015-11-20 00:19:43 -08002309 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002310 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002311 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002312 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002313}
2314
2315// Test that we can properly receive packets on multiple streams.
2316TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg7e63ef02015-11-20 00:19:43 -08002317 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002318 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2319 int channel_num1 = voe_.GetLastChannel();
2320 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2321 int channel_num2 = voe_.GetLastChannel();
2322 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2323 int channel_num3 = voe_.GetLastChannel();
2324 // Create packets with the right SSRCs.
2325 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002326 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002327 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002328 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002329 }
2330 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2331 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2332 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002333
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002334 DeliverPacket(packets[0], sizeof(packets[0]));
2335 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2336 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2337 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002338
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002339 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002340 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002341 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2342 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002343
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002344 DeliverPacket(packets[2], sizeof(packets[2]));
2345 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002346 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002347 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002348
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002349 DeliverPacket(packets[3], sizeof(packets[3]));
2350 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2351 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002352 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2353
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002354 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2355 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2356 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2357}
2358
solenberg7e63ef02015-11-20 00:19:43 -08002359// Test that receiving on an unsignalled stream works (default channel will be
2360// created).
2361TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
2362 EXPECT_TRUE(SetupEngine());
2363 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2364 int channel_num = voe_.GetLastChannel();
2365 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2366}
2367
2368// Test that receiving on an unsignalled stream works (default channel will be
2369// created), and that packets will be forwarded to the default channel
2370// regardless of their SSRCs.
2371TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
2372 EXPECT_TRUE(SetupEngine());
2373 char packet[sizeof(kPcmuFrame)];
2374 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2375
2376 // Note that the first unknown SSRC cannot be 0, because we only support
2377 // creating receive streams for SSRC!=0.
2378 DeliverPacket(packet, sizeof(packet));
2379 int channel_num = voe_.GetLastChannel();
2380 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2381 // Once we have the default channel, SSRC==0 will be ok.
2382 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2383 rtc::SetBE32(&packet[8], ssrc);
2384 DeliverPacket(packet, sizeof(packet));
2385 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2386 }
2387}
2388
2389// Test that a default channel is created even after a signalled stream has been
2390// added, and that this stream will get any packets for unknown SSRCs.
2391TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
2392 EXPECT_TRUE(SetupEngine());
2393 char packet[sizeof(kPcmuFrame)];
2394 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2395
2396 // Add a known stream, send packet and verify we got it.
2397 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2398 int signalled_channel_num = voe_.GetLastChannel();
2399 DeliverPacket(packet, sizeof(packet));
2400 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2401
2402 // Note that the first unknown SSRC cannot be 0, because we only support
2403 // creating receive streams for SSRC!=0.
2404 rtc::SetBE32(&packet[8], 7011);
2405 DeliverPacket(packet, sizeof(packet));
2406 int channel_num = voe_.GetLastChannel();
2407 EXPECT_NE(channel_num, signalled_channel_num);
2408 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2409 // Once we have the default channel, SSRC==0 will be ok.
2410 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2411 rtc::SetBE32(&packet[8], ssrc);
2412 DeliverPacket(packet, sizeof(packet));
2413 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2414 }
2415}
2416
solenberg0a617e22015-10-20 15:49:38 -07002417// Test that we properly handle failures to add a receive stream.
2418TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
2419 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002420 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002421 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002422}
2423
solenberg0a617e22015-10-20 15:49:38 -07002424// Test that we properly handle failures to add a send stream.
2425TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
2426 EXPECT_TRUE(SetupEngine());
2427 voe_.set_fail_create_channel(true);
2428 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2429}
2430
solenberg1ac56142015-10-13 03:58:19 -07002431// Test that AddRecvStream creates new stream.
2432TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2433 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002434 int channel_num = voe_.GetLastChannel();
2435 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002436 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002437}
2438
2439// Test that after adding a recv stream, we do not decode more codecs than
2440// those previously passed into SetRecvCodecs.
2441TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002442 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002443 cricket::AudioRecvParameters parameters;
2444 parameters.codecs.push_back(kIsacCodec);
2445 parameters.codecs.push_back(kPcmuCodec);
2446 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002447 EXPECT_TRUE(channel_->AddRecvStream(
2448 cricket::StreamParams::CreateLegacy(kSsrc1)));
2449 int channel_num2 = voe_.GetLastChannel();
2450 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002451 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002452 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002453 gcodec.channels = 2;
2454 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2455}
2456
2457// Test that we properly clean up any streams that were added, even if
2458// not explicitly removed.
2459TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002460 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002461 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002462 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2463 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2464 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2465 delete channel_;
2466 channel_ = NULL;
2467 EXPECT_EQ(0, voe_.GetNumChannels());
2468}
2469
wu@webrtc.org78187522013-10-07 23:32:02 +00002470TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002471 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002472 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2473}
2474
2475TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2476 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002477 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002478 // Manually delete channel to simulate a failure.
2479 int channel = voe_.GetLastChannel();
2480 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2481 // Add recv stream 2 should work.
2482 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002483 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002484 EXPECT_NE(channel, new_channel);
2485 // The last created channel is deleted too.
2486 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002487}
2488
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002489// Test the InsertDtmf on default send stream as caller.
2490TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2491 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002492}
2493
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002494// Test the InsertDtmf on default send stream as callee
2495TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2496 TestInsertDtmf(0, false);
2497}
2498
2499// Test the InsertDtmf on specified send stream as caller.
2500TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2501 TestInsertDtmf(kSsrc1, true);
2502}
2503
2504// Test the InsertDtmf on specified send stream as callee.
2505TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2506 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002507}
2508
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002509TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002510 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002511 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002512 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2513 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2514 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2515 EXPECT_TRUE(channel_->SetPlayout(true));
2516 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2517 EXPECT_TRUE(channel_->SetPlayout(false));
2518 EXPECT_FALSE(channel_->SetPlayout(true));
2519}
2520
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002521TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002522 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002523
2524 bool ec_enabled;
2525 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002526 webrtc::AecmModes aecm_mode;
2527 bool cng_enabled;
2528 bool agc_enabled;
2529 webrtc::AgcModes agc_mode;
2530 webrtc::AgcConfig agc_config;
2531 bool ns_enabled;
2532 webrtc::NsModes ns_mode;
2533 bool highpass_filter_enabled;
2534 bool stereo_swapping_enabled;
2535 bool typing_detection_enabled;
2536 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002537 voe_.GetAecmMode(aecm_mode, cng_enabled);
2538 voe_.GetAgcStatus(agc_enabled, agc_mode);
2539 voe_.GetAgcConfig(agc_config);
2540 voe_.GetNsStatus(ns_enabled, ns_mode);
2541 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2542 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2543 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2544 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002545 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002546 EXPECT_FALSE(cng_enabled);
2547 EXPECT_TRUE(agc_enabled);
2548 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2549 EXPECT_TRUE(ns_enabled);
2550 EXPECT_TRUE(highpass_filter_enabled);
2551 EXPECT_FALSE(stereo_swapping_enabled);
2552 EXPECT_TRUE(typing_detection_enabled);
2553 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2554 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002555 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2556 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002557
solenberg246b8172015-12-08 09:50:23 -08002558 // Nothing set in AudioOptions, so everything should be as default.
2559 send_parameters_.options = cricket::AudioOptions();
2560 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002561 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002562 voe_.GetAecmMode(aecm_mode, cng_enabled);
2563 voe_.GetAgcStatus(agc_enabled, agc_mode);
2564 voe_.GetAgcConfig(agc_config);
2565 voe_.GetNsStatus(ns_enabled, ns_mode);
2566 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2567 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2568 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2569 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002570 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002571 EXPECT_FALSE(cng_enabled);
2572 EXPECT_TRUE(agc_enabled);
2573 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2574 EXPECT_TRUE(ns_enabled);
2575 EXPECT_TRUE(highpass_filter_enabled);
2576 EXPECT_FALSE(stereo_swapping_enabled);
2577 EXPECT_TRUE(typing_detection_enabled);
2578 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2579 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002580 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2581 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002582
2583 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002584 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2585 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002586 voe_.GetEcStatus(ec_enabled, ec_mode);
2587 EXPECT_FALSE(ec_enabled);
2588
2589 // Turn echo cancellation back on, with settings, and make sure
2590 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002591 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2592 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002593 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002594 voe_.GetAecmMode(aecm_mode, cng_enabled);
2595 voe_.GetAgcStatus(agc_enabled, agc_mode);
2596 voe_.GetAgcConfig(agc_config);
2597 voe_.GetNsStatus(ns_enabled, ns_mode);
2598 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2599 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2600 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2601 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002602 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002603 EXPECT_TRUE(agc_enabled);
2604 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2605 EXPECT_TRUE(ns_enabled);
2606 EXPECT_TRUE(highpass_filter_enabled);
2607 EXPECT_FALSE(stereo_swapping_enabled);
2608 EXPECT_TRUE(typing_detection_enabled);
2609 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2610 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2611
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002612 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2613 // control.
solenberg246b8172015-12-08 09:50:23 -08002614 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2615 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002616 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002617 voe_.GetAecmMode(aecm_mode, cng_enabled);
2618 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002619 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002620 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2621
2622 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002623 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2624 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2625 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2626 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002627 voe_.GetEcStatus(ec_enabled, ec_mode);
2628 EXPECT_FALSE(ec_enabled);
2629 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002630 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2631 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002632 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002633 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002634 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002635 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2636
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002637 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002638 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2639 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002640 voe_.GetAgcStatus(agc_enabled, agc_mode);
2641 EXPECT_FALSE(agc_enabled);
2642
2643 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002644 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2645 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2646 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002647 voe_.GetAgcStatus(agc_enabled, agc_mode);
2648 EXPECT_TRUE(agc_enabled);
2649 voe_.GetAgcConfig(agc_config);
2650 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2651
2652 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002653 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2654 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2655 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2656 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2657 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002658 voe_.GetNsStatus(ns_enabled, ns_mode);
2659 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2660 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2661 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2662 EXPECT_FALSE(ns_enabled);
2663 EXPECT_FALSE(highpass_filter_enabled);
2664 EXPECT_FALSE(typing_detection_enabled);
2665 EXPECT_TRUE(stereo_swapping_enabled);
2666
solenberg1ac56142015-10-13 03:58:19 -07002667 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002668 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002669 voe_.GetEcStatus(ec_enabled, ec_mode);
2670 voe_.GetNsStatus(ns_enabled, ns_mode);
2671 EXPECT_TRUE(ec_enabled);
2672 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2673 EXPECT_FALSE(ns_enabled);
2674 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2675}
2676
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002677TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002678 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002679
2680 bool ec_enabled;
2681 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002682 bool agc_enabled;
2683 webrtc::AgcModes agc_mode;
2684 bool ns_enabled;
2685 webrtc::NsModes ns_mode;
2686 bool highpass_filter_enabled;
2687 bool stereo_swapping_enabled;
2688 bool typing_detection_enabled;
2689
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002690 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002691 voe_.GetAgcStatus(agc_enabled, agc_mode);
2692 voe_.GetNsStatus(ns_enabled, ns_mode);
2693 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2694 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2695 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2696 EXPECT_TRUE(ec_enabled);
2697 EXPECT_TRUE(agc_enabled);
2698 EXPECT_TRUE(ns_enabled);
2699 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002700 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002701 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002702}
2703
2704TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2705 webrtc::AgcConfig set_config = {0};
2706 set_config.targetLeveldBOv = 3;
2707 set_config.digitalCompressionGaindB = 9;
2708 set_config.limiterEnable = true;
2709 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002710 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002711
2712 webrtc::AgcConfig config = {0};
2713 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2714 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2715 EXPECT_EQ(set_config.digitalCompressionGaindB,
2716 config.digitalCompressionGaindB);
2717 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2718}
2719
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002720TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002721 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg66f43392015-09-09 01:36:22 -07002722 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2723 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002724 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002725 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2726 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002727 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002728
2729 // Have to add a stream to make SetSend work.
2730 cricket::StreamParams stream1;
2731 stream1.ssrcs.push_back(1);
2732 channel1->AddSendStream(stream1);
2733 cricket::StreamParams stream2;
2734 stream2.ssrcs.push_back(2);
2735 channel2->AddSendStream(stream2);
2736
2737 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002738 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002739 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2740 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2741 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002742 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2743 EXPECT_EQ(parameters_options_all.options, channel1->options());
2744 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2745 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002746
2747 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002748 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002749 parameters_options_no_ns.options.noise_suppression =
2750 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002751 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2752 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002753 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2754 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2755 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002756 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002757
2758 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002759 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002760 parameters_options_no_agc.options.auto_gain_control =
2761 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002762 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002763 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2764 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2765 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002766 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002767
solenberg246b8172015-12-08 09:50:23 -08002768 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002769 bool ec_enabled;
2770 webrtc::EcModes ec_mode;
2771 bool agc_enabled;
2772 webrtc::AgcModes agc_mode;
2773 bool ns_enabled;
2774 webrtc::NsModes ns_mode;
2775 voe_.GetEcStatus(ec_enabled, ec_mode);
2776 voe_.GetAgcStatus(agc_enabled, agc_mode);
2777 voe_.GetNsStatus(ns_enabled, ns_mode);
2778 EXPECT_TRUE(ec_enabled);
2779 EXPECT_TRUE(agc_enabled);
2780 EXPECT_TRUE(ns_enabled);
2781
2782 channel1->SetSend(cricket::SEND_MICROPHONE);
2783 voe_.GetEcStatus(ec_enabled, ec_mode);
2784 voe_.GetAgcStatus(agc_enabled, agc_mode);
2785 voe_.GetNsStatus(ns_enabled, ns_mode);
2786 EXPECT_TRUE(ec_enabled);
2787 EXPECT_TRUE(agc_enabled);
2788 EXPECT_FALSE(ns_enabled);
2789
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002790 channel2->SetSend(cricket::SEND_MICROPHONE);
2791 voe_.GetEcStatus(ec_enabled, ec_mode);
2792 voe_.GetAgcStatus(agc_enabled, agc_mode);
2793 voe_.GetNsStatus(ns_enabled, ns_mode);
2794 EXPECT_TRUE(ec_enabled);
2795 EXPECT_FALSE(agc_enabled);
2796 EXPECT_TRUE(ns_enabled);
2797
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002798 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08002799 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002800 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2801 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002802 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01002803 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07002804 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01002805 rtc::Optional<bool>(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002806 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002807 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01002808 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2809 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2810 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002811 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002812 voe_.GetEcStatus(ec_enabled, ec_mode);
2813 voe_.GetAgcStatus(agc_enabled, agc_mode);
2814 voe_.GetNsStatus(ns_enabled, ns_mode);
2815 EXPECT_TRUE(ec_enabled);
2816 EXPECT_FALSE(agc_enabled);
2817 EXPECT_FALSE(ns_enabled);
2818}
2819
wu@webrtc.orgde305012013-10-31 15:40:38 +00002820// This test verifies DSCP settings are properly applied on voice media channel.
2821TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002822 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002823 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002824 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002825 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00002826 new cricket::FakeNetworkInterface);
2827 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002828 cricket::AudioSendParameters parameters = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002829 parameters.options.dscp = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002830 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002831 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00002832 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002833 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002834 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
Karl Wibergbe579832015-11-10 22:34:18 +01002835 parameters.options.dscp = rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002836 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002837 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00002838}
2839
solenberg1ac56142015-10-13 03:58:19 -07002840TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002841 EXPECT_TRUE(SetupEngine());
2842 cricket::WebRtcVoiceMediaChannel* media_channel =
2843 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002844 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2845 EXPECT_TRUE(channel_->AddRecvStream(
2846 cricket::StreamParams::CreateLegacy(kSsrc1)));
2847 int channel_id = voe_.GetLastChannel();
2848 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2849 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2850 EXPECT_TRUE(channel_->AddRecvStream(
2851 cricket::StreamParams::CreateLegacy(kSsrc2)));
2852 int channel_id2 = voe_.GetLastChannel();
2853 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002854}
2855
solenberg1ac56142015-10-13 03:58:19 -07002856TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002857 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002858 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002859 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2860 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2861 EXPECT_TRUE(channel_->AddSendStream(
2862 cricket::StreamParams::CreateLegacy(kSsrc1)));
2863 int channel_id = voe_.GetLastChannel();
2864 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2865 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2866 EXPECT_TRUE(channel_->AddSendStream(
2867 cricket::StreamParams::CreateLegacy(kSsrc2)));
2868 int channel_id2 = voe_.GetLastChannel();
2869 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002870}
2871
solenberg4bac9c52015-10-09 02:32:53 -07002872TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002873 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002874 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002875 cricket::StreamParams stream;
2876 stream.ssrcs.push_back(kSsrc2);
2877 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002878 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002879 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002880 float scale = 0;
2881 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2882 EXPECT_DOUBLE_EQ(3, scale);
2883}
2884
2885TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
2886 EXPECT_TRUE(SetupEngine());
2887 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2888 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2889 int channel_id = voe_.GetLastChannel();
2890 float scale = 0;
2891 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2892 EXPECT_DOUBLE_EQ(2, scale);
2893 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07002894 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002895 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002896}
2897
pbos8fc7fa72015-07-15 08:02:58 -07002898TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02002899 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07002900 const std::string kSyncLabel = "AvSyncLabel";
2901
solenberg1ac56142015-10-13 03:58:19 -07002902 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07002903 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
2904 sp.sync_label = kSyncLabel;
2905 // Creating two channels to make sure that sync label is set properly for both
2906 // the default voice channel and following ones.
2907 EXPECT_TRUE(channel_->AddRecvStream(sp));
2908 sp.ssrcs[0] += 1;
2909 EXPECT_TRUE(channel_->AddRecvStream(sp));
2910
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002911 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07002912 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002913 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002914 << "SyncGroup should be set based on sync_label";
2915 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002916 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002917 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07002918}
2919
pbos6bb1b6e2015-07-24 07:10:18 -07002920TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002921 // Test that changing the combined_audio_video_bwe option results in the
2922 // expected state changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002923 std::vector<uint32_t> ssrcs;
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002924 ssrcs.push_back(223);
2925 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002926
solenberg1ac56142015-10-13 03:58:19 -07002927 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002928 cricket::WebRtcVoiceMediaChannel* media_channel =
2929 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02002930 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002931 EXPECT_TRUE(media_channel->AddRecvStream(
2932 cricket::StreamParams::CreateLegacy(ssrc)));
2933 }
2934 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002935
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002936 // Combined BWE should be disabled.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002937 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002938 const auto* s = call_.GetAudioReceiveStream(ssrc);
2939 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07002940 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002941 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002942
2943 // Enable combined BWE option - now it should be set up.
Karl Wibergbe579832015-11-10 22:34:18 +01002944 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002945 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002946 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002947 const auto* s = call_.GetAudioReceiveStream(ssrc);
2948 EXPECT_NE(nullptr, s);
2949 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
2950 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002951
2952 // Disable combined BWE option - should be disabled again.
Karl Wibergbe579832015-11-10 22:34:18 +01002953 send_parameters_.options.combined_audio_video_bwe =
2954 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002955 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002956 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002957 const auto* s = call_.GetAudioReceiveStream(ssrc);
2958 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07002959 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002960 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002961
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002962 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002963}
2964
pbos6bb1b6e2015-07-24 07:10:18 -07002965TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002966 // Test that adding receive streams after enabling combined bandwidth
2967 // estimation will correctly configure each channel.
solenberg1ac56142015-10-13 03:58:19 -07002968 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002969 cricket::WebRtcVoiceMediaChannel* media_channel =
2970 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01002971 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002972 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002973
solenberg246b8172015-12-08 09:50:23 -08002974 for (uint32_t ssrc : kSsrcs4) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002975 EXPECT_TRUE(media_channel->AddRecvStream(
solenberg246b8172015-12-08 09:50:23 -08002976 cricket::StreamParams::CreateLegacy(ssrc)));
2977 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(ssrc));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002978 }
solenberg246b8172015-12-08 09:50:23 -08002979 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002980}
2981
solenberg3a941542015-11-16 07:34:50 -08002982// TODO(solenberg): Remove, once recv streams are configured through Call.
2983// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07002984TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002985 // Test that setting the header extensions results in the expected state
2986 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002987 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002988 ssrcs.push_back(223);
2989 ssrcs.push_back(224);
2990
solenberg1ac56142015-10-13 03:58:19 -07002991 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002992 cricket::WebRtcVoiceMediaChannel* media_channel =
2993 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01002994 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002995 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002996 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002997 EXPECT_TRUE(media_channel->AddRecvStream(
2998 cricket::StreamParams::CreateLegacy(ssrc)));
2999 }
3000
3001 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003002 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003003 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003004 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003005 EXPECT_NE(nullptr, s);
3006 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3007 }
3008
3009 // Set up receive extensions.
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003010 cricket::RtpCapabilities capabilities = engine_.GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003011 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003012 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003013 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003014 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003015 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003016 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003017 EXPECT_NE(nullptr, s);
3018 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003019 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3020 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003021 for (const auto& s_ext : s_exts) {
3022 if (e_ext.id == s_ext.id) {
3023 EXPECT_EQ(e_ext.uri, s_ext.name);
3024 }
3025 }
3026 }
3027 }
3028
3029 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003030 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003031 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003032 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003033 EXPECT_NE(nullptr, s);
3034 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3035 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003036}
3037
3038TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3039 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003040 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003041 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3042 static const unsigned char kRtcp[] = {
3043 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3044 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3045 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3046 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3047 };
3048 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3049
solenberg1ac56142015-10-13 03:58:19 -07003050 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003051 cricket::WebRtcVoiceMediaChannel* media_channel =
3052 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003053 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003054 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003055 EXPECT_TRUE(media_channel->AddRecvStream(
3056 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3057
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003058 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003059 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003060 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003061 EXPECT_EQ(0, s->received_packets());
3062 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3063 EXPECT_EQ(1, s->received_packets());
3064 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3065 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003066}
Minyue2013aec2015-05-13 14:14:42 +02003067
solenberg0a617e22015-10-20 15:49:38 -07003068// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003069// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003070TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenberg1ac56142015-10-13 03:58:19 -07003071 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003072 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003073 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003074 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3075 int recv_ch = voe_.GetLastChannel();
3076 EXPECT_NE(recv_ch, default_channel);
3077 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3078 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3079 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003080 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3081 recv_ch = voe_.GetLastChannel();
3082 EXPECT_NE(recv_ch, default_channel);
3083 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003084}
3085
3086TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003087 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003088 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003089
3090 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3091 int recv_ch = voe_.GetLastChannel();
3092
3093 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3094 int send_ch = voe_.GetLastChannel();
3095
3096 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3097 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3098 // channel of |recv_ch|.This is not a common case, since, normally, only the
3099 // default channel can be associated. However, the default is not deletable.
3100 // So we force the |recv_ch| to associate with a non-default channel.
3101 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3102 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3103
3104 EXPECT_TRUE(channel_->RemoveSendStream(2));
3105 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3106}
stefan658910c2015-09-03 05:48:32 -07003107
stefan658910c2015-09-03 05:48:32 -07003108// Tests that the library initializes and shuts down properly.
3109TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3110 cricket::WebRtcVoiceEngine engine;
3111 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003112 rtc::scoped_ptr<webrtc::Call> call(
3113 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003114 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003115 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003116 EXPECT_TRUE(channel != nullptr);
3117 delete channel;
3118 engine.Terminate();
3119
3120 // Reinit to catch regression where VoiceEngineObserver reference is lost
3121 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3122 engine.Terminate();
3123}
3124
3125// Tests that the library is configured with the codecs we want.
3126TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003127 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003128 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3129 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0), nullptr));
3130 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3131 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0), nullptr));
3132 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3133 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003134 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003135 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3136 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0), nullptr));
3137 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3138 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0), nullptr));
3139 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3140 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0), nullptr));
3141 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3142 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0), nullptr));
3143 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3144 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0), nullptr));
3145 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3146 cricket::AudioCodec(96, "red", 8000, 0, 1, 0), nullptr));
3147 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3148 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0), nullptr));
3149 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3150 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0), nullptr));
3151 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3152 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0), nullptr));
3153 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3154 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003155 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003156 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3157 cricket::AudioCodec(0, "", 8000, 0, 1, 0), nullptr)); // PCMU
3158 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3159 cricket::AudioCodec(8, "", 8000, 0, 1, 0), nullptr)); // PCMA
3160 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3161 cricket::AudioCodec(9, "", 8000, 0, 1, 0), nullptr)); // G722
3162 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3163 cricket::AudioCodec(13, "", 8000, 0, 1, 0), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003164 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003165 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3166 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003167 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003168 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3169 cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0), nullptr));
3170 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3171 cricket::AudioCodec(88, "", 0, 0, 1, 0), nullptr));
3172 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3173 cricket::AudioCodec(0, "", 0, 0, 2, 0), nullptr));
3174 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3175 cricket::AudioCodec(0, "", 5000, 0, 1, 0), nullptr));
3176 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3177 cricket::AudioCodec(0, "", 0, 5000, 1, 0), nullptr));
3178
stefan658910c2015-09-03 05:48:32 -07003179 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenberg26c8c912015-11-27 04:00:25 -08003180 cricket::WebRtcVoiceEngine engine;
stefan658910c2015-09-03 05:48:32 -07003181 for (std::vector<cricket::AudioCodec>::const_iterator it =
3182 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3183 if (it->name == "CN" && it->clockrate == 16000) {
3184 EXPECT_EQ(105, it->id);
3185 } else if (it->name == "CN" && it->clockrate == 32000) {
3186 EXPECT_EQ(106, it->id);
3187 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3188 EXPECT_EQ(103, it->id);
3189 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3190 EXPECT_EQ(104, it->id);
3191 } else if (it->name == "G722" && it->clockrate == 8000) {
3192 EXPECT_EQ(9, it->id);
3193 } else if (it->name == "telephone-event") {
3194 EXPECT_EQ(126, it->id);
3195 } else if (it->name == "red") {
3196 EXPECT_EQ(127, it->id);
3197 } else if (it->name == "opus") {
3198 EXPECT_EQ(111, it->id);
3199 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3200 EXPECT_EQ("10", it->params.find("minptime")->second);
3201 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3202 EXPECT_EQ("60", it->params.find("maxptime")->second);
3203 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3204 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3205 }
3206 }
stefan658910c2015-09-03 05:48:32 -07003207 engine.Terminate();
3208}
3209
3210// Tests that VoE supports at least 32 channels
3211TEST(WebRtcVoiceEngineTest, Has32Channels) {
3212 cricket::WebRtcVoiceEngine engine;
3213 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003214 rtc::scoped_ptr<webrtc::Call> call(
3215 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003216
3217 cricket::VoiceMediaChannel* channels[32];
3218 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003219 while (num_channels < arraysize(channels)) {
stefan658910c2015-09-03 05:48:32 -07003220 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003221 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003222 if (!channel)
3223 break;
stefan658910c2015-09-03 05:48:32 -07003224 channels[num_channels++] = channel;
3225 }
3226
tfarina5237aaf2015-11-10 23:44:30 -08003227 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003228 EXPECT_EQ(expected, num_channels);
3229
3230 while (num_channels > 0) {
3231 delete channels[--num_channels];
3232 }
stefan658910c2015-09-03 05:48:32 -07003233 engine.Terminate();
3234}
3235
3236// Test that we set our preferred codecs properly.
3237TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3238 cricket::WebRtcVoiceEngine engine;
3239 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003240 rtc::scoped_ptr<webrtc::Call> call(
3241 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003242 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3243 call.get());
3244 cricket::AudioRecvParameters parameters;
3245 parameters.codecs = engine.codecs();
3246 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003247}