blob: 73bb9826db9e1361506d5ccddc9854e3998adcf2 [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"
stefanba4c0e42016-02-04 04:12:24 -080032#include "webrtc/p2p/base/faketransportcontroller.h"
33#include "webrtc/test/field_trial.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034#include "talk/media/base/constants.h"
35#include "talk/media/base/fakemediaengine.h"
wu@webrtc.orgde305012013-10-31 15:40:38 +000036#include "talk/media/base/fakenetworkinterface.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000037#include "talk/media/base/fakertp.h"
Fredrik Solenberg4b60c732015-05-07 14:07:48 +020038#include "talk/media/webrtc/fakewebrtccall.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000039#include "talk/media/webrtc/fakewebrtcvoiceengine.h"
40#include "talk/media/webrtc/webrtcvoiceengine.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000041#include "talk/session/media/channel.h"
42
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000043using cricket::kRtpAudioLevelHeaderExtension;
44using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
45
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020046namespace {
47
48const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
49const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
50const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
51const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
52const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
53const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
54const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
55const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
56const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, 0,
57 1, 0);
solenberg85a04962015-10-27 03:35:21 -070058const uint32_t kSsrc1 = 0x99;
59const uint32_t kSsrc2 = 0x98;
60const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000061
62class FakeVoEWrapper : public cricket::VoEWrapper {
63 public:
64 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
65 : cricket::VoEWrapper(engine, // processing
66 engine, // base
67 engine, // codec
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
deadbeef884f5852016-01-15 09:20:04 -080076class FakeAudioSink : public webrtc::AudioSinkInterface {
77 public:
78 void OnData(const Data& audio) override {}
79};
80
henrike@webrtc.org28e20752013-07-10 00:45:36 +000081class WebRtcVoiceEngineTestFake : public testing::Test {
82 public:
stefanba4c0e42016-02-04 04:12:24 -080083 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
84
85 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
Fredrik Solenberg709ed672015-09-15 12:26:33 +020086 : call_(webrtc::Call::Config()),
solenbergbd138382015-11-20 16:08:07 -080087 engine_(new FakeVoEWrapper(&voe_)),
stefanba4c0e42016-02-04 04:12:24 -080088 channel_(nullptr),
89 override_field_trials_(field_trials) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +020090 send_parameters_.codecs.push_back(kPcmuCodec);
91 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000092 }
solenberg1ac56142015-10-13 03:58:19 -070093 bool SetupEngine() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000094 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000095 return false;
96 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +020097 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +020098 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000099 }
solenberg1ac56142015-10-13 03:58:19 -0700100 bool SetupEngineWithRecvStream() {
101 if (!SetupEngine()) {
102 return false;
103 }
104 return channel_->AddRecvStream(
105 cricket::StreamParams::CreateLegacy(kSsrc1));
106 }
107 bool SetupEngineWithSendStream() {
108 if (!SetupEngine()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000109 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000110 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000111 return channel_->AddSendStream(
112 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000113 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000114 void SetupForMultiSendStream() {
solenberg1ac56142015-10-13 03:58:19 -0700115 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700116 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800117 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700118 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700119 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800120 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000121 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000122 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200123 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000124 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000125 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200126 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000127 delete channel_;
128 engine_.Terminate();
129 }
130
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100131 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
132 const auto* send_stream = call_.GetAudioSendStream(ssrc);
133 EXPECT_TRUE(send_stream);
134 return *send_stream;
135 }
136
deadbeef884f5852016-01-15 09:20:04 -0800137 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
138 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
139 EXPECT_TRUE(recv_stream);
140 return *recv_stream;
141 }
142
solenberg3a941542015-11-16 07:34:50 -0800143 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
144 const auto* send_stream = call_.GetAudioSendStream(ssrc);
145 EXPECT_TRUE(send_stream);
146 return send_stream->GetConfig();
147 }
148
solenberg7add0582015-11-20 09:59:34 -0800149 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
150 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
151 EXPECT_TRUE(recv_stream);
152 return recv_stream->GetConfig();
153 }
154
Peter Boström0c4e06b2015-10-07 12:23:21 +0200155 void TestInsertDtmf(uint32_t ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000156 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200157 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200158 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000159 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700160 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000161 // send stream.
162 EXPECT_TRUE(channel_->AddSendStream(
163 cricket::StreamParams::CreateLegacy(kSsrc1)));
164 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000165
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000166 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200167 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000168 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
169 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800170 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200171 send_parameters_.codecs.push_back(kTelephoneEventCodec);
172 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000173 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000174
175 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700176 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800177 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000178 EXPECT_TRUE(channel_->AddSendStream(
179 cricket::StreamParams::CreateLegacy(kSsrc1)));
180 }
181
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000182 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800183 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000184
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100185 // Test send.
186 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
187 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
188 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800189 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100190 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
191 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
192 EXPECT_EQ(2, telephone_event.event_code);
193 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000194 }
195
196 // Test that send bandwidth is set correctly.
197 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000198 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
199 // |expected_result| is the expected result from SetMaxSendBandwidth().
200 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000201 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000202 int max_bitrate,
203 bool expected_result,
204 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200205 cricket::AudioSendParameters parameters;
206 parameters.codecs.push_back(codec);
207 parameters.max_bandwidth_bps = max_bitrate;
208 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
209
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000210 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000211 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000212 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000213 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000214 }
215
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000216 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenberg0a617e22015-10-20 15:49:38 -0700217 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000218
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000219 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800220 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000221
222 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200223 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000224 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200225 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800226 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000227
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000228 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200229 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());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000232
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000233 // Ensure extension is set properly.
234 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200235 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
236 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800237 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
238 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
239 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000240
solenberg7add0582015-11-20 09:59:34 -0800241 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000242 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700243 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800244 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
245 call_.GetAudioSendStream(kSsrc2));
246 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
247 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
248 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000249
250 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200251 send_parameters_.codecs.push_back(kPcmuCodec);
252 send_parameters_.extensions.clear();
253 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800254 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
255 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000256 }
257
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000258 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700259 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000260
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000261 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800262 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000263
264 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800265 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000266 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800267 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
268 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000269
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000270 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800271 recv_parameters_.extensions.clear();
272 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
273 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000274
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000275 // Ensure extension is set properly.
276 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800277 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
278 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
279 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
280 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
281 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000282
solenberg7add0582015-11-20 09:59:34 -0800283 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000284 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700285 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800286 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
287 call_.GetAudioReceiveStream(kSsrc2));
288 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
289 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
290 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000291
292 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800293 recv_parameters_.extensions.clear();
294 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
295 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
296 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000297 }
298
solenberg85a04962015-10-27 03:35:21 -0700299 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
300 webrtc::AudioSendStream::Stats stats;
301 stats.local_ssrc = 12;
302 stats.bytes_sent = 345;
303 stats.packets_sent = 678;
304 stats.packets_lost = 9012;
305 stats.fraction_lost = 34.56f;
306 stats.codec_name = "codec_name_send";
307 stats.ext_seqnum = 789;
308 stats.jitter_ms = 12;
309 stats.rtt_ms = 345;
310 stats.audio_level = 678;
311 stats.aec_quality_min = 9.01f;
312 stats.echo_delay_median_ms = 234;
313 stats.echo_delay_std_ms = 567;
314 stats.echo_return_loss = 890;
315 stats.echo_return_loss_enhancement = 1234;
316 stats.typing_noise_detected = true;
317 return stats;
318 }
319 void SetAudioSendStreamStats() {
320 for (auto* s : call_.GetAudioSendStreams()) {
321 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200322 }
solenberg85a04962015-10-27 03:35:21 -0700323 }
solenberg566ef242015-11-06 15:34:49 -0800324 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
325 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700326 const auto stats = GetAudioSendStreamStats();
327 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
328 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
329 EXPECT_EQ(info.packets_sent, stats.packets_sent);
330 EXPECT_EQ(info.packets_lost, stats.packets_lost);
331 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
332 EXPECT_EQ(info.codec_name, stats.codec_name);
333 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
334 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
335 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
336 EXPECT_EQ(info.audio_level, stats.audio_level);
337 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
338 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
339 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
340 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
341 EXPECT_EQ(info.echo_return_loss_enhancement,
342 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800343 EXPECT_EQ(info.typing_noise_detected,
344 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700345 }
346
347 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
348 webrtc::AudioReceiveStream::Stats stats;
349 stats.remote_ssrc = 123;
350 stats.bytes_rcvd = 456;
351 stats.packets_rcvd = 768;
352 stats.packets_lost = 101;
353 stats.fraction_lost = 23.45f;
354 stats.codec_name = "codec_name_recv";
355 stats.ext_seqnum = 678;
356 stats.jitter_ms = 901;
357 stats.jitter_buffer_ms = 234;
358 stats.jitter_buffer_preferred_ms = 567;
359 stats.delay_estimate_ms = 890;
360 stats.audio_level = 1234;
361 stats.expand_rate = 5.67f;
362 stats.speech_expand_rate = 8.90f;
363 stats.secondary_decoded_rate = 1.23f;
364 stats.accelerate_rate = 4.56f;
365 stats.preemptive_expand_rate = 7.89f;
366 stats.decoding_calls_to_silence_generator = 12;
367 stats.decoding_calls_to_neteq = 345;
368 stats.decoding_normal = 67890;
369 stats.decoding_plc = 1234;
370 stats.decoding_cng = 5678;
371 stats.decoding_plc_cng = 9012;
372 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200373 return stats;
374 }
375 void SetAudioReceiveStreamStats() {
376 for (auto* s : call_.GetAudioReceiveStreams()) {
377 s->SetStats(GetAudioReceiveStreamStats());
378 }
379 }
380 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700381 const auto stats = GetAudioReceiveStreamStats();
382 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
383 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
384 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
385 EXPECT_EQ(info.packets_lost, stats.packets_lost);
386 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
387 EXPECT_EQ(info.codec_name, stats.codec_name);
388 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
389 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
390 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200391 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700392 stats.jitter_buffer_preferred_ms);
393 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
394 EXPECT_EQ(info.audio_level, stats.audio_level);
395 EXPECT_EQ(info.expand_rate, stats.expand_rate);
396 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
397 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
398 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
399 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200400 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700401 stats.decoding_calls_to_silence_generator);
402 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
403 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
404 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
405 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
406 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
407 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200408 }
409
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000410 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200411 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000412 cricket::FakeWebRtcVoiceEngine voe_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000413 cricket::WebRtcVoiceEngine engine_;
414 cricket::VoiceMediaChannel* channel_;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200415 cricket::AudioSendParameters send_parameters_;
416 cricket::AudioRecvParameters recv_parameters_;
stefanba4c0e42016-02-04 04:12:24 -0800417
418 private:
419 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000420};
421
422// Tests that our stub library "works".
423TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
424 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000425 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000426 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000427 engine_.Terminate();
428 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000429}
430
431// Tests that we can create and destroy a channel.
432TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000433 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200434 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200435 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000436}
437
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000438// Tests that the list of supported codecs is created properly and ordered
439// correctly
440TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
441 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
442 ASSERT_FALSE(codecs.empty());
443 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
444 EXPECT_EQ(48000, codecs[0].clockrate);
445 EXPECT_EQ(2, codecs[0].channels);
446 EXPECT_EQ(64000, codecs[0].bitrate);
447 int pref = codecs[0].preference;
448 for (size_t i = 1; i < codecs.size(); ++i) {
449 EXPECT_GT(pref, codecs[i].preference);
450 pref = codecs[i].preference;
451 }
452}
453
stefanba4c0e42016-02-04 04:12:24 -0800454TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
455 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
456 bool opus_found = false;
457 for (cricket::AudioCodec codec : codecs) {
458 if (codec.name == "opus") {
459 EXPECT_TRUE(HasTransportCc(codec));
460 opus_found = true;
461 }
462 }
463 EXPECT_TRUE(opus_found);
464}
465
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000466// Tests that we can find codecs by name or id, and that we interpret the
467// clockrate and bitrate fields properly.
468TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
469 cricket::AudioCodec codec;
470 webrtc::CodecInst codec_inst;
471 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800472 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000473 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800474 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000475 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800476 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
477 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000478 // Find ISAC with a different payload id.
479 codec = kIsacCodec;
480 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800481 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000482 EXPECT_EQ(codec.id, codec_inst.pltype);
483 // Find PCMU with a 0 clockrate.
484 codec = kPcmuCodec;
485 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800486 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000487 EXPECT_EQ(codec.id, codec_inst.pltype);
488 EXPECT_EQ(8000, codec_inst.plfreq);
489 // Find PCMU with a 0 bitrate.
490 codec = kPcmuCodec;
491 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800492 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000493 EXPECT_EQ(codec.id, codec_inst.pltype);
494 EXPECT_EQ(64000, codec_inst.rate);
495 // Find ISAC with an explicit bitrate.
496 codec = kIsacCodec;
497 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800498 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000499 EXPECT_EQ(codec.id, codec_inst.pltype);
500 EXPECT_EQ(32000, codec_inst.rate);
501}
502
503// Test that we set our inbound codecs properly, including changing PT.
504TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
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(kPcmuCodec);
509 parameters.codecs.push_back(kTelephoneEventCodec);
510 parameters.codecs[0].id = 106; // collide with existing telephone-event
511 parameters.codecs[2].id = 126;
512 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700513 EXPECT_TRUE(channel_->AddRecvStream(
514 cricket::StreamParams::CreateLegacy(kSsrc1)));
515 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000516 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800517 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000518 gcodec.plfreq = 16000;
519 gcodec.channels = 1;
520 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
521 EXPECT_EQ(106, gcodec.pltype);
522 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800523 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000524 gcodec.plfreq = 8000;
525 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
526 EXPECT_EQ(126, gcodec.pltype);
527 EXPECT_STREQ("telephone-event", gcodec.plname);
528}
529
530// Test that we fail to set an unknown inbound codec.
531TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
532 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200533 cricket::AudioRecvParameters parameters;
534 parameters.codecs.push_back(kIsacCodec);
535 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
536 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000537}
538
539// Test that we fail if we have duplicate types in the inbound list.
540TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
541 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200542 cricket::AudioRecvParameters parameters;
543 parameters.codecs.push_back(kIsacCodec);
544 parameters.codecs.push_back(kCn16000Codec);
545 parameters.codecs[1].id = kIsacCodec.id;
546 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000547}
548
549// Test that we can decode OPUS without stereo parameters.
550TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
551 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200552 cricket::AudioRecvParameters parameters;
553 parameters.codecs.push_back(kIsacCodec);
554 parameters.codecs.push_back(kPcmuCodec);
555 parameters.codecs.push_back(kOpusCodec);
556 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000557 EXPECT_TRUE(channel_->AddRecvStream(
558 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700559 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000560 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800561 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000562 // Even without stereo parameters, recv codecs still specify channels = 2.
563 EXPECT_EQ(2, opus.channels);
564 EXPECT_EQ(111, opus.pltype);
565 EXPECT_STREQ("opus", opus.plname);
566 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700567 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000568 EXPECT_EQ(111, opus.pltype);
569}
570
571// Test that we can decode OPUS with stereo = 0.
572TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
573 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200574 cricket::AudioRecvParameters parameters;
575 parameters.codecs.push_back(kIsacCodec);
576 parameters.codecs.push_back(kPcmuCodec);
577 parameters.codecs.push_back(kOpusCodec);
578 parameters.codecs[2].params["stereo"] = "0";
579 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000580 EXPECT_TRUE(channel_->AddRecvStream(
581 cricket::StreamParams::CreateLegacy(kSsrc1)));
582 int channel_num2 = voe_.GetLastChannel();
583 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800584 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000585 // Even when stereo is off, recv codecs still specify channels = 2.
586 EXPECT_EQ(2, opus.channels);
587 EXPECT_EQ(111, opus.pltype);
588 EXPECT_STREQ("opus", opus.plname);
589 opus.pltype = 0;
590 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
591 EXPECT_EQ(111, opus.pltype);
592}
593
594// Test that we can decode OPUS with stereo = 1.
595TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
596 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200597 cricket::AudioRecvParameters parameters;
598 parameters.codecs.push_back(kIsacCodec);
599 parameters.codecs.push_back(kPcmuCodec);
600 parameters.codecs.push_back(kOpusCodec);
601 parameters.codecs[2].params["stereo"] = "1";
602 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000603 EXPECT_TRUE(channel_->AddRecvStream(
604 cricket::StreamParams::CreateLegacy(kSsrc1)));
605 int channel_num2 = voe_.GetLastChannel();
606 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800607 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000608 EXPECT_EQ(2, opus.channels);
609 EXPECT_EQ(111, opus.pltype);
610 EXPECT_STREQ("opus", opus.plname);
611 opus.pltype = 0;
612 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
613 EXPECT_EQ(111, opus.pltype);
614}
615
616// Test that changes to recv codecs are applied to all streams.
617TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
618 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200619 cricket::AudioRecvParameters parameters;
620 parameters.codecs.push_back(kIsacCodec);
621 parameters.codecs.push_back(kPcmuCodec);
622 parameters.codecs.push_back(kTelephoneEventCodec);
623 parameters.codecs[0].id = 106; // collide with existing telephone-event
624 parameters.codecs[2].id = 126;
625 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000626 EXPECT_TRUE(channel_->AddRecvStream(
627 cricket::StreamParams::CreateLegacy(kSsrc1)));
628 int channel_num2 = voe_.GetLastChannel();
629 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800630 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631 gcodec.plfreq = 16000;
632 gcodec.channels = 1;
633 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
634 EXPECT_EQ(106, gcodec.pltype);
635 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800636 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000637 gcodec.plfreq = 8000;
638 gcodec.channels = 1;
639 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
640 EXPECT_EQ(126, gcodec.pltype);
641 EXPECT_STREQ("telephone-event", gcodec.plname);
642}
643
644TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenberg1ac56142015-10-13 03:58:19 -0700645 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200646 cricket::AudioRecvParameters parameters;
647 parameters.codecs.push_back(kIsacCodec);
648 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200649 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000650
651 int channel_num2 = voe_.GetLastChannel();
652 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800653 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654 gcodec.plfreq = 16000;
655 gcodec.channels = 1;
656 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
657 EXPECT_EQ(106, gcodec.pltype);
658 EXPECT_STREQ("ISAC", gcodec.plname);
659}
660
661// Test that we can apply the same set of codecs again while playing.
662TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700663 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200664 cricket::AudioRecvParameters parameters;
665 parameters.codecs.push_back(kIsacCodec);
666 parameters.codecs.push_back(kCn16000Codec);
667 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000668 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200669 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000670
671 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200672 parameters.codecs[0].id = 127;
673 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
674 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000675 EXPECT_TRUE(voe_.GetPlayout(channel_num));
676}
677
678// Test that we can add a codec while playing.
679TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700680 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200681 cricket::AudioRecvParameters parameters;
682 parameters.codecs.push_back(kIsacCodec);
683 parameters.codecs.push_back(kCn16000Codec);
684 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000685 EXPECT_TRUE(channel_->SetPlayout(true));
686
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200687 parameters.codecs.push_back(kOpusCodec);
688 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
689 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000690 EXPECT_TRUE(voe_.GetPlayout(channel_num));
691 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800692 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000693 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
694}
695
696TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenberg1ac56142015-10-13 03:58:19 -0700697 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000698
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000699 // Test that when autobw is enabled, bitrate is kept as the default
700 // value. autobw is enabled for the following tests because the target
701 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000702
703 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000704 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000705
706 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000707 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000708
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000709 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000710 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000711}
712
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000713TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700714 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000715
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000716 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000717
718 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000719 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
720 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000721
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000722 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000723 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
724 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000725}
726
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000727TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700728 EXPECT_TRUE(SetupEngineWithSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000729
730 // Test that we can only set a maximum bitrate for a fixed-rate codec
731 // if it's bigger than the fixed rate.
732
733 // PCMU, fixed bitrate == 64000.
734 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
735 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
736 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
737 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
738 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
739 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
740 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
741}
742
743TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -0700744 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200745 const int kDesiredBitrate = 128000;
746 cricket::AudioSendParameters parameters;
747 parameters.codecs = engine_.codecs();
748 parameters.max_bandwidth_bps = kDesiredBitrate;
749 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000750
751 EXPECT_TRUE(channel_->AddSendStream(
752 cricket::StreamParams::CreateLegacy(kSsrc1)));
753
754 int channel_num = voe_.GetLastChannel();
755 webrtc::CodecInst codec;
756 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200757 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000758}
759
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000760// Test that bitrate cannot be set for CBR codecs.
761// Bitrate is ignored if it is higher than the fixed bitrate.
762// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000763TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenberg1ac56142015-10-13 03:58:19 -0700764 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000765
766 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200767 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
768 int channel_num = voe_.GetLastChannel();
769 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000770 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
771 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200772
773 send_parameters_.max_bandwidth_bps = 128000;
774 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000775 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
776 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200777
778 send_parameters_.max_bandwidth_bps = 128;
779 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000780 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
781 EXPECT_EQ(64000, codec.rate);
782}
783
784// Test that we apply codecs properly.
785TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenberg1ac56142015-10-13 03:58:19 -0700786 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200787 cricket::AudioSendParameters parameters;
788 parameters.codecs.push_back(kIsacCodec);
789 parameters.codecs.push_back(kPcmuCodec);
790 parameters.codecs.push_back(kRedCodec);
791 parameters.codecs[0].id = 96;
792 parameters.codecs[0].bitrate = 48000;
793 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000794 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200795 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000796 webrtc::CodecInst gcodec;
797 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
798 EXPECT_EQ(96, gcodec.pltype);
799 EXPECT_EQ(48000, gcodec.rate);
800 EXPECT_STREQ("ISAC", gcodec.plname);
801 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000802 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000803 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
804 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100805 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000806}
807
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000808// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
809// to apply.
810TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenberg1ac56142015-10-13 03:58:19 -0700811 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200812 cricket::AudioSendParameters parameters;
813 parameters.codecs.push_back(kIsacCodec);
814 parameters.codecs.push_back(kPcmuCodec);
815 parameters.codecs.push_back(kRedCodec);
816 parameters.codecs[0].id = 96;
817 parameters.codecs[0].bitrate = 48000;
818 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000819 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
820 // Calling SetSendCodec again with same codec which is already set.
821 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200822 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000823 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
824}
825
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000826// Verify that G722 is set with 16000 samples per second to WebRTC.
827TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenberg1ac56142015-10-13 03:58:19 -0700828 EXPECT_TRUE(SetupEngineWithSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000829 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200830 cricket::AudioSendParameters parameters;
831 parameters.codecs.push_back(kG722CodecSdp);
832 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000833 webrtc::CodecInst gcodec;
834 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
835 EXPECT_STREQ("G722", gcodec.plname);
836 EXPECT_EQ(1, gcodec.channels);
837 EXPECT_EQ(16000, gcodec.plfreq);
838}
839
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000840// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000841TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenberg1ac56142015-10-13 03:58:19 -0700842 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200843 cricket::AudioSendParameters parameters;
844 parameters.codecs.push_back(kOpusCodec);
845 parameters.codecs[0].bitrate = 0;
846 parameters.codecs[0].clockrate = 50000;
847 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000848}
849
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000850// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000851TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700852 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200853 cricket::AudioSendParameters parameters;
854 parameters.codecs.push_back(kOpusCodec);
855 parameters.codecs[0].bitrate = 0;
856 parameters.codecs[0].channels = 0;
857 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000858}
859
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000860// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000861TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700862 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200863 cricket::AudioSendParameters parameters;
864 parameters.codecs.push_back(kOpusCodec);
865 parameters.codecs[0].bitrate = 0;
866 parameters.codecs[0].channels = 0;
867 parameters.codecs[0].params["stereo"] = "1";
868 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000869}
870
871// Test that if channel is 1 for opus and there's no stereo, we fail.
872TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700873 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200874 cricket::AudioSendParameters parameters;
875 parameters.codecs.push_back(kOpusCodec);
876 parameters.codecs[0].bitrate = 0;
877 parameters.codecs[0].channels = 1;
878 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000879}
880
881// Test that if channel is 1 for opus and stereo=0, we fail.
882TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700883 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200884 cricket::AudioSendParameters parameters;
885 parameters.codecs.push_back(kOpusCodec);
886 parameters.codecs[0].bitrate = 0;
887 parameters.codecs[0].channels = 1;
888 parameters.codecs[0].params["stereo"] = "0";
889 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000890}
891
892// Test that if channel is 1 for opus and stereo=1, we fail.
893TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700894 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200895 cricket::AudioSendParameters parameters;
896 parameters.codecs.push_back(kOpusCodec);
897 parameters.codecs[0].bitrate = 0;
898 parameters.codecs[0].channels = 1;
899 parameters.codecs[0].params["stereo"] = "1";
900 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000901}
902
903// Test that with bitrate=0 and no stereo,
904// channels and bitrate are 1 and 32000.
905TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700906 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000907 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200908 cricket::AudioSendParameters parameters;
909 parameters.codecs.push_back(kOpusCodec);
910 parameters.codecs[0].bitrate = 0;
911 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000912 webrtc::CodecInst gcodec;
913 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
914 EXPECT_STREQ("opus", gcodec.plname);
915 EXPECT_EQ(1, gcodec.channels);
916 EXPECT_EQ(32000, gcodec.rate);
917}
918
919// Test that with bitrate=0 and stereo=0,
920// channels and bitrate are 1 and 32000.
921TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700922 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000923 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200924 cricket::AudioSendParameters parameters;
925 parameters.codecs.push_back(kOpusCodec);
926 parameters.codecs[0].bitrate = 0;
927 parameters.codecs[0].params["stereo"] = "0";
928 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000929 webrtc::CodecInst gcodec;
930 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
931 EXPECT_STREQ("opus", gcodec.plname);
932 EXPECT_EQ(1, gcodec.channels);
933 EXPECT_EQ(32000, gcodec.rate);
934}
935
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000936// Test that with bitrate=invalid and stereo=0,
937// channels and bitrate are 1 and 32000.
938TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700939 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000940 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200941 cricket::AudioSendParameters parameters;
942 parameters.codecs.push_back(kOpusCodec);
943 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000944 webrtc::CodecInst gcodec;
945
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000946 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200947 parameters.codecs[0].bitrate = 5999;
948 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000949 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
950 EXPECT_STREQ("opus", gcodec.plname);
951 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000952 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000953
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200954 parameters.codecs[0].bitrate = 510001;
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(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000959 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000960}
961
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000962// Test that with bitrate=0 and stereo=1,
963// channels and bitrate are 2 and 64000.
964TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700965 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000966 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200967 cricket::AudioSendParameters parameters;
968 parameters.codecs.push_back(kOpusCodec);
969 parameters.codecs[0].bitrate = 0;
970 parameters.codecs[0].params["stereo"] = "1";
971 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000972 webrtc::CodecInst gcodec;
973 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
974 EXPECT_STREQ("opus", gcodec.plname);
975 EXPECT_EQ(2, gcodec.channels);
976 EXPECT_EQ(64000, gcodec.rate);
977}
978
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000979// Test that with bitrate=invalid and stereo=1,
980// channels and bitrate are 2 and 64000.
981TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700982 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000983 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200984 cricket::AudioSendParameters parameters;
985 parameters.codecs.push_back(kOpusCodec);
986 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000987 webrtc::CodecInst gcodec;
988
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000989 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200990 parameters.codecs[0].bitrate = 5999;
991 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000992 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
993 EXPECT_STREQ("opus", gcodec.plname);
994 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000995 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000996
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200997 parameters.codecs[0].bitrate = 510001;
998 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000999 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1000 EXPECT_STREQ("opus", gcodec.plname);
1001 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001002 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001003}
1004
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001005// Test that with bitrate=N and stereo unset,
1006// channels and bitrate are 1 and N.
1007TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001008 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001009 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001010 cricket::AudioSendParameters parameters;
1011 parameters.codecs.push_back(kOpusCodec);
1012 parameters.codecs[0].bitrate = 96000;
1013 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001014 webrtc::CodecInst gcodec;
1015 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1016 EXPECT_EQ(111, gcodec.pltype);
1017 EXPECT_EQ(96000, gcodec.rate);
1018 EXPECT_STREQ("opus", gcodec.plname);
1019 EXPECT_EQ(1, gcodec.channels);
1020 EXPECT_EQ(48000, gcodec.plfreq);
1021}
1022
1023// Test that with bitrate=N and stereo=0,
1024// channels and bitrate are 1 and N.
1025TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001026 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001027 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001028 cricket::AudioSendParameters parameters;
1029 parameters.codecs.push_back(kOpusCodec);
1030 parameters.codecs[0].bitrate = 30000;
1031 parameters.codecs[0].params["stereo"] = "0";
1032 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001033 webrtc::CodecInst gcodec;
1034 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1035 EXPECT_EQ(1, gcodec.channels);
1036 EXPECT_EQ(30000, gcodec.rate);
1037 EXPECT_STREQ("opus", gcodec.plname);
1038}
1039
1040// Test that with bitrate=N and without any parameters,
1041// channels and bitrate are 1 and N.
1042TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenberg1ac56142015-10-13 03:58:19 -07001043 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001044 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001045 cricket::AudioSendParameters parameters;
1046 parameters.codecs.push_back(kOpusCodec);
1047 parameters.codecs[0].bitrate = 30000;
1048 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001049 webrtc::CodecInst gcodec;
1050 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1051 EXPECT_EQ(1, gcodec.channels);
1052 EXPECT_EQ(30000, gcodec.rate);
1053 EXPECT_STREQ("opus", gcodec.plname);
1054}
1055
1056// Test that with bitrate=N and stereo=1,
1057// channels and bitrate are 2 and N.
1058TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001059 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001060 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001061 cricket::AudioSendParameters parameters;
1062 parameters.codecs.push_back(kOpusCodec);
1063 parameters.codecs[0].bitrate = 30000;
1064 parameters.codecs[0].params["stereo"] = "1";
1065 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001066 webrtc::CodecInst gcodec;
1067 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1068 EXPECT_EQ(2, gcodec.channels);
1069 EXPECT_EQ(30000, gcodec.rate);
1070 EXPECT_STREQ("opus", gcodec.plname);
1071}
1072
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001073// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1074// Also test that the "maxaveragebitrate" can't be set to values outside the
1075// range of 6000 and 510000
1076TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001077 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001078 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001079 cricket::AudioSendParameters parameters;
1080 parameters.codecs.push_back(kOpusCodec);
1081 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001082 webrtc::CodecInst gcodec;
1083
1084 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001085 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1086 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001087 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001088 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001089
1090 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001091 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1092 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001093 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001094 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001095
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001096 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1097 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001098 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1099 EXPECT_EQ(200000, gcodec.rate);
1100}
1101
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001102// Test that we can enable NACK with opus as caller.
1103TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001104 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001105 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001106 cricket::AudioSendParameters parameters;
1107 parameters.codecs.push_back(kOpusCodec);
1108 parameters.codecs[0].AddFeedbackParam(
1109 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1110 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001111 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001112 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001113 EXPECT_TRUE(voe_.GetNACK(channel_num));
1114}
1115
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001116// Test that we can enable NACK with opus as callee.
1117TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenberg0a617e22015-10-20 15:49:38 -07001118 EXPECT_TRUE(SetupEngineWithRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +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));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001125 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001126 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001127 EXPECT_FALSE(voe_.GetNACK(channel_num));
1128
1129 EXPECT_TRUE(channel_->AddSendStream(
1130 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001131 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001132}
1133
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001134// Test that we can enable NACK on receive streams.
1135TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
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));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001145 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1146 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001147 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001148 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1149 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1150}
1151
1152// Test that we can disable NACK.
1153TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001154 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001155 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001156 cricket::AudioSendParameters parameters;
1157 parameters.codecs.push_back(kOpusCodec);
1158 parameters.codecs[0].AddFeedbackParam(
1159 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1160 cricket::kParamValueEmpty));
1161 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001162 EXPECT_TRUE(voe_.GetNACK(channel_num));
1163
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001164 parameters.codecs.clear();
1165 parameters.codecs.push_back(kOpusCodec);
1166 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001167 EXPECT_FALSE(voe_.GetNACK(channel_num));
1168}
1169
1170// Test that we can disable NACK on receive streams.
1171TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001172 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001173 int channel_num1 = voe_.GetLastChannel();
1174 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1175 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001176 cricket::AudioSendParameters parameters;
1177 parameters.codecs.push_back(kOpusCodec);
1178 parameters.codecs[0].AddFeedbackParam(
1179 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1180 cricket::kParamValueEmpty));
1181 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001182 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1183 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1184
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001185 parameters.codecs.clear();
1186 parameters.codecs.push_back(kOpusCodec);
1187 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001188 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1189 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1190}
1191
1192// Test that NACK is enabled on a new receive stream.
1193TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001194 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001195 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001196 cricket::AudioSendParameters parameters;
1197 parameters.codecs.push_back(kIsacCodec);
1198 parameters.codecs.push_back(kCn16000Codec);
1199 parameters.codecs[0].AddFeedbackParam(
1200 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1201 cricket::kParamValueEmpty));
1202 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001203 EXPECT_TRUE(voe_.GetNACK(channel_num));
1204
1205 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1206 channel_num = voe_.GetLastChannel();
1207 EXPECT_TRUE(voe_.GetNACK(channel_num));
1208 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1209 channel_num = voe_.GetLastChannel();
1210 EXPECT_TRUE(voe_.GetNACK(channel_num));
1211}
1212
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001213// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001214TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenberg1ac56142015-10-13 03:58:19 -07001215 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001216 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001217 cricket::AudioSendParameters parameters;
1218 parameters.codecs.push_back(kOpusCodec);
1219 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001220 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1221}
1222
1223// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001224TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001225 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001226 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001227 cricket::AudioSendParameters parameters;
1228 parameters.codecs.push_back(kOpusCodec);
1229 parameters.codecs[0].bitrate = 0;
1230 parameters.codecs[0].params["useinbandfec"] = "0";
1231 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001232 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1233 webrtc::CodecInst gcodec;
1234 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1235 EXPECT_STREQ("opus", gcodec.plname);
1236 EXPECT_EQ(1, gcodec.channels);
1237 EXPECT_EQ(32000, gcodec.rate);
1238}
1239
1240// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001241TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001242 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001243 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001244 cricket::AudioSendParameters parameters;
1245 parameters.codecs.push_back(kOpusCodec);
1246 parameters.codecs[0].bitrate = 0;
1247 parameters.codecs[0].params["useinbandfec"] = "1";
1248 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001249 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1250 webrtc::CodecInst gcodec;
1251 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1252 EXPECT_STREQ("opus", gcodec.plname);
1253 EXPECT_EQ(1, gcodec.channels);
1254 EXPECT_EQ(32000, gcodec.rate);
1255}
1256
1257// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001258TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001259 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001260 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001261 cricket::AudioSendParameters parameters;
1262 parameters.codecs.push_back(kOpusCodec);
1263 parameters.codecs[0].bitrate = 0;
1264 parameters.codecs[0].params["stereo"] = "1";
1265 parameters.codecs[0].params["useinbandfec"] = "1";
1266 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001267 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1268 webrtc::CodecInst gcodec;
1269 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1270 EXPECT_STREQ("opus", gcodec.plname);
1271 EXPECT_EQ(2, gcodec.channels);
1272 EXPECT_EQ(64000, gcodec.rate);
1273}
1274
1275// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001276TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001277 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001278 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001279 cricket::AudioSendParameters parameters;
1280 parameters.codecs.push_back(kIsacCodec);
1281 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001282 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1283}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001284
1285// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1286TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001287 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001288 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001289 cricket::AudioSendParameters parameters;
1290 parameters.codecs.push_back(kIsacCodec);
1291 parameters.codecs[0].params["useinbandfec"] = "1";
1292 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001293 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1294}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001295
1296// Test that Opus FEC status can be changed.
1297TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenberg1ac56142015-10-13 03:58:19 -07001298 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001299 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001300 cricket::AudioSendParameters parameters;
1301 parameters.codecs.push_back(kOpusCodec);
1302 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001303 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001304 parameters.codecs[0].params["useinbandfec"] = "1";
1305 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001306 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1307}
1308
stefanba4c0e42016-02-04 04:12:24 -08001309TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
1310 EXPECT_TRUE(SetupEngine());
1311 cricket::AudioSendParameters send_parameters;
1312 send_parameters.codecs.push_back(kOpusCodec);
1313 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1314 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1315
1316 cricket::AudioRecvParameters recv_parameters;
1317 recv_parameters.codecs.push_back(kIsacCodec);
1318 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1319 EXPECT_TRUE(
1320 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1321 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1322 EXPECT_FALSE(
1323 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1324
1325 send_parameters.codecs = engine_.codecs();
1326 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1327 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1328 EXPECT_TRUE(
1329 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1330}
1331
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001332// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1333TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenberg1ac56142015-10-13 03:58:19 -07001334 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001335 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001336 cricket::AudioSendParameters parameters;
1337 parameters.codecs.push_back(kOpusCodec);
1338 parameters.codecs[0].bitrate = 0;
1339 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1340 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001341 EXPECT_EQ(cricket::kOpusBandwidthNb,
1342 voe_.GetMaxEncodingBandwidth(channel_num));
1343 webrtc::CodecInst gcodec;
1344 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1345 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001346
1347 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001348 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1349 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001350 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1351 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001352}
1353
1354// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1355TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenberg1ac56142015-10-13 03:58:19 -07001356 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001357 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001358 cricket::AudioSendParameters parameters;
1359 parameters.codecs.push_back(kOpusCodec);
1360 parameters.codecs[0].bitrate = 0;
1361 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1362 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001363 EXPECT_EQ(cricket::kOpusBandwidthMb,
1364 voe_.GetMaxEncodingBandwidth(channel_num));
1365 webrtc::CodecInst gcodec;
1366 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1367 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001368
1369 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001370 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1371 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001372 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1373 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001374}
1375
1376// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1377TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenberg1ac56142015-10-13 03:58:19 -07001378 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001379 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001380 cricket::AudioSendParameters parameters;
1381 parameters.codecs.push_back(kOpusCodec);
1382 parameters.codecs[0].bitrate = 0;
1383 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1384 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001385 EXPECT_EQ(cricket::kOpusBandwidthWb,
1386 voe_.GetMaxEncodingBandwidth(channel_num));
1387 webrtc::CodecInst gcodec;
1388 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1389 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001390
1391 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001392 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1393 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001394 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1395 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001396}
1397
1398// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1399TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenberg1ac56142015-10-13 03:58:19 -07001400 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001401 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001402 cricket::AudioSendParameters parameters;
1403 parameters.codecs.push_back(kOpusCodec);
1404 parameters.codecs[0].bitrate = 0;
1405 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1406 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001407 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1408 voe_.GetMaxEncodingBandwidth(channel_num));
1409 webrtc::CodecInst gcodec;
1410 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1411 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001412
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001413 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001414 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1415 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001416 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1417 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001418}
1419
1420// Test 24000 < maxplaybackrate triggers Opus full band mode.
1421TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenberg1ac56142015-10-13 03:58:19 -07001422 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001423 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001424 cricket::AudioSendParameters parameters;
1425 parameters.codecs.push_back(kOpusCodec);
1426 parameters.codecs[0].bitrate = 0;
1427 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1428 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001429 EXPECT_EQ(cricket::kOpusBandwidthFb,
1430 voe_.GetMaxEncodingBandwidth(channel_num));
1431 webrtc::CodecInst gcodec;
1432 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1433 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001434
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001435 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001436 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1437 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001438 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1439 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001440}
1441
1442// Test Opus that without maxplaybackrate, default playback rate is used.
1443TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001444 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001445 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001446 cricket::AudioSendParameters parameters;
1447 parameters.codecs.push_back(kOpusCodec);
1448 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001449 EXPECT_EQ(cricket::kOpusBandwidthFb,
1450 voe_.GetMaxEncodingBandwidth(channel_num));
1451}
1452
1453// Test the with non-Opus, maxplaybackrate has no effect.
1454TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001455 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001456 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001457 cricket::AudioSendParameters parameters;
1458 parameters.codecs.push_back(kIsacCodec);
1459 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1460 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001461 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1462}
1463
1464// Test maxplaybackrate can be set on two streams.
1465TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001466 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001467 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001468 cricket::AudioSendParameters parameters;
1469 parameters.codecs.push_back(kOpusCodec);
1470 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001471 // Default bandwidth is 24000.
1472 EXPECT_EQ(cricket::kOpusBandwidthFb,
1473 voe_.GetMaxEncodingBandwidth(channel_num));
1474
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001475 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001476
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001477 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001478 EXPECT_EQ(cricket::kOpusBandwidthNb,
1479 voe_.GetMaxEncodingBandwidth(channel_num));
1480
1481 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1482 channel_num = voe_.GetLastChannel();
1483 EXPECT_EQ(cricket::kOpusBandwidthNb,
1484 voe_.GetMaxEncodingBandwidth(channel_num));
1485}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001486
Minyue Li7100dcd2015-03-27 05:05:59 +01001487// Test that with usedtx=0, Opus DTX is off.
1488TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001489 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001490 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001491 cricket::AudioSendParameters parameters;
1492 parameters.codecs.push_back(kOpusCodec);
1493 parameters.codecs[0].params["usedtx"] = "0";
1494 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001495 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1496}
1497
1498// Test that with usedtx=1, Opus DTX is on.
1499TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001500 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001501 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001502 cricket::AudioSendParameters parameters;
1503 parameters.codecs.push_back(kOpusCodec);
1504 parameters.codecs[0].params["usedtx"] = "1";
1505 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001506 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1507 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1508}
1509
1510// Test that usedtx=1 works with stereo Opus.
1511TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001512 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001513 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001514 cricket::AudioSendParameters parameters;
1515 parameters.codecs.push_back(kOpusCodec);
1516 parameters.codecs[0].params["usedtx"] = "1";
1517 parameters.codecs[0].params["stereo"] = "1";
1518 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001519 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1520 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1521}
1522
1523// Test that usedtx=1 does not work with non Opus.
1524TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001525 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001526 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001527 cricket::AudioSendParameters parameters;
1528 parameters.codecs.push_back(kIsacCodec);
1529 parameters.codecs[0].params["usedtx"] = "1";
1530 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001531 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1532}
1533
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001534// Test that we can switch back and forth between Opus and ISAC with CN.
1535TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenberg1ac56142015-10-13 03:58:19 -07001536 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001537 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001538 cricket::AudioSendParameters opus_parameters;
1539 opus_parameters.codecs.push_back(kOpusCodec);
1540 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001541 webrtc::CodecInst gcodec;
1542 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001543 EXPECT_EQ(111, gcodec.pltype);
1544 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001545
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001546 cricket::AudioSendParameters isac_parameters;
1547 isac_parameters.codecs.push_back(kIsacCodec);
1548 isac_parameters.codecs.push_back(kCn16000Codec);
1549 isac_parameters.codecs.push_back(kOpusCodec);
1550 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001551 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1552 EXPECT_EQ(103, gcodec.pltype);
1553 EXPECT_STREQ("ISAC", gcodec.plname);
1554
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001555 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001556 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001557 EXPECT_EQ(111, gcodec.pltype);
1558 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001559}
1560
1561// Test that we handle various ways of specifying bitrate.
1562TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001563 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001564 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001565 cricket::AudioSendParameters parameters;
1566 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1567 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001568 webrtc::CodecInst gcodec;
1569 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1570 EXPECT_EQ(103, gcodec.pltype);
1571 EXPECT_STREQ("ISAC", gcodec.plname);
1572 EXPECT_EQ(32000, gcodec.rate);
1573
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001574 parameters.codecs[0].bitrate = 0; // bitrate == default
1575 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001576 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1577 EXPECT_EQ(103, gcodec.pltype);
1578 EXPECT_STREQ("ISAC", gcodec.plname);
1579 EXPECT_EQ(-1, gcodec.rate);
1580
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001581 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1582 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001583 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1584 EXPECT_EQ(103, gcodec.pltype);
1585 EXPECT_STREQ("ISAC", gcodec.plname);
1586 EXPECT_EQ(28000, gcodec.rate);
1587
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001588 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1589 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001590 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1591 EXPECT_EQ(0, gcodec.pltype);
1592 EXPECT_STREQ("PCMU", gcodec.plname);
1593 EXPECT_EQ(64000, gcodec.rate);
1594
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001595 parameters.codecs[0].bitrate = 0; // bitrate == default
1596 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001597 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1598 EXPECT_EQ(0, gcodec.pltype);
1599 EXPECT_STREQ("PCMU", gcodec.plname);
1600 EXPECT_EQ(64000, gcodec.rate);
1601
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001602 parameters.codecs[0] = kOpusCodec;
1603 parameters.codecs[0].bitrate = 0; // bitrate == default
1604 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001605 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1606 EXPECT_EQ(111, gcodec.pltype);
1607 EXPECT_STREQ("opus", gcodec.plname);
1608 EXPECT_EQ(32000, gcodec.rate);
1609}
1610
Brave Yao5225dd82015-03-26 07:39:19 +08001611// Test that we could set packet size specified in kCodecParamPTime.
1612TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenberg1ac56142015-10-13 03:58:19 -07001613 EXPECT_TRUE(SetupEngineWithSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001614 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001615 cricket::AudioSendParameters parameters;
1616 parameters.codecs.push_back(kOpusCodec);
1617 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1618 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001619 webrtc::CodecInst gcodec;
1620 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1621 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1622
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001623 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1624 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001625 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1626 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1627
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001628 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1629 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001630 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1631 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1632
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001633 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1634 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1635 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001636 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1637 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1638
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001639 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1640 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1641 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001642 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1643 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1644}
1645
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001646// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001647TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenberg1ac56142015-10-13 03:58:19 -07001648 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001649 cricket::AudioSendParameters parameters;
1650 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001651}
1652
1653// Test that we can set send codecs even with telephone-event codec as the first
1654// one on the list.
1655TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001656 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001657 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001658 cricket::AudioSendParameters parameters;
1659 parameters.codecs.push_back(kTelephoneEventCodec);
1660 parameters.codecs.push_back(kIsacCodec);
1661 parameters.codecs.push_back(kPcmuCodec);
1662 parameters.codecs[0].id = 98; // DTMF
1663 parameters.codecs[1].id = 96;
1664 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001665 webrtc::CodecInst gcodec;
1666 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001667 EXPECT_EQ(96, gcodec.pltype);
1668 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001669 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001670}
1671
1672// Test that we can set send codecs even with CN codec as the first
1673// one on the list.
1674TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001675 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001676 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001677 cricket::AudioSendParameters parameters;
1678 parameters.codecs.push_back(kCn16000Codec);
1679 parameters.codecs.push_back(kIsacCodec);
1680 parameters.codecs.push_back(kPcmuCodec);
1681 parameters.codecs[0].id = 98; // wideband CN
1682 parameters.codecs[1].id = 96;
1683 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001684 webrtc::CodecInst gcodec;
1685 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1686 EXPECT_EQ(96, gcodec.pltype);
1687 EXPECT_STREQ("ISAC", gcodec.plname);
1688 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001689}
1690
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001691// Test that we set VAD and DTMF types correctly as caller.
1692TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001693 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001694 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001695 cricket::AudioSendParameters parameters;
1696 parameters.codecs.push_back(kIsacCodec);
1697 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001698 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001699 parameters.codecs.push_back(kCn16000Codec);
1700 parameters.codecs.push_back(kCn8000Codec);
1701 parameters.codecs.push_back(kTelephoneEventCodec);
1702 parameters.codecs.push_back(kRedCodec);
1703 parameters.codecs[0].id = 96;
1704 parameters.codecs[2].id = 97; // wideband CN
1705 parameters.codecs[4].id = 98; // DTMF
1706 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001707 webrtc::CodecInst gcodec;
1708 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1709 EXPECT_EQ(96, gcodec.pltype);
1710 EXPECT_STREQ("ISAC", gcodec.plname);
1711 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001712 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001713 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1714 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001715 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001716}
1717
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001718// Test that we set VAD and DTMF types correctly as callee.
1719TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001720 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001721 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001722 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001723
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001724 cricket::AudioSendParameters parameters;
1725 parameters.codecs.push_back(kIsacCodec);
1726 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001727 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001728 parameters.codecs.push_back(kCn16000Codec);
1729 parameters.codecs.push_back(kCn8000Codec);
1730 parameters.codecs.push_back(kTelephoneEventCodec);
1731 parameters.codecs.push_back(kRedCodec);
1732 parameters.codecs[0].id = 96;
1733 parameters.codecs[2].id = 97; // wideband CN
1734 parameters.codecs[4].id = 98; // DTMF
1735 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001736 EXPECT_TRUE(channel_->AddSendStream(
1737 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001738 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001739
1740 webrtc::CodecInst gcodec;
1741 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1742 EXPECT_EQ(96, gcodec.pltype);
1743 EXPECT_STREQ("ISAC", gcodec.plname);
1744 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001745 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001746 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1747 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001748 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001749}
1750
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001751// Test that we only apply VAD if we have a CN codec that matches the
1752// send codec clockrate.
1753TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenberg1ac56142015-10-13 03:58:19 -07001754 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001755 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001756 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001757 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001758 parameters.codecs.push_back(kIsacCodec);
1759 parameters.codecs.push_back(kCn16000Codec);
1760 parameters.codecs[1].id = 97;
1761 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001762 webrtc::CodecInst gcodec;
1763 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1764 EXPECT_STREQ("ISAC", gcodec.plname);
1765 EXPECT_TRUE(voe_.GetVAD(channel_num));
1766 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1767 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001768 parameters.codecs[0] = kPcmuCodec;
1769 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001770 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1771 EXPECT_STREQ("PCMU", gcodec.plname);
1772 EXPECT_FALSE(voe_.GetVAD(channel_num));
1773 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001774 parameters.codecs[1] = kCn8000Codec;
1775 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001776 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1777 EXPECT_STREQ("PCMU", gcodec.plname);
1778 EXPECT_TRUE(voe_.GetVAD(channel_num));
1779 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001780 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001781 parameters.codecs[0] = kIsacCodec;
1782 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001783 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1784 EXPECT_STREQ("ISAC", gcodec.plname);
1785 EXPECT_FALSE(voe_.GetVAD(channel_num));
1786}
1787
1788// Test that we perform case-insensitive matching of codec names.
1789TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenberg1ac56142015-10-13 03:58:19 -07001790 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001791 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001792 cricket::AudioSendParameters parameters;
1793 parameters.codecs.push_back(kIsacCodec);
1794 parameters.codecs.push_back(kPcmuCodec);
1795 parameters.codecs.push_back(kCn16000Codec);
1796 parameters.codecs.push_back(kCn8000Codec);
1797 parameters.codecs.push_back(kTelephoneEventCodec);
1798 parameters.codecs.push_back(kRedCodec);
1799 parameters.codecs[0].name = "iSaC";
1800 parameters.codecs[0].id = 96;
1801 parameters.codecs[2].id = 97; // wideband CN
1802 parameters.codecs[4].id = 98; // DTMF
1803 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001804 webrtc::CodecInst gcodec;
1805 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1806 EXPECT_EQ(96, gcodec.pltype);
1807 EXPECT_STREQ("ISAC", gcodec.plname);
1808 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001809 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001810 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1811 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001812 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001813}
1814
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001815// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001816TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001817 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001818 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001819 cricket::AudioSendParameters parameters;
1820 parameters.codecs.push_back(kRedCodec);
1821 parameters.codecs.push_back(kIsacCodec);
1822 parameters.codecs.push_back(kPcmuCodec);
1823 parameters.codecs[0].id = 127;
1824 parameters.codecs[0].params[""] = "96/96";
1825 parameters.codecs[1].id = 96;
1826 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001827 webrtc::CodecInst gcodec;
1828 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1829 EXPECT_EQ(96, gcodec.pltype);
1830 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001831 EXPECT_TRUE(voe_.GetRED(channel_num));
1832 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001833}
1834
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001835// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001836TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001837 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001838 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001839 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001840
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001841 cricket::AudioSendParameters parameters;
1842 parameters.codecs.push_back(kRedCodec);
1843 parameters.codecs.push_back(kIsacCodec);
1844 parameters.codecs.push_back(kPcmuCodec);
1845 parameters.codecs[0].id = 127;
1846 parameters.codecs[0].params[""] = "96/96";
1847 parameters.codecs[1].id = 96;
1848 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001849 EXPECT_TRUE(channel_->AddSendStream(
1850 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001851 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001852 webrtc::CodecInst gcodec;
1853 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1854 EXPECT_EQ(96, gcodec.pltype);
1855 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001856 EXPECT_TRUE(voe_.GetRED(channel_num));
1857 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001858}
1859
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001860// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001861TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenberg1ac56142015-10-13 03:58:19 -07001862 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001863 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001864 cricket::AudioSendParameters parameters;
1865 parameters.codecs.push_back(kRedCodec);
1866 parameters.codecs.push_back(kIsacCodec);
1867 parameters.codecs.push_back(kPcmuCodec);
1868 parameters.codecs[0].id = 127;
1869 parameters.codecs[1].id = 96;
1870 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001871 webrtc::CodecInst gcodec;
1872 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1873 EXPECT_EQ(96, gcodec.pltype);
1874 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001875 EXPECT_TRUE(voe_.GetRED(channel_num));
1876 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001877}
1878
1879// Test that we ignore RED if the parameters aren't named the way we expect.
1880TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001881 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001882 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001883 cricket::AudioSendParameters parameters;
1884 parameters.codecs.push_back(kRedCodec);
1885 parameters.codecs.push_back(kIsacCodec);
1886 parameters.codecs.push_back(kPcmuCodec);
1887 parameters.codecs[0].id = 127;
1888 parameters.codecs[0].params["ABC"] = "96/96";
1889 parameters.codecs[1].id = 96;
1890 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001891 webrtc::CodecInst gcodec;
1892 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1893 EXPECT_EQ(96, gcodec.pltype);
1894 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001895 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001896}
1897
1898// Test that we ignore RED if it uses different primary/secondary encoding.
1899TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001900 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001901 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001902 cricket::AudioSendParameters parameters;
1903 parameters.codecs.push_back(kRedCodec);
1904 parameters.codecs.push_back(kIsacCodec);
1905 parameters.codecs.push_back(kPcmuCodec);
1906 parameters.codecs[0].id = 127;
1907 parameters.codecs[0].params[""] = "96/0";
1908 parameters.codecs[1].id = 96;
1909 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001910 webrtc::CodecInst gcodec;
1911 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1912 EXPECT_EQ(96, gcodec.pltype);
1913 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001914 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001915}
1916
1917// Test that we ignore RED if it uses more than 2 encodings.
1918TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001919 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001920 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001921 cricket::AudioSendParameters parameters;
1922 parameters.codecs.push_back(kRedCodec);
1923 parameters.codecs.push_back(kIsacCodec);
1924 parameters.codecs.push_back(kPcmuCodec);
1925 parameters.codecs[0].id = 127;
1926 parameters.codecs[0].params[""] = "96/96/96";
1927 parameters.codecs[1].id = 96;
1928 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001929 webrtc::CodecInst gcodec;
1930 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1931 EXPECT_EQ(96, gcodec.pltype);
1932 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001933 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001934}
1935
1936// Test that we ignore RED if it has bogus codec ids.
1937TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001938 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001939 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001940 cricket::AudioSendParameters parameters;
1941 parameters.codecs.push_back(kRedCodec);
1942 parameters.codecs.push_back(kIsacCodec);
1943 parameters.codecs.push_back(kPcmuCodec);
1944 parameters.codecs[0].id = 127;
1945 parameters.codecs[0].params[""] = "ABC/ABC";
1946 parameters.codecs[1].id = 96;
1947 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001948 webrtc::CodecInst gcodec;
1949 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1950 EXPECT_EQ(96, gcodec.pltype);
1951 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001952 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001953}
1954
1955// Test that we ignore RED if it refers to a codec that is not present.
1956TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001957 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001958 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001959 cricket::AudioSendParameters parameters;
1960 parameters.codecs.push_back(kRedCodec);
1961 parameters.codecs.push_back(kIsacCodec);
1962 parameters.codecs.push_back(kPcmuCodec);
1963 parameters.codecs[0].id = 127;
1964 parameters.codecs[0].params[""] = "97/97";
1965 parameters.codecs[1].id = 96;
1966 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001967 webrtc::CodecInst gcodec;
1968 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1969 EXPECT_EQ(96, gcodec.pltype);
1970 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001971 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001972}
1973
stefanba4c0e42016-02-04 04:12:24 -08001974class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
1975 public:
1976 WebRtcVoiceEngineWithSendSideBweTest()
1977 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
1978};
1979
1980TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
1981 SupportsTransportSequenceNumberHeaderExtension) {
1982 cricket::RtpCapabilities capabilities = engine_.GetCapabilities();
1983 ASSERT_FALSE(capabilities.header_extensions.empty());
1984 for (const cricket::RtpHeaderExtension& extension :
1985 capabilities.header_extensions) {
1986 if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
1987 EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
1988 extension.id);
1989 return;
1990 }
1991 }
1992 FAIL() << "Transport sequence number extension not in header-extension list.";
1993}
1994
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001995// Test support for audio level header extension.
1996TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1997 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001998}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001999TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
2000 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
2001}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002002
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002003// Test support for absolute send time header extension.
2004TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
2005 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
2006}
2007TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
2008 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002009}
2010
solenberg1ac56142015-10-13 03:58:19 -07002011// Test that we can create a channel and start sending on it.
2012TEST_F(WebRtcVoiceEngineTestFake, Send) {
2013 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002014 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002015 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002016 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2017 EXPECT_TRUE(voe_.GetSend(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002018 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2019 EXPECT_FALSE(voe_.GetSend(channel_num));
solenberg1ac56142015-10-13 03:58:19 -07002020}
2021
2022// Test that we can create a channel and start playing out on it.
2023TEST_F(WebRtcVoiceEngineTestFake, Playout) {
2024 EXPECT_TRUE(SetupEngineWithRecvStream());
2025 int channel_num = voe_.GetLastChannel();
2026 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2027 EXPECT_TRUE(channel_->SetPlayout(true));
2028 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002029 EXPECT_TRUE(channel_->SetPlayout(false));
2030 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2031}
2032
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002033// Test that we can add and remove send streams.
2034TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2035 SetupForMultiSendStream();
2036
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002037 // Set the global state for sending.
2038 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2039
solenbergc96df772015-10-21 13:01:53 -07002040 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002041 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002042 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002043 // Verify that we are in a sending state for all the created streams.
solenberg3a941542015-11-16 07:34:50 -08002044 EXPECT_TRUE(voe_.GetSend(GetSendStreamConfig(ssrc).voe_channel_id));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002045 }
tfarina5237aaf2015-11-10 23:44:30 -08002046 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002047
solenbergc96df772015-10-21 13:01:53 -07002048 // Delete the send streams.
2049 for (uint32_t ssrc : kSsrcs4) {
2050 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002051 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002052 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002053 }
solenbergc96df772015-10-21 13:01:53 -07002054 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002055}
2056
2057// Test SetSendCodecs correctly configure the codecs in all send streams.
2058TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2059 SetupForMultiSendStream();
2060
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002061 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002062 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002063 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002064 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002065 }
2066
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002067 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002068 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002069 parameters.codecs.push_back(kIsacCodec);
2070 parameters.codecs.push_back(kCn16000Codec);
2071 parameters.codecs[1].id = 97;
2072 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002073
2074 // Verify ISAC and VAD are corrected configured on all send channels.
2075 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002076 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002077 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002078 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2079 EXPECT_STREQ("ISAC", gcodec.plname);
2080 EXPECT_TRUE(voe_.GetVAD(channel_num));
2081 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2082 }
2083
2084 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002085 parameters.codecs[0] = kPcmuCodec;
2086 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002087 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002088 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002089 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2090 EXPECT_STREQ("PCMU", gcodec.plname);
2091 EXPECT_FALSE(voe_.GetVAD(channel_num));
2092 }
2093}
2094
2095// Test we can SetSend on all send streams correctly.
2096TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2097 SetupForMultiSendStream();
2098
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002099 // Create the send channels and they should be a SEND_NOTHING date.
solenbergc96df772015-10-21 13:01:53 -07002100 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002101 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002102 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002103 int channel_num = voe_.GetLastChannel();
2104 EXPECT_FALSE(voe_.GetSend(channel_num));
2105 }
2106
2107 // Set the global state for starting sending.
2108 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
solenbergc96df772015-10-21 13:01:53 -07002109 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002110 // Verify that we are in a sending state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002111 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002112 EXPECT_TRUE(voe_.GetSend(channel_num));
2113 }
2114
2115 // Set the global state for stopping sending.
2116 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
solenbergc96df772015-10-21 13:01:53 -07002117 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002118 // Verify that we are in a stop state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002119 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002120 EXPECT_FALSE(voe_.GetSend(channel_num));
2121 }
2122}
2123
2124// Test we can set the correct statistics on all send streams.
2125TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2126 SetupForMultiSendStream();
2127
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002128 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002129 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002130 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002131 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002132 }
solenberg85a04962015-10-27 03:35:21 -07002133 SetAudioSendStreamStats();
2134
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002135 // Create a receive stream to check that none of the send streams end up in
2136 // the receive stream stats.
2137 EXPECT_TRUE(channel_->AddRecvStream(
2138 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002139 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002140 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2141 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002142
solenberg85a04962015-10-27 03:35:21 -07002143 // Check stats for the added streams.
2144 {
2145 cricket::VoiceMediaInfo info;
2146 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002147
solenberg85a04962015-10-27 03:35:21 -07002148 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002149 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002150 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002151 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002152 }
2153
2154 // We have added one receive stream. We should see empty stats.
2155 EXPECT_EQ(info.receivers.size(), 1u);
2156 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002157 }
solenberg1ac56142015-10-13 03:58:19 -07002158
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002159 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002160 {
2161 cricket::VoiceMediaInfo info;
2162 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2163 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002164 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002165 EXPECT_EQ(0u, info.receivers.size());
2166 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002167
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002168 // Deliver a new packet - a default receive stream should be created and we
2169 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002170 {
2171 cricket::VoiceMediaInfo info;
2172 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2173 SetAudioReceiveStreamStats();
2174 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002175 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002176 EXPECT_EQ(1u, info.receivers.size());
2177 VerifyVoiceReceiverInfo(info.receivers[0]);
2178 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002179}
2180
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002181// Test that we can add and remove receive streams, and do proper send/playout.
2182// We can receive on multiple streams while sending one stream.
2183TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002184 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002185 int channel_num1 = voe_.GetLastChannel();
2186
solenberg1ac56142015-10-13 03:58:19 -07002187 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002188 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002189 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002190 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002191
solenberg1ac56142015-10-13 03:58:19 -07002192 // Adding another stream should enable playout on the new stream only.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002193 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2194 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002195 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2196 EXPECT_TRUE(voe_.GetSend(channel_num1));
2197 EXPECT_FALSE(voe_.GetSend(channel_num2));
2198
solenberg1ac56142015-10-13 03:58:19 -07002199 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002200 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2201 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2202
2203 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2204 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2205 int channel_num3 = voe_.GetLastChannel();
2206 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2207 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2208 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2209 EXPECT_FALSE(voe_.GetSend(channel_num3));
2210
2211 // Stop sending.
2212 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2213 EXPECT_FALSE(voe_.GetSend(channel_num1));
2214 EXPECT_FALSE(voe_.GetSend(channel_num2));
2215 EXPECT_FALSE(voe_.GetSend(channel_num3));
2216
2217 // Stop playout.
2218 EXPECT_TRUE(channel_->SetPlayout(false));
2219 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2220 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2221 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2222
solenberg1ac56142015-10-13 03:58:19 -07002223 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002224 EXPECT_TRUE(channel_->SetPlayout(true));
2225 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2226 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2227 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2228
solenberg1ac56142015-10-13 03:58:19 -07002229 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002230 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2231 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002232 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002233}
2234
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002235// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002236// and start sending on it.
2237TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2238 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg246b8172015-12-08 09:50:23 -08002239 cricket::AudioOptions options_adjust_agc;
2240 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002241 int channel_num = voe_.GetLastChannel();
2242 webrtc::AgcConfig agc_config;
2243 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2244 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002245 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002246 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002247 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2248 EXPECT_TRUE(voe_.GetSend(channel_num));
2249 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2250 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002251 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2252 EXPECT_FALSE(voe_.GetSend(channel_num));
2253 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
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);
solenberg246b8172015-12-08 09:50:23 -08002261 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2262 send_parameters_.options.tx_agc_digital_compression_gain =
2263 rtc::Optional<uint16_t>(9);
2264 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2265 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2266 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002267 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2268 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2269 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2270 EXPECT_TRUE(agc_config.limiterEnable);
2271
2272 // Check interaction with adjust_agc_delta. Both should be respected, for
2273 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002274 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2275 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002276 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2277 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2278}
2279
wu@webrtc.org97077a32013-10-25 21:18:33 +00002280TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002281 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg246b8172015-12-08 09:50:23 -08002282 send_parameters_.options.recording_sample_rate =
2283 rtc::Optional<uint32_t>(48000);
2284 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2285 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002286
2287 unsigned int recording_sample_rate, playout_sample_rate;
2288 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2289 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2290 EXPECT_EQ(48000u, recording_sample_rate);
2291 EXPECT_EQ(44100u, playout_sample_rate);
2292}
2293
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002294// Test that we can set the outgoing SSRC properly.
2295// SSRC is set in SetupEngine by calling AddSendStream.
2296TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002297 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002298 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002299}
2300
2301TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2302 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002303 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002304 SetAudioSendStreamStats();
solenberg1ac56142015-10-13 03:58:19 -07002305 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2306 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002307 EXPECT_TRUE(channel_->AddRecvStream(
2308 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002309 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2310 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002311
solenberg85a04962015-10-27 03:35:21 -07002312 // Check stats for the added streams.
2313 {
2314 cricket::VoiceMediaInfo info;
2315 EXPECT_EQ(true, channel_->GetStats(&info));
2316
2317 // We have added one send stream. We should see the stats we've set.
2318 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002319 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002320 // We have added one receive stream. We should see empty stats.
2321 EXPECT_EQ(info.receivers.size(), 1u);
2322 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2323 }
solenberg1ac56142015-10-13 03:58:19 -07002324
solenberg566ef242015-11-06 15:34:49 -08002325 // Start sending - this affects some reported stats.
2326 {
2327 cricket::VoiceMediaInfo info;
2328 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2329 EXPECT_EQ(true, channel_->GetStats(&info));
2330 VerifyVoiceSenderInfo(info.senders[0], true);
2331 }
2332
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002333 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002334 {
2335 cricket::VoiceMediaInfo info;
2336 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2337 EXPECT_EQ(true, channel_->GetStats(&info));
2338 EXPECT_EQ(1u, info.senders.size());
2339 EXPECT_EQ(0u, info.receivers.size());
2340 }
solenberg1ac56142015-10-13 03:58:19 -07002341
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002342 // Deliver a new packet - a default receive stream should be created and we
2343 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002344 {
2345 cricket::VoiceMediaInfo info;
2346 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2347 SetAudioReceiveStreamStats();
2348 EXPECT_EQ(true, channel_->GetStats(&info));
2349 EXPECT_EQ(1u, info.senders.size());
2350 EXPECT_EQ(1u, info.receivers.size());
2351 VerifyVoiceReceiverInfo(info.receivers[0]);
2352 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002353}
2354
2355// Test that we can set the outgoing SSRC properly with multiple streams.
2356// SSRC is set in SetupEngine by calling AddSendStream.
2357TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002358 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002359 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002360 EXPECT_TRUE(channel_->AddRecvStream(
2361 cricket::StreamParams::CreateLegacy(kSsrc2)));
2362 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002363}
2364
2365// Test that the local SSRC is the same on sending and receiving channels if the
2366// receive channel is created before the send channel.
2367TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002368 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002369 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002370
2371 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2372 int receive_channel_num = voe_.GetLastChannel();
2373 EXPECT_TRUE(channel_->AddSendStream(
2374 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002375
solenberg3a941542015-11-16 07:34:50 -08002376 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002377 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002378}
2379
2380// Test that we can properly receive packets.
2381TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2382 EXPECT_TRUE(SetupEngine());
solenberg7e63ef02015-11-20 00:19:43 -08002383 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002384 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002385 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002386 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002387}
2388
2389// Test that we can properly receive packets on multiple streams.
2390TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg7e63ef02015-11-20 00:19:43 -08002391 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002392 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2393 int channel_num1 = voe_.GetLastChannel();
2394 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2395 int channel_num2 = voe_.GetLastChannel();
2396 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2397 int channel_num3 = voe_.GetLastChannel();
2398 // Create packets with the right SSRCs.
2399 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002400 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002401 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002402 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002403 }
2404 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2405 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2406 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002407
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002408 DeliverPacket(packets[0], sizeof(packets[0]));
2409 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2410 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2411 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002412
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002413 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002414 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002415 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2416 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002417
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002418 DeliverPacket(packets[2], sizeof(packets[2]));
2419 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002420 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002421 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002422
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002423 DeliverPacket(packets[3], sizeof(packets[3]));
2424 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2425 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002426 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2427
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002428 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2429 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2430 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2431}
2432
solenberg7e63ef02015-11-20 00:19:43 -08002433// Test that receiving on an unsignalled stream works (default channel will be
2434// created).
2435TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
2436 EXPECT_TRUE(SetupEngine());
2437 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2438 int channel_num = voe_.GetLastChannel();
2439 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2440}
2441
2442// Test that receiving on an unsignalled stream works (default channel will be
2443// created), and that packets will be forwarded to the default channel
2444// regardless of their SSRCs.
2445TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
2446 EXPECT_TRUE(SetupEngine());
2447 char packet[sizeof(kPcmuFrame)];
2448 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2449
2450 // Note that the first unknown SSRC cannot be 0, because we only support
2451 // creating receive streams for SSRC!=0.
2452 DeliverPacket(packet, sizeof(packet));
2453 int channel_num = voe_.GetLastChannel();
2454 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2455 // Once we have the default channel, SSRC==0 will be ok.
2456 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2457 rtc::SetBE32(&packet[8], ssrc);
2458 DeliverPacket(packet, sizeof(packet));
2459 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2460 }
2461}
2462
2463// Test that a default channel is created even after a signalled stream has been
2464// added, and that this stream will get any packets for unknown SSRCs.
2465TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
2466 EXPECT_TRUE(SetupEngine());
2467 char packet[sizeof(kPcmuFrame)];
2468 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2469
2470 // Add a known stream, send packet and verify we got it.
2471 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2472 int signalled_channel_num = voe_.GetLastChannel();
2473 DeliverPacket(packet, sizeof(packet));
2474 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2475
2476 // Note that the first unknown SSRC cannot be 0, because we only support
2477 // creating receive streams for SSRC!=0.
2478 rtc::SetBE32(&packet[8], 7011);
2479 DeliverPacket(packet, sizeof(packet));
2480 int channel_num = voe_.GetLastChannel();
2481 EXPECT_NE(channel_num, signalled_channel_num);
2482 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2483 // Once we have the default channel, SSRC==0 will be ok.
2484 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2485 rtc::SetBE32(&packet[8], ssrc);
2486 DeliverPacket(packet, sizeof(packet));
2487 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2488 }
2489}
2490
solenberg0a617e22015-10-20 15:49:38 -07002491// Test that we properly handle failures to add a receive stream.
2492TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
2493 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002494 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002495 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002496}
2497
solenberg0a617e22015-10-20 15:49:38 -07002498// Test that we properly handle failures to add a send stream.
2499TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
2500 EXPECT_TRUE(SetupEngine());
2501 voe_.set_fail_create_channel(true);
2502 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2503}
2504
solenberg1ac56142015-10-13 03:58:19 -07002505// Test that AddRecvStream creates new stream.
2506TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2507 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002508 int channel_num = voe_.GetLastChannel();
2509 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002510 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002511}
2512
2513// Test that after adding a recv stream, we do not decode more codecs than
2514// those previously passed into SetRecvCodecs.
2515TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002516 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002517 cricket::AudioRecvParameters parameters;
2518 parameters.codecs.push_back(kIsacCodec);
2519 parameters.codecs.push_back(kPcmuCodec);
2520 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002521 EXPECT_TRUE(channel_->AddRecvStream(
2522 cricket::StreamParams::CreateLegacy(kSsrc1)));
2523 int channel_num2 = voe_.GetLastChannel();
2524 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002525 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002526 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002527 gcodec.channels = 2;
2528 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2529}
2530
2531// Test that we properly clean up any streams that were added, even if
2532// not explicitly removed.
2533TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002534 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002535 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002536 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2537 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2538 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2539 delete channel_;
2540 channel_ = NULL;
2541 EXPECT_EQ(0, voe_.GetNumChannels());
2542}
2543
wu@webrtc.org78187522013-10-07 23:32:02 +00002544TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002545 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002546 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2547}
2548
2549TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2550 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002551 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002552 // Manually delete channel to simulate a failure.
2553 int channel = voe_.GetLastChannel();
2554 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2555 // Add recv stream 2 should work.
2556 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002557 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002558 EXPECT_NE(channel, new_channel);
2559 // The last created channel is deleted too.
2560 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002561}
2562
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002563// Test the InsertDtmf on default send stream as caller.
2564TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2565 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002566}
2567
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002568// Test the InsertDtmf on default send stream as callee
2569TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2570 TestInsertDtmf(0, false);
2571}
2572
2573// Test the InsertDtmf on specified send stream as caller.
2574TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2575 TestInsertDtmf(kSsrc1, true);
2576}
2577
2578// Test the InsertDtmf on specified send stream as callee.
2579TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2580 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002581}
2582
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002583TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002584 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002585 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002586 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2587 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2588 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2589 EXPECT_TRUE(channel_->SetPlayout(true));
2590 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2591 EXPECT_TRUE(channel_->SetPlayout(false));
2592 EXPECT_FALSE(channel_->SetPlayout(true));
2593}
2594
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002595TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002596 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002597
2598 bool ec_enabled;
2599 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002600 webrtc::AecmModes aecm_mode;
2601 bool cng_enabled;
2602 bool agc_enabled;
2603 webrtc::AgcModes agc_mode;
2604 webrtc::AgcConfig agc_config;
2605 bool ns_enabled;
2606 webrtc::NsModes ns_mode;
2607 bool highpass_filter_enabled;
2608 bool stereo_swapping_enabled;
2609 bool typing_detection_enabled;
2610 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002611 voe_.GetAecmMode(aecm_mode, cng_enabled);
2612 voe_.GetAgcStatus(agc_enabled, agc_mode);
2613 voe_.GetAgcConfig(agc_config);
2614 voe_.GetNsStatus(ns_enabled, ns_mode);
2615 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2616 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2617 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2618 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002619 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002620 EXPECT_FALSE(cng_enabled);
2621 EXPECT_TRUE(agc_enabled);
2622 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2623 EXPECT_TRUE(ns_enabled);
2624 EXPECT_TRUE(highpass_filter_enabled);
2625 EXPECT_FALSE(stereo_swapping_enabled);
2626 EXPECT_TRUE(typing_detection_enabled);
2627 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2628 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002629 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2630 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002631
solenberg246b8172015-12-08 09:50:23 -08002632 // Nothing set in AudioOptions, so everything should be as default.
2633 send_parameters_.options = cricket::AudioOptions();
2634 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002635 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002636 voe_.GetAecmMode(aecm_mode, cng_enabled);
2637 voe_.GetAgcStatus(agc_enabled, agc_mode);
2638 voe_.GetAgcConfig(agc_config);
2639 voe_.GetNsStatus(ns_enabled, ns_mode);
2640 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2641 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2642 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2643 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002644 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002645 EXPECT_FALSE(cng_enabled);
2646 EXPECT_TRUE(agc_enabled);
2647 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2648 EXPECT_TRUE(ns_enabled);
2649 EXPECT_TRUE(highpass_filter_enabled);
2650 EXPECT_FALSE(stereo_swapping_enabled);
2651 EXPECT_TRUE(typing_detection_enabled);
2652 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2653 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002654 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2655 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002656
2657 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002658 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2659 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002660 voe_.GetEcStatus(ec_enabled, ec_mode);
2661 EXPECT_FALSE(ec_enabled);
2662
2663 // Turn echo cancellation back on, with settings, and make sure
2664 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002665 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2666 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002667 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002668 voe_.GetAecmMode(aecm_mode, cng_enabled);
2669 voe_.GetAgcStatus(agc_enabled, agc_mode);
2670 voe_.GetAgcConfig(agc_config);
2671 voe_.GetNsStatus(ns_enabled, ns_mode);
2672 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2673 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2674 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2675 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002676 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002677 EXPECT_TRUE(agc_enabled);
2678 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2679 EXPECT_TRUE(ns_enabled);
2680 EXPECT_TRUE(highpass_filter_enabled);
2681 EXPECT_FALSE(stereo_swapping_enabled);
2682 EXPECT_TRUE(typing_detection_enabled);
2683 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2684 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2685
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002686 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2687 // control.
solenberg246b8172015-12-08 09:50:23 -08002688 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2689 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002690 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002691 voe_.GetAecmMode(aecm_mode, cng_enabled);
2692 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002693 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002694 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2695
2696 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002697 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2698 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2699 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2700 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002701 voe_.GetEcStatus(ec_enabled, ec_mode);
2702 EXPECT_FALSE(ec_enabled);
2703 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002704 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2705 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002706 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002707 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002708 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002709 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2710
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002711 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002712 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2713 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002714 voe_.GetAgcStatus(agc_enabled, agc_mode);
2715 EXPECT_FALSE(agc_enabled);
2716
2717 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002718 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2719 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2720 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002721 voe_.GetAgcStatus(agc_enabled, agc_mode);
2722 EXPECT_TRUE(agc_enabled);
2723 voe_.GetAgcConfig(agc_config);
2724 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2725
2726 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002727 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2728 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2729 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2730 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2731 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002732 voe_.GetNsStatus(ns_enabled, ns_mode);
2733 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2734 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2735 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2736 EXPECT_FALSE(ns_enabled);
2737 EXPECT_FALSE(highpass_filter_enabled);
2738 EXPECT_FALSE(typing_detection_enabled);
2739 EXPECT_TRUE(stereo_swapping_enabled);
2740
solenberg1ac56142015-10-13 03:58:19 -07002741 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002742 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002743 voe_.GetEcStatus(ec_enabled, ec_mode);
2744 voe_.GetNsStatus(ns_enabled, ns_mode);
2745 EXPECT_TRUE(ec_enabled);
2746 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2747 EXPECT_FALSE(ns_enabled);
2748 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2749}
2750
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002751TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002752 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002753
2754 bool ec_enabled;
2755 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002756 bool agc_enabled;
2757 webrtc::AgcModes agc_mode;
2758 bool ns_enabled;
2759 webrtc::NsModes ns_mode;
2760 bool highpass_filter_enabled;
2761 bool stereo_swapping_enabled;
2762 bool typing_detection_enabled;
2763
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002764 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002765 voe_.GetAgcStatus(agc_enabled, agc_mode);
2766 voe_.GetNsStatus(ns_enabled, ns_mode);
2767 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2768 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2769 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2770 EXPECT_TRUE(ec_enabled);
2771 EXPECT_TRUE(agc_enabled);
2772 EXPECT_TRUE(ns_enabled);
2773 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002774 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002775 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002776}
2777
2778TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2779 webrtc::AgcConfig set_config = {0};
2780 set_config.targetLeveldBOv = 3;
2781 set_config.digitalCompressionGaindB = 9;
2782 set_config.limiterEnable = true;
2783 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002784 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002785
2786 webrtc::AgcConfig config = {0};
2787 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2788 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2789 EXPECT_EQ(set_config.digitalCompressionGaindB,
2790 config.digitalCompressionGaindB);
2791 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2792}
2793
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002794TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002795 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg66f43392015-09-09 01:36:22 -07002796 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2797 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002798 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002799 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2800 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002801 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002802
2803 // Have to add a stream to make SetSend work.
2804 cricket::StreamParams stream1;
2805 stream1.ssrcs.push_back(1);
2806 channel1->AddSendStream(stream1);
2807 cricket::StreamParams stream2;
2808 stream2.ssrcs.push_back(2);
2809 channel2->AddSendStream(stream2);
2810
2811 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002812 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002813 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2814 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2815 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002816 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2817 EXPECT_EQ(parameters_options_all.options, channel1->options());
2818 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2819 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002820
2821 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002822 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002823 parameters_options_no_ns.options.noise_suppression =
2824 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002825 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2826 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002827 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2828 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2829 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002830 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002831
2832 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002833 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002834 parameters_options_no_agc.options.auto_gain_control =
2835 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002836 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002837 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2838 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2839 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002840 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002841
solenberg246b8172015-12-08 09:50:23 -08002842 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002843 bool ec_enabled;
2844 webrtc::EcModes ec_mode;
2845 bool agc_enabled;
2846 webrtc::AgcModes agc_mode;
2847 bool ns_enabled;
2848 webrtc::NsModes ns_mode;
2849 voe_.GetEcStatus(ec_enabled, ec_mode);
2850 voe_.GetAgcStatus(agc_enabled, agc_mode);
2851 voe_.GetNsStatus(ns_enabled, ns_mode);
2852 EXPECT_TRUE(ec_enabled);
2853 EXPECT_TRUE(agc_enabled);
2854 EXPECT_TRUE(ns_enabled);
2855
2856 channel1->SetSend(cricket::SEND_MICROPHONE);
2857 voe_.GetEcStatus(ec_enabled, ec_mode);
2858 voe_.GetAgcStatus(agc_enabled, agc_mode);
2859 voe_.GetNsStatus(ns_enabled, ns_mode);
2860 EXPECT_TRUE(ec_enabled);
2861 EXPECT_TRUE(agc_enabled);
2862 EXPECT_FALSE(ns_enabled);
2863
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002864 channel2->SetSend(cricket::SEND_MICROPHONE);
2865 voe_.GetEcStatus(ec_enabled, ec_mode);
2866 voe_.GetAgcStatus(agc_enabled, agc_mode);
2867 voe_.GetNsStatus(ns_enabled, ns_mode);
2868 EXPECT_TRUE(ec_enabled);
2869 EXPECT_FALSE(agc_enabled);
2870 EXPECT_TRUE(ns_enabled);
2871
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002872 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08002873 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002874 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2875 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002876 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01002877 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07002878 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01002879 rtc::Optional<bool>(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002880 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002881 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01002882 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2883 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2884 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002885 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002886 voe_.GetEcStatus(ec_enabled, ec_mode);
2887 voe_.GetAgcStatus(agc_enabled, agc_mode);
2888 voe_.GetNsStatus(ns_enabled, ns_mode);
2889 EXPECT_TRUE(ec_enabled);
2890 EXPECT_FALSE(agc_enabled);
2891 EXPECT_FALSE(ns_enabled);
2892}
2893
wu@webrtc.orgde305012013-10-31 15:40:38 +00002894// This test verifies DSCP settings are properly applied on voice media channel.
2895TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002896 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002897 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002898 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002899 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00002900 new cricket::FakeNetworkInterface);
2901 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002902 cricket::AudioSendParameters parameters = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002903 parameters.options.dscp = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002904 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002905 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00002906 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002907 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002908 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
Karl Wibergbe579832015-11-10 22:34:18 +01002909 parameters.options.dscp = rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002910 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002911 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00002912}
2913
solenberg1ac56142015-10-13 03:58:19 -07002914TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002915 EXPECT_TRUE(SetupEngine());
2916 cricket::WebRtcVoiceMediaChannel* media_channel =
2917 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002918 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2919 EXPECT_TRUE(channel_->AddRecvStream(
2920 cricket::StreamParams::CreateLegacy(kSsrc1)));
2921 int channel_id = voe_.GetLastChannel();
2922 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2923 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2924 EXPECT_TRUE(channel_->AddRecvStream(
2925 cricket::StreamParams::CreateLegacy(kSsrc2)));
2926 int channel_id2 = voe_.GetLastChannel();
2927 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002928}
2929
solenberg1ac56142015-10-13 03:58:19 -07002930TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002931 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002932 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002933 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2934 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2935 EXPECT_TRUE(channel_->AddSendStream(
2936 cricket::StreamParams::CreateLegacy(kSsrc1)));
2937 int channel_id = voe_.GetLastChannel();
2938 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2939 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2940 EXPECT_TRUE(channel_->AddSendStream(
2941 cricket::StreamParams::CreateLegacy(kSsrc2)));
2942 int channel_id2 = voe_.GetLastChannel();
2943 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002944}
2945
solenberg4bac9c52015-10-09 02:32:53 -07002946TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002947 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002948 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002949 cricket::StreamParams stream;
2950 stream.ssrcs.push_back(kSsrc2);
2951 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002952 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002953 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002954 float scale = 0;
2955 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2956 EXPECT_DOUBLE_EQ(3, scale);
2957}
2958
2959TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
2960 EXPECT_TRUE(SetupEngine());
2961 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2962 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2963 int channel_id = voe_.GetLastChannel();
2964 float scale = 0;
2965 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2966 EXPECT_DOUBLE_EQ(2, scale);
2967 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07002968 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002969 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002970}
2971
pbos8fc7fa72015-07-15 08:02:58 -07002972TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02002973 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07002974 const std::string kSyncLabel = "AvSyncLabel";
2975
solenberg1ac56142015-10-13 03:58:19 -07002976 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07002977 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
2978 sp.sync_label = kSyncLabel;
2979 // Creating two channels to make sure that sync label is set properly for both
2980 // the default voice channel and following ones.
2981 EXPECT_TRUE(channel_->AddRecvStream(sp));
2982 sp.ssrcs[0] += 1;
2983 EXPECT_TRUE(channel_->AddRecvStream(sp));
2984
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002985 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07002986 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002987 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002988 << "SyncGroup should be set based on sync_label";
2989 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002990 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002991 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07002992}
2993
solenberg3a941542015-11-16 07:34:50 -08002994// TODO(solenberg): Remove, once recv streams are configured through Call.
2995// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07002996TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002997 // Test that setting the header extensions results in the expected state
2998 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002999 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003000 ssrcs.push_back(223);
3001 ssrcs.push_back(224);
3002
solenberg1ac56142015-10-13 03:58:19 -07003003 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003004 cricket::WebRtcVoiceMediaChannel* media_channel =
3005 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003006 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003007 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003008 EXPECT_TRUE(media_channel->AddRecvStream(
3009 cricket::StreamParams::CreateLegacy(ssrc)));
3010 }
3011
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003012 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003013 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003014 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003015 EXPECT_NE(nullptr, s);
3016 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3017 }
3018
3019 // Set up receive extensions.
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003020 cricket::RtpCapabilities capabilities = engine_.GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003021 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003022 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003023 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003024 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003025 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003026 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003027 EXPECT_NE(nullptr, s);
3028 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003029 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3030 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003031 for (const auto& s_ext : s_exts) {
3032 if (e_ext.id == s_ext.id) {
3033 EXPECT_EQ(e_ext.uri, s_ext.name);
3034 }
3035 }
3036 }
3037 }
3038
3039 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003040 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003041 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003042 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003043 EXPECT_NE(nullptr, s);
3044 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3045 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003046}
3047
3048TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3049 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003050 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003051 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3052 static const unsigned char kRtcp[] = {
3053 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3054 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3055 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3056 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3057 };
3058 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3059
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_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003063 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003064 EXPECT_TRUE(media_channel->AddRecvStream(
3065 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3066
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003067 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003068 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003069 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003070 EXPECT_EQ(0, s->received_packets());
3071 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3072 EXPECT_EQ(1, s->received_packets());
3073 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3074 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003075}
Minyue2013aec2015-05-13 14:14:42 +02003076
solenberg0a617e22015-10-20 15:49:38 -07003077// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003078// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003079TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenberg1ac56142015-10-13 03:58:19 -07003080 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003081 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003082 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003083 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3084 int recv_ch = voe_.GetLastChannel();
3085 EXPECT_NE(recv_ch, default_channel);
3086 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3087 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3088 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003089 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3090 recv_ch = voe_.GetLastChannel();
3091 EXPECT_NE(recv_ch, default_channel);
3092 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003093}
3094
3095TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003096 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003097 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003098
3099 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3100 int recv_ch = voe_.GetLastChannel();
3101
3102 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3103 int send_ch = voe_.GetLastChannel();
3104
3105 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3106 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3107 // channel of |recv_ch|.This is not a common case, since, normally, only the
3108 // default channel can be associated. However, the default is not deletable.
3109 // So we force the |recv_ch| to associate with a non-default channel.
3110 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3111 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3112
3113 EXPECT_TRUE(channel_->RemoveSendStream(2));
3114 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3115}
stefan658910c2015-09-03 05:48:32 -07003116
deadbeef884f5852016-01-15 09:20:04 -08003117TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
3118 EXPECT_TRUE(SetupEngine());
3119 rtc::scoped_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3120 rtc::scoped_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
3121
3122 // Setting the sink before a recv stream exists should do nothing.
3123 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3124 EXPECT_TRUE(
3125 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3126 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3127
3128 // Now try actually setting the sink.
3129 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3130 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3131
3132 // Now try resetting it.
3133 channel_->SetRawAudioSink(kSsrc1, nullptr);
3134 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3135}
3136
3137TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
3138 EXPECT_TRUE(SetupEngine());
3139 rtc::scoped_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3140 rtc::scoped_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
3141
3142 // Should be able to set a default sink even when no stream exists.
3143 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3144
3145 // Create default channel and ensure it's assigned the default sink.
3146 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3147 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3148
3149 // Try resetting the default sink.
3150 channel_->SetRawAudioSink(0, nullptr);
3151 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3152
3153 // Try setting the default sink while the default stream exists.
3154 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3155 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3156
3157 // If we remove and add a default stream, it should get the same sink.
3158 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3159 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3160 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3161}
3162
stefan658910c2015-09-03 05:48:32 -07003163// Tests that the library initializes and shuts down properly.
3164TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3165 cricket::WebRtcVoiceEngine engine;
3166 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003167 rtc::scoped_ptr<webrtc::Call> call(
3168 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003169 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003170 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003171 EXPECT_TRUE(channel != nullptr);
3172 delete channel;
3173 engine.Terminate();
3174
3175 // Reinit to catch regression where VoiceEngineObserver reference is lost
3176 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3177 engine.Terminate();
3178}
3179
3180// Tests that the library is configured with the codecs we want.
3181TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003182 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003183 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3184 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0), nullptr));
3185 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3186 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0), nullptr));
3187 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3188 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003189 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003190 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3191 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0), nullptr));
3192 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3193 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0), nullptr));
3194 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3195 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0), nullptr));
3196 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3197 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0), nullptr));
3198 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3199 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0), nullptr));
3200 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3201 cricket::AudioCodec(96, "red", 8000, 0, 1, 0), nullptr));
3202 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3203 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0), nullptr));
3204 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3205 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0), nullptr));
3206 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3207 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0), nullptr));
3208 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3209 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003210 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003211 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3212 cricket::AudioCodec(0, "", 8000, 0, 1, 0), nullptr)); // PCMU
3213 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3214 cricket::AudioCodec(8, "", 8000, 0, 1, 0), nullptr)); // PCMA
3215 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3216 cricket::AudioCodec(9, "", 8000, 0, 1, 0), nullptr)); // G722
3217 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3218 cricket::AudioCodec(13, "", 8000, 0, 1, 0), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003219 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003220 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3221 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003222 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003223 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3224 cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0), nullptr));
3225 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3226 cricket::AudioCodec(88, "", 0, 0, 1, 0), nullptr));
3227 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3228 cricket::AudioCodec(0, "", 0, 0, 2, 0), nullptr));
3229 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3230 cricket::AudioCodec(0, "", 5000, 0, 1, 0), nullptr));
3231 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3232 cricket::AudioCodec(0, "", 0, 5000, 1, 0), nullptr));
3233
stefan658910c2015-09-03 05:48:32 -07003234 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenberg26c8c912015-11-27 04:00:25 -08003235 cricket::WebRtcVoiceEngine engine;
stefan658910c2015-09-03 05:48:32 -07003236 for (std::vector<cricket::AudioCodec>::const_iterator it =
3237 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3238 if (it->name == "CN" && it->clockrate == 16000) {
3239 EXPECT_EQ(105, it->id);
3240 } else if (it->name == "CN" && it->clockrate == 32000) {
3241 EXPECT_EQ(106, it->id);
3242 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3243 EXPECT_EQ(103, it->id);
3244 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3245 EXPECT_EQ(104, it->id);
3246 } else if (it->name == "G722" && it->clockrate == 8000) {
3247 EXPECT_EQ(9, it->id);
3248 } else if (it->name == "telephone-event") {
3249 EXPECT_EQ(126, it->id);
3250 } else if (it->name == "red") {
3251 EXPECT_EQ(127, it->id);
3252 } else if (it->name == "opus") {
3253 EXPECT_EQ(111, it->id);
3254 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3255 EXPECT_EQ("10", it->params.find("minptime")->second);
3256 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3257 EXPECT_EQ("60", it->params.find("maxptime")->second);
3258 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3259 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3260 }
3261 }
stefan658910c2015-09-03 05:48:32 -07003262 engine.Terminate();
3263}
3264
3265// Tests that VoE supports at least 32 channels
3266TEST(WebRtcVoiceEngineTest, Has32Channels) {
3267 cricket::WebRtcVoiceEngine engine;
3268 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003269 rtc::scoped_ptr<webrtc::Call> call(
3270 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003271
3272 cricket::VoiceMediaChannel* channels[32];
3273 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003274 while (num_channels < arraysize(channels)) {
stefan658910c2015-09-03 05:48:32 -07003275 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003276 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003277 if (!channel)
3278 break;
stefan658910c2015-09-03 05:48:32 -07003279 channels[num_channels++] = channel;
3280 }
3281
tfarina5237aaf2015-11-10 23:44:30 -08003282 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003283 EXPECT_EQ(expected, num_channels);
3284
3285 while (num_channels > 0) {
3286 delete channels[--num_channels];
3287 }
stefan658910c2015-09-03 05:48:32 -07003288 engine.Terminate();
3289}
3290
3291// Test that we set our preferred codecs properly.
3292TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3293 cricket::WebRtcVoiceEngine engine;
3294 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003295 rtc::scoped_ptr<webrtc::Call> call(
3296 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003297 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3298 call.get());
3299 cricket::AudioRecvParameters parameters;
3300 parameters.codecs = engine.codecs();
3301 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003302}