blob: b52f6fc4fe29b4bda6875a8a883470eeb26b3071 [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};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020078} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000079
80class WebRtcVoiceEngineTestFake : public testing::Test {
81 public:
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082 WebRtcVoiceEngineTestFake()
Fredrik Solenberg709ed672015-09-15 12:26:33 +020083 : call_(webrtc::Call::Config()),
tfarina5237aaf2015-11-10 23:44:30 -080084 voe_(kAudioCodecs, arraysize(kAudioCodecs)),
solenbergbd138382015-11-20 16:08:07 -080085 engine_(new FakeVoEWrapper(&voe_)),
Jelena Marusicc28a8962015-05-29 15:05:44 +020086 channel_(nullptr) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +020087 send_parameters_.codecs.push_back(kPcmuCodec);
88 recv_parameters_.codecs.push_back(kPcmuCodec);
Karl Wibergbe579832015-11-10 22:34:18 +010089 options_adjust_agc_.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000090 }
solenberg1ac56142015-10-13 03:58:19 -070091 bool SetupEngine() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000092 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000093 return false;
94 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +020095 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +020096 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000097 }
solenberg1ac56142015-10-13 03:58:19 -070098 bool SetupEngineWithRecvStream() {
99 if (!SetupEngine()) {
100 return false;
101 }
102 return channel_->AddRecvStream(
103 cricket::StreamParams::CreateLegacy(kSsrc1));
104 }
105 bool SetupEngineWithSendStream() {
106 if (!SetupEngine()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000107 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000108 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000109 return channel_->AddSendStream(
110 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000111 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000112 void SetupForMultiSendStream() {
solenberg1ac56142015-10-13 03:58:19 -0700113 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700114 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800115 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700116 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700117 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800118 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000119 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000120 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200121 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000122 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000123 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200124 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000125 delete channel_;
126 engine_.Terminate();
127 }
128
solenberg3a941542015-11-16 07:34:50 -0800129 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
130 const auto* send_stream = call_.GetAudioSendStream(ssrc);
131 EXPECT_TRUE(send_stream);
132 return send_stream->GetConfig();
133 }
134
solenberg7add0582015-11-20 09:59:34 -0800135 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
136 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
137 EXPECT_TRUE(recv_stream);
138 return recv_stream->GetConfig();
139 }
140
Peter Boström0c4e06b2015-10-07 12:23:21 +0200141 void TestInsertDtmf(uint32_t ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000142 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200143 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200144 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000145 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700146 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000147 // send stream.
148 EXPECT_TRUE(channel_->AddSendStream(
149 cricket::StreamParams::CreateLegacy(kSsrc1)));
150 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000151
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000152 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200153 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000154 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
155 EXPECT_FALSE(channel_->CanInsertDtmf());
156 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111, cricket::DF_SEND));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200157 send_parameters_.codecs.push_back(kTelephoneEventCodec);
158 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000159 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000160
161 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700162 // If this is callee, there's no active send channel yet.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000163 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
164 EXPECT_TRUE(channel_->AddSendStream(
165 cricket::StreamParams::CreateLegacy(kSsrc1)));
166 }
167
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000168 // Check we fail if the ssrc is invalid.
169 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111, cricket::DF_SEND));
170
171 // Test send
solenberg0a617e22015-10-20 15:49:38 -0700172 int channel_id = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000173 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
174 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
175 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
176
177 // Test play
178 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(3, 134));
179 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 3, 134, cricket::DF_PLAY));
180 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(3, 134));
181
182 // Test send and play
183 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
184 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(4, 145));
185 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 4, 145,
186 cricket::DF_PLAY | cricket::DF_SEND));
187 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
188 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(4, 145));
189 }
190
191 // Test that send bandwidth is set correctly.
192 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000193 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
194 // |expected_result| is the expected result from SetMaxSendBandwidth().
195 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000196 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000197 int max_bitrate,
198 bool expected_result,
199 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200200 cricket::AudioSendParameters parameters;
201 parameters.codecs.push_back(codec);
202 parameters.max_bandwidth_bps = max_bitrate;
203 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
204
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000205 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000206 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000207 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000208 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000209 }
210
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000211 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenberg0a617e22015-10-20 15:49:38 -0700212 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000213
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000214 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800215 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000216
217 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200218 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000219 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200220 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800221 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000222
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000223 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200224 send_parameters_.extensions.clear();
225 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800226 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000227
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000228 // Ensure extension is set properly.
229 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200230 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
231 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800232 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
233 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
234 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000235
solenberg7add0582015-11-20 09:59:34 -0800236 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000237 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700238 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800239 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
240 call_.GetAudioSendStream(kSsrc2));
241 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
242 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
243 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000244
245 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200246 send_parameters_.codecs.push_back(kPcmuCodec);
247 send_parameters_.extensions.clear();
248 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800249 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
250 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000251 }
252
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000253 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700254 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000255
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000256 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800257 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000258
259 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800260 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000261 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800262 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
263 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000264
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000265 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800266 recv_parameters_.extensions.clear();
267 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
268 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000269
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000270 // Ensure extension is set properly.
271 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800272 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
273 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
274 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
275 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
276 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000277
solenberg7add0582015-11-20 09:59:34 -0800278 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000279 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700280 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800281 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
282 call_.GetAudioReceiveStream(kSsrc2));
283 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
284 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
285 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000286
287 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800288 recv_parameters_.extensions.clear();
289 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
290 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
291 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000292 }
293
solenberg85a04962015-10-27 03:35:21 -0700294 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
295 webrtc::AudioSendStream::Stats stats;
296 stats.local_ssrc = 12;
297 stats.bytes_sent = 345;
298 stats.packets_sent = 678;
299 stats.packets_lost = 9012;
300 stats.fraction_lost = 34.56f;
301 stats.codec_name = "codec_name_send";
302 stats.ext_seqnum = 789;
303 stats.jitter_ms = 12;
304 stats.rtt_ms = 345;
305 stats.audio_level = 678;
306 stats.aec_quality_min = 9.01f;
307 stats.echo_delay_median_ms = 234;
308 stats.echo_delay_std_ms = 567;
309 stats.echo_return_loss = 890;
310 stats.echo_return_loss_enhancement = 1234;
311 stats.typing_noise_detected = true;
312 return stats;
313 }
314 void SetAudioSendStreamStats() {
315 for (auto* s : call_.GetAudioSendStreams()) {
316 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200317 }
solenberg85a04962015-10-27 03:35:21 -0700318 }
solenberg566ef242015-11-06 15:34:49 -0800319 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
320 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700321 const auto stats = GetAudioSendStreamStats();
322 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
323 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
324 EXPECT_EQ(info.packets_sent, stats.packets_sent);
325 EXPECT_EQ(info.packets_lost, stats.packets_lost);
326 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
327 EXPECT_EQ(info.codec_name, stats.codec_name);
328 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
329 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
330 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
331 EXPECT_EQ(info.audio_level, stats.audio_level);
332 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
333 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
334 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
335 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
336 EXPECT_EQ(info.echo_return_loss_enhancement,
337 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800338 EXPECT_EQ(info.typing_noise_detected,
339 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700340 }
341
342 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
343 webrtc::AudioReceiveStream::Stats stats;
344 stats.remote_ssrc = 123;
345 stats.bytes_rcvd = 456;
346 stats.packets_rcvd = 768;
347 stats.packets_lost = 101;
348 stats.fraction_lost = 23.45f;
349 stats.codec_name = "codec_name_recv";
350 stats.ext_seqnum = 678;
351 stats.jitter_ms = 901;
352 stats.jitter_buffer_ms = 234;
353 stats.jitter_buffer_preferred_ms = 567;
354 stats.delay_estimate_ms = 890;
355 stats.audio_level = 1234;
356 stats.expand_rate = 5.67f;
357 stats.speech_expand_rate = 8.90f;
358 stats.secondary_decoded_rate = 1.23f;
359 stats.accelerate_rate = 4.56f;
360 stats.preemptive_expand_rate = 7.89f;
361 stats.decoding_calls_to_silence_generator = 12;
362 stats.decoding_calls_to_neteq = 345;
363 stats.decoding_normal = 67890;
364 stats.decoding_plc = 1234;
365 stats.decoding_cng = 5678;
366 stats.decoding_plc_cng = 9012;
367 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200368 return stats;
369 }
370 void SetAudioReceiveStreamStats() {
371 for (auto* s : call_.GetAudioReceiveStreams()) {
372 s->SetStats(GetAudioReceiveStreamStats());
373 }
374 }
375 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700376 const auto stats = GetAudioReceiveStreamStats();
377 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
378 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
379 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
380 EXPECT_EQ(info.packets_lost, stats.packets_lost);
381 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
382 EXPECT_EQ(info.codec_name, stats.codec_name);
383 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
384 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
385 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200386 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700387 stats.jitter_buffer_preferred_ms);
388 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
389 EXPECT_EQ(info.audio_level, stats.audio_level);
390 EXPECT_EQ(info.expand_rate, stats.expand_rate);
391 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
392 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
393 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
394 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200395 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700396 stats.decoding_calls_to_silence_generator);
397 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
398 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
399 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
400 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
401 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
402 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200403 }
404
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000405 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200406 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000407 cricket::FakeWebRtcVoiceEngine voe_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000408 cricket::WebRtcVoiceEngine engine_;
409 cricket::VoiceMediaChannel* channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000410
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200411 cricket::AudioSendParameters send_parameters_;
412 cricket::AudioRecvParameters recv_parameters_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000413 cricket::AudioOptions options_adjust_agc_;
414};
415
416// Tests that our stub library "works".
417TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
418 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000419 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000420 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000421 engine_.Terminate();
422 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000423}
424
425// Tests that we can create and destroy a channel.
426TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000427 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200428 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200429 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000430}
431
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000432// Tests that the list of supported codecs is created properly and ordered
433// correctly
434TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
435 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
436 ASSERT_FALSE(codecs.empty());
437 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
438 EXPECT_EQ(48000, codecs[0].clockrate);
439 EXPECT_EQ(2, codecs[0].channels);
440 EXPECT_EQ(64000, codecs[0].bitrate);
441 int pref = codecs[0].preference;
442 for (size_t i = 1; i < codecs.size(); ++i) {
443 EXPECT_GT(pref, codecs[i].preference);
444 pref = codecs[i].preference;
445 }
446}
447
448// Tests that we can find codecs by name or id, and that we interpret the
449// clockrate and bitrate fields properly.
450TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
451 cricket::AudioCodec codec;
452 webrtc::CodecInst codec_inst;
453 // Find PCMU with explicit clockrate and bitrate.
454 EXPECT_TRUE(engine_.FindWebRtcCodec(kPcmuCodec, &codec_inst));
455 // Find ISAC with explicit clockrate and 0 bitrate.
456 EXPECT_TRUE(engine_.FindWebRtcCodec(kIsacCodec, &codec_inst));
457 // Find telephone-event with explicit clockrate and 0 bitrate.
458 EXPECT_TRUE(engine_.FindWebRtcCodec(kTelephoneEventCodec, &codec_inst));
459 // Find ISAC with a different payload id.
460 codec = kIsacCodec;
461 codec.id = 127;
462 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
463 EXPECT_EQ(codec.id, codec_inst.pltype);
464 // Find PCMU with a 0 clockrate.
465 codec = kPcmuCodec;
466 codec.clockrate = 0;
467 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
468 EXPECT_EQ(codec.id, codec_inst.pltype);
469 EXPECT_EQ(8000, codec_inst.plfreq);
470 // Find PCMU with a 0 bitrate.
471 codec = kPcmuCodec;
472 codec.bitrate = 0;
473 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
474 EXPECT_EQ(codec.id, codec_inst.pltype);
475 EXPECT_EQ(64000, codec_inst.rate);
476 // Find ISAC with an explicit bitrate.
477 codec = kIsacCodec;
478 codec.bitrate = 32000;
479 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
480 EXPECT_EQ(codec.id, codec_inst.pltype);
481 EXPECT_EQ(32000, codec_inst.rate);
482}
483
484// Test that we set our inbound codecs properly, including changing PT.
485TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
486 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200487 cricket::AudioRecvParameters parameters;
488 parameters.codecs.push_back(kIsacCodec);
489 parameters.codecs.push_back(kPcmuCodec);
490 parameters.codecs.push_back(kTelephoneEventCodec);
491 parameters.codecs[0].id = 106; // collide with existing telephone-event
492 parameters.codecs[2].id = 126;
493 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700494 EXPECT_TRUE(channel_->AddRecvStream(
495 cricket::StreamParams::CreateLegacy(kSsrc1)));
496 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000497 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800498 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000499 gcodec.plfreq = 16000;
500 gcodec.channels = 1;
501 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
502 EXPECT_EQ(106, gcodec.pltype);
503 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800504 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000505 gcodec.plfreq = 8000;
506 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
507 EXPECT_EQ(126, gcodec.pltype);
508 EXPECT_STREQ("telephone-event", gcodec.plname);
509}
510
511// Test that we fail to set an unknown inbound codec.
512TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
513 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200514 cricket::AudioRecvParameters parameters;
515 parameters.codecs.push_back(kIsacCodec);
516 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
517 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000518}
519
520// Test that we fail if we have duplicate types in the inbound list.
521TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
522 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200523 cricket::AudioRecvParameters parameters;
524 parameters.codecs.push_back(kIsacCodec);
525 parameters.codecs.push_back(kCn16000Codec);
526 parameters.codecs[1].id = kIsacCodec.id;
527 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000528}
529
530// Test that we can decode OPUS without stereo parameters.
531TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
532 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200533 cricket::AudioRecvParameters parameters;
534 parameters.codecs.push_back(kIsacCodec);
535 parameters.codecs.push_back(kPcmuCodec);
536 parameters.codecs.push_back(kOpusCodec);
537 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000538 EXPECT_TRUE(channel_->AddRecvStream(
539 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700540 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000541 webrtc::CodecInst opus;
542 engine_.FindWebRtcCodec(kOpusCodec, &opus);
543 // Even without stereo parameters, recv codecs still specify channels = 2.
544 EXPECT_EQ(2, opus.channels);
545 EXPECT_EQ(111, opus.pltype);
546 EXPECT_STREQ("opus", opus.plname);
547 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700548 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000549 EXPECT_EQ(111, opus.pltype);
550}
551
552// Test that we can decode OPUS with stereo = 0.
553TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
554 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200555 cricket::AudioRecvParameters parameters;
556 parameters.codecs.push_back(kIsacCodec);
557 parameters.codecs.push_back(kPcmuCodec);
558 parameters.codecs.push_back(kOpusCodec);
559 parameters.codecs[2].params["stereo"] = "0";
560 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000561 EXPECT_TRUE(channel_->AddRecvStream(
562 cricket::StreamParams::CreateLegacy(kSsrc1)));
563 int channel_num2 = voe_.GetLastChannel();
564 webrtc::CodecInst opus;
565 engine_.FindWebRtcCodec(kOpusCodec, &opus);
566 // Even when stereo is off, recv codecs still specify channels = 2.
567 EXPECT_EQ(2, opus.channels);
568 EXPECT_EQ(111, opus.pltype);
569 EXPECT_STREQ("opus", opus.plname);
570 opus.pltype = 0;
571 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
572 EXPECT_EQ(111, opus.pltype);
573}
574
575// Test that we can decode OPUS with stereo = 1.
576TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
577 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200578 cricket::AudioRecvParameters parameters;
579 parameters.codecs.push_back(kIsacCodec);
580 parameters.codecs.push_back(kPcmuCodec);
581 parameters.codecs.push_back(kOpusCodec);
582 parameters.codecs[2].params["stereo"] = "1";
583 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000584 EXPECT_TRUE(channel_->AddRecvStream(
585 cricket::StreamParams::CreateLegacy(kSsrc1)));
586 int channel_num2 = voe_.GetLastChannel();
587 webrtc::CodecInst opus;
588 engine_.FindWebRtcCodec(kOpusCodec, &opus);
589 EXPECT_EQ(2, opus.channels);
590 EXPECT_EQ(111, opus.pltype);
591 EXPECT_STREQ("opus", opus.plname);
592 opus.pltype = 0;
593 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
594 EXPECT_EQ(111, opus.pltype);
595}
596
597// Test that changes to recv codecs are applied to all streams.
598TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
599 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200600 cricket::AudioRecvParameters parameters;
601 parameters.codecs.push_back(kIsacCodec);
602 parameters.codecs.push_back(kPcmuCodec);
603 parameters.codecs.push_back(kTelephoneEventCodec);
604 parameters.codecs[0].id = 106; // collide with existing telephone-event
605 parameters.codecs[2].id = 126;
606 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000607 EXPECT_TRUE(channel_->AddRecvStream(
608 cricket::StreamParams::CreateLegacy(kSsrc1)));
609 int channel_num2 = voe_.GetLastChannel();
610 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800611 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000612 gcodec.plfreq = 16000;
613 gcodec.channels = 1;
614 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
615 EXPECT_EQ(106, gcodec.pltype);
616 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800617 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000618 gcodec.plfreq = 8000;
619 gcodec.channels = 1;
620 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
621 EXPECT_EQ(126, gcodec.pltype);
622 EXPECT_STREQ("telephone-event", gcodec.plname);
623}
624
625TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenberg1ac56142015-10-13 03:58:19 -0700626 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200627 cricket::AudioRecvParameters parameters;
628 parameters.codecs.push_back(kIsacCodec);
629 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200630 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631
632 int channel_num2 = voe_.GetLastChannel();
633 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800634 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000635 gcodec.plfreq = 16000;
636 gcodec.channels = 1;
637 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
638 EXPECT_EQ(106, gcodec.pltype);
639 EXPECT_STREQ("ISAC", gcodec.plname);
640}
641
642// Test that we can apply the same set of codecs again while playing.
643TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700644 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200645 cricket::AudioRecvParameters parameters;
646 parameters.codecs.push_back(kIsacCodec);
647 parameters.codecs.push_back(kCn16000Codec);
648 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000649 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200650 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000651
652 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200653 parameters.codecs[0].id = 127;
654 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
655 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000656 EXPECT_TRUE(voe_.GetPlayout(channel_num));
657}
658
659// Test that we can add a codec while playing.
660TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700661 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200662 cricket::AudioRecvParameters parameters;
663 parameters.codecs.push_back(kIsacCodec);
664 parameters.codecs.push_back(kCn16000Codec);
665 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000666 EXPECT_TRUE(channel_->SetPlayout(true));
667
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200668 parameters.codecs.push_back(kOpusCodec);
669 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
670 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000671 EXPECT_TRUE(voe_.GetPlayout(channel_num));
672 webrtc::CodecInst gcodec;
673 EXPECT_TRUE(engine_.FindWebRtcCodec(kOpusCodec, &gcodec));
674 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
675}
676
677TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenberg1ac56142015-10-13 03:58:19 -0700678 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000679
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000680 // Test that when autobw is enabled, bitrate is kept as the default
681 // value. autobw is enabled for the following tests because the target
682 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000683
684 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000685 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000686
687 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000688 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000689
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000690 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000691 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692}
693
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000694TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700695 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000696
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000697 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000698
699 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000700 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
701 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000702
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000703 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000704 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
705 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000706}
707
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000708TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700709 EXPECT_TRUE(SetupEngineWithSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000710
711 // Test that we can only set a maximum bitrate for a fixed-rate codec
712 // if it's bigger than the fixed rate.
713
714 // PCMU, fixed bitrate == 64000.
715 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
716 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
717 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
718 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
719 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
720 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
721 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
722}
723
724TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -0700725 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200726 const int kDesiredBitrate = 128000;
727 cricket::AudioSendParameters parameters;
728 parameters.codecs = engine_.codecs();
729 parameters.max_bandwidth_bps = kDesiredBitrate;
730 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000731
732 EXPECT_TRUE(channel_->AddSendStream(
733 cricket::StreamParams::CreateLegacy(kSsrc1)));
734
735 int channel_num = voe_.GetLastChannel();
736 webrtc::CodecInst codec;
737 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200738 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000739}
740
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000741// Test that bitrate cannot be set for CBR codecs.
742// Bitrate is ignored if it is higher than the fixed bitrate.
743// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000744TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenberg1ac56142015-10-13 03:58:19 -0700745 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000746
747 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200748 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
749 int channel_num = voe_.GetLastChannel();
750 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000751 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
752 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200753
754 send_parameters_.max_bandwidth_bps = 128000;
755 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000756 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
757 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200758
759 send_parameters_.max_bandwidth_bps = 128;
760 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000761 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
762 EXPECT_EQ(64000, codec.rate);
763}
764
765// Test that we apply codecs properly.
766TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenberg1ac56142015-10-13 03:58:19 -0700767 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200768 cricket::AudioSendParameters parameters;
769 parameters.codecs.push_back(kIsacCodec);
770 parameters.codecs.push_back(kPcmuCodec);
771 parameters.codecs.push_back(kRedCodec);
772 parameters.codecs[0].id = 96;
773 parameters.codecs[0].bitrate = 48000;
774 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000775 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200776 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000777 webrtc::CodecInst gcodec;
778 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
779 EXPECT_EQ(96, gcodec.pltype);
780 EXPECT_EQ(48000, gcodec.rate);
781 EXPECT_STREQ("ISAC", gcodec.plname);
782 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000783 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000784 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
785 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
786 EXPECT_EQ(106, voe_.GetSendTelephoneEventPayloadType(channel_num));
787}
788
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000789// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
790// to apply.
791TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenberg1ac56142015-10-13 03:58:19 -0700792 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200793 cricket::AudioSendParameters parameters;
794 parameters.codecs.push_back(kIsacCodec);
795 parameters.codecs.push_back(kPcmuCodec);
796 parameters.codecs.push_back(kRedCodec);
797 parameters.codecs[0].id = 96;
798 parameters.codecs[0].bitrate = 48000;
799 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000800 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
801 // Calling SetSendCodec again with same codec which is already set.
802 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200803 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000804 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
805}
806
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000807// Verify that G722 is set with 16000 samples per second to WebRTC.
808TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenberg1ac56142015-10-13 03:58:19 -0700809 EXPECT_TRUE(SetupEngineWithSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000810 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200811 cricket::AudioSendParameters parameters;
812 parameters.codecs.push_back(kG722CodecSdp);
813 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000814 webrtc::CodecInst gcodec;
815 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
816 EXPECT_STREQ("G722", gcodec.plname);
817 EXPECT_EQ(1, gcodec.channels);
818 EXPECT_EQ(16000, gcodec.plfreq);
819}
820
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000821// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000822TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenberg1ac56142015-10-13 03:58:19 -0700823 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200824 cricket::AudioSendParameters parameters;
825 parameters.codecs.push_back(kOpusCodec);
826 parameters.codecs[0].bitrate = 0;
827 parameters.codecs[0].clockrate = 50000;
828 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000829}
830
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000831// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000832TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700833 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200834 cricket::AudioSendParameters parameters;
835 parameters.codecs.push_back(kOpusCodec);
836 parameters.codecs[0].bitrate = 0;
837 parameters.codecs[0].channels = 0;
838 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000839}
840
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000841// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000842TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700843 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200844 cricket::AudioSendParameters parameters;
845 parameters.codecs.push_back(kOpusCodec);
846 parameters.codecs[0].bitrate = 0;
847 parameters.codecs[0].channels = 0;
848 parameters.codecs[0].params["stereo"] = "1";
849 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000850}
851
852// Test that if channel is 1 for opus and there's no stereo, we fail.
853TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700854 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200855 cricket::AudioSendParameters parameters;
856 parameters.codecs.push_back(kOpusCodec);
857 parameters.codecs[0].bitrate = 0;
858 parameters.codecs[0].channels = 1;
859 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000860}
861
862// Test that if channel is 1 for opus and stereo=0, we fail.
863TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700864 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200865 cricket::AudioSendParameters parameters;
866 parameters.codecs.push_back(kOpusCodec);
867 parameters.codecs[0].bitrate = 0;
868 parameters.codecs[0].channels = 1;
869 parameters.codecs[0].params["stereo"] = "0";
870 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000871}
872
873// Test that if channel is 1 for opus and stereo=1, we fail.
874TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700875 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200876 cricket::AudioSendParameters parameters;
877 parameters.codecs.push_back(kOpusCodec);
878 parameters.codecs[0].bitrate = 0;
879 parameters.codecs[0].channels = 1;
880 parameters.codecs[0].params["stereo"] = "1";
881 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000882}
883
884// Test that with bitrate=0 and no stereo,
885// channels and bitrate are 1 and 32000.
886TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700887 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000888 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200889 cricket::AudioSendParameters parameters;
890 parameters.codecs.push_back(kOpusCodec);
891 parameters.codecs[0].bitrate = 0;
892 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000893 webrtc::CodecInst gcodec;
894 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
895 EXPECT_STREQ("opus", gcodec.plname);
896 EXPECT_EQ(1, gcodec.channels);
897 EXPECT_EQ(32000, gcodec.rate);
898}
899
900// Test that with bitrate=0 and stereo=0,
901// channels and bitrate are 1 and 32000.
902TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700903 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000904 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200905 cricket::AudioSendParameters parameters;
906 parameters.codecs.push_back(kOpusCodec);
907 parameters.codecs[0].bitrate = 0;
908 parameters.codecs[0].params["stereo"] = "0";
909 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000910 webrtc::CodecInst gcodec;
911 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
912 EXPECT_STREQ("opus", gcodec.plname);
913 EXPECT_EQ(1, gcodec.channels);
914 EXPECT_EQ(32000, gcodec.rate);
915}
916
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000917// Test that with bitrate=invalid and stereo=0,
918// channels and bitrate are 1 and 32000.
919TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700920 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000921 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200922 cricket::AudioSendParameters parameters;
923 parameters.codecs.push_back(kOpusCodec);
924 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000925 webrtc::CodecInst gcodec;
926
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000927 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200928 parameters.codecs[0].bitrate = 5999;
929 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000930 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
931 EXPECT_STREQ("opus", gcodec.plname);
932 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000933 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000934
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200935 parameters.codecs[0].bitrate = 510001;
936 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000937 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
938 EXPECT_STREQ("opus", gcodec.plname);
939 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000940 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000941}
942
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000943// Test that with bitrate=0 and stereo=1,
944// channels and bitrate are 2 and 64000.
945TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700946 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000947 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200948 cricket::AudioSendParameters parameters;
949 parameters.codecs.push_back(kOpusCodec);
950 parameters.codecs[0].bitrate = 0;
951 parameters.codecs[0].params["stereo"] = "1";
952 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000953 webrtc::CodecInst gcodec;
954 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
955 EXPECT_STREQ("opus", gcodec.plname);
956 EXPECT_EQ(2, gcodec.channels);
957 EXPECT_EQ(64000, gcodec.rate);
958}
959
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000960// Test that with bitrate=invalid and stereo=1,
961// channels and bitrate are 2 and 64000.
962TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700963 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000964 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200965 cricket::AudioSendParameters parameters;
966 parameters.codecs.push_back(kOpusCodec);
967 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000968 webrtc::CodecInst gcodec;
969
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000970 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200971 parameters.codecs[0].bitrate = 5999;
972 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000973 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
974 EXPECT_STREQ("opus", gcodec.plname);
975 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000976 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000977
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200978 parameters.codecs[0].bitrate = 510001;
979 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000980 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
981 EXPECT_STREQ("opus", gcodec.plname);
982 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000983 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000984}
985
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000986// Test that with bitrate=N and stereo unset,
987// channels and bitrate are 1 and N.
988TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700989 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000990 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200991 cricket::AudioSendParameters parameters;
992 parameters.codecs.push_back(kOpusCodec);
993 parameters.codecs[0].bitrate = 96000;
994 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000995 webrtc::CodecInst gcodec;
996 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
997 EXPECT_EQ(111, gcodec.pltype);
998 EXPECT_EQ(96000, gcodec.rate);
999 EXPECT_STREQ("opus", gcodec.plname);
1000 EXPECT_EQ(1, gcodec.channels);
1001 EXPECT_EQ(48000, gcodec.plfreq);
1002}
1003
1004// Test that with bitrate=N and stereo=0,
1005// channels and bitrate are 1 and N.
1006TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001007 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001008 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001009 cricket::AudioSendParameters parameters;
1010 parameters.codecs.push_back(kOpusCodec);
1011 parameters.codecs[0].bitrate = 30000;
1012 parameters.codecs[0].params["stereo"] = "0";
1013 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001014 webrtc::CodecInst gcodec;
1015 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1016 EXPECT_EQ(1, gcodec.channels);
1017 EXPECT_EQ(30000, gcodec.rate);
1018 EXPECT_STREQ("opus", gcodec.plname);
1019}
1020
1021// Test that with bitrate=N and without any parameters,
1022// channels and bitrate are 1 and N.
1023TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenberg1ac56142015-10-13 03:58:19 -07001024 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001025 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001026 cricket::AudioSendParameters parameters;
1027 parameters.codecs.push_back(kOpusCodec);
1028 parameters.codecs[0].bitrate = 30000;
1029 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001030 webrtc::CodecInst gcodec;
1031 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1032 EXPECT_EQ(1, gcodec.channels);
1033 EXPECT_EQ(30000, gcodec.rate);
1034 EXPECT_STREQ("opus", gcodec.plname);
1035}
1036
1037// Test that with bitrate=N and stereo=1,
1038// channels and bitrate are 2 and N.
1039TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001040 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001041 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001042 cricket::AudioSendParameters parameters;
1043 parameters.codecs.push_back(kOpusCodec);
1044 parameters.codecs[0].bitrate = 30000;
1045 parameters.codecs[0].params["stereo"] = "1";
1046 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001047 webrtc::CodecInst gcodec;
1048 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1049 EXPECT_EQ(2, gcodec.channels);
1050 EXPECT_EQ(30000, gcodec.rate);
1051 EXPECT_STREQ("opus", gcodec.plname);
1052}
1053
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001054// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1055// Also test that the "maxaveragebitrate" can't be set to values outside the
1056// range of 6000 and 510000
1057TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001058 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001059 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001060 cricket::AudioSendParameters parameters;
1061 parameters.codecs.push_back(kOpusCodec);
1062 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001063 webrtc::CodecInst gcodec;
1064
1065 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001066 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1067 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001068 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001069 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001070
1071 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001072 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
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(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001076
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001077 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1078 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001079 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1080 EXPECT_EQ(200000, gcodec.rate);
1081}
1082
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001083// Test that we can enable NACK with opus as caller.
1084TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001085 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001086 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001087 cricket::AudioSendParameters parameters;
1088 parameters.codecs.push_back(kOpusCodec);
1089 parameters.codecs[0].AddFeedbackParam(
1090 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1091 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001092 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001093 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001094 EXPECT_TRUE(voe_.GetNACK(channel_num));
1095}
1096
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001097// Test that we can enable NACK with opus as callee.
1098TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenberg0a617e22015-10-20 15:49:38 -07001099 EXPECT_TRUE(SetupEngineWithRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001100 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001101 cricket::AudioSendParameters parameters;
1102 parameters.codecs.push_back(kOpusCodec);
1103 parameters.codecs[0].AddFeedbackParam(
1104 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1105 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001106 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001107 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001108 EXPECT_FALSE(voe_.GetNACK(channel_num));
1109
1110 EXPECT_TRUE(channel_->AddSendStream(
1111 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001112 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001113}
1114
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001115// Test that we can enable NACK on receive streams.
1116TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001117 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001118 int channel_num1 = voe_.GetLastChannel();
1119 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1120 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001121 cricket::AudioSendParameters parameters;
1122 parameters.codecs.push_back(kOpusCodec);
1123 parameters.codecs[0].AddFeedbackParam(
1124 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1125 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001126 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1127 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001128 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001129 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1130 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1131}
1132
1133// Test that we can disable NACK.
1134TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001135 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001136 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001137 cricket::AudioSendParameters parameters;
1138 parameters.codecs.push_back(kOpusCodec);
1139 parameters.codecs[0].AddFeedbackParam(
1140 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1141 cricket::kParamValueEmpty));
1142 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001143 EXPECT_TRUE(voe_.GetNACK(channel_num));
1144
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001145 parameters.codecs.clear();
1146 parameters.codecs.push_back(kOpusCodec);
1147 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001148 EXPECT_FALSE(voe_.GetNACK(channel_num));
1149}
1150
1151// Test that we can disable NACK on receive streams.
1152TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001153 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001154 int channel_num1 = voe_.GetLastChannel();
1155 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1156 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001157 cricket::AudioSendParameters parameters;
1158 parameters.codecs.push_back(kOpusCodec);
1159 parameters.codecs[0].AddFeedbackParam(
1160 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1161 cricket::kParamValueEmpty));
1162 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001163 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1164 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1165
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001166 parameters.codecs.clear();
1167 parameters.codecs.push_back(kOpusCodec);
1168 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001169 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1170 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1171}
1172
1173// Test that NACK is enabled on a new receive stream.
1174TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001175 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001176 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001177 cricket::AudioSendParameters parameters;
1178 parameters.codecs.push_back(kIsacCodec);
1179 parameters.codecs.push_back(kCn16000Codec);
1180 parameters.codecs[0].AddFeedbackParam(
1181 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1182 cricket::kParamValueEmpty));
1183 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001184 EXPECT_TRUE(voe_.GetNACK(channel_num));
1185
1186 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1187 channel_num = voe_.GetLastChannel();
1188 EXPECT_TRUE(voe_.GetNACK(channel_num));
1189 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1190 channel_num = voe_.GetLastChannel();
1191 EXPECT_TRUE(voe_.GetNACK(channel_num));
1192}
1193
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001194// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001195TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenberg1ac56142015-10-13 03:58:19 -07001196 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001197 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001198 cricket::AudioSendParameters parameters;
1199 parameters.codecs.push_back(kOpusCodec);
1200 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001201 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1202}
1203
1204// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001205TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001206 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001207 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001208 cricket::AudioSendParameters parameters;
1209 parameters.codecs.push_back(kOpusCodec);
1210 parameters.codecs[0].bitrate = 0;
1211 parameters.codecs[0].params["useinbandfec"] = "0";
1212 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001213 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1214 webrtc::CodecInst gcodec;
1215 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1216 EXPECT_STREQ("opus", gcodec.plname);
1217 EXPECT_EQ(1, gcodec.channels);
1218 EXPECT_EQ(32000, gcodec.rate);
1219}
1220
1221// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001222TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001223 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001224 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001225 cricket::AudioSendParameters parameters;
1226 parameters.codecs.push_back(kOpusCodec);
1227 parameters.codecs[0].bitrate = 0;
1228 parameters.codecs[0].params["useinbandfec"] = "1";
1229 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001230 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1231 webrtc::CodecInst gcodec;
1232 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1233 EXPECT_STREQ("opus", gcodec.plname);
1234 EXPECT_EQ(1, gcodec.channels);
1235 EXPECT_EQ(32000, gcodec.rate);
1236}
1237
1238// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001239TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001240 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001241 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001242 cricket::AudioSendParameters parameters;
1243 parameters.codecs.push_back(kOpusCodec);
1244 parameters.codecs[0].bitrate = 0;
1245 parameters.codecs[0].params["stereo"] = "1";
1246 parameters.codecs[0].params["useinbandfec"] = "1";
1247 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001248 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1249 webrtc::CodecInst gcodec;
1250 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1251 EXPECT_STREQ("opus", gcodec.plname);
1252 EXPECT_EQ(2, gcodec.channels);
1253 EXPECT_EQ(64000, gcodec.rate);
1254}
1255
1256// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001257TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001258 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001259 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001260 cricket::AudioSendParameters parameters;
1261 parameters.codecs.push_back(kIsacCodec);
1262 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001263 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1264}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001265
1266// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1267TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001268 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001269 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001270 cricket::AudioSendParameters parameters;
1271 parameters.codecs.push_back(kIsacCodec);
1272 parameters.codecs[0].params["useinbandfec"] = "1";
1273 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001274 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1275}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001276
1277// Test that Opus FEC status can be changed.
1278TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenberg1ac56142015-10-13 03:58:19 -07001279 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001280 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001281 cricket::AudioSendParameters parameters;
1282 parameters.codecs.push_back(kOpusCodec);
1283 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001284 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001285 parameters.codecs[0].params["useinbandfec"] = "1";
1286 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001287 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1288}
1289
1290// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1291TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenberg1ac56142015-10-13 03:58:19 -07001292 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001293 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001294 cricket::AudioSendParameters parameters;
1295 parameters.codecs.push_back(kOpusCodec);
1296 parameters.codecs[0].bitrate = 0;
1297 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1298 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001299 EXPECT_EQ(cricket::kOpusBandwidthNb,
1300 voe_.GetMaxEncodingBandwidth(channel_num));
1301 webrtc::CodecInst gcodec;
1302 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1303 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001304
1305 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001306 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1307 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001308 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1309 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001310}
1311
1312// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1313TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenberg1ac56142015-10-13 03:58:19 -07001314 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001315 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001316 cricket::AudioSendParameters parameters;
1317 parameters.codecs.push_back(kOpusCodec);
1318 parameters.codecs[0].bitrate = 0;
1319 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1320 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001321 EXPECT_EQ(cricket::kOpusBandwidthMb,
1322 voe_.GetMaxEncodingBandwidth(channel_num));
1323 webrtc::CodecInst gcodec;
1324 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1325 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001326
1327 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001328 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1329 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001330 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1331 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001332}
1333
1334// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1335TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenberg1ac56142015-10-13 03:58:19 -07001336 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001337 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001338 cricket::AudioSendParameters parameters;
1339 parameters.codecs.push_back(kOpusCodec);
1340 parameters.codecs[0].bitrate = 0;
1341 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1342 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001343 EXPECT_EQ(cricket::kOpusBandwidthWb,
1344 voe_.GetMaxEncodingBandwidth(channel_num));
1345 webrtc::CodecInst gcodec;
1346 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1347 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001348
1349 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001350 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1351 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001352 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1353 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001354}
1355
1356// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1357TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenberg1ac56142015-10-13 03:58:19 -07001358 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001359 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001360 cricket::AudioSendParameters parameters;
1361 parameters.codecs.push_back(kOpusCodec);
1362 parameters.codecs[0].bitrate = 0;
1363 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1364 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001365 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1366 voe_.GetMaxEncodingBandwidth(channel_num));
1367 webrtc::CodecInst gcodec;
1368 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1369 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001370
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001371 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001372 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1373 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001374 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1375 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001376}
1377
1378// Test 24000 < maxplaybackrate triggers Opus full band mode.
1379TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenberg1ac56142015-10-13 03:58:19 -07001380 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001381 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001382 cricket::AudioSendParameters parameters;
1383 parameters.codecs.push_back(kOpusCodec);
1384 parameters.codecs[0].bitrate = 0;
1385 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1386 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001387 EXPECT_EQ(cricket::kOpusBandwidthFb,
1388 voe_.GetMaxEncodingBandwidth(channel_num));
1389 webrtc::CodecInst gcodec;
1390 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1391 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001392
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001393 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001394 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1395 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001396 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1397 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001398}
1399
1400// Test Opus that without maxplaybackrate, default playback rate is used.
1401TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001402 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001403 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001404 cricket::AudioSendParameters parameters;
1405 parameters.codecs.push_back(kOpusCodec);
1406 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001407 EXPECT_EQ(cricket::kOpusBandwidthFb,
1408 voe_.GetMaxEncodingBandwidth(channel_num));
1409}
1410
1411// Test the with non-Opus, maxplaybackrate has no effect.
1412TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001413 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001414 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001415 cricket::AudioSendParameters parameters;
1416 parameters.codecs.push_back(kIsacCodec);
1417 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1418 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001419 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1420}
1421
1422// Test maxplaybackrate can be set on two streams.
1423TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001424 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001425 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001426 cricket::AudioSendParameters parameters;
1427 parameters.codecs.push_back(kOpusCodec);
1428 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001429 // Default bandwidth is 24000.
1430 EXPECT_EQ(cricket::kOpusBandwidthFb,
1431 voe_.GetMaxEncodingBandwidth(channel_num));
1432
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001433 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001434
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001435 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001436 EXPECT_EQ(cricket::kOpusBandwidthNb,
1437 voe_.GetMaxEncodingBandwidth(channel_num));
1438
1439 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1440 channel_num = voe_.GetLastChannel();
1441 EXPECT_EQ(cricket::kOpusBandwidthNb,
1442 voe_.GetMaxEncodingBandwidth(channel_num));
1443}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001444
Minyue Li7100dcd2015-03-27 05:05:59 +01001445// Test that with usedtx=0, Opus DTX is off.
1446TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001447 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001448 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001449 cricket::AudioSendParameters parameters;
1450 parameters.codecs.push_back(kOpusCodec);
1451 parameters.codecs[0].params["usedtx"] = "0";
1452 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001453 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1454}
1455
1456// Test that with usedtx=1, Opus DTX is on.
1457TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001458 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001459 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001460 cricket::AudioSendParameters parameters;
1461 parameters.codecs.push_back(kOpusCodec);
1462 parameters.codecs[0].params["usedtx"] = "1";
1463 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001464 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1465 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1466}
1467
1468// Test that usedtx=1 works with stereo Opus.
1469TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001470 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001471 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001472 cricket::AudioSendParameters parameters;
1473 parameters.codecs.push_back(kOpusCodec);
1474 parameters.codecs[0].params["usedtx"] = "1";
1475 parameters.codecs[0].params["stereo"] = "1";
1476 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001477 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1478 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1479}
1480
1481// Test that usedtx=1 does not work with non Opus.
1482TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001483 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001484 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001485 cricket::AudioSendParameters parameters;
1486 parameters.codecs.push_back(kIsacCodec);
1487 parameters.codecs[0].params["usedtx"] = "1";
1488 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001489 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1490}
1491
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001492// Test that we can switch back and forth between Opus and ISAC with CN.
1493TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenberg1ac56142015-10-13 03:58:19 -07001494 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001495 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001496 cricket::AudioSendParameters opus_parameters;
1497 opus_parameters.codecs.push_back(kOpusCodec);
1498 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001499 webrtc::CodecInst gcodec;
1500 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001501 EXPECT_EQ(111, gcodec.pltype);
1502 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001503
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001504 cricket::AudioSendParameters isac_parameters;
1505 isac_parameters.codecs.push_back(kIsacCodec);
1506 isac_parameters.codecs.push_back(kCn16000Codec);
1507 isac_parameters.codecs.push_back(kOpusCodec);
1508 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001509 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1510 EXPECT_EQ(103, gcodec.pltype);
1511 EXPECT_STREQ("ISAC", gcodec.plname);
1512
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001513 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001514 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001515 EXPECT_EQ(111, gcodec.pltype);
1516 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001517}
1518
1519// Test that we handle various ways of specifying bitrate.
1520TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001521 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001522 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001523 cricket::AudioSendParameters parameters;
1524 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1525 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001526 webrtc::CodecInst gcodec;
1527 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1528 EXPECT_EQ(103, gcodec.pltype);
1529 EXPECT_STREQ("ISAC", gcodec.plname);
1530 EXPECT_EQ(32000, gcodec.rate);
1531
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001532 parameters.codecs[0].bitrate = 0; // bitrate == default
1533 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001534 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1535 EXPECT_EQ(103, gcodec.pltype);
1536 EXPECT_STREQ("ISAC", gcodec.plname);
1537 EXPECT_EQ(-1, gcodec.rate);
1538
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001539 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1540 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001541 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1542 EXPECT_EQ(103, gcodec.pltype);
1543 EXPECT_STREQ("ISAC", gcodec.plname);
1544 EXPECT_EQ(28000, gcodec.rate);
1545
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001546 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1547 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001548 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1549 EXPECT_EQ(0, gcodec.pltype);
1550 EXPECT_STREQ("PCMU", gcodec.plname);
1551 EXPECT_EQ(64000, gcodec.rate);
1552
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001553 parameters.codecs[0].bitrate = 0; // bitrate == default
1554 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001555 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1556 EXPECT_EQ(0, gcodec.pltype);
1557 EXPECT_STREQ("PCMU", gcodec.plname);
1558 EXPECT_EQ(64000, gcodec.rate);
1559
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001560 parameters.codecs[0] = kOpusCodec;
1561 parameters.codecs[0].bitrate = 0; // bitrate == default
1562 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001563 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1564 EXPECT_EQ(111, gcodec.pltype);
1565 EXPECT_STREQ("opus", gcodec.plname);
1566 EXPECT_EQ(32000, gcodec.rate);
1567}
1568
Brave Yao5225dd82015-03-26 07:39:19 +08001569// Test that we could set packet size specified in kCodecParamPTime.
1570TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenberg1ac56142015-10-13 03:58:19 -07001571 EXPECT_TRUE(SetupEngineWithSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001572 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001573 cricket::AudioSendParameters parameters;
1574 parameters.codecs.push_back(kOpusCodec);
1575 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1576 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001577 webrtc::CodecInst gcodec;
1578 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1579 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1580
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001581 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1582 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001583 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1584 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1585
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001586 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1587 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001588 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1589 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1590
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001591 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1592 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within 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(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1596
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001597 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1598 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
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(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1602}
1603
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001604// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001605TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenberg1ac56142015-10-13 03:58:19 -07001606 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001607 cricket::AudioSendParameters parameters;
1608 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001609}
1610
1611// Test that we can set send codecs even with telephone-event codec as the first
1612// one on the list.
1613TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001614 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001615 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001616 cricket::AudioSendParameters parameters;
1617 parameters.codecs.push_back(kTelephoneEventCodec);
1618 parameters.codecs.push_back(kIsacCodec);
1619 parameters.codecs.push_back(kPcmuCodec);
1620 parameters.codecs[0].id = 98; // DTMF
1621 parameters.codecs[1].id = 96;
1622 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001623 webrtc::CodecInst gcodec;
1624 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001625 EXPECT_EQ(96, gcodec.pltype);
1626 EXPECT_STREQ("ISAC", gcodec.plname);
1627 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1628}
1629
1630// Test that we can set send codecs even with CN codec as the first
1631// one on the list.
1632TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001633 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001634 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001635 cricket::AudioSendParameters parameters;
1636 parameters.codecs.push_back(kCn16000Codec);
1637 parameters.codecs.push_back(kIsacCodec);
1638 parameters.codecs.push_back(kPcmuCodec);
1639 parameters.codecs[0].id = 98; // wideband CN
1640 parameters.codecs[1].id = 96;
1641 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001642 webrtc::CodecInst gcodec;
1643 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1644 EXPECT_EQ(96, gcodec.pltype);
1645 EXPECT_STREQ("ISAC", gcodec.plname);
1646 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001647}
1648
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001649// Test that we set VAD and DTMF types correctly as caller.
1650TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001651 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001652 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001653 cricket::AudioSendParameters parameters;
1654 parameters.codecs.push_back(kIsacCodec);
1655 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001656 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001657 parameters.codecs.push_back(kCn16000Codec);
1658 parameters.codecs.push_back(kCn8000Codec);
1659 parameters.codecs.push_back(kTelephoneEventCodec);
1660 parameters.codecs.push_back(kRedCodec);
1661 parameters.codecs[0].id = 96;
1662 parameters.codecs[2].id = 97; // wideband CN
1663 parameters.codecs[4].id = 98; // DTMF
1664 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001665 webrtc::CodecInst gcodec;
1666 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1667 EXPECT_EQ(96, gcodec.pltype);
1668 EXPECT_STREQ("ISAC", gcodec.plname);
1669 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001670 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001671 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1672 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1673 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1674}
1675
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001676// Test that we set VAD and DTMF types correctly as callee.
1677TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001678 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001679 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001680 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001681
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001682 cricket::AudioSendParameters parameters;
1683 parameters.codecs.push_back(kIsacCodec);
1684 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001685 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001686 parameters.codecs.push_back(kCn16000Codec);
1687 parameters.codecs.push_back(kCn8000Codec);
1688 parameters.codecs.push_back(kTelephoneEventCodec);
1689 parameters.codecs.push_back(kRedCodec);
1690 parameters.codecs[0].id = 96;
1691 parameters.codecs[2].id = 97; // wideband CN
1692 parameters.codecs[4].id = 98; // DTMF
1693 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001694 EXPECT_TRUE(channel_->AddSendStream(
1695 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001696 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001697
1698 webrtc::CodecInst gcodec;
1699 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1700 EXPECT_EQ(96, gcodec.pltype);
1701 EXPECT_STREQ("ISAC", gcodec.plname);
1702 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001703 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001704 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1705 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1706 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1707}
1708
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001709// Test that we only apply VAD if we have a CN codec that matches the
1710// send codec clockrate.
1711TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenberg1ac56142015-10-13 03:58:19 -07001712 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001713 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001714 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001715 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001716 parameters.codecs.push_back(kIsacCodec);
1717 parameters.codecs.push_back(kCn16000Codec);
1718 parameters.codecs[1].id = 97;
1719 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001720 webrtc::CodecInst gcodec;
1721 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1722 EXPECT_STREQ("ISAC", gcodec.plname);
1723 EXPECT_TRUE(voe_.GetVAD(channel_num));
1724 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1725 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001726 parameters.codecs[0] = kPcmuCodec;
1727 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001728 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1729 EXPECT_STREQ("PCMU", gcodec.plname);
1730 EXPECT_FALSE(voe_.GetVAD(channel_num));
1731 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001732 parameters.codecs[1] = kCn8000Codec;
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_TRUE(voe_.GetVAD(channel_num));
1737 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001738 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001739 parameters.codecs[0] = kIsacCodec;
1740 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001741 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1742 EXPECT_STREQ("ISAC", gcodec.plname);
1743 EXPECT_FALSE(voe_.GetVAD(channel_num));
1744}
1745
1746// Test that we perform case-insensitive matching of codec names.
1747TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenberg1ac56142015-10-13 03:58:19 -07001748 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001749 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001750 cricket::AudioSendParameters parameters;
1751 parameters.codecs.push_back(kIsacCodec);
1752 parameters.codecs.push_back(kPcmuCodec);
1753 parameters.codecs.push_back(kCn16000Codec);
1754 parameters.codecs.push_back(kCn8000Codec);
1755 parameters.codecs.push_back(kTelephoneEventCodec);
1756 parameters.codecs.push_back(kRedCodec);
1757 parameters.codecs[0].name = "iSaC";
1758 parameters.codecs[0].id = 96;
1759 parameters.codecs[2].id = 97; // wideband CN
1760 parameters.codecs[4].id = 98; // DTMF
1761 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001762 webrtc::CodecInst gcodec;
1763 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1764 EXPECT_EQ(96, gcodec.pltype);
1765 EXPECT_STREQ("ISAC", gcodec.plname);
1766 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001767 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001768 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1769 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1770 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1771}
1772
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001773// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001774TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001775 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001776 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001777 cricket::AudioSendParameters parameters;
1778 parameters.codecs.push_back(kRedCodec);
1779 parameters.codecs.push_back(kIsacCodec);
1780 parameters.codecs.push_back(kPcmuCodec);
1781 parameters.codecs[0].id = 127;
1782 parameters.codecs[0].params[""] = "96/96";
1783 parameters.codecs[1].id = 96;
1784 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001785 webrtc::CodecInst gcodec;
1786 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1787 EXPECT_EQ(96, gcodec.pltype);
1788 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001789 EXPECT_TRUE(voe_.GetRED(channel_num));
1790 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001791}
1792
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001793// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001794TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001795 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001796 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001797 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001798
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001799 cricket::AudioSendParameters parameters;
1800 parameters.codecs.push_back(kRedCodec);
1801 parameters.codecs.push_back(kIsacCodec);
1802 parameters.codecs.push_back(kPcmuCodec);
1803 parameters.codecs[0].id = 127;
1804 parameters.codecs[0].params[""] = "96/96";
1805 parameters.codecs[1].id = 96;
1806 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001807 EXPECT_TRUE(channel_->AddSendStream(
1808 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001809 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001810 webrtc::CodecInst gcodec;
1811 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1812 EXPECT_EQ(96, gcodec.pltype);
1813 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001814 EXPECT_TRUE(voe_.GetRED(channel_num));
1815 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001816}
1817
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001818// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001819TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenberg1ac56142015-10-13 03:58:19 -07001820 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001821 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001822 cricket::AudioSendParameters parameters;
1823 parameters.codecs.push_back(kRedCodec);
1824 parameters.codecs.push_back(kIsacCodec);
1825 parameters.codecs.push_back(kPcmuCodec);
1826 parameters.codecs[0].id = 127;
1827 parameters.codecs[1].id = 96;
1828 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001829 webrtc::CodecInst gcodec;
1830 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1831 EXPECT_EQ(96, gcodec.pltype);
1832 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001833 EXPECT_TRUE(voe_.GetRED(channel_num));
1834 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001835}
1836
1837// Test that we ignore RED if the parameters aren't named the way we expect.
1838TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001839 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001840 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001841 cricket::AudioSendParameters parameters;
1842 parameters.codecs.push_back(kRedCodec);
1843 parameters.codecs.push_back(kIsacCodec);
1844 parameters.codecs.push_back(kPcmuCodec);
1845 parameters.codecs[0].id = 127;
1846 parameters.codecs[0].params["ABC"] = "96/96";
1847 parameters.codecs[1].id = 96;
1848 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001849 webrtc::CodecInst gcodec;
1850 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1851 EXPECT_EQ(96, gcodec.pltype);
1852 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001853 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001854}
1855
1856// Test that we ignore RED if it uses different primary/secondary encoding.
1857TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001858 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001859 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001860 cricket::AudioSendParameters parameters;
1861 parameters.codecs.push_back(kRedCodec);
1862 parameters.codecs.push_back(kIsacCodec);
1863 parameters.codecs.push_back(kPcmuCodec);
1864 parameters.codecs[0].id = 127;
1865 parameters.codecs[0].params[""] = "96/0";
1866 parameters.codecs[1].id = 96;
1867 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001868 webrtc::CodecInst gcodec;
1869 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1870 EXPECT_EQ(96, gcodec.pltype);
1871 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001872 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001873}
1874
1875// Test that we ignore RED if it uses more than 2 encodings.
1876TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001877 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001878 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001879 cricket::AudioSendParameters parameters;
1880 parameters.codecs.push_back(kRedCodec);
1881 parameters.codecs.push_back(kIsacCodec);
1882 parameters.codecs.push_back(kPcmuCodec);
1883 parameters.codecs[0].id = 127;
1884 parameters.codecs[0].params[""] = "96/96/96";
1885 parameters.codecs[1].id = 96;
1886 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001887 webrtc::CodecInst gcodec;
1888 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1889 EXPECT_EQ(96, gcodec.pltype);
1890 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001891 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001892}
1893
1894// Test that we ignore RED if it has bogus codec ids.
1895TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001896 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001897 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001898 cricket::AudioSendParameters parameters;
1899 parameters.codecs.push_back(kRedCodec);
1900 parameters.codecs.push_back(kIsacCodec);
1901 parameters.codecs.push_back(kPcmuCodec);
1902 parameters.codecs[0].id = 127;
1903 parameters.codecs[0].params[""] = "ABC/ABC";
1904 parameters.codecs[1].id = 96;
1905 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001906 webrtc::CodecInst gcodec;
1907 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1908 EXPECT_EQ(96, gcodec.pltype);
1909 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001910 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001911}
1912
1913// Test that we ignore RED if it refers to a codec that is not present.
1914TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001915 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001916 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001917 cricket::AudioSendParameters parameters;
1918 parameters.codecs.push_back(kRedCodec);
1919 parameters.codecs.push_back(kIsacCodec);
1920 parameters.codecs.push_back(kPcmuCodec);
1921 parameters.codecs[0].id = 127;
1922 parameters.codecs[0].params[""] = "97/97";
1923 parameters.codecs[1].id = 96;
1924 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001925 webrtc::CodecInst gcodec;
1926 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1927 EXPECT_EQ(96, gcodec.pltype);
1928 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001929 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001930}
1931
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001932// Test support for audio level header extension.
1933TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1934 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001935}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001936TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1937 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1938}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001939
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001940// Test support for absolute send time header extension.
1941TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1942 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1943}
1944TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1945 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001946}
1947
solenberg1ac56142015-10-13 03:58:19 -07001948// Test that we can create a channel and start sending on it.
1949TEST_F(WebRtcVoiceEngineTestFake, Send) {
1950 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001951 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001952 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001953 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1954 EXPECT_TRUE(voe_.GetSend(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001955 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1956 EXPECT_FALSE(voe_.GetSend(channel_num));
solenberg1ac56142015-10-13 03:58:19 -07001957}
1958
1959// Test that we can create a channel and start playing out on it.
1960TEST_F(WebRtcVoiceEngineTestFake, Playout) {
1961 EXPECT_TRUE(SetupEngineWithRecvStream());
1962 int channel_num = voe_.GetLastChannel();
1963 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
1964 EXPECT_TRUE(channel_->SetPlayout(true));
1965 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001966 EXPECT_TRUE(channel_->SetPlayout(false));
1967 EXPECT_FALSE(voe_.GetPlayout(channel_num));
1968}
1969
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001970// Test that we can add and remove send streams.
1971TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
1972 SetupForMultiSendStream();
1973
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001974 // Set the global state for sending.
1975 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1976
solenbergc96df772015-10-21 13:01:53 -07001977 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001978 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07001979 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001980 // Verify that we are in a sending state for all the created streams.
solenberg3a941542015-11-16 07:34:50 -08001981 EXPECT_TRUE(voe_.GetSend(GetSendStreamConfig(ssrc).voe_channel_id));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001982 }
tfarina5237aaf2015-11-10 23:44:30 -08001983 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001984
solenbergc96df772015-10-21 13:01:53 -07001985 // Delete the send streams.
1986 for (uint32_t ssrc : kSsrcs4) {
1987 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08001988 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07001989 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001990 }
solenbergc96df772015-10-21 13:01:53 -07001991 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001992}
1993
1994// Test SetSendCodecs correctly configure the codecs in all send streams.
1995TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
1996 SetupForMultiSendStream();
1997
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001998 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07001999 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002000 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002001 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002002 }
2003
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002004 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002005 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002006 parameters.codecs.push_back(kIsacCodec);
2007 parameters.codecs.push_back(kCn16000Codec);
2008 parameters.codecs[1].id = 97;
2009 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002010
2011 // Verify ISAC and VAD are corrected configured on all send channels.
2012 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002013 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002014 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002015 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2016 EXPECT_STREQ("ISAC", gcodec.plname);
2017 EXPECT_TRUE(voe_.GetVAD(channel_num));
2018 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2019 }
2020
2021 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002022 parameters.codecs[0] = kPcmuCodec;
2023 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002024 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002025 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002026 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2027 EXPECT_STREQ("PCMU", gcodec.plname);
2028 EXPECT_FALSE(voe_.GetVAD(channel_num));
2029 }
2030}
2031
2032// Test we can SetSend on all send streams correctly.
2033TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2034 SetupForMultiSendStream();
2035
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002036 // Create the send channels and they should be a SEND_NOTHING date.
solenbergc96df772015-10-21 13:01:53 -07002037 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002038 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002039 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002040 int channel_num = voe_.GetLastChannel();
2041 EXPECT_FALSE(voe_.GetSend(channel_num));
2042 }
2043
2044 // Set the global state for starting sending.
2045 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
solenbergc96df772015-10-21 13:01:53 -07002046 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002047 // Verify that we are in a sending state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002048 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002049 EXPECT_TRUE(voe_.GetSend(channel_num));
2050 }
2051
2052 // Set the global state for stopping sending.
2053 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
solenbergc96df772015-10-21 13:01:53 -07002054 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002055 // Verify that we are in a stop state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002056 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002057 EXPECT_FALSE(voe_.GetSend(channel_num));
2058 }
2059}
2060
2061// Test we can set the correct statistics on all send streams.
2062TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2063 SetupForMultiSendStream();
2064
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002065 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002066 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002067 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002068 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002069 }
solenberg85a04962015-10-27 03:35:21 -07002070 SetAudioSendStreamStats();
2071
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002072 // Create a receive stream to check that none of the send streams end up in
2073 // the receive stream stats.
2074 EXPECT_TRUE(channel_->AddRecvStream(
2075 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002076 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002077 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2078 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002079
solenberg85a04962015-10-27 03:35:21 -07002080 // Check stats for the added streams.
2081 {
2082 cricket::VoiceMediaInfo info;
2083 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002084
solenberg85a04962015-10-27 03:35:21 -07002085 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002086 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002087 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002088 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002089 }
2090
2091 // We have added one receive stream. We should see empty stats.
2092 EXPECT_EQ(info.receivers.size(), 1u);
2093 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002094 }
solenberg1ac56142015-10-13 03:58:19 -07002095
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002096 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002097 {
2098 cricket::VoiceMediaInfo info;
2099 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2100 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002101 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002102 EXPECT_EQ(0u, info.receivers.size());
2103 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002104
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002105 // Deliver a new packet - a default receive stream should be created and we
2106 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002107 {
2108 cricket::VoiceMediaInfo info;
2109 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2110 SetAudioReceiveStreamStats();
2111 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002112 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002113 EXPECT_EQ(1u, info.receivers.size());
2114 VerifyVoiceReceiverInfo(info.receivers[0]);
2115 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002116}
2117
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002118// Test that we can add and remove receive streams, and do proper send/playout.
2119// We can receive on multiple streams while sending one stream.
2120TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002121 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002122 int channel_num1 = voe_.GetLastChannel();
2123
solenberg1ac56142015-10-13 03:58:19 -07002124 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002125 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002126 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002127 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002128
solenberg1ac56142015-10-13 03:58:19 -07002129 // Adding another stream should enable playout on the new stream only.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002130 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2131 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002132 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2133 EXPECT_TRUE(voe_.GetSend(channel_num1));
2134 EXPECT_FALSE(voe_.GetSend(channel_num2));
2135
solenberg1ac56142015-10-13 03:58:19 -07002136 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002137 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2138 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2139
2140 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2141 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2142 int channel_num3 = voe_.GetLastChannel();
2143 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2144 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2145 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2146 EXPECT_FALSE(voe_.GetSend(channel_num3));
2147
2148 // Stop sending.
2149 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2150 EXPECT_FALSE(voe_.GetSend(channel_num1));
2151 EXPECT_FALSE(voe_.GetSend(channel_num2));
2152 EXPECT_FALSE(voe_.GetSend(channel_num3));
2153
2154 // Stop playout.
2155 EXPECT_TRUE(channel_->SetPlayout(false));
2156 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2157 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2158 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2159
solenberg1ac56142015-10-13 03:58:19 -07002160 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002161 EXPECT_TRUE(channel_->SetPlayout(true));
2162 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2163 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2164 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2165
solenberg1ac56142015-10-13 03:58:19 -07002166 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002167 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2168 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002169 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002170}
2171
2172// Test that we can set the devices to use.
2173TEST_F(WebRtcVoiceEngineTestFake, SetDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002174 EXPECT_TRUE(SetupEngineWithSendStream());
2175 int send_channel = voe_.GetLastChannel();
2176 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2177 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002178 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002179
2180 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2181 cricket::kFakeDefaultDeviceId);
2182 cricket::Device dev(cricket::kFakeDeviceName,
2183 cricket::kFakeDeviceId);
2184
2185 // Test SetDevices() while not sending or playing.
2186 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2187
2188 // Test SetDevices() while sending and playing.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002189 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2190 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002191 EXPECT_TRUE(voe_.GetSend(send_channel));
2192 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002193
2194 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2195
solenberg1ac56142015-10-13 03:58:19 -07002196 EXPECT_TRUE(voe_.GetSend(send_channel));
2197 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002198
2199 // Test that failure to open newly selected devices does not prevent opening
2200 // ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002201 voe_.set_playout_fail_channel(recv_channel);
2202 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002203
2204 EXPECT_FALSE(engine_.SetDevices(&default_dev, &default_dev));
2205
solenberg1ac56142015-10-13 03:58:19 -07002206 EXPECT_FALSE(voe_.GetSend(send_channel));
2207 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002208
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002209 voe_.set_playout_fail_channel(-1);
2210 voe_.set_send_fail_channel(-1);
2211
2212 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2213
solenberg1ac56142015-10-13 03:58:19 -07002214 EXPECT_TRUE(voe_.GetSend(send_channel));
2215 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002216}
2217
2218// Test that we can set the devices to use even if we failed to
2219// open the initial ones.
2220TEST_F(WebRtcVoiceEngineTestFake, SetDevicesWithInitiallyBadDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002221 EXPECT_TRUE(SetupEngineWithSendStream());
2222 int send_channel = voe_.GetLastChannel();
2223 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2224 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002225 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002226
2227 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2228 cricket::kFakeDefaultDeviceId);
2229 cricket::Device dev(cricket::kFakeDeviceName,
2230 cricket::kFakeDeviceId);
2231
2232 // Test that failure to open devices selected before starting
2233 // send/play does not prevent opening newly selected ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002234 voe_.set_playout_fail_channel(recv_channel);
2235 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002236
2237 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2238
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002239 EXPECT_FALSE(channel_->SetSend(cricket::SEND_MICROPHONE));
2240 EXPECT_FALSE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002241 EXPECT_FALSE(voe_.GetSend(send_channel));
2242 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002243
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002244 voe_.set_playout_fail_channel(-1);
2245 voe_.set_send_fail_channel(-1);
2246
2247 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2248
solenberg1ac56142015-10-13 03:58:19 -07002249 EXPECT_TRUE(voe_.GetSend(send_channel));
2250 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002251}
2252
2253// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002254// and start sending on it.
2255TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2256 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002257 int channel_num = voe_.GetLastChannel();
2258 webrtc::AgcConfig agc_config;
2259 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2260 EXPECT_EQ(0, agc_config.targetLeveldBOv);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002261 send_parameters_.options = options_adjust_agc_;
2262 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002263 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2264 EXPECT_TRUE(voe_.GetSend(channel_num));
2265 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2266 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002267 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2268 EXPECT_FALSE(voe_.GetSend(channel_num));
2269 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2270 EXPECT_EQ(0, agc_config.targetLeveldBOv); // level was restored
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002271}
2272
wu@webrtc.org97077a32013-10-25 21:18:33 +00002273TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002274 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002275 webrtc::AgcConfig agc_config;
2276 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2277 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2278
2279 cricket::AudioOptions options;
Karl Wibergbe579832015-11-10 22:34:18 +01002280 options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2281 options.tx_agc_digital_compression_gain = rtc::Optional<uint16_t>(9);
2282 options.tx_agc_limiter = rtc::Optional<bool>(true);
2283 options.auto_gain_control = rtc::Optional<bool>(true);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002284 EXPECT_TRUE(engine_.SetOptions(options));
2285
2286 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2287 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2288 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2289 EXPECT_TRUE(agc_config.limiterEnable);
2290
2291 // Check interaction with adjust_agc_delta. Both should be respected, for
2292 // backwards compatibility.
Karl Wibergbe579832015-11-10 22:34:18 +01002293 options.adjust_agc_delta = rtc::Optional<int>(-10);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002294 EXPECT_TRUE(engine_.SetOptions(options));
2295
2296 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2297 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2298}
2299
wu@webrtc.org97077a32013-10-25 21:18:33 +00002300TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002301 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002302 cricket::AudioOptions options;
Karl Wibergbe579832015-11-10 22:34:18 +01002303 options.recording_sample_rate = rtc::Optional<uint32_t>(48000);
2304 options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002305 EXPECT_TRUE(engine_.SetOptions(options));
2306
2307 unsigned int recording_sample_rate, playout_sample_rate;
2308 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2309 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2310 EXPECT_EQ(48000u, recording_sample_rate);
2311 EXPECT_EQ(44100u, playout_sample_rate);
2312}
2313
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002314// Test that we can set the outgoing SSRC properly.
2315// SSRC is set in SetupEngine by calling AddSendStream.
2316TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002317 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002318 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002319}
2320
2321TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2322 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002323 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002324 SetAudioSendStreamStats();
solenberg1ac56142015-10-13 03:58:19 -07002325 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2326 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002327 EXPECT_TRUE(channel_->AddRecvStream(
2328 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002329 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2330 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002331
solenberg85a04962015-10-27 03:35:21 -07002332 // Check stats for the added streams.
2333 {
2334 cricket::VoiceMediaInfo info;
2335 EXPECT_EQ(true, channel_->GetStats(&info));
2336
2337 // We have added one send stream. We should see the stats we've set.
2338 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002339 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002340 // We have added one receive stream. We should see empty stats.
2341 EXPECT_EQ(info.receivers.size(), 1u);
2342 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2343 }
solenberg1ac56142015-10-13 03:58:19 -07002344
solenberg566ef242015-11-06 15:34:49 -08002345 // Start sending - this affects some reported stats.
2346 {
2347 cricket::VoiceMediaInfo info;
2348 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2349 EXPECT_EQ(true, channel_->GetStats(&info));
2350 VerifyVoiceSenderInfo(info.senders[0], true);
2351 }
2352
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002353 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002354 {
2355 cricket::VoiceMediaInfo info;
2356 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2357 EXPECT_EQ(true, channel_->GetStats(&info));
2358 EXPECT_EQ(1u, info.senders.size());
2359 EXPECT_EQ(0u, info.receivers.size());
2360 }
solenberg1ac56142015-10-13 03:58:19 -07002361
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002362 // Deliver a new packet - a default receive stream should be created and we
2363 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002364 {
2365 cricket::VoiceMediaInfo info;
2366 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2367 SetAudioReceiveStreamStats();
2368 EXPECT_EQ(true, channel_->GetStats(&info));
2369 EXPECT_EQ(1u, info.senders.size());
2370 EXPECT_EQ(1u, info.receivers.size());
2371 VerifyVoiceReceiverInfo(info.receivers[0]);
2372 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002373}
2374
2375// Test that we can set the outgoing SSRC properly with multiple streams.
2376// SSRC is set in SetupEngine by calling AddSendStream.
2377TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002378 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002379 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002380 EXPECT_TRUE(channel_->AddRecvStream(
2381 cricket::StreamParams::CreateLegacy(kSsrc2)));
2382 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002383}
2384
2385// Test that the local SSRC is the same on sending and receiving channels if the
2386// receive channel is created before the send channel.
2387TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002388 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002389 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002390
2391 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2392 int receive_channel_num = voe_.GetLastChannel();
2393 EXPECT_TRUE(channel_->AddSendStream(
2394 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002395
solenberg3a941542015-11-16 07:34:50 -08002396 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002397 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002398}
2399
2400// Test that we can properly receive packets.
2401TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2402 EXPECT_TRUE(SetupEngine());
solenberg7e63ef02015-11-20 00:19:43 -08002403 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002404 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002405 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002406 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002407}
2408
2409// Test that we can properly receive packets on multiple streams.
2410TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg7e63ef02015-11-20 00:19:43 -08002411 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002412 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2413 int channel_num1 = voe_.GetLastChannel();
2414 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2415 int channel_num2 = voe_.GetLastChannel();
2416 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2417 int channel_num3 = voe_.GetLastChannel();
2418 // Create packets with the right SSRCs.
2419 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002420 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002421 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002422 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002423 }
2424 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2425 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2426 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002427
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002428 DeliverPacket(packets[0], sizeof(packets[0]));
2429 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2430 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2431 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002432
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002433 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002434 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002435 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2436 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002437
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002438 DeliverPacket(packets[2], sizeof(packets[2]));
2439 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002440 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002441 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002442
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002443 DeliverPacket(packets[3], sizeof(packets[3]));
2444 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2445 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002446 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2447
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002448 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2449 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2450 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2451}
2452
solenberg7e63ef02015-11-20 00:19:43 -08002453// Test that receiving on an unsignalled stream works (default channel will be
2454// created).
2455TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
2456 EXPECT_TRUE(SetupEngine());
2457 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2458 int channel_num = voe_.GetLastChannel();
2459 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2460}
2461
2462// Test that receiving on an unsignalled stream works (default channel will be
2463// created), and that packets will be forwarded to the default channel
2464// regardless of their SSRCs.
2465TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
2466 EXPECT_TRUE(SetupEngine());
2467 char packet[sizeof(kPcmuFrame)];
2468 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2469
2470 // Note that the first unknown SSRC cannot be 0, because we only support
2471 // creating receive streams for SSRC!=0.
2472 DeliverPacket(packet, sizeof(packet));
2473 int channel_num = voe_.GetLastChannel();
2474 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2475 // Once we have the default channel, SSRC==0 will be ok.
2476 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2477 rtc::SetBE32(&packet[8], ssrc);
2478 DeliverPacket(packet, sizeof(packet));
2479 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2480 }
2481}
2482
2483// Test that a default channel is created even after a signalled stream has been
2484// added, and that this stream will get any packets for unknown SSRCs.
2485TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
2486 EXPECT_TRUE(SetupEngine());
2487 char packet[sizeof(kPcmuFrame)];
2488 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2489
2490 // Add a known stream, send packet and verify we got it.
2491 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2492 int signalled_channel_num = voe_.GetLastChannel();
2493 DeliverPacket(packet, sizeof(packet));
2494 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2495
2496 // Note that the first unknown SSRC cannot be 0, because we only support
2497 // creating receive streams for SSRC!=0.
2498 rtc::SetBE32(&packet[8], 7011);
2499 DeliverPacket(packet, sizeof(packet));
2500 int channel_num = voe_.GetLastChannel();
2501 EXPECT_NE(channel_num, signalled_channel_num);
2502 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2503 // Once we have the default channel, SSRC==0 will be ok.
2504 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2505 rtc::SetBE32(&packet[8], ssrc);
2506 DeliverPacket(packet, sizeof(packet));
2507 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2508 }
2509}
2510
solenberg0a617e22015-10-20 15:49:38 -07002511// Test that we properly handle failures to add a receive stream.
2512TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
2513 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002514 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002515 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002516}
2517
solenberg0a617e22015-10-20 15:49:38 -07002518// Test that we properly handle failures to add a send stream.
2519TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
2520 EXPECT_TRUE(SetupEngine());
2521 voe_.set_fail_create_channel(true);
2522 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2523}
2524
solenberg1ac56142015-10-13 03:58:19 -07002525// Test that AddRecvStream creates new stream.
2526TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2527 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002528 int channel_num = voe_.GetLastChannel();
2529 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002530 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002531}
2532
2533// Test that after adding a recv stream, we do not decode more codecs than
2534// those previously passed into SetRecvCodecs.
2535TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002536 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002537 cricket::AudioRecvParameters parameters;
2538 parameters.codecs.push_back(kIsacCodec);
2539 parameters.codecs.push_back(kPcmuCodec);
2540 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002541 EXPECT_TRUE(channel_->AddRecvStream(
2542 cricket::StreamParams::CreateLegacy(kSsrc1)));
2543 int channel_num2 = voe_.GetLastChannel();
2544 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002545 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002546 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002547 gcodec.channels = 2;
2548 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2549}
2550
2551// Test that we properly clean up any streams that were added, even if
2552// not explicitly removed.
2553TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002554 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002555 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002556 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2557 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2558 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2559 delete channel_;
2560 channel_ = NULL;
2561 EXPECT_EQ(0, voe_.GetNumChannels());
2562}
2563
wu@webrtc.org78187522013-10-07 23:32:02 +00002564TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002565 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002566 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2567}
2568
2569TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2570 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002571 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002572 // Manually delete channel to simulate a failure.
2573 int channel = voe_.GetLastChannel();
2574 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2575 // Add recv stream 2 should work.
2576 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002577 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002578 EXPECT_NE(channel, new_channel);
2579 // The last created channel is deleted too.
2580 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002581}
2582
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002583// Test the InsertDtmf on default send stream as caller.
2584TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2585 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002586}
2587
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002588// Test the InsertDtmf on default send stream as callee
2589TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2590 TestInsertDtmf(0, false);
2591}
2592
2593// Test the InsertDtmf on specified send stream as caller.
2594TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2595 TestInsertDtmf(kSsrc1, true);
2596}
2597
2598// Test the InsertDtmf on specified send stream as callee.
2599TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2600 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002601}
2602
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002603TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002604 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002605 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002606 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2607 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2608 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2609 EXPECT_TRUE(channel_->SetPlayout(true));
2610 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2611 EXPECT_TRUE(channel_->SetPlayout(false));
2612 EXPECT_FALSE(channel_->SetPlayout(true));
2613}
2614
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002615TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002616 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002617
2618 bool ec_enabled;
2619 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002620 webrtc::AecmModes aecm_mode;
2621 bool cng_enabled;
2622 bool agc_enabled;
2623 webrtc::AgcModes agc_mode;
2624 webrtc::AgcConfig agc_config;
2625 bool ns_enabled;
2626 webrtc::NsModes ns_mode;
2627 bool highpass_filter_enabled;
2628 bool stereo_swapping_enabled;
2629 bool typing_detection_enabled;
2630 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002631 voe_.GetAecmMode(aecm_mode, cng_enabled);
2632 voe_.GetAgcStatus(agc_enabled, agc_mode);
2633 voe_.GetAgcConfig(agc_config);
2634 voe_.GetNsStatus(ns_enabled, ns_mode);
2635 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2636 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2637 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2638 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002639 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002640 EXPECT_FALSE(cng_enabled);
2641 EXPECT_TRUE(agc_enabled);
2642 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2643 EXPECT_TRUE(ns_enabled);
2644 EXPECT_TRUE(highpass_filter_enabled);
2645 EXPECT_FALSE(stereo_swapping_enabled);
2646 EXPECT_TRUE(typing_detection_enabled);
2647 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2648 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2649
2650 // Nothing set, so all ignored.
2651 cricket::AudioOptions options;
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002652 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002653 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002654 voe_.GetAecmMode(aecm_mode, cng_enabled);
2655 voe_.GetAgcStatus(agc_enabled, agc_mode);
2656 voe_.GetAgcConfig(agc_config);
2657 voe_.GetNsStatus(ns_enabled, ns_mode);
2658 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2659 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2660 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2661 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002662 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002663 EXPECT_FALSE(cng_enabled);
2664 EXPECT_TRUE(agc_enabled);
2665 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2666 EXPECT_TRUE(ns_enabled);
2667 EXPECT_TRUE(highpass_filter_enabled);
2668 EXPECT_FALSE(stereo_swapping_enabled);
2669 EXPECT_TRUE(typing_detection_enabled);
2670 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2671 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
Henrik Lundin64dad832015-05-11 12:44:23 +02002672 EXPECT_EQ(50, voe_.GetNetEqCapacity()); // From GetDefaultEngineOptions().
Henrik Lundin5263b3c2015-06-01 10:29:41 +02002673 EXPECT_FALSE(
2674 voe_.GetNetEqFastAccelerate()); // From GetDefaultEngineOptions().
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002675
2676 // Turn echo cancellation off
Karl Wibergbe579832015-11-10 22:34:18 +01002677 options.echo_cancellation = rtc::Optional<bool>(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002678 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002679 voe_.GetEcStatus(ec_enabled, ec_mode);
2680 EXPECT_FALSE(ec_enabled);
2681
2682 // Turn echo cancellation back on, with settings, and make sure
2683 // nothing else changed.
Karl Wibergbe579832015-11-10 22:34:18 +01002684 options.echo_cancellation = rtc::Optional<bool>(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002685 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002686 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002687 voe_.GetAecmMode(aecm_mode, cng_enabled);
2688 voe_.GetAgcStatus(agc_enabled, agc_mode);
2689 voe_.GetAgcConfig(agc_config);
2690 voe_.GetNsStatus(ns_enabled, ns_mode);
2691 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2692 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2693 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2694 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002695 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002696 EXPECT_TRUE(agc_enabled);
2697 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2698 EXPECT_TRUE(ns_enabled);
2699 EXPECT_TRUE(highpass_filter_enabled);
2700 EXPECT_FALSE(stereo_swapping_enabled);
2701 EXPECT_TRUE(typing_detection_enabled);
2702 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2703 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2704
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002705 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2706 // control.
Karl Wibergbe579832015-11-10 22:34:18 +01002707 options.delay_agnostic_aec = rtc::Optional<bool>(true);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002708 ASSERT_TRUE(engine_.SetOptions(options));
2709 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002710 voe_.GetAecmMode(aecm_mode, cng_enabled);
2711 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002712 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002713 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2714
2715 // Turn off echo cancellation and delay agnostic aec.
Karl Wibergbe579832015-11-10 22:34:18 +01002716 options.delay_agnostic_aec = rtc::Optional<bool>(false);
2717 options.extended_filter_aec = rtc::Optional<bool>(false);
2718 options.echo_cancellation = rtc::Optional<bool>(false);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002719 ASSERT_TRUE(engine_.SetOptions(options));
2720 voe_.GetEcStatus(ec_enabled, ec_mode);
2721 EXPECT_FALSE(ec_enabled);
2722 // Turning delay agnostic aec back on should also turn on echo cancellation.
Karl Wibergbe579832015-11-10 22:34:18 +01002723 options.delay_agnostic_aec = rtc::Optional<bool>(true);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002724 ASSERT_TRUE(engine_.SetOptions(options));
2725 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002726 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002727 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002728 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2729
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002730 // Turn off AGC
Karl Wibergbe579832015-11-10 22:34:18 +01002731 options.auto_gain_control = rtc::Optional<bool>(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002732 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002733 voe_.GetAgcStatus(agc_enabled, agc_mode);
2734 EXPECT_FALSE(agc_enabled);
2735
2736 // Turn AGC back on
Karl Wibergbe579832015-11-10 22:34:18 +01002737 options.auto_gain_control = rtc::Optional<bool>(true);
2738 options.adjust_agc_delta = rtc::Optional<int>();
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002739 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002740 voe_.GetAgcStatus(agc_enabled, agc_mode);
2741 EXPECT_TRUE(agc_enabled);
2742 voe_.GetAgcConfig(agc_config);
2743 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2744
2745 // Turn off other options (and stereo swapping on).
Karl Wibergbe579832015-11-10 22:34:18 +01002746 options.noise_suppression = rtc::Optional<bool>(false);
2747 options.highpass_filter = rtc::Optional<bool>(false);
2748 options.typing_detection = rtc::Optional<bool>(false);
2749 options.stereo_swapping = rtc::Optional<bool>(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002750 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002751 voe_.GetNsStatus(ns_enabled, ns_mode);
2752 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2753 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2754 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2755 EXPECT_FALSE(ns_enabled);
2756 EXPECT_FALSE(highpass_filter_enabled);
2757 EXPECT_FALSE(typing_detection_enabled);
2758 EXPECT_TRUE(stereo_swapping_enabled);
2759
solenberg1ac56142015-10-13 03:58:19 -07002760 // Set options again to ensure it has no impact.
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002761 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002762 voe_.GetEcStatus(ec_enabled, ec_mode);
2763 voe_.GetNsStatus(ns_enabled, ns_mode);
2764 EXPECT_TRUE(ec_enabled);
2765 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2766 EXPECT_FALSE(ns_enabled);
2767 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2768}
2769
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002770TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002771 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002772
2773 bool ec_enabled;
2774 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002775 bool agc_enabled;
2776 webrtc::AgcModes agc_mode;
2777 bool ns_enabled;
2778 webrtc::NsModes ns_mode;
2779 bool highpass_filter_enabled;
2780 bool stereo_swapping_enabled;
2781 bool typing_detection_enabled;
2782
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002783 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002784 voe_.GetAgcStatus(agc_enabled, agc_mode);
2785 voe_.GetNsStatus(ns_enabled, ns_mode);
2786 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2787 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2788 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2789 EXPECT_TRUE(ec_enabled);
2790 EXPECT_TRUE(agc_enabled);
2791 EXPECT_TRUE(ns_enabled);
2792 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002793 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002794 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002795}
2796
2797TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2798 webrtc::AgcConfig set_config = {0};
2799 set_config.targetLeveldBOv = 3;
2800 set_config.digitalCompressionGaindB = 9;
2801 set_config.limiterEnable = true;
2802 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002803 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002804
2805 webrtc::AgcConfig config = {0};
2806 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2807 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2808 EXPECT_EQ(set_config.digitalCompressionGaindB,
2809 config.digitalCompressionGaindB);
2810 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2811}
2812
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002813TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002814 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg66f43392015-09-09 01:36:22 -07002815 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2816 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002817 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002818 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2819 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002820 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002821
2822 // Have to add a stream to make SetSend work.
2823 cricket::StreamParams stream1;
2824 stream1.ssrcs.push_back(1);
2825 channel1->AddSendStream(stream1);
2826 cricket::StreamParams stream2;
2827 stream2.ssrcs.push_back(2);
2828 channel2->AddSendStream(stream2);
2829
2830 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002831 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002832 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2833 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2834 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002835 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2836 EXPECT_EQ(parameters_options_all.options, channel1->options());
2837 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2838 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002839
2840 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002841 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002842 parameters_options_no_ns.options.noise_suppression =
2843 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002844 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2845 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002846 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2847 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2848 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002849 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002850
2851 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002852 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002853 parameters_options_no_agc.options.auto_gain_control =
2854 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002855 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002856 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2857 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2858 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002859 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002860
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002861 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002862 bool ec_enabled;
2863 webrtc::EcModes ec_mode;
2864 bool agc_enabled;
2865 webrtc::AgcModes agc_mode;
2866 bool ns_enabled;
2867 webrtc::NsModes ns_mode;
2868 voe_.GetEcStatus(ec_enabled, ec_mode);
2869 voe_.GetAgcStatus(agc_enabled, agc_mode);
2870 voe_.GetNsStatus(ns_enabled, ns_mode);
2871 EXPECT_TRUE(ec_enabled);
2872 EXPECT_TRUE(agc_enabled);
2873 EXPECT_TRUE(ns_enabled);
2874
2875 channel1->SetSend(cricket::SEND_MICROPHONE);
2876 voe_.GetEcStatus(ec_enabled, ec_mode);
2877 voe_.GetAgcStatus(agc_enabled, agc_mode);
2878 voe_.GetNsStatus(ns_enabled, ns_mode);
2879 EXPECT_TRUE(ec_enabled);
2880 EXPECT_TRUE(agc_enabled);
2881 EXPECT_FALSE(ns_enabled);
2882
2883 channel1->SetSend(cricket::SEND_NOTHING);
2884 voe_.GetEcStatus(ec_enabled, ec_mode);
2885 voe_.GetAgcStatus(agc_enabled, agc_mode);
2886 voe_.GetNsStatus(ns_enabled, ns_mode);
2887 EXPECT_TRUE(ec_enabled);
2888 EXPECT_TRUE(agc_enabled);
2889 EXPECT_TRUE(ns_enabled);
2890
2891 channel2->SetSend(cricket::SEND_MICROPHONE);
2892 voe_.GetEcStatus(ec_enabled, ec_mode);
2893 voe_.GetAgcStatus(agc_enabled, agc_mode);
2894 voe_.GetNsStatus(ns_enabled, ns_mode);
2895 EXPECT_TRUE(ec_enabled);
2896 EXPECT_FALSE(agc_enabled);
2897 EXPECT_TRUE(ns_enabled);
2898
2899 channel2->SetSend(cricket::SEND_NOTHING);
2900 voe_.GetEcStatus(ec_enabled, ec_mode);
2901 voe_.GetAgcStatus(agc_enabled, agc_mode);
2902 voe_.GetNsStatus(ns_enabled, ns_mode);
2903 EXPECT_TRUE(ec_enabled);
2904 EXPECT_TRUE(agc_enabled);
2905 EXPECT_TRUE(ns_enabled);
2906
2907 // Make sure settings take effect while we are sending.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002908 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
2909 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2910 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002911 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01002912 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07002913 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01002914 rtc::Optional<bool>(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002915 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002916 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01002917 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2918 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2919 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002920 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002921 voe_.GetEcStatus(ec_enabled, ec_mode);
2922 voe_.GetAgcStatus(agc_enabled, agc_mode);
2923 voe_.GetNsStatus(ns_enabled, ns_mode);
2924 EXPECT_TRUE(ec_enabled);
2925 EXPECT_FALSE(agc_enabled);
2926 EXPECT_FALSE(ns_enabled);
2927}
2928
wu@webrtc.orgde305012013-10-31 15:40:38 +00002929// This test verifies DSCP settings are properly applied on voice media channel.
2930TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002931 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002932 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002933 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002934 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00002935 new cricket::FakeNetworkInterface);
2936 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002937 cricket::AudioSendParameters parameters = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002938 parameters.options.dscp = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002939 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002940 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00002941 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002942 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002943 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
Karl Wibergbe579832015-11-10 22:34:18 +01002944 parameters.options.dscp = rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002945 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002946 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00002947}
2948
solenberg1ac56142015-10-13 03:58:19 -07002949TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002950 EXPECT_TRUE(SetupEngine());
2951 cricket::WebRtcVoiceMediaChannel* media_channel =
2952 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002953 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2954 EXPECT_TRUE(channel_->AddRecvStream(
2955 cricket::StreamParams::CreateLegacy(kSsrc1)));
2956 int channel_id = voe_.GetLastChannel();
2957 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2958 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2959 EXPECT_TRUE(channel_->AddRecvStream(
2960 cricket::StreamParams::CreateLegacy(kSsrc2)));
2961 int channel_id2 = voe_.GetLastChannel();
2962 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002963}
2964
solenberg1ac56142015-10-13 03:58:19 -07002965TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002966 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002967 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002968 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2969 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2970 EXPECT_TRUE(channel_->AddSendStream(
2971 cricket::StreamParams::CreateLegacy(kSsrc1)));
2972 int channel_id = voe_.GetLastChannel();
2973 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2974 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2975 EXPECT_TRUE(channel_->AddSendStream(
2976 cricket::StreamParams::CreateLegacy(kSsrc2)));
2977 int channel_id2 = voe_.GetLastChannel();
2978 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002979}
2980
solenberg4bac9c52015-10-09 02:32:53 -07002981TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002982 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002983 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002984 cricket::StreamParams stream;
2985 stream.ssrcs.push_back(kSsrc2);
2986 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002987 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002988 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002989 float scale = 0;
2990 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2991 EXPECT_DOUBLE_EQ(3, scale);
2992}
2993
2994TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
2995 EXPECT_TRUE(SetupEngine());
2996 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2997 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2998 int channel_id = voe_.GetLastChannel();
2999 float scale = 0;
3000 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3001 EXPECT_DOUBLE_EQ(2, scale);
3002 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003003 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003004 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003005}
3006
pbos8fc7fa72015-07-15 08:02:58 -07003007TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003008 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003009 const std::string kSyncLabel = "AvSyncLabel";
3010
solenberg1ac56142015-10-13 03:58:19 -07003011 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003012 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3013 sp.sync_label = kSyncLabel;
3014 // Creating two channels to make sure that sync label is set properly for both
3015 // the default voice channel and following ones.
3016 EXPECT_TRUE(channel_->AddRecvStream(sp));
3017 sp.ssrcs[0] += 1;
3018 EXPECT_TRUE(channel_->AddRecvStream(sp));
3019
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003020 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003021 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003022 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003023 << "SyncGroup should be set based on sync_label";
3024 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003025 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003026 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003027}
3028
pbos6bb1b6e2015-07-24 07:10:18 -07003029TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003030 // Test that changing the combined_audio_video_bwe option results in the
3031 // expected state changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003032 std::vector<uint32_t> ssrcs;
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003033 ssrcs.push_back(223);
3034 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003035
solenberg1ac56142015-10-13 03:58:19 -07003036 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003037 cricket::WebRtcVoiceMediaChannel* media_channel =
3038 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02003039 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003040 EXPECT_TRUE(media_channel->AddRecvStream(
3041 cricket::StreamParams::CreateLegacy(ssrc)));
3042 }
3043 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003044
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003045 // Combined BWE should be disabled.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003046 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003047 const auto* s = call_.GetAudioReceiveStream(ssrc);
3048 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07003049 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003050 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003051
3052 // Enable combined BWE option - now it should be set up.
Karl Wibergbe579832015-11-10 22:34:18 +01003053 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003054 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003055 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003056 const auto* s = call_.GetAudioReceiveStream(ssrc);
3057 EXPECT_NE(nullptr, s);
3058 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
3059 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003060
3061 // Disable combined BWE option - should be disabled again.
Karl Wibergbe579832015-11-10 22:34:18 +01003062 send_parameters_.options.combined_audio_video_bwe =
3063 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003064 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003065 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003066 const auto* s = call_.GetAudioReceiveStream(ssrc);
3067 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07003068 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003069 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003070
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003071 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003072}
3073
pbos6bb1b6e2015-07-24 07:10:18 -07003074TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003075 // Test that adding receive streams after enabling combined bandwidth
3076 // estimation will correctly configure each channel.
solenberg1ac56142015-10-13 03:58:19 -07003077 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003078 cricket::WebRtcVoiceMediaChannel* media_channel =
3079 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003080 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003081 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003082
Peter Boström0c4e06b2015-10-07 12:23:21 +02003083 static const uint32_t kSsrcs[] = {1, 2, 3, 4};
tfarina5237aaf2015-11-10 23:44:30 -08003084 for (unsigned int i = 0; i < arraysize(kSsrcs); ++i) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003085 EXPECT_TRUE(media_channel->AddRecvStream(
3086 cricket::StreamParams::CreateLegacy(kSsrcs[i])));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003087 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(kSsrcs[i]));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003088 }
tfarina5237aaf2015-11-10 23:44:30 -08003089 EXPECT_EQ(arraysize(kSsrcs), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003090}
3091
solenberg3a941542015-11-16 07:34:50 -08003092// TODO(solenberg): Remove, once recv streams are configured through Call.
3093// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003094TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003095 // Test that setting the header extensions results in the expected state
3096 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003097 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003098 ssrcs.push_back(223);
3099 ssrcs.push_back(224);
3100
solenberg1ac56142015-10-13 03:58:19 -07003101 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003102 cricket::WebRtcVoiceMediaChannel* media_channel =
3103 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003104 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003105 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003106 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003107 EXPECT_TRUE(media_channel->AddRecvStream(
3108 cricket::StreamParams::CreateLegacy(ssrc)));
3109 }
3110
3111 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003112 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003113 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003114 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003115 EXPECT_NE(nullptr, s);
3116 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3117 }
3118
3119 // Set up receive extensions.
3120 const auto& e_exts = engine_.rtp_header_extensions();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003121 cricket::AudioRecvParameters recv_parameters;
3122 recv_parameters.extensions = e_exts;
3123 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003124 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003125 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003126 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003127 EXPECT_NE(nullptr, s);
3128 const auto& s_exts = s->GetConfig().rtp.extensions;
3129 EXPECT_EQ(e_exts.size(), s_exts.size());
3130 for (const auto& e_ext : e_exts) {
3131 for (const auto& s_ext : s_exts) {
3132 if (e_ext.id == s_ext.id) {
3133 EXPECT_EQ(e_ext.uri, s_ext.name);
3134 }
3135 }
3136 }
3137 }
3138
3139 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003140 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003141 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003142 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003143 EXPECT_NE(nullptr, s);
3144 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3145 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003146}
3147
3148TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3149 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003150 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003151 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3152 static const unsigned char kRtcp[] = {
3153 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3154 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3155 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3157 };
3158 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3159
solenberg1ac56142015-10-13 03:58:19 -07003160 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003161 cricket::WebRtcVoiceMediaChannel* media_channel =
3162 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003163 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003164 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003165 EXPECT_TRUE(media_channel->AddRecvStream(
3166 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3167
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003168 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003169 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003170 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003171 EXPECT_EQ(0, s->received_packets());
3172 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3173 EXPECT_EQ(1, s->received_packets());
3174 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3175 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003176}
Minyue2013aec2015-05-13 14:14:42 +02003177
solenberg0a617e22015-10-20 15:49:38 -07003178// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003179// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003180TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenberg1ac56142015-10-13 03:58:19 -07003181 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003182 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003183 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003184 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3185 int recv_ch = voe_.GetLastChannel();
3186 EXPECT_NE(recv_ch, default_channel);
3187 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3188 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3189 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003190 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3191 recv_ch = voe_.GetLastChannel();
3192 EXPECT_NE(recv_ch, default_channel);
3193 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003194}
3195
3196TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003197 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003198 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003199
3200 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3201 int recv_ch = voe_.GetLastChannel();
3202
3203 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3204 int send_ch = voe_.GetLastChannel();
3205
3206 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3207 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3208 // channel of |recv_ch|.This is not a common case, since, normally, only the
3209 // default channel can be associated. However, the default is not deletable.
3210 // So we force the |recv_ch| to associate with a non-default channel.
3211 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3212 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3213
3214 EXPECT_TRUE(channel_->RemoveSendStream(2));
3215 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3216}
stefan658910c2015-09-03 05:48:32 -07003217
3218// Tests for the actual WebRtc VoE library.
3219
3220TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
3221 cricket::WebRtcVoiceEngine engine;
3222 cricket::AudioOptions options = engine.GetOptions();
3223 // The default options should have at least a few things set. We purposefully
3224 // don't check the option values here, though.
kwiberg102c6a62015-10-30 02:47:38 -07003225 EXPECT_TRUE(options.echo_cancellation);
3226 EXPECT_TRUE(options.auto_gain_control);
3227 EXPECT_TRUE(options.noise_suppression);
stefan658910c2015-09-03 05:48:32 -07003228}
3229
3230// Tests that the library initializes and shuts down properly.
3231TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3232 cricket::WebRtcVoiceEngine engine;
3233 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003234 rtc::scoped_ptr<webrtc::Call> call(
3235 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003236 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003237 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003238 EXPECT_TRUE(channel != nullptr);
3239 delete channel;
3240 engine.Terminate();
3241
3242 // Reinit to catch regression where VoiceEngineObserver reference is lost
3243 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3244 engine.Terminate();
3245}
3246
3247// Tests that the library is configured with the codecs we want.
3248TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
3249 cricket::WebRtcVoiceEngine engine;
3250 // Check codecs by name.
3251 EXPECT_TRUE(engine.FindCodec(
3252 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0)));
3253 EXPECT_TRUE(engine.FindCodec(
3254 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0)));
3255 EXPECT_TRUE(engine.FindCodec(
3256 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0)));
3257 // Check that name matching is case-insensitive.
3258 EXPECT_TRUE(engine.FindCodec(
3259 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0)));
3260 EXPECT_TRUE(engine.FindCodec(
3261 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0)));
3262 EXPECT_TRUE(engine.FindCodec(
3263 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0)));
3264 EXPECT_TRUE(engine.FindCodec(
3265 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0)));
3266 EXPECT_TRUE(engine.FindCodec(
3267 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0)));
3268 EXPECT_TRUE(engine.FindCodec(
3269 cricket::AudioCodec(96, "red", 8000, 0, 1, 0)));
3270 EXPECT_TRUE(engine.FindCodec(
3271 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0)));
3272 EXPECT_TRUE(engine.FindCodec(
3273 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0)));
3274 EXPECT_TRUE(engine.FindCodec(
3275 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0)));
3276 EXPECT_TRUE(engine.FindCodec(
3277 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0)));
3278 // Check codecs with an id by id.
3279 EXPECT_TRUE(engine.FindCodec(
3280 cricket::AudioCodec(0, "", 8000, 0, 1, 0))); // PCMU
3281 EXPECT_TRUE(engine.FindCodec(
3282 cricket::AudioCodec(8, "", 8000, 0, 1, 0))); // PCMA
3283 EXPECT_TRUE(engine.FindCodec(
3284 cricket::AudioCodec(9, "", 8000, 0, 1, 0))); // G722
3285 EXPECT_TRUE(engine.FindCodec(
3286 cricket::AudioCodec(13, "", 8000, 0, 1, 0))); // CN
3287 // Check sample/bitrate matching.
3288 EXPECT_TRUE(engine.FindCodec(
3289 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0)));
3290 // Check that bad codecs fail.
3291 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0)));
3292 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(88, "", 0, 0, 1, 0)));
3293 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 0, 2, 0)));
3294 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 5000, 0, 1, 0)));
3295 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 5000, 1, 0)));
3296 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3297 for (std::vector<cricket::AudioCodec>::const_iterator it =
3298 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3299 if (it->name == "CN" && it->clockrate == 16000) {
3300 EXPECT_EQ(105, it->id);
3301 } else if (it->name == "CN" && it->clockrate == 32000) {
3302 EXPECT_EQ(106, it->id);
3303 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3304 EXPECT_EQ(103, it->id);
3305 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3306 EXPECT_EQ(104, it->id);
3307 } else if (it->name == "G722" && it->clockrate == 8000) {
3308 EXPECT_EQ(9, it->id);
3309 } else if (it->name == "telephone-event") {
3310 EXPECT_EQ(126, it->id);
3311 } else if (it->name == "red") {
3312 EXPECT_EQ(127, it->id);
3313 } else if (it->name == "opus") {
3314 EXPECT_EQ(111, it->id);
3315 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3316 EXPECT_EQ("10", it->params.find("minptime")->second);
3317 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3318 EXPECT_EQ("60", it->params.find("maxptime")->second);
3319 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3320 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3321 }
3322 }
3323
3324 engine.Terminate();
3325}
3326
3327// Tests that VoE supports at least 32 channels
3328TEST(WebRtcVoiceEngineTest, Has32Channels) {
3329 cricket::WebRtcVoiceEngine engine;
3330 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003331 rtc::scoped_ptr<webrtc::Call> call(
3332 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003333
3334 cricket::VoiceMediaChannel* channels[32];
3335 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003336 while (num_channels < arraysize(channels)) {
stefan658910c2015-09-03 05:48:32 -07003337 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003338 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003339 if (!channel)
3340 break;
stefan658910c2015-09-03 05:48:32 -07003341 channels[num_channels++] = channel;
3342 }
3343
tfarina5237aaf2015-11-10 23:44:30 -08003344 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003345 EXPECT_EQ(expected, num_channels);
3346
3347 while (num_channels > 0) {
3348 delete channels[--num_channels];
3349 }
stefan658910c2015-09-03 05:48:32 -07003350 engine.Terminate();
3351}
3352
3353// Test that we set our preferred codecs properly.
3354TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3355 cricket::WebRtcVoiceEngine engine;
3356 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003357 rtc::scoped_ptr<webrtc::Call> call(
3358 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003359 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3360 call.get());
3361 cricket::AudioRecvParameters parameters;
3362 parameters.codecs = engine.codecs();
3363 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003364}