blob: 1fe9fc1ab6001f3bbbd1ff16b2b1544c1a4e9b7c [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2008 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00003 *
kjellander1afca732016-02-07 20:46:45 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org79047f92014-03-06 23:46:59 +00009 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000010
kwiberg686a8ef2016-02-26 03:00:35 -080011#include <memory>
12
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010013#include "webrtc/pc/channel.h"
tfarina5237aaf2015-11-10 23:44:30 -080014#include "webrtc/base/arraysize.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000015#include "webrtc/base/byteorder.h"
16#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020017#include "webrtc/call.h"
stefanba4c0e42016-02-04 04:12:24 -080018#include "webrtc/p2p/base/faketransportcontroller.h"
19#include "webrtc/test/field_trial.h"
kjellandera96e2d72016-02-04 23:52:28 -080020#include "webrtc/media/base/fakemediaengine.h"
21#include "webrtc/media/base/fakenetworkinterface.h"
22#include "webrtc/media/base/fakertp.h"
kjellanderf4752772016-03-02 05:42:30 -080023#include "webrtc/media/base/mediaconstants.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010024#include "webrtc/media/engine/fakewebrtccall.h"
25#include "webrtc/media/engine/fakewebrtcvoiceengine.h"
26#include "webrtc/media/engine/webrtcvoiceengine.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000027
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000028using cricket::kRtpAudioLevelHeaderExtension;
29using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
30
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020031namespace {
32
33const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
34const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
35const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
36const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
37const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
38const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
39const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
40const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
41const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, 0,
42 1, 0);
solenberg85a04962015-10-27 03:35:21 -070043const uint32_t kSsrc1 = 0x99;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080044const uint32_t kSsrc2 = 2;
45const uint32_t kSsrc3 = 3;
solenberg85a04962015-10-27 03:35:21 -070046const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000047
48class FakeVoEWrapper : public cricket::VoEWrapper {
49 public:
50 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
51 : cricket::VoEWrapper(engine, // processing
52 engine, // base
53 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000054 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000055 engine, // network
56 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000057 engine) { // volume
58 }
59};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020060} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000061
deadbeef884f5852016-01-15 09:20:04 -080062class FakeAudioSink : public webrtc::AudioSinkInterface {
63 public:
64 void OnData(const Data& audio) override {}
65};
66
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080067class FakeAudioSource : public cricket::AudioSource {
68 void SetSink(Sink* sink) override {}
69};
70
henrike@webrtc.org28e20752013-07-10 00:45:36 +000071class WebRtcVoiceEngineTestFake : public testing::Test {
72 public:
stefanba4c0e42016-02-04 04:12:24 -080073 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
74
75 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
Fredrik Solenberg709ed672015-09-15 12:26:33 +020076 : call_(webrtc::Call::Config()),
solenbergbd138382015-11-20 16:08:07 -080077 engine_(new FakeVoEWrapper(&voe_)),
stefanba4c0e42016-02-04 04:12:24 -080078 channel_(nullptr),
79 override_field_trials_(field_trials) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +020080 send_parameters_.codecs.push_back(kPcmuCodec);
81 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082 }
solenberg1ac56142015-10-13 03:58:19 -070083 bool SetupEngine() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000084 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000085 return false;
86 }
nisse51542be2016-02-12 02:27:06 -080087 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
88 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +020089 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000090 }
solenberg1ac56142015-10-13 03:58:19 -070091 bool SetupEngineWithRecvStream() {
92 if (!SetupEngine()) {
93 return false;
94 }
95 return channel_->AddRecvStream(
96 cricket::StreamParams::CreateLegacy(kSsrc1));
97 }
98 bool SetupEngineWithSendStream() {
99 if (!SetupEngine()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000100 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000101 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800102 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
103 return false;
104 }
105 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000106 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000107 void SetupForMultiSendStream() {
solenberg1ac56142015-10-13 03:58:19 -0700108 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700109 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800110 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700111 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700112 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800113 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000114 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000115 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200116 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000117 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000118 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200119 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000120 delete channel_;
121 engine_.Terminate();
122 }
123
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100124 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
125 const auto* send_stream = call_.GetAudioSendStream(ssrc);
126 EXPECT_TRUE(send_stream);
127 return *send_stream;
128 }
129
deadbeef884f5852016-01-15 09:20:04 -0800130 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
131 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
132 EXPECT_TRUE(recv_stream);
133 return *recv_stream;
134 }
135
solenberg3a941542015-11-16 07:34:50 -0800136 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800137 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800138 }
139
solenberg7add0582015-11-20 09:59:34 -0800140 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800141 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800142 }
143
Peter Boström0c4e06b2015-10-07 12:23:21 +0200144 void TestInsertDtmf(uint32_t ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000145 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
nisse51542be2016-02-12 02:27:06 -0800146 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
147 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200148 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000149 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700150 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000151 // send stream.
152 EXPECT_TRUE(channel_->AddSendStream(
153 cricket::StreamParams::CreateLegacy(kSsrc1)));
154 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000155
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000156 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200157 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800158 channel_->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000159 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800160 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200161 send_parameters_.codecs.push_back(kTelephoneEventCodec);
162 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000163 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000164
165 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700166 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800167 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000168 EXPECT_TRUE(channel_->AddSendStream(
169 cricket::StreamParams::CreateLegacy(kSsrc1)));
170 }
171
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000172 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800173 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000174
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100175 // Test send.
176 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
177 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
178 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800179 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100180 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
181 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
182 EXPECT_EQ(2, telephone_event.event_code);
183 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000184 }
185
186 // Test that send bandwidth is set correctly.
187 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000188 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
189 // |expected_result| is the expected result from SetMaxSendBandwidth().
190 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000191 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000192 int max_bitrate,
193 bool expected_result,
194 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200195 cricket::AudioSendParameters parameters;
196 parameters.codecs.push_back(codec);
197 parameters.max_bandwidth_bps = max_bitrate;
198 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
199
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000200 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000201 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000202 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000203 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000204 }
205
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000206 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenberg0a617e22015-10-20 15:49:38 -0700207 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000208
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000209 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800210 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000211
212 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200213 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000214 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200215 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800216 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000217
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000218 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200219 send_parameters_.extensions.clear();
220 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800221 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000222
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000223 // Ensure extension is set properly.
224 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200225 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
226 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800227 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
228 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
229 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000230
solenberg7add0582015-11-20 09:59:34 -0800231 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000232 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700233 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800234 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
235 call_.GetAudioSendStream(kSsrc2));
236 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
237 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
238 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000239
240 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200241 send_parameters_.codecs.push_back(kPcmuCodec);
242 send_parameters_.extensions.clear();
243 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800244 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
245 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000246 }
247
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000248 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700249 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000250
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000251 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800252 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000253
254 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800255 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000256 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800257 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
258 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000259
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000260 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800261 recv_parameters_.extensions.clear();
262 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
263 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000264
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000265 // Ensure extension is set properly.
266 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800267 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
268 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
269 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
270 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
271 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000272
solenberg7add0582015-11-20 09:59:34 -0800273 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000274 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700275 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800276 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
277 call_.GetAudioReceiveStream(kSsrc2));
278 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
279 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
280 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000281
282 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800283 recv_parameters_.extensions.clear();
284 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
285 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
286 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000287 }
288
solenberg85a04962015-10-27 03:35:21 -0700289 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
290 webrtc::AudioSendStream::Stats stats;
291 stats.local_ssrc = 12;
292 stats.bytes_sent = 345;
293 stats.packets_sent = 678;
294 stats.packets_lost = 9012;
295 stats.fraction_lost = 34.56f;
296 stats.codec_name = "codec_name_send";
297 stats.ext_seqnum = 789;
298 stats.jitter_ms = 12;
299 stats.rtt_ms = 345;
300 stats.audio_level = 678;
301 stats.aec_quality_min = 9.01f;
302 stats.echo_delay_median_ms = 234;
303 stats.echo_delay_std_ms = 567;
304 stats.echo_return_loss = 890;
305 stats.echo_return_loss_enhancement = 1234;
306 stats.typing_noise_detected = true;
307 return stats;
308 }
309 void SetAudioSendStreamStats() {
310 for (auto* s : call_.GetAudioSendStreams()) {
311 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200312 }
solenberg85a04962015-10-27 03:35:21 -0700313 }
solenberg566ef242015-11-06 15:34:49 -0800314 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
315 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700316 const auto stats = GetAudioSendStreamStats();
317 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
318 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
319 EXPECT_EQ(info.packets_sent, stats.packets_sent);
320 EXPECT_EQ(info.packets_lost, stats.packets_lost);
321 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
322 EXPECT_EQ(info.codec_name, stats.codec_name);
323 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
324 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
325 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
326 EXPECT_EQ(info.audio_level, stats.audio_level);
327 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
328 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
329 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
330 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
331 EXPECT_EQ(info.echo_return_loss_enhancement,
332 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800333 EXPECT_EQ(info.typing_noise_detected,
334 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700335 }
336
337 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
338 webrtc::AudioReceiveStream::Stats stats;
339 stats.remote_ssrc = 123;
340 stats.bytes_rcvd = 456;
341 stats.packets_rcvd = 768;
342 stats.packets_lost = 101;
343 stats.fraction_lost = 23.45f;
344 stats.codec_name = "codec_name_recv";
345 stats.ext_seqnum = 678;
346 stats.jitter_ms = 901;
347 stats.jitter_buffer_ms = 234;
348 stats.jitter_buffer_preferred_ms = 567;
349 stats.delay_estimate_ms = 890;
350 stats.audio_level = 1234;
351 stats.expand_rate = 5.67f;
352 stats.speech_expand_rate = 8.90f;
353 stats.secondary_decoded_rate = 1.23f;
354 stats.accelerate_rate = 4.56f;
355 stats.preemptive_expand_rate = 7.89f;
356 stats.decoding_calls_to_silence_generator = 12;
357 stats.decoding_calls_to_neteq = 345;
358 stats.decoding_normal = 67890;
359 stats.decoding_plc = 1234;
360 stats.decoding_cng = 5678;
361 stats.decoding_plc_cng = 9012;
362 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200363 return stats;
364 }
365 void SetAudioReceiveStreamStats() {
366 for (auto* s : call_.GetAudioReceiveStreams()) {
367 s->SetStats(GetAudioReceiveStreamStats());
368 }
369 }
370 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700371 const auto stats = GetAudioReceiveStreamStats();
372 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
373 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
374 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
375 EXPECT_EQ(info.packets_lost, stats.packets_lost);
376 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
377 EXPECT_EQ(info.codec_name, stats.codec_name);
378 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
379 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
380 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200381 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700382 stats.jitter_buffer_preferred_ms);
383 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
384 EXPECT_EQ(info.audio_level, stats.audio_level);
385 EXPECT_EQ(info.expand_rate, stats.expand_rate);
386 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
387 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
388 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
389 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200390 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700391 stats.decoding_calls_to_silence_generator);
392 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
393 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
394 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
395 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
396 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
397 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200398 }
399
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000400 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200401 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000402 cricket::FakeWebRtcVoiceEngine voe_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000403 cricket::WebRtcVoiceEngine engine_;
404 cricket::VoiceMediaChannel* channel_;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200405 cricket::AudioSendParameters send_parameters_;
406 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800407 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800408
409 private:
410 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000411};
412
413// Tests that our stub library "works".
414TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
415 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000416 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000417 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000418 engine_.Terminate();
419 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000420}
421
422// Tests that we can create and destroy a channel.
423TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000424 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
nisse51542be2016-02-12 02:27:06 -0800425 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
426 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200427 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000428}
429
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000430// Tests that the list of supported codecs is created properly and ordered
431// correctly
432TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
433 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
434 ASSERT_FALSE(codecs.empty());
435 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
436 EXPECT_EQ(48000, codecs[0].clockrate);
437 EXPECT_EQ(2, codecs[0].channels);
438 EXPECT_EQ(64000, codecs[0].bitrate);
439 int pref = codecs[0].preference;
440 for (size_t i = 1; i < codecs.size(); ++i) {
441 EXPECT_GT(pref, codecs[i].preference);
442 pref = codecs[i].preference;
443 }
444}
445
stefanba4c0e42016-02-04 04:12:24 -0800446TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
447 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
448 bool opus_found = false;
449 for (cricket::AudioCodec codec : codecs) {
450 if (codec.name == "opus") {
451 EXPECT_TRUE(HasTransportCc(codec));
452 opus_found = true;
453 }
454 }
455 EXPECT_TRUE(opus_found);
456}
457
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000458// Tests that we can find codecs by name or id, and that we interpret the
459// clockrate and bitrate fields properly.
460TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
461 cricket::AudioCodec codec;
462 webrtc::CodecInst codec_inst;
463 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800464 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000465 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800466 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000467 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800468 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
469 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000470 // Find ISAC with a different payload id.
471 codec = kIsacCodec;
472 codec.id = 127;
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 // Find PCMU with a 0 clockrate.
476 codec = kPcmuCodec;
477 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800478 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000479 EXPECT_EQ(codec.id, codec_inst.pltype);
480 EXPECT_EQ(8000, codec_inst.plfreq);
481 // Find PCMU with a 0 bitrate.
482 codec = kPcmuCodec;
483 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800484 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000485 EXPECT_EQ(codec.id, codec_inst.pltype);
486 EXPECT_EQ(64000, codec_inst.rate);
487 // Find ISAC with an explicit bitrate.
488 codec = kIsacCodec;
489 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800490 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000491 EXPECT_EQ(codec.id, codec_inst.pltype);
492 EXPECT_EQ(32000, codec_inst.rate);
493}
494
495// Test that we set our inbound codecs properly, including changing PT.
496TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
497 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200498 cricket::AudioRecvParameters parameters;
499 parameters.codecs.push_back(kIsacCodec);
500 parameters.codecs.push_back(kPcmuCodec);
501 parameters.codecs.push_back(kTelephoneEventCodec);
502 parameters.codecs[0].id = 106; // collide with existing telephone-event
503 parameters.codecs[2].id = 126;
504 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700505 EXPECT_TRUE(channel_->AddRecvStream(
506 cricket::StreamParams::CreateLegacy(kSsrc1)));
507 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000508 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800509 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000510 gcodec.plfreq = 16000;
511 gcodec.channels = 1;
512 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
513 EXPECT_EQ(106, gcodec.pltype);
514 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800515 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000516 gcodec.plfreq = 8000;
517 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
518 EXPECT_EQ(126, gcodec.pltype);
519 EXPECT_STREQ("telephone-event", gcodec.plname);
520}
521
522// Test that we fail to set an unknown inbound codec.
523TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
524 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200525 cricket::AudioRecvParameters parameters;
526 parameters.codecs.push_back(kIsacCodec);
527 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
528 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000529}
530
531// Test that we fail if we have duplicate types in the inbound list.
532TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
533 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200534 cricket::AudioRecvParameters parameters;
535 parameters.codecs.push_back(kIsacCodec);
536 parameters.codecs.push_back(kCn16000Codec);
537 parameters.codecs[1].id = kIsacCodec.id;
538 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000539}
540
541// Test that we can decode OPUS without stereo parameters.
542TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
543 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200544 cricket::AudioRecvParameters parameters;
545 parameters.codecs.push_back(kIsacCodec);
546 parameters.codecs.push_back(kPcmuCodec);
547 parameters.codecs.push_back(kOpusCodec);
548 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000549 EXPECT_TRUE(channel_->AddRecvStream(
550 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700551 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000552 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800553 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000554 // Even without stereo parameters, recv codecs still specify channels = 2.
555 EXPECT_EQ(2, opus.channels);
556 EXPECT_EQ(111, opus.pltype);
557 EXPECT_STREQ("opus", opus.plname);
558 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700559 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000560 EXPECT_EQ(111, opus.pltype);
561}
562
563// Test that we can decode OPUS with stereo = 0.
564TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
565 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200566 cricket::AudioRecvParameters parameters;
567 parameters.codecs.push_back(kIsacCodec);
568 parameters.codecs.push_back(kPcmuCodec);
569 parameters.codecs.push_back(kOpusCodec);
570 parameters.codecs[2].params["stereo"] = "0";
571 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000572 EXPECT_TRUE(channel_->AddRecvStream(
573 cricket::StreamParams::CreateLegacy(kSsrc1)));
574 int channel_num2 = voe_.GetLastChannel();
575 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800576 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000577 // Even when stereo is off, recv codecs still specify channels = 2.
578 EXPECT_EQ(2, opus.channels);
579 EXPECT_EQ(111, opus.pltype);
580 EXPECT_STREQ("opus", opus.plname);
581 opus.pltype = 0;
582 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
583 EXPECT_EQ(111, opus.pltype);
584}
585
586// Test that we can decode OPUS with stereo = 1.
587TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
588 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200589 cricket::AudioRecvParameters parameters;
590 parameters.codecs.push_back(kIsacCodec);
591 parameters.codecs.push_back(kPcmuCodec);
592 parameters.codecs.push_back(kOpusCodec);
593 parameters.codecs[2].params["stereo"] = "1";
594 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000595 EXPECT_TRUE(channel_->AddRecvStream(
596 cricket::StreamParams::CreateLegacy(kSsrc1)));
597 int channel_num2 = voe_.GetLastChannel();
598 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800599 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000600 EXPECT_EQ(2, opus.channels);
601 EXPECT_EQ(111, opus.pltype);
602 EXPECT_STREQ("opus", opus.plname);
603 opus.pltype = 0;
604 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
605 EXPECT_EQ(111, opus.pltype);
606}
607
608// Test that changes to recv codecs are applied to all streams.
609TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
610 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200611 cricket::AudioRecvParameters parameters;
612 parameters.codecs.push_back(kIsacCodec);
613 parameters.codecs.push_back(kPcmuCodec);
614 parameters.codecs.push_back(kTelephoneEventCodec);
615 parameters.codecs[0].id = 106; // collide with existing telephone-event
616 parameters.codecs[2].id = 126;
617 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000618 EXPECT_TRUE(channel_->AddRecvStream(
619 cricket::StreamParams::CreateLegacy(kSsrc1)));
620 int channel_num2 = voe_.GetLastChannel();
621 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800622 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000623 gcodec.plfreq = 16000;
624 gcodec.channels = 1;
625 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
626 EXPECT_EQ(106, gcodec.pltype);
627 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800628 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000629 gcodec.plfreq = 8000;
630 gcodec.channels = 1;
631 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
632 EXPECT_EQ(126, gcodec.pltype);
633 EXPECT_STREQ("telephone-event", gcodec.plname);
634}
635
636TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenberg1ac56142015-10-13 03:58:19 -0700637 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200638 cricket::AudioRecvParameters parameters;
639 parameters.codecs.push_back(kIsacCodec);
640 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200641 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000642
643 int channel_num2 = voe_.GetLastChannel();
644 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800645 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000646 gcodec.plfreq = 16000;
647 gcodec.channels = 1;
648 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
649 EXPECT_EQ(106, gcodec.pltype);
650 EXPECT_STREQ("ISAC", gcodec.plname);
651}
652
653// Test that we can apply the same set of codecs again while playing.
654TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700655 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200656 cricket::AudioRecvParameters parameters;
657 parameters.codecs.push_back(kIsacCodec);
658 parameters.codecs.push_back(kCn16000Codec);
659 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000660 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200661 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662
663 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200664 parameters.codecs[0].id = 127;
665 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
666 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000667 EXPECT_TRUE(voe_.GetPlayout(channel_num));
668}
669
670// Test that we can add a codec while playing.
671TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700672 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200673 cricket::AudioRecvParameters parameters;
674 parameters.codecs.push_back(kIsacCodec);
675 parameters.codecs.push_back(kCn16000Codec);
676 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000677 EXPECT_TRUE(channel_->SetPlayout(true));
678
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200679 parameters.codecs.push_back(kOpusCodec);
680 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
681 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000682 EXPECT_TRUE(voe_.GetPlayout(channel_num));
683 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800684 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000685 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
686}
687
688TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenberg1ac56142015-10-13 03:58:19 -0700689 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000690
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000691 // Test that when autobw is enabled, bitrate is kept as the default
692 // value. autobw is enabled for the following tests because the target
693 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000694
695 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000696 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000697
698 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000699 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000700
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000701 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000702 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000703}
704
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000705TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700706 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000707
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000708 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000709
710 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000711 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
712 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000713
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000714 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000715 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
716 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000717}
718
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000719TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700720 EXPECT_TRUE(SetupEngineWithSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000721
722 // Test that we can only set a maximum bitrate for a fixed-rate codec
723 // if it's bigger than the fixed rate.
724
725 // PCMU, fixed bitrate == 64000.
726 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
727 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
728 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
729 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
730 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
731 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
732 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
733}
734
735TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -0700736 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200737 const int kDesiredBitrate = 128000;
738 cricket::AudioSendParameters parameters;
739 parameters.codecs = engine_.codecs();
740 parameters.max_bandwidth_bps = kDesiredBitrate;
741 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000742
743 EXPECT_TRUE(channel_->AddSendStream(
744 cricket::StreamParams::CreateLegacy(kSsrc1)));
745
746 int channel_num = voe_.GetLastChannel();
747 webrtc::CodecInst codec;
748 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200749 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000750}
751
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000752// Test that bitrate cannot be set for CBR codecs.
753// Bitrate is ignored if it is higher than the fixed bitrate.
754// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000755TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenberg1ac56142015-10-13 03:58:19 -0700756 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000757
758 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200759 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
760 int channel_num = voe_.GetLastChannel();
761 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000762 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
763 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200764
765 send_parameters_.max_bandwidth_bps = 128000;
766 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000767 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
768 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200769
770 send_parameters_.max_bandwidth_bps = 128;
771 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000772 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
773 EXPECT_EQ(64000, codec.rate);
774}
775
776// Test that we apply codecs properly.
777TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenberg1ac56142015-10-13 03:58:19 -0700778 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200779 cricket::AudioSendParameters parameters;
780 parameters.codecs.push_back(kIsacCodec);
781 parameters.codecs.push_back(kPcmuCodec);
782 parameters.codecs.push_back(kRedCodec);
783 parameters.codecs[0].id = 96;
784 parameters.codecs[0].bitrate = 48000;
785 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000786 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200787 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000788 webrtc::CodecInst gcodec;
789 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
790 EXPECT_EQ(96, gcodec.pltype);
791 EXPECT_EQ(48000, gcodec.rate);
792 EXPECT_STREQ("ISAC", gcodec.plname);
793 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000794 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000795 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
796 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100797 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000798}
799
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000800// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
801// to apply.
802TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenberg1ac56142015-10-13 03:58:19 -0700803 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200804 cricket::AudioSendParameters parameters;
805 parameters.codecs.push_back(kIsacCodec);
806 parameters.codecs.push_back(kPcmuCodec);
807 parameters.codecs.push_back(kRedCodec);
808 parameters.codecs[0].id = 96;
809 parameters.codecs[0].bitrate = 48000;
810 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000811 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
812 // Calling SetSendCodec again with same codec which is already set.
813 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200814 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000815 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
816}
817
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000818// Verify that G722 is set with 16000 samples per second to WebRTC.
819TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenberg1ac56142015-10-13 03:58:19 -0700820 EXPECT_TRUE(SetupEngineWithSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000821 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200822 cricket::AudioSendParameters parameters;
823 parameters.codecs.push_back(kG722CodecSdp);
824 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000825 webrtc::CodecInst gcodec;
826 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
827 EXPECT_STREQ("G722", gcodec.plname);
828 EXPECT_EQ(1, gcodec.channels);
829 EXPECT_EQ(16000, gcodec.plfreq);
830}
831
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000832// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000833TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenberg1ac56142015-10-13 03:58:19 -0700834 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200835 cricket::AudioSendParameters parameters;
836 parameters.codecs.push_back(kOpusCodec);
837 parameters.codecs[0].bitrate = 0;
838 parameters.codecs[0].clockrate = 50000;
839 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000840}
841
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000842// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000843TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700844 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200845 cricket::AudioSendParameters parameters;
846 parameters.codecs.push_back(kOpusCodec);
847 parameters.codecs[0].bitrate = 0;
848 parameters.codecs[0].channels = 0;
849 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000850}
851
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000852// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000853TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
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 = 0;
859 parameters.codecs[0].params["stereo"] = "1";
860 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000861}
862
863// Test that if channel is 1 for opus and there's no stereo, we fail.
864TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700865 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200866 cricket::AudioSendParameters parameters;
867 parameters.codecs.push_back(kOpusCodec);
868 parameters.codecs[0].bitrate = 0;
869 parameters.codecs[0].channels = 1;
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=0, we fail.
874TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
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"] = "0";
881 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000882}
883
884// Test that if channel is 1 for opus and stereo=1, we fail.
885TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700886 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200887 cricket::AudioSendParameters parameters;
888 parameters.codecs.push_back(kOpusCodec);
889 parameters.codecs[0].bitrate = 0;
890 parameters.codecs[0].channels = 1;
891 parameters.codecs[0].params["stereo"] = "1";
892 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000893}
894
895// Test that with bitrate=0 and no stereo,
896// channels and bitrate are 1 and 32000.
897TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700898 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000899 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200900 cricket::AudioSendParameters parameters;
901 parameters.codecs.push_back(kOpusCodec);
902 parameters.codecs[0].bitrate = 0;
903 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000904 webrtc::CodecInst gcodec;
905 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
906 EXPECT_STREQ("opus", gcodec.plname);
907 EXPECT_EQ(1, gcodec.channels);
908 EXPECT_EQ(32000, gcodec.rate);
909}
910
911// Test that with bitrate=0 and stereo=0,
912// channels and bitrate are 1 and 32000.
913TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700914 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000915 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200916 cricket::AudioSendParameters parameters;
917 parameters.codecs.push_back(kOpusCodec);
918 parameters.codecs[0].bitrate = 0;
919 parameters.codecs[0].params["stereo"] = "0";
920 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000921 webrtc::CodecInst gcodec;
922 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
923 EXPECT_STREQ("opus", gcodec.plname);
924 EXPECT_EQ(1, gcodec.channels);
925 EXPECT_EQ(32000, gcodec.rate);
926}
927
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000928// Test that with bitrate=invalid and stereo=0,
929// channels and bitrate are 1 and 32000.
930TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700931 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000932 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200933 cricket::AudioSendParameters parameters;
934 parameters.codecs.push_back(kOpusCodec);
935 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000936 webrtc::CodecInst gcodec;
937
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000938 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200939 parameters.codecs[0].bitrate = 5999;
940 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000941 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
942 EXPECT_STREQ("opus", gcodec.plname);
943 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000944 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000945
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200946 parameters.codecs[0].bitrate = 510001;
947 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000948 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
949 EXPECT_STREQ("opus", gcodec.plname);
950 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000951 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000952}
953
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000954// Test that with bitrate=0 and stereo=1,
955// channels and bitrate are 2 and 64000.
956TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700957 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000958 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200959 cricket::AudioSendParameters parameters;
960 parameters.codecs.push_back(kOpusCodec);
961 parameters.codecs[0].bitrate = 0;
962 parameters.codecs[0].params["stereo"] = "1";
963 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000964 webrtc::CodecInst gcodec;
965 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
966 EXPECT_STREQ("opus", gcodec.plname);
967 EXPECT_EQ(2, gcodec.channels);
968 EXPECT_EQ(64000, gcodec.rate);
969}
970
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000971// Test that with bitrate=invalid and stereo=1,
972// channels and bitrate are 2 and 64000.
973TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700974 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000975 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200976 cricket::AudioSendParameters parameters;
977 parameters.codecs.push_back(kOpusCodec);
978 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000979 webrtc::CodecInst gcodec;
980
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000981 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200982 parameters.codecs[0].bitrate = 5999;
983 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000984 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
985 EXPECT_STREQ("opus", gcodec.plname);
986 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000987 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000988
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200989 parameters.codecs[0].bitrate = 510001;
990 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000991 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
992 EXPECT_STREQ("opus", gcodec.plname);
993 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000994 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000995}
996
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000997// Test that with bitrate=N and stereo unset,
998// channels and bitrate are 1 and N.
999TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001000 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001001 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001002 cricket::AudioSendParameters parameters;
1003 parameters.codecs.push_back(kOpusCodec);
1004 parameters.codecs[0].bitrate = 96000;
1005 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001006 webrtc::CodecInst gcodec;
1007 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1008 EXPECT_EQ(111, gcodec.pltype);
1009 EXPECT_EQ(96000, gcodec.rate);
1010 EXPECT_STREQ("opus", gcodec.plname);
1011 EXPECT_EQ(1, gcodec.channels);
1012 EXPECT_EQ(48000, gcodec.plfreq);
1013}
1014
1015// Test that with bitrate=N and stereo=0,
1016// channels and bitrate are 1 and N.
1017TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001018 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001019 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001020 cricket::AudioSendParameters parameters;
1021 parameters.codecs.push_back(kOpusCodec);
1022 parameters.codecs[0].bitrate = 30000;
1023 parameters.codecs[0].params["stereo"] = "0";
1024 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001025 webrtc::CodecInst gcodec;
1026 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1027 EXPECT_EQ(1, gcodec.channels);
1028 EXPECT_EQ(30000, gcodec.rate);
1029 EXPECT_STREQ("opus", gcodec.plname);
1030}
1031
1032// Test that with bitrate=N and without any parameters,
1033// channels and bitrate are 1 and N.
1034TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenberg1ac56142015-10-13 03:58:19 -07001035 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001036 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001037 cricket::AudioSendParameters parameters;
1038 parameters.codecs.push_back(kOpusCodec);
1039 parameters.codecs[0].bitrate = 30000;
1040 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001041 webrtc::CodecInst gcodec;
1042 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1043 EXPECT_EQ(1, gcodec.channels);
1044 EXPECT_EQ(30000, gcodec.rate);
1045 EXPECT_STREQ("opus", gcodec.plname);
1046}
1047
1048// Test that with bitrate=N and stereo=1,
1049// channels and bitrate are 2 and N.
1050TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001051 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001052 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001053 cricket::AudioSendParameters parameters;
1054 parameters.codecs.push_back(kOpusCodec);
1055 parameters.codecs[0].bitrate = 30000;
1056 parameters.codecs[0].params["stereo"] = "1";
1057 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001058 webrtc::CodecInst gcodec;
1059 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1060 EXPECT_EQ(2, gcodec.channels);
1061 EXPECT_EQ(30000, gcodec.rate);
1062 EXPECT_STREQ("opus", gcodec.plname);
1063}
1064
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001065// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1066// Also test that the "maxaveragebitrate" can't be set to values outside the
1067// range of 6000 and 510000
1068TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001069 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001070 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001071 cricket::AudioSendParameters parameters;
1072 parameters.codecs.push_back(kOpusCodec);
1073 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001074 webrtc::CodecInst gcodec;
1075
1076 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001077 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1078 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001079 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001080 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001081
1082 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001083 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1084 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001085 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001086 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001087
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001088 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1089 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001090 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1091 EXPECT_EQ(200000, gcodec.rate);
1092}
1093
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001094// Test that we can enable NACK with opus as caller.
1095TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001096 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001097 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001098 cricket::AudioSendParameters parameters;
1099 parameters.codecs.push_back(kOpusCodec);
1100 parameters.codecs[0].AddFeedbackParam(
1101 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1102 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001103 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001104 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001105 EXPECT_TRUE(voe_.GetNACK(channel_num));
1106}
1107
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001108// Test that we can enable NACK with opus as callee.
1109TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenberg0a617e22015-10-20 15:49:38 -07001110 EXPECT_TRUE(SetupEngineWithRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001111 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001112 cricket::AudioSendParameters parameters;
1113 parameters.codecs.push_back(kOpusCodec);
1114 parameters.codecs[0].AddFeedbackParam(
1115 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1116 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001117 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001118 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001119 EXPECT_FALSE(voe_.GetNACK(channel_num));
1120
1121 EXPECT_TRUE(channel_->AddSendStream(
1122 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001123 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001124}
1125
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001126// Test that we can enable NACK on receive streams.
1127TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001128 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001129 int channel_num1 = voe_.GetLastChannel();
1130 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1131 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001132 cricket::AudioSendParameters parameters;
1133 parameters.codecs.push_back(kOpusCodec);
1134 parameters.codecs[0].AddFeedbackParam(
1135 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1136 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001137 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1138 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001139 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001140 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1141 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1142}
1143
1144// Test that we can disable NACK.
1145TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001146 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001147 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001148 cricket::AudioSendParameters parameters;
1149 parameters.codecs.push_back(kOpusCodec);
1150 parameters.codecs[0].AddFeedbackParam(
1151 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1152 cricket::kParamValueEmpty));
1153 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001154 EXPECT_TRUE(voe_.GetNACK(channel_num));
1155
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001156 parameters.codecs.clear();
1157 parameters.codecs.push_back(kOpusCodec);
1158 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001159 EXPECT_FALSE(voe_.GetNACK(channel_num));
1160}
1161
1162// Test that we can disable NACK on receive streams.
1163TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001164 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001165 int channel_num1 = voe_.GetLastChannel();
1166 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1167 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001168 cricket::AudioSendParameters parameters;
1169 parameters.codecs.push_back(kOpusCodec);
1170 parameters.codecs[0].AddFeedbackParam(
1171 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1172 cricket::kParamValueEmpty));
1173 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001174 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1175 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1176
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001177 parameters.codecs.clear();
1178 parameters.codecs.push_back(kOpusCodec);
1179 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001180 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1181 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1182}
1183
1184// Test that NACK is enabled on a new receive stream.
1185TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001186 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001187 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001188 cricket::AudioSendParameters parameters;
1189 parameters.codecs.push_back(kIsacCodec);
1190 parameters.codecs.push_back(kCn16000Codec);
1191 parameters.codecs[0].AddFeedbackParam(
1192 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1193 cricket::kParamValueEmpty));
1194 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001195 EXPECT_TRUE(voe_.GetNACK(channel_num));
1196
1197 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1198 channel_num = voe_.GetLastChannel();
1199 EXPECT_TRUE(voe_.GetNACK(channel_num));
1200 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1201 channel_num = voe_.GetLastChannel();
1202 EXPECT_TRUE(voe_.GetNACK(channel_num));
1203}
1204
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001205// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001206TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenberg1ac56142015-10-13 03:58:19 -07001207 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001208 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001209 cricket::AudioSendParameters parameters;
1210 parameters.codecs.push_back(kOpusCodec);
1211 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001212 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1213}
1214
1215// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001216TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001217 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001218 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001219 cricket::AudioSendParameters parameters;
1220 parameters.codecs.push_back(kOpusCodec);
1221 parameters.codecs[0].bitrate = 0;
1222 parameters.codecs[0].params["useinbandfec"] = "0";
1223 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001224 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1225 webrtc::CodecInst gcodec;
1226 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1227 EXPECT_STREQ("opus", gcodec.plname);
1228 EXPECT_EQ(1, gcodec.channels);
1229 EXPECT_EQ(32000, gcodec.rate);
1230}
1231
1232// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001233TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001234 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001235 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001236 cricket::AudioSendParameters parameters;
1237 parameters.codecs.push_back(kOpusCodec);
1238 parameters.codecs[0].bitrate = 0;
1239 parameters.codecs[0].params["useinbandfec"] = "1";
1240 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001241 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1242 webrtc::CodecInst gcodec;
1243 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1244 EXPECT_STREQ("opus", gcodec.plname);
1245 EXPECT_EQ(1, gcodec.channels);
1246 EXPECT_EQ(32000, gcodec.rate);
1247}
1248
1249// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001250TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001251 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001252 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001253 cricket::AudioSendParameters parameters;
1254 parameters.codecs.push_back(kOpusCodec);
1255 parameters.codecs[0].bitrate = 0;
1256 parameters.codecs[0].params["stereo"] = "1";
1257 parameters.codecs[0].params["useinbandfec"] = "1";
1258 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001259 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1260 webrtc::CodecInst gcodec;
1261 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1262 EXPECT_STREQ("opus", gcodec.plname);
1263 EXPECT_EQ(2, gcodec.channels);
1264 EXPECT_EQ(64000, gcodec.rate);
1265}
1266
1267// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001268TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001269 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001270 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001271 cricket::AudioSendParameters parameters;
1272 parameters.codecs.push_back(kIsacCodec);
1273 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001274 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1275}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001276
1277// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1278TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001279 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001280 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001281 cricket::AudioSendParameters parameters;
1282 parameters.codecs.push_back(kIsacCodec);
1283 parameters.codecs[0].params["useinbandfec"] = "1";
1284 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001285 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1286}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001287
1288// Test that Opus FEC status can be changed.
1289TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenberg1ac56142015-10-13 03:58:19 -07001290 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001291 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001292 cricket::AudioSendParameters parameters;
1293 parameters.codecs.push_back(kOpusCodec);
1294 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001295 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001296 parameters.codecs[0].params["useinbandfec"] = "1";
1297 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001298 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1299}
1300
stefanba4c0e42016-02-04 04:12:24 -08001301TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
1302 EXPECT_TRUE(SetupEngine());
1303 cricket::AudioSendParameters send_parameters;
1304 send_parameters.codecs.push_back(kOpusCodec);
1305 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1306 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1307
1308 cricket::AudioRecvParameters recv_parameters;
1309 recv_parameters.codecs.push_back(kIsacCodec);
1310 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1311 EXPECT_TRUE(
1312 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1313 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1314 EXPECT_FALSE(
1315 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1316
1317 send_parameters.codecs = engine_.codecs();
1318 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1319 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1320 EXPECT_TRUE(
1321 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1322}
1323
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001324// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1325TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenberg1ac56142015-10-13 03:58:19 -07001326 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001327 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001328 cricket::AudioSendParameters parameters;
1329 parameters.codecs.push_back(kOpusCodec);
1330 parameters.codecs[0].bitrate = 0;
1331 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1332 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001333 EXPECT_EQ(cricket::kOpusBandwidthNb,
1334 voe_.GetMaxEncodingBandwidth(channel_num));
1335 webrtc::CodecInst gcodec;
1336 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1337 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001338
1339 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001340 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1341 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001342 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1343 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001344}
1345
1346// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1347TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenberg1ac56142015-10-13 03:58:19 -07001348 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001349 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001350 cricket::AudioSendParameters parameters;
1351 parameters.codecs.push_back(kOpusCodec);
1352 parameters.codecs[0].bitrate = 0;
1353 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1354 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001355 EXPECT_EQ(cricket::kOpusBandwidthMb,
1356 voe_.GetMaxEncodingBandwidth(channel_num));
1357 webrtc::CodecInst gcodec;
1358 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1359 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001360
1361 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001362 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1363 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001364 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1365 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001366}
1367
1368// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1369TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenberg1ac56142015-10-13 03:58:19 -07001370 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001371 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001372 cricket::AudioSendParameters parameters;
1373 parameters.codecs.push_back(kOpusCodec);
1374 parameters.codecs[0].bitrate = 0;
1375 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1376 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001377 EXPECT_EQ(cricket::kOpusBandwidthWb,
1378 voe_.GetMaxEncodingBandwidth(channel_num));
1379 webrtc::CodecInst gcodec;
1380 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1381 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001382
1383 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001384 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1385 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001386 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1387 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001388}
1389
1390// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1391TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenberg1ac56142015-10-13 03:58:19 -07001392 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001393 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001394 cricket::AudioSendParameters parameters;
1395 parameters.codecs.push_back(kOpusCodec);
1396 parameters.codecs[0].bitrate = 0;
1397 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1398 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001399 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1400 voe_.GetMaxEncodingBandwidth(channel_num));
1401 webrtc::CodecInst gcodec;
1402 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1403 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001404
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001405 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001406 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1407 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001408 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1409 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001410}
1411
1412// Test 24000 < maxplaybackrate triggers Opus full band mode.
1413TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenberg1ac56142015-10-13 03:58:19 -07001414 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001415 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001416 cricket::AudioSendParameters parameters;
1417 parameters.codecs.push_back(kOpusCodec);
1418 parameters.codecs[0].bitrate = 0;
1419 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1420 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001421 EXPECT_EQ(cricket::kOpusBandwidthFb,
1422 voe_.GetMaxEncodingBandwidth(channel_num));
1423 webrtc::CodecInst gcodec;
1424 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1425 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001426
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001427 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001428 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1429 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001430 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1431 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001432}
1433
1434// Test Opus that without maxplaybackrate, default playback rate is used.
1435TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001436 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001437 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001438 cricket::AudioSendParameters parameters;
1439 parameters.codecs.push_back(kOpusCodec);
1440 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001441 EXPECT_EQ(cricket::kOpusBandwidthFb,
1442 voe_.GetMaxEncodingBandwidth(channel_num));
1443}
1444
1445// Test the with non-Opus, maxplaybackrate has no effect.
1446TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001447 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001448 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001449 cricket::AudioSendParameters parameters;
1450 parameters.codecs.push_back(kIsacCodec);
1451 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1452 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001453 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1454}
1455
1456// Test maxplaybackrate can be set on two streams.
1457TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001458 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001459 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001460 cricket::AudioSendParameters parameters;
1461 parameters.codecs.push_back(kOpusCodec);
1462 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001463 // Default bandwidth is 24000.
1464 EXPECT_EQ(cricket::kOpusBandwidthFb,
1465 voe_.GetMaxEncodingBandwidth(channel_num));
1466
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001467 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001468
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001469 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001470 EXPECT_EQ(cricket::kOpusBandwidthNb,
1471 voe_.GetMaxEncodingBandwidth(channel_num));
1472
1473 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1474 channel_num = voe_.GetLastChannel();
1475 EXPECT_EQ(cricket::kOpusBandwidthNb,
1476 voe_.GetMaxEncodingBandwidth(channel_num));
1477}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001478
Minyue Li7100dcd2015-03-27 05:05:59 +01001479// Test that with usedtx=0, Opus DTX is off.
1480TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001481 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001482 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001483 cricket::AudioSendParameters parameters;
1484 parameters.codecs.push_back(kOpusCodec);
1485 parameters.codecs[0].params["usedtx"] = "0";
1486 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001487 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1488}
1489
1490// Test that with usedtx=1, Opus DTX is on.
1491TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001492 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001493 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001494 cricket::AudioSendParameters parameters;
1495 parameters.codecs.push_back(kOpusCodec);
1496 parameters.codecs[0].params["usedtx"] = "1";
1497 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001498 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1499 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1500}
1501
1502// Test that usedtx=1 works with stereo Opus.
1503TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001504 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001505 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001506 cricket::AudioSendParameters parameters;
1507 parameters.codecs.push_back(kOpusCodec);
1508 parameters.codecs[0].params["usedtx"] = "1";
1509 parameters.codecs[0].params["stereo"] = "1";
1510 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001511 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1512 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1513}
1514
1515// Test that usedtx=1 does not work with non Opus.
1516TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001517 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001518 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001519 cricket::AudioSendParameters parameters;
1520 parameters.codecs.push_back(kIsacCodec);
1521 parameters.codecs[0].params["usedtx"] = "1";
1522 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001523 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1524}
1525
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001526// Test that we can switch back and forth between Opus and ISAC with CN.
1527TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenberg1ac56142015-10-13 03:58:19 -07001528 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001529 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001530 cricket::AudioSendParameters opus_parameters;
1531 opus_parameters.codecs.push_back(kOpusCodec);
1532 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001533 webrtc::CodecInst gcodec;
1534 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001535 EXPECT_EQ(111, gcodec.pltype);
1536 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001537
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001538 cricket::AudioSendParameters isac_parameters;
1539 isac_parameters.codecs.push_back(kIsacCodec);
1540 isac_parameters.codecs.push_back(kCn16000Codec);
1541 isac_parameters.codecs.push_back(kOpusCodec);
1542 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001543 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1544 EXPECT_EQ(103, gcodec.pltype);
1545 EXPECT_STREQ("ISAC", gcodec.plname);
1546
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001547 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001548 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001549 EXPECT_EQ(111, gcodec.pltype);
1550 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001551}
1552
1553// Test that we handle various ways of specifying bitrate.
1554TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001555 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001556 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001557 cricket::AudioSendParameters parameters;
1558 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1559 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001560 webrtc::CodecInst gcodec;
1561 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1562 EXPECT_EQ(103, gcodec.pltype);
1563 EXPECT_STREQ("ISAC", gcodec.plname);
1564 EXPECT_EQ(32000, gcodec.rate);
1565
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001566 parameters.codecs[0].bitrate = 0; // bitrate == default
1567 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001568 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1569 EXPECT_EQ(103, gcodec.pltype);
1570 EXPECT_STREQ("ISAC", gcodec.plname);
1571 EXPECT_EQ(-1, gcodec.rate);
1572
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001573 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1574 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001575 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1576 EXPECT_EQ(103, gcodec.pltype);
1577 EXPECT_STREQ("ISAC", gcodec.plname);
1578 EXPECT_EQ(28000, gcodec.rate);
1579
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001580 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1581 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001582 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1583 EXPECT_EQ(0, gcodec.pltype);
1584 EXPECT_STREQ("PCMU", gcodec.plname);
1585 EXPECT_EQ(64000, gcodec.rate);
1586
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001587 parameters.codecs[0].bitrate = 0; // bitrate == default
1588 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001589 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1590 EXPECT_EQ(0, gcodec.pltype);
1591 EXPECT_STREQ("PCMU", gcodec.plname);
1592 EXPECT_EQ(64000, gcodec.rate);
1593
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001594 parameters.codecs[0] = kOpusCodec;
1595 parameters.codecs[0].bitrate = 0; // bitrate == default
1596 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001597 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1598 EXPECT_EQ(111, gcodec.pltype);
1599 EXPECT_STREQ("opus", gcodec.plname);
1600 EXPECT_EQ(32000, gcodec.rate);
1601}
1602
Brave Yao5225dd82015-03-26 07:39:19 +08001603// Test that we could set packet size specified in kCodecParamPTime.
1604TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenberg1ac56142015-10-13 03:58:19 -07001605 EXPECT_TRUE(SetupEngineWithSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001606 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001607 cricket::AudioSendParameters parameters;
1608 parameters.codecs.push_back(kOpusCodec);
1609 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1610 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001611 webrtc::CodecInst gcodec;
1612 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1613 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1614
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001615 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1616 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001617 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1618 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1619
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001620 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1621 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001622 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1623 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1624
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001625 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1626 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1627 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001628 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1629 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1630
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001631 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1632 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1633 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001634 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1635 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1636}
1637
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001638// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001639TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenberg1ac56142015-10-13 03:58:19 -07001640 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001641 cricket::AudioSendParameters parameters;
1642 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001643}
1644
1645// Test that we can set send codecs even with telephone-event codec as the first
1646// one on the list.
1647TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001648 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001649 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001650 cricket::AudioSendParameters parameters;
1651 parameters.codecs.push_back(kTelephoneEventCodec);
1652 parameters.codecs.push_back(kIsacCodec);
1653 parameters.codecs.push_back(kPcmuCodec);
1654 parameters.codecs[0].id = 98; // DTMF
1655 parameters.codecs[1].id = 96;
1656 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001657 webrtc::CodecInst gcodec;
1658 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001659 EXPECT_EQ(96, gcodec.pltype);
1660 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001661 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001662}
1663
1664// Test that we can set send codecs even with CN codec as the first
1665// one on the list.
1666TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001667 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001668 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001669 cricket::AudioSendParameters parameters;
1670 parameters.codecs.push_back(kCn16000Codec);
1671 parameters.codecs.push_back(kIsacCodec);
1672 parameters.codecs.push_back(kPcmuCodec);
1673 parameters.codecs[0].id = 98; // wideband CN
1674 parameters.codecs[1].id = 96;
1675 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001676 webrtc::CodecInst gcodec;
1677 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1678 EXPECT_EQ(96, gcodec.pltype);
1679 EXPECT_STREQ("ISAC", gcodec.plname);
1680 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001681}
1682
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001683// Test that we set VAD and DTMF types correctly as caller.
1684TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001685 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001686 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001687 cricket::AudioSendParameters parameters;
1688 parameters.codecs.push_back(kIsacCodec);
1689 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001690 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001691 parameters.codecs.push_back(kCn16000Codec);
1692 parameters.codecs.push_back(kCn8000Codec);
1693 parameters.codecs.push_back(kTelephoneEventCodec);
1694 parameters.codecs.push_back(kRedCodec);
1695 parameters.codecs[0].id = 96;
1696 parameters.codecs[2].id = 97; // wideband CN
1697 parameters.codecs[4].id = 98; // DTMF
1698 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001699 webrtc::CodecInst gcodec;
1700 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1701 EXPECT_EQ(96, gcodec.pltype);
1702 EXPECT_STREQ("ISAC", gcodec.plname);
1703 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001704 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001705 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1706 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001707 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001708}
1709
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001710// Test that we set VAD and DTMF types correctly as callee.
1711TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001712 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
nisse51542be2016-02-12 02:27:06 -08001713 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
1714 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001715 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001716
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001717 cricket::AudioSendParameters parameters;
1718 parameters.codecs.push_back(kIsacCodec);
1719 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001720 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001721 parameters.codecs.push_back(kCn16000Codec);
1722 parameters.codecs.push_back(kCn8000Codec);
1723 parameters.codecs.push_back(kTelephoneEventCodec);
1724 parameters.codecs.push_back(kRedCodec);
1725 parameters.codecs[0].id = 96;
1726 parameters.codecs[2].id = 97; // wideband CN
1727 parameters.codecs[4].id = 98; // DTMF
1728 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001729 EXPECT_TRUE(channel_->AddSendStream(
1730 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001731 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001732
1733 webrtc::CodecInst gcodec;
1734 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1735 EXPECT_EQ(96, gcodec.pltype);
1736 EXPECT_STREQ("ISAC", gcodec.plname);
1737 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001738 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001739 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1740 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001741 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001742}
1743
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001744// Test that we only apply VAD if we have a CN codec that matches the
1745// send codec clockrate.
1746TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenberg1ac56142015-10-13 03:58:19 -07001747 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001748 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001749 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001750 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001751 parameters.codecs.push_back(kIsacCodec);
1752 parameters.codecs.push_back(kCn16000Codec);
1753 parameters.codecs[1].id = 97;
1754 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001755 webrtc::CodecInst gcodec;
1756 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1757 EXPECT_STREQ("ISAC", gcodec.plname);
1758 EXPECT_TRUE(voe_.GetVAD(channel_num));
1759 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1760 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001761 parameters.codecs[0] = kPcmuCodec;
1762 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001763 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1764 EXPECT_STREQ("PCMU", gcodec.plname);
1765 EXPECT_FALSE(voe_.GetVAD(channel_num));
1766 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001767 parameters.codecs[1] = kCn8000Codec;
1768 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001769 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1770 EXPECT_STREQ("PCMU", gcodec.plname);
1771 EXPECT_TRUE(voe_.GetVAD(channel_num));
1772 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001773 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001774 parameters.codecs[0] = kIsacCodec;
1775 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001776 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1777 EXPECT_STREQ("ISAC", gcodec.plname);
1778 EXPECT_FALSE(voe_.GetVAD(channel_num));
1779}
1780
1781// Test that we perform case-insensitive matching of codec names.
1782TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenberg1ac56142015-10-13 03:58:19 -07001783 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001784 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001785 cricket::AudioSendParameters parameters;
1786 parameters.codecs.push_back(kIsacCodec);
1787 parameters.codecs.push_back(kPcmuCodec);
1788 parameters.codecs.push_back(kCn16000Codec);
1789 parameters.codecs.push_back(kCn8000Codec);
1790 parameters.codecs.push_back(kTelephoneEventCodec);
1791 parameters.codecs.push_back(kRedCodec);
1792 parameters.codecs[0].name = "iSaC";
1793 parameters.codecs[0].id = 96;
1794 parameters.codecs[2].id = 97; // wideband CN
1795 parameters.codecs[4].id = 98; // DTMF
1796 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001797 webrtc::CodecInst gcodec;
1798 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1799 EXPECT_EQ(96, gcodec.pltype);
1800 EXPECT_STREQ("ISAC", gcodec.plname);
1801 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001802 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001803 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1804 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001805 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001806}
1807
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001808// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001809TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001810 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001811 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001812 cricket::AudioSendParameters parameters;
1813 parameters.codecs.push_back(kRedCodec);
1814 parameters.codecs.push_back(kIsacCodec);
1815 parameters.codecs.push_back(kPcmuCodec);
1816 parameters.codecs[0].id = 127;
1817 parameters.codecs[0].params[""] = "96/96";
1818 parameters.codecs[1].id = 96;
1819 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001820 webrtc::CodecInst gcodec;
1821 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1822 EXPECT_EQ(96, gcodec.pltype);
1823 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001824 EXPECT_TRUE(voe_.GetRED(channel_num));
1825 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001826}
1827
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001828// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001829TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001830 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
nisse51542be2016-02-12 02:27:06 -08001831 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
1832 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001833 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001834
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001835 cricket::AudioSendParameters parameters;
1836 parameters.codecs.push_back(kRedCodec);
1837 parameters.codecs.push_back(kIsacCodec);
1838 parameters.codecs.push_back(kPcmuCodec);
1839 parameters.codecs[0].id = 127;
1840 parameters.codecs[0].params[""] = "96/96";
1841 parameters.codecs[1].id = 96;
1842 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001843 EXPECT_TRUE(channel_->AddSendStream(
1844 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001845 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001846 webrtc::CodecInst gcodec;
1847 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1848 EXPECT_EQ(96, gcodec.pltype);
1849 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001850 EXPECT_TRUE(voe_.GetRED(channel_num));
1851 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001852}
1853
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001854// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001855TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenberg1ac56142015-10-13 03:58:19 -07001856 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001857 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001858 cricket::AudioSendParameters parameters;
1859 parameters.codecs.push_back(kRedCodec);
1860 parameters.codecs.push_back(kIsacCodec);
1861 parameters.codecs.push_back(kPcmuCodec);
1862 parameters.codecs[0].id = 127;
1863 parameters.codecs[1].id = 96;
1864 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001865 webrtc::CodecInst gcodec;
1866 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1867 EXPECT_EQ(96, gcodec.pltype);
1868 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001869 EXPECT_TRUE(voe_.GetRED(channel_num));
1870 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001871}
1872
1873// Test that we ignore RED if the parameters aren't named the way we expect.
1874TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001875 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001876 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001877 cricket::AudioSendParameters parameters;
1878 parameters.codecs.push_back(kRedCodec);
1879 parameters.codecs.push_back(kIsacCodec);
1880 parameters.codecs.push_back(kPcmuCodec);
1881 parameters.codecs[0].id = 127;
1882 parameters.codecs[0].params["ABC"] = "96/96";
1883 parameters.codecs[1].id = 96;
1884 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001885 webrtc::CodecInst gcodec;
1886 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1887 EXPECT_EQ(96, gcodec.pltype);
1888 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001889 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001890}
1891
1892// Test that we ignore RED if it uses different primary/secondary encoding.
1893TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001894 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001895 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001896 cricket::AudioSendParameters parameters;
1897 parameters.codecs.push_back(kRedCodec);
1898 parameters.codecs.push_back(kIsacCodec);
1899 parameters.codecs.push_back(kPcmuCodec);
1900 parameters.codecs[0].id = 127;
1901 parameters.codecs[0].params[""] = "96/0";
1902 parameters.codecs[1].id = 96;
1903 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001904 webrtc::CodecInst gcodec;
1905 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1906 EXPECT_EQ(96, gcodec.pltype);
1907 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001908 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001909}
1910
1911// Test that we ignore RED if it uses more than 2 encodings.
1912TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001913 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001914 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001915 cricket::AudioSendParameters parameters;
1916 parameters.codecs.push_back(kRedCodec);
1917 parameters.codecs.push_back(kIsacCodec);
1918 parameters.codecs.push_back(kPcmuCodec);
1919 parameters.codecs[0].id = 127;
1920 parameters.codecs[0].params[""] = "96/96/96";
1921 parameters.codecs[1].id = 96;
1922 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001923 webrtc::CodecInst gcodec;
1924 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1925 EXPECT_EQ(96, gcodec.pltype);
1926 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001927 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001928}
1929
1930// Test that we ignore RED if it has bogus codec ids.
1931TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001932 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001933 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001934 cricket::AudioSendParameters parameters;
1935 parameters.codecs.push_back(kRedCodec);
1936 parameters.codecs.push_back(kIsacCodec);
1937 parameters.codecs.push_back(kPcmuCodec);
1938 parameters.codecs[0].id = 127;
1939 parameters.codecs[0].params[""] = "ABC/ABC";
1940 parameters.codecs[1].id = 96;
1941 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001942 webrtc::CodecInst gcodec;
1943 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1944 EXPECT_EQ(96, gcodec.pltype);
1945 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001946 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001947}
1948
1949// Test that we ignore RED if it refers to a codec that is not present.
1950TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001951 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001952 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001953 cricket::AudioSendParameters parameters;
1954 parameters.codecs.push_back(kRedCodec);
1955 parameters.codecs.push_back(kIsacCodec);
1956 parameters.codecs.push_back(kPcmuCodec);
1957 parameters.codecs[0].id = 127;
1958 parameters.codecs[0].params[""] = "97/97";
1959 parameters.codecs[1].id = 96;
1960 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001961 webrtc::CodecInst gcodec;
1962 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1963 EXPECT_EQ(96, gcodec.pltype);
1964 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001965 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001966}
1967
stefanba4c0e42016-02-04 04:12:24 -08001968class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
1969 public:
1970 WebRtcVoiceEngineWithSendSideBweTest()
1971 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
1972};
1973
1974TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
1975 SupportsTransportSequenceNumberHeaderExtension) {
1976 cricket::RtpCapabilities capabilities = engine_.GetCapabilities();
1977 ASSERT_FALSE(capabilities.header_extensions.empty());
1978 for (const cricket::RtpHeaderExtension& extension :
1979 capabilities.header_extensions) {
1980 if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
1981 EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
1982 extension.id);
1983 return;
1984 }
1985 }
1986 FAIL() << "Transport sequence number extension not in header-extension list.";
1987}
1988
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001989// Test support for audio level header extension.
1990TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1991 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001992}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001993TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1994 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1995}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001996
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001997// Test support for absolute send time header extension.
1998TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1999 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
2000}
2001TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
2002 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002003}
2004
solenberg1ac56142015-10-13 03:58:19 -07002005// Test that we can create a channel and start sending on it.
2006TEST_F(WebRtcVoiceEngineTestFake, Send) {
2007 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002008 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002009 channel_->SetSend(true);
2010 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2011 channel_->SetSend(false);
2012 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2013}
2014
2015// Test that a channel will send if and only if it has a source and is enabled
2016// for sending.
2017TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
2018 EXPECT_TRUE(SetupEngineWithSendStream());
2019 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2020 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2021 channel_->SetSend(true);
2022 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2023 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2024 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2025 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2026 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002027}
2028
2029// Test that we can create a channel and start playing out on it.
2030TEST_F(WebRtcVoiceEngineTestFake, Playout) {
2031 EXPECT_TRUE(SetupEngineWithRecvStream());
2032 int channel_num = voe_.GetLastChannel();
2033 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2034 EXPECT_TRUE(channel_->SetPlayout(true));
2035 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002036 EXPECT_TRUE(channel_->SetPlayout(false));
2037 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2038}
2039
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002040// Test that we can add and remove send streams.
2041TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2042 SetupForMultiSendStream();
2043
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002044 // Set the global state for sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002045 channel_->SetSend(true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002046
solenbergc96df772015-10-21 13:01:53 -07002047 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002048 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002049 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002050 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002051 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002052 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002053 }
tfarina5237aaf2015-11-10 23:44:30 -08002054 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002055
solenbergc96df772015-10-21 13:01:53 -07002056 // Delete the send streams.
2057 for (uint32_t ssrc : kSsrcs4) {
2058 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002059 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002060 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002061 }
solenbergc96df772015-10-21 13:01:53 -07002062 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002063}
2064
2065// Test SetSendCodecs correctly configure the codecs in all send streams.
2066TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2067 SetupForMultiSendStream();
2068
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002069 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002070 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002071 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002072 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002073 }
2074
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002075 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002076 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002077 parameters.codecs.push_back(kIsacCodec);
2078 parameters.codecs.push_back(kCn16000Codec);
2079 parameters.codecs[1].id = 97;
2080 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002081
2082 // Verify ISAC and VAD are corrected configured on all send channels.
2083 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002084 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002085 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002086 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2087 EXPECT_STREQ("ISAC", gcodec.plname);
2088 EXPECT_TRUE(voe_.GetVAD(channel_num));
2089 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2090 }
2091
2092 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002093 parameters.codecs[0] = kPcmuCodec;
2094 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002095 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002096 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002097 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2098 EXPECT_STREQ("PCMU", gcodec.plname);
2099 EXPECT_FALSE(voe_.GetVAD(channel_num));
2100 }
2101}
2102
2103// Test we can SetSend on all send streams correctly.
2104TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2105 SetupForMultiSendStream();
2106
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002107 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002108 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002109 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002110 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002111 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2112 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002113 }
2114
2115 // Set the global state for starting sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002116 channel_->SetSend(true);
solenbergc96df772015-10-21 13:01:53 -07002117 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002118 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002119 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002120 }
2121
2122 // Set the global state for stopping sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002123 channel_->SetSend(false);
solenbergc96df772015-10-21 13:01:53 -07002124 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002125 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002126 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002127 }
2128}
2129
2130// Test we can set the correct statistics on all send streams.
2131TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2132 SetupForMultiSendStream();
2133
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002134 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002135 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002136 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002137 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002138 }
solenberg85a04962015-10-27 03:35:21 -07002139 SetAudioSendStreamStats();
2140
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002141 // Create a receive stream to check that none of the send streams end up in
2142 // the receive stream stats.
2143 EXPECT_TRUE(channel_->AddRecvStream(
2144 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002145 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002146 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2147 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002148
solenberg85a04962015-10-27 03:35:21 -07002149 // Check stats for the added streams.
2150 {
2151 cricket::VoiceMediaInfo info;
2152 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002153
solenberg85a04962015-10-27 03:35:21 -07002154 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002155 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002156 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002157 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002158 }
2159
2160 // We have added one receive stream. We should see empty stats.
2161 EXPECT_EQ(info.receivers.size(), 1u);
2162 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002163 }
solenberg1ac56142015-10-13 03:58:19 -07002164
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002165 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002166 {
2167 cricket::VoiceMediaInfo info;
2168 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2169 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002170 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002171 EXPECT_EQ(0u, info.receivers.size());
2172 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002173
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002174 // Deliver a new packet - a default receive stream should be created and we
2175 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002176 {
2177 cricket::VoiceMediaInfo info;
2178 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2179 SetAudioReceiveStreamStats();
2180 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002181 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002182 EXPECT_EQ(1u, info.receivers.size());
2183 VerifyVoiceReceiverInfo(info.receivers[0]);
2184 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002185}
2186
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002187// Test that we can add and remove receive streams, and do proper send/playout.
2188// We can receive on multiple streams while sending one stream.
2189TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002190 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002191 int channel_num1 = voe_.GetLastChannel();
2192
solenberg1ac56142015-10-13 03:58:19 -07002193 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002194 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002195 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002196 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002197
solenberg1ac56142015-10-13 03:58:19 -07002198 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002199 EXPECT_TRUE(
2200 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002201 int channel_num2 = voe_.GetLastChannel();
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002202 channel_->SetSend(true);
2203 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002204
solenberg1ac56142015-10-13 03:58:19 -07002205 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002206 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2207 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2208
2209 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002210 EXPECT_TRUE(
2211 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002212 int channel_num3 = voe_.GetLastChannel();
2213 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2214 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2215 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002216
2217 // Stop sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002218 channel_->SetSend(false);
2219 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002220
2221 // Stop playout.
2222 EXPECT_TRUE(channel_->SetPlayout(false));
2223 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2224 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2225 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2226
solenberg1ac56142015-10-13 03:58:19 -07002227 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002228 EXPECT_TRUE(channel_->SetPlayout(true));
2229 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2230 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2231 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2232
solenberg1ac56142015-10-13 03:58:19 -07002233 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002234 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2235 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002236 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002237}
2238
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002239// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002240// and start sending on it.
2241TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2242 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg246b8172015-12-08 09:50:23 -08002243 cricket::AudioOptions options_adjust_agc;
2244 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002245 webrtc::AgcConfig agc_config;
2246 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2247 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002248 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002249 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002250 channel_->SetSend(true);
2251 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002252 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2253 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002254 channel_->SetSend(false);
2255 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002256 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002257}
2258
wu@webrtc.org97077a32013-10-25 21:18:33 +00002259TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002260 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002261 webrtc::AgcConfig agc_config;
2262 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2263 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002264 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2265 send_parameters_.options.tx_agc_digital_compression_gain =
2266 rtc::Optional<uint16_t>(9);
2267 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2268 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2269 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002270 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2271 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2272 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2273 EXPECT_TRUE(agc_config.limiterEnable);
2274
2275 // Check interaction with adjust_agc_delta. Both should be respected, for
2276 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002277 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2278 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002279 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2280 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2281}
2282
wu@webrtc.org97077a32013-10-25 21:18:33 +00002283TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002284 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg246b8172015-12-08 09:50:23 -08002285 send_parameters_.options.recording_sample_rate =
2286 rtc::Optional<uint32_t>(48000);
2287 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2288 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002289
2290 unsigned int recording_sample_rate, playout_sample_rate;
2291 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2292 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2293 EXPECT_EQ(48000u, recording_sample_rate);
2294 EXPECT_EQ(44100u, playout_sample_rate);
2295}
2296
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002297// Test that we can set the outgoing SSRC properly.
2298// SSRC is set in SetupEngine by calling AddSendStream.
2299TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002300 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002301 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002302}
2303
2304TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2305 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002306 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002307 SetAudioSendStreamStats();
solenberg1ac56142015-10-13 03:58:19 -07002308 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2309 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002310 EXPECT_TRUE(channel_->AddRecvStream(
2311 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002312 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2313 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002314
solenberg85a04962015-10-27 03:35:21 -07002315 // Check stats for the added streams.
2316 {
2317 cricket::VoiceMediaInfo info;
2318 EXPECT_EQ(true, channel_->GetStats(&info));
2319
2320 // We have added one send stream. We should see the stats we've set.
2321 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002322 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002323 // We have added one receive stream. We should see empty stats.
2324 EXPECT_EQ(info.receivers.size(), 1u);
2325 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2326 }
solenberg1ac56142015-10-13 03:58:19 -07002327
solenberg566ef242015-11-06 15:34:49 -08002328 // Start sending - this affects some reported stats.
2329 {
2330 cricket::VoiceMediaInfo info;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002331 channel_->SetSend(true);
solenberg566ef242015-11-06 15:34:49 -08002332 EXPECT_EQ(true, channel_->GetStats(&info));
2333 VerifyVoiceSenderInfo(info.senders[0], true);
2334 }
2335
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002336 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002337 {
2338 cricket::VoiceMediaInfo info;
2339 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2340 EXPECT_EQ(true, channel_->GetStats(&info));
2341 EXPECT_EQ(1u, info.senders.size());
2342 EXPECT_EQ(0u, info.receivers.size());
2343 }
solenberg1ac56142015-10-13 03:58:19 -07002344
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002345 // Deliver a new packet - a default receive stream should be created and we
2346 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002347 {
2348 cricket::VoiceMediaInfo info;
2349 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2350 SetAudioReceiveStreamStats();
2351 EXPECT_EQ(true, channel_->GetStats(&info));
2352 EXPECT_EQ(1u, info.senders.size());
2353 EXPECT_EQ(1u, info.receivers.size());
2354 VerifyVoiceReceiverInfo(info.receivers[0]);
2355 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002356}
2357
2358// Test that we can set the outgoing SSRC properly with multiple streams.
2359// SSRC is set in SetupEngine by calling AddSendStream.
2360TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002361 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002362 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002363 EXPECT_TRUE(channel_->AddRecvStream(
2364 cricket::StreamParams::CreateLegacy(kSsrc2)));
2365 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002366}
2367
2368// Test that the local SSRC is the same on sending and receiving channels if the
2369// receive channel is created before the send channel.
2370TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002371 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
nisse51542be2016-02-12 02:27:06 -08002372 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
2373 cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002374
2375 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2376 int receive_channel_num = voe_.GetLastChannel();
2377 EXPECT_TRUE(channel_->AddSendStream(
2378 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002379
solenberg3a941542015-11-16 07:34:50 -08002380 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002381 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002382}
2383
2384// Test that we can properly receive packets.
2385TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2386 EXPECT_TRUE(SetupEngine());
solenberg7e63ef02015-11-20 00:19:43 -08002387 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002388 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002389 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002390 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002391}
2392
2393// Test that we can properly receive packets on multiple streams.
2394TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg7e63ef02015-11-20 00:19:43 -08002395 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002396 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2397 int channel_num1 = voe_.GetLastChannel();
2398 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2399 int channel_num2 = voe_.GetLastChannel();
2400 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2401 int channel_num3 = voe_.GetLastChannel();
2402 // Create packets with the right SSRCs.
2403 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002404 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002405 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002406 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002407 }
2408 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2409 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2410 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002411
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002412 DeliverPacket(packets[0], sizeof(packets[0]));
2413 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2414 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2415 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002416
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002417 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002418 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002419 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2420 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002421
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002422 DeliverPacket(packets[2], sizeof(packets[2]));
2423 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002424 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002425 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002426
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002427 DeliverPacket(packets[3], sizeof(packets[3]));
2428 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2429 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002430 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2431
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002432 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2433 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2434 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2435}
2436
solenberg7e63ef02015-11-20 00:19:43 -08002437// Test that receiving on an unsignalled stream works (default channel will be
2438// created).
2439TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
2440 EXPECT_TRUE(SetupEngine());
2441 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2442 int channel_num = voe_.GetLastChannel();
2443 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2444}
2445
2446// Test that receiving on an unsignalled stream works (default channel will be
2447// created), and that packets will be forwarded to the default channel
2448// regardless of their SSRCs.
2449TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
2450 EXPECT_TRUE(SetupEngine());
2451 char packet[sizeof(kPcmuFrame)];
2452 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2453
2454 // Note that the first unknown SSRC cannot be 0, because we only support
2455 // creating receive streams for SSRC!=0.
2456 DeliverPacket(packet, sizeof(packet));
2457 int channel_num = voe_.GetLastChannel();
2458 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2459 // Once we have the default channel, SSRC==0 will be ok.
2460 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2461 rtc::SetBE32(&packet[8], ssrc);
2462 DeliverPacket(packet, sizeof(packet));
2463 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2464 }
2465}
2466
2467// Test that a default channel is created even after a signalled stream has been
2468// added, and that this stream will get any packets for unknown SSRCs.
2469TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
2470 EXPECT_TRUE(SetupEngine());
2471 char packet[sizeof(kPcmuFrame)];
2472 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2473
2474 // Add a known stream, send packet and verify we got it.
2475 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2476 int signalled_channel_num = voe_.GetLastChannel();
2477 DeliverPacket(packet, sizeof(packet));
2478 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2479
2480 // Note that the first unknown SSRC cannot be 0, because we only support
2481 // creating receive streams for SSRC!=0.
2482 rtc::SetBE32(&packet[8], 7011);
2483 DeliverPacket(packet, sizeof(packet));
2484 int channel_num = voe_.GetLastChannel();
2485 EXPECT_NE(channel_num, signalled_channel_num);
2486 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2487 // Once we have the default channel, SSRC==0 will be ok.
2488 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2489 rtc::SetBE32(&packet[8], ssrc);
2490 DeliverPacket(packet, sizeof(packet));
2491 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2492 }
2493}
2494
solenberg0a617e22015-10-20 15:49:38 -07002495// Test that we properly handle failures to add a receive stream.
2496TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
2497 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002498 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002499 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002500}
2501
solenberg0a617e22015-10-20 15:49:38 -07002502// Test that we properly handle failures to add a send stream.
2503TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
2504 EXPECT_TRUE(SetupEngine());
2505 voe_.set_fail_create_channel(true);
2506 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2507}
2508
solenberg1ac56142015-10-13 03:58:19 -07002509// Test that AddRecvStream creates new stream.
2510TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2511 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002512 int channel_num = voe_.GetLastChannel();
2513 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002514 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002515}
2516
2517// Test that after adding a recv stream, we do not decode more codecs than
2518// those previously passed into SetRecvCodecs.
2519TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002520 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002521 cricket::AudioRecvParameters parameters;
2522 parameters.codecs.push_back(kIsacCodec);
2523 parameters.codecs.push_back(kPcmuCodec);
2524 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002525 EXPECT_TRUE(channel_->AddRecvStream(
2526 cricket::StreamParams::CreateLegacy(kSsrc1)));
2527 int channel_num2 = voe_.GetLastChannel();
2528 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002529 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002530 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002531 gcodec.channels = 2;
2532 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2533}
2534
2535// Test that we properly clean up any streams that were added, even if
2536// not explicitly removed.
2537TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002538 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002539 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002540 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2541 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2542 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2543 delete channel_;
2544 channel_ = NULL;
2545 EXPECT_EQ(0, voe_.GetNumChannels());
2546}
2547
wu@webrtc.org78187522013-10-07 23:32:02 +00002548TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002549 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002550 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2551}
2552
2553TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2554 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002555 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002556 // Manually delete channel to simulate a failure.
2557 int channel = voe_.GetLastChannel();
2558 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2559 // Add recv stream 2 should work.
2560 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002561 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002562 EXPECT_NE(channel, new_channel);
2563 // The last created channel is deleted too.
2564 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002565}
2566
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002567// Test the InsertDtmf on default send stream as caller.
2568TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2569 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002570}
2571
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002572// Test the InsertDtmf on default send stream as callee
2573TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2574 TestInsertDtmf(0, false);
2575}
2576
2577// Test the InsertDtmf on specified send stream as caller.
2578TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2579 TestInsertDtmf(kSsrc1, true);
2580}
2581
2582// Test the InsertDtmf on specified send stream as callee.
2583TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2584 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002585}
2586
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002587TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002588 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002589 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002590 channel_->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002591 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2592 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2593 EXPECT_TRUE(channel_->SetPlayout(true));
2594 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2595 EXPECT_TRUE(channel_->SetPlayout(false));
2596 EXPECT_FALSE(channel_->SetPlayout(true));
2597}
2598
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002599TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002600 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002601
2602 bool ec_enabled;
2603 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002604 webrtc::AecmModes aecm_mode;
2605 bool cng_enabled;
2606 bool agc_enabled;
2607 webrtc::AgcModes agc_mode;
2608 webrtc::AgcConfig agc_config;
2609 bool ns_enabled;
2610 webrtc::NsModes ns_mode;
2611 bool highpass_filter_enabled;
2612 bool stereo_swapping_enabled;
2613 bool typing_detection_enabled;
2614 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002615 voe_.GetAecmMode(aecm_mode, cng_enabled);
2616 voe_.GetAgcStatus(agc_enabled, agc_mode);
2617 voe_.GetAgcConfig(agc_config);
2618 voe_.GetNsStatus(ns_enabled, ns_mode);
2619 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2620 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2621 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2622 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002623 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002624 EXPECT_FALSE(cng_enabled);
2625 EXPECT_TRUE(agc_enabled);
2626 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2627 EXPECT_TRUE(ns_enabled);
2628 EXPECT_TRUE(highpass_filter_enabled);
2629 EXPECT_FALSE(stereo_swapping_enabled);
2630 EXPECT_TRUE(typing_detection_enabled);
2631 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2632 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002633 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2634 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002635
solenberg246b8172015-12-08 09:50:23 -08002636 // Nothing set in AudioOptions, so everything should be as default.
2637 send_parameters_.options = cricket::AudioOptions();
2638 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002639 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002640 voe_.GetAecmMode(aecm_mode, cng_enabled);
2641 voe_.GetAgcStatus(agc_enabled, agc_mode);
2642 voe_.GetAgcConfig(agc_config);
2643 voe_.GetNsStatus(ns_enabled, ns_mode);
2644 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2645 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2646 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2647 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002648 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002649 EXPECT_FALSE(cng_enabled);
2650 EXPECT_TRUE(agc_enabled);
2651 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2652 EXPECT_TRUE(ns_enabled);
2653 EXPECT_TRUE(highpass_filter_enabled);
2654 EXPECT_FALSE(stereo_swapping_enabled);
2655 EXPECT_TRUE(typing_detection_enabled);
2656 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2657 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002658 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2659 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002660
2661 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002662 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2663 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002664 voe_.GetEcStatus(ec_enabled, ec_mode);
2665 EXPECT_FALSE(ec_enabled);
2666
2667 // Turn echo cancellation back on, with settings, and make sure
2668 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002669 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2670 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002671 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002672 voe_.GetAecmMode(aecm_mode, cng_enabled);
2673 voe_.GetAgcStatus(agc_enabled, agc_mode);
2674 voe_.GetAgcConfig(agc_config);
2675 voe_.GetNsStatus(ns_enabled, ns_mode);
2676 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2677 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2678 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2679 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002680 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002681 EXPECT_TRUE(agc_enabled);
2682 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2683 EXPECT_TRUE(ns_enabled);
2684 EXPECT_TRUE(highpass_filter_enabled);
2685 EXPECT_FALSE(stereo_swapping_enabled);
2686 EXPECT_TRUE(typing_detection_enabled);
2687 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2688 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2689
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002690 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2691 // control.
solenberg246b8172015-12-08 09:50:23 -08002692 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2693 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002694 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002695 voe_.GetAecmMode(aecm_mode, cng_enabled);
2696 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002697 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002698 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2699
2700 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002701 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2702 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2703 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2704 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002705 voe_.GetEcStatus(ec_enabled, ec_mode);
2706 EXPECT_FALSE(ec_enabled);
2707 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002708 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2709 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002710 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002711 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002712 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002713 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2714
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002715 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002716 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2717 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002718 voe_.GetAgcStatus(agc_enabled, agc_mode);
2719 EXPECT_FALSE(agc_enabled);
2720
2721 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002722 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2723 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2724 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002725 voe_.GetAgcStatus(agc_enabled, agc_mode);
2726 EXPECT_TRUE(agc_enabled);
2727 voe_.GetAgcConfig(agc_config);
2728 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2729
2730 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002731 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2732 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2733 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2734 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2735 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002736 voe_.GetNsStatus(ns_enabled, ns_mode);
2737 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2738 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2739 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2740 EXPECT_FALSE(ns_enabled);
2741 EXPECT_FALSE(highpass_filter_enabled);
2742 EXPECT_FALSE(typing_detection_enabled);
2743 EXPECT_TRUE(stereo_swapping_enabled);
2744
solenberg1ac56142015-10-13 03:58:19 -07002745 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002746 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002747 voe_.GetEcStatus(ec_enabled, ec_mode);
2748 voe_.GetNsStatus(ns_enabled, ns_mode);
2749 EXPECT_TRUE(ec_enabled);
2750 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2751 EXPECT_FALSE(ns_enabled);
2752 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2753}
2754
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002755TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002756 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002757
2758 bool ec_enabled;
2759 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002760 bool agc_enabled;
2761 webrtc::AgcModes agc_mode;
2762 bool ns_enabled;
2763 webrtc::NsModes ns_mode;
2764 bool highpass_filter_enabled;
2765 bool stereo_swapping_enabled;
2766 bool typing_detection_enabled;
2767
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002768 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002769 voe_.GetAgcStatus(agc_enabled, agc_mode);
2770 voe_.GetNsStatus(ns_enabled, ns_mode);
2771 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2772 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2773 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2774 EXPECT_TRUE(ec_enabled);
2775 EXPECT_TRUE(agc_enabled);
2776 EXPECT_TRUE(ns_enabled);
2777 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002778 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002779 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002780}
2781
2782TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2783 webrtc::AgcConfig set_config = {0};
2784 set_config.targetLeveldBOv = 3;
2785 set_config.digitalCompressionGaindB = 9;
2786 set_config.limiterEnable = true;
2787 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002788 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002789
2790 webrtc::AgcConfig config = {0};
2791 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2792 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2793 EXPECT_EQ(set_config.digitalCompressionGaindB,
2794 config.digitalCompressionGaindB);
2795 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2796}
2797
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002798TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002799 EXPECT_TRUE(SetupEngineWithSendStream());
kwiberg686a8ef2016-02-26 03:00:35 -08002800 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
nisse51542be2016-02-12 02:27:06 -08002801 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_.CreateChannel(
2802 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002803 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
nisse51542be2016-02-12 02:27:06 -08002804 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_.CreateChannel(
2805 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002806
2807 // Have to add a stream to make SetSend work.
2808 cricket::StreamParams stream1;
2809 stream1.ssrcs.push_back(1);
2810 channel1->AddSendStream(stream1);
2811 cricket::StreamParams stream2;
2812 stream2.ssrcs.push_back(2);
2813 channel2->AddSendStream(stream2);
2814
2815 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002816 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002817 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2818 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2819 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002820 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2821 EXPECT_EQ(parameters_options_all.options, channel1->options());
2822 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2823 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002824
2825 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002826 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002827 parameters_options_no_ns.options.noise_suppression =
2828 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002829 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2830 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002831 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2832 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2833 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002834 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002835
2836 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002837 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002838 parameters_options_no_agc.options.auto_gain_control =
2839 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002840 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002841 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2842 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2843 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002844 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002845
solenberg246b8172015-12-08 09:50:23 -08002846 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002847 bool ec_enabled;
2848 webrtc::EcModes ec_mode;
2849 bool agc_enabled;
2850 webrtc::AgcModes agc_mode;
2851 bool ns_enabled;
2852 webrtc::NsModes ns_mode;
2853 voe_.GetEcStatus(ec_enabled, ec_mode);
2854 voe_.GetAgcStatus(agc_enabled, agc_mode);
2855 voe_.GetNsStatus(ns_enabled, ns_mode);
2856 EXPECT_TRUE(ec_enabled);
2857 EXPECT_TRUE(agc_enabled);
2858 EXPECT_TRUE(ns_enabled);
2859
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002860 channel1->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002861 voe_.GetEcStatus(ec_enabled, ec_mode);
2862 voe_.GetAgcStatus(agc_enabled, agc_mode);
2863 voe_.GetNsStatus(ns_enabled, ns_mode);
2864 EXPECT_TRUE(ec_enabled);
2865 EXPECT_TRUE(agc_enabled);
2866 EXPECT_FALSE(ns_enabled);
2867
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002868 channel2->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002869 voe_.GetEcStatus(ec_enabled, ec_mode);
2870 voe_.GetAgcStatus(agc_enabled, agc_mode);
2871 voe_.GetNsStatus(ns_enabled, ns_mode);
2872 EXPECT_TRUE(ec_enabled);
2873 EXPECT_FALSE(agc_enabled);
2874 EXPECT_TRUE(ns_enabled);
2875
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002876 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08002877 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002878 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2879 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002880 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01002881 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07002882 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01002883 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002884 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002885 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01002886 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2887 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2888 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002889 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002890 voe_.GetEcStatus(ec_enabled, ec_mode);
2891 voe_.GetAgcStatus(agc_enabled, agc_mode);
2892 voe_.GetNsStatus(ns_enabled, ns_mode);
2893 EXPECT_TRUE(ec_enabled);
2894 EXPECT_FALSE(agc_enabled);
2895 EXPECT_FALSE(ns_enabled);
2896}
2897
wu@webrtc.orgde305012013-10-31 15:40:38 +00002898// This test verifies DSCP settings are properly applied on voice media channel.
2899TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002900 EXPECT_TRUE(SetupEngineWithSendStream());
nisse51542be2016-02-12 02:27:06 -08002901 cricket::FakeNetworkInterface network_interface;
2902 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08002903 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08002904
2905 channel.reset(engine_.CreateChannel(&call_, config, cricket::AudioOptions()));
2906 channel->SetInterface(&network_interface);
2907 // Default value when DSCP is disabled should be DSCP_DEFAULT.
2908 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
2909
2910 config.enable_dscp = true;
2911 channel.reset(engine_.CreateChannel(&call_, config, cricket::AudioOptions()));
2912 channel->SetInterface(&network_interface);
2913 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
2914
2915 // Verify that setting the option to false resets the
2916 // DiffServCodePoint.
2917 config.enable_dscp = false;
2918 channel.reset(engine_.CreateChannel(&call_, config, cricket::AudioOptions()));
2919 channel->SetInterface(&network_interface);
2920 // Default value when DSCP is disabled should be DSCP_DEFAULT.
2921 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
2922
2923 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00002924}
2925
solenberg1ac56142015-10-13 03:58:19 -07002926TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002927 EXPECT_TRUE(SetupEngine());
2928 cricket::WebRtcVoiceMediaChannel* media_channel =
2929 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002930 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2931 EXPECT_TRUE(channel_->AddRecvStream(
2932 cricket::StreamParams::CreateLegacy(kSsrc1)));
2933 int channel_id = voe_.GetLastChannel();
2934 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2935 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2936 EXPECT_TRUE(channel_->AddRecvStream(
2937 cricket::StreamParams::CreateLegacy(kSsrc2)));
2938 int channel_id2 = voe_.GetLastChannel();
2939 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002940}
2941
solenberg1ac56142015-10-13 03:58:19 -07002942TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002943 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002944 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002945 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2946 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2947 EXPECT_TRUE(channel_->AddSendStream(
2948 cricket::StreamParams::CreateLegacy(kSsrc1)));
2949 int channel_id = voe_.GetLastChannel();
2950 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2951 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2952 EXPECT_TRUE(channel_->AddSendStream(
2953 cricket::StreamParams::CreateLegacy(kSsrc2)));
2954 int channel_id2 = voe_.GetLastChannel();
2955 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002956}
2957
solenberg4bac9c52015-10-09 02:32:53 -07002958TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002959 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002960 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002961 cricket::StreamParams stream;
2962 stream.ssrcs.push_back(kSsrc2);
2963 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002964 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002965 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002966 float scale = 0;
2967 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2968 EXPECT_DOUBLE_EQ(3, scale);
2969}
2970
2971TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
2972 EXPECT_TRUE(SetupEngine());
2973 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2974 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2975 int channel_id = voe_.GetLastChannel();
2976 float scale = 0;
2977 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2978 EXPECT_DOUBLE_EQ(2, scale);
2979 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07002980 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002981 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002982}
2983
pbos8fc7fa72015-07-15 08:02:58 -07002984TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02002985 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07002986 const std::string kSyncLabel = "AvSyncLabel";
2987
solenberg1ac56142015-10-13 03:58:19 -07002988 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07002989 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
2990 sp.sync_label = kSyncLabel;
2991 // Creating two channels to make sure that sync label is set properly for both
2992 // the default voice channel and following ones.
2993 EXPECT_TRUE(channel_->AddRecvStream(sp));
2994 sp.ssrcs[0] += 1;
2995 EXPECT_TRUE(channel_->AddRecvStream(sp));
2996
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002997 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07002998 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002999 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003000 << "SyncGroup should be set based on sync_label";
3001 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003002 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003003 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003004}
3005
solenberg3a941542015-11-16 07:34:50 -08003006// TODO(solenberg): Remove, once recv streams are configured through Call.
3007// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003008TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003009 // Test that setting the header extensions results in the expected state
3010 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003011 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003012 ssrcs.push_back(223);
3013 ssrcs.push_back(224);
3014
solenberg1ac56142015-10-13 03:58:19 -07003015 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003016 cricket::WebRtcVoiceMediaChannel* media_channel =
3017 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003018 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003019 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003020 EXPECT_TRUE(media_channel->AddRecvStream(
3021 cricket::StreamParams::CreateLegacy(ssrc)));
3022 }
3023
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003024 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003025 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003026 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003027 EXPECT_NE(nullptr, s);
3028 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3029 }
3030
3031 // Set up receive extensions.
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003032 cricket::RtpCapabilities capabilities = engine_.GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003033 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003034 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003035 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003036 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003037 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003038 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003039 EXPECT_NE(nullptr, s);
3040 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003041 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3042 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003043 for (const auto& s_ext : s_exts) {
3044 if (e_ext.id == s_ext.id) {
3045 EXPECT_EQ(e_ext.uri, s_ext.name);
3046 }
3047 }
3048 }
3049 }
3050
3051 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003052 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003053 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003054 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003055 EXPECT_NE(nullptr, s);
3056 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3057 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003058}
3059
3060TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3061 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003062 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003063 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3064 static const unsigned char kRtcp[] = {
3065 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3066 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3067 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3068 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3069 };
3070 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3071
solenberg1ac56142015-10-13 03:58:19 -07003072 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003073 cricket::WebRtcVoiceMediaChannel* media_channel =
3074 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003075 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003076 EXPECT_TRUE(media_channel->AddRecvStream(
3077 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3078
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003079 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003080 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003081 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003082 EXPECT_EQ(0, s->received_packets());
3083 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3084 EXPECT_EQ(1, s->received_packets());
3085 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3086 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003087}
Minyue2013aec2015-05-13 14:14:42 +02003088
solenberg0a617e22015-10-20 15:49:38 -07003089// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003090// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003091TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenberg1ac56142015-10-13 03:58:19 -07003092 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003093 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003094 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003095 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3096 int recv_ch = voe_.GetLastChannel();
3097 EXPECT_NE(recv_ch, default_channel);
3098 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3099 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3100 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003101 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3102 recv_ch = voe_.GetLastChannel();
3103 EXPECT_NE(recv_ch, default_channel);
3104 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003105}
3106
3107TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003108 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003109 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003110
3111 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3112 int recv_ch = voe_.GetLastChannel();
3113
3114 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3115 int send_ch = voe_.GetLastChannel();
3116
3117 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3118 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3119 // channel of |recv_ch|.This is not a common case, since, normally, only the
3120 // default channel can be associated. However, the default is not deletable.
3121 // So we force the |recv_ch| to associate with a non-default channel.
3122 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3123 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3124
3125 EXPECT_TRUE(channel_->RemoveSendStream(2));
3126 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3127}
stefan658910c2015-09-03 05:48:32 -07003128
deadbeef884f5852016-01-15 09:20:04 -08003129TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
3130 EXPECT_TRUE(SetupEngine());
kwiberg686a8ef2016-02-26 03:00:35 -08003131 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3132 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003133
3134 // Setting the sink before a recv stream exists should do nothing.
3135 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3136 EXPECT_TRUE(
3137 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3138 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3139
3140 // Now try actually setting the sink.
3141 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3142 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3143
3144 // Now try resetting it.
3145 channel_->SetRawAudioSink(kSsrc1, nullptr);
3146 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3147}
3148
3149TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
3150 EXPECT_TRUE(SetupEngine());
kwiberg686a8ef2016-02-26 03:00:35 -08003151 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3152 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003153
3154 // Should be able to set a default sink even when no stream exists.
3155 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3156
3157 // Create default channel and ensure it's assigned the default sink.
3158 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3159 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3160
3161 // Try resetting the default sink.
3162 channel_->SetRawAudioSink(0, nullptr);
3163 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3164
3165 // Try setting the default sink while the default stream exists.
3166 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3167 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3168
3169 // If we remove and add a default stream, it should get the same sink.
3170 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3171 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3172 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3173}
3174
stefan658910c2015-09-03 05:48:32 -07003175// Tests that the library initializes and shuts down properly.
3176TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3177 cricket::WebRtcVoiceEngine engine;
3178 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
kwiberg686a8ef2016-02-26 03:00:35 -08003179 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003180 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003181 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3182 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003183 EXPECT_TRUE(channel != nullptr);
3184 delete channel;
3185 engine.Terminate();
3186
3187 // Reinit to catch regression where VoiceEngineObserver reference is lost
3188 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3189 engine.Terminate();
3190}
3191
3192// Tests that the library is configured with the codecs we want.
3193TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003194 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003195 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3196 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0), nullptr));
3197 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3198 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0), nullptr));
3199 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3200 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003201 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003202 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3203 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0), nullptr));
3204 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3205 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0), nullptr));
3206 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3207 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0), nullptr));
3208 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3209 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0), nullptr));
3210 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3211 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0), nullptr));
3212 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3213 cricket::AudioCodec(96, "red", 8000, 0, 1, 0), nullptr));
3214 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3215 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0), nullptr));
3216 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3217 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0), nullptr));
3218 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3219 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0), nullptr));
3220 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3221 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003222 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003223 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3224 cricket::AudioCodec(0, "", 8000, 0, 1, 0), nullptr)); // PCMU
3225 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3226 cricket::AudioCodec(8, "", 8000, 0, 1, 0), nullptr)); // PCMA
3227 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3228 cricket::AudioCodec(9, "", 8000, 0, 1, 0), nullptr)); // G722
3229 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3230 cricket::AudioCodec(13, "", 8000, 0, 1, 0), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003231 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003232 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3233 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003234 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003235 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3236 cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0), nullptr));
3237 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3238 cricket::AudioCodec(88, "", 0, 0, 1, 0), nullptr));
3239 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3240 cricket::AudioCodec(0, "", 0, 0, 2, 0), nullptr));
3241 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3242 cricket::AudioCodec(0, "", 5000, 0, 1, 0), nullptr));
3243 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3244 cricket::AudioCodec(0, "", 0, 5000, 1, 0), nullptr));
3245
stefan658910c2015-09-03 05:48:32 -07003246 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenberg26c8c912015-11-27 04:00:25 -08003247 cricket::WebRtcVoiceEngine engine;
stefan658910c2015-09-03 05:48:32 -07003248 for (std::vector<cricket::AudioCodec>::const_iterator it =
3249 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3250 if (it->name == "CN" && it->clockrate == 16000) {
3251 EXPECT_EQ(105, it->id);
3252 } else if (it->name == "CN" && it->clockrate == 32000) {
3253 EXPECT_EQ(106, it->id);
3254 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3255 EXPECT_EQ(103, it->id);
3256 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3257 EXPECT_EQ(104, it->id);
3258 } else if (it->name == "G722" && it->clockrate == 8000) {
3259 EXPECT_EQ(9, it->id);
3260 } else if (it->name == "telephone-event") {
3261 EXPECT_EQ(126, it->id);
3262 } else if (it->name == "red") {
3263 EXPECT_EQ(127, it->id);
3264 } else if (it->name == "opus") {
3265 EXPECT_EQ(111, it->id);
3266 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3267 EXPECT_EQ("10", it->params.find("minptime")->second);
3268 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3269 EXPECT_EQ("60", it->params.find("maxptime")->second);
3270 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3271 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3272 }
3273 }
stefan658910c2015-09-03 05:48:32 -07003274 engine.Terminate();
3275}
3276
3277// Tests that VoE supports at least 32 channels
3278TEST(WebRtcVoiceEngineTest, Has32Channels) {
3279 cricket::WebRtcVoiceEngine engine;
3280 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
kwiberg686a8ef2016-02-26 03:00:35 -08003281 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003282 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003283
3284 cricket::VoiceMediaChannel* channels[32];
3285 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003286 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003287 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3288 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003289 if (!channel)
3290 break;
stefan658910c2015-09-03 05:48:32 -07003291 channels[num_channels++] = channel;
3292 }
3293
tfarina5237aaf2015-11-10 23:44:30 -08003294 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003295 EXPECT_EQ(expected, num_channels);
3296
3297 while (num_channels > 0) {
3298 delete channels[--num_channels];
3299 }
stefan658910c2015-09-03 05:48:32 -07003300 engine.Terminate();
3301}
3302
3303// Test that we set our preferred codecs properly.
3304TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3305 cricket::WebRtcVoiceEngine engine;
3306 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
kwiberg686a8ef2016-02-26 03:00:35 -08003307 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003308 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003309 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3310 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003311 cricket::AudioRecvParameters parameters;
3312 parameters.codecs = engine.codecs();
3313 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003314}