blob: 61f17db927c576b30c541a1a5f64c5c57a7b5075 [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
67 engine, // dtmf
henrike@webrtc.org28e20752013-07-10 00:45:36 +000068 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000069 engine, // network
70 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000071 engine) { // volume
72 }
73};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020074} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000075
76class WebRtcVoiceEngineTestFake : public testing::Test {
77 public:
henrike@webrtc.org28e20752013-07-10 00:45:36 +000078 WebRtcVoiceEngineTestFake()
Fredrik Solenberg709ed672015-09-15 12:26:33 +020079 : call_(webrtc::Call::Config()),
solenbergbd138382015-11-20 16:08:07 -080080 engine_(new FakeVoEWrapper(&voe_)),
Jelena Marusicc28a8962015-05-29 15:05:44 +020081 channel_(nullptr) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +020082 send_parameters_.codecs.push_back(kPcmuCodec);
83 recv_parameters_.codecs.push_back(kPcmuCodec);
Karl Wibergbe579832015-11-10 22:34:18 +010084 options_adjust_agc_.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000085 }
solenberg1ac56142015-10-13 03:58:19 -070086 bool SetupEngine() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000087 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000088 return false;
89 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +020090 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +020091 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000092 }
solenberg1ac56142015-10-13 03:58:19 -070093 bool SetupEngineWithRecvStream() {
94 if (!SetupEngine()) {
95 return false;
96 }
97 return channel_->AddRecvStream(
98 cricket::StreamParams::CreateLegacy(kSsrc1));
99 }
100 bool SetupEngineWithSendStream() {
101 if (!SetupEngine()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000102 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000103 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000104 return channel_->AddSendStream(
105 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000106 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000107 void SetupForMultiSendStream() {
solenberg1ac56142015-10-13 03:58:19 -0700108 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700109 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800110 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700111 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700112 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800113 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000114 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000115 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200116 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000117 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000118 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200119 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000120 delete channel_;
121 engine_.Terminate();
122 }
123
solenberg3a941542015-11-16 07:34:50 -0800124 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
125 const auto* send_stream = call_.GetAudioSendStream(ssrc);
126 EXPECT_TRUE(send_stream);
127 return send_stream->GetConfig();
128 }
129
solenberg7add0582015-11-20 09:59:34 -0800130 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
131 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
132 EXPECT_TRUE(recv_stream);
133 return recv_stream->GetConfig();
134 }
135
Peter Boström0c4e06b2015-10-07 12:23:21 +0200136 void TestInsertDtmf(uint32_t ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000137 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200138 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200139 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000140 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700141 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000142 // send stream.
143 EXPECT_TRUE(channel_->AddSendStream(
144 cricket::StreamParams::CreateLegacy(kSsrc1)));
145 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000146
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000147 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200148 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000149 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
150 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800151 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200152 send_parameters_.codecs.push_back(kTelephoneEventCodec);
153 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000154 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000155
156 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700157 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800158 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000159 EXPECT_TRUE(channel_->AddSendStream(
160 cricket::StreamParams::CreateLegacy(kSsrc1)));
161 }
162
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000163 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800164 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000165
166 // Test send
solenberg0a617e22015-10-20 15:49:38 -0700167 int channel_id = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000168 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
solenberg1d63dd02015-12-02 12:35:09 -0800169 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000170 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000171 }
172
173 // Test that send bandwidth is set correctly.
174 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000175 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
176 // |expected_result| is the expected result from SetMaxSendBandwidth().
177 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000178 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000179 int max_bitrate,
180 bool expected_result,
181 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200182 cricket::AudioSendParameters parameters;
183 parameters.codecs.push_back(codec);
184 parameters.max_bandwidth_bps = max_bitrate;
185 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
186
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000187 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000188 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000189 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000190 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000191 }
192
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000193 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenberg0a617e22015-10-20 15:49:38 -0700194 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000195
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000196 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800197 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000198
199 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200200 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000201 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200202 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800203 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000204
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000205 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200206 send_parameters_.extensions.clear();
207 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800208 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000209
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000210 // Ensure extension is set properly.
211 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200212 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
213 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800214 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
215 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
216 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000217
solenberg7add0582015-11-20 09:59:34 -0800218 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000219 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700220 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800221 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
222 call_.GetAudioSendStream(kSsrc2));
223 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
224 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
225 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000226
227 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200228 send_parameters_.codecs.push_back(kPcmuCodec);
229 send_parameters_.extensions.clear();
230 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800231 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
232 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000233 }
234
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000235 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700236 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000237
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000238 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800239 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000240
241 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800242 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000243 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800244 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
245 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000246
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000247 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800248 recv_parameters_.extensions.clear();
249 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
250 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000251
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000252 // Ensure extension is set properly.
253 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800254 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
255 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
256 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
257 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
258 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000259
solenberg7add0582015-11-20 09:59:34 -0800260 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000261 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700262 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800263 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
264 call_.GetAudioReceiveStream(kSsrc2));
265 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
266 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
267 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000268
269 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800270 recv_parameters_.extensions.clear();
271 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
272 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
273 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000274 }
275
solenberg85a04962015-10-27 03:35:21 -0700276 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
277 webrtc::AudioSendStream::Stats stats;
278 stats.local_ssrc = 12;
279 stats.bytes_sent = 345;
280 stats.packets_sent = 678;
281 stats.packets_lost = 9012;
282 stats.fraction_lost = 34.56f;
283 stats.codec_name = "codec_name_send";
284 stats.ext_seqnum = 789;
285 stats.jitter_ms = 12;
286 stats.rtt_ms = 345;
287 stats.audio_level = 678;
288 stats.aec_quality_min = 9.01f;
289 stats.echo_delay_median_ms = 234;
290 stats.echo_delay_std_ms = 567;
291 stats.echo_return_loss = 890;
292 stats.echo_return_loss_enhancement = 1234;
293 stats.typing_noise_detected = true;
294 return stats;
295 }
296 void SetAudioSendStreamStats() {
297 for (auto* s : call_.GetAudioSendStreams()) {
298 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200299 }
solenberg85a04962015-10-27 03:35:21 -0700300 }
solenberg566ef242015-11-06 15:34:49 -0800301 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
302 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700303 const auto stats = GetAudioSendStreamStats();
304 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
305 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
306 EXPECT_EQ(info.packets_sent, stats.packets_sent);
307 EXPECT_EQ(info.packets_lost, stats.packets_lost);
308 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
309 EXPECT_EQ(info.codec_name, stats.codec_name);
310 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
311 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
312 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
313 EXPECT_EQ(info.audio_level, stats.audio_level);
314 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
315 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
316 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
317 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
318 EXPECT_EQ(info.echo_return_loss_enhancement,
319 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800320 EXPECT_EQ(info.typing_noise_detected,
321 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700322 }
323
324 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
325 webrtc::AudioReceiveStream::Stats stats;
326 stats.remote_ssrc = 123;
327 stats.bytes_rcvd = 456;
328 stats.packets_rcvd = 768;
329 stats.packets_lost = 101;
330 stats.fraction_lost = 23.45f;
331 stats.codec_name = "codec_name_recv";
332 stats.ext_seqnum = 678;
333 stats.jitter_ms = 901;
334 stats.jitter_buffer_ms = 234;
335 stats.jitter_buffer_preferred_ms = 567;
336 stats.delay_estimate_ms = 890;
337 stats.audio_level = 1234;
338 stats.expand_rate = 5.67f;
339 stats.speech_expand_rate = 8.90f;
340 stats.secondary_decoded_rate = 1.23f;
341 stats.accelerate_rate = 4.56f;
342 stats.preemptive_expand_rate = 7.89f;
343 stats.decoding_calls_to_silence_generator = 12;
344 stats.decoding_calls_to_neteq = 345;
345 stats.decoding_normal = 67890;
346 stats.decoding_plc = 1234;
347 stats.decoding_cng = 5678;
348 stats.decoding_plc_cng = 9012;
349 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200350 return stats;
351 }
352 void SetAudioReceiveStreamStats() {
353 for (auto* s : call_.GetAudioReceiveStreams()) {
354 s->SetStats(GetAudioReceiveStreamStats());
355 }
356 }
357 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700358 const auto stats = GetAudioReceiveStreamStats();
359 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
360 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
361 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
362 EXPECT_EQ(info.packets_lost, stats.packets_lost);
363 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
364 EXPECT_EQ(info.codec_name, stats.codec_name);
365 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
366 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
367 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200368 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700369 stats.jitter_buffer_preferred_ms);
370 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
371 EXPECT_EQ(info.audio_level, stats.audio_level);
372 EXPECT_EQ(info.expand_rate, stats.expand_rate);
373 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
374 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
375 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
376 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200377 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700378 stats.decoding_calls_to_silence_generator);
379 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
380 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
381 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
382 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
383 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
384 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200385 }
386
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000387 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200388 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000389 cricket::FakeWebRtcVoiceEngine voe_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000390 cricket::WebRtcVoiceEngine engine_;
391 cricket::VoiceMediaChannel* channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000392
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200393 cricket::AudioSendParameters send_parameters_;
394 cricket::AudioRecvParameters recv_parameters_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000395 cricket::AudioOptions options_adjust_agc_;
396};
397
398// Tests that our stub library "works".
399TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
400 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000401 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000402 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000403 engine_.Terminate();
404 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000405}
406
407// Tests that we can create and destroy a channel.
408TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000409 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200410 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200411 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000412}
413
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000414// Tests that the list of supported codecs is created properly and ordered
415// correctly
416TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
417 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
418 ASSERT_FALSE(codecs.empty());
419 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
420 EXPECT_EQ(48000, codecs[0].clockrate);
421 EXPECT_EQ(2, codecs[0].channels);
422 EXPECT_EQ(64000, codecs[0].bitrate);
423 int pref = codecs[0].preference;
424 for (size_t i = 1; i < codecs.size(); ++i) {
425 EXPECT_GT(pref, codecs[i].preference);
426 pref = codecs[i].preference;
427 }
428}
429
430// Tests that we can find codecs by name or id, and that we interpret the
431// clockrate and bitrate fields properly.
432TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
433 cricket::AudioCodec codec;
434 webrtc::CodecInst codec_inst;
435 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800436 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000437 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800438 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000439 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800440 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
441 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000442 // Find ISAC with a different payload id.
443 codec = kIsacCodec;
444 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800445 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000446 EXPECT_EQ(codec.id, codec_inst.pltype);
447 // Find PCMU with a 0 clockrate.
448 codec = kPcmuCodec;
449 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800450 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000451 EXPECT_EQ(codec.id, codec_inst.pltype);
452 EXPECT_EQ(8000, codec_inst.plfreq);
453 // Find PCMU with a 0 bitrate.
454 codec = kPcmuCodec;
455 codec.bitrate = 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(64000, codec_inst.rate);
459 // Find ISAC with an explicit bitrate.
460 codec = kIsacCodec;
461 codec.bitrate = 32000;
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(32000, codec_inst.rate);
465}
466
467// Test that we set our inbound codecs properly, including changing PT.
468TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
469 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200470 cricket::AudioRecvParameters parameters;
471 parameters.codecs.push_back(kIsacCodec);
472 parameters.codecs.push_back(kPcmuCodec);
473 parameters.codecs.push_back(kTelephoneEventCodec);
474 parameters.codecs[0].id = 106; // collide with existing telephone-event
475 parameters.codecs[2].id = 126;
476 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700477 EXPECT_TRUE(channel_->AddRecvStream(
478 cricket::StreamParams::CreateLegacy(kSsrc1)));
479 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000480 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800481 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000482 gcodec.plfreq = 16000;
483 gcodec.channels = 1;
484 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
485 EXPECT_EQ(106, gcodec.pltype);
486 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800487 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000488 gcodec.plfreq = 8000;
489 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
490 EXPECT_EQ(126, gcodec.pltype);
491 EXPECT_STREQ("telephone-event", gcodec.plname);
492}
493
494// Test that we fail to set an unknown inbound codec.
495TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
496 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200497 cricket::AudioRecvParameters parameters;
498 parameters.codecs.push_back(kIsacCodec);
499 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
500 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000501}
502
503// Test that we fail if we have duplicate types in the inbound list.
504TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
505 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200506 cricket::AudioRecvParameters parameters;
507 parameters.codecs.push_back(kIsacCodec);
508 parameters.codecs.push_back(kCn16000Codec);
509 parameters.codecs[1].id = kIsacCodec.id;
510 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000511}
512
513// Test that we can decode OPUS without stereo parameters.
514TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
515 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200516 cricket::AudioRecvParameters parameters;
517 parameters.codecs.push_back(kIsacCodec);
518 parameters.codecs.push_back(kPcmuCodec);
519 parameters.codecs.push_back(kOpusCodec);
520 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000521 EXPECT_TRUE(channel_->AddRecvStream(
522 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700523 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000524 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800525 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000526 // Even without stereo parameters, recv codecs still specify channels = 2.
527 EXPECT_EQ(2, opus.channels);
528 EXPECT_EQ(111, opus.pltype);
529 EXPECT_STREQ("opus", opus.plname);
530 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700531 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000532 EXPECT_EQ(111, opus.pltype);
533}
534
535// Test that we can decode OPUS with stereo = 0.
536TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
537 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200538 cricket::AudioRecvParameters parameters;
539 parameters.codecs.push_back(kIsacCodec);
540 parameters.codecs.push_back(kPcmuCodec);
541 parameters.codecs.push_back(kOpusCodec);
542 parameters.codecs[2].params["stereo"] = "0";
543 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000544 EXPECT_TRUE(channel_->AddRecvStream(
545 cricket::StreamParams::CreateLegacy(kSsrc1)));
546 int channel_num2 = voe_.GetLastChannel();
547 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800548 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000549 // Even when stereo is off, recv codecs still specify channels = 2.
550 EXPECT_EQ(2, opus.channels);
551 EXPECT_EQ(111, opus.pltype);
552 EXPECT_STREQ("opus", opus.plname);
553 opus.pltype = 0;
554 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
555 EXPECT_EQ(111, opus.pltype);
556}
557
558// Test that we can decode OPUS with stereo = 1.
559TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
560 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200561 cricket::AudioRecvParameters parameters;
562 parameters.codecs.push_back(kIsacCodec);
563 parameters.codecs.push_back(kPcmuCodec);
564 parameters.codecs.push_back(kOpusCodec);
565 parameters.codecs[2].params["stereo"] = "1";
566 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000567 EXPECT_TRUE(channel_->AddRecvStream(
568 cricket::StreamParams::CreateLegacy(kSsrc1)));
569 int channel_num2 = voe_.GetLastChannel();
570 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800571 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000572 EXPECT_EQ(2, opus.channels);
573 EXPECT_EQ(111, opus.pltype);
574 EXPECT_STREQ("opus", opus.plname);
575 opus.pltype = 0;
576 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
577 EXPECT_EQ(111, opus.pltype);
578}
579
580// Test that changes to recv codecs are applied to all streams.
581TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
582 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200583 cricket::AudioRecvParameters parameters;
584 parameters.codecs.push_back(kIsacCodec);
585 parameters.codecs.push_back(kPcmuCodec);
586 parameters.codecs.push_back(kTelephoneEventCodec);
587 parameters.codecs[0].id = 106; // collide with existing telephone-event
588 parameters.codecs[2].id = 126;
589 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000590 EXPECT_TRUE(channel_->AddRecvStream(
591 cricket::StreamParams::CreateLegacy(kSsrc1)));
592 int channel_num2 = voe_.GetLastChannel();
593 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800594 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000595 gcodec.plfreq = 16000;
596 gcodec.channels = 1;
597 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
598 EXPECT_EQ(106, gcodec.pltype);
599 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800600 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601 gcodec.plfreq = 8000;
602 gcodec.channels = 1;
603 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
604 EXPECT_EQ(126, gcodec.pltype);
605 EXPECT_STREQ("telephone-event", gcodec.plname);
606}
607
608TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenberg1ac56142015-10-13 03:58:19 -0700609 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200610 cricket::AudioRecvParameters parameters;
611 parameters.codecs.push_back(kIsacCodec);
612 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200613 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000614
615 int channel_num2 = voe_.GetLastChannel();
616 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800617 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000618 gcodec.plfreq = 16000;
619 gcodec.channels = 1;
620 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
621 EXPECT_EQ(106, gcodec.pltype);
622 EXPECT_STREQ("ISAC", gcodec.plname);
623}
624
625// Test that we can apply the same set of codecs again while playing.
626TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700627 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200628 cricket::AudioRecvParameters parameters;
629 parameters.codecs.push_back(kIsacCodec);
630 parameters.codecs.push_back(kCn16000Codec);
631 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000632 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200633 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000634
635 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200636 parameters.codecs[0].id = 127;
637 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
638 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000639 EXPECT_TRUE(voe_.GetPlayout(channel_num));
640}
641
642// Test that we can add a codec while playing.
643TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700644 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200645 cricket::AudioRecvParameters parameters;
646 parameters.codecs.push_back(kIsacCodec);
647 parameters.codecs.push_back(kCn16000Codec);
648 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000649 EXPECT_TRUE(channel_->SetPlayout(true));
650
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200651 parameters.codecs.push_back(kOpusCodec);
652 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
653 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654 EXPECT_TRUE(voe_.GetPlayout(channel_num));
655 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800656 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000657 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
658}
659
660TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenberg1ac56142015-10-13 03:58:19 -0700661 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000663 // Test that when autobw is enabled, bitrate is kept as the default
664 // value. autobw is enabled for the following tests because the target
665 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000666
667 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000668 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000669
670 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000671 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000672
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000673 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000674 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000675}
676
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000677TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700678 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000679
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000680 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000681
682 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000683 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
684 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000685
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000686 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000687 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
688 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000689}
690
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000691TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700692 EXPECT_TRUE(SetupEngineWithSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000693
694 // Test that we can only set a maximum bitrate for a fixed-rate codec
695 // if it's bigger than the fixed rate.
696
697 // PCMU, fixed bitrate == 64000.
698 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
699 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
700 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
701 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
702 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
703 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
704 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
705}
706
707TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -0700708 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200709 const int kDesiredBitrate = 128000;
710 cricket::AudioSendParameters parameters;
711 parameters.codecs = engine_.codecs();
712 parameters.max_bandwidth_bps = kDesiredBitrate;
713 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000714
715 EXPECT_TRUE(channel_->AddSendStream(
716 cricket::StreamParams::CreateLegacy(kSsrc1)));
717
718 int channel_num = voe_.GetLastChannel();
719 webrtc::CodecInst codec;
720 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200721 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000722}
723
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000724// Test that bitrate cannot be set for CBR codecs.
725// Bitrate is ignored if it is higher than the fixed bitrate.
726// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000727TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenberg1ac56142015-10-13 03:58:19 -0700728 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000729
730 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200731 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
732 int channel_num = voe_.GetLastChannel();
733 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000734 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
735 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200736
737 send_parameters_.max_bandwidth_bps = 128000;
738 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000739 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
740 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200741
742 send_parameters_.max_bandwidth_bps = 128;
743 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000744 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
745 EXPECT_EQ(64000, codec.rate);
746}
747
748// Test that we apply codecs properly.
749TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenberg1ac56142015-10-13 03:58:19 -0700750 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200751 cricket::AudioSendParameters parameters;
752 parameters.codecs.push_back(kIsacCodec);
753 parameters.codecs.push_back(kPcmuCodec);
754 parameters.codecs.push_back(kRedCodec);
755 parameters.codecs[0].id = 96;
756 parameters.codecs[0].bitrate = 48000;
757 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000758 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200759 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000760 webrtc::CodecInst gcodec;
761 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
762 EXPECT_EQ(96, gcodec.pltype);
763 EXPECT_EQ(48000, gcodec.rate);
764 EXPECT_STREQ("ISAC", gcodec.plname);
765 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000766 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000767 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
768 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
769 EXPECT_EQ(106, voe_.GetSendTelephoneEventPayloadType(channel_num));
770}
771
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000772// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
773// to apply.
774TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenberg1ac56142015-10-13 03:58:19 -0700775 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200776 cricket::AudioSendParameters parameters;
777 parameters.codecs.push_back(kIsacCodec);
778 parameters.codecs.push_back(kPcmuCodec);
779 parameters.codecs.push_back(kRedCodec);
780 parameters.codecs[0].id = 96;
781 parameters.codecs[0].bitrate = 48000;
782 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000783 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
784 // Calling SetSendCodec again with same codec which is already set.
785 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200786 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000787 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
788}
789
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000790// Verify that G722 is set with 16000 samples per second to WebRTC.
791TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenberg1ac56142015-10-13 03:58:19 -0700792 EXPECT_TRUE(SetupEngineWithSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000793 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200794 cricket::AudioSendParameters parameters;
795 parameters.codecs.push_back(kG722CodecSdp);
796 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000797 webrtc::CodecInst gcodec;
798 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
799 EXPECT_STREQ("G722", gcodec.plname);
800 EXPECT_EQ(1, gcodec.channels);
801 EXPECT_EQ(16000, gcodec.plfreq);
802}
803
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000804// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000805TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenberg1ac56142015-10-13 03:58:19 -0700806 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200807 cricket::AudioSendParameters parameters;
808 parameters.codecs.push_back(kOpusCodec);
809 parameters.codecs[0].bitrate = 0;
810 parameters.codecs[0].clockrate = 50000;
811 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000812}
813
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000814// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000815TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700816 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200817 cricket::AudioSendParameters parameters;
818 parameters.codecs.push_back(kOpusCodec);
819 parameters.codecs[0].bitrate = 0;
820 parameters.codecs[0].channels = 0;
821 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000822}
823
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000824// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000825TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700826 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200827 cricket::AudioSendParameters parameters;
828 parameters.codecs.push_back(kOpusCodec);
829 parameters.codecs[0].bitrate = 0;
830 parameters.codecs[0].channels = 0;
831 parameters.codecs[0].params["stereo"] = "1";
832 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000833}
834
835// Test that if channel is 1 for opus and there's no stereo, we fail.
836TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700837 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200838 cricket::AudioSendParameters parameters;
839 parameters.codecs.push_back(kOpusCodec);
840 parameters.codecs[0].bitrate = 0;
841 parameters.codecs[0].channels = 1;
842 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000843}
844
845// Test that if channel is 1 for opus and stereo=0, we fail.
846TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700847 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200848 cricket::AudioSendParameters parameters;
849 parameters.codecs.push_back(kOpusCodec);
850 parameters.codecs[0].bitrate = 0;
851 parameters.codecs[0].channels = 1;
852 parameters.codecs[0].params["stereo"] = "0";
853 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000854}
855
856// Test that if channel is 1 for opus and stereo=1, we fail.
857TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700858 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200859 cricket::AudioSendParameters parameters;
860 parameters.codecs.push_back(kOpusCodec);
861 parameters.codecs[0].bitrate = 0;
862 parameters.codecs[0].channels = 1;
863 parameters.codecs[0].params["stereo"] = "1";
864 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000865}
866
867// Test that with bitrate=0 and no stereo,
868// channels and bitrate are 1 and 32000.
869TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700870 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000871 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200872 cricket::AudioSendParameters parameters;
873 parameters.codecs.push_back(kOpusCodec);
874 parameters.codecs[0].bitrate = 0;
875 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000876 webrtc::CodecInst gcodec;
877 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
878 EXPECT_STREQ("opus", gcodec.plname);
879 EXPECT_EQ(1, gcodec.channels);
880 EXPECT_EQ(32000, gcodec.rate);
881}
882
883// Test that with bitrate=0 and stereo=0,
884// channels and bitrate are 1 and 32000.
885TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700886 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000887 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200888 cricket::AudioSendParameters parameters;
889 parameters.codecs.push_back(kOpusCodec);
890 parameters.codecs[0].bitrate = 0;
891 parameters.codecs[0].params["stereo"] = "0";
892 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000893 webrtc::CodecInst gcodec;
894 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
895 EXPECT_STREQ("opus", gcodec.plname);
896 EXPECT_EQ(1, gcodec.channels);
897 EXPECT_EQ(32000, gcodec.rate);
898}
899
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000900// Test that with bitrate=invalid and stereo=0,
901// channels and bitrate are 1 and 32000.
902TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700903 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000904 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200905 cricket::AudioSendParameters parameters;
906 parameters.codecs.push_back(kOpusCodec);
907 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000908 webrtc::CodecInst gcodec;
909
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000910 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200911 parameters.codecs[0].bitrate = 5999;
912 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000913 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
914 EXPECT_STREQ("opus", gcodec.plname);
915 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000916 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000917
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200918 parameters.codecs[0].bitrate = 510001;
919 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000920 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
921 EXPECT_STREQ("opus", gcodec.plname);
922 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000923 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000924}
925
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000926// Test that with bitrate=0 and stereo=1,
927// channels and bitrate are 2 and 64000.
928TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700929 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000930 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200931 cricket::AudioSendParameters parameters;
932 parameters.codecs.push_back(kOpusCodec);
933 parameters.codecs[0].bitrate = 0;
934 parameters.codecs[0].params["stereo"] = "1";
935 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000936 webrtc::CodecInst gcodec;
937 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
938 EXPECT_STREQ("opus", gcodec.plname);
939 EXPECT_EQ(2, gcodec.channels);
940 EXPECT_EQ(64000, gcodec.rate);
941}
942
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000943// Test that with bitrate=invalid and stereo=1,
944// channels and bitrate are 2 and 64000.
945TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700946 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000947 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200948 cricket::AudioSendParameters parameters;
949 parameters.codecs.push_back(kOpusCodec);
950 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000951 webrtc::CodecInst gcodec;
952
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000953 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200954 parameters.codecs[0].bitrate = 5999;
955 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000956 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
957 EXPECT_STREQ("opus", gcodec.plname);
958 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000959 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000960
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200961 parameters.codecs[0].bitrate = 510001;
962 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000963 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
964 EXPECT_STREQ("opus", gcodec.plname);
965 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000966 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000967}
968
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000969// Test that with bitrate=N and stereo unset,
970// channels and bitrate are 1 and N.
971TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700972 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000973 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200974 cricket::AudioSendParameters parameters;
975 parameters.codecs.push_back(kOpusCodec);
976 parameters.codecs[0].bitrate = 96000;
977 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000978 webrtc::CodecInst gcodec;
979 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
980 EXPECT_EQ(111, gcodec.pltype);
981 EXPECT_EQ(96000, gcodec.rate);
982 EXPECT_STREQ("opus", gcodec.plname);
983 EXPECT_EQ(1, gcodec.channels);
984 EXPECT_EQ(48000, gcodec.plfreq);
985}
986
987// Test that with bitrate=N and stereo=0,
988// channels and bitrate are 1 and N.
989TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700990 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000991 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200992 cricket::AudioSendParameters parameters;
993 parameters.codecs.push_back(kOpusCodec);
994 parameters.codecs[0].bitrate = 30000;
995 parameters.codecs[0].params["stereo"] = "0";
996 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000997 webrtc::CodecInst gcodec;
998 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
999 EXPECT_EQ(1, gcodec.channels);
1000 EXPECT_EQ(30000, gcodec.rate);
1001 EXPECT_STREQ("opus", gcodec.plname);
1002}
1003
1004// Test that with bitrate=N and without any parameters,
1005// channels and bitrate are 1 and N.
1006TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenberg1ac56142015-10-13 03:58:19 -07001007 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001008 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001009 cricket::AudioSendParameters parameters;
1010 parameters.codecs.push_back(kOpusCodec);
1011 parameters.codecs[0].bitrate = 30000;
1012 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001013 webrtc::CodecInst gcodec;
1014 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1015 EXPECT_EQ(1, gcodec.channels);
1016 EXPECT_EQ(30000, gcodec.rate);
1017 EXPECT_STREQ("opus", gcodec.plname);
1018}
1019
1020// Test that with bitrate=N and stereo=1,
1021// channels and bitrate are 2 and N.
1022TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001023 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001024 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001025 cricket::AudioSendParameters parameters;
1026 parameters.codecs.push_back(kOpusCodec);
1027 parameters.codecs[0].bitrate = 30000;
1028 parameters.codecs[0].params["stereo"] = "1";
1029 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001030 webrtc::CodecInst gcodec;
1031 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1032 EXPECT_EQ(2, gcodec.channels);
1033 EXPECT_EQ(30000, gcodec.rate);
1034 EXPECT_STREQ("opus", gcodec.plname);
1035}
1036
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001037// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1038// Also test that the "maxaveragebitrate" can't be set to values outside the
1039// range of 6000 and 510000
1040TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001041 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001042 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001043 cricket::AudioSendParameters parameters;
1044 parameters.codecs.push_back(kOpusCodec);
1045 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001046 webrtc::CodecInst gcodec;
1047
1048 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001049 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1050 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001051 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001052 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001053
1054 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001055 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
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(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001059
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001060 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1061 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001062 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1063 EXPECT_EQ(200000, gcodec.rate);
1064}
1065
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001066// Test that we can enable NACK with opus as caller.
1067TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001068 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001069 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001070 cricket::AudioSendParameters parameters;
1071 parameters.codecs.push_back(kOpusCodec);
1072 parameters.codecs[0].AddFeedbackParam(
1073 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1074 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001075 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001076 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001077 EXPECT_TRUE(voe_.GetNACK(channel_num));
1078}
1079
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001080// Test that we can enable NACK with opus as callee.
1081TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenberg0a617e22015-10-20 15:49:38 -07001082 EXPECT_TRUE(SetupEngineWithRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001083 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001084 cricket::AudioSendParameters parameters;
1085 parameters.codecs.push_back(kOpusCodec);
1086 parameters.codecs[0].AddFeedbackParam(
1087 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1088 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001089 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001090 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001091 EXPECT_FALSE(voe_.GetNACK(channel_num));
1092
1093 EXPECT_TRUE(channel_->AddSendStream(
1094 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001095 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001096}
1097
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001098// Test that we can enable NACK on receive streams.
1099TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001100 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001101 int channel_num1 = voe_.GetLastChannel();
1102 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1103 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001104 cricket::AudioSendParameters parameters;
1105 parameters.codecs.push_back(kOpusCodec);
1106 parameters.codecs[0].AddFeedbackParam(
1107 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1108 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001109 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1110 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001111 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001112 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1113 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1114}
1115
1116// Test that we can disable NACK.
1117TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001118 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001119 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001120 cricket::AudioSendParameters parameters;
1121 parameters.codecs.push_back(kOpusCodec);
1122 parameters.codecs[0].AddFeedbackParam(
1123 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1124 cricket::kParamValueEmpty));
1125 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001126 EXPECT_TRUE(voe_.GetNACK(channel_num));
1127
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001128 parameters.codecs.clear();
1129 parameters.codecs.push_back(kOpusCodec);
1130 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001131 EXPECT_FALSE(voe_.GetNACK(channel_num));
1132}
1133
1134// Test that we can disable NACK on receive streams.
1135TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001136 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001137 int channel_num1 = voe_.GetLastChannel();
1138 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1139 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001140 cricket::AudioSendParameters parameters;
1141 parameters.codecs.push_back(kOpusCodec);
1142 parameters.codecs[0].AddFeedbackParam(
1143 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1144 cricket::kParamValueEmpty));
1145 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001146 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1147 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1148
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001149 parameters.codecs.clear();
1150 parameters.codecs.push_back(kOpusCodec);
1151 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001152 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1153 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1154}
1155
1156// Test that NACK is enabled on a new receive stream.
1157TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001158 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001159 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001160 cricket::AudioSendParameters parameters;
1161 parameters.codecs.push_back(kIsacCodec);
1162 parameters.codecs.push_back(kCn16000Codec);
1163 parameters.codecs[0].AddFeedbackParam(
1164 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1165 cricket::kParamValueEmpty));
1166 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001167 EXPECT_TRUE(voe_.GetNACK(channel_num));
1168
1169 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1170 channel_num = voe_.GetLastChannel();
1171 EXPECT_TRUE(voe_.GetNACK(channel_num));
1172 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1173 channel_num = voe_.GetLastChannel();
1174 EXPECT_TRUE(voe_.GetNACK(channel_num));
1175}
1176
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001177// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001178TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenberg1ac56142015-10-13 03:58:19 -07001179 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001180 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001181 cricket::AudioSendParameters parameters;
1182 parameters.codecs.push_back(kOpusCodec);
1183 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001184 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1185}
1186
1187// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001188TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001189 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001190 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001191 cricket::AudioSendParameters parameters;
1192 parameters.codecs.push_back(kOpusCodec);
1193 parameters.codecs[0].bitrate = 0;
1194 parameters.codecs[0].params["useinbandfec"] = "0";
1195 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001196 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1197 webrtc::CodecInst gcodec;
1198 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1199 EXPECT_STREQ("opus", gcodec.plname);
1200 EXPECT_EQ(1, gcodec.channels);
1201 EXPECT_EQ(32000, gcodec.rate);
1202}
1203
1204// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001205TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001206 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001207 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001208 cricket::AudioSendParameters parameters;
1209 parameters.codecs.push_back(kOpusCodec);
1210 parameters.codecs[0].bitrate = 0;
1211 parameters.codecs[0].params["useinbandfec"] = "1";
1212 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001213 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1214 webrtc::CodecInst gcodec;
1215 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1216 EXPECT_STREQ("opus", gcodec.plname);
1217 EXPECT_EQ(1, gcodec.channels);
1218 EXPECT_EQ(32000, gcodec.rate);
1219}
1220
1221// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001222TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001223 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001224 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001225 cricket::AudioSendParameters parameters;
1226 parameters.codecs.push_back(kOpusCodec);
1227 parameters.codecs[0].bitrate = 0;
1228 parameters.codecs[0].params["stereo"] = "1";
1229 parameters.codecs[0].params["useinbandfec"] = "1";
1230 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001231 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1232 webrtc::CodecInst gcodec;
1233 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1234 EXPECT_STREQ("opus", gcodec.plname);
1235 EXPECT_EQ(2, gcodec.channels);
1236 EXPECT_EQ(64000, gcodec.rate);
1237}
1238
1239// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001240TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001241 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001242 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001243 cricket::AudioSendParameters parameters;
1244 parameters.codecs.push_back(kIsacCodec);
1245 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001246 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1247}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001248
1249// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1250TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001251 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001252 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001253 cricket::AudioSendParameters parameters;
1254 parameters.codecs.push_back(kIsacCodec);
1255 parameters.codecs[0].params["useinbandfec"] = "1";
1256 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001257 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1258}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001259
1260// Test that Opus FEC status can be changed.
1261TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenberg1ac56142015-10-13 03:58:19 -07001262 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001263 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001264 cricket::AudioSendParameters parameters;
1265 parameters.codecs.push_back(kOpusCodec);
1266 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001267 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001268 parameters.codecs[0].params["useinbandfec"] = "1";
1269 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001270 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1271}
1272
1273// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1274TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenberg1ac56142015-10-13 03:58:19 -07001275 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001276 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001277 cricket::AudioSendParameters parameters;
1278 parameters.codecs.push_back(kOpusCodec);
1279 parameters.codecs[0].bitrate = 0;
1280 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1281 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001282 EXPECT_EQ(cricket::kOpusBandwidthNb,
1283 voe_.GetMaxEncodingBandwidth(channel_num));
1284 webrtc::CodecInst gcodec;
1285 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1286 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001287
1288 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001289 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1290 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001291 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1292 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001293}
1294
1295// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1296TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenberg1ac56142015-10-13 03:58:19 -07001297 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001298 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001299 cricket::AudioSendParameters parameters;
1300 parameters.codecs.push_back(kOpusCodec);
1301 parameters.codecs[0].bitrate = 0;
1302 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1303 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001304 EXPECT_EQ(cricket::kOpusBandwidthMb,
1305 voe_.GetMaxEncodingBandwidth(channel_num));
1306 webrtc::CodecInst gcodec;
1307 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1308 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001309
1310 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001311 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1312 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001313 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1314 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001315}
1316
1317// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1318TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenberg1ac56142015-10-13 03:58:19 -07001319 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001320 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001321 cricket::AudioSendParameters parameters;
1322 parameters.codecs.push_back(kOpusCodec);
1323 parameters.codecs[0].bitrate = 0;
1324 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1325 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001326 EXPECT_EQ(cricket::kOpusBandwidthWb,
1327 voe_.GetMaxEncodingBandwidth(channel_num));
1328 webrtc::CodecInst gcodec;
1329 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1330 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001331
1332 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001333 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1334 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001335 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1336 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001337}
1338
1339// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1340TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenberg1ac56142015-10-13 03:58:19 -07001341 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001342 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001343 cricket::AudioSendParameters parameters;
1344 parameters.codecs.push_back(kOpusCodec);
1345 parameters.codecs[0].bitrate = 0;
1346 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1347 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001348 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1349 voe_.GetMaxEncodingBandwidth(channel_num));
1350 webrtc::CodecInst gcodec;
1351 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1352 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001353
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001354 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001355 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1356 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001357 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1358 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001359}
1360
1361// Test 24000 < maxplaybackrate triggers Opus full band mode.
1362TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenberg1ac56142015-10-13 03:58:19 -07001363 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001364 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001365 cricket::AudioSendParameters parameters;
1366 parameters.codecs.push_back(kOpusCodec);
1367 parameters.codecs[0].bitrate = 0;
1368 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1369 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001370 EXPECT_EQ(cricket::kOpusBandwidthFb,
1371 voe_.GetMaxEncodingBandwidth(channel_num));
1372 webrtc::CodecInst gcodec;
1373 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1374 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001375
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001376 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001377 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1378 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001379 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1380 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001381}
1382
1383// Test Opus that without maxplaybackrate, default playback rate is used.
1384TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001385 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001386 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001387 cricket::AudioSendParameters parameters;
1388 parameters.codecs.push_back(kOpusCodec);
1389 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001390 EXPECT_EQ(cricket::kOpusBandwidthFb,
1391 voe_.GetMaxEncodingBandwidth(channel_num));
1392}
1393
1394// Test the with non-Opus, maxplaybackrate has no effect.
1395TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001396 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001397 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001398 cricket::AudioSendParameters parameters;
1399 parameters.codecs.push_back(kIsacCodec);
1400 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1401 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001402 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1403}
1404
1405// Test maxplaybackrate can be set on two streams.
1406TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001407 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001408 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001409 cricket::AudioSendParameters parameters;
1410 parameters.codecs.push_back(kOpusCodec);
1411 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001412 // Default bandwidth is 24000.
1413 EXPECT_EQ(cricket::kOpusBandwidthFb,
1414 voe_.GetMaxEncodingBandwidth(channel_num));
1415
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001416 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001417
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001418 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001419 EXPECT_EQ(cricket::kOpusBandwidthNb,
1420 voe_.GetMaxEncodingBandwidth(channel_num));
1421
1422 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1423 channel_num = voe_.GetLastChannel();
1424 EXPECT_EQ(cricket::kOpusBandwidthNb,
1425 voe_.GetMaxEncodingBandwidth(channel_num));
1426}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001427
Minyue Li7100dcd2015-03-27 05:05:59 +01001428// Test that with usedtx=0, Opus DTX is off.
1429TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001430 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001431 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001432 cricket::AudioSendParameters parameters;
1433 parameters.codecs.push_back(kOpusCodec);
1434 parameters.codecs[0].params["usedtx"] = "0";
1435 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001436 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1437}
1438
1439// Test that with usedtx=1, Opus DTX is on.
1440TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001441 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001442 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001443 cricket::AudioSendParameters parameters;
1444 parameters.codecs.push_back(kOpusCodec);
1445 parameters.codecs[0].params["usedtx"] = "1";
1446 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001447 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1448 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1449}
1450
1451// Test that usedtx=1 works with stereo Opus.
1452TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001453 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001454 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001455 cricket::AudioSendParameters parameters;
1456 parameters.codecs.push_back(kOpusCodec);
1457 parameters.codecs[0].params["usedtx"] = "1";
1458 parameters.codecs[0].params["stereo"] = "1";
1459 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001460 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1461 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1462}
1463
1464// Test that usedtx=1 does not work with non Opus.
1465TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001466 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001467 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001468 cricket::AudioSendParameters parameters;
1469 parameters.codecs.push_back(kIsacCodec);
1470 parameters.codecs[0].params["usedtx"] = "1";
1471 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001472 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1473}
1474
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001475// Test that we can switch back and forth between Opus and ISAC with CN.
1476TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenberg1ac56142015-10-13 03:58:19 -07001477 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001478 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001479 cricket::AudioSendParameters opus_parameters;
1480 opus_parameters.codecs.push_back(kOpusCodec);
1481 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001482 webrtc::CodecInst gcodec;
1483 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001484 EXPECT_EQ(111, gcodec.pltype);
1485 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001486
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001487 cricket::AudioSendParameters isac_parameters;
1488 isac_parameters.codecs.push_back(kIsacCodec);
1489 isac_parameters.codecs.push_back(kCn16000Codec);
1490 isac_parameters.codecs.push_back(kOpusCodec);
1491 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001492 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1493 EXPECT_EQ(103, gcodec.pltype);
1494 EXPECT_STREQ("ISAC", gcodec.plname);
1495
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001496 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001497 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001498 EXPECT_EQ(111, gcodec.pltype);
1499 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001500}
1501
1502// Test that we handle various ways of specifying bitrate.
1503TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001504 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001505 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001506 cricket::AudioSendParameters parameters;
1507 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1508 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001509 webrtc::CodecInst gcodec;
1510 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1511 EXPECT_EQ(103, gcodec.pltype);
1512 EXPECT_STREQ("ISAC", gcodec.plname);
1513 EXPECT_EQ(32000, gcodec.rate);
1514
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001515 parameters.codecs[0].bitrate = 0; // bitrate == default
1516 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001517 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1518 EXPECT_EQ(103, gcodec.pltype);
1519 EXPECT_STREQ("ISAC", gcodec.plname);
1520 EXPECT_EQ(-1, gcodec.rate);
1521
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001522 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1523 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001524 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1525 EXPECT_EQ(103, gcodec.pltype);
1526 EXPECT_STREQ("ISAC", gcodec.plname);
1527 EXPECT_EQ(28000, gcodec.rate);
1528
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001529 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1530 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001531 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1532 EXPECT_EQ(0, gcodec.pltype);
1533 EXPECT_STREQ("PCMU", gcodec.plname);
1534 EXPECT_EQ(64000, gcodec.rate);
1535
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001536 parameters.codecs[0].bitrate = 0; // bitrate == default
1537 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001538 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1539 EXPECT_EQ(0, gcodec.pltype);
1540 EXPECT_STREQ("PCMU", gcodec.plname);
1541 EXPECT_EQ(64000, gcodec.rate);
1542
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001543 parameters.codecs[0] = kOpusCodec;
1544 parameters.codecs[0].bitrate = 0; // bitrate == default
1545 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001546 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1547 EXPECT_EQ(111, gcodec.pltype);
1548 EXPECT_STREQ("opus", gcodec.plname);
1549 EXPECT_EQ(32000, gcodec.rate);
1550}
1551
Brave Yao5225dd82015-03-26 07:39:19 +08001552// Test that we could set packet size specified in kCodecParamPTime.
1553TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenberg1ac56142015-10-13 03:58:19 -07001554 EXPECT_TRUE(SetupEngineWithSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001555 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001556 cricket::AudioSendParameters parameters;
1557 parameters.codecs.push_back(kOpusCodec);
1558 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1559 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001560 webrtc::CodecInst gcodec;
1561 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1562 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1563
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001564 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1565 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001566 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1567 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1568
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001569 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1570 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001571 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1572 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1573
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001574 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1575 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within 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(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1579
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001580 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1581 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
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(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1585}
1586
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001587// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001588TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenberg1ac56142015-10-13 03:58:19 -07001589 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001590 cricket::AudioSendParameters parameters;
1591 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001592}
1593
1594// Test that we can set send codecs even with telephone-event codec as the first
1595// one on the list.
1596TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001597 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001598 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001599 cricket::AudioSendParameters parameters;
1600 parameters.codecs.push_back(kTelephoneEventCodec);
1601 parameters.codecs.push_back(kIsacCodec);
1602 parameters.codecs.push_back(kPcmuCodec);
1603 parameters.codecs[0].id = 98; // DTMF
1604 parameters.codecs[1].id = 96;
1605 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001606 webrtc::CodecInst gcodec;
1607 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001608 EXPECT_EQ(96, gcodec.pltype);
1609 EXPECT_STREQ("ISAC", gcodec.plname);
1610 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1611}
1612
1613// Test that we can set send codecs even with CN codec as the first
1614// one on the list.
1615TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001616 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001617 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001618 cricket::AudioSendParameters parameters;
1619 parameters.codecs.push_back(kCn16000Codec);
1620 parameters.codecs.push_back(kIsacCodec);
1621 parameters.codecs.push_back(kPcmuCodec);
1622 parameters.codecs[0].id = 98; // wideband CN
1623 parameters.codecs[1].id = 96;
1624 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001625 webrtc::CodecInst gcodec;
1626 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1627 EXPECT_EQ(96, gcodec.pltype);
1628 EXPECT_STREQ("ISAC", gcodec.plname);
1629 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001630}
1631
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001632// Test that we set VAD and DTMF types correctly as caller.
1633TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001634 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001635 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001636 cricket::AudioSendParameters parameters;
1637 parameters.codecs.push_back(kIsacCodec);
1638 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001639 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001640 parameters.codecs.push_back(kCn16000Codec);
1641 parameters.codecs.push_back(kCn8000Codec);
1642 parameters.codecs.push_back(kTelephoneEventCodec);
1643 parameters.codecs.push_back(kRedCodec);
1644 parameters.codecs[0].id = 96;
1645 parameters.codecs[2].id = 97; // wideband CN
1646 parameters.codecs[4].id = 98; // DTMF
1647 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001648 webrtc::CodecInst gcodec;
1649 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1650 EXPECT_EQ(96, gcodec.pltype);
1651 EXPECT_STREQ("ISAC", gcodec.plname);
1652 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001653 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001654 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1655 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1656 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1657}
1658
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001659// Test that we set VAD and DTMF types correctly as callee.
1660TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001661 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001662 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001663 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001664
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001665 cricket::AudioSendParameters parameters;
1666 parameters.codecs.push_back(kIsacCodec);
1667 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001668 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001669 parameters.codecs.push_back(kCn16000Codec);
1670 parameters.codecs.push_back(kCn8000Codec);
1671 parameters.codecs.push_back(kTelephoneEventCodec);
1672 parameters.codecs.push_back(kRedCodec);
1673 parameters.codecs[0].id = 96;
1674 parameters.codecs[2].id = 97; // wideband CN
1675 parameters.codecs[4].id = 98; // DTMF
1676 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001677 EXPECT_TRUE(channel_->AddSendStream(
1678 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001679 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001680
1681 webrtc::CodecInst gcodec;
1682 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1683 EXPECT_EQ(96, gcodec.pltype);
1684 EXPECT_STREQ("ISAC", gcodec.plname);
1685 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001686 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001687 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1688 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1689 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1690}
1691
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001692// Test that we only apply VAD if we have a CN codec that matches the
1693// send codec clockrate.
1694TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenberg1ac56142015-10-13 03:58:19 -07001695 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001696 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001697 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001698 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001699 parameters.codecs.push_back(kIsacCodec);
1700 parameters.codecs.push_back(kCn16000Codec);
1701 parameters.codecs[1].id = 97;
1702 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001703 webrtc::CodecInst gcodec;
1704 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1705 EXPECT_STREQ("ISAC", gcodec.plname);
1706 EXPECT_TRUE(voe_.GetVAD(channel_num));
1707 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1708 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001709 parameters.codecs[0] = kPcmuCodec;
1710 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001711 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1712 EXPECT_STREQ("PCMU", gcodec.plname);
1713 EXPECT_FALSE(voe_.GetVAD(channel_num));
1714 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001715 parameters.codecs[1] = kCn8000Codec;
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_TRUE(voe_.GetVAD(channel_num));
1720 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001721 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001722 parameters.codecs[0] = kIsacCodec;
1723 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001724 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1725 EXPECT_STREQ("ISAC", gcodec.plname);
1726 EXPECT_FALSE(voe_.GetVAD(channel_num));
1727}
1728
1729// Test that we perform case-insensitive matching of codec names.
1730TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenberg1ac56142015-10-13 03:58:19 -07001731 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001732 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001733 cricket::AudioSendParameters parameters;
1734 parameters.codecs.push_back(kIsacCodec);
1735 parameters.codecs.push_back(kPcmuCodec);
1736 parameters.codecs.push_back(kCn16000Codec);
1737 parameters.codecs.push_back(kCn8000Codec);
1738 parameters.codecs.push_back(kTelephoneEventCodec);
1739 parameters.codecs.push_back(kRedCodec);
1740 parameters.codecs[0].name = "iSaC";
1741 parameters.codecs[0].id = 96;
1742 parameters.codecs[2].id = 97; // wideband CN
1743 parameters.codecs[4].id = 98; // DTMF
1744 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001745 webrtc::CodecInst gcodec;
1746 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1747 EXPECT_EQ(96, gcodec.pltype);
1748 EXPECT_STREQ("ISAC", gcodec.plname);
1749 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001750 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001751 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1752 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1753 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1754}
1755
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001756// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001757TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001758 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001759 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001760 cricket::AudioSendParameters parameters;
1761 parameters.codecs.push_back(kRedCodec);
1762 parameters.codecs.push_back(kIsacCodec);
1763 parameters.codecs.push_back(kPcmuCodec);
1764 parameters.codecs[0].id = 127;
1765 parameters.codecs[0].params[""] = "96/96";
1766 parameters.codecs[1].id = 96;
1767 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001768 webrtc::CodecInst gcodec;
1769 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1770 EXPECT_EQ(96, gcodec.pltype);
1771 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001772 EXPECT_TRUE(voe_.GetRED(channel_num));
1773 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001774}
1775
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001776// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001777TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001778 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001779 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001780 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001781
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001782 cricket::AudioSendParameters parameters;
1783 parameters.codecs.push_back(kRedCodec);
1784 parameters.codecs.push_back(kIsacCodec);
1785 parameters.codecs.push_back(kPcmuCodec);
1786 parameters.codecs[0].id = 127;
1787 parameters.codecs[0].params[""] = "96/96";
1788 parameters.codecs[1].id = 96;
1789 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001790 EXPECT_TRUE(channel_->AddSendStream(
1791 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001792 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001793 webrtc::CodecInst gcodec;
1794 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1795 EXPECT_EQ(96, gcodec.pltype);
1796 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001797 EXPECT_TRUE(voe_.GetRED(channel_num));
1798 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001799}
1800
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001801// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001802TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenberg1ac56142015-10-13 03:58:19 -07001803 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001804 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001805 cricket::AudioSendParameters parameters;
1806 parameters.codecs.push_back(kRedCodec);
1807 parameters.codecs.push_back(kIsacCodec);
1808 parameters.codecs.push_back(kPcmuCodec);
1809 parameters.codecs[0].id = 127;
1810 parameters.codecs[1].id = 96;
1811 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001812 webrtc::CodecInst gcodec;
1813 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1814 EXPECT_EQ(96, gcodec.pltype);
1815 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001816 EXPECT_TRUE(voe_.GetRED(channel_num));
1817 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001818}
1819
1820// Test that we ignore RED if the parameters aren't named the way we expect.
1821TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001822 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001823 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001824 cricket::AudioSendParameters parameters;
1825 parameters.codecs.push_back(kRedCodec);
1826 parameters.codecs.push_back(kIsacCodec);
1827 parameters.codecs.push_back(kPcmuCodec);
1828 parameters.codecs[0].id = 127;
1829 parameters.codecs[0].params["ABC"] = "96/96";
1830 parameters.codecs[1].id = 96;
1831 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001832 webrtc::CodecInst gcodec;
1833 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1834 EXPECT_EQ(96, gcodec.pltype);
1835 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001836 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001837}
1838
1839// Test that we ignore RED if it uses different primary/secondary encoding.
1840TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001841 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001842 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001843 cricket::AudioSendParameters parameters;
1844 parameters.codecs.push_back(kRedCodec);
1845 parameters.codecs.push_back(kIsacCodec);
1846 parameters.codecs.push_back(kPcmuCodec);
1847 parameters.codecs[0].id = 127;
1848 parameters.codecs[0].params[""] = "96/0";
1849 parameters.codecs[1].id = 96;
1850 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001851 webrtc::CodecInst gcodec;
1852 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1853 EXPECT_EQ(96, gcodec.pltype);
1854 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001855 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001856}
1857
1858// Test that we ignore RED if it uses more than 2 encodings.
1859TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001860 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001861 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001862 cricket::AudioSendParameters parameters;
1863 parameters.codecs.push_back(kRedCodec);
1864 parameters.codecs.push_back(kIsacCodec);
1865 parameters.codecs.push_back(kPcmuCodec);
1866 parameters.codecs[0].id = 127;
1867 parameters.codecs[0].params[""] = "96/96/96";
1868 parameters.codecs[1].id = 96;
1869 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001870 webrtc::CodecInst gcodec;
1871 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1872 EXPECT_EQ(96, gcodec.pltype);
1873 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001874 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001875}
1876
1877// Test that we ignore RED if it has bogus codec ids.
1878TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001879 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001880 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001881 cricket::AudioSendParameters parameters;
1882 parameters.codecs.push_back(kRedCodec);
1883 parameters.codecs.push_back(kIsacCodec);
1884 parameters.codecs.push_back(kPcmuCodec);
1885 parameters.codecs[0].id = 127;
1886 parameters.codecs[0].params[""] = "ABC/ABC";
1887 parameters.codecs[1].id = 96;
1888 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001889 webrtc::CodecInst gcodec;
1890 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1891 EXPECT_EQ(96, gcodec.pltype);
1892 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001893 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001894}
1895
1896// Test that we ignore RED if it refers to a codec that is not present.
1897TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001898 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001899 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001900 cricket::AudioSendParameters parameters;
1901 parameters.codecs.push_back(kRedCodec);
1902 parameters.codecs.push_back(kIsacCodec);
1903 parameters.codecs.push_back(kPcmuCodec);
1904 parameters.codecs[0].id = 127;
1905 parameters.codecs[0].params[""] = "97/97";
1906 parameters.codecs[1].id = 96;
1907 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001908 webrtc::CodecInst gcodec;
1909 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1910 EXPECT_EQ(96, gcodec.pltype);
1911 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001912 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001913}
1914
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001915// Test support for audio level header extension.
1916TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1917 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001918}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001919TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1920 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1921}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001922
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001923// Test support for absolute send time header extension.
1924TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1925 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1926}
1927TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1928 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001929}
1930
solenberg1ac56142015-10-13 03:58:19 -07001931// Test that we can create a channel and start sending on it.
1932TEST_F(WebRtcVoiceEngineTestFake, Send) {
1933 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001934 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001935 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001936 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1937 EXPECT_TRUE(voe_.GetSend(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001938 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1939 EXPECT_FALSE(voe_.GetSend(channel_num));
solenberg1ac56142015-10-13 03:58:19 -07001940}
1941
1942// Test that we can create a channel and start playing out on it.
1943TEST_F(WebRtcVoiceEngineTestFake, Playout) {
1944 EXPECT_TRUE(SetupEngineWithRecvStream());
1945 int channel_num = voe_.GetLastChannel();
1946 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
1947 EXPECT_TRUE(channel_->SetPlayout(true));
1948 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001949 EXPECT_TRUE(channel_->SetPlayout(false));
1950 EXPECT_FALSE(voe_.GetPlayout(channel_num));
1951}
1952
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001953// Test that we can add and remove send streams.
1954TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
1955 SetupForMultiSendStream();
1956
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001957 // Set the global state for sending.
1958 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1959
solenbergc96df772015-10-21 13:01:53 -07001960 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001961 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07001962 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001963 // Verify that we are in a sending state for all the created streams.
solenberg3a941542015-11-16 07:34:50 -08001964 EXPECT_TRUE(voe_.GetSend(GetSendStreamConfig(ssrc).voe_channel_id));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001965 }
tfarina5237aaf2015-11-10 23:44:30 -08001966 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001967
solenbergc96df772015-10-21 13:01:53 -07001968 // Delete the send streams.
1969 for (uint32_t ssrc : kSsrcs4) {
1970 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08001971 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07001972 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001973 }
solenbergc96df772015-10-21 13:01:53 -07001974 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001975}
1976
1977// Test SetSendCodecs correctly configure the codecs in all send streams.
1978TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
1979 SetupForMultiSendStream();
1980
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001981 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07001982 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001983 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07001984 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001985 }
1986
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001987 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001988 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001989 parameters.codecs.push_back(kIsacCodec);
1990 parameters.codecs.push_back(kCn16000Codec);
1991 parameters.codecs[1].id = 97;
1992 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001993
1994 // Verify ISAC and VAD are corrected configured on all send channels.
1995 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07001996 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08001997 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001998 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1999 EXPECT_STREQ("ISAC", gcodec.plname);
2000 EXPECT_TRUE(voe_.GetVAD(channel_num));
2001 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2002 }
2003
2004 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002005 parameters.codecs[0] = kPcmuCodec;
2006 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002007 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002008 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002009 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2010 EXPECT_STREQ("PCMU", gcodec.plname);
2011 EXPECT_FALSE(voe_.GetVAD(channel_num));
2012 }
2013}
2014
2015// Test we can SetSend on all send streams correctly.
2016TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2017 SetupForMultiSendStream();
2018
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002019 // Create the send channels and they should be a SEND_NOTHING date.
solenbergc96df772015-10-21 13:01:53 -07002020 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002021 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002022 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002023 int channel_num = voe_.GetLastChannel();
2024 EXPECT_FALSE(voe_.GetSend(channel_num));
2025 }
2026
2027 // Set the global state for starting sending.
2028 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
solenbergc96df772015-10-21 13:01:53 -07002029 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002030 // Verify that we are in a sending state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002031 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002032 EXPECT_TRUE(voe_.GetSend(channel_num));
2033 }
2034
2035 // Set the global state for stopping sending.
2036 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
solenbergc96df772015-10-21 13:01:53 -07002037 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002038 // Verify that we are in a stop state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002039 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002040 EXPECT_FALSE(voe_.GetSend(channel_num));
2041 }
2042}
2043
2044// Test we can set the correct statistics on all send streams.
2045TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2046 SetupForMultiSendStream();
2047
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002048 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002049 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002050 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002051 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002052 }
solenberg85a04962015-10-27 03:35:21 -07002053 SetAudioSendStreamStats();
2054
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002055 // Create a receive stream to check that none of the send streams end up in
2056 // the receive stream stats.
2057 EXPECT_TRUE(channel_->AddRecvStream(
2058 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002059 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002060 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2061 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002062
solenberg85a04962015-10-27 03:35:21 -07002063 // Check stats for the added streams.
2064 {
2065 cricket::VoiceMediaInfo info;
2066 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002067
solenberg85a04962015-10-27 03:35:21 -07002068 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002069 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002070 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002071 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002072 }
2073
2074 // We have added one receive stream. We should see empty stats.
2075 EXPECT_EQ(info.receivers.size(), 1u);
2076 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002077 }
solenberg1ac56142015-10-13 03:58:19 -07002078
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002079 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002080 {
2081 cricket::VoiceMediaInfo info;
2082 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2083 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002084 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002085 EXPECT_EQ(0u, info.receivers.size());
2086 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002087
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002088 // Deliver a new packet - a default receive stream should be created and we
2089 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002090 {
2091 cricket::VoiceMediaInfo info;
2092 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2093 SetAudioReceiveStreamStats();
2094 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002095 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002096 EXPECT_EQ(1u, info.receivers.size());
2097 VerifyVoiceReceiverInfo(info.receivers[0]);
2098 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002099}
2100
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002101// Test that we can add and remove receive streams, and do proper send/playout.
2102// We can receive on multiple streams while sending one stream.
2103TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002104 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002105 int channel_num1 = voe_.GetLastChannel();
2106
solenberg1ac56142015-10-13 03:58:19 -07002107 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002108 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002109 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002110 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002111
solenberg1ac56142015-10-13 03:58:19 -07002112 // Adding another stream should enable playout on the new stream only.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002113 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2114 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002115 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2116 EXPECT_TRUE(voe_.GetSend(channel_num1));
2117 EXPECT_FALSE(voe_.GetSend(channel_num2));
2118
solenberg1ac56142015-10-13 03:58:19 -07002119 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002120 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2121 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2122
2123 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2124 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2125 int channel_num3 = voe_.GetLastChannel();
2126 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2127 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2128 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2129 EXPECT_FALSE(voe_.GetSend(channel_num3));
2130
2131 // Stop sending.
2132 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2133 EXPECT_FALSE(voe_.GetSend(channel_num1));
2134 EXPECT_FALSE(voe_.GetSend(channel_num2));
2135 EXPECT_FALSE(voe_.GetSend(channel_num3));
2136
2137 // Stop playout.
2138 EXPECT_TRUE(channel_->SetPlayout(false));
2139 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2140 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2141 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2142
solenberg1ac56142015-10-13 03:58:19 -07002143 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002144 EXPECT_TRUE(channel_->SetPlayout(true));
2145 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2146 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2147 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2148
solenberg1ac56142015-10-13 03:58:19 -07002149 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002150 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2151 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002152 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002153}
2154
2155// Test that we can set the devices to use.
2156TEST_F(WebRtcVoiceEngineTestFake, SetDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002157 EXPECT_TRUE(SetupEngineWithSendStream());
2158 int send_channel = voe_.GetLastChannel();
2159 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2160 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002161 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002162
2163 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2164 cricket::kFakeDefaultDeviceId);
2165 cricket::Device dev(cricket::kFakeDeviceName,
2166 cricket::kFakeDeviceId);
2167
2168 // Test SetDevices() while not sending or playing.
2169 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2170
2171 // Test SetDevices() while sending and playing.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002172 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2173 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002174 EXPECT_TRUE(voe_.GetSend(send_channel));
2175 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002176
2177 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2178
solenberg1ac56142015-10-13 03:58:19 -07002179 EXPECT_TRUE(voe_.GetSend(send_channel));
2180 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002181
2182 // Test that failure to open newly selected devices does not prevent opening
2183 // ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002184 voe_.set_playout_fail_channel(recv_channel);
2185 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002186
2187 EXPECT_FALSE(engine_.SetDevices(&default_dev, &default_dev));
2188
solenberg1ac56142015-10-13 03:58:19 -07002189 EXPECT_FALSE(voe_.GetSend(send_channel));
2190 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002191
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002192 voe_.set_playout_fail_channel(-1);
2193 voe_.set_send_fail_channel(-1);
2194
2195 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2196
solenberg1ac56142015-10-13 03:58:19 -07002197 EXPECT_TRUE(voe_.GetSend(send_channel));
2198 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002199}
2200
2201// Test that we can set the devices to use even if we failed to
2202// open the initial ones.
2203TEST_F(WebRtcVoiceEngineTestFake, SetDevicesWithInitiallyBadDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002204 EXPECT_TRUE(SetupEngineWithSendStream());
2205 int send_channel = voe_.GetLastChannel();
2206 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2207 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002208 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002209
2210 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2211 cricket::kFakeDefaultDeviceId);
2212 cricket::Device dev(cricket::kFakeDeviceName,
2213 cricket::kFakeDeviceId);
2214
2215 // Test that failure to open devices selected before starting
2216 // send/play does not prevent opening newly selected ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002217 voe_.set_playout_fail_channel(recv_channel);
2218 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002219
2220 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2221
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002222 EXPECT_FALSE(channel_->SetSend(cricket::SEND_MICROPHONE));
2223 EXPECT_FALSE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002224 EXPECT_FALSE(voe_.GetSend(send_channel));
2225 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002226
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002227 voe_.set_playout_fail_channel(-1);
2228 voe_.set_send_fail_channel(-1);
2229
2230 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2231
solenberg1ac56142015-10-13 03:58:19 -07002232 EXPECT_TRUE(voe_.GetSend(send_channel));
2233 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002234}
2235
2236// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002237// and start sending on it.
2238TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2239 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002240 int channel_num = voe_.GetLastChannel();
2241 webrtc::AgcConfig agc_config;
2242 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2243 EXPECT_EQ(0, agc_config.targetLeveldBOv);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002244 send_parameters_.options = options_adjust_agc_;
2245 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002246 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2247 EXPECT_TRUE(voe_.GetSend(channel_num));
2248 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2249 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002250 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2251 EXPECT_FALSE(voe_.GetSend(channel_num));
2252 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2253 EXPECT_EQ(0, agc_config.targetLeveldBOv); // level was restored
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002254}
2255
wu@webrtc.org97077a32013-10-25 21:18:33 +00002256TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002257 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002258 webrtc::AgcConfig agc_config;
2259 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2260 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2261
2262 cricket::AudioOptions options;
Karl Wibergbe579832015-11-10 22:34:18 +01002263 options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2264 options.tx_agc_digital_compression_gain = rtc::Optional<uint16_t>(9);
2265 options.tx_agc_limiter = rtc::Optional<bool>(true);
2266 options.auto_gain_control = rtc::Optional<bool>(true);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002267 EXPECT_TRUE(engine_.SetOptions(options));
2268
2269 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2270 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2271 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2272 EXPECT_TRUE(agc_config.limiterEnable);
2273
2274 // Check interaction with adjust_agc_delta. Both should be respected, for
2275 // backwards compatibility.
Karl Wibergbe579832015-11-10 22:34:18 +01002276 options.adjust_agc_delta = rtc::Optional<int>(-10);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002277 EXPECT_TRUE(engine_.SetOptions(options));
2278
2279 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2280 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2281}
2282
wu@webrtc.org97077a32013-10-25 21:18:33 +00002283TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002284 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002285 cricket::AudioOptions options;
Karl Wibergbe579832015-11-10 22:34:18 +01002286 options.recording_sample_rate = rtc::Optional<uint32_t>(48000);
2287 options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002288 EXPECT_TRUE(engine_.SetOptions(options));
2289
2290 unsigned int recording_sample_rate, playout_sample_rate;
2291 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2292 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2293 EXPECT_EQ(48000u, recording_sample_rate);
2294 EXPECT_EQ(44100u, playout_sample_rate);
2295}
2296
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002297// Test that we can set the outgoing SSRC properly.
2298// SSRC is set in SetupEngine by calling AddSendStream.
2299TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002300 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002301 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002302}
2303
2304TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2305 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002306 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002307 SetAudioSendStreamStats();
solenberg1ac56142015-10-13 03:58:19 -07002308 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2309 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002310 EXPECT_TRUE(channel_->AddRecvStream(
2311 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002312 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2313 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002314
solenberg85a04962015-10-27 03:35:21 -07002315 // Check stats for the added streams.
2316 {
2317 cricket::VoiceMediaInfo info;
2318 EXPECT_EQ(true, channel_->GetStats(&info));
2319
2320 // We have added one send stream. We should see the stats we've set.
2321 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002322 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002323 // We have added one receive stream. We should see empty stats.
2324 EXPECT_EQ(info.receivers.size(), 1u);
2325 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2326 }
solenberg1ac56142015-10-13 03:58:19 -07002327
solenberg566ef242015-11-06 15:34:49 -08002328 // Start sending - this affects some reported stats.
2329 {
2330 cricket::VoiceMediaInfo info;
2331 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2332 EXPECT_EQ(true, channel_->GetStats(&info));
2333 VerifyVoiceSenderInfo(info.senders[0], true);
2334 }
2335
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002336 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002337 {
2338 cricket::VoiceMediaInfo info;
2339 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2340 EXPECT_EQ(true, channel_->GetStats(&info));
2341 EXPECT_EQ(1u, info.senders.size());
2342 EXPECT_EQ(0u, info.receivers.size());
2343 }
solenberg1ac56142015-10-13 03:58:19 -07002344
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002345 // Deliver a new packet - a default receive stream should be created and we
2346 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002347 {
2348 cricket::VoiceMediaInfo info;
2349 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2350 SetAudioReceiveStreamStats();
2351 EXPECT_EQ(true, channel_->GetStats(&info));
2352 EXPECT_EQ(1u, info.senders.size());
2353 EXPECT_EQ(1u, info.receivers.size());
2354 VerifyVoiceReceiverInfo(info.receivers[0]);
2355 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002356}
2357
2358// Test that we can set the outgoing SSRC properly with multiple streams.
2359// SSRC is set in SetupEngine by calling AddSendStream.
2360TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002361 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002362 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002363 EXPECT_TRUE(channel_->AddRecvStream(
2364 cricket::StreamParams::CreateLegacy(kSsrc2)));
2365 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002366}
2367
2368// Test that the local SSRC is the same on sending and receiving channels if the
2369// receive channel is created before the send channel.
2370TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002371 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002372 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002373
2374 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2375 int receive_channel_num = voe_.GetLastChannel();
2376 EXPECT_TRUE(channel_->AddSendStream(
2377 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002378
solenberg3a941542015-11-16 07:34:50 -08002379 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002380 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002381}
2382
2383// Test that we can properly receive packets.
2384TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2385 EXPECT_TRUE(SetupEngine());
solenberg7e63ef02015-11-20 00:19:43 -08002386 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002387 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002388 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002389 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002390}
2391
2392// Test that we can properly receive packets on multiple streams.
2393TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg7e63ef02015-11-20 00:19:43 -08002394 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002395 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2396 int channel_num1 = voe_.GetLastChannel();
2397 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2398 int channel_num2 = voe_.GetLastChannel();
2399 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2400 int channel_num3 = voe_.GetLastChannel();
2401 // Create packets with the right SSRCs.
2402 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002403 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002404 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002405 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002406 }
2407 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2408 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2409 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002410
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002411 DeliverPacket(packets[0], sizeof(packets[0]));
2412 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2413 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2414 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002415
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002416 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002417 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002418 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2419 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002420
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002421 DeliverPacket(packets[2], sizeof(packets[2]));
2422 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002423 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002424 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002425
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002426 DeliverPacket(packets[3], sizeof(packets[3]));
2427 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2428 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002429 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2430
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002431 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2432 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2433 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2434}
2435
solenberg7e63ef02015-11-20 00:19:43 -08002436// Test that receiving on an unsignalled stream works (default channel will be
2437// created).
2438TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
2439 EXPECT_TRUE(SetupEngine());
2440 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2441 int channel_num = voe_.GetLastChannel();
2442 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2443}
2444
2445// Test that receiving on an unsignalled stream works (default channel will be
2446// created), and that packets will be forwarded to the default channel
2447// regardless of their SSRCs.
2448TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
2449 EXPECT_TRUE(SetupEngine());
2450 char packet[sizeof(kPcmuFrame)];
2451 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2452
2453 // Note that the first unknown SSRC cannot be 0, because we only support
2454 // creating receive streams for SSRC!=0.
2455 DeliverPacket(packet, sizeof(packet));
2456 int channel_num = voe_.GetLastChannel();
2457 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2458 // Once we have the default channel, SSRC==0 will be ok.
2459 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2460 rtc::SetBE32(&packet[8], ssrc);
2461 DeliverPacket(packet, sizeof(packet));
2462 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2463 }
2464}
2465
2466// Test that a default channel is created even after a signalled stream has been
2467// added, and that this stream will get any packets for unknown SSRCs.
2468TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
2469 EXPECT_TRUE(SetupEngine());
2470 char packet[sizeof(kPcmuFrame)];
2471 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2472
2473 // Add a known stream, send packet and verify we got it.
2474 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2475 int signalled_channel_num = voe_.GetLastChannel();
2476 DeliverPacket(packet, sizeof(packet));
2477 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2478
2479 // Note that the first unknown SSRC cannot be 0, because we only support
2480 // creating receive streams for SSRC!=0.
2481 rtc::SetBE32(&packet[8], 7011);
2482 DeliverPacket(packet, sizeof(packet));
2483 int channel_num = voe_.GetLastChannel();
2484 EXPECT_NE(channel_num, signalled_channel_num);
2485 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2486 // Once we have the default channel, SSRC==0 will be ok.
2487 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2488 rtc::SetBE32(&packet[8], ssrc);
2489 DeliverPacket(packet, sizeof(packet));
2490 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2491 }
2492}
2493
solenberg0a617e22015-10-20 15:49:38 -07002494// Test that we properly handle failures to add a receive stream.
2495TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
2496 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002497 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002498 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002499}
2500
solenberg0a617e22015-10-20 15:49:38 -07002501// Test that we properly handle failures to add a send stream.
2502TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
2503 EXPECT_TRUE(SetupEngine());
2504 voe_.set_fail_create_channel(true);
2505 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2506}
2507
solenberg1ac56142015-10-13 03:58:19 -07002508// Test that AddRecvStream creates new stream.
2509TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2510 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002511 int channel_num = voe_.GetLastChannel();
2512 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002513 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002514}
2515
2516// Test that after adding a recv stream, we do not decode more codecs than
2517// those previously passed into SetRecvCodecs.
2518TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002519 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002520 cricket::AudioRecvParameters parameters;
2521 parameters.codecs.push_back(kIsacCodec);
2522 parameters.codecs.push_back(kPcmuCodec);
2523 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002524 EXPECT_TRUE(channel_->AddRecvStream(
2525 cricket::StreamParams::CreateLegacy(kSsrc1)));
2526 int channel_num2 = voe_.GetLastChannel();
2527 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002528 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002529 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002530 gcodec.channels = 2;
2531 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2532}
2533
2534// Test that we properly clean up any streams that were added, even if
2535// not explicitly removed.
2536TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002537 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002538 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002539 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2540 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2541 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2542 delete channel_;
2543 channel_ = NULL;
2544 EXPECT_EQ(0, voe_.GetNumChannels());
2545}
2546
wu@webrtc.org78187522013-10-07 23:32:02 +00002547TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002548 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002549 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2550}
2551
2552TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2553 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002554 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002555 // Manually delete channel to simulate a failure.
2556 int channel = voe_.GetLastChannel();
2557 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2558 // Add recv stream 2 should work.
2559 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002560 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002561 EXPECT_NE(channel, new_channel);
2562 // The last created channel is deleted too.
2563 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002564}
2565
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002566// Test the InsertDtmf on default send stream as caller.
2567TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2568 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002569}
2570
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002571// Test the InsertDtmf on default send stream as callee
2572TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2573 TestInsertDtmf(0, false);
2574}
2575
2576// Test the InsertDtmf on specified send stream as caller.
2577TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2578 TestInsertDtmf(kSsrc1, true);
2579}
2580
2581// Test the InsertDtmf on specified send stream as callee.
2582TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2583 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002584}
2585
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002586TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002587 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002588 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002589 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2590 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2591 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2592 EXPECT_TRUE(channel_->SetPlayout(true));
2593 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2594 EXPECT_TRUE(channel_->SetPlayout(false));
2595 EXPECT_FALSE(channel_->SetPlayout(true));
2596}
2597
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002598TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002599 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002600
2601 bool ec_enabled;
2602 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002603 webrtc::AecmModes aecm_mode;
2604 bool cng_enabled;
2605 bool agc_enabled;
2606 webrtc::AgcModes agc_mode;
2607 webrtc::AgcConfig agc_config;
2608 bool ns_enabled;
2609 webrtc::NsModes ns_mode;
2610 bool highpass_filter_enabled;
2611 bool stereo_swapping_enabled;
2612 bool typing_detection_enabled;
2613 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002614 voe_.GetAecmMode(aecm_mode, cng_enabled);
2615 voe_.GetAgcStatus(agc_enabled, agc_mode);
2616 voe_.GetAgcConfig(agc_config);
2617 voe_.GetNsStatus(ns_enabled, ns_mode);
2618 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2619 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2620 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2621 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002622 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002623 EXPECT_FALSE(cng_enabled);
2624 EXPECT_TRUE(agc_enabled);
2625 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2626 EXPECT_TRUE(ns_enabled);
2627 EXPECT_TRUE(highpass_filter_enabled);
2628 EXPECT_FALSE(stereo_swapping_enabled);
2629 EXPECT_TRUE(typing_detection_enabled);
2630 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2631 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2632
2633 // Nothing set, so all ignored.
2634 cricket::AudioOptions options;
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002635 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002636 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002637 voe_.GetAecmMode(aecm_mode, cng_enabled);
2638 voe_.GetAgcStatus(agc_enabled, agc_mode);
2639 voe_.GetAgcConfig(agc_config);
2640 voe_.GetNsStatus(ns_enabled, ns_mode);
2641 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2642 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2643 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2644 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002645 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002646 EXPECT_FALSE(cng_enabled);
2647 EXPECT_TRUE(agc_enabled);
2648 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2649 EXPECT_TRUE(ns_enabled);
2650 EXPECT_TRUE(highpass_filter_enabled);
2651 EXPECT_FALSE(stereo_swapping_enabled);
2652 EXPECT_TRUE(typing_detection_enabled);
2653 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2654 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
Henrik Lundin64dad832015-05-11 12:44:23 +02002655 EXPECT_EQ(50, voe_.GetNetEqCapacity()); // From GetDefaultEngineOptions().
Henrik Lundin5263b3c2015-06-01 10:29:41 +02002656 EXPECT_FALSE(
2657 voe_.GetNetEqFastAccelerate()); // From GetDefaultEngineOptions().
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002658
2659 // Turn echo cancellation off
Karl Wibergbe579832015-11-10 22:34:18 +01002660 options.echo_cancellation = rtc::Optional<bool>(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002661 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002662 voe_.GetEcStatus(ec_enabled, ec_mode);
2663 EXPECT_FALSE(ec_enabled);
2664
2665 // Turn echo cancellation back on, with settings, and make sure
2666 // nothing else changed.
Karl Wibergbe579832015-11-10 22:34:18 +01002667 options.echo_cancellation = rtc::Optional<bool>(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002668 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002669 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002670 voe_.GetAecmMode(aecm_mode, cng_enabled);
2671 voe_.GetAgcStatus(agc_enabled, agc_mode);
2672 voe_.GetAgcConfig(agc_config);
2673 voe_.GetNsStatus(ns_enabled, ns_mode);
2674 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2675 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2676 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2677 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002678 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002679 EXPECT_TRUE(agc_enabled);
2680 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2681 EXPECT_TRUE(ns_enabled);
2682 EXPECT_TRUE(highpass_filter_enabled);
2683 EXPECT_FALSE(stereo_swapping_enabled);
2684 EXPECT_TRUE(typing_detection_enabled);
2685 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2686 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2687
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002688 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2689 // control.
Karl Wibergbe579832015-11-10 22:34:18 +01002690 options.delay_agnostic_aec = rtc::Optional<bool>(true);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002691 ASSERT_TRUE(engine_.SetOptions(options));
2692 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002693 voe_.GetAecmMode(aecm_mode, cng_enabled);
2694 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002695 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002696 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2697
2698 // Turn off echo cancellation and delay agnostic aec.
Karl Wibergbe579832015-11-10 22:34:18 +01002699 options.delay_agnostic_aec = rtc::Optional<bool>(false);
2700 options.extended_filter_aec = rtc::Optional<bool>(false);
2701 options.echo_cancellation = rtc::Optional<bool>(false);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002702 ASSERT_TRUE(engine_.SetOptions(options));
2703 voe_.GetEcStatus(ec_enabled, ec_mode);
2704 EXPECT_FALSE(ec_enabled);
2705 // Turning delay agnostic aec back on should also turn on echo cancellation.
Karl Wibergbe579832015-11-10 22:34:18 +01002706 options.delay_agnostic_aec = rtc::Optional<bool>(true);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002707 ASSERT_TRUE(engine_.SetOptions(options));
2708 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002709 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002710 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002711 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2712
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002713 // Turn off AGC
Karl Wibergbe579832015-11-10 22:34:18 +01002714 options.auto_gain_control = rtc::Optional<bool>(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002715 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002716 voe_.GetAgcStatus(agc_enabled, agc_mode);
2717 EXPECT_FALSE(agc_enabled);
2718
2719 // Turn AGC back on
Karl Wibergbe579832015-11-10 22:34:18 +01002720 options.auto_gain_control = rtc::Optional<bool>(true);
2721 options.adjust_agc_delta = rtc::Optional<int>();
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002722 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002723 voe_.GetAgcStatus(agc_enabled, agc_mode);
2724 EXPECT_TRUE(agc_enabled);
2725 voe_.GetAgcConfig(agc_config);
2726 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2727
2728 // Turn off other options (and stereo swapping on).
Karl Wibergbe579832015-11-10 22:34:18 +01002729 options.noise_suppression = rtc::Optional<bool>(false);
2730 options.highpass_filter = rtc::Optional<bool>(false);
2731 options.typing_detection = rtc::Optional<bool>(false);
2732 options.stereo_swapping = rtc::Optional<bool>(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002733 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002734 voe_.GetNsStatus(ns_enabled, ns_mode);
2735 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2736 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2737 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2738 EXPECT_FALSE(ns_enabled);
2739 EXPECT_FALSE(highpass_filter_enabled);
2740 EXPECT_FALSE(typing_detection_enabled);
2741 EXPECT_TRUE(stereo_swapping_enabled);
2742
solenberg1ac56142015-10-13 03:58:19 -07002743 // Set options again to ensure it has no impact.
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002744 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002745 voe_.GetEcStatus(ec_enabled, ec_mode);
2746 voe_.GetNsStatus(ns_enabled, ns_mode);
2747 EXPECT_TRUE(ec_enabled);
2748 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2749 EXPECT_FALSE(ns_enabled);
2750 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2751}
2752
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002753TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002754 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002755
2756 bool ec_enabled;
2757 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002758 bool agc_enabled;
2759 webrtc::AgcModes agc_mode;
2760 bool ns_enabled;
2761 webrtc::NsModes ns_mode;
2762 bool highpass_filter_enabled;
2763 bool stereo_swapping_enabled;
2764 bool typing_detection_enabled;
2765
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002766 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002767 voe_.GetAgcStatus(agc_enabled, agc_mode);
2768 voe_.GetNsStatus(ns_enabled, ns_mode);
2769 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2770 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2771 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2772 EXPECT_TRUE(ec_enabled);
2773 EXPECT_TRUE(agc_enabled);
2774 EXPECT_TRUE(ns_enabled);
2775 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002776 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002777 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002778}
2779
2780TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2781 webrtc::AgcConfig set_config = {0};
2782 set_config.targetLeveldBOv = 3;
2783 set_config.digitalCompressionGaindB = 9;
2784 set_config.limiterEnable = true;
2785 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002786 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002787
2788 webrtc::AgcConfig config = {0};
2789 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2790 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2791 EXPECT_EQ(set_config.digitalCompressionGaindB,
2792 config.digitalCompressionGaindB);
2793 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2794}
2795
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002796TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002797 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg66f43392015-09-09 01:36:22 -07002798 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2799 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002800 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002801 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2802 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002803 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002804
2805 // Have to add a stream to make SetSend work.
2806 cricket::StreamParams stream1;
2807 stream1.ssrcs.push_back(1);
2808 channel1->AddSendStream(stream1);
2809 cricket::StreamParams stream2;
2810 stream2.ssrcs.push_back(2);
2811 channel2->AddSendStream(stream2);
2812
2813 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002814 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002815 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2816 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2817 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002818 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2819 EXPECT_EQ(parameters_options_all.options, channel1->options());
2820 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2821 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002822
2823 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002824 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002825 parameters_options_no_ns.options.noise_suppression =
2826 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002827 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2828 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002829 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2830 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2831 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002832 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002833
2834 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002835 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002836 parameters_options_no_agc.options.auto_gain_control =
2837 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002838 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002839 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2840 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2841 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002842 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002843
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002844 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002845 bool ec_enabled;
2846 webrtc::EcModes ec_mode;
2847 bool agc_enabled;
2848 webrtc::AgcModes agc_mode;
2849 bool ns_enabled;
2850 webrtc::NsModes ns_mode;
2851 voe_.GetEcStatus(ec_enabled, ec_mode);
2852 voe_.GetAgcStatus(agc_enabled, agc_mode);
2853 voe_.GetNsStatus(ns_enabled, ns_mode);
2854 EXPECT_TRUE(ec_enabled);
2855 EXPECT_TRUE(agc_enabled);
2856 EXPECT_TRUE(ns_enabled);
2857
2858 channel1->SetSend(cricket::SEND_MICROPHONE);
2859 voe_.GetEcStatus(ec_enabled, ec_mode);
2860 voe_.GetAgcStatus(agc_enabled, agc_mode);
2861 voe_.GetNsStatus(ns_enabled, ns_mode);
2862 EXPECT_TRUE(ec_enabled);
2863 EXPECT_TRUE(agc_enabled);
2864 EXPECT_FALSE(ns_enabled);
2865
2866 channel1->SetSend(cricket::SEND_NOTHING);
2867 voe_.GetEcStatus(ec_enabled, ec_mode);
2868 voe_.GetAgcStatus(agc_enabled, agc_mode);
2869 voe_.GetNsStatus(ns_enabled, ns_mode);
2870 EXPECT_TRUE(ec_enabled);
2871 EXPECT_TRUE(agc_enabled);
2872 EXPECT_TRUE(ns_enabled);
2873
2874 channel2->SetSend(cricket::SEND_MICROPHONE);
2875 voe_.GetEcStatus(ec_enabled, ec_mode);
2876 voe_.GetAgcStatus(agc_enabled, agc_mode);
2877 voe_.GetNsStatus(ns_enabled, ns_mode);
2878 EXPECT_TRUE(ec_enabled);
2879 EXPECT_FALSE(agc_enabled);
2880 EXPECT_TRUE(ns_enabled);
2881
2882 channel2->SetSend(cricket::SEND_NOTHING);
2883 voe_.GetEcStatus(ec_enabled, ec_mode);
2884 voe_.GetAgcStatus(agc_enabled, agc_mode);
2885 voe_.GetNsStatus(ns_enabled, ns_mode);
2886 EXPECT_TRUE(ec_enabled);
2887 EXPECT_TRUE(agc_enabled);
2888 EXPECT_TRUE(ns_enabled);
2889
2890 // Make sure settings take effect while we are sending.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002891 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
2892 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2893 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002894 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01002895 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07002896 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01002897 rtc::Optional<bool>(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002898 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002899 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01002900 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2901 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2902 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002903 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002904 voe_.GetEcStatus(ec_enabled, ec_mode);
2905 voe_.GetAgcStatus(agc_enabled, agc_mode);
2906 voe_.GetNsStatus(ns_enabled, ns_mode);
2907 EXPECT_TRUE(ec_enabled);
2908 EXPECT_FALSE(agc_enabled);
2909 EXPECT_FALSE(ns_enabled);
2910}
2911
wu@webrtc.orgde305012013-10-31 15:40:38 +00002912// This test verifies DSCP settings are properly applied on voice media channel.
2913TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002914 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002915 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002916 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002917 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00002918 new cricket::FakeNetworkInterface);
2919 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002920 cricket::AudioSendParameters parameters = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002921 parameters.options.dscp = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002922 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002923 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00002924 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002925 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002926 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
Karl Wibergbe579832015-11-10 22:34:18 +01002927 parameters.options.dscp = rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002928 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002929 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00002930}
2931
solenberg1ac56142015-10-13 03:58:19 -07002932TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002933 EXPECT_TRUE(SetupEngine());
2934 cricket::WebRtcVoiceMediaChannel* media_channel =
2935 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002936 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2937 EXPECT_TRUE(channel_->AddRecvStream(
2938 cricket::StreamParams::CreateLegacy(kSsrc1)));
2939 int channel_id = voe_.GetLastChannel();
2940 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2941 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2942 EXPECT_TRUE(channel_->AddRecvStream(
2943 cricket::StreamParams::CreateLegacy(kSsrc2)));
2944 int channel_id2 = voe_.GetLastChannel();
2945 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002946}
2947
solenberg1ac56142015-10-13 03:58:19 -07002948TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002949 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002950 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002951 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2952 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2953 EXPECT_TRUE(channel_->AddSendStream(
2954 cricket::StreamParams::CreateLegacy(kSsrc1)));
2955 int channel_id = voe_.GetLastChannel();
2956 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2957 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2958 EXPECT_TRUE(channel_->AddSendStream(
2959 cricket::StreamParams::CreateLegacy(kSsrc2)));
2960 int channel_id2 = voe_.GetLastChannel();
2961 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002962}
2963
solenberg4bac9c52015-10-09 02:32:53 -07002964TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002965 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002966 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002967 cricket::StreamParams stream;
2968 stream.ssrcs.push_back(kSsrc2);
2969 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002970 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002971 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002972 float scale = 0;
2973 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2974 EXPECT_DOUBLE_EQ(3, scale);
2975}
2976
2977TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
2978 EXPECT_TRUE(SetupEngine());
2979 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2980 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2981 int channel_id = voe_.GetLastChannel();
2982 float scale = 0;
2983 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2984 EXPECT_DOUBLE_EQ(2, scale);
2985 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07002986 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002987 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002988}
2989
pbos8fc7fa72015-07-15 08:02:58 -07002990TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02002991 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07002992 const std::string kSyncLabel = "AvSyncLabel";
2993
solenberg1ac56142015-10-13 03:58:19 -07002994 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07002995 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
2996 sp.sync_label = kSyncLabel;
2997 // Creating two channels to make sure that sync label is set properly for both
2998 // the default voice channel and following ones.
2999 EXPECT_TRUE(channel_->AddRecvStream(sp));
3000 sp.ssrcs[0] += 1;
3001 EXPECT_TRUE(channel_->AddRecvStream(sp));
3002
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003003 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003004 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003005 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003006 << "SyncGroup should be set based on sync_label";
3007 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003008 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003009 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003010}
3011
pbos6bb1b6e2015-07-24 07:10:18 -07003012TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003013 // Test that changing the combined_audio_video_bwe option results in the
3014 // expected state changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003015 std::vector<uint32_t> ssrcs;
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003016 ssrcs.push_back(223);
3017 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003018
solenberg1ac56142015-10-13 03:58:19 -07003019 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003020 cricket::WebRtcVoiceMediaChannel* media_channel =
3021 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02003022 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003023 EXPECT_TRUE(media_channel->AddRecvStream(
3024 cricket::StreamParams::CreateLegacy(ssrc)));
3025 }
3026 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003027
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003028 // Combined BWE should be disabled.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003029 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003030 const auto* s = call_.GetAudioReceiveStream(ssrc);
3031 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07003032 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003033 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003034
3035 // Enable combined BWE option - now it should be set up.
Karl Wibergbe579832015-11-10 22:34:18 +01003036 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003037 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003038 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003039 const auto* s = call_.GetAudioReceiveStream(ssrc);
3040 EXPECT_NE(nullptr, s);
3041 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
3042 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003043
3044 // Disable combined BWE option - should be disabled again.
Karl Wibergbe579832015-11-10 22:34:18 +01003045 send_parameters_.options.combined_audio_video_bwe =
3046 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003047 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003048 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003049 const auto* s = call_.GetAudioReceiveStream(ssrc);
3050 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07003051 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003052 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003053
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003054 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003055}
3056
pbos6bb1b6e2015-07-24 07:10:18 -07003057TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003058 // Test that adding receive streams after enabling combined bandwidth
3059 // estimation will correctly configure each channel.
solenberg1ac56142015-10-13 03:58:19 -07003060 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003061 cricket::WebRtcVoiceMediaChannel* media_channel =
3062 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003063 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003064 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003065
Peter Boström0c4e06b2015-10-07 12:23:21 +02003066 static const uint32_t kSsrcs[] = {1, 2, 3, 4};
tfarina5237aaf2015-11-10 23:44:30 -08003067 for (unsigned int i = 0; i < arraysize(kSsrcs); ++i) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003068 EXPECT_TRUE(media_channel->AddRecvStream(
3069 cricket::StreamParams::CreateLegacy(kSsrcs[i])));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003070 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(kSsrcs[i]));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003071 }
tfarina5237aaf2015-11-10 23:44:30 -08003072 EXPECT_EQ(arraysize(kSsrcs), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003073}
3074
solenberg3a941542015-11-16 07:34:50 -08003075// TODO(solenberg): Remove, once recv streams are configured through Call.
3076// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003077TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003078 // Test that setting the header extensions results in the expected state
3079 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003080 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003081 ssrcs.push_back(223);
3082 ssrcs.push_back(224);
3083
solenberg1ac56142015-10-13 03:58:19 -07003084 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003085 cricket::WebRtcVoiceMediaChannel* media_channel =
3086 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003087 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003088 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003089 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003090 EXPECT_TRUE(media_channel->AddRecvStream(
3091 cricket::StreamParams::CreateLegacy(ssrc)));
3092 }
3093
3094 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003095 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003096 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003097 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003098 EXPECT_NE(nullptr, s);
3099 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3100 }
3101
3102 // Set up receive extensions.
3103 const auto& e_exts = engine_.rtp_header_extensions();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003104 cricket::AudioRecvParameters recv_parameters;
3105 recv_parameters.extensions = e_exts;
3106 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003107 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003108 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003109 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003110 EXPECT_NE(nullptr, s);
3111 const auto& s_exts = s->GetConfig().rtp.extensions;
3112 EXPECT_EQ(e_exts.size(), s_exts.size());
3113 for (const auto& e_ext : e_exts) {
3114 for (const auto& s_ext : s_exts) {
3115 if (e_ext.id == s_ext.id) {
3116 EXPECT_EQ(e_ext.uri, s_ext.name);
3117 }
3118 }
3119 }
3120 }
3121
3122 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003123 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003124 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003125 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003126 EXPECT_NE(nullptr, s);
3127 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3128 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003129}
3130
3131TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3132 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003133 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003134 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3135 static const unsigned char kRtcp[] = {
3136 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3137 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3140 };
3141 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3142
solenberg1ac56142015-10-13 03:58:19 -07003143 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003144 cricket::WebRtcVoiceMediaChannel* media_channel =
3145 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003146 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003147 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003148 EXPECT_TRUE(media_channel->AddRecvStream(
3149 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3150
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003151 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003152 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003153 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003154 EXPECT_EQ(0, s->received_packets());
3155 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3156 EXPECT_EQ(1, s->received_packets());
3157 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3158 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003159}
Minyue2013aec2015-05-13 14:14:42 +02003160
solenberg0a617e22015-10-20 15:49:38 -07003161// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003162// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003163TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenberg1ac56142015-10-13 03:58:19 -07003164 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003165 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003166 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003167 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3168 int recv_ch = voe_.GetLastChannel();
3169 EXPECT_NE(recv_ch, default_channel);
3170 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3171 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3172 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003173 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3174 recv_ch = voe_.GetLastChannel();
3175 EXPECT_NE(recv_ch, default_channel);
3176 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003177}
3178
3179TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003180 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003181 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003182
3183 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3184 int recv_ch = voe_.GetLastChannel();
3185
3186 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3187 int send_ch = voe_.GetLastChannel();
3188
3189 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3190 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3191 // channel of |recv_ch|.This is not a common case, since, normally, only the
3192 // default channel can be associated. However, the default is not deletable.
3193 // So we force the |recv_ch| to associate with a non-default channel.
3194 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3195 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3196
3197 EXPECT_TRUE(channel_->RemoveSendStream(2));
3198 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3199}
stefan658910c2015-09-03 05:48:32 -07003200
3201// Tests for the actual WebRtc VoE library.
3202
3203TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
3204 cricket::WebRtcVoiceEngine engine;
3205 cricket::AudioOptions options = engine.GetOptions();
3206 // The default options should have at least a few things set. We purposefully
3207 // don't check the option values here, though.
kwiberg102c6a62015-10-30 02:47:38 -07003208 EXPECT_TRUE(options.echo_cancellation);
3209 EXPECT_TRUE(options.auto_gain_control);
3210 EXPECT_TRUE(options.noise_suppression);
stefan658910c2015-09-03 05:48:32 -07003211}
3212
3213// Tests that the library initializes and shuts down properly.
3214TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3215 cricket::WebRtcVoiceEngine engine;
3216 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003217 rtc::scoped_ptr<webrtc::Call> call(
3218 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003219 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003220 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003221 EXPECT_TRUE(channel != nullptr);
3222 delete channel;
3223 engine.Terminate();
3224
3225 // Reinit to catch regression where VoiceEngineObserver reference is lost
3226 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3227 engine.Terminate();
3228}
3229
3230// Tests that the library is configured with the codecs we want.
3231TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003232 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003233 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3234 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0), nullptr));
3235 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3236 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0), nullptr));
3237 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3238 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003239 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003240 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3241 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0), nullptr));
3242 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3243 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0), nullptr));
3244 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3245 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0), nullptr));
3246 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3247 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0), nullptr));
3248 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3249 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0), nullptr));
3250 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3251 cricket::AudioCodec(96, "red", 8000, 0, 1, 0), nullptr));
3252 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3253 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0), nullptr));
3254 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3255 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0), nullptr));
3256 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3257 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0), nullptr));
3258 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3259 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003260 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003261 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3262 cricket::AudioCodec(0, "", 8000, 0, 1, 0), nullptr)); // PCMU
3263 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3264 cricket::AudioCodec(8, "", 8000, 0, 1, 0), nullptr)); // PCMA
3265 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3266 cricket::AudioCodec(9, "", 8000, 0, 1, 0), nullptr)); // G722
3267 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3268 cricket::AudioCodec(13, "", 8000, 0, 1, 0), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003269 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003270 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3271 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003272 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003273 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3274 cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0), nullptr));
3275 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3276 cricket::AudioCodec(88, "", 0, 0, 1, 0), nullptr));
3277 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3278 cricket::AudioCodec(0, "", 0, 0, 2, 0), nullptr));
3279 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3280 cricket::AudioCodec(0, "", 5000, 0, 1, 0), nullptr));
3281 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3282 cricket::AudioCodec(0, "", 0, 5000, 1, 0), nullptr));
3283
stefan658910c2015-09-03 05:48:32 -07003284 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenberg26c8c912015-11-27 04:00:25 -08003285 cricket::WebRtcVoiceEngine engine;
stefan658910c2015-09-03 05:48:32 -07003286 for (std::vector<cricket::AudioCodec>::const_iterator it =
3287 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3288 if (it->name == "CN" && it->clockrate == 16000) {
3289 EXPECT_EQ(105, it->id);
3290 } else if (it->name == "CN" && it->clockrate == 32000) {
3291 EXPECT_EQ(106, it->id);
3292 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3293 EXPECT_EQ(103, it->id);
3294 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3295 EXPECT_EQ(104, it->id);
3296 } else if (it->name == "G722" && it->clockrate == 8000) {
3297 EXPECT_EQ(9, it->id);
3298 } else if (it->name == "telephone-event") {
3299 EXPECT_EQ(126, it->id);
3300 } else if (it->name == "red") {
3301 EXPECT_EQ(127, it->id);
3302 } else if (it->name == "opus") {
3303 EXPECT_EQ(111, it->id);
3304 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3305 EXPECT_EQ("10", it->params.find("minptime")->second);
3306 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3307 EXPECT_EQ("60", it->params.find("maxptime")->second);
3308 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3309 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3310 }
3311 }
stefan658910c2015-09-03 05:48:32 -07003312 engine.Terminate();
3313}
3314
3315// Tests that VoE supports at least 32 channels
3316TEST(WebRtcVoiceEngineTest, Has32Channels) {
3317 cricket::WebRtcVoiceEngine engine;
3318 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003319 rtc::scoped_ptr<webrtc::Call> call(
3320 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003321
3322 cricket::VoiceMediaChannel* channels[32];
3323 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003324 while (num_channels < arraysize(channels)) {
stefan658910c2015-09-03 05:48:32 -07003325 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003326 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003327 if (!channel)
3328 break;
stefan658910c2015-09-03 05:48:32 -07003329 channels[num_channels++] = channel;
3330 }
3331
tfarina5237aaf2015-11-10 23:44:30 -08003332 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003333 EXPECT_EQ(expected, num_channels);
3334
3335 while (num_channels > 0) {
3336 delete channels[--num_channels];
3337 }
stefan658910c2015-09-03 05:48:32 -07003338 engine.Terminate();
3339}
3340
3341// Test that we set our preferred codecs properly.
3342TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3343 cricket::WebRtcVoiceEngine engine;
3344 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003345 rtc::scoped_ptr<webrtc::Call> call(
3346 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003347 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3348 call.get());
3349 cricket::AudioRecvParameters parameters;
3350 parameters.codecs = engine.codecs();
3351 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003352}