blob: 2d272fc6d4178602884bcaeb1a5df80a9e73eb87 [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
2 * libjingle
3 * Copyright 2008 Google Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000027
tfarina5237aaf2015-11-10 23:44:30 -080028#include "webrtc/base/arraysize.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000029#include "webrtc/base/byteorder.h"
30#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020031#include "webrtc/call.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032#include "talk/media/base/constants.h"
33#include "talk/media/base/fakemediaengine.h"
wu@webrtc.orgde305012013-10-31 15:40:38 +000034#include "talk/media/base/fakenetworkinterface.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035#include "talk/media/base/fakertp.h"
Fredrik Solenberg4b60c732015-05-07 14:07:48 +020036#include "talk/media/webrtc/fakewebrtccall.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000037#include "talk/media/webrtc/fakewebrtcvoiceengine.h"
38#include "talk/media/webrtc/webrtcvoiceengine.h"
deadbeefcbecd352015-09-23 11:50:27 -070039#include "webrtc/p2p/base/faketransportcontroller.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000040#include "talk/session/media/channel.h"
41
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000042using cricket::kRtpAudioLevelHeaderExtension;
43using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
44
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020045namespace {
46
47const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
48const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
49const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
50const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
51const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
52const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
53const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
54const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
55const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, 0,
56 1, 0);
solenberg85a04962015-10-27 03:35:21 -070057const uint32_t kSsrc1 = 0x99;
58const uint32_t kSsrc2 = 0x98;
59const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060
61class FakeVoEWrapper : public cricket::VoEWrapper {
62 public:
63 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
64 : cricket::VoEWrapper(engine, // processing
65 engine, // base
66 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000067 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000068 engine, // network
69 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000070 engine) { // volume
71 }
72};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020073} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000074
deadbeef884f5852016-01-15 09:20:04 -080075class FakeAudioSink : public webrtc::AudioSinkInterface {
76 public:
77 void OnData(const Data& audio) override {}
78};
79
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080class 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()),
solenbergbd138382015-11-20 16:08:07 -080084 engine_(new FakeVoEWrapper(&voe_)),
Jelena Marusicc28a8962015-05-29 15:05:44 +020085 channel_(nullptr) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +020086 send_parameters_.codecs.push_back(kPcmuCodec);
87 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088 }
solenberg1ac56142015-10-13 03:58:19 -070089 bool SetupEngine() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000090 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000091 return false;
92 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +020093 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +020094 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000095 }
solenberg1ac56142015-10-13 03:58:19 -070096 bool SetupEngineWithRecvStream() {
97 if (!SetupEngine()) {
98 return false;
99 }
100 return channel_->AddRecvStream(
101 cricket::StreamParams::CreateLegacy(kSsrc1));
102 }
103 bool SetupEngineWithSendStream() {
104 if (!SetupEngine()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000105 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000106 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000107 return channel_->AddSendStream(
108 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000109 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000110 void SetupForMultiSendStream() {
solenberg1ac56142015-10-13 03:58:19 -0700111 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700112 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800113 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700114 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700115 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800116 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000117 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000118 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200119 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000120 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000121 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200122 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000123 delete channel_;
124 engine_.Terminate();
125 }
126
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100127 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
128 const auto* send_stream = call_.GetAudioSendStream(ssrc);
129 EXPECT_TRUE(send_stream);
130 return *send_stream;
131 }
132
deadbeef884f5852016-01-15 09:20:04 -0800133 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
134 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
135 EXPECT_TRUE(recv_stream);
136 return *recv_stream;
137 }
138
solenberg3a941542015-11-16 07:34:50 -0800139 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
140 const auto* send_stream = call_.GetAudioSendStream(ssrc);
141 EXPECT_TRUE(send_stream);
142 return send_stream->GetConfig();
143 }
144
solenberg7add0582015-11-20 09:59:34 -0800145 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
146 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
147 EXPECT_TRUE(recv_stream);
148 return recv_stream->GetConfig();
149 }
150
Peter Boström0c4e06b2015-10-07 12:23:21 +0200151 void TestInsertDtmf(uint32_t ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000152 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200153 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200154 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000155 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700156 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000157 // send stream.
158 EXPECT_TRUE(channel_->AddSendStream(
159 cricket::StreamParams::CreateLegacy(kSsrc1)));
160 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000161
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000162 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200163 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000164 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
165 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800166 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200167 send_parameters_.codecs.push_back(kTelephoneEventCodec);
168 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000169 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000170
171 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700172 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800173 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000174 EXPECT_TRUE(channel_->AddSendStream(
175 cricket::StreamParams::CreateLegacy(kSsrc1)));
176 }
177
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000178 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800179 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000180
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100181 // Test send.
182 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
183 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
184 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800185 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100186 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
187 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
188 EXPECT_EQ(2, telephone_event.event_code);
189 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000190 }
191
192 // Test that send bandwidth is set correctly.
193 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000194 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
195 // |expected_result| is the expected result from SetMaxSendBandwidth().
196 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000197 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000198 int max_bitrate,
199 bool expected_result,
200 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200201 cricket::AudioSendParameters parameters;
202 parameters.codecs.push_back(codec);
203 parameters.max_bandwidth_bps = max_bitrate;
204 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
205
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000206 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000207 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000208 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000209 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000210 }
211
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000212 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenberg0a617e22015-10-20 15:49:38 -0700213 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000214
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000215 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800216 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000217
218 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200219 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000220 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200221 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800222 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000223
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000224 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200225 send_parameters_.extensions.clear();
226 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800227 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000228
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000229 // Ensure extension is set properly.
230 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200231 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
232 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800233 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
234 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
235 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000236
solenberg7add0582015-11-20 09:59:34 -0800237 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000238 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700239 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800240 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
241 call_.GetAudioSendStream(kSsrc2));
242 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
243 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
244 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000245
246 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200247 send_parameters_.codecs.push_back(kPcmuCodec);
248 send_parameters_.extensions.clear();
249 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800250 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
251 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000252 }
253
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000254 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700255 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000256
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000257 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800258 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000259
260 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800261 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000262 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800263 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
264 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000265
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000266 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800267 recv_parameters_.extensions.clear();
268 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
269 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000270
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000271 // Ensure extension is set properly.
272 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800273 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
274 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
275 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
276 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
277 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000278
solenberg7add0582015-11-20 09:59:34 -0800279 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000280 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700281 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800282 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
283 call_.GetAudioReceiveStream(kSsrc2));
284 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
285 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
286 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000287
288 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800289 recv_parameters_.extensions.clear();
290 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
291 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
292 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000293 }
294
solenberg85a04962015-10-27 03:35:21 -0700295 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
296 webrtc::AudioSendStream::Stats stats;
297 stats.local_ssrc = 12;
298 stats.bytes_sent = 345;
299 stats.packets_sent = 678;
300 stats.packets_lost = 9012;
301 stats.fraction_lost = 34.56f;
302 stats.codec_name = "codec_name_send";
303 stats.ext_seqnum = 789;
304 stats.jitter_ms = 12;
305 stats.rtt_ms = 345;
306 stats.audio_level = 678;
307 stats.aec_quality_min = 9.01f;
308 stats.echo_delay_median_ms = 234;
309 stats.echo_delay_std_ms = 567;
310 stats.echo_return_loss = 890;
311 stats.echo_return_loss_enhancement = 1234;
312 stats.typing_noise_detected = true;
313 return stats;
314 }
315 void SetAudioSendStreamStats() {
316 for (auto* s : call_.GetAudioSendStreams()) {
317 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200318 }
solenberg85a04962015-10-27 03:35:21 -0700319 }
solenberg566ef242015-11-06 15:34:49 -0800320 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
321 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700322 const auto stats = GetAudioSendStreamStats();
323 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
324 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
325 EXPECT_EQ(info.packets_sent, stats.packets_sent);
326 EXPECT_EQ(info.packets_lost, stats.packets_lost);
327 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
328 EXPECT_EQ(info.codec_name, stats.codec_name);
329 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
330 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
331 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
332 EXPECT_EQ(info.audio_level, stats.audio_level);
333 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
334 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
335 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
336 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
337 EXPECT_EQ(info.echo_return_loss_enhancement,
338 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800339 EXPECT_EQ(info.typing_noise_detected,
340 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700341 }
342
343 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
344 webrtc::AudioReceiveStream::Stats stats;
345 stats.remote_ssrc = 123;
346 stats.bytes_rcvd = 456;
347 stats.packets_rcvd = 768;
348 stats.packets_lost = 101;
349 stats.fraction_lost = 23.45f;
350 stats.codec_name = "codec_name_recv";
351 stats.ext_seqnum = 678;
352 stats.jitter_ms = 901;
353 stats.jitter_buffer_ms = 234;
354 stats.jitter_buffer_preferred_ms = 567;
355 stats.delay_estimate_ms = 890;
356 stats.audio_level = 1234;
357 stats.expand_rate = 5.67f;
358 stats.speech_expand_rate = 8.90f;
359 stats.secondary_decoded_rate = 1.23f;
360 stats.accelerate_rate = 4.56f;
361 stats.preemptive_expand_rate = 7.89f;
362 stats.decoding_calls_to_silence_generator = 12;
363 stats.decoding_calls_to_neteq = 345;
364 stats.decoding_normal = 67890;
365 stats.decoding_plc = 1234;
366 stats.decoding_cng = 5678;
367 stats.decoding_plc_cng = 9012;
368 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200369 return stats;
370 }
371 void SetAudioReceiveStreamStats() {
372 for (auto* s : call_.GetAudioReceiveStreams()) {
373 s->SetStats(GetAudioReceiveStreamStats());
374 }
375 }
376 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700377 const auto stats = GetAudioReceiveStreamStats();
378 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
379 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
380 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
381 EXPECT_EQ(info.packets_lost, stats.packets_lost);
382 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
383 EXPECT_EQ(info.codec_name, stats.codec_name);
384 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
385 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
386 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200387 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700388 stats.jitter_buffer_preferred_ms);
389 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
390 EXPECT_EQ(info.audio_level, stats.audio_level);
391 EXPECT_EQ(info.expand_rate, stats.expand_rate);
392 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
393 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
394 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
395 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200396 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700397 stats.decoding_calls_to_silence_generator);
398 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
399 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
400 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
401 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
402 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
403 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200404 }
405
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000406 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200407 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000408 cricket::FakeWebRtcVoiceEngine voe_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000409 cricket::WebRtcVoiceEngine engine_;
410 cricket::VoiceMediaChannel* channel_;
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};
414
415// Tests that our stub library "works".
416TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
417 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000418 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000419 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000420 engine_.Terminate();
421 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000422}
423
424// Tests that we can create and destroy a channel.
425TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000426 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200427 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200428 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000429}
430
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000431// Tests that the list of supported codecs is created properly and ordered
432// correctly
433TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
434 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
435 ASSERT_FALSE(codecs.empty());
436 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
437 EXPECT_EQ(48000, codecs[0].clockrate);
438 EXPECT_EQ(2, codecs[0].channels);
439 EXPECT_EQ(64000, codecs[0].bitrate);
440 int pref = codecs[0].preference;
441 for (size_t i = 1; i < codecs.size(); ++i) {
442 EXPECT_GT(pref, codecs[i].preference);
443 pref = codecs[i].preference;
444 }
445}
446
447// Tests that we can find codecs by name or id, and that we interpret the
448// clockrate and bitrate fields properly.
449TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
450 cricket::AudioCodec codec;
451 webrtc::CodecInst codec_inst;
452 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800453 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000454 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800455 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000456 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800457 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
458 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000459 // Find ISAC with a different payload id.
460 codec = kIsacCodec;
461 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800462 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000463 EXPECT_EQ(codec.id, codec_inst.pltype);
464 // Find PCMU with a 0 clockrate.
465 codec = kPcmuCodec;
466 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800467 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000468 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;
solenberg26c8c912015-11-27 04:00:25 -0800473 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000474 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;
solenberg26c8c912015-11-27 04:00:25 -0800479 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000480 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;
solenberg26c8c912015-11-27 04:00:25 -0800542 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000543 // 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;
solenberg26c8c912015-11-27 04:00:25 -0800565 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000566 // 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;
solenberg26c8c912015-11-27 04:00:25 -0800588 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000589 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;
solenberg26c8c912015-11-27 04:00:25 -0800673 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000674 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));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100786 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000787}
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);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001627 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001628}
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));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001673 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001674}
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));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001706 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001707}
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));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001770 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001771}
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
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002172// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002173// and start sending on it.
2174TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2175 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg246b8172015-12-08 09:50:23 -08002176 cricket::AudioOptions options_adjust_agc;
2177 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002178 int channel_num = voe_.GetLastChannel();
2179 webrtc::AgcConfig agc_config;
2180 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2181 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002182 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002183 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002184 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2185 EXPECT_TRUE(voe_.GetSend(channel_num));
2186 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2187 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002188 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2189 EXPECT_FALSE(voe_.GetSend(channel_num));
2190 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002191}
2192
wu@webrtc.org97077a32013-10-25 21:18:33 +00002193TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002194 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002195 webrtc::AgcConfig agc_config;
2196 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2197 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002198 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2199 send_parameters_.options.tx_agc_digital_compression_gain =
2200 rtc::Optional<uint16_t>(9);
2201 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2202 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2203 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002204 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2205 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2206 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2207 EXPECT_TRUE(agc_config.limiterEnable);
2208
2209 // Check interaction with adjust_agc_delta. Both should be respected, for
2210 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002211 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2212 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002213 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2214 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2215}
2216
wu@webrtc.org97077a32013-10-25 21:18:33 +00002217TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002218 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg246b8172015-12-08 09:50:23 -08002219 send_parameters_.options.recording_sample_rate =
2220 rtc::Optional<uint32_t>(48000);
2221 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2222 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002223
2224 unsigned int recording_sample_rate, playout_sample_rate;
2225 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2226 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2227 EXPECT_EQ(48000u, recording_sample_rate);
2228 EXPECT_EQ(44100u, playout_sample_rate);
2229}
2230
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002231// Test that we can set the outgoing SSRC properly.
2232// SSRC is set in SetupEngine by calling AddSendStream.
2233TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002234 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002235 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002236}
2237
2238TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2239 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002240 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002241 SetAudioSendStreamStats();
solenberg1ac56142015-10-13 03:58:19 -07002242 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2243 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002244 EXPECT_TRUE(channel_->AddRecvStream(
2245 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002246 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2247 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002248
solenberg85a04962015-10-27 03:35:21 -07002249 // Check stats for the added streams.
2250 {
2251 cricket::VoiceMediaInfo info;
2252 EXPECT_EQ(true, channel_->GetStats(&info));
2253
2254 // We have added one send stream. We should see the stats we've set.
2255 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002256 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002257 // We have added one receive stream. We should see empty stats.
2258 EXPECT_EQ(info.receivers.size(), 1u);
2259 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2260 }
solenberg1ac56142015-10-13 03:58:19 -07002261
solenberg566ef242015-11-06 15:34:49 -08002262 // Start sending - this affects some reported stats.
2263 {
2264 cricket::VoiceMediaInfo info;
2265 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2266 EXPECT_EQ(true, channel_->GetStats(&info));
2267 VerifyVoiceSenderInfo(info.senders[0], true);
2268 }
2269
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002270 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002271 {
2272 cricket::VoiceMediaInfo info;
2273 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2274 EXPECT_EQ(true, channel_->GetStats(&info));
2275 EXPECT_EQ(1u, info.senders.size());
2276 EXPECT_EQ(0u, info.receivers.size());
2277 }
solenberg1ac56142015-10-13 03:58:19 -07002278
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002279 // Deliver a new packet - a default receive stream should be created and we
2280 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002281 {
2282 cricket::VoiceMediaInfo info;
2283 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2284 SetAudioReceiveStreamStats();
2285 EXPECT_EQ(true, channel_->GetStats(&info));
2286 EXPECT_EQ(1u, info.senders.size());
2287 EXPECT_EQ(1u, info.receivers.size());
2288 VerifyVoiceReceiverInfo(info.receivers[0]);
2289 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002290}
2291
2292// Test that we can set the outgoing SSRC properly with multiple streams.
2293// SSRC is set in SetupEngine by calling AddSendStream.
2294TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002295 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002296 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002297 EXPECT_TRUE(channel_->AddRecvStream(
2298 cricket::StreamParams::CreateLegacy(kSsrc2)));
2299 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002300}
2301
2302// Test that the local SSRC is the same on sending and receiving channels if the
2303// receive channel is created before the send channel.
2304TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002305 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002306 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002307
2308 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2309 int receive_channel_num = voe_.GetLastChannel();
2310 EXPECT_TRUE(channel_->AddSendStream(
2311 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002312
solenberg3a941542015-11-16 07:34:50 -08002313 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002314 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002315}
2316
2317// Test that we can properly receive packets.
2318TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2319 EXPECT_TRUE(SetupEngine());
solenberg7e63ef02015-11-20 00:19:43 -08002320 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002321 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002322 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002323 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002324}
2325
2326// Test that we can properly receive packets on multiple streams.
2327TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg7e63ef02015-11-20 00:19:43 -08002328 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002329 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2330 int channel_num1 = voe_.GetLastChannel();
2331 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2332 int channel_num2 = voe_.GetLastChannel();
2333 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2334 int channel_num3 = voe_.GetLastChannel();
2335 // Create packets with the right SSRCs.
2336 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002337 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002338 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002339 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002340 }
2341 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2342 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2343 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002344
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002345 DeliverPacket(packets[0], sizeof(packets[0]));
2346 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2347 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2348 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002349
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002350 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002351 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002352 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2353 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002354
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002355 DeliverPacket(packets[2], sizeof(packets[2]));
2356 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002357 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002358 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002359
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002360 DeliverPacket(packets[3], sizeof(packets[3]));
2361 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2362 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002363 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2364
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002365 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2366 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2367 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2368}
2369
solenberg7e63ef02015-11-20 00:19:43 -08002370// Test that receiving on an unsignalled stream works (default channel will be
2371// created).
2372TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
2373 EXPECT_TRUE(SetupEngine());
2374 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2375 int channel_num = voe_.GetLastChannel();
2376 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2377}
2378
2379// Test that receiving on an unsignalled stream works (default channel will be
2380// created), and that packets will be forwarded to the default channel
2381// regardless of their SSRCs.
2382TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
2383 EXPECT_TRUE(SetupEngine());
2384 char packet[sizeof(kPcmuFrame)];
2385 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2386
2387 // Note that the first unknown SSRC cannot be 0, because we only support
2388 // creating receive streams for SSRC!=0.
2389 DeliverPacket(packet, sizeof(packet));
2390 int channel_num = voe_.GetLastChannel();
2391 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2392 // Once we have the default channel, SSRC==0 will be ok.
2393 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2394 rtc::SetBE32(&packet[8], ssrc);
2395 DeliverPacket(packet, sizeof(packet));
2396 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2397 }
2398}
2399
2400// Test that a default channel is created even after a signalled stream has been
2401// added, and that this stream will get any packets for unknown SSRCs.
2402TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
2403 EXPECT_TRUE(SetupEngine());
2404 char packet[sizeof(kPcmuFrame)];
2405 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2406
2407 // Add a known stream, send packet and verify we got it.
2408 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2409 int signalled_channel_num = voe_.GetLastChannel();
2410 DeliverPacket(packet, sizeof(packet));
2411 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2412
2413 // Note that the first unknown SSRC cannot be 0, because we only support
2414 // creating receive streams for SSRC!=0.
2415 rtc::SetBE32(&packet[8], 7011);
2416 DeliverPacket(packet, sizeof(packet));
2417 int channel_num = voe_.GetLastChannel();
2418 EXPECT_NE(channel_num, signalled_channel_num);
2419 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2420 // Once we have the default channel, SSRC==0 will be ok.
2421 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2422 rtc::SetBE32(&packet[8], ssrc);
2423 DeliverPacket(packet, sizeof(packet));
2424 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2425 }
2426}
2427
solenberg0a617e22015-10-20 15:49:38 -07002428// Test that we properly handle failures to add a receive stream.
2429TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
2430 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002431 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002432 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002433}
2434
solenberg0a617e22015-10-20 15:49:38 -07002435// Test that we properly handle failures to add a send stream.
2436TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
2437 EXPECT_TRUE(SetupEngine());
2438 voe_.set_fail_create_channel(true);
2439 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2440}
2441
solenberg1ac56142015-10-13 03:58:19 -07002442// Test that AddRecvStream creates new stream.
2443TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2444 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002445 int channel_num = voe_.GetLastChannel();
2446 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002447 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002448}
2449
2450// Test that after adding a recv stream, we do not decode more codecs than
2451// those previously passed into SetRecvCodecs.
2452TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002453 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002454 cricket::AudioRecvParameters parameters;
2455 parameters.codecs.push_back(kIsacCodec);
2456 parameters.codecs.push_back(kPcmuCodec);
2457 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002458 EXPECT_TRUE(channel_->AddRecvStream(
2459 cricket::StreamParams::CreateLegacy(kSsrc1)));
2460 int channel_num2 = voe_.GetLastChannel();
2461 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002462 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002463 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002464 gcodec.channels = 2;
2465 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2466}
2467
2468// Test that we properly clean up any streams that were added, even if
2469// not explicitly removed.
2470TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002471 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002472 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002473 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2474 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2475 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2476 delete channel_;
2477 channel_ = NULL;
2478 EXPECT_EQ(0, voe_.GetNumChannels());
2479}
2480
wu@webrtc.org78187522013-10-07 23:32:02 +00002481TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002482 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002483 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2484}
2485
2486TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2487 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002488 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002489 // Manually delete channel to simulate a failure.
2490 int channel = voe_.GetLastChannel();
2491 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2492 // Add recv stream 2 should work.
2493 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002494 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002495 EXPECT_NE(channel, new_channel);
2496 // The last created channel is deleted too.
2497 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002498}
2499
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002500// Test the InsertDtmf on default send stream as caller.
2501TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2502 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002503}
2504
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002505// Test the InsertDtmf on default send stream as callee
2506TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2507 TestInsertDtmf(0, false);
2508}
2509
2510// Test the InsertDtmf on specified send stream as caller.
2511TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2512 TestInsertDtmf(kSsrc1, true);
2513}
2514
2515// Test the InsertDtmf on specified send stream as callee.
2516TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2517 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002518}
2519
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002520TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002521 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002522 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002523 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2524 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2525 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2526 EXPECT_TRUE(channel_->SetPlayout(true));
2527 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2528 EXPECT_TRUE(channel_->SetPlayout(false));
2529 EXPECT_FALSE(channel_->SetPlayout(true));
2530}
2531
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002532TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002533 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002534
2535 bool ec_enabled;
2536 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002537 webrtc::AecmModes aecm_mode;
2538 bool cng_enabled;
2539 bool agc_enabled;
2540 webrtc::AgcModes agc_mode;
2541 webrtc::AgcConfig agc_config;
2542 bool ns_enabled;
2543 webrtc::NsModes ns_mode;
2544 bool highpass_filter_enabled;
2545 bool stereo_swapping_enabled;
2546 bool typing_detection_enabled;
2547 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002548 voe_.GetAecmMode(aecm_mode, cng_enabled);
2549 voe_.GetAgcStatus(agc_enabled, agc_mode);
2550 voe_.GetAgcConfig(agc_config);
2551 voe_.GetNsStatus(ns_enabled, ns_mode);
2552 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2553 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2554 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2555 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002556 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002557 EXPECT_FALSE(cng_enabled);
2558 EXPECT_TRUE(agc_enabled);
2559 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2560 EXPECT_TRUE(ns_enabled);
2561 EXPECT_TRUE(highpass_filter_enabled);
2562 EXPECT_FALSE(stereo_swapping_enabled);
2563 EXPECT_TRUE(typing_detection_enabled);
2564 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2565 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002566 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2567 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002568
solenberg246b8172015-12-08 09:50:23 -08002569 // Nothing set in AudioOptions, so everything should be as default.
2570 send_parameters_.options = cricket::AudioOptions();
2571 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002572 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002573 voe_.GetAecmMode(aecm_mode, cng_enabled);
2574 voe_.GetAgcStatus(agc_enabled, agc_mode);
2575 voe_.GetAgcConfig(agc_config);
2576 voe_.GetNsStatus(ns_enabled, ns_mode);
2577 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2578 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2579 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2580 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002581 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002582 EXPECT_FALSE(cng_enabled);
2583 EXPECT_TRUE(agc_enabled);
2584 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2585 EXPECT_TRUE(ns_enabled);
2586 EXPECT_TRUE(highpass_filter_enabled);
2587 EXPECT_FALSE(stereo_swapping_enabled);
2588 EXPECT_TRUE(typing_detection_enabled);
2589 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2590 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002591 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2592 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002593
2594 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002595 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2596 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002597 voe_.GetEcStatus(ec_enabled, ec_mode);
2598 EXPECT_FALSE(ec_enabled);
2599
2600 // Turn echo cancellation back on, with settings, and make sure
2601 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002602 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2603 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002604 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002605 voe_.GetAecmMode(aecm_mode, cng_enabled);
2606 voe_.GetAgcStatus(agc_enabled, agc_mode);
2607 voe_.GetAgcConfig(agc_config);
2608 voe_.GetNsStatus(ns_enabled, ns_mode);
2609 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2610 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2611 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2612 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002613 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002614 EXPECT_TRUE(agc_enabled);
2615 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2616 EXPECT_TRUE(ns_enabled);
2617 EXPECT_TRUE(highpass_filter_enabled);
2618 EXPECT_FALSE(stereo_swapping_enabled);
2619 EXPECT_TRUE(typing_detection_enabled);
2620 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2621 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2622
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002623 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2624 // control.
solenberg246b8172015-12-08 09:50:23 -08002625 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2626 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002627 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002628 voe_.GetAecmMode(aecm_mode, cng_enabled);
2629 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002630 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002631 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2632
2633 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002634 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2635 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2636 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2637 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002638 voe_.GetEcStatus(ec_enabled, ec_mode);
2639 EXPECT_FALSE(ec_enabled);
2640 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002641 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2642 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002643 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002644 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002645 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002646 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2647
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002648 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002649 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2650 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002651 voe_.GetAgcStatus(agc_enabled, agc_mode);
2652 EXPECT_FALSE(agc_enabled);
2653
2654 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002655 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2656 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2657 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002658 voe_.GetAgcStatus(agc_enabled, agc_mode);
2659 EXPECT_TRUE(agc_enabled);
2660 voe_.GetAgcConfig(agc_config);
2661 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2662
2663 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002664 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2665 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2666 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2667 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2668 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002669 voe_.GetNsStatus(ns_enabled, ns_mode);
2670 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2671 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2672 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2673 EXPECT_FALSE(ns_enabled);
2674 EXPECT_FALSE(highpass_filter_enabled);
2675 EXPECT_FALSE(typing_detection_enabled);
2676 EXPECT_TRUE(stereo_swapping_enabled);
2677
solenberg1ac56142015-10-13 03:58:19 -07002678 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002679 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002680 voe_.GetEcStatus(ec_enabled, ec_mode);
2681 voe_.GetNsStatus(ns_enabled, ns_mode);
2682 EXPECT_TRUE(ec_enabled);
2683 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2684 EXPECT_FALSE(ns_enabled);
2685 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2686}
2687
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002688TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002689 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002690
2691 bool ec_enabled;
2692 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002693 bool agc_enabled;
2694 webrtc::AgcModes agc_mode;
2695 bool ns_enabled;
2696 webrtc::NsModes ns_mode;
2697 bool highpass_filter_enabled;
2698 bool stereo_swapping_enabled;
2699 bool typing_detection_enabled;
2700
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002701 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002702 voe_.GetAgcStatus(agc_enabled, agc_mode);
2703 voe_.GetNsStatus(ns_enabled, ns_mode);
2704 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2705 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2706 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2707 EXPECT_TRUE(ec_enabled);
2708 EXPECT_TRUE(agc_enabled);
2709 EXPECT_TRUE(ns_enabled);
2710 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002711 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002712 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002713}
2714
2715TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2716 webrtc::AgcConfig set_config = {0};
2717 set_config.targetLeveldBOv = 3;
2718 set_config.digitalCompressionGaindB = 9;
2719 set_config.limiterEnable = true;
2720 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002721 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002722
2723 webrtc::AgcConfig config = {0};
2724 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2725 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2726 EXPECT_EQ(set_config.digitalCompressionGaindB,
2727 config.digitalCompressionGaindB);
2728 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2729}
2730
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002731TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002732 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg66f43392015-09-09 01:36:22 -07002733 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2734 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002735 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002736 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2737 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002738 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002739
2740 // Have to add a stream to make SetSend work.
2741 cricket::StreamParams stream1;
2742 stream1.ssrcs.push_back(1);
2743 channel1->AddSendStream(stream1);
2744 cricket::StreamParams stream2;
2745 stream2.ssrcs.push_back(2);
2746 channel2->AddSendStream(stream2);
2747
2748 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002749 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002750 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2751 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2752 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002753 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2754 EXPECT_EQ(parameters_options_all.options, channel1->options());
2755 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2756 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002757
2758 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002759 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002760 parameters_options_no_ns.options.noise_suppression =
2761 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002762 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2763 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002764 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2765 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2766 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002767 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002768
2769 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002770 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002771 parameters_options_no_agc.options.auto_gain_control =
2772 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002773 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002774 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2775 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2776 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002777 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002778
solenberg246b8172015-12-08 09:50:23 -08002779 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002780 bool ec_enabled;
2781 webrtc::EcModes ec_mode;
2782 bool agc_enabled;
2783 webrtc::AgcModes agc_mode;
2784 bool ns_enabled;
2785 webrtc::NsModes ns_mode;
2786 voe_.GetEcStatus(ec_enabled, ec_mode);
2787 voe_.GetAgcStatus(agc_enabled, agc_mode);
2788 voe_.GetNsStatus(ns_enabled, ns_mode);
2789 EXPECT_TRUE(ec_enabled);
2790 EXPECT_TRUE(agc_enabled);
2791 EXPECT_TRUE(ns_enabled);
2792
2793 channel1->SetSend(cricket::SEND_MICROPHONE);
2794 voe_.GetEcStatus(ec_enabled, ec_mode);
2795 voe_.GetAgcStatus(agc_enabled, agc_mode);
2796 voe_.GetNsStatus(ns_enabled, ns_mode);
2797 EXPECT_TRUE(ec_enabled);
2798 EXPECT_TRUE(agc_enabled);
2799 EXPECT_FALSE(ns_enabled);
2800
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002801 channel2->SetSend(cricket::SEND_MICROPHONE);
2802 voe_.GetEcStatus(ec_enabled, ec_mode);
2803 voe_.GetAgcStatus(agc_enabled, agc_mode);
2804 voe_.GetNsStatus(ns_enabled, ns_mode);
2805 EXPECT_TRUE(ec_enabled);
2806 EXPECT_FALSE(agc_enabled);
2807 EXPECT_TRUE(ns_enabled);
2808
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002809 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08002810 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002811 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2812 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002813 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01002814 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07002815 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01002816 rtc::Optional<bool>(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002817 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002818 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01002819 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2820 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2821 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002822 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002823 voe_.GetEcStatus(ec_enabled, ec_mode);
2824 voe_.GetAgcStatus(agc_enabled, agc_mode);
2825 voe_.GetNsStatus(ns_enabled, ns_mode);
2826 EXPECT_TRUE(ec_enabled);
2827 EXPECT_FALSE(agc_enabled);
2828 EXPECT_FALSE(ns_enabled);
2829}
2830
wu@webrtc.orgde305012013-10-31 15:40:38 +00002831// This test verifies DSCP settings are properly applied on voice media channel.
2832TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002833 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002834 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002835 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002836 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00002837 new cricket::FakeNetworkInterface);
2838 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002839 cricket::AudioSendParameters parameters = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002840 parameters.options.dscp = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002841 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002842 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00002843 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002844 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002845 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
Karl Wibergbe579832015-11-10 22:34:18 +01002846 parameters.options.dscp = rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002847 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002848 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00002849}
2850
solenberg1ac56142015-10-13 03:58:19 -07002851TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002852 EXPECT_TRUE(SetupEngine());
2853 cricket::WebRtcVoiceMediaChannel* media_channel =
2854 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002855 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2856 EXPECT_TRUE(channel_->AddRecvStream(
2857 cricket::StreamParams::CreateLegacy(kSsrc1)));
2858 int channel_id = voe_.GetLastChannel();
2859 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2860 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2861 EXPECT_TRUE(channel_->AddRecvStream(
2862 cricket::StreamParams::CreateLegacy(kSsrc2)));
2863 int channel_id2 = voe_.GetLastChannel();
2864 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002865}
2866
solenberg1ac56142015-10-13 03:58:19 -07002867TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002868 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002869 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002870 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2871 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2872 EXPECT_TRUE(channel_->AddSendStream(
2873 cricket::StreamParams::CreateLegacy(kSsrc1)));
2874 int channel_id = voe_.GetLastChannel();
2875 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2876 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2877 EXPECT_TRUE(channel_->AddSendStream(
2878 cricket::StreamParams::CreateLegacy(kSsrc2)));
2879 int channel_id2 = voe_.GetLastChannel();
2880 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002881}
2882
solenberg4bac9c52015-10-09 02:32:53 -07002883TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002884 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002885 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002886 cricket::StreamParams stream;
2887 stream.ssrcs.push_back(kSsrc2);
2888 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002889 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002890 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002891 float scale = 0;
2892 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2893 EXPECT_DOUBLE_EQ(3, scale);
2894}
2895
2896TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
2897 EXPECT_TRUE(SetupEngine());
2898 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2899 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2900 int channel_id = voe_.GetLastChannel();
2901 float scale = 0;
2902 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2903 EXPECT_DOUBLE_EQ(2, scale);
2904 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07002905 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002906 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002907}
2908
pbos8fc7fa72015-07-15 08:02:58 -07002909TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02002910 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07002911 const std::string kSyncLabel = "AvSyncLabel";
2912
solenberg1ac56142015-10-13 03:58:19 -07002913 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07002914 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
2915 sp.sync_label = kSyncLabel;
2916 // Creating two channels to make sure that sync label is set properly for both
2917 // the default voice channel and following ones.
2918 EXPECT_TRUE(channel_->AddRecvStream(sp));
2919 sp.ssrcs[0] += 1;
2920 EXPECT_TRUE(channel_->AddRecvStream(sp));
2921
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002922 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07002923 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002924 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002925 << "SyncGroup should be set based on sync_label";
2926 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002927 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002928 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07002929}
2930
pbos6bb1b6e2015-07-24 07:10:18 -07002931TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002932 // Test that changing the combined_audio_video_bwe option results in the
2933 // expected state changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002934 std::vector<uint32_t> ssrcs;
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002935 ssrcs.push_back(223);
2936 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002937
solenberg1ac56142015-10-13 03:58:19 -07002938 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002939 cricket::WebRtcVoiceMediaChannel* media_channel =
2940 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02002941 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002942 EXPECT_TRUE(media_channel->AddRecvStream(
2943 cricket::StreamParams::CreateLegacy(ssrc)));
2944 }
2945 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002946
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002947 // Combined BWE should be disabled.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002948 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002949 const auto* s = call_.GetAudioReceiveStream(ssrc);
2950 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07002951 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002952 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002953
2954 // Enable combined BWE option - now it should be set up.
Karl Wibergbe579832015-11-10 22:34:18 +01002955 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002956 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002957 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002958 const auto* s = call_.GetAudioReceiveStream(ssrc);
2959 EXPECT_NE(nullptr, s);
2960 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
2961 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002962
2963 // Disable combined BWE option - should be disabled again.
Karl Wibergbe579832015-11-10 22:34:18 +01002964 send_parameters_.options.combined_audio_video_bwe =
2965 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002966 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002967 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002968 const auto* s = call_.GetAudioReceiveStream(ssrc);
2969 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07002970 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002971 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002972
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002973 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002974}
2975
pbos6bb1b6e2015-07-24 07:10:18 -07002976TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002977 // Test that adding receive streams after enabling combined bandwidth
2978 // estimation will correctly configure each channel.
solenberg1ac56142015-10-13 03:58:19 -07002979 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002980 cricket::WebRtcVoiceMediaChannel* media_channel =
2981 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01002982 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002983 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002984
solenberg246b8172015-12-08 09:50:23 -08002985 for (uint32_t ssrc : kSsrcs4) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002986 EXPECT_TRUE(media_channel->AddRecvStream(
solenberg246b8172015-12-08 09:50:23 -08002987 cricket::StreamParams::CreateLegacy(ssrc)));
2988 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(ssrc));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002989 }
solenberg246b8172015-12-08 09:50:23 -08002990 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002991}
2992
solenberg3a941542015-11-16 07:34:50 -08002993// TODO(solenberg): Remove, once recv streams are configured through Call.
2994// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07002995TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002996 // Test that setting the header extensions results in the expected state
2997 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002998 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002999 ssrcs.push_back(223);
3000 ssrcs.push_back(224);
3001
solenberg1ac56142015-10-13 03:58:19 -07003002 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003003 cricket::WebRtcVoiceMediaChannel* media_channel =
3004 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003005 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003006 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003007 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003008 EXPECT_TRUE(media_channel->AddRecvStream(
3009 cricket::StreamParams::CreateLegacy(ssrc)));
3010 }
3011
3012 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003013 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003014 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003015 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003016 EXPECT_NE(nullptr, s);
3017 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3018 }
3019
3020 // Set up receive extensions.
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003021 cricket::RtpCapabilities capabilities = engine_.GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003022 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003023 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003024 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003025 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003026 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003027 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003028 EXPECT_NE(nullptr, s);
3029 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003030 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3031 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003032 for (const auto& s_ext : s_exts) {
3033 if (e_ext.id == s_ext.id) {
3034 EXPECT_EQ(e_ext.uri, s_ext.name);
3035 }
3036 }
3037 }
3038 }
3039
3040 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003041 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003042 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003043 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003044 EXPECT_NE(nullptr, s);
3045 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3046 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003047}
3048
3049TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3050 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003051 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003052 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3053 static const unsigned char kRtcp[] = {
3054 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3055 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3056 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3057 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3058 };
3059 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3060
solenberg1ac56142015-10-13 03:58:19 -07003061 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003062 cricket::WebRtcVoiceMediaChannel* media_channel =
3063 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003064 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003065 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003066 EXPECT_TRUE(media_channel->AddRecvStream(
3067 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3068
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003069 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003070 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003071 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003072 EXPECT_EQ(0, s->received_packets());
3073 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3074 EXPECT_EQ(1, s->received_packets());
3075 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3076 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003077}
Minyue2013aec2015-05-13 14:14:42 +02003078
solenberg0a617e22015-10-20 15:49:38 -07003079// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003080// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003081TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenberg1ac56142015-10-13 03:58:19 -07003082 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003083 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003084 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003085 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3086 int recv_ch = voe_.GetLastChannel();
3087 EXPECT_NE(recv_ch, default_channel);
3088 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3089 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3090 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003091 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3092 recv_ch = voe_.GetLastChannel();
3093 EXPECT_NE(recv_ch, default_channel);
3094 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003095}
3096
3097TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003098 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003099 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003100
3101 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3102 int recv_ch = voe_.GetLastChannel();
3103
3104 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3105 int send_ch = voe_.GetLastChannel();
3106
3107 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3108 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3109 // channel of |recv_ch|.This is not a common case, since, normally, only the
3110 // default channel can be associated. However, the default is not deletable.
3111 // So we force the |recv_ch| to associate with a non-default channel.
3112 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3113 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3114
3115 EXPECT_TRUE(channel_->RemoveSendStream(2));
3116 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3117}
stefan658910c2015-09-03 05:48:32 -07003118
deadbeef884f5852016-01-15 09:20:04 -08003119TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
3120 EXPECT_TRUE(SetupEngine());
3121 rtc::scoped_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3122 rtc::scoped_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
3123
3124 // Setting the sink before a recv stream exists should do nothing.
3125 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3126 EXPECT_TRUE(
3127 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3128 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3129
3130 // Now try actually setting the sink.
3131 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3132 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3133
3134 // Now try resetting it.
3135 channel_->SetRawAudioSink(kSsrc1, nullptr);
3136 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3137}
3138
3139TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
3140 EXPECT_TRUE(SetupEngine());
3141 rtc::scoped_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3142 rtc::scoped_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
3143
3144 // Should be able to set a default sink even when no stream exists.
3145 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3146
3147 // Create default channel and ensure it's assigned the default sink.
3148 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3149 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3150
3151 // Try resetting the default sink.
3152 channel_->SetRawAudioSink(0, nullptr);
3153 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3154
3155 // Try setting the default sink while the default stream exists.
3156 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3157 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3158
3159 // If we remove and add a default stream, it should get the same sink.
3160 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3161 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3162 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3163}
3164
stefan658910c2015-09-03 05:48:32 -07003165// Tests that the library initializes and shuts down properly.
3166TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3167 cricket::WebRtcVoiceEngine engine;
3168 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003169 rtc::scoped_ptr<webrtc::Call> call(
3170 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003171 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003172 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003173 EXPECT_TRUE(channel != nullptr);
3174 delete channel;
3175 engine.Terminate();
3176
3177 // Reinit to catch regression where VoiceEngineObserver reference is lost
3178 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3179 engine.Terminate();
3180}
3181
3182// Tests that the library is configured with the codecs we want.
3183TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003184 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003185 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3186 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0), nullptr));
3187 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3188 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0), nullptr));
3189 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3190 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003191 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003192 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3193 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0), nullptr));
3194 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3195 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0), nullptr));
3196 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3197 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0), nullptr));
3198 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3199 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0), nullptr));
3200 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3201 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0), nullptr));
3202 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3203 cricket::AudioCodec(96, "red", 8000, 0, 1, 0), nullptr));
3204 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3205 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0), nullptr));
3206 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3207 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0), nullptr));
3208 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3209 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0), nullptr));
3210 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3211 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003212 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003213 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3214 cricket::AudioCodec(0, "", 8000, 0, 1, 0), nullptr)); // PCMU
3215 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3216 cricket::AudioCodec(8, "", 8000, 0, 1, 0), nullptr)); // PCMA
3217 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3218 cricket::AudioCodec(9, "", 8000, 0, 1, 0), nullptr)); // G722
3219 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3220 cricket::AudioCodec(13, "", 8000, 0, 1, 0), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003221 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003222 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3223 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003224 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003225 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3226 cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0), nullptr));
3227 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3228 cricket::AudioCodec(88, "", 0, 0, 1, 0), nullptr));
3229 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3230 cricket::AudioCodec(0, "", 0, 0, 2, 0), nullptr));
3231 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3232 cricket::AudioCodec(0, "", 5000, 0, 1, 0), nullptr));
3233 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3234 cricket::AudioCodec(0, "", 0, 5000, 1, 0), nullptr));
3235
stefan658910c2015-09-03 05:48:32 -07003236 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenberg26c8c912015-11-27 04:00:25 -08003237 cricket::WebRtcVoiceEngine engine;
stefan658910c2015-09-03 05:48:32 -07003238 for (std::vector<cricket::AudioCodec>::const_iterator it =
3239 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3240 if (it->name == "CN" && it->clockrate == 16000) {
3241 EXPECT_EQ(105, it->id);
3242 } else if (it->name == "CN" && it->clockrate == 32000) {
3243 EXPECT_EQ(106, it->id);
3244 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3245 EXPECT_EQ(103, it->id);
3246 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3247 EXPECT_EQ(104, it->id);
3248 } else if (it->name == "G722" && it->clockrate == 8000) {
3249 EXPECT_EQ(9, it->id);
3250 } else if (it->name == "telephone-event") {
3251 EXPECT_EQ(126, it->id);
3252 } else if (it->name == "red") {
3253 EXPECT_EQ(127, it->id);
3254 } else if (it->name == "opus") {
3255 EXPECT_EQ(111, it->id);
3256 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3257 EXPECT_EQ("10", it->params.find("minptime")->second);
3258 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3259 EXPECT_EQ("60", it->params.find("maxptime")->second);
3260 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3261 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3262 }
3263 }
stefan658910c2015-09-03 05:48:32 -07003264 engine.Terminate();
3265}
3266
3267// Tests that VoE supports at least 32 channels
3268TEST(WebRtcVoiceEngineTest, Has32Channels) {
3269 cricket::WebRtcVoiceEngine engine;
3270 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003271 rtc::scoped_ptr<webrtc::Call> call(
3272 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003273
3274 cricket::VoiceMediaChannel* channels[32];
3275 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003276 while (num_channels < arraysize(channels)) {
stefan658910c2015-09-03 05:48:32 -07003277 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003278 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003279 if (!channel)
3280 break;
stefan658910c2015-09-03 05:48:32 -07003281 channels[num_channels++] = channel;
3282 }
3283
tfarina5237aaf2015-11-10 23:44:30 -08003284 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003285 EXPECT_EQ(expected, num_channels);
3286
3287 while (num_channels > 0) {
3288 delete channels[--num_channels];
3289 }
stefan658910c2015-09-03 05:48:32 -07003290 engine.Terminate();
3291}
3292
3293// Test that we set our preferred codecs properly.
3294TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3295 cricket::WebRtcVoiceEngine engine;
3296 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003297 rtc::scoped_ptr<webrtc::Call> call(
3298 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003299 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3300 call.get());
3301 cricket::AudioRecvParameters parameters;
3302 parameters.codecs = engine.codecs();
3303 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003304}