blob: b123a8430b154e527134bce5af31ad70b7f81f3c [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
2 * libjingle
3 * Copyright 2008 Google Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000027
tfarina5237aaf2015-11-10 23:44:30 -080028#include "webrtc/base/arraysize.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000029#include "webrtc/base/byteorder.h"
30#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020031#include "webrtc/call.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032#include "talk/media/base/constants.h"
33#include "talk/media/base/fakemediaengine.h"
wu@webrtc.orgde305012013-10-31 15:40:38 +000034#include "talk/media/base/fakenetworkinterface.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035#include "talk/media/base/fakertp.h"
Fredrik Solenberg4b60c732015-05-07 14:07:48 +020036#include "talk/media/webrtc/fakewebrtccall.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000037#include "talk/media/webrtc/fakewebrtcvoiceengine.h"
38#include "talk/media/webrtc/webrtcvoiceengine.h"
deadbeefcbecd352015-09-23 11:50:27 -070039#include "webrtc/p2p/base/faketransportcontroller.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000040#include "talk/session/media/channel.h"
41
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000042using cricket::kRtpAudioLevelHeaderExtension;
43using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
44
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020045namespace {
46
47const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
48const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
49const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
50const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
51const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
52const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
53const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
54const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
55const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, 0,
56 1, 0);
57const cricket::AudioCodec* const kAudioCodecs[] = {
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +000058 &kPcmuCodec, &kIsacCodec, &kOpusCodec, &kG722CodecVoE, &kRedCodec,
59 &kCn8000Codec, &kCn16000Codec, &kTelephoneEventCodec,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060};
solenberg85a04962015-10-27 03:35:21 -070061const uint32_t kSsrc1 = 0x99;
62const uint32_t kSsrc2 = 0x98;
63const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064
65class FakeVoEWrapper : public cricket::VoEWrapper {
66 public:
67 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
68 : cricket::VoEWrapper(engine, // processing
69 engine, // base
70 engine, // codec
71 engine, // dtmf
henrike@webrtc.org28e20752013-07-10 00:45:36 +000072 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000073 engine, // network
74 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000075 engine) { // volume
76 }
77};
78
wu@webrtc.org97077a32013-10-25 21:18:33 +000079class FakeVoETraceWrapper : public cricket::VoETraceWrapper {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080 public:
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +020081 int SetTraceFilter(const unsigned int filter) override {
wu@webrtc.org97077a32013-10-25 21:18:33 +000082 filter_ = filter;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083 return 0;
84 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +020085 int SetTraceFile(const char* fileNameUTF8) override { return 0; }
86 int SetTraceCallback(webrtc::TraceCallback* callback) override { return 0; }
wu@webrtc.org97077a32013-10-25 21:18:33 +000087 unsigned int filter_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020089} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000090
91class WebRtcVoiceEngineTestFake : public testing::Test {
92 public:
henrike@webrtc.org28e20752013-07-10 00:45:36 +000093 WebRtcVoiceEngineTestFake()
Fredrik Solenberg709ed672015-09-15 12:26:33 +020094 : call_(webrtc::Call::Config()),
tfarina5237aaf2015-11-10 23:44:30 -080095 voe_(kAudioCodecs, arraysize(kAudioCodecs)),
wu@webrtc.org97077a32013-10-25 21:18:33 +000096 trace_wrapper_(new FakeVoETraceWrapper()),
Jelena Marusicc28a8962015-05-29 15:05:44 +020097 engine_(new FakeVoEWrapper(&voe_), trace_wrapper_),
98 channel_(nullptr) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +020099 send_parameters_.codecs.push_back(kPcmuCodec);
100 recv_parameters_.codecs.push_back(kPcmuCodec);
Karl Wibergbe579832015-11-10 22:34:18 +0100101 options_adjust_agc_.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000102 }
solenberg1ac56142015-10-13 03:58:19 -0700103 bool SetupEngine() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000104 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000105 return false;
106 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200107 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200108 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000109 }
solenberg1ac56142015-10-13 03:58:19 -0700110 bool SetupEngineWithRecvStream() {
111 if (!SetupEngine()) {
112 return false;
113 }
114 return channel_->AddRecvStream(
115 cricket::StreamParams::CreateLegacy(kSsrc1));
116 }
117 bool SetupEngineWithSendStream() {
118 if (!SetupEngine()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000119 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000120 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000121 return channel_->AddSendStream(
122 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000123 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000124 void SetupForMultiSendStream() {
solenberg1ac56142015-10-13 03:58:19 -0700125 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700126 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800127 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700128 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700129 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800130 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000131 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000132 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200133 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000134 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000135 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200136 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000137 delete channel_;
138 engine_.Terminate();
139 }
140
solenberg3a941542015-11-16 07:34:50 -0800141 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
142 const auto* send_stream = call_.GetAudioSendStream(ssrc);
143 EXPECT_TRUE(send_stream);
144 return send_stream->GetConfig();
145 }
146
Peter Boström0c4e06b2015-10-07 12:23:21 +0200147 void TestInsertDtmf(uint32_t ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000148 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200149 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200150 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000151 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700152 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000153 // send stream.
154 EXPECT_TRUE(channel_->AddSendStream(
155 cricket::StreamParams::CreateLegacy(kSsrc1)));
156 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000157
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000158 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200159 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000160 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
161 EXPECT_FALSE(channel_->CanInsertDtmf());
162 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111, cricket::DF_SEND));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200163 send_parameters_.codecs.push_back(kTelephoneEventCodec);
164 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000165 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000166
167 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700168 // If this is callee, there's no active send channel yet.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000169 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
170 EXPECT_TRUE(channel_->AddSendStream(
171 cricket::StreamParams::CreateLegacy(kSsrc1)));
172 }
173
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000174 // Check we fail if the ssrc is invalid.
175 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111, cricket::DF_SEND));
176
177 // Test send
solenberg0a617e22015-10-20 15:49:38 -0700178 int channel_id = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000179 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
180 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
181 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
182
183 // Test play
184 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(3, 134));
185 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 3, 134, cricket::DF_PLAY));
186 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(3, 134));
187
188 // Test send and play
189 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
190 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(4, 145));
191 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 4, 145,
192 cricket::DF_PLAY | cricket::DF_SEND));
193 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
194 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(4, 145));
195 }
196
197 // Test that send bandwidth is set correctly.
198 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000199 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
200 // |expected_result| is the expected result from SetMaxSendBandwidth().
201 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000202 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000203 int max_bitrate,
204 bool expected_result,
205 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200206 cricket::AudioSendParameters parameters;
207 parameters.codecs.push_back(codec);
208 parameters.max_bandwidth_bps = max_bitrate;
209 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
210
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000211 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000212 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000213 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000214 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000215 }
216
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000217 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenberg0a617e22015-10-20 15:49:38 -0700218 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000219
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000220 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800221 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000222
223 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200224 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000225 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200226 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800227 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000228
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000229 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200230 send_parameters_.extensions.clear();
231 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800232 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000233
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000234 // Ensure extension is set properly.
235 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200236 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
237 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800238 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
239 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
240 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000241
solenberg0a617e22015-10-20 15:49:38 -0700242 // Ensure extension is set properly on new channels.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000243 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700244 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800245 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
246 call_.GetAudioSendStream(kSsrc2));
247 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
248 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
249 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000250
251 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200252 send_parameters_.codecs.push_back(kPcmuCodec);
253 send_parameters_.extensions.clear();
254 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800255 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
256 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000257 }
258
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000259 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700260 EXPECT_TRUE(SetupEngineWithRecvStream());
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000261 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000262
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000263 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000264 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000265
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200266 cricket::AudioRecvParameters parameters;
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000267 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200268 parameters.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000269 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200270 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000271 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000272
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000273 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200274 parameters.extensions.clear();
275 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000276 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000277
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000278 // Ensure extension is set properly.
279 const int id = 2;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200280 parameters.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
281 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000282 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000283
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000284 // Ensure extension is set properly on new channel.
285 // The first stream to occupy the default channel.
286 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700287 cricket::StreamParams::CreateLegacy(kSsrc2)));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000288 int new_channel_num = voe_.GetLastChannel();
289 EXPECT_NE(channel_num, new_channel_num);
290 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
291
292 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200293 parameters.extensions.clear();
294 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000295 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
296 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
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_;
wu@webrtc.org97077a32013-10-25 21:18:33 +0000413 FakeVoETraceWrapper* trace_wrapper_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000414 cricket::WebRtcVoiceEngine engine_;
415 cricket::VoiceMediaChannel* channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000416
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200417 cricket::AudioSendParameters send_parameters_;
418 cricket::AudioRecvParameters recv_parameters_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000419 cricket::AudioOptions options_adjust_agc_;
420};
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
454// Tests that we can find codecs by name or id, and that we interpret the
455// clockrate and bitrate fields properly.
456TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
457 cricket::AudioCodec codec;
458 webrtc::CodecInst codec_inst;
459 // Find PCMU with explicit clockrate and bitrate.
460 EXPECT_TRUE(engine_.FindWebRtcCodec(kPcmuCodec, &codec_inst));
461 // Find ISAC with explicit clockrate and 0 bitrate.
462 EXPECT_TRUE(engine_.FindWebRtcCodec(kIsacCodec, &codec_inst));
463 // Find telephone-event with explicit clockrate and 0 bitrate.
464 EXPECT_TRUE(engine_.FindWebRtcCodec(kTelephoneEventCodec, &codec_inst));
465 // Find ISAC with a different payload id.
466 codec = kIsacCodec;
467 codec.id = 127;
468 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
469 EXPECT_EQ(codec.id, codec_inst.pltype);
470 // Find PCMU with a 0 clockrate.
471 codec = kPcmuCodec;
472 codec.clockrate = 0;
473 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
474 EXPECT_EQ(codec.id, codec_inst.pltype);
475 EXPECT_EQ(8000, codec_inst.plfreq);
476 // Find PCMU with a 0 bitrate.
477 codec = kPcmuCodec;
478 codec.bitrate = 0;
479 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
480 EXPECT_EQ(codec.id, codec_inst.pltype);
481 EXPECT_EQ(64000, codec_inst.rate);
482 // Find ISAC with an explicit bitrate.
483 codec = kIsacCodec;
484 codec.bitrate = 32000;
485 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
486 EXPECT_EQ(codec.id, codec_inst.pltype);
487 EXPECT_EQ(32000, codec_inst.rate);
488}
489
490// Test that we set our inbound codecs properly, including changing PT.
491TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
492 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200493 cricket::AudioRecvParameters parameters;
494 parameters.codecs.push_back(kIsacCodec);
495 parameters.codecs.push_back(kPcmuCodec);
496 parameters.codecs.push_back(kTelephoneEventCodec);
497 parameters.codecs[0].id = 106; // collide with existing telephone-event
498 parameters.codecs[2].id = 126;
499 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700500 EXPECT_TRUE(channel_->AddRecvStream(
501 cricket::StreamParams::CreateLegacy(kSsrc1)));
502 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000503 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800504 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000505 gcodec.plfreq = 16000;
506 gcodec.channels = 1;
507 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
508 EXPECT_EQ(106, gcodec.pltype);
509 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800510 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000511 gcodec.plfreq = 8000;
512 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
513 EXPECT_EQ(126, gcodec.pltype);
514 EXPECT_STREQ("telephone-event", gcodec.plname);
515}
516
517// Test that we fail to set an unknown inbound codec.
518TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
519 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200520 cricket::AudioRecvParameters parameters;
521 parameters.codecs.push_back(kIsacCodec);
522 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
523 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000524}
525
526// Test that we fail if we have duplicate types in the inbound list.
527TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
528 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200529 cricket::AudioRecvParameters parameters;
530 parameters.codecs.push_back(kIsacCodec);
531 parameters.codecs.push_back(kCn16000Codec);
532 parameters.codecs[1].id = kIsacCodec.id;
533 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000534}
535
536// Test that we can decode OPUS without stereo parameters.
537TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
538 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200539 cricket::AudioRecvParameters parameters;
540 parameters.codecs.push_back(kIsacCodec);
541 parameters.codecs.push_back(kPcmuCodec);
542 parameters.codecs.push_back(kOpusCodec);
543 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000544 EXPECT_TRUE(channel_->AddRecvStream(
545 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700546 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000547 webrtc::CodecInst opus;
548 engine_.FindWebRtcCodec(kOpusCodec, &opus);
549 // Even without stereo parameters, recv codecs still specify channels = 2.
550 EXPECT_EQ(2, opus.channels);
551 EXPECT_EQ(111, opus.pltype);
552 EXPECT_STREQ("opus", opus.plname);
553 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700554 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000555 EXPECT_EQ(111, opus.pltype);
556}
557
558// Test that we can decode OPUS with stereo = 0.
559TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
560 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200561 cricket::AudioRecvParameters parameters;
562 parameters.codecs.push_back(kIsacCodec);
563 parameters.codecs.push_back(kPcmuCodec);
564 parameters.codecs.push_back(kOpusCodec);
565 parameters.codecs[2].params["stereo"] = "0";
566 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000567 EXPECT_TRUE(channel_->AddRecvStream(
568 cricket::StreamParams::CreateLegacy(kSsrc1)));
569 int channel_num2 = voe_.GetLastChannel();
570 webrtc::CodecInst opus;
571 engine_.FindWebRtcCodec(kOpusCodec, &opus);
572 // Even when stereo is off, recv codecs still specify channels = 2.
573 EXPECT_EQ(2, opus.channels);
574 EXPECT_EQ(111, opus.pltype);
575 EXPECT_STREQ("opus", opus.plname);
576 opus.pltype = 0;
577 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
578 EXPECT_EQ(111, opus.pltype);
579}
580
581// Test that we can decode OPUS with stereo = 1.
582TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
583 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200584 cricket::AudioRecvParameters parameters;
585 parameters.codecs.push_back(kIsacCodec);
586 parameters.codecs.push_back(kPcmuCodec);
587 parameters.codecs.push_back(kOpusCodec);
588 parameters.codecs[2].params["stereo"] = "1";
589 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000590 EXPECT_TRUE(channel_->AddRecvStream(
591 cricket::StreamParams::CreateLegacy(kSsrc1)));
592 int channel_num2 = voe_.GetLastChannel();
593 webrtc::CodecInst opus;
594 engine_.FindWebRtcCodec(kOpusCodec, &opus);
595 EXPECT_EQ(2, opus.channels);
596 EXPECT_EQ(111, opus.pltype);
597 EXPECT_STREQ("opus", opus.plname);
598 opus.pltype = 0;
599 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
600 EXPECT_EQ(111, opus.pltype);
601}
602
603// Test that changes to recv codecs are applied to all streams.
604TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
605 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200606 cricket::AudioRecvParameters parameters;
607 parameters.codecs.push_back(kIsacCodec);
608 parameters.codecs.push_back(kPcmuCodec);
609 parameters.codecs.push_back(kTelephoneEventCodec);
610 parameters.codecs[0].id = 106; // collide with existing telephone-event
611 parameters.codecs[2].id = 126;
612 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000613 EXPECT_TRUE(channel_->AddRecvStream(
614 cricket::StreamParams::CreateLegacy(kSsrc1)));
615 int channel_num2 = voe_.GetLastChannel();
616 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800617 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000618 gcodec.plfreq = 16000;
619 gcodec.channels = 1;
620 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
621 EXPECT_EQ(106, gcodec.pltype);
622 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800623 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000624 gcodec.plfreq = 8000;
625 gcodec.channels = 1;
626 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
627 EXPECT_EQ(126, gcodec.pltype);
628 EXPECT_STREQ("telephone-event", gcodec.plname);
629}
630
631TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenberg1ac56142015-10-13 03:58:19 -0700632 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200633 cricket::AudioRecvParameters parameters;
634 parameters.codecs.push_back(kIsacCodec);
635 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200636 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000637
638 int channel_num2 = voe_.GetLastChannel();
639 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800640 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000641 gcodec.plfreq = 16000;
642 gcodec.channels = 1;
643 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
644 EXPECT_EQ(106, gcodec.pltype);
645 EXPECT_STREQ("ISAC", gcodec.plname);
646}
647
648// Test that we can apply the same set of codecs again while playing.
649TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700650 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200651 cricket::AudioRecvParameters parameters;
652 parameters.codecs.push_back(kIsacCodec);
653 parameters.codecs.push_back(kCn16000Codec);
654 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000655 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200656 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000657
658 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200659 parameters.codecs[0].id = 127;
660 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
661 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662 EXPECT_TRUE(voe_.GetPlayout(channel_num));
663}
664
665// Test that we can add a codec while playing.
666TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700667 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200668 cricket::AudioRecvParameters parameters;
669 parameters.codecs.push_back(kIsacCodec);
670 parameters.codecs.push_back(kCn16000Codec);
671 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000672 EXPECT_TRUE(channel_->SetPlayout(true));
673
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200674 parameters.codecs.push_back(kOpusCodec);
675 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
676 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000677 EXPECT_TRUE(voe_.GetPlayout(channel_num));
678 webrtc::CodecInst gcodec;
679 EXPECT_TRUE(engine_.FindWebRtcCodec(kOpusCodec, &gcodec));
680 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
681}
682
683TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenberg1ac56142015-10-13 03:58:19 -0700684 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000685
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000686 // Test that when autobw is enabled, bitrate is kept as the default
687 // value. autobw is enabled for the following tests because the target
688 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000689
690 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000691 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692
693 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000694 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000695
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000696 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000697 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000698}
699
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000700TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700701 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000702
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000703 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000704
705 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000706 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
707 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
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, 96000, true, 96000);
711 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000712}
713
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000714TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700715 EXPECT_TRUE(SetupEngineWithSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000716
717 // Test that we can only set a maximum bitrate for a fixed-rate codec
718 // if it's bigger than the fixed rate.
719
720 // PCMU, fixed bitrate == 64000.
721 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
722 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
723 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
724 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
725 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
726 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
727 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
728}
729
730TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -0700731 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200732 const int kDesiredBitrate = 128000;
733 cricket::AudioSendParameters parameters;
734 parameters.codecs = engine_.codecs();
735 parameters.max_bandwidth_bps = kDesiredBitrate;
736 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000737
738 EXPECT_TRUE(channel_->AddSendStream(
739 cricket::StreamParams::CreateLegacy(kSsrc1)));
740
741 int channel_num = voe_.GetLastChannel();
742 webrtc::CodecInst codec;
743 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200744 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000745}
746
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000747// Test that bitrate cannot be set for CBR codecs.
748// Bitrate is ignored if it is higher than the fixed bitrate.
749// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000750TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenberg1ac56142015-10-13 03:58:19 -0700751 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000752
753 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200754 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
755 int channel_num = voe_.GetLastChannel();
756 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000757 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
758 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200759
760 send_parameters_.max_bandwidth_bps = 128000;
761 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000762 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
763 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200764
765 send_parameters_.max_bandwidth_bps = 128;
766 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000767 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
768 EXPECT_EQ(64000, codec.rate);
769}
770
771// Test that we apply codecs properly.
772TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenberg1ac56142015-10-13 03:58:19 -0700773 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200774 cricket::AudioSendParameters parameters;
775 parameters.codecs.push_back(kIsacCodec);
776 parameters.codecs.push_back(kPcmuCodec);
777 parameters.codecs.push_back(kRedCodec);
778 parameters.codecs[0].id = 96;
779 parameters.codecs[0].bitrate = 48000;
780 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000781 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200782 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000783 webrtc::CodecInst gcodec;
784 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
785 EXPECT_EQ(96, gcodec.pltype);
786 EXPECT_EQ(48000, gcodec.rate);
787 EXPECT_STREQ("ISAC", gcodec.plname);
788 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000789 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000790 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
791 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
792 EXPECT_EQ(106, voe_.GetSendTelephoneEventPayloadType(channel_num));
793}
794
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000795// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
796// to apply.
797TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenberg1ac56142015-10-13 03:58:19 -0700798 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200799 cricket::AudioSendParameters parameters;
800 parameters.codecs.push_back(kIsacCodec);
801 parameters.codecs.push_back(kPcmuCodec);
802 parameters.codecs.push_back(kRedCodec);
803 parameters.codecs[0].id = 96;
804 parameters.codecs[0].bitrate = 48000;
805 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000806 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
807 // Calling SetSendCodec again with same codec which is already set.
808 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200809 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000810 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
811}
812
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000813// Verify that G722 is set with 16000 samples per second to WebRTC.
814TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenberg1ac56142015-10-13 03:58:19 -0700815 EXPECT_TRUE(SetupEngineWithSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000816 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200817 cricket::AudioSendParameters parameters;
818 parameters.codecs.push_back(kG722CodecSdp);
819 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000820 webrtc::CodecInst gcodec;
821 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
822 EXPECT_STREQ("G722", gcodec.plname);
823 EXPECT_EQ(1, gcodec.channels);
824 EXPECT_EQ(16000, gcodec.plfreq);
825}
826
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000827// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000828TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenberg1ac56142015-10-13 03:58:19 -0700829 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200830 cricket::AudioSendParameters parameters;
831 parameters.codecs.push_back(kOpusCodec);
832 parameters.codecs[0].bitrate = 0;
833 parameters.codecs[0].clockrate = 50000;
834 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000835}
836
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000837// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000838TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700839 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200840 cricket::AudioSendParameters parameters;
841 parameters.codecs.push_back(kOpusCodec);
842 parameters.codecs[0].bitrate = 0;
843 parameters.codecs[0].channels = 0;
844 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000845}
846
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000847// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000848TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700849 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200850 cricket::AudioSendParameters parameters;
851 parameters.codecs.push_back(kOpusCodec);
852 parameters.codecs[0].bitrate = 0;
853 parameters.codecs[0].channels = 0;
854 parameters.codecs[0].params["stereo"] = "1";
855 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000856}
857
858// Test that if channel is 1 for opus and there's no stereo, we fail.
859TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700860 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200861 cricket::AudioSendParameters parameters;
862 parameters.codecs.push_back(kOpusCodec);
863 parameters.codecs[0].bitrate = 0;
864 parameters.codecs[0].channels = 1;
865 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000866}
867
868// Test that if channel is 1 for opus and stereo=0, we fail.
869TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700870 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200871 cricket::AudioSendParameters parameters;
872 parameters.codecs.push_back(kOpusCodec);
873 parameters.codecs[0].bitrate = 0;
874 parameters.codecs[0].channels = 1;
875 parameters.codecs[0].params["stereo"] = "0";
876 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000877}
878
879// Test that if channel is 1 for opus and stereo=1, we fail.
880TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700881 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200882 cricket::AudioSendParameters parameters;
883 parameters.codecs.push_back(kOpusCodec);
884 parameters.codecs[0].bitrate = 0;
885 parameters.codecs[0].channels = 1;
886 parameters.codecs[0].params["stereo"] = "1";
887 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000888}
889
890// Test that with bitrate=0 and no stereo,
891// channels and bitrate are 1 and 32000.
892TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700893 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000894 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200895 cricket::AudioSendParameters parameters;
896 parameters.codecs.push_back(kOpusCodec);
897 parameters.codecs[0].bitrate = 0;
898 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000899 webrtc::CodecInst gcodec;
900 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
901 EXPECT_STREQ("opus", gcodec.plname);
902 EXPECT_EQ(1, gcodec.channels);
903 EXPECT_EQ(32000, gcodec.rate);
904}
905
906// Test that with bitrate=0 and stereo=0,
907// channels and bitrate are 1 and 32000.
908TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700909 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000910 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200911 cricket::AudioSendParameters parameters;
912 parameters.codecs.push_back(kOpusCodec);
913 parameters.codecs[0].bitrate = 0;
914 parameters.codecs[0].params["stereo"] = "0";
915 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000916 webrtc::CodecInst gcodec;
917 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
918 EXPECT_STREQ("opus", gcodec.plname);
919 EXPECT_EQ(1, gcodec.channels);
920 EXPECT_EQ(32000, gcodec.rate);
921}
922
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000923// Test that with bitrate=invalid and stereo=0,
924// channels and bitrate are 1 and 32000.
925TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700926 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000927 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200928 cricket::AudioSendParameters parameters;
929 parameters.codecs.push_back(kOpusCodec);
930 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000931 webrtc::CodecInst gcodec;
932
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000933 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200934 parameters.codecs[0].bitrate = 5999;
935 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000936 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
937 EXPECT_STREQ("opus", gcodec.plname);
938 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000939 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000940
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200941 parameters.codecs[0].bitrate = 510001;
942 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000943 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
944 EXPECT_STREQ("opus", gcodec.plname);
945 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000946 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000947}
948
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000949// Test that with bitrate=0 and stereo=1,
950// channels and bitrate are 2 and 64000.
951TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700952 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000953 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200954 cricket::AudioSendParameters parameters;
955 parameters.codecs.push_back(kOpusCodec);
956 parameters.codecs[0].bitrate = 0;
957 parameters.codecs[0].params["stereo"] = "1";
958 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000959 webrtc::CodecInst gcodec;
960 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
961 EXPECT_STREQ("opus", gcodec.plname);
962 EXPECT_EQ(2, gcodec.channels);
963 EXPECT_EQ(64000, gcodec.rate);
964}
965
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000966// Test that with bitrate=invalid and stereo=1,
967// channels and bitrate are 2 and 64000.
968TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700969 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000970 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200971 cricket::AudioSendParameters parameters;
972 parameters.codecs.push_back(kOpusCodec);
973 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000974 webrtc::CodecInst gcodec;
975
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000976 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200977 parameters.codecs[0].bitrate = 5999;
978 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000979 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
980 EXPECT_STREQ("opus", gcodec.plname);
981 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000982 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000983
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200984 parameters.codecs[0].bitrate = 510001;
985 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000986 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
987 EXPECT_STREQ("opus", gcodec.plname);
988 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000989 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000990}
991
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000992// Test that with bitrate=N and stereo unset,
993// channels and bitrate are 1 and N.
994TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700995 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000996 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200997 cricket::AudioSendParameters parameters;
998 parameters.codecs.push_back(kOpusCodec);
999 parameters.codecs[0].bitrate = 96000;
1000 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001001 webrtc::CodecInst gcodec;
1002 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1003 EXPECT_EQ(111, gcodec.pltype);
1004 EXPECT_EQ(96000, gcodec.rate);
1005 EXPECT_STREQ("opus", gcodec.plname);
1006 EXPECT_EQ(1, gcodec.channels);
1007 EXPECT_EQ(48000, gcodec.plfreq);
1008}
1009
1010// Test that with bitrate=N and stereo=0,
1011// channels and bitrate are 1 and N.
1012TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001013 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001014 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001015 cricket::AudioSendParameters parameters;
1016 parameters.codecs.push_back(kOpusCodec);
1017 parameters.codecs[0].bitrate = 30000;
1018 parameters.codecs[0].params["stereo"] = "0";
1019 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001020 webrtc::CodecInst gcodec;
1021 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1022 EXPECT_EQ(1, gcodec.channels);
1023 EXPECT_EQ(30000, gcodec.rate);
1024 EXPECT_STREQ("opus", gcodec.plname);
1025}
1026
1027// Test that with bitrate=N and without any parameters,
1028// channels and bitrate are 1 and N.
1029TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenberg1ac56142015-10-13 03:58:19 -07001030 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001031 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001032 cricket::AudioSendParameters parameters;
1033 parameters.codecs.push_back(kOpusCodec);
1034 parameters.codecs[0].bitrate = 30000;
1035 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001036 webrtc::CodecInst gcodec;
1037 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1038 EXPECT_EQ(1, gcodec.channels);
1039 EXPECT_EQ(30000, gcodec.rate);
1040 EXPECT_STREQ("opus", gcodec.plname);
1041}
1042
1043// Test that with bitrate=N and stereo=1,
1044// channels and bitrate are 2 and N.
1045TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001046 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001047 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001048 cricket::AudioSendParameters parameters;
1049 parameters.codecs.push_back(kOpusCodec);
1050 parameters.codecs[0].bitrate = 30000;
1051 parameters.codecs[0].params["stereo"] = "1";
1052 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001053 webrtc::CodecInst gcodec;
1054 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1055 EXPECT_EQ(2, gcodec.channels);
1056 EXPECT_EQ(30000, gcodec.rate);
1057 EXPECT_STREQ("opus", gcodec.plname);
1058}
1059
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001060// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1061// Also test that the "maxaveragebitrate" can't be set to values outside the
1062// range of 6000 and 510000
1063TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001064 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001065 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001066 cricket::AudioSendParameters parameters;
1067 parameters.codecs.push_back(kOpusCodec);
1068 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001069 webrtc::CodecInst gcodec;
1070
1071 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001072 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1073 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001074 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001075 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001076
1077 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001078 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1079 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001080 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001081 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001082
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001083 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1084 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001085 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1086 EXPECT_EQ(200000, gcodec.rate);
1087}
1088
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001089// Test that we can enable NACK with opus as caller.
1090TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001091 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001092 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001093 cricket::AudioSendParameters parameters;
1094 parameters.codecs.push_back(kOpusCodec);
1095 parameters.codecs[0].AddFeedbackParam(
1096 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1097 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001098 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001099 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001100 EXPECT_TRUE(voe_.GetNACK(channel_num));
1101}
1102
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001103// Test that we can enable NACK with opus as callee.
1104TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenberg0a617e22015-10-20 15:49:38 -07001105 EXPECT_TRUE(SetupEngineWithRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001106 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001107 cricket::AudioSendParameters parameters;
1108 parameters.codecs.push_back(kOpusCodec);
1109 parameters.codecs[0].AddFeedbackParam(
1110 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1111 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001112 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001113 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001114 EXPECT_FALSE(voe_.GetNACK(channel_num));
1115
1116 EXPECT_TRUE(channel_->AddSendStream(
1117 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001118 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001119}
1120
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001121// Test that we can enable NACK on receive streams.
1122TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001123 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001124 int channel_num1 = voe_.GetLastChannel();
1125 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1126 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001127 cricket::AudioSendParameters parameters;
1128 parameters.codecs.push_back(kOpusCodec);
1129 parameters.codecs[0].AddFeedbackParam(
1130 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1131 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001132 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1133 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001134 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001135 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1136 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1137}
1138
1139// Test that we can disable NACK.
1140TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001141 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001142 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001143 cricket::AudioSendParameters parameters;
1144 parameters.codecs.push_back(kOpusCodec);
1145 parameters.codecs[0].AddFeedbackParam(
1146 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1147 cricket::kParamValueEmpty));
1148 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001149 EXPECT_TRUE(voe_.GetNACK(channel_num));
1150
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001151 parameters.codecs.clear();
1152 parameters.codecs.push_back(kOpusCodec);
1153 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001154 EXPECT_FALSE(voe_.GetNACK(channel_num));
1155}
1156
1157// Test that we can disable NACK on receive streams.
1158TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001159 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001160 int channel_num1 = voe_.GetLastChannel();
1161 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1162 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001163 cricket::AudioSendParameters parameters;
1164 parameters.codecs.push_back(kOpusCodec);
1165 parameters.codecs[0].AddFeedbackParam(
1166 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1167 cricket::kParamValueEmpty));
1168 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001169 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1170 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1171
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001172 parameters.codecs.clear();
1173 parameters.codecs.push_back(kOpusCodec);
1174 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001175 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1176 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1177}
1178
1179// Test that NACK is enabled on a new receive stream.
1180TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001181 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001182 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001183 cricket::AudioSendParameters parameters;
1184 parameters.codecs.push_back(kIsacCodec);
1185 parameters.codecs.push_back(kCn16000Codec);
1186 parameters.codecs[0].AddFeedbackParam(
1187 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1188 cricket::kParamValueEmpty));
1189 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001190 EXPECT_TRUE(voe_.GetNACK(channel_num));
1191
1192 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1193 channel_num = voe_.GetLastChannel();
1194 EXPECT_TRUE(voe_.GetNACK(channel_num));
1195 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1196 channel_num = voe_.GetLastChannel();
1197 EXPECT_TRUE(voe_.GetNACK(channel_num));
1198}
1199
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001200// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001201TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenberg1ac56142015-10-13 03:58:19 -07001202 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001203 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001204 cricket::AudioSendParameters parameters;
1205 parameters.codecs.push_back(kOpusCodec);
1206 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001207 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1208}
1209
1210// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001211TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001212 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001213 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001214 cricket::AudioSendParameters parameters;
1215 parameters.codecs.push_back(kOpusCodec);
1216 parameters.codecs[0].bitrate = 0;
1217 parameters.codecs[0].params["useinbandfec"] = "0";
1218 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001219 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1220 webrtc::CodecInst gcodec;
1221 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1222 EXPECT_STREQ("opus", gcodec.plname);
1223 EXPECT_EQ(1, gcodec.channels);
1224 EXPECT_EQ(32000, gcodec.rate);
1225}
1226
1227// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001228TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001229 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001230 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001231 cricket::AudioSendParameters parameters;
1232 parameters.codecs.push_back(kOpusCodec);
1233 parameters.codecs[0].bitrate = 0;
1234 parameters.codecs[0].params["useinbandfec"] = "1";
1235 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001236 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1237 webrtc::CodecInst gcodec;
1238 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1239 EXPECT_STREQ("opus", gcodec.plname);
1240 EXPECT_EQ(1, gcodec.channels);
1241 EXPECT_EQ(32000, gcodec.rate);
1242}
1243
1244// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001245TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001246 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001247 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001248 cricket::AudioSendParameters parameters;
1249 parameters.codecs.push_back(kOpusCodec);
1250 parameters.codecs[0].bitrate = 0;
1251 parameters.codecs[0].params["stereo"] = "1";
1252 parameters.codecs[0].params["useinbandfec"] = "1";
1253 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001254 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1255 webrtc::CodecInst gcodec;
1256 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1257 EXPECT_STREQ("opus", gcodec.plname);
1258 EXPECT_EQ(2, gcodec.channels);
1259 EXPECT_EQ(64000, gcodec.rate);
1260}
1261
1262// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001263TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001264 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001265 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001266 cricket::AudioSendParameters parameters;
1267 parameters.codecs.push_back(kIsacCodec);
1268 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001269 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1270}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001271
1272// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1273TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001274 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001275 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001276 cricket::AudioSendParameters parameters;
1277 parameters.codecs.push_back(kIsacCodec);
1278 parameters.codecs[0].params["useinbandfec"] = "1";
1279 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001280 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1281}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001282
1283// Test that Opus FEC status can be changed.
1284TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenberg1ac56142015-10-13 03:58:19 -07001285 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001286 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001287 cricket::AudioSendParameters parameters;
1288 parameters.codecs.push_back(kOpusCodec);
1289 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001290 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001291 parameters.codecs[0].params["useinbandfec"] = "1";
1292 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001293 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1294}
1295
1296// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1297TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
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 parameters.codecs[0].bitrate = 0;
1303 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1304 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001305 EXPECT_EQ(cricket::kOpusBandwidthNb,
1306 voe_.GetMaxEncodingBandwidth(channel_num));
1307 webrtc::CodecInst gcodec;
1308 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1309 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001310
1311 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001312 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1313 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001314 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1315 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001316}
1317
1318// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1319TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenberg1ac56142015-10-13 03:58:19 -07001320 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001321 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001322 cricket::AudioSendParameters parameters;
1323 parameters.codecs.push_back(kOpusCodec);
1324 parameters.codecs[0].bitrate = 0;
1325 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1326 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001327 EXPECT_EQ(cricket::kOpusBandwidthMb,
1328 voe_.GetMaxEncodingBandwidth(channel_num));
1329 webrtc::CodecInst gcodec;
1330 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1331 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001332
1333 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001334 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1335 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001336 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1337 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001338}
1339
1340// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1341TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenberg1ac56142015-10-13 03:58:19 -07001342 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001343 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001344 cricket::AudioSendParameters parameters;
1345 parameters.codecs.push_back(kOpusCodec);
1346 parameters.codecs[0].bitrate = 0;
1347 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1348 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001349 EXPECT_EQ(cricket::kOpusBandwidthWb,
1350 voe_.GetMaxEncodingBandwidth(channel_num));
1351 webrtc::CodecInst gcodec;
1352 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1353 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001354
1355 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001356 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1357 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001358 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1359 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001360}
1361
1362// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1363TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenberg1ac56142015-10-13 03:58:19 -07001364 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001365 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001366 cricket::AudioSendParameters parameters;
1367 parameters.codecs.push_back(kOpusCodec);
1368 parameters.codecs[0].bitrate = 0;
1369 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1370 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001371 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1372 voe_.GetMaxEncodingBandwidth(channel_num));
1373 webrtc::CodecInst gcodec;
1374 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1375 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001376
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001377 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001378 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1379 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001380 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1381 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001382}
1383
1384// Test 24000 < maxplaybackrate triggers Opus full band mode.
1385TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenberg1ac56142015-10-13 03:58:19 -07001386 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001387 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001388 cricket::AudioSendParameters parameters;
1389 parameters.codecs.push_back(kOpusCodec);
1390 parameters.codecs[0].bitrate = 0;
1391 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1392 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001393 EXPECT_EQ(cricket::kOpusBandwidthFb,
1394 voe_.GetMaxEncodingBandwidth(channel_num));
1395 webrtc::CodecInst gcodec;
1396 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1397 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001398
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001399 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001400 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1401 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001402 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1403 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001404}
1405
1406// Test Opus that without maxplaybackrate, default playback rate is used.
1407TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001408 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001409 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001410 cricket::AudioSendParameters parameters;
1411 parameters.codecs.push_back(kOpusCodec);
1412 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001413 EXPECT_EQ(cricket::kOpusBandwidthFb,
1414 voe_.GetMaxEncodingBandwidth(channel_num));
1415}
1416
1417// Test the with non-Opus, maxplaybackrate has no effect.
1418TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001419 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001420 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001421 cricket::AudioSendParameters parameters;
1422 parameters.codecs.push_back(kIsacCodec);
1423 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1424 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001425 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1426}
1427
1428// Test maxplaybackrate can be set on two streams.
1429TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001430 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001431 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001432 cricket::AudioSendParameters parameters;
1433 parameters.codecs.push_back(kOpusCodec);
1434 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001435 // Default bandwidth is 24000.
1436 EXPECT_EQ(cricket::kOpusBandwidthFb,
1437 voe_.GetMaxEncodingBandwidth(channel_num));
1438
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001439 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001440
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001441 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001442 EXPECT_EQ(cricket::kOpusBandwidthNb,
1443 voe_.GetMaxEncodingBandwidth(channel_num));
1444
1445 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1446 channel_num = voe_.GetLastChannel();
1447 EXPECT_EQ(cricket::kOpusBandwidthNb,
1448 voe_.GetMaxEncodingBandwidth(channel_num));
1449}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001450
Minyue Li7100dcd2015-03-27 05:05:59 +01001451// Test that with usedtx=0, Opus DTX is off.
1452TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001453 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001454 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001455 cricket::AudioSendParameters parameters;
1456 parameters.codecs.push_back(kOpusCodec);
1457 parameters.codecs[0].params["usedtx"] = "0";
1458 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001459 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1460}
1461
1462// Test that with usedtx=1, Opus DTX is on.
1463TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001464 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001465 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001466 cricket::AudioSendParameters parameters;
1467 parameters.codecs.push_back(kOpusCodec);
1468 parameters.codecs[0].params["usedtx"] = "1";
1469 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001470 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1471 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1472}
1473
1474// Test that usedtx=1 works with stereo Opus.
1475TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001476 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001477 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001478 cricket::AudioSendParameters parameters;
1479 parameters.codecs.push_back(kOpusCodec);
1480 parameters.codecs[0].params["usedtx"] = "1";
1481 parameters.codecs[0].params["stereo"] = "1";
1482 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001483 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1484 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1485}
1486
1487// Test that usedtx=1 does not work with non Opus.
1488TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
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(kIsacCodec);
1493 parameters.codecs[0].params["usedtx"] = "1";
1494 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001495 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1496}
1497
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001498// Test that we can switch back and forth between Opus and ISAC with CN.
1499TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenberg1ac56142015-10-13 03:58:19 -07001500 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001501 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001502 cricket::AudioSendParameters opus_parameters;
1503 opus_parameters.codecs.push_back(kOpusCodec);
1504 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001505 webrtc::CodecInst gcodec;
1506 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001507 EXPECT_EQ(111, gcodec.pltype);
1508 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001509
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001510 cricket::AudioSendParameters isac_parameters;
1511 isac_parameters.codecs.push_back(kIsacCodec);
1512 isac_parameters.codecs.push_back(kCn16000Codec);
1513 isac_parameters.codecs.push_back(kOpusCodec);
1514 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001515 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1516 EXPECT_EQ(103, gcodec.pltype);
1517 EXPECT_STREQ("ISAC", gcodec.plname);
1518
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001519 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001520 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001521 EXPECT_EQ(111, gcodec.pltype);
1522 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001523}
1524
1525// Test that we handle various ways of specifying bitrate.
1526TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001527 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001528 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001529 cricket::AudioSendParameters parameters;
1530 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1531 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001532 webrtc::CodecInst gcodec;
1533 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1534 EXPECT_EQ(103, gcodec.pltype);
1535 EXPECT_STREQ("ISAC", gcodec.plname);
1536 EXPECT_EQ(32000, gcodec.rate);
1537
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001538 parameters.codecs[0].bitrate = 0; // bitrate == default
1539 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001540 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1541 EXPECT_EQ(103, gcodec.pltype);
1542 EXPECT_STREQ("ISAC", gcodec.plname);
1543 EXPECT_EQ(-1, gcodec.rate);
1544
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001545 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1546 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001547 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1548 EXPECT_EQ(103, gcodec.pltype);
1549 EXPECT_STREQ("ISAC", gcodec.plname);
1550 EXPECT_EQ(28000, gcodec.rate);
1551
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001552 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1553 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001554 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1555 EXPECT_EQ(0, gcodec.pltype);
1556 EXPECT_STREQ("PCMU", gcodec.plname);
1557 EXPECT_EQ(64000, gcodec.rate);
1558
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001559 parameters.codecs[0].bitrate = 0; // bitrate == default
1560 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001561 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1562 EXPECT_EQ(0, gcodec.pltype);
1563 EXPECT_STREQ("PCMU", gcodec.plname);
1564 EXPECT_EQ(64000, gcodec.rate);
1565
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001566 parameters.codecs[0] = kOpusCodec;
1567 parameters.codecs[0].bitrate = 0; // bitrate == default
1568 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001569 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1570 EXPECT_EQ(111, gcodec.pltype);
1571 EXPECT_STREQ("opus", gcodec.plname);
1572 EXPECT_EQ(32000, gcodec.rate);
1573}
1574
Brave Yao5225dd82015-03-26 07:39:19 +08001575// Test that we could set packet size specified in kCodecParamPTime.
1576TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenberg1ac56142015-10-13 03:58:19 -07001577 EXPECT_TRUE(SetupEngineWithSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001578 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001579 cricket::AudioSendParameters parameters;
1580 parameters.codecs.push_back(kOpusCodec);
1581 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1582 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001583 webrtc::CodecInst gcodec;
1584 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1585 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1586
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001587 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1588 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001589 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1590 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1591
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001592 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1593 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001594 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1595 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1596
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001597 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1598 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1599 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001600 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1601 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1602
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001603 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1604 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1605 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001606 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1607 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1608}
1609
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001610// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001611TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenberg1ac56142015-10-13 03:58:19 -07001612 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001613 cricket::AudioSendParameters parameters;
1614 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001615}
1616
1617// Test that we can set send codecs even with telephone-event codec as the first
1618// one on the list.
1619TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001620 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001621 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001622 cricket::AudioSendParameters parameters;
1623 parameters.codecs.push_back(kTelephoneEventCodec);
1624 parameters.codecs.push_back(kIsacCodec);
1625 parameters.codecs.push_back(kPcmuCodec);
1626 parameters.codecs[0].id = 98; // DTMF
1627 parameters.codecs[1].id = 96;
1628 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001629 webrtc::CodecInst gcodec;
1630 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001631 EXPECT_EQ(96, gcodec.pltype);
1632 EXPECT_STREQ("ISAC", gcodec.plname);
1633 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1634}
1635
1636// Test that we can set send codecs even with CN codec as the first
1637// one on the list.
1638TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001639 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001640 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001641 cricket::AudioSendParameters parameters;
1642 parameters.codecs.push_back(kCn16000Codec);
1643 parameters.codecs.push_back(kIsacCodec);
1644 parameters.codecs.push_back(kPcmuCodec);
1645 parameters.codecs[0].id = 98; // wideband CN
1646 parameters.codecs[1].id = 96;
1647 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001648 webrtc::CodecInst gcodec;
1649 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1650 EXPECT_EQ(96, gcodec.pltype);
1651 EXPECT_STREQ("ISAC", gcodec.plname);
1652 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001653}
1654
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001655// Test that we set VAD and DTMF types correctly as caller.
1656TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001657 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001658 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001659 cricket::AudioSendParameters parameters;
1660 parameters.codecs.push_back(kIsacCodec);
1661 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001662 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001663 parameters.codecs.push_back(kCn16000Codec);
1664 parameters.codecs.push_back(kCn8000Codec);
1665 parameters.codecs.push_back(kTelephoneEventCodec);
1666 parameters.codecs.push_back(kRedCodec);
1667 parameters.codecs[0].id = 96;
1668 parameters.codecs[2].id = 97; // wideband CN
1669 parameters.codecs[4].id = 98; // DTMF
1670 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001671 webrtc::CodecInst gcodec;
1672 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1673 EXPECT_EQ(96, gcodec.pltype);
1674 EXPECT_STREQ("ISAC", gcodec.plname);
1675 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001676 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001677 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1678 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1679 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1680}
1681
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001682// Test that we set VAD and DTMF types correctly as callee.
1683TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001684 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001685 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001686 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001687
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001688 cricket::AudioSendParameters parameters;
1689 parameters.codecs.push_back(kIsacCodec);
1690 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001691 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001692 parameters.codecs.push_back(kCn16000Codec);
1693 parameters.codecs.push_back(kCn8000Codec);
1694 parameters.codecs.push_back(kTelephoneEventCodec);
1695 parameters.codecs.push_back(kRedCodec);
1696 parameters.codecs[0].id = 96;
1697 parameters.codecs[2].id = 97; // wideband CN
1698 parameters.codecs[4].id = 98; // DTMF
1699 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001700 EXPECT_TRUE(channel_->AddSendStream(
1701 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001702 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001703
1704 webrtc::CodecInst gcodec;
1705 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1706 EXPECT_EQ(96, gcodec.pltype);
1707 EXPECT_STREQ("ISAC", gcodec.plname);
1708 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001709 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001710 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1711 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1712 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1713}
1714
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001715// Test that we only apply VAD if we have a CN codec that matches the
1716// send codec clockrate.
1717TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenberg1ac56142015-10-13 03:58:19 -07001718 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001719 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001720 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001721 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001722 parameters.codecs.push_back(kIsacCodec);
1723 parameters.codecs.push_back(kCn16000Codec);
1724 parameters.codecs[1].id = 97;
1725 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001726 webrtc::CodecInst gcodec;
1727 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1728 EXPECT_STREQ("ISAC", gcodec.plname);
1729 EXPECT_TRUE(voe_.GetVAD(channel_num));
1730 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1731 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001732 parameters.codecs[0] = kPcmuCodec;
1733 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001734 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1735 EXPECT_STREQ("PCMU", gcodec.plname);
1736 EXPECT_FALSE(voe_.GetVAD(channel_num));
1737 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001738 parameters.codecs[1] = kCn8000Codec;
1739 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001740 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1741 EXPECT_STREQ("PCMU", gcodec.plname);
1742 EXPECT_TRUE(voe_.GetVAD(channel_num));
1743 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001744 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001745 parameters.codecs[0] = kIsacCodec;
1746 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001747 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1748 EXPECT_STREQ("ISAC", gcodec.plname);
1749 EXPECT_FALSE(voe_.GetVAD(channel_num));
1750}
1751
1752// Test that we perform case-insensitive matching of codec names.
1753TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
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;
1757 parameters.codecs.push_back(kIsacCodec);
1758 parameters.codecs.push_back(kPcmuCodec);
1759 parameters.codecs.push_back(kCn16000Codec);
1760 parameters.codecs.push_back(kCn8000Codec);
1761 parameters.codecs.push_back(kTelephoneEventCodec);
1762 parameters.codecs.push_back(kRedCodec);
1763 parameters.codecs[0].name = "iSaC";
1764 parameters.codecs[0].id = 96;
1765 parameters.codecs[2].id = 97; // wideband CN
1766 parameters.codecs[4].id = 98; // DTMF
1767 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001768 webrtc::CodecInst gcodec;
1769 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1770 EXPECT_EQ(96, gcodec.pltype);
1771 EXPECT_STREQ("ISAC", gcodec.plname);
1772 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001773 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001774 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1775 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1776 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1777}
1778
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001779// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001780TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001781 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001782 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001783 cricket::AudioSendParameters parameters;
1784 parameters.codecs.push_back(kRedCodec);
1785 parameters.codecs.push_back(kIsacCodec);
1786 parameters.codecs.push_back(kPcmuCodec);
1787 parameters.codecs[0].id = 127;
1788 parameters.codecs[0].params[""] = "96/96";
1789 parameters.codecs[1].id = 96;
1790 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001791 webrtc::CodecInst gcodec;
1792 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1793 EXPECT_EQ(96, gcodec.pltype);
1794 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001795 EXPECT_TRUE(voe_.GetRED(channel_num));
1796 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001797}
1798
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001799// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001800TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001801 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001802 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001803 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001804
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001805 cricket::AudioSendParameters parameters;
1806 parameters.codecs.push_back(kRedCodec);
1807 parameters.codecs.push_back(kIsacCodec);
1808 parameters.codecs.push_back(kPcmuCodec);
1809 parameters.codecs[0].id = 127;
1810 parameters.codecs[0].params[""] = "96/96";
1811 parameters.codecs[1].id = 96;
1812 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001813 EXPECT_TRUE(channel_->AddSendStream(
1814 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001815 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001816 webrtc::CodecInst gcodec;
1817 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1818 EXPECT_EQ(96, gcodec.pltype);
1819 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001820 EXPECT_TRUE(voe_.GetRED(channel_num));
1821 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001822}
1823
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001824// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001825TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenberg1ac56142015-10-13 03:58:19 -07001826 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001827 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001828 cricket::AudioSendParameters parameters;
1829 parameters.codecs.push_back(kRedCodec);
1830 parameters.codecs.push_back(kIsacCodec);
1831 parameters.codecs.push_back(kPcmuCodec);
1832 parameters.codecs[0].id = 127;
1833 parameters.codecs[1].id = 96;
1834 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001835 webrtc::CodecInst gcodec;
1836 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1837 EXPECT_EQ(96, gcodec.pltype);
1838 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001839 EXPECT_TRUE(voe_.GetRED(channel_num));
1840 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001841}
1842
1843// Test that we ignore RED if the parameters aren't named the way we expect.
1844TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001845 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001846 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001847 cricket::AudioSendParameters parameters;
1848 parameters.codecs.push_back(kRedCodec);
1849 parameters.codecs.push_back(kIsacCodec);
1850 parameters.codecs.push_back(kPcmuCodec);
1851 parameters.codecs[0].id = 127;
1852 parameters.codecs[0].params["ABC"] = "96/96";
1853 parameters.codecs[1].id = 96;
1854 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001855 webrtc::CodecInst gcodec;
1856 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1857 EXPECT_EQ(96, gcodec.pltype);
1858 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001859 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001860}
1861
1862// Test that we ignore RED if it uses different primary/secondary encoding.
1863TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001864 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001865 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001866 cricket::AudioSendParameters parameters;
1867 parameters.codecs.push_back(kRedCodec);
1868 parameters.codecs.push_back(kIsacCodec);
1869 parameters.codecs.push_back(kPcmuCodec);
1870 parameters.codecs[0].id = 127;
1871 parameters.codecs[0].params[""] = "96/0";
1872 parameters.codecs[1].id = 96;
1873 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001874 webrtc::CodecInst gcodec;
1875 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1876 EXPECT_EQ(96, gcodec.pltype);
1877 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001878 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001879}
1880
1881// Test that we ignore RED if it uses more than 2 encodings.
1882TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001883 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001884 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001885 cricket::AudioSendParameters parameters;
1886 parameters.codecs.push_back(kRedCodec);
1887 parameters.codecs.push_back(kIsacCodec);
1888 parameters.codecs.push_back(kPcmuCodec);
1889 parameters.codecs[0].id = 127;
1890 parameters.codecs[0].params[""] = "96/96/96";
1891 parameters.codecs[1].id = 96;
1892 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001893 webrtc::CodecInst gcodec;
1894 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1895 EXPECT_EQ(96, gcodec.pltype);
1896 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001897 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001898}
1899
1900// Test that we ignore RED if it has bogus codec ids.
1901TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001902 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001903 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001904 cricket::AudioSendParameters parameters;
1905 parameters.codecs.push_back(kRedCodec);
1906 parameters.codecs.push_back(kIsacCodec);
1907 parameters.codecs.push_back(kPcmuCodec);
1908 parameters.codecs[0].id = 127;
1909 parameters.codecs[0].params[""] = "ABC/ABC";
1910 parameters.codecs[1].id = 96;
1911 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001912 webrtc::CodecInst gcodec;
1913 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1914 EXPECT_EQ(96, gcodec.pltype);
1915 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001916 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001917}
1918
1919// Test that we ignore RED if it refers to a codec that is not present.
1920TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001921 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001922 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001923 cricket::AudioSendParameters parameters;
1924 parameters.codecs.push_back(kRedCodec);
1925 parameters.codecs.push_back(kIsacCodec);
1926 parameters.codecs.push_back(kPcmuCodec);
1927 parameters.codecs[0].id = 127;
1928 parameters.codecs[0].params[""] = "97/97";
1929 parameters.codecs[1].id = 96;
1930 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001931 webrtc::CodecInst gcodec;
1932 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1933 EXPECT_EQ(96, gcodec.pltype);
1934 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001935 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001936}
1937
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001938// Test support for audio level header extension.
1939TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1940 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001941}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001942TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1943 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1944}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001945
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001946// Test support for absolute send time header extension.
1947TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1948 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1949}
1950TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1951 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001952}
1953
solenberg1ac56142015-10-13 03:58:19 -07001954// Test that we can create a channel and start sending on it.
1955TEST_F(WebRtcVoiceEngineTestFake, Send) {
1956 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001957 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001958 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001959 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1960 EXPECT_TRUE(voe_.GetSend(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001961 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1962 EXPECT_FALSE(voe_.GetSend(channel_num));
solenberg1ac56142015-10-13 03:58:19 -07001963}
1964
1965// Test that we can create a channel and start playing out on it.
1966TEST_F(WebRtcVoiceEngineTestFake, Playout) {
1967 EXPECT_TRUE(SetupEngineWithRecvStream());
1968 int channel_num = voe_.GetLastChannel();
1969 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
1970 EXPECT_TRUE(channel_->SetPlayout(true));
1971 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001972 EXPECT_TRUE(channel_->SetPlayout(false));
1973 EXPECT_FALSE(voe_.GetPlayout(channel_num));
1974}
1975
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001976// Test that we can add and remove send streams.
1977TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
1978 SetupForMultiSendStream();
1979
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001980 // Set the global state for sending.
1981 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1982
solenbergc96df772015-10-21 13:01:53 -07001983 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001984 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07001985 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001986 // Verify that we are in a sending state for all the created streams.
solenberg3a941542015-11-16 07:34:50 -08001987 EXPECT_TRUE(voe_.GetSend(GetSendStreamConfig(ssrc).voe_channel_id));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001988 }
tfarina5237aaf2015-11-10 23:44:30 -08001989 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001990
solenbergc96df772015-10-21 13:01:53 -07001991 // Delete the send streams.
1992 for (uint32_t ssrc : kSsrcs4) {
1993 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08001994 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07001995 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001996 }
solenbergc96df772015-10-21 13:01:53 -07001997 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001998}
1999
2000// Test SetSendCodecs correctly configure the codecs in all send streams.
2001TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2002 SetupForMultiSendStream();
2003
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002004 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002005 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002006 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002007 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002008 }
2009
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002010 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002011 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002012 parameters.codecs.push_back(kIsacCodec);
2013 parameters.codecs.push_back(kCn16000Codec);
2014 parameters.codecs[1].id = 97;
2015 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002016
2017 // Verify ISAC and VAD are corrected configured on all send channels.
2018 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002019 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002020 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002021 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2022 EXPECT_STREQ("ISAC", gcodec.plname);
2023 EXPECT_TRUE(voe_.GetVAD(channel_num));
2024 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2025 }
2026
2027 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002028 parameters.codecs[0] = kPcmuCodec;
2029 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002030 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002031 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002032 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2033 EXPECT_STREQ("PCMU", gcodec.plname);
2034 EXPECT_FALSE(voe_.GetVAD(channel_num));
2035 }
2036}
2037
2038// Test we can SetSend on all send streams correctly.
2039TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2040 SetupForMultiSendStream();
2041
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002042 // Create the send channels and they should be a SEND_NOTHING date.
solenbergc96df772015-10-21 13:01:53 -07002043 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002044 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002045 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002046 int channel_num = voe_.GetLastChannel();
2047 EXPECT_FALSE(voe_.GetSend(channel_num));
2048 }
2049
2050 // Set the global state for starting sending.
2051 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
solenbergc96df772015-10-21 13:01:53 -07002052 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002053 // Verify that we are in a sending state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002054 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002055 EXPECT_TRUE(voe_.GetSend(channel_num));
2056 }
2057
2058 // Set the global state for stopping sending.
2059 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
solenbergc96df772015-10-21 13:01:53 -07002060 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002061 // Verify that we are in a stop state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002062 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002063 EXPECT_FALSE(voe_.GetSend(channel_num));
2064 }
2065}
2066
2067// Test we can set the correct statistics on all send streams.
2068TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2069 SetupForMultiSendStream();
2070
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002071 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002072 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002073 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002074 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002075 }
solenberg85a04962015-10-27 03:35:21 -07002076 SetAudioSendStreamStats();
2077
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002078 // Create a receive stream to check that none of the send streams end up in
2079 // the receive stream stats.
2080 EXPECT_TRUE(channel_->AddRecvStream(
2081 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002082 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002083 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2084 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002085
solenberg85a04962015-10-27 03:35:21 -07002086 // Check stats for the added streams.
2087 {
2088 cricket::VoiceMediaInfo info;
2089 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002090
solenberg85a04962015-10-27 03:35:21 -07002091 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002092 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002093 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002094 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002095 }
2096
2097 // We have added one receive stream. We should see empty stats.
2098 EXPECT_EQ(info.receivers.size(), 1u);
2099 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002100 }
solenberg1ac56142015-10-13 03:58:19 -07002101
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002102 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002103 {
2104 cricket::VoiceMediaInfo info;
2105 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2106 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002107 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002108 EXPECT_EQ(0u, info.receivers.size());
2109 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002110
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002111 // Deliver a new packet - a default receive stream should be created and we
2112 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002113 {
2114 cricket::VoiceMediaInfo info;
2115 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2116 SetAudioReceiveStreamStats();
2117 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002118 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002119 EXPECT_EQ(1u, info.receivers.size());
2120 VerifyVoiceReceiverInfo(info.receivers[0]);
2121 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002122}
2123
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002124// Test that we can add and remove receive streams, and do proper send/playout.
2125// We can receive on multiple streams while sending one stream.
2126TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002127 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002128 int channel_num1 = voe_.GetLastChannel();
2129
solenberg1ac56142015-10-13 03:58:19 -07002130 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002131 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002132 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002133 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002134
solenberg1ac56142015-10-13 03:58:19 -07002135 // Adding another stream should enable playout on the new stream only.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002136 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2137 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002138 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2139 EXPECT_TRUE(voe_.GetSend(channel_num1));
2140 EXPECT_FALSE(voe_.GetSend(channel_num2));
2141
solenberg1ac56142015-10-13 03:58:19 -07002142 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002143 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2144 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2145
2146 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2147 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2148 int channel_num3 = voe_.GetLastChannel();
2149 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2150 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2151 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2152 EXPECT_FALSE(voe_.GetSend(channel_num3));
2153
2154 // Stop sending.
2155 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2156 EXPECT_FALSE(voe_.GetSend(channel_num1));
2157 EXPECT_FALSE(voe_.GetSend(channel_num2));
2158 EXPECT_FALSE(voe_.GetSend(channel_num3));
2159
2160 // Stop playout.
2161 EXPECT_TRUE(channel_->SetPlayout(false));
2162 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2163 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2164 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2165
solenberg1ac56142015-10-13 03:58:19 -07002166 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002167 EXPECT_TRUE(channel_->SetPlayout(true));
2168 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2169 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2170 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2171
solenberg1ac56142015-10-13 03:58:19 -07002172 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002173 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2174 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002175 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002176}
2177
2178// Test that we can set the devices to use.
2179TEST_F(WebRtcVoiceEngineTestFake, SetDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002180 EXPECT_TRUE(SetupEngineWithSendStream());
2181 int send_channel = voe_.GetLastChannel();
2182 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2183 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002184 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002185
2186 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2187 cricket::kFakeDefaultDeviceId);
2188 cricket::Device dev(cricket::kFakeDeviceName,
2189 cricket::kFakeDeviceId);
2190
2191 // Test SetDevices() while not sending or playing.
2192 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2193
2194 // Test SetDevices() while sending and playing.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002195 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2196 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002197 EXPECT_TRUE(voe_.GetSend(send_channel));
2198 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002199
2200 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2201
solenberg1ac56142015-10-13 03:58:19 -07002202 EXPECT_TRUE(voe_.GetSend(send_channel));
2203 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002204
2205 // Test that failure to open newly selected devices does not prevent opening
2206 // ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002207 voe_.set_playout_fail_channel(recv_channel);
2208 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002209
2210 EXPECT_FALSE(engine_.SetDevices(&default_dev, &default_dev));
2211
solenberg1ac56142015-10-13 03:58:19 -07002212 EXPECT_FALSE(voe_.GetSend(send_channel));
2213 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002214
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002215 voe_.set_playout_fail_channel(-1);
2216 voe_.set_send_fail_channel(-1);
2217
2218 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2219
solenberg1ac56142015-10-13 03:58:19 -07002220 EXPECT_TRUE(voe_.GetSend(send_channel));
2221 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002222}
2223
2224// Test that we can set the devices to use even if we failed to
2225// open the initial ones.
2226TEST_F(WebRtcVoiceEngineTestFake, SetDevicesWithInitiallyBadDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002227 EXPECT_TRUE(SetupEngineWithSendStream());
2228 int send_channel = voe_.GetLastChannel();
2229 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2230 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002231 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002232
2233 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2234 cricket::kFakeDefaultDeviceId);
2235 cricket::Device dev(cricket::kFakeDeviceName,
2236 cricket::kFakeDeviceId);
2237
2238 // Test that failure to open devices selected before starting
2239 // send/play does not prevent opening newly selected ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002240 voe_.set_playout_fail_channel(recv_channel);
2241 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002242
2243 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2244
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002245 EXPECT_FALSE(channel_->SetSend(cricket::SEND_MICROPHONE));
2246 EXPECT_FALSE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002247 EXPECT_FALSE(voe_.GetSend(send_channel));
2248 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002249
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002250 voe_.set_playout_fail_channel(-1);
2251 voe_.set_send_fail_channel(-1);
2252
2253 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2254
solenberg1ac56142015-10-13 03:58:19 -07002255 EXPECT_TRUE(voe_.GetSend(send_channel));
2256 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002257}
2258
2259// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002260// and start sending on it.
2261TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2262 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002263 int channel_num = voe_.GetLastChannel();
2264 webrtc::AgcConfig agc_config;
2265 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2266 EXPECT_EQ(0, agc_config.targetLeveldBOv);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002267 send_parameters_.options = options_adjust_agc_;
2268 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002269 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2270 EXPECT_TRUE(voe_.GetSend(channel_num));
2271 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2272 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002273 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2274 EXPECT_FALSE(voe_.GetSend(channel_num));
2275 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2276 EXPECT_EQ(0, agc_config.targetLeveldBOv); // level was restored
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002277}
2278
wu@webrtc.org97077a32013-10-25 21:18:33 +00002279TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002280 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002281 webrtc::AgcConfig agc_config;
2282 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2283 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2284
2285 cricket::AudioOptions options;
Karl Wibergbe579832015-11-10 22:34:18 +01002286 options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2287 options.tx_agc_digital_compression_gain = rtc::Optional<uint16_t>(9);
2288 options.tx_agc_limiter = rtc::Optional<bool>(true);
2289 options.auto_gain_control = rtc::Optional<bool>(true);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002290 EXPECT_TRUE(engine_.SetOptions(options));
2291
2292 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2293 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2294 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2295 EXPECT_TRUE(agc_config.limiterEnable);
2296
2297 // Check interaction with adjust_agc_delta. Both should be respected, for
2298 // backwards compatibility.
Karl Wibergbe579832015-11-10 22:34:18 +01002299 options.adjust_agc_delta = rtc::Optional<int>(-10);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002300 EXPECT_TRUE(engine_.SetOptions(options));
2301
2302 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2303 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2304}
2305
wu@webrtc.org97077a32013-10-25 21:18:33 +00002306TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002307 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002308 cricket::AudioOptions options;
Karl Wibergbe579832015-11-10 22:34:18 +01002309 options.recording_sample_rate = rtc::Optional<uint32_t>(48000);
2310 options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002311 EXPECT_TRUE(engine_.SetOptions(options));
2312
2313 unsigned int recording_sample_rate, playout_sample_rate;
2314 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2315 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2316 EXPECT_EQ(48000u, recording_sample_rate);
2317 EXPECT_EQ(44100u, playout_sample_rate);
2318}
2319
2320TEST_F(WebRtcVoiceEngineTestFake, TraceFilterViaTraceOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002321 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002322 engine_.SetLogging(rtc::LS_INFO, "");
wu@webrtc.org97077a32013-10-25 21:18:33 +00002323 EXPECT_EQ(
2324 // Info:
2325 webrtc::kTraceStateInfo | webrtc::kTraceInfo |
2326 // Warning:
2327 webrtc::kTraceTerseInfo | webrtc::kTraceWarning |
2328 // Error:
2329 webrtc::kTraceError | webrtc::kTraceCritical,
2330 static_cast<int>(trace_wrapper_->filter_));
2331 // Now set it explicitly
2332 std::string filter =
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002333 "tracefilter " + rtc::ToString(webrtc::kTraceDefault);
2334 engine_.SetLogging(rtc::LS_VERBOSE, filter.c_str());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002335 EXPECT_EQ(static_cast<unsigned int>(webrtc::kTraceDefault),
2336 trace_wrapper_->filter_);
2337}
2338
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002339// Test that we can set the outgoing SSRC properly.
2340// SSRC is set in SetupEngine by calling AddSendStream.
2341TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002342 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002343 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002344}
2345
2346TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2347 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002348 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002349 SetAudioSendStreamStats();
solenberg1ac56142015-10-13 03:58:19 -07002350 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2351 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002352 EXPECT_TRUE(channel_->AddRecvStream(
2353 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002354 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2355 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002356
solenberg85a04962015-10-27 03:35:21 -07002357 // Check stats for the added streams.
2358 {
2359 cricket::VoiceMediaInfo info;
2360 EXPECT_EQ(true, channel_->GetStats(&info));
2361
2362 // We have added one send stream. We should see the stats we've set.
2363 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002364 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002365 // We have added one receive stream. We should see empty stats.
2366 EXPECT_EQ(info.receivers.size(), 1u);
2367 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2368 }
solenberg1ac56142015-10-13 03:58:19 -07002369
solenberg566ef242015-11-06 15:34:49 -08002370 // Start sending - this affects some reported stats.
2371 {
2372 cricket::VoiceMediaInfo info;
2373 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2374 EXPECT_EQ(true, channel_->GetStats(&info));
2375 VerifyVoiceSenderInfo(info.senders[0], true);
2376 }
2377
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002378 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002379 {
2380 cricket::VoiceMediaInfo info;
2381 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2382 EXPECT_EQ(true, channel_->GetStats(&info));
2383 EXPECT_EQ(1u, info.senders.size());
2384 EXPECT_EQ(0u, info.receivers.size());
2385 }
solenberg1ac56142015-10-13 03:58:19 -07002386
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002387 // Deliver a new packet - a default receive stream should be created and we
2388 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002389 {
2390 cricket::VoiceMediaInfo info;
2391 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2392 SetAudioReceiveStreamStats();
2393 EXPECT_EQ(true, channel_->GetStats(&info));
2394 EXPECT_EQ(1u, info.senders.size());
2395 EXPECT_EQ(1u, info.receivers.size());
2396 VerifyVoiceReceiverInfo(info.receivers[0]);
2397 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002398}
2399
2400// Test that we can set the outgoing SSRC properly with multiple streams.
2401// SSRC is set in SetupEngine by calling AddSendStream.
2402TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002403 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002404 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002405 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
solenberg85a04962015-10-27 03:35:21 -07002406 EXPECT_EQ(kSsrc1, voe_.GetLocalSSRC(voe_.GetLastChannel()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002407}
2408
2409// Test that the local SSRC is the same on sending and receiving channels if the
2410// receive channel is created before the send channel.
2411TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002412 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002413 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002414
2415 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2416 int receive_channel_num = voe_.GetLastChannel();
2417 EXPECT_TRUE(channel_->AddSendStream(
2418 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002419
solenberg3a941542015-11-16 07:34:50 -08002420 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002421 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002422}
2423
2424// Test that we can properly receive packets.
2425TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2426 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002427 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002428 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002429 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame,
2430 sizeof(kPcmuFrame)));
2431}
2432
2433// Test that we can properly receive packets on multiple streams.
2434TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002435 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002436 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002437 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2438 int channel_num1 = voe_.GetLastChannel();
2439 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2440 int channel_num2 = voe_.GetLastChannel();
2441 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2442 int channel_num3 = voe_.GetLastChannel();
2443 // Create packets with the right SSRCs.
2444 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002445 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002446 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002447 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002448 }
2449 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2450 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2451 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2452 DeliverPacket(packets[0], sizeof(packets[0]));
2453 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2454 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2455 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2456 DeliverPacket(packets[1], sizeof(packets[1]));
2457 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1],
2458 sizeof(packets[1])));
2459 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2460 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2461 DeliverPacket(packets[2], sizeof(packets[2]));
2462 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2463 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2],
2464 sizeof(packets[2])));
2465 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2466 DeliverPacket(packets[3], sizeof(packets[3]));
2467 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2468 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2469 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3],
2470 sizeof(packets[3])));
2471 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2472 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2473 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2474}
2475
solenberg0a617e22015-10-20 15:49:38 -07002476// Test that we properly handle failures to add a receive stream.
2477TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
2478 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002479 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002480 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002481}
2482
solenberg0a617e22015-10-20 15:49:38 -07002483// Test that we properly handle failures to add a send stream.
2484TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
2485 EXPECT_TRUE(SetupEngine());
2486 voe_.set_fail_create_channel(true);
2487 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2488}
2489
solenberg1ac56142015-10-13 03:58:19 -07002490// Test that AddRecvStream creates new stream.
2491TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2492 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002493 int channel_num = voe_.GetLastChannel();
2494 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002495 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002496}
2497
2498// Test that after adding a recv stream, we do not decode more codecs than
2499// those previously passed into SetRecvCodecs.
2500TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002501 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002502 cricket::AudioRecvParameters parameters;
2503 parameters.codecs.push_back(kIsacCodec);
2504 parameters.codecs.push_back(kPcmuCodec);
2505 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002506 EXPECT_TRUE(channel_->AddRecvStream(
2507 cricket::StreamParams::CreateLegacy(kSsrc1)));
2508 int channel_num2 = voe_.GetLastChannel();
2509 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002510 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002511 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002512 gcodec.channels = 2;
2513 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2514}
2515
2516// Test that we properly clean up any streams that were added, even if
2517// not explicitly removed.
2518TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002519 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002520 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002521 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2522 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2523 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2524 delete channel_;
2525 channel_ = NULL;
2526 EXPECT_EQ(0, voe_.GetNumChannels());
2527}
2528
wu@webrtc.org78187522013-10-07 23:32:02 +00002529TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002530 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002531 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2532}
2533
2534TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2535 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002536 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002537 // Manually delete channel to simulate a failure.
2538 int channel = voe_.GetLastChannel();
2539 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2540 // Add recv stream 2 should work.
2541 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002542 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002543 EXPECT_NE(channel, new_channel);
2544 // The last created channel is deleted too.
2545 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002546}
2547
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002548// Test the InsertDtmf on default send stream as caller.
2549TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2550 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002551}
2552
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002553// Test the InsertDtmf on default send stream as callee
2554TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2555 TestInsertDtmf(0, false);
2556}
2557
2558// Test the InsertDtmf on specified send stream as caller.
2559TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2560 TestInsertDtmf(kSsrc1, true);
2561}
2562
2563// Test the InsertDtmf on specified send stream as callee.
2564TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2565 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002566}
2567
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002568TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002569 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002570 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002571 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2572 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2573 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2574 EXPECT_TRUE(channel_->SetPlayout(true));
2575 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2576 EXPECT_TRUE(channel_->SetPlayout(false));
2577 EXPECT_FALSE(channel_->SetPlayout(true));
2578}
2579
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002580TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002581 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002582
2583 bool ec_enabled;
2584 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002585 webrtc::AecmModes aecm_mode;
2586 bool cng_enabled;
2587 bool agc_enabled;
2588 webrtc::AgcModes agc_mode;
2589 webrtc::AgcConfig agc_config;
2590 bool ns_enabled;
2591 webrtc::NsModes ns_mode;
2592 bool highpass_filter_enabled;
2593 bool stereo_swapping_enabled;
2594 bool typing_detection_enabled;
2595 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002596 voe_.GetAecmMode(aecm_mode, cng_enabled);
2597 voe_.GetAgcStatus(agc_enabled, agc_mode);
2598 voe_.GetAgcConfig(agc_config);
2599 voe_.GetNsStatus(ns_enabled, ns_mode);
2600 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2601 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2602 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2603 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002604 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002605 EXPECT_FALSE(cng_enabled);
2606 EXPECT_TRUE(agc_enabled);
2607 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2608 EXPECT_TRUE(ns_enabled);
2609 EXPECT_TRUE(highpass_filter_enabled);
2610 EXPECT_FALSE(stereo_swapping_enabled);
2611 EXPECT_TRUE(typing_detection_enabled);
2612 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2613 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2614
2615 // Nothing set, so all ignored.
2616 cricket::AudioOptions options;
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002617 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002618 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002619 voe_.GetAecmMode(aecm_mode, cng_enabled);
2620 voe_.GetAgcStatus(agc_enabled, agc_mode);
2621 voe_.GetAgcConfig(agc_config);
2622 voe_.GetNsStatus(ns_enabled, ns_mode);
2623 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2624 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2625 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2626 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002627 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002628 EXPECT_FALSE(cng_enabled);
2629 EXPECT_TRUE(agc_enabled);
2630 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2631 EXPECT_TRUE(ns_enabled);
2632 EXPECT_TRUE(highpass_filter_enabled);
2633 EXPECT_FALSE(stereo_swapping_enabled);
2634 EXPECT_TRUE(typing_detection_enabled);
2635 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2636 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
Henrik Lundin64dad832015-05-11 12:44:23 +02002637 EXPECT_EQ(50, voe_.GetNetEqCapacity()); // From GetDefaultEngineOptions().
Henrik Lundin5263b3c2015-06-01 10:29:41 +02002638 EXPECT_FALSE(
2639 voe_.GetNetEqFastAccelerate()); // From GetDefaultEngineOptions().
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002640
2641 // Turn echo cancellation off
Karl Wibergbe579832015-11-10 22:34:18 +01002642 options.echo_cancellation = rtc::Optional<bool>(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002643 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002644 voe_.GetEcStatus(ec_enabled, ec_mode);
2645 EXPECT_FALSE(ec_enabled);
2646
2647 // Turn echo cancellation back on, with settings, and make sure
2648 // nothing else changed.
Karl Wibergbe579832015-11-10 22:34:18 +01002649 options.echo_cancellation = rtc::Optional<bool>(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002650 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002651 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002652 voe_.GetAecmMode(aecm_mode, cng_enabled);
2653 voe_.GetAgcStatus(agc_enabled, agc_mode);
2654 voe_.GetAgcConfig(agc_config);
2655 voe_.GetNsStatus(ns_enabled, ns_mode);
2656 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2657 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2658 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2659 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002660 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002661 EXPECT_TRUE(agc_enabled);
2662 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2663 EXPECT_TRUE(ns_enabled);
2664 EXPECT_TRUE(highpass_filter_enabled);
2665 EXPECT_FALSE(stereo_swapping_enabled);
2666 EXPECT_TRUE(typing_detection_enabled);
2667 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2668 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2669
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002670 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2671 // control.
Karl Wibergbe579832015-11-10 22:34:18 +01002672 options.delay_agnostic_aec = rtc::Optional<bool>(true);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002673 ASSERT_TRUE(engine_.SetOptions(options));
2674 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002675 voe_.GetAecmMode(aecm_mode, cng_enabled);
2676 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002677 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002678 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2679
2680 // Turn off echo cancellation and delay agnostic aec.
Karl Wibergbe579832015-11-10 22:34:18 +01002681 options.delay_agnostic_aec = rtc::Optional<bool>(false);
2682 options.extended_filter_aec = rtc::Optional<bool>(false);
2683 options.echo_cancellation = rtc::Optional<bool>(false);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002684 ASSERT_TRUE(engine_.SetOptions(options));
2685 voe_.GetEcStatus(ec_enabled, ec_mode);
2686 EXPECT_FALSE(ec_enabled);
2687 // Turning delay agnostic aec back on should also turn on echo cancellation.
Karl Wibergbe579832015-11-10 22:34:18 +01002688 options.delay_agnostic_aec = rtc::Optional<bool>(true);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002689 ASSERT_TRUE(engine_.SetOptions(options));
2690 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002691 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002692 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002693 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2694
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002695 // Turn off AGC
Karl Wibergbe579832015-11-10 22:34:18 +01002696 options.auto_gain_control = rtc::Optional<bool>(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002697 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002698 voe_.GetAgcStatus(agc_enabled, agc_mode);
2699 EXPECT_FALSE(agc_enabled);
2700
2701 // Turn AGC back on
Karl Wibergbe579832015-11-10 22:34:18 +01002702 options.auto_gain_control = rtc::Optional<bool>(true);
2703 options.adjust_agc_delta = rtc::Optional<int>();
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002704 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002705 voe_.GetAgcStatus(agc_enabled, agc_mode);
2706 EXPECT_TRUE(agc_enabled);
2707 voe_.GetAgcConfig(agc_config);
2708 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2709
2710 // Turn off other options (and stereo swapping on).
Karl Wibergbe579832015-11-10 22:34:18 +01002711 options.noise_suppression = rtc::Optional<bool>(false);
2712 options.highpass_filter = rtc::Optional<bool>(false);
2713 options.typing_detection = rtc::Optional<bool>(false);
2714 options.stereo_swapping = rtc::Optional<bool>(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002715 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002716 voe_.GetNsStatus(ns_enabled, ns_mode);
2717 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2718 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2719 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2720 EXPECT_FALSE(ns_enabled);
2721 EXPECT_FALSE(highpass_filter_enabled);
2722 EXPECT_FALSE(typing_detection_enabled);
2723 EXPECT_TRUE(stereo_swapping_enabled);
2724
solenberg1ac56142015-10-13 03:58:19 -07002725 // Set options again to ensure it has no impact.
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002726 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002727 voe_.GetEcStatus(ec_enabled, ec_mode);
2728 voe_.GetNsStatus(ns_enabled, ns_mode);
2729 EXPECT_TRUE(ec_enabled);
2730 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2731 EXPECT_FALSE(ns_enabled);
2732 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2733}
2734
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002735TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002736 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002737
2738 bool ec_enabled;
2739 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002740 bool agc_enabled;
2741 webrtc::AgcModes agc_mode;
2742 bool ns_enabled;
2743 webrtc::NsModes ns_mode;
2744 bool highpass_filter_enabled;
2745 bool stereo_swapping_enabled;
2746 bool typing_detection_enabled;
2747
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002748 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002749 voe_.GetAgcStatus(agc_enabled, agc_mode);
2750 voe_.GetNsStatus(ns_enabled, ns_mode);
2751 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2752 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2753 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2754 EXPECT_TRUE(ec_enabled);
2755 EXPECT_TRUE(agc_enabled);
2756 EXPECT_TRUE(ns_enabled);
2757 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002758 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002759 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002760}
2761
2762TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2763 webrtc::AgcConfig set_config = {0};
2764 set_config.targetLeveldBOv = 3;
2765 set_config.digitalCompressionGaindB = 9;
2766 set_config.limiterEnable = true;
2767 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002768 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002769
2770 webrtc::AgcConfig config = {0};
2771 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2772 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2773 EXPECT_EQ(set_config.digitalCompressionGaindB,
2774 config.digitalCompressionGaindB);
2775 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2776}
2777
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002778TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002779 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg66f43392015-09-09 01:36:22 -07002780 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2781 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002782 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002783 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2784 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002785 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002786
2787 // Have to add a stream to make SetSend work.
2788 cricket::StreamParams stream1;
2789 stream1.ssrcs.push_back(1);
2790 channel1->AddSendStream(stream1);
2791 cricket::StreamParams stream2;
2792 stream2.ssrcs.push_back(2);
2793 channel2->AddSendStream(stream2);
2794
2795 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002796 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002797 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2798 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2799 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002800 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2801 EXPECT_EQ(parameters_options_all.options, channel1->options());
2802 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2803 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002804
2805 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002806 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002807 parameters_options_no_ns.options.noise_suppression =
2808 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002809 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2810 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002811 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2812 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2813 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002814 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002815
2816 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002817 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002818 parameters_options_no_agc.options.auto_gain_control =
2819 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002820 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002821 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2822 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2823 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002824 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002825
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002826 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002827 bool ec_enabled;
2828 webrtc::EcModes ec_mode;
2829 bool agc_enabled;
2830 webrtc::AgcModes agc_mode;
2831 bool ns_enabled;
2832 webrtc::NsModes ns_mode;
2833 voe_.GetEcStatus(ec_enabled, ec_mode);
2834 voe_.GetAgcStatus(agc_enabled, agc_mode);
2835 voe_.GetNsStatus(ns_enabled, ns_mode);
2836 EXPECT_TRUE(ec_enabled);
2837 EXPECT_TRUE(agc_enabled);
2838 EXPECT_TRUE(ns_enabled);
2839
2840 channel1->SetSend(cricket::SEND_MICROPHONE);
2841 voe_.GetEcStatus(ec_enabled, ec_mode);
2842 voe_.GetAgcStatus(agc_enabled, agc_mode);
2843 voe_.GetNsStatus(ns_enabled, ns_mode);
2844 EXPECT_TRUE(ec_enabled);
2845 EXPECT_TRUE(agc_enabled);
2846 EXPECT_FALSE(ns_enabled);
2847
2848 channel1->SetSend(cricket::SEND_NOTHING);
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 channel2->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_FALSE(agc_enabled);
2862 EXPECT_TRUE(ns_enabled);
2863
2864 channel2->SetSend(cricket::SEND_NOTHING);
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_TRUE(agc_enabled);
2870 EXPECT_TRUE(ns_enabled);
2871
2872 // Make sure settings take effect while we are sending.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002873 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
2874 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
pbos6bb1b6e2015-07-24 07:10:18 -07002994TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002995 // Test that changing the combined_audio_video_bwe option results in the
2996 // expected state changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002997 std::vector<uint32_t> ssrcs;
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002998 ssrcs.push_back(223);
2999 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003000
solenberg1ac56142015-10-13 03:58:19 -07003001 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003002 cricket::WebRtcVoiceMediaChannel* media_channel =
3003 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02003004 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003005 EXPECT_TRUE(media_channel->AddRecvStream(
3006 cricket::StreamParams::CreateLegacy(ssrc)));
3007 }
3008 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003009
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003010 // Combined BWE should be disabled.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003011 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003012 const auto* s = call_.GetAudioReceiveStream(ssrc);
3013 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07003014 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003015 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003016
3017 // Enable combined BWE option - now it should be set up.
Karl Wibergbe579832015-11-10 22:34:18 +01003018 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003019 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003020 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003021 const auto* s = call_.GetAudioReceiveStream(ssrc);
3022 EXPECT_NE(nullptr, s);
3023 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
3024 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003025
3026 // Disable combined BWE option - should be disabled again.
Karl Wibergbe579832015-11-10 22:34:18 +01003027 send_parameters_.options.combined_audio_video_bwe =
3028 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003029 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003030 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003031 const auto* s = call_.GetAudioReceiveStream(ssrc);
3032 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07003033 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003034 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003035
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003036 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003037}
3038
pbos6bb1b6e2015-07-24 07:10:18 -07003039TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003040 // Test that adding receive streams after enabling combined bandwidth
3041 // estimation will correctly configure each channel.
solenberg1ac56142015-10-13 03:58:19 -07003042 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003043 cricket::WebRtcVoiceMediaChannel* media_channel =
3044 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003045 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003046 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003047
Peter Boström0c4e06b2015-10-07 12:23:21 +02003048 static const uint32_t kSsrcs[] = {1, 2, 3, 4};
tfarina5237aaf2015-11-10 23:44:30 -08003049 for (unsigned int i = 0; i < arraysize(kSsrcs); ++i) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003050 EXPECT_TRUE(media_channel->AddRecvStream(
3051 cricket::StreamParams::CreateLegacy(kSsrcs[i])));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003052 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(kSsrcs[i]));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003053 }
tfarina5237aaf2015-11-10 23:44:30 -08003054 EXPECT_EQ(arraysize(kSsrcs), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003055}
3056
solenberg3a941542015-11-16 07:34:50 -08003057// TODO(solenberg): Remove, once recv streams are configured through Call.
3058// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003059TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003060 // Test that setting the header extensions results in the expected state
3061 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003062 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003063 ssrcs.push_back(223);
3064 ssrcs.push_back(224);
3065
solenberg1ac56142015-10-13 03:58:19 -07003066 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003067 cricket::WebRtcVoiceMediaChannel* media_channel =
3068 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003069 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003070 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003071 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003072 EXPECT_TRUE(media_channel->AddRecvStream(
3073 cricket::StreamParams::CreateLegacy(ssrc)));
3074 }
3075
3076 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003077 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003078 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003079 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003080 EXPECT_NE(nullptr, s);
3081 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3082 }
3083
3084 // Set up receive extensions.
3085 const auto& e_exts = engine_.rtp_header_extensions();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003086 cricket::AudioRecvParameters recv_parameters;
3087 recv_parameters.extensions = e_exts;
3088 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003089 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003090 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003091 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003092 EXPECT_NE(nullptr, s);
3093 const auto& s_exts = s->GetConfig().rtp.extensions;
3094 EXPECT_EQ(e_exts.size(), s_exts.size());
3095 for (const auto& e_ext : e_exts) {
3096 for (const auto& s_ext : s_exts) {
3097 if (e_ext.id == s_ext.id) {
3098 EXPECT_EQ(e_ext.uri, s_ext.name);
3099 }
3100 }
3101 }
3102 }
3103
3104 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003105 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003106 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003107 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003108 EXPECT_NE(nullptr, s);
3109 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3110 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003111}
3112
3113TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3114 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003115 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003116 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3117 static const unsigned char kRtcp[] = {
3118 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3119 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3122 };
3123 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3124
solenberg1ac56142015-10-13 03:58:19 -07003125 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003126 cricket::WebRtcVoiceMediaChannel* media_channel =
3127 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003128 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003129 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003130 EXPECT_TRUE(media_channel->AddRecvStream(
3131 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3132
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003133 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003134 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003135 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003136 EXPECT_EQ(0, s->received_packets());
3137 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3138 EXPECT_EQ(1, s->received_packets());
3139 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3140 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003141}
Minyue2013aec2015-05-13 14:14:42 +02003142
solenberg0a617e22015-10-20 15:49:38 -07003143// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003144// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003145TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenberg1ac56142015-10-13 03:58:19 -07003146 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003147 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003148 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003149 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3150 int recv_ch = voe_.GetLastChannel();
3151 EXPECT_NE(recv_ch, default_channel);
3152 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3153 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3154 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003155 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3156 recv_ch = voe_.GetLastChannel();
3157 EXPECT_NE(recv_ch, default_channel);
3158 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003159}
3160
3161TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003162 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003163 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003164
3165 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3166 int recv_ch = voe_.GetLastChannel();
3167
3168 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3169 int send_ch = voe_.GetLastChannel();
3170
3171 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3172 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3173 // channel of |recv_ch|.This is not a common case, since, normally, only the
3174 // default channel can be associated. However, the default is not deletable.
3175 // So we force the |recv_ch| to associate with a non-default channel.
3176 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3177 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3178
3179 EXPECT_TRUE(channel_->RemoveSendStream(2));
3180 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3181}
stefan658910c2015-09-03 05:48:32 -07003182
3183// Tests for the actual WebRtc VoE library.
3184
3185TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
3186 cricket::WebRtcVoiceEngine engine;
3187 cricket::AudioOptions options = engine.GetOptions();
3188 // The default options should have at least a few things set. We purposefully
3189 // don't check the option values here, though.
kwiberg102c6a62015-10-30 02:47:38 -07003190 EXPECT_TRUE(options.echo_cancellation);
3191 EXPECT_TRUE(options.auto_gain_control);
3192 EXPECT_TRUE(options.noise_suppression);
stefan658910c2015-09-03 05:48:32 -07003193}
3194
3195// Tests that the library initializes and shuts down properly.
3196TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3197 cricket::WebRtcVoiceEngine engine;
3198 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003199 rtc::scoped_ptr<webrtc::Call> call(
3200 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003201 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003202 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003203 EXPECT_TRUE(channel != nullptr);
3204 delete channel;
3205 engine.Terminate();
3206
3207 // Reinit to catch regression where VoiceEngineObserver reference is lost
3208 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3209 engine.Terminate();
3210}
3211
3212// Tests that the library is configured with the codecs we want.
3213TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
3214 cricket::WebRtcVoiceEngine engine;
3215 // Check codecs by name.
3216 EXPECT_TRUE(engine.FindCodec(
3217 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0)));
3218 EXPECT_TRUE(engine.FindCodec(
3219 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0)));
3220 EXPECT_TRUE(engine.FindCodec(
3221 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0)));
3222 // Check that name matching is case-insensitive.
3223 EXPECT_TRUE(engine.FindCodec(
3224 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0)));
3225 EXPECT_TRUE(engine.FindCodec(
3226 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0)));
3227 EXPECT_TRUE(engine.FindCodec(
3228 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0)));
3229 EXPECT_TRUE(engine.FindCodec(
3230 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0)));
3231 EXPECT_TRUE(engine.FindCodec(
3232 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0)));
3233 EXPECT_TRUE(engine.FindCodec(
3234 cricket::AudioCodec(96, "red", 8000, 0, 1, 0)));
3235 EXPECT_TRUE(engine.FindCodec(
3236 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0)));
3237 EXPECT_TRUE(engine.FindCodec(
3238 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0)));
3239 EXPECT_TRUE(engine.FindCodec(
3240 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0)));
3241 EXPECT_TRUE(engine.FindCodec(
3242 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0)));
3243 // Check codecs with an id by id.
3244 EXPECT_TRUE(engine.FindCodec(
3245 cricket::AudioCodec(0, "", 8000, 0, 1, 0))); // PCMU
3246 EXPECT_TRUE(engine.FindCodec(
3247 cricket::AudioCodec(8, "", 8000, 0, 1, 0))); // PCMA
3248 EXPECT_TRUE(engine.FindCodec(
3249 cricket::AudioCodec(9, "", 8000, 0, 1, 0))); // G722
3250 EXPECT_TRUE(engine.FindCodec(
3251 cricket::AudioCodec(13, "", 8000, 0, 1, 0))); // CN
3252 // Check sample/bitrate matching.
3253 EXPECT_TRUE(engine.FindCodec(
3254 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0)));
3255 // Check that bad codecs fail.
3256 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0)));
3257 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(88, "", 0, 0, 1, 0)));
3258 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 0, 2, 0)));
3259 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 5000, 0, 1, 0)));
3260 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 5000, 1, 0)));
3261 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3262 for (std::vector<cricket::AudioCodec>::const_iterator it =
3263 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3264 if (it->name == "CN" && it->clockrate == 16000) {
3265 EXPECT_EQ(105, it->id);
3266 } else if (it->name == "CN" && it->clockrate == 32000) {
3267 EXPECT_EQ(106, it->id);
3268 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3269 EXPECT_EQ(103, it->id);
3270 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3271 EXPECT_EQ(104, it->id);
3272 } else if (it->name == "G722" && it->clockrate == 8000) {
3273 EXPECT_EQ(9, it->id);
3274 } else if (it->name == "telephone-event") {
3275 EXPECT_EQ(126, it->id);
3276 } else if (it->name == "red") {
3277 EXPECT_EQ(127, it->id);
3278 } else if (it->name == "opus") {
3279 EXPECT_EQ(111, it->id);
3280 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3281 EXPECT_EQ("10", it->params.find("minptime")->second);
3282 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3283 EXPECT_EQ("60", it->params.find("maxptime")->second);
3284 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3285 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3286 }
3287 }
3288
3289 engine.Terminate();
3290}
3291
3292// Tests that VoE supports at least 32 channels
3293TEST(WebRtcVoiceEngineTest, Has32Channels) {
3294 cricket::WebRtcVoiceEngine engine;
3295 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003296 rtc::scoped_ptr<webrtc::Call> call(
3297 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003298
3299 cricket::VoiceMediaChannel* channels[32];
3300 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003301 while (num_channels < arraysize(channels)) {
stefan658910c2015-09-03 05:48:32 -07003302 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003303 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003304 if (!channel)
3305 break;
stefan658910c2015-09-03 05:48:32 -07003306 channels[num_channels++] = channel;
3307 }
3308
tfarina5237aaf2015-11-10 23:44:30 -08003309 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003310 EXPECT_EQ(expected, num_channels);
3311
3312 while (num_channels > 0) {
3313 delete channels[--num_channels];
3314 }
stefan658910c2015-09-03 05:48:32 -07003315 engine.Terminate();
3316}
3317
3318// Test that we set our preferred codecs properly.
3319TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3320 cricket::WebRtcVoiceEngine engine;
3321 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003322 rtc::scoped_ptr<webrtc::Call> call(
3323 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003324 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3325 call.get());
3326 cricket::AudioRecvParameters parameters;
3327 parameters.codecs = engine.codecs();
3328 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003329}