blob: b538c6ff752f2916e05a3d869279be57eb7c106e [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) {
jbaucheec21bd2016-03-20 06:15:43 -0700116 rtc::CopyOnWriteBuffer 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
solenberg31642aa2016-03-14 08:00:37 -07001664// Test that payload type range is limited for telephone-event codec.
1665TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
1666 EXPECT_TRUE(SetupEngineWithSendStream());
1667 cricket::AudioSendParameters parameters;
1668 parameters.codecs.push_back(kTelephoneEventCodec);
1669 parameters.codecs.push_back(kIsacCodec);
1670 parameters.codecs[0].id = 0; // DTMF
1671 parameters.codecs[1].id = 96;
1672 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1673 EXPECT_TRUE(channel_->CanInsertDtmf());
1674 parameters.codecs[0].id = 128; // DTMF
1675 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1676 EXPECT_FALSE(channel_->CanInsertDtmf());
1677 parameters.codecs[0].id = 127;
1678 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1679 EXPECT_TRUE(channel_->CanInsertDtmf());
1680 parameters.codecs[0].id = -1; // DTMF
1681 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1682 EXPECT_FALSE(channel_->CanInsertDtmf());
1683}
1684
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001685// Test that we can set send codecs even with CN codec as the first
1686// one on the list.
1687TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001688 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001689 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001690 cricket::AudioSendParameters parameters;
1691 parameters.codecs.push_back(kCn16000Codec);
1692 parameters.codecs.push_back(kIsacCodec);
1693 parameters.codecs.push_back(kPcmuCodec);
1694 parameters.codecs[0].id = 98; // wideband CN
1695 parameters.codecs[1].id = 96;
1696 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001697 webrtc::CodecInst gcodec;
1698 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1699 EXPECT_EQ(96, gcodec.pltype);
1700 EXPECT_STREQ("ISAC", gcodec.plname);
1701 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001702}
1703
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001704// Test that we set VAD and DTMF types correctly as caller.
1705TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001706 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001707 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001708 cricket::AudioSendParameters parameters;
1709 parameters.codecs.push_back(kIsacCodec);
1710 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001711 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001712 parameters.codecs.push_back(kCn16000Codec);
1713 parameters.codecs.push_back(kCn8000Codec);
1714 parameters.codecs.push_back(kTelephoneEventCodec);
1715 parameters.codecs.push_back(kRedCodec);
1716 parameters.codecs[0].id = 96;
1717 parameters.codecs[2].id = 97; // wideband CN
1718 parameters.codecs[4].id = 98; // DTMF
1719 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001720 webrtc::CodecInst gcodec;
1721 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1722 EXPECT_EQ(96, gcodec.pltype);
1723 EXPECT_STREQ("ISAC", gcodec.plname);
1724 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001725 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001726 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1727 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001728 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001729}
1730
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001731// Test that we set VAD and DTMF types correctly as callee.
1732TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001733 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
nisse51542be2016-02-12 02:27:06 -08001734 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
1735 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001736 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001737
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001738 cricket::AudioSendParameters parameters;
1739 parameters.codecs.push_back(kIsacCodec);
1740 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001741 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001742 parameters.codecs.push_back(kCn16000Codec);
1743 parameters.codecs.push_back(kCn8000Codec);
1744 parameters.codecs.push_back(kTelephoneEventCodec);
1745 parameters.codecs.push_back(kRedCodec);
1746 parameters.codecs[0].id = 96;
1747 parameters.codecs[2].id = 97; // wideband CN
1748 parameters.codecs[4].id = 98; // DTMF
1749 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001750 EXPECT_TRUE(channel_->AddSendStream(
1751 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001752 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001753
1754 webrtc::CodecInst gcodec;
1755 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1756 EXPECT_EQ(96, gcodec.pltype);
1757 EXPECT_STREQ("ISAC", gcodec.plname);
1758 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001759 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001760 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1761 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001762 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001763}
1764
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001765// Test that we only apply VAD if we have a CN codec that matches the
1766// send codec clockrate.
1767TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenberg1ac56142015-10-13 03:58:19 -07001768 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001769 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001770 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001771 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001772 parameters.codecs.push_back(kIsacCodec);
1773 parameters.codecs.push_back(kCn16000Codec);
1774 parameters.codecs[1].id = 97;
1775 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001776 webrtc::CodecInst gcodec;
1777 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1778 EXPECT_STREQ("ISAC", gcodec.plname);
1779 EXPECT_TRUE(voe_.GetVAD(channel_num));
1780 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1781 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001782 parameters.codecs[0] = kPcmuCodec;
1783 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001784 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1785 EXPECT_STREQ("PCMU", gcodec.plname);
1786 EXPECT_FALSE(voe_.GetVAD(channel_num));
1787 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001788 parameters.codecs[1] = kCn8000Codec;
1789 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001790 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1791 EXPECT_STREQ("PCMU", gcodec.plname);
1792 EXPECT_TRUE(voe_.GetVAD(channel_num));
1793 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001794 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001795 parameters.codecs[0] = kIsacCodec;
1796 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001797 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1798 EXPECT_STREQ("ISAC", gcodec.plname);
1799 EXPECT_FALSE(voe_.GetVAD(channel_num));
1800}
1801
1802// Test that we perform case-insensitive matching of codec names.
1803TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenberg1ac56142015-10-13 03:58:19 -07001804 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001805 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001806 cricket::AudioSendParameters parameters;
1807 parameters.codecs.push_back(kIsacCodec);
1808 parameters.codecs.push_back(kPcmuCodec);
1809 parameters.codecs.push_back(kCn16000Codec);
1810 parameters.codecs.push_back(kCn8000Codec);
1811 parameters.codecs.push_back(kTelephoneEventCodec);
1812 parameters.codecs.push_back(kRedCodec);
1813 parameters.codecs[0].name = "iSaC";
1814 parameters.codecs[0].id = 96;
1815 parameters.codecs[2].id = 97; // wideband CN
1816 parameters.codecs[4].id = 98; // DTMF
1817 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001818 webrtc::CodecInst gcodec;
1819 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1820 EXPECT_EQ(96, gcodec.pltype);
1821 EXPECT_STREQ("ISAC", gcodec.plname);
1822 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001823 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001824 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1825 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001826 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001827}
1828
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001829// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001830TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001831 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001832 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001833 cricket::AudioSendParameters parameters;
1834 parameters.codecs.push_back(kRedCodec);
1835 parameters.codecs.push_back(kIsacCodec);
1836 parameters.codecs.push_back(kPcmuCodec);
1837 parameters.codecs[0].id = 127;
1838 parameters.codecs[0].params[""] = "96/96";
1839 parameters.codecs[1].id = 96;
1840 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001841 webrtc::CodecInst gcodec;
1842 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1843 EXPECT_EQ(96, gcodec.pltype);
1844 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001845 EXPECT_TRUE(voe_.GetRED(channel_num));
1846 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001847}
1848
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001849// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001850TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001851 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
nisse51542be2016-02-12 02:27:06 -08001852 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
1853 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001854 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001855
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001856 cricket::AudioSendParameters parameters;
1857 parameters.codecs.push_back(kRedCodec);
1858 parameters.codecs.push_back(kIsacCodec);
1859 parameters.codecs.push_back(kPcmuCodec);
1860 parameters.codecs[0].id = 127;
1861 parameters.codecs[0].params[""] = "96/96";
1862 parameters.codecs[1].id = 96;
1863 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001864 EXPECT_TRUE(channel_->AddSendStream(
1865 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001866 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001867 webrtc::CodecInst gcodec;
1868 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1869 EXPECT_EQ(96, gcodec.pltype);
1870 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001871 EXPECT_TRUE(voe_.GetRED(channel_num));
1872 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001873}
1874
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001875// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001876TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenberg1ac56142015-10-13 03:58:19 -07001877 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001878 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001879 cricket::AudioSendParameters parameters;
1880 parameters.codecs.push_back(kRedCodec);
1881 parameters.codecs.push_back(kIsacCodec);
1882 parameters.codecs.push_back(kPcmuCodec);
1883 parameters.codecs[0].id = 127;
1884 parameters.codecs[1].id = 96;
1885 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001886 webrtc::CodecInst gcodec;
1887 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1888 EXPECT_EQ(96, gcodec.pltype);
1889 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001890 EXPECT_TRUE(voe_.GetRED(channel_num));
1891 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001892}
1893
1894// Test that we ignore RED if the parameters aren't named the way we expect.
1895TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001896 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001897 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001898 cricket::AudioSendParameters parameters;
1899 parameters.codecs.push_back(kRedCodec);
1900 parameters.codecs.push_back(kIsacCodec);
1901 parameters.codecs.push_back(kPcmuCodec);
1902 parameters.codecs[0].id = 127;
1903 parameters.codecs[0].params["ABC"] = "96/96";
1904 parameters.codecs[1].id = 96;
1905 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001906 webrtc::CodecInst gcodec;
1907 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1908 EXPECT_EQ(96, gcodec.pltype);
1909 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001910 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001911}
1912
1913// Test that we ignore RED if it uses different primary/secondary encoding.
1914TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001915 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001916 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001917 cricket::AudioSendParameters parameters;
1918 parameters.codecs.push_back(kRedCodec);
1919 parameters.codecs.push_back(kIsacCodec);
1920 parameters.codecs.push_back(kPcmuCodec);
1921 parameters.codecs[0].id = 127;
1922 parameters.codecs[0].params[""] = "96/0";
1923 parameters.codecs[1].id = 96;
1924 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001925 webrtc::CodecInst gcodec;
1926 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1927 EXPECT_EQ(96, gcodec.pltype);
1928 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001929 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001930}
1931
1932// Test that we ignore RED if it uses more than 2 encodings.
1933TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001934 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001935 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001936 cricket::AudioSendParameters parameters;
1937 parameters.codecs.push_back(kRedCodec);
1938 parameters.codecs.push_back(kIsacCodec);
1939 parameters.codecs.push_back(kPcmuCodec);
1940 parameters.codecs[0].id = 127;
1941 parameters.codecs[0].params[""] = "96/96/96";
1942 parameters.codecs[1].id = 96;
1943 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001944 webrtc::CodecInst gcodec;
1945 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1946 EXPECT_EQ(96, gcodec.pltype);
1947 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001948 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001949}
1950
1951// Test that we ignore RED if it has bogus codec ids.
1952TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001953 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001954 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001955 cricket::AudioSendParameters parameters;
1956 parameters.codecs.push_back(kRedCodec);
1957 parameters.codecs.push_back(kIsacCodec);
1958 parameters.codecs.push_back(kPcmuCodec);
1959 parameters.codecs[0].id = 127;
1960 parameters.codecs[0].params[""] = "ABC/ABC";
1961 parameters.codecs[1].id = 96;
1962 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001963 webrtc::CodecInst gcodec;
1964 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1965 EXPECT_EQ(96, gcodec.pltype);
1966 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001967 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001968}
1969
1970// Test that we ignore RED if it refers to a codec that is not present.
1971TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001972 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001973 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001974 cricket::AudioSendParameters parameters;
1975 parameters.codecs.push_back(kRedCodec);
1976 parameters.codecs.push_back(kIsacCodec);
1977 parameters.codecs.push_back(kPcmuCodec);
1978 parameters.codecs[0].id = 127;
1979 parameters.codecs[0].params[""] = "97/97";
1980 parameters.codecs[1].id = 96;
1981 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001982 webrtc::CodecInst gcodec;
1983 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1984 EXPECT_EQ(96, gcodec.pltype);
1985 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001986 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001987}
1988
stefanba4c0e42016-02-04 04:12:24 -08001989class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
1990 public:
1991 WebRtcVoiceEngineWithSendSideBweTest()
1992 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
1993};
1994
1995TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
1996 SupportsTransportSequenceNumberHeaderExtension) {
1997 cricket::RtpCapabilities capabilities = engine_.GetCapabilities();
1998 ASSERT_FALSE(capabilities.header_extensions.empty());
1999 for (const cricket::RtpHeaderExtension& extension :
2000 capabilities.header_extensions) {
2001 if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
2002 EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
2003 extension.id);
2004 return;
2005 }
2006 }
2007 FAIL() << "Transport sequence number extension not in header-extension list.";
2008}
2009
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002010// Test support for audio level header extension.
2011TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
2012 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002013}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002014TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
2015 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
2016}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002017
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002018// Test support for absolute send time header extension.
2019TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
2020 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
2021}
2022TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
2023 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002024}
2025
solenberg1ac56142015-10-13 03:58:19 -07002026// Test that we can create a channel and start sending on it.
2027TEST_F(WebRtcVoiceEngineTestFake, Send) {
2028 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002029 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002030 channel_->SetSend(true);
2031 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2032 channel_->SetSend(false);
2033 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2034}
2035
2036// Test that a channel will send if and only if it has a source and is enabled
2037// for sending.
2038TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
2039 EXPECT_TRUE(SetupEngineWithSendStream());
2040 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2041 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2042 channel_->SetSend(true);
2043 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2044 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2045 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2046 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2047 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002048}
2049
2050// Test that we can create a channel and start playing out on it.
2051TEST_F(WebRtcVoiceEngineTestFake, Playout) {
2052 EXPECT_TRUE(SetupEngineWithRecvStream());
2053 int channel_num = voe_.GetLastChannel();
2054 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2055 EXPECT_TRUE(channel_->SetPlayout(true));
2056 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002057 EXPECT_TRUE(channel_->SetPlayout(false));
2058 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2059}
2060
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002061// Test that we can add and remove send streams.
2062TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2063 SetupForMultiSendStream();
2064
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002065 // Set the global state for sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002066 channel_->SetSend(true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002067
solenbergc96df772015-10-21 13:01:53 -07002068 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002069 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002070 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002071 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002072 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002073 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002074 }
tfarina5237aaf2015-11-10 23:44:30 -08002075 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002076
solenbergc96df772015-10-21 13:01:53 -07002077 // Delete the send streams.
2078 for (uint32_t ssrc : kSsrcs4) {
2079 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002080 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002081 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002082 }
solenbergc96df772015-10-21 13:01:53 -07002083 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002084}
2085
2086// Test SetSendCodecs correctly configure the codecs in all send streams.
2087TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2088 SetupForMultiSendStream();
2089
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002090 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002091 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002092 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002093 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002094 }
2095
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002096 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002097 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002098 parameters.codecs.push_back(kIsacCodec);
2099 parameters.codecs.push_back(kCn16000Codec);
2100 parameters.codecs[1].id = 97;
2101 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002102
2103 // Verify ISAC and VAD are corrected configured on all send channels.
2104 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002105 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002106 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002107 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2108 EXPECT_STREQ("ISAC", gcodec.plname);
2109 EXPECT_TRUE(voe_.GetVAD(channel_num));
2110 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2111 }
2112
2113 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002114 parameters.codecs[0] = kPcmuCodec;
2115 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002116 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002117 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002118 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2119 EXPECT_STREQ("PCMU", gcodec.plname);
2120 EXPECT_FALSE(voe_.GetVAD(channel_num));
2121 }
2122}
2123
2124// Test we can SetSend on all send streams correctly.
2125TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2126 SetupForMultiSendStream();
2127
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002128 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002129 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002130 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002131 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002132 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2133 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002134 }
2135
2136 // Set the global state for starting sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002137 channel_->SetSend(true);
solenbergc96df772015-10-21 13:01:53 -07002138 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002139 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002140 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002141 }
2142
2143 // Set the global state for stopping sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002144 channel_->SetSend(false);
solenbergc96df772015-10-21 13:01:53 -07002145 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002146 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002147 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002148 }
2149}
2150
2151// Test we can set the correct statistics on all send streams.
2152TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2153 SetupForMultiSendStream();
2154
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002155 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002156 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002157 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002158 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002159 }
solenberg85a04962015-10-27 03:35:21 -07002160 SetAudioSendStreamStats();
2161
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002162 // Create a receive stream to check that none of the send streams end up in
2163 // the receive stream stats.
2164 EXPECT_TRUE(channel_->AddRecvStream(
2165 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002166 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002167 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2168 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002169
solenberg85a04962015-10-27 03:35:21 -07002170 // Check stats for the added streams.
2171 {
2172 cricket::VoiceMediaInfo info;
2173 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002174
solenberg85a04962015-10-27 03:35:21 -07002175 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002176 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002177 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002178 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002179 }
2180
2181 // We have added one receive stream. We should see empty stats.
2182 EXPECT_EQ(info.receivers.size(), 1u);
2183 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002184 }
solenberg1ac56142015-10-13 03:58:19 -07002185
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002186 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002187 {
2188 cricket::VoiceMediaInfo info;
2189 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2190 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002191 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002192 EXPECT_EQ(0u, info.receivers.size());
2193 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002194
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002195 // Deliver a new packet - a default receive stream should be created and we
2196 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002197 {
2198 cricket::VoiceMediaInfo info;
2199 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2200 SetAudioReceiveStreamStats();
2201 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002202 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002203 EXPECT_EQ(1u, info.receivers.size());
2204 VerifyVoiceReceiverInfo(info.receivers[0]);
2205 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002206}
2207
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002208// Test that we can add and remove receive streams, and do proper send/playout.
2209// We can receive on multiple streams while sending one stream.
2210TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002211 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002212 int channel_num1 = voe_.GetLastChannel();
2213
solenberg1ac56142015-10-13 03:58:19 -07002214 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002215 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002216 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002217 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002218
solenberg1ac56142015-10-13 03:58:19 -07002219 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002220 EXPECT_TRUE(
2221 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002222 int channel_num2 = voe_.GetLastChannel();
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002223 channel_->SetSend(true);
2224 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002225
solenberg1ac56142015-10-13 03:58:19 -07002226 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002227 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2228 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2229
2230 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002231 EXPECT_TRUE(
2232 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002233 int channel_num3 = voe_.GetLastChannel();
2234 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2235 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2236 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002237
2238 // Stop sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002239 channel_->SetSend(false);
2240 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002241
2242 // Stop playout.
2243 EXPECT_TRUE(channel_->SetPlayout(false));
2244 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2245 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2246 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2247
solenberg1ac56142015-10-13 03:58:19 -07002248 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002249 EXPECT_TRUE(channel_->SetPlayout(true));
2250 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2251 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2252 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2253
solenberg1ac56142015-10-13 03:58:19 -07002254 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002255 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2256 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002257 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002258}
2259
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002260// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002261// and start sending on it.
2262TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2263 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg246b8172015-12-08 09:50:23 -08002264 cricket::AudioOptions options_adjust_agc;
2265 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002266 webrtc::AgcConfig agc_config;
2267 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2268 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002269 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002270 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002271 channel_->SetSend(true);
2272 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002273 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2274 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002275 channel_->SetSend(false);
2276 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002277 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002278}
2279
wu@webrtc.org97077a32013-10-25 21:18:33 +00002280TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002281 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002282 webrtc::AgcConfig agc_config;
2283 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2284 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002285 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2286 send_parameters_.options.tx_agc_digital_compression_gain =
2287 rtc::Optional<uint16_t>(9);
2288 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2289 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2290 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002291 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2292 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2293 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2294 EXPECT_TRUE(agc_config.limiterEnable);
2295
2296 // Check interaction with adjust_agc_delta. Both should be respected, for
2297 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002298 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2299 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002300 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2301 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2302}
2303
wu@webrtc.org97077a32013-10-25 21:18:33 +00002304TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002305 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg246b8172015-12-08 09:50:23 -08002306 send_parameters_.options.recording_sample_rate =
2307 rtc::Optional<uint32_t>(48000);
2308 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2309 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002310
2311 unsigned int recording_sample_rate, playout_sample_rate;
2312 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2313 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2314 EXPECT_EQ(48000u, recording_sample_rate);
2315 EXPECT_EQ(44100u, playout_sample_rate);
2316}
2317
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002318// Test that we can set the outgoing SSRC properly.
2319// SSRC is set in SetupEngine by calling AddSendStream.
2320TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002321 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002322 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002323}
2324
2325TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2326 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002327 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002328 SetAudioSendStreamStats();
solenberg1ac56142015-10-13 03:58:19 -07002329 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2330 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002331 EXPECT_TRUE(channel_->AddRecvStream(
2332 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002333 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2334 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002335
solenberg85a04962015-10-27 03:35:21 -07002336 // Check stats for the added streams.
2337 {
2338 cricket::VoiceMediaInfo info;
2339 EXPECT_EQ(true, channel_->GetStats(&info));
2340
2341 // We have added one send stream. We should see the stats we've set.
2342 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002343 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002344 // We have added one receive stream. We should see empty stats.
2345 EXPECT_EQ(info.receivers.size(), 1u);
2346 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2347 }
solenberg1ac56142015-10-13 03:58:19 -07002348
solenberg566ef242015-11-06 15:34:49 -08002349 // Start sending - this affects some reported stats.
2350 {
2351 cricket::VoiceMediaInfo info;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002352 channel_->SetSend(true);
solenberg566ef242015-11-06 15:34:49 -08002353 EXPECT_EQ(true, channel_->GetStats(&info));
2354 VerifyVoiceSenderInfo(info.senders[0], true);
2355 }
2356
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002357 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002358 {
2359 cricket::VoiceMediaInfo info;
2360 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2361 EXPECT_EQ(true, channel_->GetStats(&info));
2362 EXPECT_EQ(1u, info.senders.size());
2363 EXPECT_EQ(0u, info.receivers.size());
2364 }
solenberg1ac56142015-10-13 03:58:19 -07002365
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002366 // Deliver a new packet - a default receive stream should be created and we
2367 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002368 {
2369 cricket::VoiceMediaInfo info;
2370 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2371 SetAudioReceiveStreamStats();
2372 EXPECT_EQ(true, channel_->GetStats(&info));
2373 EXPECT_EQ(1u, info.senders.size());
2374 EXPECT_EQ(1u, info.receivers.size());
2375 VerifyVoiceReceiverInfo(info.receivers[0]);
2376 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002377}
2378
2379// Test that we can set the outgoing SSRC properly with multiple streams.
2380// SSRC is set in SetupEngine by calling AddSendStream.
2381TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002382 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002383 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002384 EXPECT_TRUE(channel_->AddRecvStream(
2385 cricket::StreamParams::CreateLegacy(kSsrc2)));
2386 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002387}
2388
2389// Test that the local SSRC is the same on sending and receiving channels if the
2390// receive channel is created before the send channel.
2391TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002392 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
nisse51542be2016-02-12 02:27:06 -08002393 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
2394 cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002395
2396 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2397 int receive_channel_num = voe_.GetLastChannel();
2398 EXPECT_TRUE(channel_->AddSendStream(
2399 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002400
solenberg3a941542015-11-16 07:34:50 -08002401 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002402 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002403}
2404
2405// Test that we can properly receive packets.
2406TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2407 EXPECT_TRUE(SetupEngine());
solenberg7e63ef02015-11-20 00:19:43 -08002408 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002409 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002410 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002411 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002412}
2413
2414// Test that we can properly receive packets on multiple streams.
2415TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg7e63ef02015-11-20 00:19:43 -08002416 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002417 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2418 int channel_num1 = voe_.GetLastChannel();
2419 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2420 int channel_num2 = voe_.GetLastChannel();
2421 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2422 int channel_num3 = voe_.GetLastChannel();
2423 // Create packets with the right SSRCs.
2424 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002425 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002426 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002427 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002428 }
2429 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2430 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2431 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002432
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002433 DeliverPacket(packets[0], sizeof(packets[0]));
2434 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2435 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2436 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002437
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002438 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002439 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002440 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2441 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002442
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002443 DeliverPacket(packets[2], sizeof(packets[2]));
2444 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002445 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002446 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002447
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002448 DeliverPacket(packets[3], sizeof(packets[3]));
2449 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2450 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002451 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2452
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002453 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2454 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2455 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2456}
2457
solenberg7e63ef02015-11-20 00:19:43 -08002458// Test that receiving on an unsignalled stream works (default channel will be
2459// created).
2460TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
2461 EXPECT_TRUE(SetupEngine());
2462 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2463 int channel_num = voe_.GetLastChannel();
2464 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2465}
2466
2467// Test that receiving on an unsignalled stream works (default channel will be
2468// created), and that packets will be forwarded to the default channel
2469// regardless of their SSRCs.
2470TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
2471 EXPECT_TRUE(SetupEngine());
2472 char packet[sizeof(kPcmuFrame)];
2473 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2474
2475 // Note that the first unknown SSRC cannot be 0, because we only support
2476 // creating receive streams for SSRC!=0.
2477 DeliverPacket(packet, sizeof(packet));
2478 int channel_num = voe_.GetLastChannel();
2479 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2480 // Once we have the default channel, SSRC==0 will be ok.
2481 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2482 rtc::SetBE32(&packet[8], ssrc);
2483 DeliverPacket(packet, sizeof(packet));
2484 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2485 }
2486}
2487
2488// Test that a default channel is created even after a signalled stream has been
2489// added, and that this stream will get any packets for unknown SSRCs.
2490TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
2491 EXPECT_TRUE(SetupEngine());
2492 char packet[sizeof(kPcmuFrame)];
2493 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2494
2495 // Add a known stream, send packet and verify we got it.
2496 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2497 int signalled_channel_num = voe_.GetLastChannel();
2498 DeliverPacket(packet, sizeof(packet));
2499 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2500
2501 // Note that the first unknown SSRC cannot be 0, because we only support
2502 // creating receive streams for SSRC!=0.
2503 rtc::SetBE32(&packet[8], 7011);
2504 DeliverPacket(packet, sizeof(packet));
2505 int channel_num = voe_.GetLastChannel();
2506 EXPECT_NE(channel_num, signalled_channel_num);
2507 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2508 // Once we have the default channel, SSRC==0 will be ok.
2509 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2510 rtc::SetBE32(&packet[8], ssrc);
2511 DeliverPacket(packet, sizeof(packet));
2512 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2513 }
2514}
2515
solenberg0a617e22015-10-20 15:49:38 -07002516// Test that we properly handle failures to add a receive stream.
2517TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
2518 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002519 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002520 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002521}
2522
solenberg0a617e22015-10-20 15:49:38 -07002523// Test that we properly handle failures to add a send stream.
2524TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
2525 EXPECT_TRUE(SetupEngine());
2526 voe_.set_fail_create_channel(true);
2527 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2528}
2529
solenberg1ac56142015-10-13 03:58:19 -07002530// Test that AddRecvStream creates new stream.
2531TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2532 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002533 int channel_num = voe_.GetLastChannel();
2534 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002535 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002536}
2537
2538// Test that after adding a recv stream, we do not decode more codecs than
2539// those previously passed into SetRecvCodecs.
2540TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002541 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002542 cricket::AudioRecvParameters parameters;
2543 parameters.codecs.push_back(kIsacCodec);
2544 parameters.codecs.push_back(kPcmuCodec);
2545 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002546 EXPECT_TRUE(channel_->AddRecvStream(
2547 cricket::StreamParams::CreateLegacy(kSsrc1)));
2548 int channel_num2 = voe_.GetLastChannel();
2549 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002550 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002551 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002552 gcodec.channels = 2;
2553 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2554}
2555
2556// Test that we properly clean up any streams that were added, even if
2557// not explicitly removed.
2558TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002559 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002560 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002561 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2562 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2563 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2564 delete channel_;
2565 channel_ = NULL;
2566 EXPECT_EQ(0, voe_.GetNumChannels());
2567}
2568
wu@webrtc.org78187522013-10-07 23:32:02 +00002569TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002570 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002571 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2572}
2573
2574TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2575 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002576 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002577 // Manually delete channel to simulate a failure.
2578 int channel = voe_.GetLastChannel();
2579 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2580 // Add recv stream 2 should work.
2581 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002582 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002583 EXPECT_NE(channel, new_channel);
2584 // The last created channel is deleted too.
2585 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002586}
2587
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002588// Test the InsertDtmf on default send stream as caller.
2589TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2590 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002591}
2592
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002593// Test the InsertDtmf on default send stream as callee
2594TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2595 TestInsertDtmf(0, false);
2596}
2597
2598// Test the InsertDtmf on specified send stream as caller.
2599TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2600 TestInsertDtmf(kSsrc1, true);
2601}
2602
2603// Test the InsertDtmf on specified send stream as callee.
2604TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2605 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002606}
2607
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002608TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002609 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002610 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002611 channel_->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002612 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2613 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2614 EXPECT_TRUE(channel_->SetPlayout(true));
2615 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2616 EXPECT_TRUE(channel_->SetPlayout(false));
2617 EXPECT_FALSE(channel_->SetPlayout(true));
2618}
2619
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002620TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002621 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002622
2623 bool ec_enabled;
2624 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002625 webrtc::AecmModes aecm_mode;
2626 bool cng_enabled;
2627 bool agc_enabled;
2628 webrtc::AgcModes agc_mode;
2629 webrtc::AgcConfig agc_config;
2630 bool ns_enabled;
2631 webrtc::NsModes ns_mode;
2632 bool highpass_filter_enabled;
2633 bool stereo_swapping_enabled;
2634 bool typing_detection_enabled;
2635 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002636 voe_.GetAecmMode(aecm_mode, cng_enabled);
2637 voe_.GetAgcStatus(agc_enabled, agc_mode);
2638 voe_.GetAgcConfig(agc_config);
2639 voe_.GetNsStatus(ns_enabled, ns_mode);
2640 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2641 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2642 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2643 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002644 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002645 EXPECT_FALSE(cng_enabled);
2646 EXPECT_TRUE(agc_enabled);
2647 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2648 EXPECT_TRUE(ns_enabled);
2649 EXPECT_TRUE(highpass_filter_enabled);
2650 EXPECT_FALSE(stereo_swapping_enabled);
2651 EXPECT_TRUE(typing_detection_enabled);
2652 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2653 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002654 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2655 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002656
solenberg246b8172015-12-08 09:50:23 -08002657 // Nothing set in AudioOptions, so everything should be as default.
2658 send_parameters_.options = cricket::AudioOptions();
2659 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002660 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002661 voe_.GetAecmMode(aecm_mode, cng_enabled);
2662 voe_.GetAgcStatus(agc_enabled, agc_mode);
2663 voe_.GetAgcConfig(agc_config);
2664 voe_.GetNsStatus(ns_enabled, ns_mode);
2665 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2666 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2667 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2668 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002669 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002670 EXPECT_FALSE(cng_enabled);
2671 EXPECT_TRUE(agc_enabled);
2672 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2673 EXPECT_TRUE(ns_enabled);
2674 EXPECT_TRUE(highpass_filter_enabled);
2675 EXPECT_FALSE(stereo_swapping_enabled);
2676 EXPECT_TRUE(typing_detection_enabled);
2677 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2678 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002679 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2680 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002681
2682 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002683 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2684 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002685 voe_.GetEcStatus(ec_enabled, ec_mode);
2686 EXPECT_FALSE(ec_enabled);
2687
2688 // Turn echo cancellation back on, with settings, and make sure
2689 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002690 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2691 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002692 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002693 voe_.GetAecmMode(aecm_mode, cng_enabled);
2694 voe_.GetAgcStatus(agc_enabled, agc_mode);
2695 voe_.GetAgcConfig(agc_config);
2696 voe_.GetNsStatus(ns_enabled, ns_mode);
2697 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2698 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2699 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2700 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002701 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002702 EXPECT_TRUE(agc_enabled);
2703 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2704 EXPECT_TRUE(ns_enabled);
2705 EXPECT_TRUE(highpass_filter_enabled);
2706 EXPECT_FALSE(stereo_swapping_enabled);
2707 EXPECT_TRUE(typing_detection_enabled);
2708 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2709 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2710
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002711 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2712 // control.
solenberg246b8172015-12-08 09:50:23 -08002713 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2714 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002715 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002716 voe_.GetAecmMode(aecm_mode, cng_enabled);
2717 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002718 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002719 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2720
2721 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002722 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2723 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2724 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2725 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002726 voe_.GetEcStatus(ec_enabled, ec_mode);
2727 EXPECT_FALSE(ec_enabled);
2728 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002729 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2730 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002731 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002732 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002733 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002734 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2735
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002736 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002737 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2738 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002739 voe_.GetAgcStatus(agc_enabled, agc_mode);
2740 EXPECT_FALSE(agc_enabled);
2741
2742 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002743 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2744 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2745 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002746 voe_.GetAgcStatus(agc_enabled, agc_mode);
2747 EXPECT_TRUE(agc_enabled);
2748 voe_.GetAgcConfig(agc_config);
2749 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2750
2751 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002752 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2753 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2754 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2755 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2756 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002757 voe_.GetNsStatus(ns_enabled, ns_mode);
2758 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2759 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2760 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2761 EXPECT_FALSE(ns_enabled);
2762 EXPECT_FALSE(highpass_filter_enabled);
2763 EXPECT_FALSE(typing_detection_enabled);
2764 EXPECT_TRUE(stereo_swapping_enabled);
2765
solenberg1ac56142015-10-13 03:58:19 -07002766 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002767 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002768 voe_.GetEcStatus(ec_enabled, ec_mode);
2769 voe_.GetNsStatus(ns_enabled, ns_mode);
2770 EXPECT_TRUE(ec_enabled);
2771 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2772 EXPECT_FALSE(ns_enabled);
2773 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2774}
2775
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002776TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002777 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002778
2779 bool ec_enabled;
2780 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002781 bool agc_enabled;
2782 webrtc::AgcModes agc_mode;
2783 bool ns_enabled;
2784 webrtc::NsModes ns_mode;
2785 bool highpass_filter_enabled;
2786 bool stereo_swapping_enabled;
2787 bool typing_detection_enabled;
2788
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002789 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002790 voe_.GetAgcStatus(agc_enabled, agc_mode);
2791 voe_.GetNsStatus(ns_enabled, ns_mode);
2792 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2793 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2794 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2795 EXPECT_TRUE(ec_enabled);
2796 EXPECT_TRUE(agc_enabled);
2797 EXPECT_TRUE(ns_enabled);
2798 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002799 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002800 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002801}
2802
2803TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2804 webrtc::AgcConfig set_config = {0};
2805 set_config.targetLeveldBOv = 3;
2806 set_config.digitalCompressionGaindB = 9;
2807 set_config.limiterEnable = true;
2808 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002809 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002810
2811 webrtc::AgcConfig config = {0};
2812 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2813 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2814 EXPECT_EQ(set_config.digitalCompressionGaindB,
2815 config.digitalCompressionGaindB);
2816 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2817}
2818
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002819TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002820 EXPECT_TRUE(SetupEngineWithSendStream());
kwiberg686a8ef2016-02-26 03:00:35 -08002821 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
nisse51542be2016-02-12 02:27:06 -08002822 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_.CreateChannel(
2823 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002824 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
nisse51542be2016-02-12 02:27:06 -08002825 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_.CreateChannel(
2826 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002827
2828 // Have to add a stream to make SetSend work.
2829 cricket::StreamParams stream1;
2830 stream1.ssrcs.push_back(1);
2831 channel1->AddSendStream(stream1);
2832 cricket::StreamParams stream2;
2833 stream2.ssrcs.push_back(2);
2834 channel2->AddSendStream(stream2);
2835
2836 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002837 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002838 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2839 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2840 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002841 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2842 EXPECT_EQ(parameters_options_all.options, channel1->options());
2843 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2844 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002845
2846 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002847 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002848 parameters_options_no_ns.options.noise_suppression =
2849 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002850 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2851 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002852 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2853 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2854 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002855 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002856
2857 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002858 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002859 parameters_options_no_agc.options.auto_gain_control =
2860 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002861 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002862 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2863 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2864 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002865 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002866
solenberg246b8172015-12-08 09:50:23 -08002867 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002868 bool ec_enabled;
2869 webrtc::EcModes ec_mode;
2870 bool agc_enabled;
2871 webrtc::AgcModes agc_mode;
2872 bool ns_enabled;
2873 webrtc::NsModes ns_mode;
2874 voe_.GetEcStatus(ec_enabled, ec_mode);
2875 voe_.GetAgcStatus(agc_enabled, agc_mode);
2876 voe_.GetNsStatus(ns_enabled, ns_mode);
2877 EXPECT_TRUE(ec_enabled);
2878 EXPECT_TRUE(agc_enabled);
2879 EXPECT_TRUE(ns_enabled);
2880
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002881 channel1->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002882 voe_.GetEcStatus(ec_enabled, ec_mode);
2883 voe_.GetAgcStatus(agc_enabled, agc_mode);
2884 voe_.GetNsStatus(ns_enabled, ns_mode);
2885 EXPECT_TRUE(ec_enabled);
2886 EXPECT_TRUE(agc_enabled);
2887 EXPECT_FALSE(ns_enabled);
2888
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002889 channel2->SetSend(true);
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_TRUE(ns_enabled);
2896
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002897 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08002898 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002899 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2900 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002901 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01002902 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07002903 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01002904 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002905 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002906 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01002907 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2908 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2909 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002910 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002911 voe_.GetEcStatus(ec_enabled, ec_mode);
2912 voe_.GetAgcStatus(agc_enabled, agc_mode);
2913 voe_.GetNsStatus(ns_enabled, ns_mode);
2914 EXPECT_TRUE(ec_enabled);
2915 EXPECT_FALSE(agc_enabled);
2916 EXPECT_FALSE(ns_enabled);
2917}
2918
wu@webrtc.orgde305012013-10-31 15:40:38 +00002919// This test verifies DSCP settings are properly applied on voice media channel.
2920TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002921 EXPECT_TRUE(SetupEngineWithSendStream());
nisse51542be2016-02-12 02:27:06 -08002922 cricket::FakeNetworkInterface network_interface;
2923 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08002924 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08002925
2926 channel.reset(engine_.CreateChannel(&call_, config, cricket::AudioOptions()));
2927 channel->SetInterface(&network_interface);
2928 // Default value when DSCP is disabled should be DSCP_DEFAULT.
2929 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
2930
2931 config.enable_dscp = true;
2932 channel.reset(engine_.CreateChannel(&call_, config, cricket::AudioOptions()));
2933 channel->SetInterface(&network_interface);
2934 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
2935
2936 // Verify that setting the option to false resets the
2937 // DiffServCodePoint.
2938 config.enable_dscp = false;
2939 channel.reset(engine_.CreateChannel(&call_, config, cricket::AudioOptions()));
2940 channel->SetInterface(&network_interface);
2941 // Default value when DSCP is disabled should be DSCP_DEFAULT.
2942 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
2943
2944 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00002945}
2946
solenberg1ac56142015-10-13 03:58:19 -07002947TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002948 EXPECT_TRUE(SetupEngine());
2949 cricket::WebRtcVoiceMediaChannel* media_channel =
2950 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002951 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2952 EXPECT_TRUE(channel_->AddRecvStream(
2953 cricket::StreamParams::CreateLegacy(kSsrc1)));
2954 int channel_id = voe_.GetLastChannel();
2955 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2956 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2957 EXPECT_TRUE(channel_->AddRecvStream(
2958 cricket::StreamParams::CreateLegacy(kSsrc2)));
2959 int channel_id2 = voe_.GetLastChannel();
2960 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002961}
2962
solenberg1ac56142015-10-13 03:58:19 -07002963TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002964 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002965 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002966 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2967 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2968 EXPECT_TRUE(channel_->AddSendStream(
2969 cricket::StreamParams::CreateLegacy(kSsrc1)));
2970 int channel_id = voe_.GetLastChannel();
2971 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2972 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2973 EXPECT_TRUE(channel_->AddSendStream(
2974 cricket::StreamParams::CreateLegacy(kSsrc2)));
2975 int channel_id2 = voe_.GetLastChannel();
2976 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002977}
2978
solenberg4bac9c52015-10-09 02:32:53 -07002979TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002980 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002981 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002982 cricket::StreamParams stream;
2983 stream.ssrcs.push_back(kSsrc2);
2984 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002985 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002986 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002987 float scale = 0;
2988 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2989 EXPECT_DOUBLE_EQ(3, scale);
2990}
2991
2992TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
2993 EXPECT_TRUE(SetupEngine());
2994 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2995 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2996 int channel_id = voe_.GetLastChannel();
2997 float scale = 0;
2998 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2999 EXPECT_DOUBLE_EQ(2, scale);
3000 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003001 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003002 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003003}
3004
pbos8fc7fa72015-07-15 08:02:58 -07003005TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003006 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003007 const std::string kSyncLabel = "AvSyncLabel";
3008
solenberg1ac56142015-10-13 03:58:19 -07003009 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003010 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3011 sp.sync_label = kSyncLabel;
3012 // Creating two channels to make sure that sync label is set properly for both
3013 // the default voice channel and following ones.
3014 EXPECT_TRUE(channel_->AddRecvStream(sp));
3015 sp.ssrcs[0] += 1;
3016 EXPECT_TRUE(channel_->AddRecvStream(sp));
3017
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003018 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003019 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003020 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003021 << "SyncGroup should be set based on sync_label";
3022 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003023 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003024 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003025}
3026
solenberg3a941542015-11-16 07:34:50 -08003027// TODO(solenberg): Remove, once recv streams are configured through Call.
3028// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003029TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003030 // Test that setting the header extensions results in the expected state
3031 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003032 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003033 ssrcs.push_back(223);
3034 ssrcs.push_back(224);
3035
solenberg1ac56142015-10-13 03:58:19 -07003036 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003037 cricket::WebRtcVoiceMediaChannel* media_channel =
3038 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003039 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003040 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003041 EXPECT_TRUE(media_channel->AddRecvStream(
3042 cricket::StreamParams::CreateLegacy(ssrc)));
3043 }
3044
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003045 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003046 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003047 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003048 EXPECT_NE(nullptr, s);
3049 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3050 }
3051
3052 // Set up receive extensions.
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003053 cricket::RtpCapabilities capabilities = engine_.GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003054 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003055 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003056 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003057 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003058 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003059 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003060 EXPECT_NE(nullptr, s);
3061 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003062 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3063 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003064 for (const auto& s_ext : s_exts) {
3065 if (e_ext.id == s_ext.id) {
3066 EXPECT_EQ(e_ext.uri, s_ext.name);
3067 }
3068 }
3069 }
3070 }
3071
3072 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003073 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003074 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003075 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003076 EXPECT_NE(nullptr, s);
3077 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3078 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003079}
3080
3081TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3082 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003083 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003084 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003085 static const unsigned char kRtcp[] = {
3086 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3087 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3088 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3089 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3090 };
jbaucheec21bd2016-03-20 06:15:43 -07003091 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003092
solenberg1ac56142015-10-13 03:58:19 -07003093 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003094 cricket::WebRtcVoiceMediaChannel* media_channel =
3095 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003096 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003097 EXPECT_TRUE(media_channel->AddRecvStream(
3098 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3099
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003100 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003101 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003102 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003103 EXPECT_EQ(0, s->received_packets());
3104 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3105 EXPECT_EQ(1, s->received_packets());
3106 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3107 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003108}
Minyue2013aec2015-05-13 14:14:42 +02003109
solenberg0a617e22015-10-20 15:49:38 -07003110// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003111// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003112TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenberg1ac56142015-10-13 03:58:19 -07003113 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003114 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003115 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003116 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3117 int recv_ch = voe_.GetLastChannel();
3118 EXPECT_NE(recv_ch, default_channel);
3119 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3120 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3121 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003122 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3123 recv_ch = voe_.GetLastChannel();
3124 EXPECT_NE(recv_ch, default_channel);
3125 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003126}
3127
3128TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003129 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003130 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003131
3132 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3133 int recv_ch = voe_.GetLastChannel();
3134
3135 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3136 int send_ch = voe_.GetLastChannel();
3137
3138 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3139 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3140 // channel of |recv_ch|.This is not a common case, since, normally, only the
3141 // default channel can be associated. However, the default is not deletable.
3142 // So we force the |recv_ch| to associate with a non-default channel.
3143 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3144 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3145
3146 EXPECT_TRUE(channel_->RemoveSendStream(2));
3147 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3148}
stefan658910c2015-09-03 05:48:32 -07003149
deadbeef884f5852016-01-15 09:20:04 -08003150TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
3151 EXPECT_TRUE(SetupEngine());
kwiberg686a8ef2016-02-26 03:00:35 -08003152 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3153 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003154
3155 // Setting the sink before a recv stream exists should do nothing.
3156 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3157 EXPECT_TRUE(
3158 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3159 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3160
3161 // Now try actually setting the sink.
3162 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3163 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3164
3165 // Now try resetting it.
3166 channel_->SetRawAudioSink(kSsrc1, nullptr);
3167 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3168}
3169
3170TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
3171 EXPECT_TRUE(SetupEngine());
kwiberg686a8ef2016-02-26 03:00:35 -08003172 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3173 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003174
3175 // Should be able to set a default sink even when no stream exists.
3176 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3177
3178 // Create default channel and ensure it's assigned the default sink.
3179 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3180 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3181
3182 // Try resetting the default sink.
3183 channel_->SetRawAudioSink(0, nullptr);
3184 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3185
3186 // Try setting the default sink while the default stream exists.
3187 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3188 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3189
3190 // If we remove and add a default stream, it should get the same sink.
3191 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3192 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3193 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3194}
3195
stefan658910c2015-09-03 05:48:32 -07003196// Tests that the library initializes and shuts down properly.
3197TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3198 cricket::WebRtcVoiceEngine engine;
3199 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
kwiberg686a8ef2016-02-26 03:00:35 -08003200 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003201 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003202 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3203 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003204 EXPECT_TRUE(channel != nullptr);
3205 delete channel;
3206 engine.Terminate();
3207
3208 // Reinit to catch regression where VoiceEngineObserver reference is lost
3209 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3210 engine.Terminate();
3211}
3212
3213// Tests that the library is configured with the codecs we want.
3214TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003215 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003216 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3217 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0), nullptr));
3218 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3219 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0), nullptr));
3220 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3221 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003222 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003223 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3224 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0), nullptr));
3225 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3226 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0), nullptr));
3227 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3228 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0), nullptr));
3229 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3230 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0), nullptr));
3231 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3232 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0), nullptr));
3233 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3234 cricket::AudioCodec(96, "red", 8000, 0, 1, 0), nullptr));
3235 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3236 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0), nullptr));
3237 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3238 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0), nullptr));
3239 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3240 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0), nullptr));
3241 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3242 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003243 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003244 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3245 cricket::AudioCodec(0, "", 8000, 0, 1, 0), nullptr)); // PCMU
3246 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3247 cricket::AudioCodec(8, "", 8000, 0, 1, 0), nullptr)); // PCMA
3248 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3249 cricket::AudioCodec(9, "", 8000, 0, 1, 0), nullptr)); // G722
3250 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3251 cricket::AudioCodec(13, "", 8000, 0, 1, 0), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003252 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003253 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3254 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003255 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003256 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3257 cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0), nullptr));
3258 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3259 cricket::AudioCodec(88, "", 0, 0, 1, 0), nullptr));
3260 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3261 cricket::AudioCodec(0, "", 0, 0, 2, 0), nullptr));
3262 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3263 cricket::AudioCodec(0, "", 5000, 0, 1, 0), nullptr));
3264 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3265 cricket::AudioCodec(0, "", 0, 5000, 1, 0), nullptr));
3266
stefan658910c2015-09-03 05:48:32 -07003267 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenberg26c8c912015-11-27 04:00:25 -08003268 cricket::WebRtcVoiceEngine engine;
stefan658910c2015-09-03 05:48:32 -07003269 for (std::vector<cricket::AudioCodec>::const_iterator it =
3270 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3271 if (it->name == "CN" && it->clockrate == 16000) {
3272 EXPECT_EQ(105, it->id);
3273 } else if (it->name == "CN" && it->clockrate == 32000) {
3274 EXPECT_EQ(106, it->id);
3275 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3276 EXPECT_EQ(103, it->id);
3277 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3278 EXPECT_EQ(104, it->id);
3279 } else if (it->name == "G722" && it->clockrate == 8000) {
3280 EXPECT_EQ(9, it->id);
3281 } else if (it->name == "telephone-event") {
3282 EXPECT_EQ(126, it->id);
3283 } else if (it->name == "red") {
3284 EXPECT_EQ(127, it->id);
3285 } else if (it->name == "opus") {
3286 EXPECT_EQ(111, it->id);
3287 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3288 EXPECT_EQ("10", it->params.find("minptime")->second);
3289 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3290 EXPECT_EQ("60", it->params.find("maxptime")->second);
3291 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3292 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3293 }
3294 }
stefan658910c2015-09-03 05:48:32 -07003295 engine.Terminate();
3296}
3297
3298// Tests that VoE supports at least 32 channels
3299TEST(WebRtcVoiceEngineTest, Has32Channels) {
3300 cricket::WebRtcVoiceEngine engine;
3301 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
kwiberg686a8ef2016-02-26 03:00:35 -08003302 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003303 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003304
3305 cricket::VoiceMediaChannel* channels[32];
3306 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003307 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003308 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3309 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003310 if (!channel)
3311 break;
stefan658910c2015-09-03 05:48:32 -07003312 channels[num_channels++] = channel;
3313 }
3314
tfarina5237aaf2015-11-10 23:44:30 -08003315 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003316 EXPECT_EQ(expected, num_channels);
3317
3318 while (num_channels > 0) {
3319 delete channels[--num_channels];
3320 }
stefan658910c2015-09-03 05:48:32 -07003321 engine.Terminate();
3322}
3323
3324// Test that we set our preferred codecs properly.
3325TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3326 cricket::WebRtcVoiceEngine engine;
3327 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
kwiberg686a8ef2016-02-26 03:00:35 -08003328 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003329 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003330 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3331 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003332 cricket::AudioRecvParameters parameters;
3333 parameters.codecs = engine.codecs();
3334 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003335}