blob: 97773b7134bcff06ba8b0677fa4b89cb0f8cdfec [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
solenbergff976312016-03-30 23:28:51 -070062// Tests that our stub library "works".
63TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
64 cricket::FakeWebRtcVoiceEngine voe;
65 EXPECT_FALSE(voe.IsInited());
66 {
67 cricket::WebRtcVoiceEngine engine(nullptr, new FakeVoEWrapper(&voe));
68 EXPECT_TRUE(voe.IsInited());
69 }
70 EXPECT_FALSE(voe.IsInited());
71}
72
deadbeef884f5852016-01-15 09:20:04 -080073class FakeAudioSink : public webrtc::AudioSinkInterface {
74 public:
75 void OnData(const Data& audio) override {}
76};
77
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080078class FakeAudioSource : public cricket::AudioSource {
79 void SetSink(Sink* sink) override {}
80};
81
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082class WebRtcVoiceEngineTestFake : public testing::Test {
83 public:
stefanba4c0e42016-02-04 04:12:24 -080084 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
85
86 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
Fredrik Solenberg709ed672015-09-15 12:26:33 +020087 : call_(webrtc::Call::Config()),
solenbergff976312016-03-30 23:28:51 -070088 engine_(nullptr, new FakeVoEWrapper(&voe_)),
stefanba4c0e42016-02-04 04:12:24 -080089 override_field_trials_(field_trials) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +020090 send_parameters_.codecs.push_back(kPcmuCodec);
91 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000092 }
solenbergff976312016-03-30 23:28:51 -070093 bool SetupChannel() {
nisse51542be2016-02-12 02:27:06 -080094 channel_ = engine_.CreateChannel(&call_, cricket::MediaConfig(),
95 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +020096 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000097 }
solenbergff976312016-03-30 23:28:51 -070098 bool SetupRecvStream() {
99 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700100 return false;
101 }
102 return channel_->AddRecvStream(
103 cricket::StreamParams::CreateLegacy(kSsrc1));
104 }
solenbergff976312016-03-30 23:28:51 -0700105 bool SetupSendStream() {
106 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000107 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000108 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800109 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
110 return false;
111 }
112 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000113 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000114 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700115 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700116 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800117 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700118 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700119 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800120 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000121 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000122 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700123 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000124 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000125 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200126 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000127 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000128 }
129
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100130 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
131 const auto* send_stream = call_.GetAudioSendStream(ssrc);
132 EXPECT_TRUE(send_stream);
133 return *send_stream;
134 }
135
deadbeef884f5852016-01-15 09:20:04 -0800136 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
137 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
138 EXPECT_TRUE(recv_stream);
139 return *recv_stream;
140 }
141
solenberg3a941542015-11-16 07:34:50 -0800142 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800143 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800144 }
145
solenberg7add0582015-11-20 09:59:34 -0800146 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800147 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800148 }
149
Peter Boström0c4e06b2015-10-07 12:23:21 +0200150 void TestInsertDtmf(uint32_t ssrc, bool caller) {
solenbergff976312016-03-30 23:28:51 -0700151 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000152 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700153 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000154 // send stream.
155 EXPECT_TRUE(channel_->AddSendStream(
156 cricket::StreamParams::CreateLegacy(kSsrc1)));
157 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000158
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000159 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200160 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800161 channel_->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000162 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800163 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200164 send_parameters_.codecs.push_back(kTelephoneEventCodec);
165 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000166 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000167
168 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700169 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800170 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000171 EXPECT_TRUE(channel_->AddSendStream(
172 cricket::StreamParams::CreateLegacy(kSsrc1)));
173 }
174
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000175 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800176 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000177
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100178 // Test send.
179 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
180 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
181 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800182 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100183 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
184 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
185 EXPECT_EQ(2, telephone_event.event_code);
186 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000187 }
188
189 // Test that send bandwidth is set correctly.
190 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000191 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
192 // |expected_result| is the expected result from SetMaxSendBandwidth().
193 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000194 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000195 int max_bitrate,
196 bool expected_result,
197 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200198 cricket::AudioSendParameters parameters;
199 parameters.codecs.push_back(codec);
200 parameters.max_bandwidth_bps = max_bitrate;
201 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
202
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000203 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000204 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000205 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000206 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000207 }
208
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000209 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700210 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000211
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000212 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800213 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000214
215 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200216 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000217 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200218 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800219 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000220
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000221 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200222 send_parameters_.extensions.clear();
223 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800224 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000225
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000226 // Ensure extension is set properly.
227 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200228 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
229 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800230 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
231 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
232 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000233
solenberg7add0582015-11-20 09:59:34 -0800234 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000235 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700236 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800237 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
238 call_.GetAudioSendStream(kSsrc2));
239 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
240 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
241 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000242
243 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200244 send_parameters_.codecs.push_back(kPcmuCodec);
245 send_parameters_.extensions.clear();
246 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800247 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
248 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000249 }
250
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000251 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700252 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000253
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000254 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800255 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000256
257 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800258 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000259 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800260 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
261 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000262
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000263 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800264 recv_parameters_.extensions.clear();
265 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
266 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000267
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000268 // Ensure extension is set properly.
269 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800270 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
271 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
272 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
273 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
274 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000275
solenberg7add0582015-11-20 09:59:34 -0800276 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000277 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700278 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800279 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
280 call_.GetAudioReceiveStream(kSsrc2));
281 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
282 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
283 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000284
285 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800286 recv_parameters_.extensions.clear();
287 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
288 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
289 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000290 }
291
solenberg85a04962015-10-27 03:35:21 -0700292 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
293 webrtc::AudioSendStream::Stats stats;
294 stats.local_ssrc = 12;
295 stats.bytes_sent = 345;
296 stats.packets_sent = 678;
297 stats.packets_lost = 9012;
298 stats.fraction_lost = 34.56f;
299 stats.codec_name = "codec_name_send";
300 stats.ext_seqnum = 789;
301 stats.jitter_ms = 12;
302 stats.rtt_ms = 345;
303 stats.audio_level = 678;
304 stats.aec_quality_min = 9.01f;
305 stats.echo_delay_median_ms = 234;
306 stats.echo_delay_std_ms = 567;
307 stats.echo_return_loss = 890;
308 stats.echo_return_loss_enhancement = 1234;
309 stats.typing_noise_detected = true;
310 return stats;
311 }
312 void SetAudioSendStreamStats() {
313 for (auto* s : call_.GetAudioSendStreams()) {
314 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200315 }
solenberg85a04962015-10-27 03:35:21 -0700316 }
solenberg566ef242015-11-06 15:34:49 -0800317 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
318 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700319 const auto stats = GetAudioSendStreamStats();
320 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
321 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
322 EXPECT_EQ(info.packets_sent, stats.packets_sent);
323 EXPECT_EQ(info.packets_lost, stats.packets_lost);
324 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
325 EXPECT_EQ(info.codec_name, stats.codec_name);
326 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
327 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
328 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
329 EXPECT_EQ(info.audio_level, stats.audio_level);
330 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
331 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
332 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
333 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
334 EXPECT_EQ(info.echo_return_loss_enhancement,
335 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800336 EXPECT_EQ(info.typing_noise_detected,
337 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700338 }
339
340 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
341 webrtc::AudioReceiveStream::Stats stats;
342 stats.remote_ssrc = 123;
343 stats.bytes_rcvd = 456;
344 stats.packets_rcvd = 768;
345 stats.packets_lost = 101;
346 stats.fraction_lost = 23.45f;
347 stats.codec_name = "codec_name_recv";
348 stats.ext_seqnum = 678;
349 stats.jitter_ms = 901;
350 stats.jitter_buffer_ms = 234;
351 stats.jitter_buffer_preferred_ms = 567;
352 stats.delay_estimate_ms = 890;
353 stats.audio_level = 1234;
354 stats.expand_rate = 5.67f;
355 stats.speech_expand_rate = 8.90f;
356 stats.secondary_decoded_rate = 1.23f;
357 stats.accelerate_rate = 4.56f;
358 stats.preemptive_expand_rate = 7.89f;
359 stats.decoding_calls_to_silence_generator = 12;
360 stats.decoding_calls_to_neteq = 345;
361 stats.decoding_normal = 67890;
362 stats.decoding_plc = 1234;
363 stats.decoding_cng = 5678;
364 stats.decoding_plc_cng = 9012;
365 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200366 return stats;
367 }
368 void SetAudioReceiveStreamStats() {
369 for (auto* s : call_.GetAudioReceiveStreams()) {
370 s->SetStats(GetAudioReceiveStreamStats());
371 }
372 }
373 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700374 const auto stats = GetAudioReceiveStreamStats();
375 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
376 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
377 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
378 EXPECT_EQ(info.packets_lost, stats.packets_lost);
379 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
380 EXPECT_EQ(info.codec_name, stats.codec_name);
381 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
382 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
383 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200384 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700385 stats.jitter_buffer_preferred_ms);
386 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
387 EXPECT_EQ(info.audio_level, stats.audio_level);
388 EXPECT_EQ(info.expand_rate, stats.expand_rate);
389 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
390 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
391 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
392 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200393 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700394 stats.decoding_calls_to_silence_generator);
395 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
396 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
397 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
398 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
399 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
400 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200401 }
402
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000403 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200404 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000405 cricket::FakeWebRtcVoiceEngine voe_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000406 cricket::WebRtcVoiceEngine engine_;
solenbergff976312016-03-30 23:28:51 -0700407 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200408 cricket::AudioSendParameters send_parameters_;
409 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800410 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800411
412 private:
413 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000414};
415
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000416// Tests that we can create and destroy a channel.
417TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700418 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000419}
420
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000421// Tests that the list of supported codecs is created properly and ordered
422// correctly
423TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
424 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
425 ASSERT_FALSE(codecs.empty());
426 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
427 EXPECT_EQ(48000, codecs[0].clockrate);
428 EXPECT_EQ(2, codecs[0].channels);
429 EXPECT_EQ(64000, codecs[0].bitrate);
430 int pref = codecs[0].preference;
431 for (size_t i = 1; i < codecs.size(); ++i) {
432 EXPECT_GT(pref, codecs[i].preference);
433 pref = codecs[i].preference;
434 }
435}
436
stefanba4c0e42016-02-04 04:12:24 -0800437TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
438 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
439 bool opus_found = false;
440 for (cricket::AudioCodec codec : codecs) {
441 if (codec.name == "opus") {
442 EXPECT_TRUE(HasTransportCc(codec));
443 opus_found = true;
444 }
445 }
446 EXPECT_TRUE(opus_found);
447}
448
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000449// Tests that we can find codecs by name or id, and that we interpret the
450// clockrate and bitrate fields properly.
451TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
452 cricket::AudioCodec codec;
453 webrtc::CodecInst codec_inst;
454 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800455 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000456 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800457 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000458 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800459 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
460 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000461 // Find ISAC with a different payload id.
462 codec = kIsacCodec;
463 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800464 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000465 EXPECT_EQ(codec.id, codec_inst.pltype);
466 // Find PCMU with a 0 clockrate.
467 codec = kPcmuCodec;
468 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800469 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000470 EXPECT_EQ(codec.id, codec_inst.pltype);
471 EXPECT_EQ(8000, codec_inst.plfreq);
472 // Find PCMU with a 0 bitrate.
473 codec = kPcmuCodec;
474 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800475 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000476 EXPECT_EQ(codec.id, codec_inst.pltype);
477 EXPECT_EQ(64000, codec_inst.rate);
478 // Find ISAC with an explicit bitrate.
479 codec = kIsacCodec;
480 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800481 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000482 EXPECT_EQ(codec.id, codec_inst.pltype);
483 EXPECT_EQ(32000, codec_inst.rate);
484}
485
486// Test that we set our inbound codecs properly, including changing PT.
487TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700488 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200489 cricket::AudioRecvParameters parameters;
490 parameters.codecs.push_back(kIsacCodec);
491 parameters.codecs.push_back(kPcmuCodec);
492 parameters.codecs.push_back(kTelephoneEventCodec);
493 parameters.codecs[0].id = 106; // collide with existing telephone-event
494 parameters.codecs[2].id = 126;
495 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700496 EXPECT_TRUE(channel_->AddRecvStream(
497 cricket::StreamParams::CreateLegacy(kSsrc1)));
498 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000499 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800500 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000501 gcodec.plfreq = 16000;
502 gcodec.channels = 1;
503 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
504 EXPECT_EQ(106, gcodec.pltype);
505 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800506 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000507 gcodec.plfreq = 8000;
508 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
509 EXPECT_EQ(126, gcodec.pltype);
510 EXPECT_STREQ("telephone-event", gcodec.plname);
511}
512
513// Test that we fail to set an unknown inbound codec.
514TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700515 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200516 cricket::AudioRecvParameters parameters;
517 parameters.codecs.push_back(kIsacCodec);
518 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
519 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000520}
521
522// Test that we fail if we have duplicate types in the inbound list.
523TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700524 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200525 cricket::AudioRecvParameters parameters;
526 parameters.codecs.push_back(kIsacCodec);
527 parameters.codecs.push_back(kCn16000Codec);
528 parameters.codecs[1].id = kIsacCodec.id;
529 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000530}
531
532// Test that we can decode OPUS without stereo parameters.
533TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700534 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200535 cricket::AudioRecvParameters parameters;
536 parameters.codecs.push_back(kIsacCodec);
537 parameters.codecs.push_back(kPcmuCodec);
538 parameters.codecs.push_back(kOpusCodec);
539 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000540 EXPECT_TRUE(channel_->AddRecvStream(
541 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700542 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000543 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800544 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000545 // Even without stereo parameters, recv codecs still specify channels = 2.
546 EXPECT_EQ(2, opus.channels);
547 EXPECT_EQ(111, opus.pltype);
548 EXPECT_STREQ("opus", opus.plname);
549 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700550 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000551 EXPECT_EQ(111, opus.pltype);
552}
553
554// Test that we can decode OPUS with stereo = 0.
555TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700556 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200557 cricket::AudioRecvParameters parameters;
558 parameters.codecs.push_back(kIsacCodec);
559 parameters.codecs.push_back(kPcmuCodec);
560 parameters.codecs.push_back(kOpusCodec);
561 parameters.codecs[2].params["stereo"] = "0";
562 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000563 EXPECT_TRUE(channel_->AddRecvStream(
564 cricket::StreamParams::CreateLegacy(kSsrc1)));
565 int channel_num2 = voe_.GetLastChannel();
566 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800567 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000568 // Even when stereo is off, recv codecs still specify channels = 2.
569 EXPECT_EQ(2, opus.channels);
570 EXPECT_EQ(111, opus.pltype);
571 EXPECT_STREQ("opus", opus.plname);
572 opus.pltype = 0;
573 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
574 EXPECT_EQ(111, opus.pltype);
575}
576
577// Test that we can decode OPUS with stereo = 1.
578TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700579 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200580 cricket::AudioRecvParameters parameters;
581 parameters.codecs.push_back(kIsacCodec);
582 parameters.codecs.push_back(kPcmuCodec);
583 parameters.codecs.push_back(kOpusCodec);
584 parameters.codecs[2].params["stereo"] = "1";
585 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000586 EXPECT_TRUE(channel_->AddRecvStream(
587 cricket::StreamParams::CreateLegacy(kSsrc1)));
588 int channel_num2 = voe_.GetLastChannel();
589 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800590 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000591 EXPECT_EQ(2, opus.channels);
592 EXPECT_EQ(111, opus.pltype);
593 EXPECT_STREQ("opus", opus.plname);
594 opus.pltype = 0;
595 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
596 EXPECT_EQ(111, opus.pltype);
597}
598
599// Test that changes to recv codecs are applied to all streams.
600TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700601 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200602 cricket::AudioRecvParameters parameters;
603 parameters.codecs.push_back(kIsacCodec);
604 parameters.codecs.push_back(kPcmuCodec);
605 parameters.codecs.push_back(kTelephoneEventCodec);
606 parameters.codecs[0].id = 106; // collide with existing telephone-event
607 parameters.codecs[2].id = 126;
608 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000609 EXPECT_TRUE(channel_->AddRecvStream(
610 cricket::StreamParams::CreateLegacy(kSsrc1)));
611 int channel_num2 = voe_.GetLastChannel();
612 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800613 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000614 gcodec.plfreq = 16000;
615 gcodec.channels = 1;
616 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
617 EXPECT_EQ(106, gcodec.pltype);
618 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800619 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000620 gcodec.plfreq = 8000;
621 gcodec.channels = 1;
622 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
623 EXPECT_EQ(126, gcodec.pltype);
624 EXPECT_STREQ("telephone-event", gcodec.plname);
625}
626
627TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700628 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200629 cricket::AudioRecvParameters parameters;
630 parameters.codecs.push_back(kIsacCodec);
631 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200632 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000633
634 int channel_num2 = voe_.GetLastChannel();
635 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800636 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000637 gcodec.plfreq = 16000;
638 gcodec.channels = 1;
639 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
640 EXPECT_EQ(106, gcodec.pltype);
641 EXPECT_STREQ("ISAC", gcodec.plname);
642}
643
644// Test that we can apply the same set of codecs again while playing.
645TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700646 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200647 cricket::AudioRecvParameters parameters;
648 parameters.codecs.push_back(kIsacCodec);
649 parameters.codecs.push_back(kCn16000Codec);
650 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000651 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200652 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000653
654 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200655 parameters.codecs[0].id = 127;
656 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
657 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000658 EXPECT_TRUE(voe_.GetPlayout(channel_num));
659}
660
661// Test that we can add a codec while playing.
662TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700663 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200664 cricket::AudioRecvParameters parameters;
665 parameters.codecs.push_back(kIsacCodec);
666 parameters.codecs.push_back(kCn16000Codec);
667 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000668 EXPECT_TRUE(channel_->SetPlayout(true));
669
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200670 parameters.codecs.push_back(kOpusCodec);
671 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
672 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000673 EXPECT_TRUE(voe_.GetPlayout(channel_num));
674 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800675 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000676 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
677}
678
679TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700680 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000681
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000682 // Test that when autobw is enabled, bitrate is kept as the default
683 // value. autobw is enabled for the following tests because the target
684 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000685
686 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000687 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000688
689 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000690 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000691
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000693 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000694}
695
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000696TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700697 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000698
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000699 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000700
701 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000702 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
703 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000704
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000705 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000706 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
707 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000708}
709
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000710TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700711 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000712
713 // Test that we can only set a maximum bitrate for a fixed-rate codec
714 // if it's bigger than the fixed rate.
715
716 // PCMU, fixed bitrate == 64000.
717 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
718 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
719 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
720 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
721 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
722 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
723 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
724}
725
726TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700727 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200728 const int kDesiredBitrate = 128000;
729 cricket::AudioSendParameters parameters;
730 parameters.codecs = engine_.codecs();
731 parameters.max_bandwidth_bps = kDesiredBitrate;
732 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000733
734 EXPECT_TRUE(channel_->AddSendStream(
735 cricket::StreamParams::CreateLegacy(kSsrc1)));
736
737 int channel_num = voe_.GetLastChannel();
738 webrtc::CodecInst codec;
739 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200740 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000741}
742
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000743// Test that bitrate cannot be set for CBR codecs.
744// Bitrate is ignored if it is higher than the fixed bitrate.
745// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000746TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700747 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000748
749 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200750 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
751 int channel_num = voe_.GetLastChannel();
752 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000753 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
754 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200755
756 send_parameters_.max_bandwidth_bps = 128000;
757 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000758 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
759 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200760
761 send_parameters_.max_bandwidth_bps = 128;
762 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000763 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
764 EXPECT_EQ(64000, codec.rate);
765}
766
767// Test that we apply codecs properly.
768TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -0700769 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200770 cricket::AudioSendParameters parameters;
771 parameters.codecs.push_back(kIsacCodec);
772 parameters.codecs.push_back(kPcmuCodec);
773 parameters.codecs.push_back(kRedCodec);
774 parameters.codecs[0].id = 96;
775 parameters.codecs[0].bitrate = 48000;
776 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000777 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200778 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000779 webrtc::CodecInst gcodec;
780 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
781 EXPECT_EQ(96, gcodec.pltype);
782 EXPECT_EQ(48000, gcodec.rate);
783 EXPECT_STREQ("ISAC", gcodec.plname);
784 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000785 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000786 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
787 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100788 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000789}
790
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000791// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
792// to apply.
793TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -0700794 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200795 cricket::AudioSendParameters parameters;
796 parameters.codecs.push_back(kIsacCodec);
797 parameters.codecs.push_back(kPcmuCodec);
798 parameters.codecs.push_back(kRedCodec);
799 parameters.codecs[0].id = 96;
800 parameters.codecs[0].bitrate = 48000;
801 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000802 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
803 // Calling SetSendCodec again with same codec which is already set.
804 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200805 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000806 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
807}
808
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000809// Verify that G722 is set with 16000 samples per second to WebRTC.
810TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -0700811 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000812 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200813 cricket::AudioSendParameters parameters;
814 parameters.codecs.push_back(kG722CodecSdp);
815 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000816 webrtc::CodecInst gcodec;
817 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
818 EXPECT_STREQ("G722", gcodec.plname);
819 EXPECT_EQ(1, gcodec.channels);
820 EXPECT_EQ(16000, gcodec.plfreq);
821}
822
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000823// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000824TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -0700825 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200826 cricket::AudioSendParameters parameters;
827 parameters.codecs.push_back(kOpusCodec);
828 parameters.codecs[0].bitrate = 0;
829 parameters.codecs[0].clockrate = 50000;
830 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000831}
832
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000833// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000834TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700835 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200836 cricket::AudioSendParameters parameters;
837 parameters.codecs.push_back(kOpusCodec);
838 parameters.codecs[0].bitrate = 0;
839 parameters.codecs[0].channels = 0;
840 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000841}
842
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000843// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000844TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700845 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200846 cricket::AudioSendParameters parameters;
847 parameters.codecs.push_back(kOpusCodec);
848 parameters.codecs[0].bitrate = 0;
849 parameters.codecs[0].channels = 0;
850 parameters.codecs[0].params["stereo"] = "1";
851 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000852}
853
854// Test that if channel is 1 for opus and there's no stereo, we fail.
855TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700856 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200857 cricket::AudioSendParameters parameters;
858 parameters.codecs.push_back(kOpusCodec);
859 parameters.codecs[0].bitrate = 0;
860 parameters.codecs[0].channels = 1;
861 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000862}
863
864// Test that if channel is 1 for opus and stereo=0, we fail.
865TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700866 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200867 cricket::AudioSendParameters parameters;
868 parameters.codecs.push_back(kOpusCodec);
869 parameters.codecs[0].bitrate = 0;
870 parameters.codecs[0].channels = 1;
871 parameters.codecs[0].params["stereo"] = "0";
872 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000873}
874
875// Test that if channel is 1 for opus and stereo=1, we fail.
876TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700877 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200878 cricket::AudioSendParameters parameters;
879 parameters.codecs.push_back(kOpusCodec);
880 parameters.codecs[0].bitrate = 0;
881 parameters.codecs[0].channels = 1;
882 parameters.codecs[0].params["stereo"] = "1";
883 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000884}
885
886// Test that with bitrate=0 and no stereo,
887// channels and bitrate are 1 and 32000.
888TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700889 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000890 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200891 cricket::AudioSendParameters parameters;
892 parameters.codecs.push_back(kOpusCodec);
893 parameters.codecs[0].bitrate = 0;
894 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000895 webrtc::CodecInst gcodec;
896 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
897 EXPECT_STREQ("opus", gcodec.plname);
898 EXPECT_EQ(1, gcodec.channels);
899 EXPECT_EQ(32000, gcodec.rate);
900}
901
902// Test that with bitrate=0 and stereo=0,
903// channels and bitrate are 1 and 32000.
904TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700905 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000906 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200907 cricket::AudioSendParameters parameters;
908 parameters.codecs.push_back(kOpusCodec);
909 parameters.codecs[0].bitrate = 0;
910 parameters.codecs[0].params["stereo"] = "0";
911 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000912 webrtc::CodecInst gcodec;
913 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
914 EXPECT_STREQ("opus", gcodec.plname);
915 EXPECT_EQ(1, gcodec.channels);
916 EXPECT_EQ(32000, gcodec.rate);
917}
918
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000919// Test that with bitrate=invalid and stereo=0,
920// channels and bitrate are 1 and 32000.
921TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700922 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000923 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200924 cricket::AudioSendParameters parameters;
925 parameters.codecs.push_back(kOpusCodec);
926 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000927 webrtc::CodecInst gcodec;
928
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000929 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200930 parameters.codecs[0].bitrate = 5999;
931 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000932 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
933 EXPECT_STREQ("opus", gcodec.plname);
934 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000935 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000936
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200937 parameters.codecs[0].bitrate = 510001;
938 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000939 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
940 EXPECT_STREQ("opus", gcodec.plname);
941 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000942 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000943}
944
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000945// Test that with bitrate=0 and stereo=1,
946// channels and bitrate are 2 and 64000.
947TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700948 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000949 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200950 cricket::AudioSendParameters parameters;
951 parameters.codecs.push_back(kOpusCodec);
952 parameters.codecs[0].bitrate = 0;
953 parameters.codecs[0].params["stereo"] = "1";
954 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000955 webrtc::CodecInst gcodec;
956 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
957 EXPECT_STREQ("opus", gcodec.plname);
958 EXPECT_EQ(2, gcodec.channels);
959 EXPECT_EQ(64000, gcodec.rate);
960}
961
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000962// Test that with bitrate=invalid and stereo=1,
963// channels and bitrate are 2 and 64000.
964TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700965 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000966 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200967 cricket::AudioSendParameters parameters;
968 parameters.codecs.push_back(kOpusCodec);
969 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000970 webrtc::CodecInst gcodec;
971
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000972 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200973 parameters.codecs[0].bitrate = 5999;
974 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000975 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
976 EXPECT_STREQ("opus", gcodec.plname);
977 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000978 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000979
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200980 parameters.codecs[0].bitrate = 510001;
981 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000982 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
983 EXPECT_STREQ("opus", gcodec.plname);
984 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000985 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000986}
987
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000988// Test that with bitrate=N and stereo unset,
989// channels and bitrate are 1 and N.
990TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700991 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000992 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200993 cricket::AudioSendParameters parameters;
994 parameters.codecs.push_back(kOpusCodec);
995 parameters.codecs[0].bitrate = 96000;
996 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000997 webrtc::CodecInst gcodec;
998 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
999 EXPECT_EQ(111, gcodec.pltype);
1000 EXPECT_EQ(96000, gcodec.rate);
1001 EXPECT_STREQ("opus", gcodec.plname);
1002 EXPECT_EQ(1, gcodec.channels);
1003 EXPECT_EQ(48000, gcodec.plfreq);
1004}
1005
1006// Test that with bitrate=N and stereo=0,
1007// channels and bitrate are 1 and N.
1008TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001009 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001010 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001011 cricket::AudioSendParameters parameters;
1012 parameters.codecs.push_back(kOpusCodec);
1013 parameters.codecs[0].bitrate = 30000;
1014 parameters.codecs[0].params["stereo"] = "0";
1015 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001016 webrtc::CodecInst gcodec;
1017 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1018 EXPECT_EQ(1, gcodec.channels);
1019 EXPECT_EQ(30000, gcodec.rate);
1020 EXPECT_STREQ("opus", gcodec.plname);
1021}
1022
1023// Test that with bitrate=N and without any parameters,
1024// channels and bitrate are 1 and N.
1025TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001026 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001027 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001028 cricket::AudioSendParameters parameters;
1029 parameters.codecs.push_back(kOpusCodec);
1030 parameters.codecs[0].bitrate = 30000;
1031 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001032 webrtc::CodecInst gcodec;
1033 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1034 EXPECT_EQ(1, gcodec.channels);
1035 EXPECT_EQ(30000, gcodec.rate);
1036 EXPECT_STREQ("opus", gcodec.plname);
1037}
1038
1039// Test that with bitrate=N and stereo=1,
1040// channels and bitrate are 2 and N.
1041TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001042 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001043 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001044 cricket::AudioSendParameters parameters;
1045 parameters.codecs.push_back(kOpusCodec);
1046 parameters.codecs[0].bitrate = 30000;
1047 parameters.codecs[0].params["stereo"] = "1";
1048 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001049 webrtc::CodecInst gcodec;
1050 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1051 EXPECT_EQ(2, gcodec.channels);
1052 EXPECT_EQ(30000, gcodec.rate);
1053 EXPECT_STREQ("opus", gcodec.plname);
1054}
1055
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001056// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1057// Also test that the "maxaveragebitrate" can't be set to values outside the
1058// range of 6000 and 510000
1059TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001060 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001061 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001062 cricket::AudioSendParameters parameters;
1063 parameters.codecs.push_back(kOpusCodec);
1064 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001065 webrtc::CodecInst gcodec;
1066
1067 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001068 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1069 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001070 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001071 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001072
1073 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001074 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1075 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001076 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001077 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001078
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001079 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1080 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001081 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1082 EXPECT_EQ(200000, gcodec.rate);
1083}
1084
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001085// Test that we can enable NACK with opus as caller.
1086TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001087 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001088 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001089 cricket::AudioSendParameters parameters;
1090 parameters.codecs.push_back(kOpusCodec);
1091 parameters.codecs[0].AddFeedbackParam(
1092 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1093 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001094 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001095 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001096 EXPECT_TRUE(voe_.GetNACK(channel_num));
1097}
1098
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001099// Test that we can enable NACK with opus as callee.
1100TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001101 EXPECT_TRUE(SetupRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001102 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001103 cricket::AudioSendParameters parameters;
1104 parameters.codecs.push_back(kOpusCodec);
1105 parameters.codecs[0].AddFeedbackParam(
1106 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1107 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001108 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001109 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001110 EXPECT_FALSE(voe_.GetNACK(channel_num));
1111
1112 EXPECT_TRUE(channel_->AddSendStream(
1113 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001114 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001115}
1116
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001117// Test that we can enable NACK on receive streams.
1118TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001119 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001120 int channel_num1 = voe_.GetLastChannel();
1121 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1122 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001123 cricket::AudioSendParameters parameters;
1124 parameters.codecs.push_back(kOpusCodec);
1125 parameters.codecs[0].AddFeedbackParam(
1126 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1127 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001128 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1129 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001130 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001131 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1132 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1133}
1134
1135// Test that we can disable NACK.
1136TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001137 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001138 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001139 cricket::AudioSendParameters parameters;
1140 parameters.codecs.push_back(kOpusCodec);
1141 parameters.codecs[0].AddFeedbackParam(
1142 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1143 cricket::kParamValueEmpty));
1144 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001145 EXPECT_TRUE(voe_.GetNACK(channel_num));
1146
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001147 parameters.codecs.clear();
1148 parameters.codecs.push_back(kOpusCodec);
1149 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001150 EXPECT_FALSE(voe_.GetNACK(channel_num));
1151}
1152
1153// Test that we can disable NACK on receive streams.
1154TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001155 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001156 int channel_num1 = voe_.GetLastChannel();
1157 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1158 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001159 cricket::AudioSendParameters parameters;
1160 parameters.codecs.push_back(kOpusCodec);
1161 parameters.codecs[0].AddFeedbackParam(
1162 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1163 cricket::kParamValueEmpty));
1164 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001165 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1166 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1167
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001168 parameters.codecs.clear();
1169 parameters.codecs.push_back(kOpusCodec);
1170 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001171 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1172 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1173}
1174
1175// Test that NACK is enabled on a new receive stream.
1176TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001177 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001178 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001179 cricket::AudioSendParameters parameters;
1180 parameters.codecs.push_back(kIsacCodec);
1181 parameters.codecs.push_back(kCn16000Codec);
1182 parameters.codecs[0].AddFeedbackParam(
1183 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1184 cricket::kParamValueEmpty));
1185 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001186 EXPECT_TRUE(voe_.GetNACK(channel_num));
1187
1188 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1189 channel_num = voe_.GetLastChannel();
1190 EXPECT_TRUE(voe_.GetNACK(channel_num));
1191 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1192 channel_num = voe_.GetLastChannel();
1193 EXPECT_TRUE(voe_.GetNACK(channel_num));
1194}
1195
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001196// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001197TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001198 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001199 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001200 cricket::AudioSendParameters parameters;
1201 parameters.codecs.push_back(kOpusCodec);
1202 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001203 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1204}
1205
1206// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001207TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001208 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001209 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001210 cricket::AudioSendParameters parameters;
1211 parameters.codecs.push_back(kOpusCodec);
1212 parameters.codecs[0].bitrate = 0;
1213 parameters.codecs[0].params["useinbandfec"] = "0";
1214 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001215 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1216 webrtc::CodecInst gcodec;
1217 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1218 EXPECT_STREQ("opus", gcodec.plname);
1219 EXPECT_EQ(1, gcodec.channels);
1220 EXPECT_EQ(32000, gcodec.rate);
1221}
1222
1223// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001224TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001225 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001226 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001227 cricket::AudioSendParameters parameters;
1228 parameters.codecs.push_back(kOpusCodec);
1229 parameters.codecs[0].bitrate = 0;
1230 parameters.codecs[0].params["useinbandfec"] = "1";
1231 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001232 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1233 webrtc::CodecInst gcodec;
1234 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1235 EXPECT_STREQ("opus", gcodec.plname);
1236 EXPECT_EQ(1, gcodec.channels);
1237 EXPECT_EQ(32000, gcodec.rate);
1238}
1239
1240// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001241TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001242 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001243 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001244 cricket::AudioSendParameters parameters;
1245 parameters.codecs.push_back(kOpusCodec);
1246 parameters.codecs[0].bitrate = 0;
1247 parameters.codecs[0].params["stereo"] = "1";
1248 parameters.codecs[0].params["useinbandfec"] = "1";
1249 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001250 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1251 webrtc::CodecInst gcodec;
1252 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1253 EXPECT_STREQ("opus", gcodec.plname);
1254 EXPECT_EQ(2, gcodec.channels);
1255 EXPECT_EQ(64000, gcodec.rate);
1256}
1257
1258// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001259TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001260 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001261 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001262 cricket::AudioSendParameters parameters;
1263 parameters.codecs.push_back(kIsacCodec);
1264 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001265 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1266}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001267
1268// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1269TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001270 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001271 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001272 cricket::AudioSendParameters parameters;
1273 parameters.codecs.push_back(kIsacCodec);
1274 parameters.codecs[0].params["useinbandfec"] = "1";
1275 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001276 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1277}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001278
1279// Test that Opus FEC status can be changed.
1280TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001281 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001282 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001283 cricket::AudioSendParameters parameters;
1284 parameters.codecs.push_back(kOpusCodec);
1285 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001286 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001287 parameters.codecs[0].params["useinbandfec"] = "1";
1288 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001289 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1290}
1291
stefanba4c0e42016-02-04 04:12:24 -08001292TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001293 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001294 cricket::AudioSendParameters send_parameters;
1295 send_parameters.codecs.push_back(kOpusCodec);
1296 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1297 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1298
1299 cricket::AudioRecvParameters recv_parameters;
1300 recv_parameters.codecs.push_back(kIsacCodec);
1301 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1302 EXPECT_TRUE(
1303 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1304 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1305 EXPECT_FALSE(
1306 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1307
1308 send_parameters.codecs = engine_.codecs();
1309 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1310 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1311 EXPECT_TRUE(
1312 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1313}
1314
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001315// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1316TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001317 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001318 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001319 cricket::AudioSendParameters parameters;
1320 parameters.codecs.push_back(kOpusCodec);
1321 parameters.codecs[0].bitrate = 0;
1322 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1323 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001324 EXPECT_EQ(cricket::kOpusBandwidthNb,
1325 voe_.GetMaxEncodingBandwidth(channel_num));
1326 webrtc::CodecInst gcodec;
1327 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1328 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001329
1330 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001331 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1332 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001333 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1334 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001335}
1336
1337// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1338TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001339 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001340 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001341 cricket::AudioSendParameters parameters;
1342 parameters.codecs.push_back(kOpusCodec);
1343 parameters.codecs[0].bitrate = 0;
1344 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1345 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001346 EXPECT_EQ(cricket::kOpusBandwidthMb,
1347 voe_.GetMaxEncodingBandwidth(channel_num));
1348 webrtc::CodecInst gcodec;
1349 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1350 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001351
1352 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001353 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1354 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001355 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1356 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001357}
1358
1359// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1360TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001361 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001362 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001363 cricket::AudioSendParameters parameters;
1364 parameters.codecs.push_back(kOpusCodec);
1365 parameters.codecs[0].bitrate = 0;
1366 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1367 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001368 EXPECT_EQ(cricket::kOpusBandwidthWb,
1369 voe_.GetMaxEncodingBandwidth(channel_num));
1370 webrtc::CodecInst gcodec;
1371 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1372 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001373
1374 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001375 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1376 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001377 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1378 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001379}
1380
1381// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1382TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001383 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001384 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001385 cricket::AudioSendParameters parameters;
1386 parameters.codecs.push_back(kOpusCodec);
1387 parameters.codecs[0].bitrate = 0;
1388 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1389 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001390 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1391 voe_.GetMaxEncodingBandwidth(channel_num));
1392 webrtc::CodecInst gcodec;
1393 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1394 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001395
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001396 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001397 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1398 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001399 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1400 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001401}
1402
1403// Test 24000 < maxplaybackrate triggers Opus full band mode.
1404TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001405 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001406 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001407 cricket::AudioSendParameters parameters;
1408 parameters.codecs.push_back(kOpusCodec);
1409 parameters.codecs[0].bitrate = 0;
1410 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1411 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001412 EXPECT_EQ(cricket::kOpusBandwidthFb,
1413 voe_.GetMaxEncodingBandwidth(channel_num));
1414 webrtc::CodecInst gcodec;
1415 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1416 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001417
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001418 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001419 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1420 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001421 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1422 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001423}
1424
1425// Test Opus that without maxplaybackrate, default playback rate is used.
1426TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001427 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001428 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001429 cricket::AudioSendParameters parameters;
1430 parameters.codecs.push_back(kOpusCodec);
1431 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001432 EXPECT_EQ(cricket::kOpusBandwidthFb,
1433 voe_.GetMaxEncodingBandwidth(channel_num));
1434}
1435
1436// Test the with non-Opus, maxplaybackrate has no effect.
1437TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001438 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001439 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001440 cricket::AudioSendParameters parameters;
1441 parameters.codecs.push_back(kIsacCodec);
1442 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1443 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001444 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1445}
1446
1447// Test maxplaybackrate can be set on two streams.
1448TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001449 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001450 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001451 cricket::AudioSendParameters parameters;
1452 parameters.codecs.push_back(kOpusCodec);
1453 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001454 // Default bandwidth is 24000.
1455 EXPECT_EQ(cricket::kOpusBandwidthFb,
1456 voe_.GetMaxEncodingBandwidth(channel_num));
1457
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001458 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001459
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001460 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001461 EXPECT_EQ(cricket::kOpusBandwidthNb,
1462 voe_.GetMaxEncodingBandwidth(channel_num));
1463
1464 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1465 channel_num = voe_.GetLastChannel();
1466 EXPECT_EQ(cricket::kOpusBandwidthNb,
1467 voe_.GetMaxEncodingBandwidth(channel_num));
1468}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001469
Minyue Li7100dcd2015-03-27 05:05:59 +01001470// Test that with usedtx=0, Opus DTX is off.
1471TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001472 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001473 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001474 cricket::AudioSendParameters parameters;
1475 parameters.codecs.push_back(kOpusCodec);
1476 parameters.codecs[0].params["usedtx"] = "0";
1477 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001478 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1479}
1480
1481// Test that with usedtx=1, Opus DTX is on.
1482TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001483 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001484 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001485 cricket::AudioSendParameters parameters;
1486 parameters.codecs.push_back(kOpusCodec);
1487 parameters.codecs[0].params["usedtx"] = "1";
1488 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001489 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1490 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1491}
1492
1493// Test that usedtx=1 works with stereo Opus.
1494TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001495 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001496 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001497 cricket::AudioSendParameters parameters;
1498 parameters.codecs.push_back(kOpusCodec);
1499 parameters.codecs[0].params["usedtx"] = "1";
1500 parameters.codecs[0].params["stereo"] = "1";
1501 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001502 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1503 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1504}
1505
1506// Test that usedtx=1 does not work with non Opus.
1507TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001508 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001509 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001510 cricket::AudioSendParameters parameters;
1511 parameters.codecs.push_back(kIsacCodec);
1512 parameters.codecs[0].params["usedtx"] = "1";
1513 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001514 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1515}
1516
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001517// Test that we can switch back and forth between Opus and ISAC with CN.
1518TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001519 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001520 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001521 cricket::AudioSendParameters opus_parameters;
1522 opus_parameters.codecs.push_back(kOpusCodec);
1523 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001524 webrtc::CodecInst gcodec;
1525 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001526 EXPECT_EQ(111, gcodec.pltype);
1527 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001528
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001529 cricket::AudioSendParameters isac_parameters;
1530 isac_parameters.codecs.push_back(kIsacCodec);
1531 isac_parameters.codecs.push_back(kCn16000Codec);
1532 isac_parameters.codecs.push_back(kOpusCodec);
1533 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001534 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1535 EXPECT_EQ(103, gcodec.pltype);
1536 EXPECT_STREQ("ISAC", gcodec.plname);
1537
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001538 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001539 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001540 EXPECT_EQ(111, gcodec.pltype);
1541 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001542}
1543
1544// Test that we handle various ways of specifying bitrate.
1545TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001546 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001547 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001548 cricket::AudioSendParameters parameters;
1549 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1550 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001551 webrtc::CodecInst gcodec;
1552 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1553 EXPECT_EQ(103, gcodec.pltype);
1554 EXPECT_STREQ("ISAC", gcodec.plname);
1555 EXPECT_EQ(32000, gcodec.rate);
1556
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001557 parameters.codecs[0].bitrate = 0; // bitrate == default
1558 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001559 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1560 EXPECT_EQ(103, gcodec.pltype);
1561 EXPECT_STREQ("ISAC", gcodec.plname);
1562 EXPECT_EQ(-1, gcodec.rate);
1563
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001564 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1565 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001566 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1567 EXPECT_EQ(103, gcodec.pltype);
1568 EXPECT_STREQ("ISAC", gcodec.plname);
1569 EXPECT_EQ(28000, gcodec.rate);
1570
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001571 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1572 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001573 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1574 EXPECT_EQ(0, gcodec.pltype);
1575 EXPECT_STREQ("PCMU", gcodec.plname);
1576 EXPECT_EQ(64000, gcodec.rate);
1577
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001578 parameters.codecs[0].bitrate = 0; // bitrate == default
1579 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001580 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1581 EXPECT_EQ(0, gcodec.pltype);
1582 EXPECT_STREQ("PCMU", gcodec.plname);
1583 EXPECT_EQ(64000, gcodec.rate);
1584
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001585 parameters.codecs[0] = kOpusCodec;
1586 parameters.codecs[0].bitrate = 0; // bitrate == default
1587 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001588 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1589 EXPECT_EQ(111, gcodec.pltype);
1590 EXPECT_STREQ("opus", gcodec.plname);
1591 EXPECT_EQ(32000, gcodec.rate);
1592}
1593
Brave Yao5225dd82015-03-26 07:39:19 +08001594// Test that we could set packet size specified in kCodecParamPTime.
1595TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001596 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001597 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001598 cricket::AudioSendParameters parameters;
1599 parameters.codecs.push_back(kOpusCodec);
1600 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1601 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001602 webrtc::CodecInst gcodec;
1603 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1604 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1605
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001606 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1607 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001608 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1609 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1610
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001611 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1612 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001613 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1614 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1615
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001616 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1617 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1618 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001619 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1620 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1621
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001622 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1623 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1624 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001625 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1626 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1627}
1628
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001629// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001630TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001631 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001632 cricket::AudioSendParameters parameters;
1633 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001634}
1635
1636// Test that we can set send codecs even with telephone-event codec as the first
1637// one on the list.
1638TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001639 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001640 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001641 cricket::AudioSendParameters parameters;
1642 parameters.codecs.push_back(kTelephoneEventCodec);
1643 parameters.codecs.push_back(kIsacCodec);
1644 parameters.codecs.push_back(kPcmuCodec);
1645 parameters.codecs[0].id = 98; // DTMF
1646 parameters.codecs[1].id = 96;
1647 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001648 webrtc::CodecInst gcodec;
1649 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001650 EXPECT_EQ(96, gcodec.pltype);
1651 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001652 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001653}
1654
solenberg31642aa2016-03-14 08:00:37 -07001655// Test that payload type range is limited for telephone-event codec.
1656TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001657 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001658 cricket::AudioSendParameters parameters;
1659 parameters.codecs.push_back(kTelephoneEventCodec);
1660 parameters.codecs.push_back(kIsacCodec);
1661 parameters.codecs[0].id = 0; // DTMF
1662 parameters.codecs[1].id = 96;
1663 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1664 EXPECT_TRUE(channel_->CanInsertDtmf());
1665 parameters.codecs[0].id = 128; // DTMF
1666 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1667 EXPECT_FALSE(channel_->CanInsertDtmf());
1668 parameters.codecs[0].id = 127;
1669 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1670 EXPECT_TRUE(channel_->CanInsertDtmf());
1671 parameters.codecs[0].id = -1; // DTMF
1672 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1673 EXPECT_FALSE(channel_->CanInsertDtmf());
1674}
1675
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001676// Test that we can set send codecs even with CN codec as the first
1677// one on the list.
1678TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001679 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001680 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001681 cricket::AudioSendParameters parameters;
1682 parameters.codecs.push_back(kCn16000Codec);
1683 parameters.codecs.push_back(kIsacCodec);
1684 parameters.codecs.push_back(kPcmuCodec);
1685 parameters.codecs[0].id = 98; // wideband CN
1686 parameters.codecs[1].id = 96;
1687 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001688 webrtc::CodecInst gcodec;
1689 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1690 EXPECT_EQ(96, gcodec.pltype);
1691 EXPECT_STREQ("ISAC", gcodec.plname);
1692 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001693}
1694
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001695// Test that we set VAD and DTMF types correctly as caller.
1696TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001697 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001698 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001699 cricket::AudioSendParameters parameters;
1700 parameters.codecs.push_back(kIsacCodec);
1701 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001702 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001703 parameters.codecs.push_back(kCn16000Codec);
1704 parameters.codecs.push_back(kCn8000Codec);
1705 parameters.codecs.push_back(kTelephoneEventCodec);
1706 parameters.codecs.push_back(kRedCodec);
1707 parameters.codecs[0].id = 96;
1708 parameters.codecs[2].id = 97; // wideband CN
1709 parameters.codecs[4].id = 98; // DTMF
1710 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001711 webrtc::CodecInst gcodec;
1712 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1713 EXPECT_EQ(96, gcodec.pltype);
1714 EXPECT_STREQ("ISAC", gcodec.plname);
1715 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001716 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001717 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1718 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001719 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001720}
1721
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001722// Test that we set VAD and DTMF types correctly as callee.
1723TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001724 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001725 cricket::AudioSendParameters parameters;
1726 parameters.codecs.push_back(kIsacCodec);
1727 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001728 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001729 parameters.codecs.push_back(kCn16000Codec);
1730 parameters.codecs.push_back(kCn8000Codec);
1731 parameters.codecs.push_back(kTelephoneEventCodec);
1732 parameters.codecs.push_back(kRedCodec);
1733 parameters.codecs[0].id = 96;
1734 parameters.codecs[2].id = 97; // wideband CN
1735 parameters.codecs[4].id = 98; // DTMF
1736 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001737 EXPECT_TRUE(channel_->AddSendStream(
1738 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001739 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001740
1741 webrtc::CodecInst gcodec;
1742 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1743 EXPECT_EQ(96, gcodec.pltype);
1744 EXPECT_STREQ("ISAC", gcodec.plname);
1745 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001746 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001747 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1748 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001749 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001750}
1751
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001752// Test that we only apply VAD if we have a CN codec that matches the
1753// send codec clockrate.
1754TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07001755 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001756 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001757 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001758 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001759 parameters.codecs.push_back(kIsacCodec);
1760 parameters.codecs.push_back(kCn16000Codec);
1761 parameters.codecs[1].id = 97;
1762 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001763 webrtc::CodecInst gcodec;
1764 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1765 EXPECT_STREQ("ISAC", gcodec.plname);
1766 EXPECT_TRUE(voe_.GetVAD(channel_num));
1767 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1768 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001769 parameters.codecs[0] = kPcmuCodec;
1770 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001771 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1772 EXPECT_STREQ("PCMU", gcodec.plname);
1773 EXPECT_FALSE(voe_.GetVAD(channel_num));
1774 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001775 parameters.codecs[1] = kCn8000Codec;
1776 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001777 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1778 EXPECT_STREQ("PCMU", gcodec.plname);
1779 EXPECT_TRUE(voe_.GetVAD(channel_num));
1780 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001781 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001782 parameters.codecs[0] = kIsacCodec;
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("ISAC", gcodec.plname);
1786 EXPECT_FALSE(voe_.GetVAD(channel_num));
1787}
1788
1789// Test that we perform case-insensitive matching of codec names.
1790TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07001791 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001792 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001793 cricket::AudioSendParameters parameters;
1794 parameters.codecs.push_back(kIsacCodec);
1795 parameters.codecs.push_back(kPcmuCodec);
1796 parameters.codecs.push_back(kCn16000Codec);
1797 parameters.codecs.push_back(kCn8000Codec);
1798 parameters.codecs.push_back(kTelephoneEventCodec);
1799 parameters.codecs.push_back(kRedCodec);
1800 parameters.codecs[0].name = "iSaC";
1801 parameters.codecs[0].id = 96;
1802 parameters.codecs[2].id = 97; // wideband CN
1803 parameters.codecs[4].id = 98; // DTMF
1804 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001805 webrtc::CodecInst gcodec;
1806 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1807 EXPECT_EQ(96, gcodec.pltype);
1808 EXPECT_STREQ("ISAC", gcodec.plname);
1809 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001810 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001811 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1812 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001813 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001814}
1815
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001816// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001817TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001818 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001819 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001820 cricket::AudioSendParameters parameters;
1821 parameters.codecs.push_back(kRedCodec);
1822 parameters.codecs.push_back(kIsacCodec);
1823 parameters.codecs.push_back(kPcmuCodec);
1824 parameters.codecs[0].id = 127;
1825 parameters.codecs[0].params[""] = "96/96";
1826 parameters.codecs[1].id = 96;
1827 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001828 webrtc::CodecInst gcodec;
1829 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1830 EXPECT_EQ(96, gcodec.pltype);
1831 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001832 EXPECT_TRUE(voe_.GetRED(channel_num));
1833 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001834}
1835
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001836// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001837TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001838 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001839 cricket::AudioSendParameters parameters;
1840 parameters.codecs.push_back(kRedCodec);
1841 parameters.codecs.push_back(kIsacCodec);
1842 parameters.codecs.push_back(kPcmuCodec);
1843 parameters.codecs[0].id = 127;
1844 parameters.codecs[0].params[""] = "96/96";
1845 parameters.codecs[1].id = 96;
1846 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001847 EXPECT_TRUE(channel_->AddSendStream(
1848 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001849 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001850 webrtc::CodecInst gcodec;
1851 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1852 EXPECT_EQ(96, gcodec.pltype);
1853 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001854 EXPECT_TRUE(voe_.GetRED(channel_num));
1855 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001856}
1857
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001858// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001859TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenbergff976312016-03-30 23:28:51 -07001860 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001861 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001862 cricket::AudioSendParameters parameters;
1863 parameters.codecs.push_back(kRedCodec);
1864 parameters.codecs.push_back(kIsacCodec);
1865 parameters.codecs.push_back(kPcmuCodec);
1866 parameters.codecs[0].id = 127;
1867 parameters.codecs[1].id = 96;
1868 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001869 webrtc::CodecInst gcodec;
1870 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1871 EXPECT_EQ(96, gcodec.pltype);
1872 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001873 EXPECT_TRUE(voe_.GetRED(channel_num));
1874 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001875}
1876
1877// Test that we ignore RED if the parameters aren't named the way we expect.
1878TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenbergff976312016-03-30 23:28:51 -07001879 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001880 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001881 cricket::AudioSendParameters parameters;
1882 parameters.codecs.push_back(kRedCodec);
1883 parameters.codecs.push_back(kIsacCodec);
1884 parameters.codecs.push_back(kPcmuCodec);
1885 parameters.codecs[0].id = 127;
1886 parameters.codecs[0].params["ABC"] = "96/96";
1887 parameters.codecs[1].id = 96;
1888 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001889 webrtc::CodecInst gcodec;
1890 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1891 EXPECT_EQ(96, gcodec.pltype);
1892 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001893 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001894}
1895
1896// Test that we ignore RED if it uses different primary/secondary encoding.
1897TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenbergff976312016-03-30 23:28:51 -07001898 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001899 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001900 cricket::AudioSendParameters parameters;
1901 parameters.codecs.push_back(kRedCodec);
1902 parameters.codecs.push_back(kIsacCodec);
1903 parameters.codecs.push_back(kPcmuCodec);
1904 parameters.codecs[0].id = 127;
1905 parameters.codecs[0].params[""] = "96/0";
1906 parameters.codecs[1].id = 96;
1907 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001908 webrtc::CodecInst gcodec;
1909 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1910 EXPECT_EQ(96, gcodec.pltype);
1911 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001912 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001913}
1914
1915// Test that we ignore RED if it uses more than 2 encodings.
1916TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenbergff976312016-03-30 23:28:51 -07001917 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001918 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001919 cricket::AudioSendParameters parameters;
1920 parameters.codecs.push_back(kRedCodec);
1921 parameters.codecs.push_back(kIsacCodec);
1922 parameters.codecs.push_back(kPcmuCodec);
1923 parameters.codecs[0].id = 127;
1924 parameters.codecs[0].params[""] = "96/96/96";
1925 parameters.codecs[1].id = 96;
1926 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001927 webrtc::CodecInst gcodec;
1928 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1929 EXPECT_EQ(96, gcodec.pltype);
1930 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001931 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001932}
1933
1934// Test that we ignore RED if it has bogus codec ids.
1935TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenbergff976312016-03-30 23:28:51 -07001936 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001937 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001938 cricket::AudioSendParameters parameters;
1939 parameters.codecs.push_back(kRedCodec);
1940 parameters.codecs.push_back(kIsacCodec);
1941 parameters.codecs.push_back(kPcmuCodec);
1942 parameters.codecs[0].id = 127;
1943 parameters.codecs[0].params[""] = "ABC/ABC";
1944 parameters.codecs[1].id = 96;
1945 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001946 webrtc::CodecInst gcodec;
1947 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1948 EXPECT_EQ(96, gcodec.pltype);
1949 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001950 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001951}
1952
1953// Test that we ignore RED if it refers to a codec that is not present.
1954TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenbergff976312016-03-30 23:28:51 -07001955 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001956 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001957 cricket::AudioSendParameters parameters;
1958 parameters.codecs.push_back(kRedCodec);
1959 parameters.codecs.push_back(kIsacCodec);
1960 parameters.codecs.push_back(kPcmuCodec);
1961 parameters.codecs[0].id = 127;
1962 parameters.codecs[0].params[""] = "97/97";
1963 parameters.codecs[1].id = 96;
1964 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001965 webrtc::CodecInst gcodec;
1966 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1967 EXPECT_EQ(96, gcodec.pltype);
1968 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001969 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001970}
1971
stefanba4c0e42016-02-04 04:12:24 -08001972class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
1973 public:
1974 WebRtcVoiceEngineWithSendSideBweTest()
1975 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
1976};
1977
1978TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
1979 SupportsTransportSequenceNumberHeaderExtension) {
1980 cricket::RtpCapabilities capabilities = engine_.GetCapabilities();
1981 ASSERT_FALSE(capabilities.header_extensions.empty());
1982 for (const cricket::RtpHeaderExtension& extension :
1983 capabilities.header_extensions) {
1984 if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
1985 EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
1986 extension.id);
1987 return;
1988 }
1989 }
1990 FAIL() << "Transport sequence number extension not in header-extension list.";
1991}
1992
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001993// Test support for audio level header extension.
1994TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1995 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001996}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001997TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1998 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1999}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002000
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002001// Test support for absolute send time header extension.
2002TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
2003 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
2004}
2005TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
2006 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002007}
2008
solenberg1ac56142015-10-13 03:58:19 -07002009// Test that we can create a channel and start sending on it.
2010TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002011 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002012 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002013 channel_->SetSend(true);
2014 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2015 channel_->SetSend(false);
2016 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2017}
2018
2019// Test that a channel will send if and only if it has a source and is enabled
2020// for sending.
2021TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002022 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002023 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2024 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2025 channel_->SetSend(true);
2026 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2027 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2028 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2029 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2030 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002031}
2032
2033// Test that we can create a channel and start playing out on it.
2034TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002035 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002036 int channel_num = voe_.GetLastChannel();
2037 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2038 EXPECT_TRUE(channel_->SetPlayout(true));
2039 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002040 EXPECT_TRUE(channel_->SetPlayout(false));
2041 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2042}
2043
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002044// Test that we can add and remove send streams.
2045TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2046 SetupForMultiSendStream();
2047
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002048 // Set the global state for sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002049 channel_->SetSend(true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002050
solenbergc96df772015-10-21 13:01:53 -07002051 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002052 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002053 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002054 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002055 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002056 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002057 }
tfarina5237aaf2015-11-10 23:44:30 -08002058 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002059
solenbergc96df772015-10-21 13:01:53 -07002060 // Delete the send streams.
2061 for (uint32_t ssrc : kSsrcs4) {
2062 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002063 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002064 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002065 }
solenbergc96df772015-10-21 13:01:53 -07002066 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002067}
2068
2069// Test SetSendCodecs correctly configure the codecs in all send streams.
2070TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2071 SetupForMultiSendStream();
2072
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002073 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002074 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002075 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002076 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002077 }
2078
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002079 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002080 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002081 parameters.codecs.push_back(kIsacCodec);
2082 parameters.codecs.push_back(kCn16000Codec);
2083 parameters.codecs[1].id = 97;
2084 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002085
2086 // Verify ISAC and VAD are corrected configured on all send channels.
2087 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002088 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002089 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002090 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2091 EXPECT_STREQ("ISAC", gcodec.plname);
2092 EXPECT_TRUE(voe_.GetVAD(channel_num));
2093 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2094 }
2095
2096 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002097 parameters.codecs[0] = kPcmuCodec;
2098 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002099 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002100 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002101 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2102 EXPECT_STREQ("PCMU", gcodec.plname);
2103 EXPECT_FALSE(voe_.GetVAD(channel_num));
2104 }
2105}
2106
2107// Test we can SetSend on all send streams correctly.
2108TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2109 SetupForMultiSendStream();
2110
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002111 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002112 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002113 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002114 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002115 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2116 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002117 }
2118
2119 // Set the global state for starting sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002120 channel_->SetSend(true);
solenbergc96df772015-10-21 13:01:53 -07002121 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002122 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002123 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002124 }
2125
2126 // Set the global state for stopping sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002127 channel_->SetSend(false);
solenbergc96df772015-10-21 13:01:53 -07002128 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002129 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002130 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002131 }
2132}
2133
2134// Test we can set the correct statistics on all send streams.
2135TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2136 SetupForMultiSendStream();
2137
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002138 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002139 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002140 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002141 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002142 }
solenberg85a04962015-10-27 03:35:21 -07002143 SetAudioSendStreamStats();
2144
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002145 // Create a receive stream to check that none of the send streams end up in
2146 // the receive stream stats.
2147 EXPECT_TRUE(channel_->AddRecvStream(
2148 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002149 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002150 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2151 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002152
solenberg85a04962015-10-27 03:35:21 -07002153 // Check stats for the added streams.
2154 {
2155 cricket::VoiceMediaInfo info;
2156 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002157
solenberg85a04962015-10-27 03:35:21 -07002158 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002159 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002160 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002161 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002162 }
2163
2164 // We have added one receive stream. We should see empty stats.
2165 EXPECT_EQ(info.receivers.size(), 1u);
2166 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002167 }
solenberg1ac56142015-10-13 03:58:19 -07002168
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002169 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002170 {
2171 cricket::VoiceMediaInfo info;
2172 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2173 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002174 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002175 EXPECT_EQ(0u, info.receivers.size());
2176 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002177
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002178 // Deliver a new packet - a default receive stream should be created and we
2179 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002180 {
2181 cricket::VoiceMediaInfo info;
2182 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2183 SetAudioReceiveStreamStats();
2184 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002185 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002186 EXPECT_EQ(1u, info.receivers.size());
2187 VerifyVoiceReceiverInfo(info.receivers[0]);
2188 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002189}
2190
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002191// Test that we can add and remove receive streams, and do proper send/playout.
2192// We can receive on multiple streams while sending one stream.
2193TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002194 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002195 int channel_num1 = voe_.GetLastChannel();
2196
solenberg1ac56142015-10-13 03:58:19 -07002197 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002198 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002199 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002200 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002201
solenberg1ac56142015-10-13 03:58:19 -07002202 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002203 EXPECT_TRUE(
2204 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002205 int channel_num2 = voe_.GetLastChannel();
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002206 channel_->SetSend(true);
2207 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002208
solenberg1ac56142015-10-13 03:58:19 -07002209 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002210 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2211 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2212
2213 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002214 EXPECT_TRUE(
2215 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002216 int channel_num3 = voe_.GetLastChannel();
2217 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2218 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2219 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002220
2221 // Stop sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002222 channel_->SetSend(false);
2223 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002224
2225 // Stop playout.
2226 EXPECT_TRUE(channel_->SetPlayout(false));
2227 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2228 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2229 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2230
solenberg1ac56142015-10-13 03:58:19 -07002231 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002232 EXPECT_TRUE(channel_->SetPlayout(true));
2233 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2234 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2235 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2236
solenberg1ac56142015-10-13 03:58:19 -07002237 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002238 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2239 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002240 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002241}
2242
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002243// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002244// and start sending on it.
2245TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002246 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002247 cricket::AudioOptions options_adjust_agc;
2248 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002249 webrtc::AgcConfig agc_config;
2250 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2251 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002252 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002253 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002254 channel_->SetSend(true);
2255 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002256 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2257 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002258 channel_->SetSend(false);
2259 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002260 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002261}
2262
wu@webrtc.org97077a32013-10-25 21:18:33 +00002263TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002264 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002265 webrtc::AgcConfig agc_config;
2266 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2267 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002268 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2269 send_parameters_.options.tx_agc_digital_compression_gain =
2270 rtc::Optional<uint16_t>(9);
2271 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2272 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2273 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002274 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2275 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2276 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2277 EXPECT_TRUE(agc_config.limiterEnable);
2278
2279 // Check interaction with adjust_agc_delta. Both should be respected, for
2280 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002281 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2282 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002283 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2284 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2285}
2286
wu@webrtc.org97077a32013-10-25 21:18:33 +00002287TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002288 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002289 send_parameters_.options.recording_sample_rate =
2290 rtc::Optional<uint32_t>(48000);
2291 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2292 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002293
2294 unsigned int recording_sample_rate, playout_sample_rate;
2295 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2296 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2297 EXPECT_EQ(48000u, recording_sample_rate);
2298 EXPECT_EQ(44100u, playout_sample_rate);
2299}
2300
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002301// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002302// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002303TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002304 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002305 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002306}
2307
2308TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2309 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002310 EXPECT_TRUE(SetupSendStream());
solenberg85a04962015-10-27 03:35:21 -07002311 SetAudioSendStreamStats();
solenbergff976312016-03-30 23:28:51 -07002312 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002313 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002314 EXPECT_TRUE(channel_->AddRecvStream(
2315 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002316 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2317 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002318
solenberg85a04962015-10-27 03:35:21 -07002319 // Check stats for the added streams.
2320 {
2321 cricket::VoiceMediaInfo info;
2322 EXPECT_EQ(true, channel_->GetStats(&info));
2323
2324 // We have added one send stream. We should see the stats we've set.
2325 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002326 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002327 // We have added one receive stream. We should see empty stats.
2328 EXPECT_EQ(info.receivers.size(), 1u);
2329 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2330 }
solenberg1ac56142015-10-13 03:58:19 -07002331
solenberg566ef242015-11-06 15:34:49 -08002332 // Start sending - this affects some reported stats.
2333 {
2334 cricket::VoiceMediaInfo info;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002335 channel_->SetSend(true);
solenberg566ef242015-11-06 15:34:49 -08002336 EXPECT_EQ(true, channel_->GetStats(&info));
2337 VerifyVoiceSenderInfo(info.senders[0], true);
2338 }
2339
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002340 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002341 {
2342 cricket::VoiceMediaInfo info;
2343 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2344 EXPECT_EQ(true, channel_->GetStats(&info));
2345 EXPECT_EQ(1u, info.senders.size());
2346 EXPECT_EQ(0u, info.receivers.size());
2347 }
solenberg1ac56142015-10-13 03:58:19 -07002348
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002349 // Deliver a new packet - a default receive stream should be created and we
2350 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002351 {
2352 cricket::VoiceMediaInfo info;
2353 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2354 SetAudioReceiveStreamStats();
2355 EXPECT_EQ(true, channel_->GetStats(&info));
2356 EXPECT_EQ(1u, info.senders.size());
2357 EXPECT_EQ(1u, info.receivers.size());
2358 VerifyVoiceReceiverInfo(info.receivers[0]);
2359 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002360}
2361
2362// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002363// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002364TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002365 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002366 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002367 EXPECT_TRUE(channel_->AddRecvStream(
2368 cricket::StreamParams::CreateLegacy(kSsrc2)));
2369 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002370}
2371
2372// Test that the local SSRC is the same on sending and receiving channels if the
2373// receive channel is created before the send channel.
2374TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002375 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002376 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2377 int receive_channel_num = voe_.GetLastChannel();
2378 EXPECT_TRUE(channel_->AddSendStream(
2379 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002380
solenberg3a941542015-11-16 07:34:50 -08002381 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002382 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002383}
2384
2385// Test that we can properly receive packets.
2386TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002387 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002388 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002389 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002390 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002391 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002392}
2393
2394// Test that we can properly receive packets on multiple streams.
2395TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002396 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002397 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2398 int channel_num1 = voe_.GetLastChannel();
2399 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2400 int channel_num2 = voe_.GetLastChannel();
2401 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2402 int channel_num3 = voe_.GetLastChannel();
2403 // Create packets with the right SSRCs.
2404 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002405 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002406 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002407 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002408 }
2409 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2410 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2411 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002412
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002413 DeliverPacket(packets[0], sizeof(packets[0]));
2414 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2415 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2416 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002417
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002418 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002419 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002420 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2421 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002422
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002423 DeliverPacket(packets[2], sizeof(packets[2]));
2424 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002425 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002426 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002427
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002428 DeliverPacket(packets[3], sizeof(packets[3]));
2429 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2430 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002431 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2432
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002433 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2434 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2435 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2436}
2437
solenberg7e63ef02015-11-20 00:19:43 -08002438// Test that receiving on an unsignalled stream works (default channel will be
2439// created).
2440TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002441 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002442 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2443 int channel_num = voe_.GetLastChannel();
2444 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2445}
2446
2447// Test that receiving on an unsignalled stream works (default channel will be
2448// created), and that packets will be forwarded to the default channel
2449// regardless of their SSRCs.
2450TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002451 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002452 char packet[sizeof(kPcmuFrame)];
2453 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2454
2455 // Note that the first unknown SSRC cannot be 0, because we only support
2456 // creating receive streams for SSRC!=0.
2457 DeliverPacket(packet, sizeof(packet));
2458 int channel_num = voe_.GetLastChannel();
2459 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2460 // Once we have the default channel, SSRC==0 will be ok.
2461 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2462 rtc::SetBE32(&packet[8], ssrc);
2463 DeliverPacket(packet, sizeof(packet));
2464 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2465 }
2466}
2467
2468// Test that a default channel is created even after a signalled stream has been
2469// added, and that this stream will get any packets for unknown SSRCs.
2470TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002471 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002472 char packet[sizeof(kPcmuFrame)];
2473 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2474
2475 // Add a known stream, send packet and verify we got it.
2476 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2477 int signalled_channel_num = voe_.GetLastChannel();
2478 DeliverPacket(packet, sizeof(packet));
2479 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2480
2481 // Note that the first unknown SSRC cannot be 0, because we only support
2482 // creating receive streams for SSRC!=0.
2483 rtc::SetBE32(&packet[8], 7011);
2484 DeliverPacket(packet, sizeof(packet));
2485 int channel_num = voe_.GetLastChannel();
2486 EXPECT_NE(channel_num, signalled_channel_num);
2487 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2488 // Once we have the default channel, SSRC==0 will be ok.
2489 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2490 rtc::SetBE32(&packet[8], ssrc);
2491 DeliverPacket(packet, sizeof(packet));
2492 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2493 }
2494}
2495
solenberg0a617e22015-10-20 15:49:38 -07002496// Test that we properly handle failures to add a receive stream.
2497TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002498 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002499 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002500 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002501}
2502
solenberg0a617e22015-10-20 15:49:38 -07002503// Test that we properly handle failures to add a send stream.
2504TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002505 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002506 voe_.set_fail_create_channel(true);
2507 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2508}
2509
solenberg1ac56142015-10-13 03:58:19 -07002510// Test that AddRecvStream creates new stream.
2511TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002512 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002513 int channel_num = voe_.GetLastChannel();
2514 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002515 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002516}
2517
2518// Test that after adding a recv stream, we do not decode more codecs than
2519// those previously passed into SetRecvCodecs.
2520TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002521 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002522 cricket::AudioRecvParameters parameters;
2523 parameters.codecs.push_back(kIsacCodec);
2524 parameters.codecs.push_back(kPcmuCodec);
2525 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002526 EXPECT_TRUE(channel_->AddRecvStream(
2527 cricket::StreamParams::CreateLegacy(kSsrc1)));
2528 int channel_num2 = voe_.GetLastChannel();
2529 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002530 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002531 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002532 gcodec.channels = 2;
2533 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2534}
2535
2536// Test that we properly clean up any streams that were added, even if
2537// not explicitly removed.
2538TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002539 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002540 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002541 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2542 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2543 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2544 delete channel_;
2545 channel_ = NULL;
2546 EXPECT_EQ(0, voe_.GetNumChannels());
2547}
2548
wu@webrtc.org78187522013-10-07 23:32:02 +00002549TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002550 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002551 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2552}
2553
2554TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002555 EXPECT_TRUE(SetupChannel());
wu@webrtc.org78187522013-10-07 23:32:02 +00002556 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002557 // Manually delete channel to simulate a failure.
2558 int channel = voe_.GetLastChannel();
2559 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2560 // Add recv stream 2 should work.
2561 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002562 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002563 EXPECT_NE(channel, new_channel);
2564 // The last created channel is deleted too.
2565 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002566}
2567
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002568// Test the InsertDtmf on default send stream as caller.
2569TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2570 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002571}
2572
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002573// Test the InsertDtmf on default send stream as callee
2574TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2575 TestInsertDtmf(0, false);
2576}
2577
2578// Test the InsertDtmf on specified send stream as caller.
2579TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2580 TestInsertDtmf(kSsrc1, true);
2581}
2582
2583// Test the InsertDtmf on specified send stream as callee.
2584TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2585 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002586}
2587
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002588TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002589 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002590 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002591 channel_->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002592 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2593 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2594 EXPECT_TRUE(channel_->SetPlayout(true));
2595 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2596 EXPECT_TRUE(channel_->SetPlayout(false));
2597 EXPECT_FALSE(channel_->SetPlayout(true));
2598}
2599
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002600TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002601 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002602
2603 bool ec_enabled;
2604 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002605 webrtc::AecmModes aecm_mode;
2606 bool cng_enabled;
2607 bool agc_enabled;
2608 webrtc::AgcModes agc_mode;
2609 webrtc::AgcConfig agc_config;
2610 bool ns_enabled;
2611 webrtc::NsModes ns_mode;
2612 bool highpass_filter_enabled;
2613 bool stereo_swapping_enabled;
2614 bool typing_detection_enabled;
2615 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002616 voe_.GetAecmMode(aecm_mode, cng_enabled);
2617 voe_.GetAgcStatus(agc_enabled, agc_mode);
2618 voe_.GetAgcConfig(agc_config);
2619 voe_.GetNsStatus(ns_enabled, ns_mode);
2620 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2621 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2622 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2623 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002624 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002625 EXPECT_FALSE(cng_enabled);
2626 EXPECT_TRUE(agc_enabled);
2627 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2628 EXPECT_TRUE(ns_enabled);
2629 EXPECT_TRUE(highpass_filter_enabled);
2630 EXPECT_FALSE(stereo_swapping_enabled);
2631 EXPECT_TRUE(typing_detection_enabled);
2632 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2633 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002634 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2635 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002636
solenberg246b8172015-12-08 09:50:23 -08002637 // Nothing set in AudioOptions, so everything should be as default.
2638 send_parameters_.options = cricket::AudioOptions();
2639 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002640 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002641 voe_.GetAecmMode(aecm_mode, cng_enabled);
2642 voe_.GetAgcStatus(agc_enabled, agc_mode);
2643 voe_.GetAgcConfig(agc_config);
2644 voe_.GetNsStatus(ns_enabled, ns_mode);
2645 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2646 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2647 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2648 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002649 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002650 EXPECT_FALSE(cng_enabled);
2651 EXPECT_TRUE(agc_enabled);
2652 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2653 EXPECT_TRUE(ns_enabled);
2654 EXPECT_TRUE(highpass_filter_enabled);
2655 EXPECT_FALSE(stereo_swapping_enabled);
2656 EXPECT_TRUE(typing_detection_enabled);
2657 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2658 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002659 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2660 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002661
2662 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002663 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2664 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002665 voe_.GetEcStatus(ec_enabled, ec_mode);
2666 EXPECT_FALSE(ec_enabled);
2667
2668 // Turn echo cancellation back on, with settings, and make sure
2669 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002670 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2671 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002672 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002673 voe_.GetAecmMode(aecm_mode, cng_enabled);
2674 voe_.GetAgcStatus(agc_enabled, agc_mode);
2675 voe_.GetAgcConfig(agc_config);
2676 voe_.GetNsStatus(ns_enabled, ns_mode);
2677 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2678 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2679 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2680 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002681 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002682 EXPECT_TRUE(agc_enabled);
2683 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2684 EXPECT_TRUE(ns_enabled);
2685 EXPECT_TRUE(highpass_filter_enabled);
2686 EXPECT_FALSE(stereo_swapping_enabled);
2687 EXPECT_TRUE(typing_detection_enabled);
2688 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2689 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2690
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002691 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2692 // control.
solenberg246b8172015-12-08 09:50:23 -08002693 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2694 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002695 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002696 voe_.GetAecmMode(aecm_mode, cng_enabled);
2697 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002698 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002699 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2700
2701 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002702 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2703 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2704 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2705 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002706 voe_.GetEcStatus(ec_enabled, ec_mode);
2707 EXPECT_FALSE(ec_enabled);
2708 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002709 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2710 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002711 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002712 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002713 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002714 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2715
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002716 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002717 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2718 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002719 voe_.GetAgcStatus(agc_enabled, agc_mode);
2720 EXPECT_FALSE(agc_enabled);
2721
2722 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002723 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2724 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2725 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002726 voe_.GetAgcStatus(agc_enabled, agc_mode);
2727 EXPECT_TRUE(agc_enabled);
2728 voe_.GetAgcConfig(agc_config);
2729 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2730
2731 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002732 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2733 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2734 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2735 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2736 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002737 voe_.GetNsStatus(ns_enabled, ns_mode);
2738 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2739 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2740 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2741 EXPECT_FALSE(ns_enabled);
2742 EXPECT_FALSE(highpass_filter_enabled);
2743 EXPECT_FALSE(typing_detection_enabled);
2744 EXPECT_TRUE(stereo_swapping_enabled);
2745
solenberg1ac56142015-10-13 03:58:19 -07002746 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002747 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002748 voe_.GetEcStatus(ec_enabled, ec_mode);
2749 voe_.GetNsStatus(ns_enabled, ns_mode);
2750 EXPECT_TRUE(ec_enabled);
2751 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2752 EXPECT_FALSE(ns_enabled);
2753 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2754}
2755
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002756TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002757 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002758
2759 bool ec_enabled;
2760 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002761 bool agc_enabled;
2762 webrtc::AgcModes agc_mode;
2763 bool ns_enabled;
2764 webrtc::NsModes ns_mode;
2765 bool highpass_filter_enabled;
2766 bool stereo_swapping_enabled;
2767 bool typing_detection_enabled;
2768
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002769 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002770 voe_.GetAgcStatus(agc_enabled, agc_mode);
2771 voe_.GetNsStatus(ns_enabled, ns_mode);
2772 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2773 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2774 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2775 EXPECT_TRUE(ec_enabled);
2776 EXPECT_TRUE(agc_enabled);
2777 EXPECT_TRUE(ns_enabled);
2778 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002779 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002780 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002781}
2782
2783TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2784 webrtc::AgcConfig set_config = {0};
2785 set_config.targetLeveldBOv = 3;
2786 set_config.digitalCompressionGaindB = 9;
2787 set_config.limiterEnable = true;
2788 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002789
2790 webrtc::AgcConfig config = {0};
2791 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2792 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2793 EXPECT_EQ(set_config.digitalCompressionGaindB,
2794 config.digitalCompressionGaindB);
2795 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2796}
2797
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002798TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002799 EXPECT_TRUE(SetupSendStream());
kwiberg686a8ef2016-02-26 03:00:35 -08002800 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
nisse51542be2016-02-12 02:27:06 -08002801 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_.CreateChannel(
2802 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002803 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
nisse51542be2016-02-12 02:27:06 -08002804 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_.CreateChannel(
2805 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002806
2807 // Have to add a stream to make SetSend work.
2808 cricket::StreamParams stream1;
2809 stream1.ssrcs.push_back(1);
2810 channel1->AddSendStream(stream1);
2811 cricket::StreamParams stream2;
2812 stream2.ssrcs.push_back(2);
2813 channel2->AddSendStream(stream2);
2814
2815 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002816 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002817 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2818 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2819 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002820 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2821 EXPECT_EQ(parameters_options_all.options, channel1->options());
2822 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2823 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002824
2825 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002826 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002827 parameters_options_no_ns.options.noise_suppression =
2828 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002829 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2830 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002831 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2832 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2833 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002834 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002835
2836 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002837 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002838 parameters_options_no_agc.options.auto_gain_control =
2839 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002840 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002841 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2842 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2843 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002844 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002845
solenberg246b8172015-12-08 09:50:23 -08002846 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002847 bool ec_enabled;
2848 webrtc::EcModes ec_mode;
2849 bool agc_enabled;
2850 webrtc::AgcModes agc_mode;
2851 bool ns_enabled;
2852 webrtc::NsModes ns_mode;
2853 voe_.GetEcStatus(ec_enabled, ec_mode);
2854 voe_.GetAgcStatus(agc_enabled, agc_mode);
2855 voe_.GetNsStatus(ns_enabled, ns_mode);
2856 EXPECT_TRUE(ec_enabled);
2857 EXPECT_TRUE(agc_enabled);
2858 EXPECT_TRUE(ns_enabled);
2859
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002860 channel1->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002861 voe_.GetEcStatus(ec_enabled, ec_mode);
2862 voe_.GetAgcStatus(agc_enabled, agc_mode);
2863 voe_.GetNsStatus(ns_enabled, ns_mode);
2864 EXPECT_TRUE(ec_enabled);
2865 EXPECT_TRUE(agc_enabled);
2866 EXPECT_FALSE(ns_enabled);
2867
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002868 channel2->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002869 voe_.GetEcStatus(ec_enabled, ec_mode);
2870 voe_.GetAgcStatus(agc_enabled, agc_mode);
2871 voe_.GetNsStatus(ns_enabled, ns_mode);
2872 EXPECT_TRUE(ec_enabled);
2873 EXPECT_FALSE(agc_enabled);
2874 EXPECT_TRUE(ns_enabled);
2875
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002876 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08002877 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002878 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2879 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002880 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01002881 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07002882 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01002883 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002884 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002885 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01002886 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2887 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2888 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002889 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002890 voe_.GetEcStatus(ec_enabled, ec_mode);
2891 voe_.GetAgcStatus(agc_enabled, agc_mode);
2892 voe_.GetNsStatus(ns_enabled, ns_mode);
2893 EXPECT_TRUE(ec_enabled);
2894 EXPECT_FALSE(agc_enabled);
2895 EXPECT_FALSE(ns_enabled);
2896}
2897
wu@webrtc.orgde305012013-10-31 15:40:38 +00002898// This test verifies DSCP settings are properly applied on voice media channel.
2899TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07002900 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08002901 cricket::FakeNetworkInterface network_interface;
2902 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08002903 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08002904
2905 channel.reset(engine_.CreateChannel(&call_, config, cricket::AudioOptions()));
2906 channel->SetInterface(&network_interface);
2907 // Default value when DSCP is disabled should be DSCP_DEFAULT.
2908 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
2909
2910 config.enable_dscp = true;
2911 channel.reset(engine_.CreateChannel(&call_, config, cricket::AudioOptions()));
2912 channel->SetInterface(&network_interface);
2913 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
2914
2915 // Verify that setting the option to false resets the
2916 // DiffServCodePoint.
2917 config.enable_dscp = false;
2918 channel.reset(engine_.CreateChannel(&call_, config, cricket::AudioOptions()));
2919 channel->SetInterface(&network_interface);
2920 // Default value when DSCP is disabled should be DSCP_DEFAULT.
2921 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
2922
2923 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00002924}
2925
solenberg1ac56142015-10-13 03:58:19 -07002926TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07002927 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002928 cricket::WebRtcVoiceMediaChannel* media_channel =
2929 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002930 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2931 EXPECT_TRUE(channel_->AddRecvStream(
2932 cricket::StreamParams::CreateLegacy(kSsrc1)));
2933 int channel_id = voe_.GetLastChannel();
2934 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2935 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2936 EXPECT_TRUE(channel_->AddRecvStream(
2937 cricket::StreamParams::CreateLegacy(kSsrc2)));
2938 int channel_id2 = voe_.GetLastChannel();
2939 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002940}
2941
solenberg1ac56142015-10-13 03:58:19 -07002942TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07002943 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002944 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002945 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2946 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2947 EXPECT_TRUE(channel_->AddSendStream(
2948 cricket::StreamParams::CreateLegacy(kSsrc1)));
2949 int channel_id = voe_.GetLastChannel();
2950 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2951 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2952 EXPECT_TRUE(channel_->AddSendStream(
2953 cricket::StreamParams::CreateLegacy(kSsrc2)));
2954 int channel_id2 = voe_.GetLastChannel();
2955 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002956}
2957
solenberg4bac9c52015-10-09 02:32:53 -07002958TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07002959 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07002960 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002961 cricket::StreamParams stream;
2962 stream.ssrcs.push_back(kSsrc2);
2963 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002964 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002965 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002966 float scale = 0;
2967 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2968 EXPECT_DOUBLE_EQ(3, scale);
2969}
2970
2971TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002972 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07002973 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2974 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2975 int channel_id = voe_.GetLastChannel();
2976 float scale = 0;
2977 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2978 EXPECT_DOUBLE_EQ(2, scale);
2979 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07002980 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002981 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002982}
2983
pbos8fc7fa72015-07-15 08:02:58 -07002984TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02002985 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07002986 const std::string kSyncLabel = "AvSyncLabel";
2987
solenbergff976312016-03-30 23:28:51 -07002988 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07002989 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
2990 sp.sync_label = kSyncLabel;
2991 // Creating two channels to make sure that sync label is set properly for both
2992 // the default voice channel and following ones.
2993 EXPECT_TRUE(channel_->AddRecvStream(sp));
2994 sp.ssrcs[0] += 1;
2995 EXPECT_TRUE(channel_->AddRecvStream(sp));
2996
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002997 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07002998 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002999 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003000 << "SyncGroup should be set based on sync_label";
3001 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003002 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003003 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003004}
3005
solenberg3a941542015-11-16 07:34:50 -08003006// TODO(solenberg): Remove, once recv streams are configured through Call.
3007// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003008TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003009 // Test that setting the header extensions results in the expected state
3010 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003011 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003012 ssrcs.push_back(223);
3013 ssrcs.push_back(224);
3014
solenbergff976312016-03-30 23:28:51 -07003015 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003016 cricket::WebRtcVoiceMediaChannel* media_channel =
3017 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003018 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003019 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003020 EXPECT_TRUE(media_channel->AddRecvStream(
3021 cricket::StreamParams::CreateLegacy(ssrc)));
3022 }
3023
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003024 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003025 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003026 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003027 EXPECT_NE(nullptr, s);
3028 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3029 }
3030
3031 // Set up receive extensions.
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003032 cricket::RtpCapabilities capabilities = engine_.GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003033 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003034 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003035 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003036 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003037 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003038 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003039 EXPECT_NE(nullptr, s);
3040 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003041 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3042 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003043 for (const auto& s_ext : s_exts) {
3044 if (e_ext.id == s_ext.id) {
3045 EXPECT_EQ(e_ext.uri, s_ext.name);
3046 }
3047 }
3048 }
3049 }
3050
3051 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003052 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003053 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003054 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003055 EXPECT_NE(nullptr, s);
3056 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3057 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003058}
3059
3060TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3061 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003062 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003063 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003064 static const unsigned char kRtcp[] = {
3065 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3066 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3067 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3068 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3069 };
jbaucheec21bd2016-03-20 06:15:43 -07003070 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003071
solenbergff976312016-03-30 23:28:51 -07003072 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003073 cricket::WebRtcVoiceMediaChannel* media_channel =
3074 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003075 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003076 EXPECT_TRUE(media_channel->AddRecvStream(
3077 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3078
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003079 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003080 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003081 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003082 EXPECT_EQ(0, s->received_packets());
3083 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3084 EXPECT_EQ(1, s->received_packets());
3085 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3086 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003087}
Minyue2013aec2015-05-13 14:14:42 +02003088
solenberg0a617e22015-10-20 15:49:38 -07003089// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003090// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003091TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003092 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003093 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003094 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003095 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3096 int recv_ch = voe_.GetLastChannel();
3097 EXPECT_NE(recv_ch, default_channel);
3098 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3099 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3100 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003101 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3102 recv_ch = voe_.GetLastChannel();
3103 EXPECT_NE(recv_ch, default_channel);
3104 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003105}
3106
3107TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003108 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003109 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003110
3111 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3112 int recv_ch = voe_.GetLastChannel();
3113
3114 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3115 int send_ch = voe_.GetLastChannel();
3116
3117 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3118 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3119 // channel of |recv_ch|.This is not a common case, since, normally, only the
3120 // default channel can be associated. However, the default is not deletable.
3121 // So we force the |recv_ch| to associate with a non-default channel.
3122 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3123 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3124
3125 EXPECT_TRUE(channel_->RemoveSendStream(2));
3126 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3127}
stefan658910c2015-09-03 05:48:32 -07003128
deadbeef884f5852016-01-15 09:20:04 -08003129TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003130 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003131 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3132 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003133
3134 // Setting the sink before a recv stream exists should do nothing.
3135 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3136 EXPECT_TRUE(
3137 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3138 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3139
3140 // Now try actually setting the sink.
3141 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3142 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3143
3144 // Now try resetting it.
3145 channel_->SetRawAudioSink(kSsrc1, nullptr);
3146 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3147}
3148
3149TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003150 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003151 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3152 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003153
3154 // Should be able to set a default sink even when no stream exists.
3155 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3156
3157 // Create default channel and ensure it's assigned the default sink.
3158 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3159 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3160
3161 // Try resetting the default sink.
3162 channel_->SetRawAudioSink(0, nullptr);
3163 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3164
3165 // Try setting the default sink while the default stream exists.
3166 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3167 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3168
3169 // If we remove and add a default stream, it should get the same sink.
3170 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3171 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3172 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3173}
3174
skvlad7a43d252016-03-22 15:32:27 -07003175// Test that, just like the video channel, the voice channel communicates the
3176// network state to the call.
3177TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003178 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003179
3180 EXPECT_EQ(webrtc::kNetworkUp,
3181 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3182 EXPECT_EQ(webrtc::kNetworkUp,
3183 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3184
3185 channel_->OnReadyToSend(false);
3186 EXPECT_EQ(webrtc::kNetworkDown,
3187 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3188 EXPECT_EQ(webrtc::kNetworkUp,
3189 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3190
3191 channel_->OnReadyToSend(true);
3192 EXPECT_EQ(webrtc::kNetworkUp,
3193 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3194 EXPECT_EQ(webrtc::kNetworkUp,
3195 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3196}
3197
stefan658910c2015-09-03 05:48:32 -07003198// Tests that the library initializes and shuts down properly.
3199TEST(WebRtcVoiceEngineTest, StartupShutdown) {
solenbergff976312016-03-30 23:28:51 -07003200 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003201 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003202 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003203 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3204 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003205 EXPECT_TRUE(channel != nullptr);
3206 delete channel;
solenbergff976312016-03-30 23:28:51 -07003207}
stefan658910c2015-09-03 05:48:32 -07003208
solenbergff976312016-03-30 23:28:51 -07003209// Tests that reference counting on the external ADM is correct.
3210TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternADM) {
3211 cricket::FakeAudioDeviceModule adm;
3212 {
3213 cricket::WebRtcVoiceEngine engine(&adm);
3214 std::unique_ptr<webrtc::Call> call(
3215 webrtc::Call::Create(webrtc::Call::Config()));
3216 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3217 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3218 EXPECT_TRUE(channel != nullptr);
3219 delete channel;
3220 }
stefan658910c2015-09-03 05:48:32 -07003221}
3222
3223// Tests that the library is configured with the codecs we want.
3224TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003225 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003226 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3227 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0), nullptr));
3228 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3229 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0), nullptr));
3230 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3231 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003232 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003233 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3234 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0), nullptr));
3235 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3236 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0), nullptr));
3237 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3238 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0), nullptr));
3239 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3240 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0), nullptr));
3241 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3242 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0), nullptr));
3243 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3244 cricket::AudioCodec(96, "red", 8000, 0, 1, 0), nullptr));
3245 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3246 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0), nullptr));
3247 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3248 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0), nullptr));
3249 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3250 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0), nullptr));
3251 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3252 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003253 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003254 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3255 cricket::AudioCodec(0, "", 8000, 0, 1, 0), nullptr)); // PCMU
3256 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3257 cricket::AudioCodec(8, "", 8000, 0, 1, 0), nullptr)); // PCMA
3258 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3259 cricket::AudioCodec(9, "", 8000, 0, 1, 0), nullptr)); // G722
3260 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3261 cricket::AudioCodec(13, "", 8000, 0, 1, 0), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003262 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003263 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3264 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003265 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003266 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3267 cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0), nullptr));
3268 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3269 cricket::AudioCodec(88, "", 0, 0, 1, 0), nullptr));
3270 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3271 cricket::AudioCodec(0, "", 0, 0, 2, 0), nullptr));
3272 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3273 cricket::AudioCodec(0, "", 5000, 0, 1, 0), nullptr));
3274 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3275 cricket::AudioCodec(0, "", 0, 5000, 1, 0), nullptr));
3276
stefan658910c2015-09-03 05:48:32 -07003277 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenbergff976312016-03-30 23:28:51 -07003278 cricket::WebRtcVoiceEngine engine(nullptr);
stefan658910c2015-09-03 05:48:32 -07003279 for (std::vector<cricket::AudioCodec>::const_iterator it =
3280 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3281 if (it->name == "CN" && it->clockrate == 16000) {
3282 EXPECT_EQ(105, it->id);
3283 } else if (it->name == "CN" && it->clockrate == 32000) {
3284 EXPECT_EQ(106, it->id);
3285 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3286 EXPECT_EQ(103, it->id);
3287 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3288 EXPECT_EQ(104, it->id);
3289 } else if (it->name == "G722" && it->clockrate == 8000) {
3290 EXPECT_EQ(9, it->id);
3291 } else if (it->name == "telephone-event") {
3292 EXPECT_EQ(126, it->id);
3293 } else if (it->name == "red") {
3294 EXPECT_EQ(127, it->id);
3295 } else if (it->name == "opus") {
3296 EXPECT_EQ(111, it->id);
3297 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3298 EXPECT_EQ("10", it->params.find("minptime")->second);
3299 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3300 EXPECT_EQ("60", it->params.find("maxptime")->second);
3301 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3302 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3303 }
3304 }
stefan658910c2015-09-03 05:48:32 -07003305}
3306
3307// Tests that VoE supports at least 32 channels
3308TEST(WebRtcVoiceEngineTest, Has32Channels) {
solenbergff976312016-03-30 23:28:51 -07003309 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003310 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003311 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003312
3313 cricket::VoiceMediaChannel* channels[32];
3314 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003315 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003316 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3317 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003318 if (!channel)
3319 break;
stefan658910c2015-09-03 05:48:32 -07003320 channels[num_channels++] = channel;
3321 }
3322
tfarina5237aaf2015-11-10 23:44:30 -08003323 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003324 EXPECT_EQ(expected, num_channels);
3325
3326 while (num_channels > 0) {
3327 delete channels[--num_channels];
3328 }
stefan658910c2015-09-03 05:48:32 -07003329}
3330
3331// Test that we set our preferred codecs properly.
3332TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -07003333 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003334 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003335 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003336 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3337 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003338 cricket::AudioRecvParameters parameters;
3339 parameters.codecs = engine.codecs();
3340 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003341}