blob: 78b6a207903e86cb2c64b088de5ed89412b2f184 [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"
solenbergbc37fc82016-04-04 09:54:44 -070027#include "webrtc/modules/audio_device/include/mock_audio_device.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000028
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000029using cricket::kRtpAudioLevelHeaderExtension;
30using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
solenbergbc37fc82016-04-04 09:54:44 -070031using testing::Return;
32using testing::StrictMock;
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000033
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020034namespace {
35
36const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
37const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
38const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
39const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
40const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
41const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
42const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
43const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
44const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, 0,
45 1, 0);
solenberg85a04962015-10-27 03:35:21 -070046const uint32_t kSsrc1 = 0x99;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080047const uint32_t kSsrc2 = 2;
48const uint32_t kSsrc3 = 3;
solenberg85a04962015-10-27 03:35:21 -070049const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000050
51class FakeVoEWrapper : public cricket::VoEWrapper {
52 public:
53 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
54 : cricket::VoEWrapper(engine, // processing
55 engine, // base
56 engine, // codec
henrike@webrtc.org28e20752013-07-10 00:45:36 +000057 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000058 engine, // network
59 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060 engine) { // volume
61 }
62};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020063} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064
solenbergff976312016-03-30 23:28:51 -070065// Tests that our stub library "works".
66TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
solenbergbc37fc82016-04-04 09:54:44 -070067 StrictMock<webrtc::test::MockAudioDeviceModule> adm;
68 EXPECT_CALL(adm, AddRef()).WillOnce(Return(0));
69 EXPECT_CALL(adm, Release()).WillOnce(Return(0));
solenbergff976312016-03-30 23:28:51 -070070 cricket::FakeWebRtcVoiceEngine voe;
71 EXPECT_FALSE(voe.IsInited());
72 {
solenbergbc37fc82016-04-04 09:54:44 -070073 cricket::WebRtcVoiceEngine engine(&adm, new FakeVoEWrapper(&voe));
solenbergff976312016-03-30 23:28:51 -070074 EXPECT_TRUE(voe.IsInited());
75 }
76 EXPECT_FALSE(voe.IsInited());
77}
78
deadbeef884f5852016-01-15 09:20:04 -080079class FakeAudioSink : public webrtc::AudioSinkInterface {
80 public:
81 void OnData(const Data& audio) override {}
82};
83
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080084class FakeAudioSource : public cricket::AudioSource {
85 void SetSink(Sink* sink) override {}
86};
87
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088class WebRtcVoiceEngineTestFake : public testing::Test {
89 public:
stefanba4c0e42016-02-04 04:12:24 -080090 WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
91
92 explicit WebRtcVoiceEngineTestFake(const char* field_trials)
solenbergbc37fc82016-04-04 09:54:44 -070093 : call_(webrtc::Call::Config()), override_field_trials_(field_trials) {
94 EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
95 EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
96 engine_.reset(new cricket::WebRtcVoiceEngine(&adm_,
97 new FakeVoEWrapper(&voe_)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +020098 send_parameters_.codecs.push_back(kPcmuCodec);
99 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000100 }
solenbergff976312016-03-30 23:28:51 -0700101 bool SetupChannel() {
solenbergbc37fc82016-04-04 09:54:44 -0700102 channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
103 cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200104 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000105 }
solenbergff976312016-03-30 23:28:51 -0700106 bool SetupRecvStream() {
107 if (!SetupChannel()) {
solenberg1ac56142015-10-13 03:58:19 -0700108 return false;
109 }
110 return channel_->AddRecvStream(
111 cricket::StreamParams::CreateLegacy(kSsrc1));
112 }
solenbergff976312016-03-30 23:28:51 -0700113 bool SetupSendStream() {
114 if (!SetupChannel()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000115 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000116 }
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800117 if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc1))) {
118 return false;
119 }
120 return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000121 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000122 void SetupForMultiSendStream() {
solenbergff976312016-03-30 23:28:51 -0700123 EXPECT_TRUE(SetupSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700124 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800125 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700126 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700127 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800128 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000129 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000130 void DeliverPacket(const void* data, int len) {
jbaucheec21bd2016-03-20 06:15:43 -0700131 rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000132 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000133 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200134 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000135 delete channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000136 }
137
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100138 const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
139 const auto* send_stream = call_.GetAudioSendStream(ssrc);
140 EXPECT_TRUE(send_stream);
141 return *send_stream;
142 }
143
deadbeef884f5852016-01-15 09:20:04 -0800144 const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
145 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
146 EXPECT_TRUE(recv_stream);
147 return *recv_stream;
148 }
149
solenberg3a941542015-11-16 07:34:50 -0800150 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800151 return GetSendStream(ssrc).GetConfig();
solenberg3a941542015-11-16 07:34:50 -0800152 }
153
solenberg7add0582015-11-20 09:59:34 -0800154 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800155 return GetRecvStream(ssrc).GetConfig();
solenberg7add0582015-11-20 09:59:34 -0800156 }
157
Peter Boström0c4e06b2015-10-07 12:23:21 +0200158 void TestInsertDtmf(uint32_t ssrc, bool caller) {
solenbergff976312016-03-30 23:28:51 -0700159 EXPECT_TRUE(SetupChannel());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000160 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700161 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000162 // send stream.
163 EXPECT_TRUE(channel_->AddSendStream(
164 cricket::StreamParams::CreateLegacy(kSsrc1)));
165 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000166
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000167 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200168 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800169 channel_->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000170 EXPECT_FALSE(channel_->CanInsertDtmf());
solenberg1d63dd02015-12-02 12:35:09 -0800171 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200172 send_parameters_.codecs.push_back(kTelephoneEventCodec);
173 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000174 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000175
176 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700177 // If this is callee, there's no active send channel yet.
solenberg1d63dd02015-12-02 12:35:09 -0800178 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000179 EXPECT_TRUE(channel_->AddSendStream(
180 cricket::StreamParams::CreateLegacy(kSsrc1)));
181 }
182
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000183 // Check we fail if the ssrc is invalid.
solenberg1d63dd02015-12-02 12:35:09 -0800184 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000185
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100186 // Test send.
187 cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
188 GetSendStream(kSsrc1).GetLatestTelephoneEvent();
189 EXPECT_EQ(-1, telephone_event.payload_type);
solenberg1d63dd02015-12-02 12:35:09 -0800190 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100191 telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
192 EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
193 EXPECT_EQ(2, telephone_event.event_code);
194 EXPECT_EQ(123, telephone_event.duration_ms);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000195 }
196
197 // Test that send bandwidth is set correctly.
198 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000199 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
200 // |expected_result| is the expected result from SetMaxSendBandwidth().
201 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000202 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000203 int max_bitrate,
204 bool expected_result,
205 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200206 cricket::AudioSendParameters parameters;
207 parameters.codecs.push_back(codec);
208 parameters.max_bandwidth_bps = max_bitrate;
209 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
210
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000211 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000212 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000213 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000214 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000215 }
216
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000217 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700218 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000219
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000220 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800221 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000222
223 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200224 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000225 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200226 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800227 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000228
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000229 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200230 send_parameters_.extensions.clear();
231 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800232 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000233
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000234 // Ensure extension is set properly.
235 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200236 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
237 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800238 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
239 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
240 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000241
solenberg7add0582015-11-20 09:59:34 -0800242 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000243 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700244 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800245 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
246 call_.GetAudioSendStream(kSsrc2));
247 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
248 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
249 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000250
251 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200252 send_parameters_.codecs.push_back(kPcmuCodec);
253 send_parameters_.extensions.clear();
254 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800255 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
256 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000257 }
258
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000259 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenbergff976312016-03-30 23:28:51 -0700260 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000261
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000262 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800263 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000264
265 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800266 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000267 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800268 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
269 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000270
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000271 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800272 recv_parameters_.extensions.clear();
273 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
274 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000275
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000276 // Ensure extension is set properly.
277 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800278 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
279 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
280 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
281 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
282 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000283
solenberg7add0582015-11-20 09:59:34 -0800284 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000285 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700286 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800287 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
288 call_.GetAudioReceiveStream(kSsrc2));
289 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
290 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
291 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000292
293 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800294 recv_parameters_.extensions.clear();
295 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
296 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
297 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000298 }
299
solenberg85a04962015-10-27 03:35:21 -0700300 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
301 webrtc::AudioSendStream::Stats stats;
302 stats.local_ssrc = 12;
303 stats.bytes_sent = 345;
304 stats.packets_sent = 678;
305 stats.packets_lost = 9012;
306 stats.fraction_lost = 34.56f;
307 stats.codec_name = "codec_name_send";
308 stats.ext_seqnum = 789;
309 stats.jitter_ms = 12;
310 stats.rtt_ms = 345;
311 stats.audio_level = 678;
312 stats.aec_quality_min = 9.01f;
313 stats.echo_delay_median_ms = 234;
314 stats.echo_delay_std_ms = 567;
315 stats.echo_return_loss = 890;
316 stats.echo_return_loss_enhancement = 1234;
317 stats.typing_noise_detected = true;
318 return stats;
319 }
320 void SetAudioSendStreamStats() {
321 for (auto* s : call_.GetAudioSendStreams()) {
322 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200323 }
solenberg85a04962015-10-27 03:35:21 -0700324 }
solenberg566ef242015-11-06 15:34:49 -0800325 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
326 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700327 const auto stats = GetAudioSendStreamStats();
328 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
329 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
330 EXPECT_EQ(info.packets_sent, stats.packets_sent);
331 EXPECT_EQ(info.packets_lost, stats.packets_lost);
332 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
333 EXPECT_EQ(info.codec_name, stats.codec_name);
334 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
335 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
336 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
337 EXPECT_EQ(info.audio_level, stats.audio_level);
338 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
339 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
340 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
341 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
342 EXPECT_EQ(info.echo_return_loss_enhancement,
343 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800344 EXPECT_EQ(info.typing_noise_detected,
345 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700346 }
347
348 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
349 webrtc::AudioReceiveStream::Stats stats;
350 stats.remote_ssrc = 123;
351 stats.bytes_rcvd = 456;
352 stats.packets_rcvd = 768;
353 stats.packets_lost = 101;
354 stats.fraction_lost = 23.45f;
355 stats.codec_name = "codec_name_recv";
356 stats.ext_seqnum = 678;
357 stats.jitter_ms = 901;
358 stats.jitter_buffer_ms = 234;
359 stats.jitter_buffer_preferred_ms = 567;
360 stats.delay_estimate_ms = 890;
361 stats.audio_level = 1234;
362 stats.expand_rate = 5.67f;
363 stats.speech_expand_rate = 8.90f;
364 stats.secondary_decoded_rate = 1.23f;
365 stats.accelerate_rate = 4.56f;
366 stats.preemptive_expand_rate = 7.89f;
367 stats.decoding_calls_to_silence_generator = 12;
368 stats.decoding_calls_to_neteq = 345;
369 stats.decoding_normal = 67890;
370 stats.decoding_plc = 1234;
371 stats.decoding_cng = 5678;
372 stats.decoding_plc_cng = 9012;
373 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200374 return stats;
375 }
376 void SetAudioReceiveStreamStats() {
377 for (auto* s : call_.GetAudioReceiveStreams()) {
378 s->SetStats(GetAudioReceiveStreamStats());
379 }
380 }
381 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700382 const auto stats = GetAudioReceiveStreamStats();
383 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
384 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
385 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
386 EXPECT_EQ(info.packets_lost, stats.packets_lost);
387 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
388 EXPECT_EQ(info.codec_name, stats.codec_name);
389 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
390 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
391 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200392 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700393 stats.jitter_buffer_preferred_ms);
394 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
395 EXPECT_EQ(info.audio_level, stats.audio_level);
396 EXPECT_EQ(info.expand_rate, stats.expand_rate);
397 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
398 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
399 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
400 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200401 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700402 stats.decoding_calls_to_silence_generator);
403 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
404 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
405 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
406 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
407 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
408 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200409 }
410
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000411 protected:
solenbergbc37fc82016-04-04 09:54:44 -0700412 StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200413 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000414 cricket::FakeWebRtcVoiceEngine voe_;
solenbergbc37fc82016-04-04 09:54:44 -0700415 std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
solenbergff976312016-03-30 23:28:51 -0700416 cricket::VoiceMediaChannel* channel_ = nullptr;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200417 cricket::AudioSendParameters send_parameters_;
418 cricket::AudioRecvParameters recv_parameters_;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -0800419 FakeAudioSource fake_source_;
stefanba4c0e42016-02-04 04:12:24 -0800420 private:
421 webrtc::test::ScopedFieldTrials override_field_trials_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000422};
423
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000424// Tests that we can create and destroy a channel.
425TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
solenbergff976312016-03-30 23:28:51 -0700426 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000427}
428
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000429// Tests that the list of supported codecs is created properly and ordered
430// correctly
431TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
solenbergbc37fc82016-04-04 09:54:44 -0700432 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000433 ASSERT_FALSE(codecs.empty());
434 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
435 EXPECT_EQ(48000, codecs[0].clockrate);
436 EXPECT_EQ(2, codecs[0].channels);
437 EXPECT_EQ(64000, codecs[0].bitrate);
438 int pref = codecs[0].preference;
439 for (size_t i = 1; i < codecs.size(); ++i) {
440 EXPECT_GT(pref, codecs[i].preference);
441 pref = codecs[i].preference;
442 }
443}
444
stefanba4c0e42016-02-04 04:12:24 -0800445TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
solenbergbc37fc82016-04-04 09:54:44 -0700446 const std::vector<cricket::AudioCodec>& codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -0800447 bool opus_found = false;
448 for (cricket::AudioCodec codec : codecs) {
449 if (codec.name == "opus") {
450 EXPECT_TRUE(HasTransportCc(codec));
451 opus_found = true;
452 }
453 }
454 EXPECT_TRUE(opus_found);
455}
456
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000457// Tests that we can find codecs by name or id, and that we interpret the
458// clockrate and bitrate fields properly.
459TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
460 cricket::AudioCodec codec;
461 webrtc::CodecInst codec_inst;
462 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800463 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000464 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800465 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000466 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800467 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
468 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000469 // Find ISAC with a different payload id.
470 codec = kIsacCodec;
471 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800472 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000473 EXPECT_EQ(codec.id, codec_inst.pltype);
474 // Find PCMU with a 0 clockrate.
475 codec = kPcmuCodec;
476 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800477 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000478 EXPECT_EQ(codec.id, codec_inst.pltype);
479 EXPECT_EQ(8000, codec_inst.plfreq);
480 // Find PCMU with a 0 bitrate.
481 codec = kPcmuCodec;
482 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800483 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000484 EXPECT_EQ(codec.id, codec_inst.pltype);
485 EXPECT_EQ(64000, codec_inst.rate);
486 // Find ISAC with an explicit bitrate.
487 codec = kIsacCodec;
488 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800489 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000490 EXPECT_EQ(codec.id, codec_inst.pltype);
491 EXPECT_EQ(32000, codec_inst.rate);
492}
493
494// Test that we set our inbound codecs properly, including changing PT.
495TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -0700496 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200497 cricket::AudioRecvParameters parameters;
498 parameters.codecs.push_back(kIsacCodec);
499 parameters.codecs.push_back(kPcmuCodec);
500 parameters.codecs.push_back(kTelephoneEventCodec);
501 parameters.codecs[0].id = 106; // collide with existing telephone-event
502 parameters.codecs[2].id = 126;
503 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700504 EXPECT_TRUE(channel_->AddRecvStream(
505 cricket::StreamParams::CreateLegacy(kSsrc1)));
506 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000507 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800508 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000509 gcodec.plfreq = 16000;
510 gcodec.channels = 1;
511 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
512 EXPECT_EQ(106, gcodec.pltype);
513 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800514 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000515 gcodec.plfreq = 8000;
516 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
517 EXPECT_EQ(126, gcodec.pltype);
518 EXPECT_STREQ("telephone-event", gcodec.plname);
519}
520
521// Test that we fail to set an unknown inbound codec.
522TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -0700523 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200524 cricket::AudioRecvParameters parameters;
525 parameters.codecs.push_back(kIsacCodec);
526 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
527 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000528}
529
530// Test that we fail if we have duplicate types in the inbound list.
531TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
solenbergff976312016-03-30 23:28:51 -0700532 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200533 cricket::AudioRecvParameters parameters;
534 parameters.codecs.push_back(kIsacCodec);
535 parameters.codecs.push_back(kCn16000Codec);
536 parameters.codecs[1].id = kIsacCodec.id;
537 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000538}
539
540// Test that we can decode OPUS without stereo parameters.
541TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700542 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200543 cricket::AudioRecvParameters parameters;
544 parameters.codecs.push_back(kIsacCodec);
545 parameters.codecs.push_back(kPcmuCodec);
546 parameters.codecs.push_back(kOpusCodec);
547 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000548 EXPECT_TRUE(channel_->AddRecvStream(
549 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700550 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000551 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800552 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000553 // Even without stereo parameters, recv codecs still specify channels = 2.
554 EXPECT_EQ(2, opus.channels);
555 EXPECT_EQ(111, opus.pltype);
556 EXPECT_STREQ("opus", opus.plname);
557 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700558 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000559 EXPECT_EQ(111, opus.pltype);
560}
561
562// Test that we can decode OPUS with stereo = 0.
563TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700564 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200565 cricket::AudioRecvParameters parameters;
566 parameters.codecs.push_back(kIsacCodec);
567 parameters.codecs.push_back(kPcmuCodec);
568 parameters.codecs.push_back(kOpusCodec);
569 parameters.codecs[2].params["stereo"] = "0";
570 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000571 EXPECT_TRUE(channel_->AddRecvStream(
572 cricket::StreamParams::CreateLegacy(kSsrc1)));
573 int channel_num2 = voe_.GetLastChannel();
574 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800575 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000576 // Even when stereo is off, recv codecs still specify channels = 2.
577 EXPECT_EQ(2, opus.channels);
578 EXPECT_EQ(111, opus.pltype);
579 EXPECT_STREQ("opus", opus.plname);
580 opus.pltype = 0;
581 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
582 EXPECT_EQ(111, opus.pltype);
583}
584
585// Test that we can decode OPUS with stereo = 1.
586TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700587 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200588 cricket::AudioRecvParameters parameters;
589 parameters.codecs.push_back(kIsacCodec);
590 parameters.codecs.push_back(kPcmuCodec);
591 parameters.codecs.push_back(kOpusCodec);
592 parameters.codecs[2].params["stereo"] = "1";
593 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000594 EXPECT_TRUE(channel_->AddRecvStream(
595 cricket::StreamParams::CreateLegacy(kSsrc1)));
596 int channel_num2 = voe_.GetLastChannel();
597 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800598 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000599 EXPECT_EQ(2, opus.channels);
600 EXPECT_EQ(111, opus.pltype);
601 EXPECT_STREQ("opus", opus.plname);
602 opus.pltype = 0;
603 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
604 EXPECT_EQ(111, opus.pltype);
605}
606
607// Test that changes to recv codecs are applied to all streams.
608TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -0700609 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200610 cricket::AudioRecvParameters parameters;
611 parameters.codecs.push_back(kIsacCodec);
612 parameters.codecs.push_back(kPcmuCodec);
613 parameters.codecs.push_back(kTelephoneEventCodec);
614 parameters.codecs[0].id = 106; // collide with existing telephone-event
615 parameters.codecs[2].id = 126;
616 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617 EXPECT_TRUE(channel_->AddRecvStream(
618 cricket::StreamParams::CreateLegacy(kSsrc1)));
619 int channel_num2 = voe_.GetLastChannel();
620 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800621 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000622 gcodec.plfreq = 16000;
623 gcodec.channels = 1;
624 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
625 EXPECT_EQ(106, gcodec.pltype);
626 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800627 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000628 gcodec.plfreq = 8000;
629 gcodec.channels = 1;
630 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
631 EXPECT_EQ(126, gcodec.pltype);
632 EXPECT_STREQ("telephone-event", gcodec.plname);
633}
634
635TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenbergff976312016-03-30 23:28:51 -0700636 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200637 cricket::AudioRecvParameters parameters;
638 parameters.codecs.push_back(kIsacCodec);
639 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200640 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000641
642 int channel_num2 = voe_.GetLastChannel();
643 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800644 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645 gcodec.plfreq = 16000;
646 gcodec.channels = 1;
647 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
648 EXPECT_EQ(106, gcodec.pltype);
649 EXPECT_STREQ("ISAC", gcodec.plname);
650}
651
652// Test that we can apply the same set of codecs again while playing.
653TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700654 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200655 cricket::AudioRecvParameters parameters;
656 parameters.codecs.push_back(kIsacCodec);
657 parameters.codecs.push_back(kCn16000Codec);
658 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000659 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200660 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000661
662 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200663 parameters.codecs[0].id = 127;
664 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
665 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000666 EXPECT_TRUE(voe_.GetPlayout(channel_num));
667}
668
669// Test that we can add a codec while playing.
670TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenbergff976312016-03-30 23:28:51 -0700671 EXPECT_TRUE(SetupRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200672 cricket::AudioRecvParameters parameters;
673 parameters.codecs.push_back(kIsacCodec);
674 parameters.codecs.push_back(kCn16000Codec);
675 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000676 EXPECT_TRUE(channel_->SetPlayout(true));
677
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200678 parameters.codecs.push_back(kOpusCodec);
679 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
680 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000681 EXPECT_TRUE(voe_.GetPlayout(channel_num));
682 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800683 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000684 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
685}
686
687TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenbergff976312016-03-30 23:28:51 -0700688 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000689
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000690 // Test that when autobw is enabled, bitrate is kept as the default
691 // value. autobw is enabled for the following tests because the target
692 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000693
694 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000695 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000696
697 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000698 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000699
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000700 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000701 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000702}
703
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000704TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700705 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000706
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000707 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000708
709 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000710 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
711 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000712
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000713 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000714 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
715 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000716}
717
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000718TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenbergff976312016-03-30 23:28:51 -0700719 EXPECT_TRUE(SetupSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000720
721 // Test that we can only set a maximum bitrate for a fixed-rate codec
722 // if it's bigger than the fixed rate.
723
724 // PCMU, fixed bitrate == 64000.
725 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
726 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
727 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
728 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
729 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
730 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
731 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
732}
733
734TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenbergff976312016-03-30 23:28:51 -0700735 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200736 const int kDesiredBitrate = 128000;
737 cricket::AudioSendParameters parameters;
solenbergbc37fc82016-04-04 09:54:44 -0700738 parameters.codecs = engine_->codecs();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200739 parameters.max_bandwidth_bps = kDesiredBitrate;
740 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000741
742 EXPECT_TRUE(channel_->AddSendStream(
743 cricket::StreamParams::CreateLegacy(kSsrc1)));
744
745 int channel_num = voe_.GetLastChannel();
746 webrtc::CodecInst codec;
747 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200748 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000749}
750
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000751// Test that bitrate cannot be set for CBR codecs.
752// Bitrate is ignored if it is higher than the fixed bitrate.
753// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000754TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenbergff976312016-03-30 23:28:51 -0700755 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000756
757 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200758 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
759 int channel_num = voe_.GetLastChannel();
760 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000761 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
762 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200763
764 send_parameters_.max_bandwidth_bps = 128000;
765 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000766 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
767 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200768
769 send_parameters_.max_bandwidth_bps = 128;
770 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000771 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
772 EXPECT_EQ(64000, codec.rate);
773}
774
775// Test that we apply codecs properly.
776TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenbergff976312016-03-30 23:28:51 -0700777 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200778 cricket::AudioSendParameters parameters;
779 parameters.codecs.push_back(kIsacCodec);
780 parameters.codecs.push_back(kPcmuCodec);
781 parameters.codecs.push_back(kRedCodec);
782 parameters.codecs[0].id = 96;
783 parameters.codecs[0].bitrate = 48000;
784 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000785 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200786 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000787 webrtc::CodecInst gcodec;
788 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
789 EXPECT_EQ(96, gcodec.pltype);
790 EXPECT_EQ(48000, gcodec.rate);
791 EXPECT_STREQ("ISAC", gcodec.plname);
792 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000793 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000794 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
795 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +0100796 EXPECT_FALSE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000797}
798
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000799// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
800// to apply.
801TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenbergff976312016-03-30 23:28:51 -0700802 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200803 cricket::AudioSendParameters parameters;
804 parameters.codecs.push_back(kIsacCodec);
805 parameters.codecs.push_back(kPcmuCodec);
806 parameters.codecs.push_back(kRedCodec);
807 parameters.codecs[0].id = 96;
808 parameters.codecs[0].bitrate = 48000;
809 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000810 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
811 // Calling SetSendCodec again with same codec which is already set.
812 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200813 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000814 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
815}
816
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000817// Verify that G722 is set with 16000 samples per second to WebRTC.
818TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenbergff976312016-03-30 23:28:51 -0700819 EXPECT_TRUE(SetupSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000820 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200821 cricket::AudioSendParameters parameters;
822 parameters.codecs.push_back(kG722CodecSdp);
823 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000824 webrtc::CodecInst gcodec;
825 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
826 EXPECT_STREQ("G722", gcodec.plname);
827 EXPECT_EQ(1, gcodec.channels);
828 EXPECT_EQ(16000, gcodec.plfreq);
829}
830
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000831// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000832TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenbergff976312016-03-30 23:28:51 -0700833 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200834 cricket::AudioSendParameters parameters;
835 parameters.codecs.push_back(kOpusCodec);
836 parameters.codecs[0].bitrate = 0;
837 parameters.codecs[0].clockrate = 50000;
838 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000839}
840
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000841// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000842TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700843 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200844 cricket::AudioSendParameters parameters;
845 parameters.codecs.push_back(kOpusCodec);
846 parameters.codecs[0].bitrate = 0;
847 parameters.codecs[0].channels = 0;
848 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000849}
850
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000851// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000852TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700853 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200854 cricket::AudioSendParameters parameters;
855 parameters.codecs.push_back(kOpusCodec);
856 parameters.codecs[0].bitrate = 0;
857 parameters.codecs[0].channels = 0;
858 parameters.codecs[0].params["stereo"] = "1";
859 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000860}
861
862// Test that if channel is 1 for opus and there's no stereo, we fail.
863TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700864 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200865 cricket::AudioSendParameters parameters;
866 parameters.codecs.push_back(kOpusCodec);
867 parameters.codecs[0].bitrate = 0;
868 parameters.codecs[0].channels = 1;
869 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000870}
871
872// Test that if channel is 1 for opus and stereo=0, we fail.
873TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700874 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200875 cricket::AudioSendParameters parameters;
876 parameters.codecs.push_back(kOpusCodec);
877 parameters.codecs[0].bitrate = 0;
878 parameters.codecs[0].channels = 1;
879 parameters.codecs[0].params["stereo"] = "0";
880 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000881}
882
883// Test that if channel is 1 for opus and stereo=1, we fail.
884TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700885 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200886 cricket::AudioSendParameters parameters;
887 parameters.codecs.push_back(kOpusCodec);
888 parameters.codecs[0].bitrate = 0;
889 parameters.codecs[0].channels = 1;
890 parameters.codecs[0].params["stereo"] = "1";
891 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000892}
893
894// Test that with bitrate=0 and no stereo,
895// channels and bitrate are 1 and 32000.
896TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700897 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000898 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200899 cricket::AudioSendParameters parameters;
900 parameters.codecs.push_back(kOpusCodec);
901 parameters.codecs[0].bitrate = 0;
902 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000903 webrtc::CodecInst gcodec;
904 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
905 EXPECT_STREQ("opus", gcodec.plname);
906 EXPECT_EQ(1, gcodec.channels);
907 EXPECT_EQ(32000, gcodec.rate);
908}
909
910// Test that with bitrate=0 and stereo=0,
911// channels and bitrate are 1 and 32000.
912TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700913 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000914 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200915 cricket::AudioSendParameters parameters;
916 parameters.codecs.push_back(kOpusCodec);
917 parameters.codecs[0].bitrate = 0;
918 parameters.codecs[0].params["stereo"] = "0";
919 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000920 webrtc::CodecInst gcodec;
921 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
922 EXPECT_STREQ("opus", gcodec.plname);
923 EXPECT_EQ(1, gcodec.channels);
924 EXPECT_EQ(32000, gcodec.rate);
925}
926
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000927// Test that with bitrate=invalid and stereo=0,
928// channels and bitrate are 1 and 32000.
929TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -0700930 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000931 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200932 cricket::AudioSendParameters parameters;
933 parameters.codecs.push_back(kOpusCodec);
934 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000935 webrtc::CodecInst gcodec;
936
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000937 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200938 parameters.codecs[0].bitrate = 5999;
939 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000940 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
941 EXPECT_STREQ("opus", gcodec.plname);
942 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000943 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000944
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200945 parameters.codecs[0].bitrate = 510001;
946 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000947 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
948 EXPECT_STREQ("opus", gcodec.plname);
949 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000950 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000951}
952
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000953// Test that with bitrate=0 and stereo=1,
954// channels and bitrate are 2 and 64000.
955TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700956 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000957 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200958 cricket::AudioSendParameters parameters;
959 parameters.codecs.push_back(kOpusCodec);
960 parameters.codecs[0].bitrate = 0;
961 parameters.codecs[0].params["stereo"] = "1";
962 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000963 webrtc::CodecInst gcodec;
964 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
965 EXPECT_STREQ("opus", gcodec.plname);
966 EXPECT_EQ(2, gcodec.channels);
967 EXPECT_EQ(64000, gcodec.rate);
968}
969
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000970// Test that with bitrate=invalid and stereo=1,
971// channels and bitrate are 2 and 64000.
972TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -0700973 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000974 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200975 cricket::AudioSendParameters parameters;
976 parameters.codecs.push_back(kOpusCodec);
977 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000978 webrtc::CodecInst gcodec;
979
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000980 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200981 parameters.codecs[0].bitrate = 5999;
982 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000983 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
984 EXPECT_STREQ("opus", gcodec.plname);
985 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000986 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000987
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200988 parameters.codecs[0].bitrate = 510001;
989 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000990 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
991 EXPECT_STREQ("opus", gcodec.plname);
992 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000993 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000994}
995
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000996// Test that with bitrate=N and stereo unset,
997// channels and bitrate are 1 and N.
998TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenbergff976312016-03-30 23:28:51 -0700999 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001000 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001001 cricket::AudioSendParameters parameters;
1002 parameters.codecs.push_back(kOpusCodec);
1003 parameters.codecs[0].bitrate = 96000;
1004 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001005 webrtc::CodecInst gcodec;
1006 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1007 EXPECT_EQ(111, gcodec.pltype);
1008 EXPECT_EQ(96000, gcodec.rate);
1009 EXPECT_STREQ("opus", gcodec.plname);
1010 EXPECT_EQ(1, gcodec.channels);
1011 EXPECT_EQ(48000, gcodec.plfreq);
1012}
1013
1014// Test that with bitrate=N and stereo=0,
1015// channels and bitrate are 1 and N.
1016TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenbergff976312016-03-30 23:28:51 -07001017 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001018 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001019 cricket::AudioSendParameters parameters;
1020 parameters.codecs.push_back(kOpusCodec);
1021 parameters.codecs[0].bitrate = 30000;
1022 parameters.codecs[0].params["stereo"] = "0";
1023 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001024 webrtc::CodecInst gcodec;
1025 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1026 EXPECT_EQ(1, gcodec.channels);
1027 EXPECT_EQ(30000, gcodec.rate);
1028 EXPECT_STREQ("opus", gcodec.plname);
1029}
1030
1031// Test that with bitrate=N and without any parameters,
1032// channels and bitrate are 1 and N.
1033TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenbergff976312016-03-30 23:28:51 -07001034 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001035 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001036 cricket::AudioSendParameters parameters;
1037 parameters.codecs.push_back(kOpusCodec);
1038 parameters.codecs[0].bitrate = 30000;
1039 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001040 webrtc::CodecInst gcodec;
1041 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1042 EXPECT_EQ(1, gcodec.channels);
1043 EXPECT_EQ(30000, gcodec.rate);
1044 EXPECT_STREQ("opus", gcodec.plname);
1045}
1046
1047// Test that with bitrate=N and stereo=1,
1048// channels and bitrate are 2 and N.
1049TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenbergff976312016-03-30 23:28:51 -07001050 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001051 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001052 cricket::AudioSendParameters parameters;
1053 parameters.codecs.push_back(kOpusCodec);
1054 parameters.codecs[0].bitrate = 30000;
1055 parameters.codecs[0].params["stereo"] = "1";
1056 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001057 webrtc::CodecInst gcodec;
1058 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1059 EXPECT_EQ(2, gcodec.channels);
1060 EXPECT_EQ(30000, gcodec.rate);
1061 EXPECT_STREQ("opus", gcodec.plname);
1062}
1063
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001064// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1065// Also test that the "maxaveragebitrate" can't be set to values outside the
1066// range of 6000 and 510000
1067TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenbergff976312016-03-30 23:28:51 -07001068 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001069 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001070 cricket::AudioSendParameters parameters;
1071 parameters.codecs.push_back(kOpusCodec);
1072 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001073 webrtc::CodecInst gcodec;
1074
1075 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001076 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1077 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001078 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001079 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001080
1081 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001082 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1083 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001084 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001085 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001086
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001087 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1088 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001089 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1090 EXPECT_EQ(200000, gcodec.rate);
1091}
1092
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001093// Test that we can enable NACK with opus as caller.
1094TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001095 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001096 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001097 cricket::AudioSendParameters parameters;
1098 parameters.codecs.push_back(kOpusCodec);
1099 parameters.codecs[0].AddFeedbackParam(
1100 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1101 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001102 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001103 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001104 EXPECT_TRUE(voe_.GetNACK(channel_num));
1105}
1106
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001107// Test that we can enable NACK with opus as callee.
1108TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001109 EXPECT_TRUE(SetupRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001110 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001111 cricket::AudioSendParameters parameters;
1112 parameters.codecs.push_back(kOpusCodec);
1113 parameters.codecs[0].AddFeedbackParam(
1114 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1115 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001116 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001117 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001118 EXPECT_FALSE(voe_.GetNACK(channel_num));
1119
1120 EXPECT_TRUE(channel_->AddSendStream(
1121 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001122 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001123}
1124
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001125// Test that we can enable NACK on receive streams.
1126TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001127 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001128 int channel_num1 = voe_.GetLastChannel();
1129 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1130 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001131 cricket::AudioSendParameters parameters;
1132 parameters.codecs.push_back(kOpusCodec);
1133 parameters.codecs[0].AddFeedbackParam(
1134 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1135 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001136 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1137 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001138 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001139 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1140 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1141}
1142
1143// Test that we can disable NACK.
1144TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenbergff976312016-03-30 23:28:51 -07001145 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001146 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001147 cricket::AudioSendParameters parameters;
1148 parameters.codecs.push_back(kOpusCodec);
1149 parameters.codecs[0].AddFeedbackParam(
1150 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1151 cricket::kParamValueEmpty));
1152 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001153 EXPECT_TRUE(voe_.GetNACK(channel_num));
1154
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001155 parameters.codecs.clear();
1156 parameters.codecs.push_back(kOpusCodec);
1157 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001158 EXPECT_FALSE(voe_.GetNACK(channel_num));
1159}
1160
1161// Test that we can disable NACK on receive streams.
1162TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenbergff976312016-03-30 23:28:51 -07001163 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001164 int channel_num1 = voe_.GetLastChannel();
1165 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1166 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001167 cricket::AudioSendParameters parameters;
1168 parameters.codecs.push_back(kOpusCodec);
1169 parameters.codecs[0].AddFeedbackParam(
1170 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1171 cricket::kParamValueEmpty));
1172 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001173 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1174 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1175
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001176 parameters.codecs.clear();
1177 parameters.codecs.push_back(kOpusCodec);
1178 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001179 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1180 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1181}
1182
1183// Test that NACK is enabled on a new receive stream.
1184TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenbergff976312016-03-30 23:28:51 -07001185 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001186 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001187 cricket::AudioSendParameters parameters;
1188 parameters.codecs.push_back(kIsacCodec);
1189 parameters.codecs.push_back(kCn16000Codec);
1190 parameters.codecs[0].AddFeedbackParam(
1191 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1192 cricket::kParamValueEmpty));
1193 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001194 EXPECT_TRUE(voe_.GetNACK(channel_num));
1195
1196 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1197 channel_num = voe_.GetLastChannel();
1198 EXPECT_TRUE(voe_.GetNACK(channel_num));
1199 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1200 channel_num = voe_.GetLastChannel();
1201 EXPECT_TRUE(voe_.GetNACK(channel_num));
1202}
1203
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001204// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001205TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenbergff976312016-03-30 23:28:51 -07001206 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001207 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001208 cricket::AudioSendParameters parameters;
1209 parameters.codecs.push_back(kOpusCodec);
1210 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001211 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1212}
1213
1214// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001215TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenbergff976312016-03-30 23:28:51 -07001216 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001217 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001218 cricket::AudioSendParameters parameters;
1219 parameters.codecs.push_back(kOpusCodec);
1220 parameters.codecs[0].bitrate = 0;
1221 parameters.codecs[0].params["useinbandfec"] = "0";
1222 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001223 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1224 webrtc::CodecInst gcodec;
1225 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1226 EXPECT_STREQ("opus", gcodec.plname);
1227 EXPECT_EQ(1, gcodec.channels);
1228 EXPECT_EQ(32000, gcodec.rate);
1229}
1230
1231// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001232TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenbergff976312016-03-30 23:28:51 -07001233 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001234 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001235 cricket::AudioSendParameters parameters;
1236 parameters.codecs.push_back(kOpusCodec);
1237 parameters.codecs[0].bitrate = 0;
1238 parameters.codecs[0].params["useinbandfec"] = "1";
1239 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001240 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1241 webrtc::CodecInst gcodec;
1242 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1243 EXPECT_STREQ("opus", gcodec.plname);
1244 EXPECT_EQ(1, gcodec.channels);
1245 EXPECT_EQ(32000, gcodec.rate);
1246}
1247
1248// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001249TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenbergff976312016-03-30 23:28:51 -07001250 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001251 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001252 cricket::AudioSendParameters parameters;
1253 parameters.codecs.push_back(kOpusCodec);
1254 parameters.codecs[0].bitrate = 0;
1255 parameters.codecs[0].params["stereo"] = "1";
1256 parameters.codecs[0].params["useinbandfec"] = "1";
1257 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001258 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1259 webrtc::CodecInst gcodec;
1260 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1261 EXPECT_STREQ("opus", gcodec.plname);
1262 EXPECT_EQ(2, gcodec.channels);
1263 EXPECT_EQ(64000, gcodec.rate);
1264}
1265
1266// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001267TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenbergff976312016-03-30 23:28:51 -07001268 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001269 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001270 cricket::AudioSendParameters parameters;
1271 parameters.codecs.push_back(kIsacCodec);
1272 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001273 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1274}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001275
1276// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1277TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenbergff976312016-03-30 23:28:51 -07001278 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001279 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001280 cricket::AudioSendParameters parameters;
1281 parameters.codecs.push_back(kIsacCodec);
1282 parameters.codecs[0].params["useinbandfec"] = "1";
1283 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001284 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1285}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001286
1287// Test that Opus FEC status can be changed.
1288TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenbergff976312016-03-30 23:28:51 -07001289 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001290 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001291 cricket::AudioSendParameters parameters;
1292 parameters.codecs.push_back(kOpusCodec);
1293 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001294 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001295 parameters.codecs[0].params["useinbandfec"] = "1";
1296 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001297 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1298}
1299
stefanba4c0e42016-02-04 04:12:24 -08001300TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
solenbergff976312016-03-30 23:28:51 -07001301 EXPECT_TRUE(SetupChannel());
stefanba4c0e42016-02-04 04:12:24 -08001302 cricket::AudioSendParameters send_parameters;
1303 send_parameters.codecs.push_back(kOpusCodec);
1304 EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
1305 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1306
1307 cricket::AudioRecvParameters recv_parameters;
1308 recv_parameters.codecs.push_back(kIsacCodec);
1309 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
1310 EXPECT_TRUE(
1311 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
1312 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1313 EXPECT_FALSE(
1314 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1315
solenbergbc37fc82016-04-04 09:54:44 -07001316 send_parameters.codecs = engine_->codecs();
stefanba4c0e42016-02-04 04:12:24 -08001317 EXPECT_TRUE(channel_->SetSendParameters(send_parameters));
1318 ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
1319 EXPECT_TRUE(
1320 call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
1321}
1322
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001323// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1324TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenbergff976312016-03-30 23:28:51 -07001325 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001326 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001327 cricket::AudioSendParameters parameters;
1328 parameters.codecs.push_back(kOpusCodec);
1329 parameters.codecs[0].bitrate = 0;
1330 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1331 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001332 EXPECT_EQ(cricket::kOpusBandwidthNb,
1333 voe_.GetMaxEncodingBandwidth(channel_num));
1334 webrtc::CodecInst gcodec;
1335 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1336 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001337
1338 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001339 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1340 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001341 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1342 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001343}
1344
1345// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1346TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenbergff976312016-03-30 23:28:51 -07001347 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001348 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001349 cricket::AudioSendParameters parameters;
1350 parameters.codecs.push_back(kOpusCodec);
1351 parameters.codecs[0].bitrate = 0;
1352 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1353 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001354 EXPECT_EQ(cricket::kOpusBandwidthMb,
1355 voe_.GetMaxEncodingBandwidth(channel_num));
1356 webrtc::CodecInst gcodec;
1357 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1358 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001359
1360 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001361 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1362 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001363 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1364 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001365}
1366
1367// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1368TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenbergff976312016-03-30 23:28:51 -07001369 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001370 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001371 cricket::AudioSendParameters parameters;
1372 parameters.codecs.push_back(kOpusCodec);
1373 parameters.codecs[0].bitrate = 0;
1374 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1375 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001376 EXPECT_EQ(cricket::kOpusBandwidthWb,
1377 voe_.GetMaxEncodingBandwidth(channel_num));
1378 webrtc::CodecInst gcodec;
1379 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1380 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001381
1382 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001383 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1384 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001385 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1386 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001387}
1388
1389// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1390TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenbergff976312016-03-30 23:28:51 -07001391 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001392 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001393 cricket::AudioSendParameters parameters;
1394 parameters.codecs.push_back(kOpusCodec);
1395 parameters.codecs[0].bitrate = 0;
1396 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1397 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001398 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1399 voe_.GetMaxEncodingBandwidth(channel_num));
1400 webrtc::CodecInst gcodec;
1401 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1402 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001403
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001404 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001405 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1406 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001407 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1408 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001409}
1410
1411// Test 24000 < maxplaybackrate triggers Opus full band mode.
1412TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenbergff976312016-03-30 23:28:51 -07001413 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001414 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001415 cricket::AudioSendParameters parameters;
1416 parameters.codecs.push_back(kOpusCodec);
1417 parameters.codecs[0].bitrate = 0;
1418 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1419 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001420 EXPECT_EQ(cricket::kOpusBandwidthFb,
1421 voe_.GetMaxEncodingBandwidth(channel_num));
1422 webrtc::CodecInst gcodec;
1423 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1424 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001425
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001426 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001427 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1428 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001429 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1430 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001431}
1432
1433// Test Opus that without maxplaybackrate, default playback rate is used.
1434TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001435 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001436 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001437 cricket::AudioSendParameters parameters;
1438 parameters.codecs.push_back(kOpusCodec);
1439 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001440 EXPECT_EQ(cricket::kOpusBandwidthFb,
1441 voe_.GetMaxEncodingBandwidth(channel_num));
1442}
1443
1444// Test the with non-Opus, maxplaybackrate has no effect.
1445TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenbergff976312016-03-30 23:28:51 -07001446 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001447 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001448 cricket::AudioSendParameters parameters;
1449 parameters.codecs.push_back(kIsacCodec);
1450 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1451 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001452 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1453}
1454
1455// Test maxplaybackrate can be set on two streams.
1456TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenbergff976312016-03-30 23:28:51 -07001457 EXPECT_TRUE(SetupSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001458 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001459 cricket::AudioSendParameters parameters;
1460 parameters.codecs.push_back(kOpusCodec);
1461 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001462 // Default bandwidth is 24000.
1463 EXPECT_EQ(cricket::kOpusBandwidthFb,
1464 voe_.GetMaxEncodingBandwidth(channel_num));
1465
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001466 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001467
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001468 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001469 EXPECT_EQ(cricket::kOpusBandwidthNb,
1470 voe_.GetMaxEncodingBandwidth(channel_num));
1471
1472 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1473 channel_num = voe_.GetLastChannel();
1474 EXPECT_EQ(cricket::kOpusBandwidthNb,
1475 voe_.GetMaxEncodingBandwidth(channel_num));
1476}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001477
Minyue Li7100dcd2015-03-27 05:05:59 +01001478// Test that with usedtx=0, Opus DTX is off.
1479TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001480 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001481 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001482 cricket::AudioSendParameters parameters;
1483 parameters.codecs.push_back(kOpusCodec);
1484 parameters.codecs[0].params["usedtx"] = "0";
1485 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001486 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1487}
1488
1489// Test that with usedtx=1, Opus DTX is on.
1490TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenbergff976312016-03-30 23:28:51 -07001491 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001492 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001493 cricket::AudioSendParameters parameters;
1494 parameters.codecs.push_back(kOpusCodec);
1495 parameters.codecs[0].params["usedtx"] = "1";
1496 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001497 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1498 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1499}
1500
1501// Test that usedtx=1 works with stereo Opus.
1502TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenbergff976312016-03-30 23:28:51 -07001503 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001504 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001505 cricket::AudioSendParameters parameters;
1506 parameters.codecs.push_back(kOpusCodec);
1507 parameters.codecs[0].params["usedtx"] = "1";
1508 parameters.codecs[0].params["stereo"] = "1";
1509 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001510 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1511 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1512}
1513
1514// Test that usedtx=1 does not work with non Opus.
1515TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenbergff976312016-03-30 23:28:51 -07001516 EXPECT_TRUE(SetupSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001517 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001518 cricket::AudioSendParameters parameters;
1519 parameters.codecs.push_back(kIsacCodec);
1520 parameters.codecs[0].params["usedtx"] = "1";
1521 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001522 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1523}
1524
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001525// Test that we can switch back and forth between Opus and ISAC with CN.
1526TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenbergff976312016-03-30 23:28:51 -07001527 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001528 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001529 cricket::AudioSendParameters opus_parameters;
1530 opus_parameters.codecs.push_back(kOpusCodec);
1531 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001532 webrtc::CodecInst gcodec;
1533 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001534 EXPECT_EQ(111, gcodec.pltype);
1535 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001536
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001537 cricket::AudioSendParameters isac_parameters;
1538 isac_parameters.codecs.push_back(kIsacCodec);
1539 isac_parameters.codecs.push_back(kCn16000Codec);
1540 isac_parameters.codecs.push_back(kOpusCodec);
1541 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001542 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1543 EXPECT_EQ(103, gcodec.pltype);
1544 EXPECT_STREQ("ISAC", gcodec.plname);
1545
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001546 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001547 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001548 EXPECT_EQ(111, gcodec.pltype);
1549 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001550}
1551
1552// Test that we handle various ways of specifying bitrate.
1553TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenbergff976312016-03-30 23:28:51 -07001554 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001555 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001556 cricket::AudioSendParameters parameters;
1557 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1558 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001559 webrtc::CodecInst gcodec;
1560 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1561 EXPECT_EQ(103, gcodec.pltype);
1562 EXPECT_STREQ("ISAC", gcodec.plname);
1563 EXPECT_EQ(32000, gcodec.rate);
1564
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001565 parameters.codecs[0].bitrate = 0; // bitrate == default
1566 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001567 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1568 EXPECT_EQ(103, gcodec.pltype);
1569 EXPECT_STREQ("ISAC", gcodec.plname);
1570 EXPECT_EQ(-1, gcodec.rate);
1571
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001572 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1573 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001574 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1575 EXPECT_EQ(103, gcodec.pltype);
1576 EXPECT_STREQ("ISAC", gcodec.plname);
1577 EXPECT_EQ(28000, gcodec.rate);
1578
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001579 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1580 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001581 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1582 EXPECT_EQ(0, gcodec.pltype);
1583 EXPECT_STREQ("PCMU", gcodec.plname);
1584 EXPECT_EQ(64000, gcodec.rate);
1585
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001586 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(0, gcodec.pltype);
1590 EXPECT_STREQ("PCMU", gcodec.plname);
1591 EXPECT_EQ(64000, gcodec.rate);
1592
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001593 parameters.codecs[0] = kOpusCodec;
1594 parameters.codecs[0].bitrate = 0; // bitrate == default
1595 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001596 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1597 EXPECT_EQ(111, gcodec.pltype);
1598 EXPECT_STREQ("opus", gcodec.plname);
1599 EXPECT_EQ(32000, gcodec.rate);
1600}
1601
Brave Yao5225dd82015-03-26 07:39:19 +08001602// Test that we could set packet size specified in kCodecParamPTime.
1603TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenbergff976312016-03-30 23:28:51 -07001604 EXPECT_TRUE(SetupSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001605 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001606 cricket::AudioSendParameters parameters;
1607 parameters.codecs.push_back(kOpusCodec);
1608 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1609 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001610 webrtc::CodecInst gcodec;
1611 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1612 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1613
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001614 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1615 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001616 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1617 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1618
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001619 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1620 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001621 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1622 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1623
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001624 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1625 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1626 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001627 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1628 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1629
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001630 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1631 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1632 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001633 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1634 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1635}
1636
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001637// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001638TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenbergff976312016-03-30 23:28:51 -07001639 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001640 cricket::AudioSendParameters parameters;
1641 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001642}
1643
1644// Test that we can set send codecs even with telephone-event codec as the first
1645// one on the list.
1646TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenbergff976312016-03-30 23:28:51 -07001647 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001648 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001649 cricket::AudioSendParameters parameters;
1650 parameters.codecs.push_back(kTelephoneEventCodec);
1651 parameters.codecs.push_back(kIsacCodec);
1652 parameters.codecs.push_back(kPcmuCodec);
1653 parameters.codecs[0].id = 98; // DTMF
1654 parameters.codecs[1].id = 96;
1655 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001656 webrtc::CodecInst gcodec;
1657 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001658 EXPECT_EQ(96, gcodec.pltype);
1659 EXPECT_STREQ("ISAC", gcodec.plname);
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001660 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001661}
1662
solenberg31642aa2016-03-14 08:00:37 -07001663// Test that payload type range is limited for telephone-event codec.
1664TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
solenbergff976312016-03-30 23:28:51 -07001665 EXPECT_TRUE(SetupSendStream());
solenberg31642aa2016-03-14 08:00:37 -07001666 cricket::AudioSendParameters parameters;
1667 parameters.codecs.push_back(kTelephoneEventCodec);
1668 parameters.codecs.push_back(kIsacCodec);
1669 parameters.codecs[0].id = 0; // DTMF
1670 parameters.codecs[1].id = 96;
1671 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1672 EXPECT_TRUE(channel_->CanInsertDtmf());
1673 parameters.codecs[0].id = 128; // DTMF
1674 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1675 EXPECT_FALSE(channel_->CanInsertDtmf());
1676 parameters.codecs[0].id = 127;
1677 EXPECT_TRUE(channel_->SetSendParameters(parameters));
1678 EXPECT_TRUE(channel_->CanInsertDtmf());
1679 parameters.codecs[0].id = -1; // DTMF
1680 EXPECT_FALSE(channel_->SetSendParameters(parameters));
1681 EXPECT_FALSE(channel_->CanInsertDtmf());
1682}
1683
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001684// Test that we can set send codecs even with CN codec as the first
1685// one on the list.
1686TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenbergff976312016-03-30 23:28:51 -07001687 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001688 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001689 cricket::AudioSendParameters parameters;
1690 parameters.codecs.push_back(kCn16000Codec);
1691 parameters.codecs.push_back(kIsacCodec);
1692 parameters.codecs.push_back(kPcmuCodec);
1693 parameters.codecs[0].id = 98; // wideband CN
1694 parameters.codecs[1].id = 96;
1695 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001696 webrtc::CodecInst gcodec;
1697 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1698 EXPECT_EQ(96, gcodec.pltype);
1699 EXPECT_STREQ("ISAC", gcodec.plname);
1700 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001701}
1702
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001703// Test that we set VAD and DTMF types correctly as caller.
1704TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001705 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001706 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001707 cricket::AudioSendParameters parameters;
1708 parameters.codecs.push_back(kIsacCodec);
1709 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001710 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001711 parameters.codecs.push_back(kCn16000Codec);
1712 parameters.codecs.push_back(kCn8000Codec);
1713 parameters.codecs.push_back(kTelephoneEventCodec);
1714 parameters.codecs.push_back(kRedCodec);
1715 parameters.codecs[0].id = 96;
1716 parameters.codecs[2].id = 97; // wideband CN
1717 parameters.codecs[4].id = 98; // DTMF
1718 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001719 webrtc::CodecInst gcodec;
1720 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1721 EXPECT_EQ(96, gcodec.pltype);
1722 EXPECT_STREQ("ISAC", gcodec.plname);
1723 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001724 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001725 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1726 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001727 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001728}
1729
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001730// Test that we set VAD and DTMF types correctly as callee.
1731TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001732 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001733 cricket::AudioSendParameters parameters;
1734 parameters.codecs.push_back(kIsacCodec);
1735 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001736 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001737 parameters.codecs.push_back(kCn16000Codec);
1738 parameters.codecs.push_back(kCn8000Codec);
1739 parameters.codecs.push_back(kTelephoneEventCodec);
1740 parameters.codecs.push_back(kRedCodec);
1741 parameters.codecs[0].id = 96;
1742 parameters.codecs[2].id = 97; // wideband CN
1743 parameters.codecs[4].id = 98; // DTMF
1744 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001745 EXPECT_TRUE(channel_->AddSendStream(
1746 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001747 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001748
1749 webrtc::CodecInst gcodec;
1750 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1751 EXPECT_EQ(96, gcodec.pltype);
1752 EXPECT_STREQ("ISAC", gcodec.plname);
1753 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001754 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001755 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1756 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001757 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001758}
1759
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001760// Test that we only apply VAD if we have a CN codec that matches the
1761// send codec clockrate.
1762TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenbergff976312016-03-30 23:28:51 -07001763 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001764 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001765 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001766 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001767 parameters.codecs.push_back(kIsacCodec);
1768 parameters.codecs.push_back(kCn16000Codec);
1769 parameters.codecs[1].id = 97;
1770 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001771 webrtc::CodecInst gcodec;
1772 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1773 EXPECT_STREQ("ISAC", gcodec.plname);
1774 EXPECT_TRUE(voe_.GetVAD(channel_num));
1775 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1776 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001777 parameters.codecs[0] = kPcmuCodec;
1778 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001779 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1780 EXPECT_STREQ("PCMU", gcodec.plname);
1781 EXPECT_FALSE(voe_.GetVAD(channel_num));
1782 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001783 parameters.codecs[1] = kCn8000Codec;
1784 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001785 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1786 EXPECT_STREQ("PCMU", gcodec.plname);
1787 EXPECT_TRUE(voe_.GetVAD(channel_num));
1788 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001789 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001790 parameters.codecs[0] = kIsacCodec;
1791 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001792 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1793 EXPECT_STREQ("ISAC", gcodec.plname);
1794 EXPECT_FALSE(voe_.GetVAD(channel_num));
1795}
1796
1797// Test that we perform case-insensitive matching of codec names.
1798TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenbergff976312016-03-30 23:28:51 -07001799 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001800 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001801 cricket::AudioSendParameters parameters;
1802 parameters.codecs.push_back(kIsacCodec);
1803 parameters.codecs.push_back(kPcmuCodec);
1804 parameters.codecs.push_back(kCn16000Codec);
1805 parameters.codecs.push_back(kCn8000Codec);
1806 parameters.codecs.push_back(kTelephoneEventCodec);
1807 parameters.codecs.push_back(kRedCodec);
1808 parameters.codecs[0].name = "iSaC";
1809 parameters.codecs[0].id = 96;
1810 parameters.codecs[2].id = 97; // wideband CN
1811 parameters.codecs[4].id = 98; // DTMF
1812 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001813 webrtc::CodecInst gcodec;
1814 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1815 EXPECT_EQ(96, gcodec.pltype);
1816 EXPECT_STREQ("ISAC", gcodec.plname);
1817 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001818 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001819 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1820 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
Fredrik Solenbergb5727682015-12-04 15:22:19 +01001821 EXPECT_TRUE(channel_->CanInsertDtmf());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001822}
1823
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001824// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001825TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenbergff976312016-03-30 23:28:51 -07001826 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001827 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001828 cricket::AudioSendParameters parameters;
1829 parameters.codecs.push_back(kRedCodec);
1830 parameters.codecs.push_back(kIsacCodec);
1831 parameters.codecs.push_back(kPcmuCodec);
1832 parameters.codecs[0].id = 127;
1833 parameters.codecs[0].params[""] = "96/96";
1834 parameters.codecs[1].id = 96;
1835 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001836 webrtc::CodecInst gcodec;
1837 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1838 EXPECT_EQ(96, gcodec.pltype);
1839 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001840 EXPECT_TRUE(voe_.GetRED(channel_num));
1841 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001842}
1843
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001844// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001845TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
solenbergff976312016-03-30 23:28:51 -07001846 EXPECT_TRUE(SetupChannel());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001847 cricket::AudioSendParameters parameters;
1848 parameters.codecs.push_back(kRedCodec);
1849 parameters.codecs.push_back(kIsacCodec);
1850 parameters.codecs.push_back(kPcmuCodec);
1851 parameters.codecs[0].id = 127;
1852 parameters.codecs[0].params[""] = "96/96";
1853 parameters.codecs[1].id = 96;
1854 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001855 EXPECT_TRUE(channel_->AddSendStream(
1856 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001857 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001858 webrtc::CodecInst gcodec;
1859 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1860 EXPECT_EQ(96, gcodec.pltype);
1861 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001862 EXPECT_TRUE(voe_.GetRED(channel_num));
1863 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001864}
1865
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001866// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001867TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenbergff976312016-03-30 23:28:51 -07001868 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001869 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001870 cricket::AudioSendParameters parameters;
1871 parameters.codecs.push_back(kRedCodec);
1872 parameters.codecs.push_back(kIsacCodec);
1873 parameters.codecs.push_back(kPcmuCodec);
1874 parameters.codecs[0].id = 127;
1875 parameters.codecs[1].id = 96;
1876 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001877 webrtc::CodecInst gcodec;
1878 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1879 EXPECT_EQ(96, gcodec.pltype);
1880 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001881 EXPECT_TRUE(voe_.GetRED(channel_num));
1882 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001883}
1884
1885// Test that we ignore RED if the parameters aren't named the way we expect.
1886TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenbergff976312016-03-30 23:28:51 -07001887 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001888 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001889 cricket::AudioSendParameters parameters;
1890 parameters.codecs.push_back(kRedCodec);
1891 parameters.codecs.push_back(kIsacCodec);
1892 parameters.codecs.push_back(kPcmuCodec);
1893 parameters.codecs[0].id = 127;
1894 parameters.codecs[0].params["ABC"] = "96/96";
1895 parameters.codecs[1].id = 96;
1896 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001897 webrtc::CodecInst gcodec;
1898 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1899 EXPECT_EQ(96, gcodec.pltype);
1900 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001901 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001902}
1903
1904// Test that we ignore RED if it uses different primary/secondary encoding.
1905TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenbergff976312016-03-30 23:28:51 -07001906 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001907 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001908 cricket::AudioSendParameters parameters;
1909 parameters.codecs.push_back(kRedCodec);
1910 parameters.codecs.push_back(kIsacCodec);
1911 parameters.codecs.push_back(kPcmuCodec);
1912 parameters.codecs[0].id = 127;
1913 parameters.codecs[0].params[""] = "96/0";
1914 parameters.codecs[1].id = 96;
1915 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001916 webrtc::CodecInst gcodec;
1917 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1918 EXPECT_EQ(96, gcodec.pltype);
1919 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001920 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001921}
1922
1923// Test that we ignore RED if it uses more than 2 encodings.
1924TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenbergff976312016-03-30 23:28:51 -07001925 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001926 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001927 cricket::AudioSendParameters parameters;
1928 parameters.codecs.push_back(kRedCodec);
1929 parameters.codecs.push_back(kIsacCodec);
1930 parameters.codecs.push_back(kPcmuCodec);
1931 parameters.codecs[0].id = 127;
1932 parameters.codecs[0].params[""] = "96/96/96";
1933 parameters.codecs[1].id = 96;
1934 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001935 webrtc::CodecInst gcodec;
1936 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1937 EXPECT_EQ(96, gcodec.pltype);
1938 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001939 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001940}
1941
1942// Test that we ignore RED if it has bogus codec ids.
1943TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenbergff976312016-03-30 23:28:51 -07001944 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001945 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001946 cricket::AudioSendParameters parameters;
1947 parameters.codecs.push_back(kRedCodec);
1948 parameters.codecs.push_back(kIsacCodec);
1949 parameters.codecs.push_back(kPcmuCodec);
1950 parameters.codecs[0].id = 127;
1951 parameters.codecs[0].params[""] = "ABC/ABC";
1952 parameters.codecs[1].id = 96;
1953 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001954 webrtc::CodecInst gcodec;
1955 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1956 EXPECT_EQ(96, gcodec.pltype);
1957 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001958 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001959}
1960
1961// Test that we ignore RED if it refers to a codec that is not present.
1962TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenbergff976312016-03-30 23:28:51 -07001963 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001964 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001965 cricket::AudioSendParameters parameters;
1966 parameters.codecs.push_back(kRedCodec);
1967 parameters.codecs.push_back(kIsacCodec);
1968 parameters.codecs.push_back(kPcmuCodec);
1969 parameters.codecs[0].id = 127;
1970 parameters.codecs[0].params[""] = "97/97";
1971 parameters.codecs[1].id = 96;
1972 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001973 webrtc::CodecInst gcodec;
1974 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1975 EXPECT_EQ(96, gcodec.pltype);
1976 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001977 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001978}
1979
stefanba4c0e42016-02-04 04:12:24 -08001980class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
1981 public:
1982 WebRtcVoiceEngineWithSendSideBweTest()
1983 : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
1984};
1985
1986TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
1987 SupportsTransportSequenceNumberHeaderExtension) {
solenbergbc37fc82016-04-04 09:54:44 -07001988 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
stefanba4c0e42016-02-04 04:12:24 -08001989 ASSERT_FALSE(capabilities.header_extensions.empty());
1990 for (const cricket::RtpHeaderExtension& extension :
1991 capabilities.header_extensions) {
1992 if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
1993 EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
1994 extension.id);
1995 return;
1996 }
1997 }
1998 FAIL() << "Transport sequence number extension not in header-extension list.";
1999}
2000
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002001// Test support for audio level header extension.
2002TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
2003 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002004}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002005TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
2006 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
2007}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00002008
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00002009// Test support for absolute send time header extension.
2010TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
2011 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
2012}
2013TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
2014 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002015}
2016
solenberg1ac56142015-10-13 03:58:19 -07002017// Test that we can create a channel and start sending on it.
2018TEST_F(WebRtcVoiceEngineTestFake, Send) {
solenbergff976312016-03-30 23:28:51 -07002019 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002020 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002021 channel_->SetSend(true);
2022 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2023 channel_->SetSend(false);
2024 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2025}
2026
2027// Test that a channel will send if and only if it has a source and is enabled
2028// for sending.
2029TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
solenbergff976312016-03-30 23:28:51 -07002030 EXPECT_TRUE(SetupSendStream());
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002031 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2032 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2033 channel_->SetSend(true);
2034 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
2035 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_));
2036 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
2037 EXPECT_TRUE(channel_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
2038 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
solenberg1ac56142015-10-13 03:58:19 -07002039}
2040
2041// Test that we can create a channel and start playing out on it.
2042TEST_F(WebRtcVoiceEngineTestFake, Playout) {
solenbergff976312016-03-30 23:28:51 -07002043 EXPECT_TRUE(SetupRecvStream());
solenberg1ac56142015-10-13 03:58:19 -07002044 int channel_num = voe_.GetLastChannel();
2045 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
2046 EXPECT_TRUE(channel_->SetPlayout(true));
2047 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002048 EXPECT_TRUE(channel_->SetPlayout(false));
2049 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2050}
2051
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002052// Test that we can add and remove send streams.
2053TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
2054 SetupForMultiSendStream();
2055
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002056 // Set the global state for sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002057 channel_->SetSend(true);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002058
solenbergc96df772015-10-21 13:01:53 -07002059 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002060 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002061 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002062 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002063 // Verify that we are in a sending state for all the created streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002064 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002065 }
tfarina5237aaf2015-11-10 23:44:30 -08002066 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002067
solenbergc96df772015-10-21 13:01:53 -07002068 // Delete the send streams.
2069 for (uint32_t ssrc : kSsrcs4) {
2070 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002071 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002072 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002073 }
solenbergc96df772015-10-21 13:01:53 -07002074 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002075}
2076
2077// Test SetSendCodecs correctly configure the codecs in all send streams.
2078TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2079 SetupForMultiSendStream();
2080
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002081 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002082 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002083 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002084 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002085 }
2086
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002087 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002088 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002089 parameters.codecs.push_back(kIsacCodec);
2090 parameters.codecs.push_back(kCn16000Codec);
2091 parameters.codecs[1].id = 97;
2092 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002093
2094 // Verify ISAC and VAD are corrected configured on all send channels.
2095 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002096 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002097 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002098 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2099 EXPECT_STREQ("ISAC", gcodec.plname);
2100 EXPECT_TRUE(voe_.GetVAD(channel_num));
2101 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2102 }
2103
2104 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002105 parameters.codecs[0] = kPcmuCodec;
2106 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002107 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002108 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002109 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2110 EXPECT_STREQ("PCMU", gcodec.plname);
2111 EXPECT_FALSE(voe_.GetVAD(channel_num));
2112 }
2113}
2114
2115// Test we can SetSend on all send streams correctly.
2116TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2117 SetupForMultiSendStream();
2118
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002119 // Create the send channels and they should be a "not sending" date.
solenbergc96df772015-10-21 13:01:53 -07002120 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002121 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002122 cricket::StreamParams::CreateLegacy(ssrc)));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002123 EXPECT_TRUE(channel_->SetAudioSend(ssrc, true, nullptr, &fake_source_));
2124 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002125 }
2126
2127 // Set the global state for starting sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002128 channel_->SetSend(true);
solenbergc96df772015-10-21 13:01:53 -07002129 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002130 // Verify that we are in a sending state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002131 EXPECT_TRUE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002132 }
2133
2134 // Set the global state for stopping sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002135 channel_->SetSend(false);
solenbergc96df772015-10-21 13:01:53 -07002136 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002137 // Verify that we are in a stop state for all the send streams.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002138 EXPECT_FALSE(GetSendStream(ssrc).IsSending());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002139 }
2140}
2141
2142// Test we can set the correct statistics on all send streams.
2143TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2144 SetupForMultiSendStream();
2145
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002146 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002147 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002148 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002149 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002150 }
solenberg85a04962015-10-27 03:35:21 -07002151 SetAudioSendStreamStats();
2152
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002153 // Create a receive stream to check that none of the send streams end up in
2154 // the receive stream stats.
2155 EXPECT_TRUE(channel_->AddRecvStream(
2156 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002157 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002158 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2159 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002160
solenberg85a04962015-10-27 03:35:21 -07002161 // Check stats for the added streams.
2162 {
2163 cricket::VoiceMediaInfo info;
2164 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002165
solenberg85a04962015-10-27 03:35:21 -07002166 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002167 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002168 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002169 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002170 }
2171
2172 // We have added one receive stream. We should see empty stats.
2173 EXPECT_EQ(info.receivers.size(), 1u);
2174 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002175 }
solenberg1ac56142015-10-13 03:58:19 -07002176
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002177 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002178 {
2179 cricket::VoiceMediaInfo info;
2180 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2181 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002182 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002183 EXPECT_EQ(0u, info.receivers.size());
2184 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002185
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002186 // Deliver a new packet - a default receive stream should be created and we
2187 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002188 {
2189 cricket::VoiceMediaInfo info;
2190 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2191 SetAudioReceiveStreamStats();
2192 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002193 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002194 EXPECT_EQ(1u, info.receivers.size());
2195 VerifyVoiceReceiverInfo(info.receivers[0]);
2196 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002197}
2198
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002199// Test that we can add and remove receive streams, and do proper send/playout.
2200// We can receive on multiple streams while sending one stream.
2201TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002202 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002203 int channel_num1 = voe_.GetLastChannel();
2204
solenberg1ac56142015-10-13 03:58:19 -07002205 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002206 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002207 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002208 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002209
solenberg1ac56142015-10-13 03:58:19 -07002210 // Adding another stream should enable playout on the new stream only.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002211 EXPECT_TRUE(
2212 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002213 int channel_num2 = voe_.GetLastChannel();
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002214 channel_->SetSend(true);
2215 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002216
solenberg1ac56142015-10-13 03:58:19 -07002217 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002218 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2219 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2220
2221 // Adding yet another stream should have stream 2 and 3 enabled for playout.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002222 EXPECT_TRUE(
2223 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc3)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002224 int channel_num3 = voe_.GetLastChannel();
2225 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2226 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2227 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002228
2229 // Stop sending.
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002230 channel_->SetSend(false);
2231 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002232
2233 // Stop playout.
2234 EXPECT_TRUE(channel_->SetPlayout(false));
2235 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2236 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2237 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2238
solenberg1ac56142015-10-13 03:58:19 -07002239 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002240 EXPECT_TRUE(channel_->SetPlayout(true));
2241 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2242 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2243 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2244
solenberg1ac56142015-10-13 03:58:19 -07002245 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002246 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2247 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002248 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002249}
2250
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002251// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002252// and start sending on it.
2253TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
solenbergff976312016-03-30 23:28:51 -07002254 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002255 cricket::AudioOptions options_adjust_agc;
2256 options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002257 webrtc::AgcConfig agc_config;
2258 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2259 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002260 send_parameters_.options = options_adjust_agc;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002261 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002262 channel_->SetSend(true);
2263 EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002264 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2265 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002266 channel_->SetSend(false);
2267 EXPECT_FALSE(GetSendStream(kSsrc1).IsSending());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002268 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002269}
2270
wu@webrtc.org97077a32013-10-25 21:18:33 +00002271TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002272 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002273 webrtc::AgcConfig agc_config;
2274 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2275 EXPECT_EQ(0, agc_config.targetLeveldBOv);
solenberg246b8172015-12-08 09:50:23 -08002276 send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2277 send_parameters_.options.tx_agc_digital_compression_gain =
2278 rtc::Optional<uint16_t>(9);
2279 send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
2280 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2281 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002282 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2283 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2284 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2285 EXPECT_TRUE(agc_config.limiterEnable);
2286
2287 // Check interaction with adjust_agc_delta. Both should be respected, for
2288 // backwards compatibility.
solenberg246b8172015-12-08 09:50:23 -08002289 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
2290 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002291 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2292 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2293}
2294
wu@webrtc.org97077a32013-10-25 21:18:33 +00002295TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenbergff976312016-03-30 23:28:51 -07002296 EXPECT_TRUE(SetupSendStream());
solenberg246b8172015-12-08 09:50:23 -08002297 send_parameters_.options.recording_sample_rate =
2298 rtc::Optional<uint32_t>(48000);
2299 send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
2300 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002301
2302 unsigned int recording_sample_rate, playout_sample_rate;
2303 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2304 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2305 EXPECT_EQ(48000u, recording_sample_rate);
2306 EXPECT_EQ(44100u, playout_sample_rate);
2307}
2308
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002309// Test that we can set the outgoing SSRC properly.
solenbergff976312016-03-30 23:28:51 -07002310// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002311TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenbergff976312016-03-30 23:28:51 -07002312 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002313 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002314}
2315
2316TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2317 // Setup. We need send codec to be set to get all stats.
solenbergff976312016-03-30 23:28:51 -07002318 EXPECT_TRUE(SetupSendStream());
solenberg85a04962015-10-27 03:35:21 -07002319 SetAudioSendStreamStats();
solenbergff976312016-03-30 23:28:51 -07002320 // SetupSendStream adds a send stream with kSsrc1, so the receive
solenberg1ac56142015-10-13 03:58:19 -07002321 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002322 EXPECT_TRUE(channel_->AddRecvStream(
2323 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002324 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2325 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002326
solenberg85a04962015-10-27 03:35:21 -07002327 // Check stats for the added streams.
2328 {
2329 cricket::VoiceMediaInfo info;
2330 EXPECT_EQ(true, channel_->GetStats(&info));
2331
2332 // We have added one send stream. We should see the stats we've set.
2333 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002334 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002335 // We have added one receive stream. We should see empty stats.
2336 EXPECT_EQ(info.receivers.size(), 1u);
2337 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2338 }
solenberg1ac56142015-10-13 03:58:19 -07002339
solenberg566ef242015-11-06 15:34:49 -08002340 // Start sending - this affects some reported stats.
2341 {
2342 cricket::VoiceMediaInfo info;
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002343 channel_->SetSend(true);
solenberg566ef242015-11-06 15:34:49 -08002344 EXPECT_EQ(true, channel_->GetStats(&info));
2345 VerifyVoiceSenderInfo(info.senders[0], true);
2346 }
2347
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002348 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002349 {
2350 cricket::VoiceMediaInfo info;
2351 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2352 EXPECT_EQ(true, channel_->GetStats(&info));
2353 EXPECT_EQ(1u, info.senders.size());
2354 EXPECT_EQ(0u, info.receivers.size());
2355 }
solenberg1ac56142015-10-13 03:58:19 -07002356
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002357 // Deliver a new packet - a default receive stream should be created and we
2358 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002359 {
2360 cricket::VoiceMediaInfo info;
2361 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2362 SetAudioReceiveStreamStats();
2363 EXPECT_EQ(true, channel_->GetStats(&info));
2364 EXPECT_EQ(1u, info.senders.size());
2365 EXPECT_EQ(1u, info.receivers.size());
2366 VerifyVoiceReceiverInfo(info.receivers[0]);
2367 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002368}
2369
2370// Test that we can set the outgoing SSRC properly with multiple streams.
solenbergff976312016-03-30 23:28:51 -07002371// SSRC is set in SetupSendStream() by calling AddSendStream.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002372TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002373 EXPECT_TRUE(SetupSendStream());
solenberg3a941542015-11-16 07:34:50 -08002374 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002375 EXPECT_TRUE(channel_->AddRecvStream(
2376 cricket::StreamParams::CreateLegacy(kSsrc2)));
2377 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002378}
2379
2380// Test that the local SSRC is the same on sending and receiving channels if the
2381// receive channel is created before the send channel.
2382TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
solenbergff976312016-03-30 23:28:51 -07002383 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002384 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2385 int receive_channel_num = voe_.GetLastChannel();
2386 EXPECT_TRUE(channel_->AddSendStream(
2387 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002388
solenberg3a941542015-11-16 07:34:50 -08002389 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002390 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002391}
2392
2393// Test that we can properly receive packets.
2394TEST_F(WebRtcVoiceEngineTestFake, Recv) {
solenbergff976312016-03-30 23:28:51 -07002395 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002396 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002397 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002398 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002399 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002400}
2401
2402// Test that we can properly receive packets on multiple streams.
2403TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenbergff976312016-03-30 23:28:51 -07002404 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002405 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2406 int channel_num1 = voe_.GetLastChannel();
2407 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2408 int channel_num2 = voe_.GetLastChannel();
2409 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2410 int channel_num3 = voe_.GetLastChannel();
2411 // Create packets with the right SSRCs.
2412 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002413 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002414 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002415 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002416 }
2417 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2418 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2419 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002420
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002421 DeliverPacket(packets[0], sizeof(packets[0]));
2422 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2423 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2424 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002425
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002426 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002427 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002428 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2429 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002430
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002431 DeliverPacket(packets[2], sizeof(packets[2]));
2432 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002433 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002434 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002435
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002436 DeliverPacket(packets[3], sizeof(packets[3]));
2437 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2438 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002439 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2440
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002441 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2442 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2443 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2444}
2445
solenberg7e63ef02015-11-20 00:19:43 -08002446// Test that receiving on an unsignalled stream works (default channel will be
2447// created).
2448TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
solenbergff976312016-03-30 23:28:51 -07002449 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002450 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2451 int channel_num = voe_.GetLastChannel();
2452 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2453}
2454
2455// Test that receiving on an unsignalled stream works (default channel will be
2456// created), and that packets will be forwarded to the default channel
2457// regardless of their SSRCs.
2458TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
solenbergff976312016-03-30 23:28:51 -07002459 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002460 char packet[sizeof(kPcmuFrame)];
2461 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2462
2463 // Note that the first unknown SSRC cannot be 0, because we only support
2464 // creating receive streams for SSRC!=0.
2465 DeliverPacket(packet, sizeof(packet));
2466 int channel_num = voe_.GetLastChannel();
2467 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2468 // Once we have the default channel, SSRC==0 will be ok.
2469 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2470 rtc::SetBE32(&packet[8], ssrc);
2471 DeliverPacket(packet, sizeof(packet));
2472 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2473 }
2474}
2475
2476// Test that a default channel is created even after a signalled stream has been
2477// added, and that this stream will get any packets for unknown SSRCs.
2478TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
solenbergff976312016-03-30 23:28:51 -07002479 EXPECT_TRUE(SetupChannel());
solenberg7e63ef02015-11-20 00:19:43 -08002480 char packet[sizeof(kPcmuFrame)];
2481 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2482
2483 // Add a known stream, send packet and verify we got it.
2484 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2485 int signalled_channel_num = voe_.GetLastChannel();
2486 DeliverPacket(packet, sizeof(packet));
2487 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2488
2489 // Note that the first unknown SSRC cannot be 0, because we only support
2490 // creating receive streams for SSRC!=0.
2491 rtc::SetBE32(&packet[8], 7011);
2492 DeliverPacket(packet, sizeof(packet));
2493 int channel_num = voe_.GetLastChannel();
2494 EXPECT_NE(channel_num, signalled_channel_num);
2495 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2496 // Once we have the default channel, SSRC==0 will be ok.
2497 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2498 rtc::SetBE32(&packet[8], ssrc);
2499 DeliverPacket(packet, sizeof(packet));
2500 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2501 }
2502}
2503
solenberg0a617e22015-10-20 15:49:38 -07002504// Test that we properly handle failures to add a receive stream.
2505TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002506 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002507 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002508 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002509}
2510
solenberg0a617e22015-10-20 15:49:38 -07002511// Test that we properly handle failures to add a send stream.
2512TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002513 EXPECT_TRUE(SetupChannel());
solenberg0a617e22015-10-20 15:49:38 -07002514 voe_.set_fail_create_channel(true);
2515 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2516}
2517
solenberg1ac56142015-10-13 03:58:19 -07002518// Test that AddRecvStream creates new stream.
2519TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002520 EXPECT_TRUE(SetupRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002521 int channel_num = voe_.GetLastChannel();
2522 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002523 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002524}
2525
2526// Test that after adding a recv stream, we do not decode more codecs than
2527// those previously passed into SetRecvCodecs.
2528TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenbergff976312016-03-30 23:28:51 -07002529 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002530 cricket::AudioRecvParameters parameters;
2531 parameters.codecs.push_back(kIsacCodec);
2532 parameters.codecs.push_back(kPcmuCodec);
2533 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002534 EXPECT_TRUE(channel_->AddRecvStream(
2535 cricket::StreamParams::CreateLegacy(kSsrc1)));
2536 int channel_num2 = voe_.GetLastChannel();
2537 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002538 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002539 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002540 gcodec.channels = 2;
2541 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2542}
2543
2544// Test that we properly clean up any streams that were added, even if
2545// not explicitly removed.
2546TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenbergff976312016-03-30 23:28:51 -07002547 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002548 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002549 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2550 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2551 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2552 delete channel_;
2553 channel_ = NULL;
2554 EXPECT_EQ(0, voe_.GetNumChannels());
2555}
2556
wu@webrtc.org78187522013-10-07 23:32:02 +00002557TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenbergff976312016-03-30 23:28:51 -07002558 EXPECT_TRUE(SetupSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002559 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2560}
2561
2562TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
solenbergff976312016-03-30 23:28:51 -07002563 EXPECT_TRUE(SetupChannel());
wu@webrtc.org78187522013-10-07 23:32:02 +00002564 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002565 // Manually delete channel to simulate a failure.
2566 int channel = voe_.GetLastChannel();
2567 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2568 // Add recv stream 2 should work.
2569 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002570 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002571 EXPECT_NE(channel, new_channel);
2572 // The last created channel is deleted too.
2573 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002574}
2575
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002576// Test the InsertDtmf on default send stream as caller.
2577TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2578 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002579}
2580
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002581// Test the InsertDtmf on default send stream as callee
2582TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2583 TestInsertDtmf(0, false);
2584}
2585
2586// Test the InsertDtmf on specified send stream as caller.
2587TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2588 TestInsertDtmf(kSsrc1, true);
2589}
2590
2591// Test the InsertDtmf on specified send stream as callee.
2592TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2593 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002594}
2595
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002596TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenbergff976312016-03-30 23:28:51 -07002597 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002598 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002599 channel_->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002600 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2601 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2602 EXPECT_TRUE(channel_->SetPlayout(true));
2603 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2604 EXPECT_TRUE(channel_->SetPlayout(false));
2605 EXPECT_FALSE(channel_->SetPlayout(true));
2606}
2607
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002608TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenbergff976312016-03-30 23:28:51 -07002609 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002610
2611 bool ec_enabled;
2612 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002613 webrtc::AecmModes aecm_mode;
2614 bool cng_enabled;
2615 bool agc_enabled;
2616 webrtc::AgcModes agc_mode;
2617 webrtc::AgcConfig agc_config;
2618 bool ns_enabled;
2619 webrtc::NsModes ns_mode;
2620 bool highpass_filter_enabled;
2621 bool stereo_swapping_enabled;
2622 bool typing_detection_enabled;
2623 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002624 voe_.GetAecmMode(aecm_mode, cng_enabled);
2625 voe_.GetAgcStatus(agc_enabled, agc_mode);
2626 voe_.GetAgcConfig(agc_config);
2627 voe_.GetNsStatus(ns_enabled, ns_mode);
2628 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2629 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2630 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2631 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002632 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002633 EXPECT_FALSE(cng_enabled);
2634 EXPECT_TRUE(agc_enabled);
2635 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2636 EXPECT_TRUE(ns_enabled);
2637 EXPECT_TRUE(highpass_filter_enabled);
2638 EXPECT_FALSE(stereo_swapping_enabled);
2639 EXPECT_TRUE(typing_detection_enabled);
2640 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2641 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002642 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2643 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002644
solenberg246b8172015-12-08 09:50:23 -08002645 // Nothing set in AudioOptions, so everything should be as default.
2646 send_parameters_.options = cricket::AudioOptions();
2647 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002648 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002649 voe_.GetAecmMode(aecm_mode, cng_enabled);
2650 voe_.GetAgcStatus(agc_enabled, agc_mode);
2651 voe_.GetAgcConfig(agc_config);
2652 voe_.GetNsStatus(ns_enabled, ns_mode);
2653 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2654 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2655 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2656 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002657 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002658 EXPECT_FALSE(cng_enabled);
2659 EXPECT_TRUE(agc_enabled);
2660 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2661 EXPECT_TRUE(ns_enabled);
2662 EXPECT_TRUE(highpass_filter_enabled);
2663 EXPECT_FALSE(stereo_swapping_enabled);
2664 EXPECT_TRUE(typing_detection_enabled);
2665 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2666 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
solenberg246b8172015-12-08 09:50:23 -08002667 EXPECT_EQ(50, voe_.GetNetEqCapacity());
2668 EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002669
2670 // Turn echo cancellation off
solenberg246b8172015-12-08 09:50:23 -08002671 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2672 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002673 voe_.GetEcStatus(ec_enabled, ec_mode);
2674 EXPECT_FALSE(ec_enabled);
2675
2676 // Turn echo cancellation back on, with settings, and make sure
2677 // nothing else changed.
solenberg246b8172015-12-08 09:50:23 -08002678 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
2679 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002680 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002681 voe_.GetAecmMode(aecm_mode, cng_enabled);
2682 voe_.GetAgcStatus(agc_enabled, agc_mode);
2683 voe_.GetAgcConfig(agc_config);
2684 voe_.GetNsStatus(ns_enabled, ns_mode);
2685 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2686 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2687 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2688 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002689 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002690 EXPECT_TRUE(agc_enabled);
2691 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2692 EXPECT_TRUE(ns_enabled);
2693 EXPECT_TRUE(highpass_filter_enabled);
2694 EXPECT_FALSE(stereo_swapping_enabled);
2695 EXPECT_TRUE(typing_detection_enabled);
2696 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2697 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2698
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002699 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2700 // control.
solenberg246b8172015-12-08 09:50:23 -08002701 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2702 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002703 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002704 voe_.GetAecmMode(aecm_mode, cng_enabled);
2705 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002706 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002707 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2708
2709 // Turn off echo cancellation and delay agnostic aec.
solenberg246b8172015-12-08 09:50:23 -08002710 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
2711 send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
2712 send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
2713 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002714 voe_.GetEcStatus(ec_enabled, ec_mode);
2715 EXPECT_FALSE(ec_enabled);
2716 // Turning delay agnostic aec back on should also turn on echo cancellation.
solenberg246b8172015-12-08 09:50:23 -08002717 send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
2718 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002719 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002720 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002721 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002722 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2723
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002724 // Turn off AGC
solenberg246b8172015-12-08 09:50:23 -08002725 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
2726 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002727 voe_.GetAgcStatus(agc_enabled, agc_mode);
2728 EXPECT_FALSE(agc_enabled);
2729
2730 // Turn AGC back on
solenberg246b8172015-12-08 09:50:23 -08002731 send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
2732 send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
2733 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002734 voe_.GetAgcStatus(agc_enabled, agc_mode);
2735 EXPECT_TRUE(agc_enabled);
2736 voe_.GetAgcConfig(agc_config);
2737 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2738
2739 // Turn off other options (and stereo swapping on).
solenberg246b8172015-12-08 09:50:23 -08002740 send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
2741 send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
2742 send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
2743 send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
2744 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002745 voe_.GetNsStatus(ns_enabled, ns_mode);
2746 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2747 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2748 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2749 EXPECT_FALSE(ns_enabled);
2750 EXPECT_FALSE(highpass_filter_enabled);
2751 EXPECT_FALSE(typing_detection_enabled);
2752 EXPECT_TRUE(stereo_swapping_enabled);
2753
solenberg1ac56142015-10-13 03:58:19 -07002754 // Set options again to ensure it has no impact.
solenberg246b8172015-12-08 09:50:23 -08002755 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002756 voe_.GetEcStatus(ec_enabled, ec_mode);
2757 voe_.GetNsStatus(ns_enabled, ns_mode);
2758 EXPECT_TRUE(ec_enabled);
2759 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2760 EXPECT_FALSE(ns_enabled);
2761 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2762}
2763
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002764TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenbergff976312016-03-30 23:28:51 -07002765 EXPECT_TRUE(SetupSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002766
2767 bool ec_enabled;
2768 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002769 bool agc_enabled;
2770 webrtc::AgcModes agc_mode;
2771 bool ns_enabled;
2772 webrtc::NsModes ns_mode;
2773 bool highpass_filter_enabled;
2774 bool stereo_swapping_enabled;
2775 bool typing_detection_enabled;
2776
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002777 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002778 voe_.GetAgcStatus(agc_enabled, agc_mode);
2779 voe_.GetNsStatus(ns_enabled, ns_mode);
2780 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2781 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2782 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2783 EXPECT_TRUE(ec_enabled);
2784 EXPECT_TRUE(agc_enabled);
2785 EXPECT_TRUE(ns_enabled);
2786 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002787 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002788 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002789}
2790
2791TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2792 webrtc::AgcConfig set_config = {0};
2793 set_config.targetLeveldBOv = 3;
2794 set_config.digitalCompressionGaindB = 9;
2795 set_config.limiterEnable = true;
2796 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002797
2798 webrtc::AgcConfig config = {0};
2799 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2800 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2801 EXPECT_EQ(set_config.digitalCompressionGaindB,
2802 config.digitalCompressionGaindB);
2803 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2804}
2805
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002806TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenbergff976312016-03-30 23:28:51 -07002807 EXPECT_TRUE(SetupSendStream());
kwiberg686a8ef2016-02-26 03:00:35 -08002808 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
solenbergbc37fc82016-04-04 09:54:44 -07002809 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002810 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
kwiberg686a8ef2016-02-26 03:00:35 -08002811 std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
solenbergbc37fc82016-04-04 09:54:44 -07002812 static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
nisse51542be2016-02-12 02:27:06 -08002813 &call_, cricket::MediaConfig(), cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002814
2815 // Have to add a stream to make SetSend work.
2816 cricket::StreamParams stream1;
2817 stream1.ssrcs.push_back(1);
2818 channel1->AddSendStream(stream1);
2819 cricket::StreamParams stream2;
2820 stream2.ssrcs.push_back(2);
2821 channel2->AddSendStream(stream2);
2822
2823 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002824 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002825 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2826 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2827 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002828 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2829 EXPECT_EQ(parameters_options_all.options, channel1->options());
2830 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2831 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002832
2833 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002834 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002835 parameters_options_no_ns.options.noise_suppression =
2836 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002837 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2838 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002839 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2840 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2841 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002842 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002843
2844 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002845 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002846 parameters_options_no_agc.options.auto_gain_control =
2847 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002848 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002849 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2850 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2851 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002852 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002853
solenberg246b8172015-12-08 09:50:23 -08002854 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002855 bool ec_enabled;
2856 webrtc::EcModes ec_mode;
2857 bool agc_enabled;
2858 webrtc::AgcModes agc_mode;
2859 bool ns_enabled;
2860 webrtc::NsModes ns_mode;
2861 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_TRUE(ns_enabled);
2867
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002868 channel1->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_TRUE(agc_enabled);
2874 EXPECT_FALSE(ns_enabled);
2875
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002876 channel2->SetSend(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002877 voe_.GetEcStatus(ec_enabled, ec_mode);
2878 voe_.GetAgcStatus(agc_enabled, agc_mode);
2879 voe_.GetNsStatus(ns_enabled, ns_mode);
2880 EXPECT_TRUE(ec_enabled);
2881 EXPECT_FALSE(agc_enabled);
2882 EXPECT_TRUE(ns_enabled);
2883
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002884 // Make sure settings take effect while we are sending.
solenberg246b8172015-12-08 09:50:23 -08002885 ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002886 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2887 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002888 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01002889 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07002890 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01002891 rtc::Optional<bool>(false);
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -08002892 channel2->SetSend(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002893 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01002894 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2895 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2896 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002897 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002898 voe_.GetEcStatus(ec_enabled, ec_mode);
2899 voe_.GetAgcStatus(agc_enabled, agc_mode);
2900 voe_.GetNsStatus(ns_enabled, ns_mode);
2901 EXPECT_TRUE(ec_enabled);
2902 EXPECT_FALSE(agc_enabled);
2903 EXPECT_FALSE(ns_enabled);
2904}
2905
wu@webrtc.orgde305012013-10-31 15:40:38 +00002906// This test verifies DSCP settings are properly applied on voice media channel.
2907TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenbergff976312016-03-30 23:28:51 -07002908 EXPECT_TRUE(SetupSendStream());
nisse51542be2016-02-12 02:27:06 -08002909 cricket::FakeNetworkInterface network_interface;
2910 cricket::MediaConfig config;
kwiberg686a8ef2016-02-26 03:00:35 -08002911 std::unique_ptr<cricket::VoiceMediaChannel> channel;
nisse51542be2016-02-12 02:27:06 -08002912
solenbergbc37fc82016-04-04 09:54:44 -07002913 channel.reset(
2914 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08002915 channel->SetInterface(&network_interface);
2916 // Default value when DSCP is disabled should be DSCP_DEFAULT.
2917 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
2918
2919 config.enable_dscp = true;
solenbergbc37fc82016-04-04 09:54:44 -07002920 channel.reset(
2921 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08002922 channel->SetInterface(&network_interface);
2923 EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
2924
2925 // Verify that setting the option to false resets the
2926 // DiffServCodePoint.
2927 config.enable_dscp = false;
solenbergbc37fc82016-04-04 09:54:44 -07002928 channel.reset(
2929 engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
nisse51542be2016-02-12 02:27:06 -08002930 channel->SetInterface(&network_interface);
2931 // Default value when DSCP is disabled should be DSCP_DEFAULT.
2932 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
2933
2934 channel->SetInterface(nullptr);
wu@webrtc.orgde305012013-10-31 15:40:38 +00002935}
2936
solenberg1ac56142015-10-13 03:58:19 -07002937TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
solenbergff976312016-03-30 23:28:51 -07002938 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002939 cricket::WebRtcVoiceMediaChannel* media_channel =
2940 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002941 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2942 EXPECT_TRUE(channel_->AddRecvStream(
2943 cricket::StreamParams::CreateLegacy(kSsrc1)));
2944 int channel_id = voe_.GetLastChannel();
2945 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2946 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2947 EXPECT_TRUE(channel_->AddRecvStream(
2948 cricket::StreamParams::CreateLegacy(kSsrc2)));
2949 int channel_id2 = voe_.GetLastChannel();
2950 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002951}
2952
solenberg1ac56142015-10-13 03:58:19 -07002953TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
solenbergff976312016-03-30 23:28:51 -07002954 EXPECT_TRUE(SetupChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002955 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002956 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2957 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2958 EXPECT_TRUE(channel_->AddSendStream(
2959 cricket::StreamParams::CreateLegacy(kSsrc1)));
2960 int channel_id = voe_.GetLastChannel();
2961 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2962 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2963 EXPECT_TRUE(channel_->AddSendStream(
2964 cricket::StreamParams::CreateLegacy(kSsrc2)));
2965 int channel_id2 = voe_.GetLastChannel();
2966 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002967}
2968
solenberg4bac9c52015-10-09 02:32:53 -07002969TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
solenbergff976312016-03-30 23:28:51 -07002970 EXPECT_TRUE(SetupChannel());
solenberg4bac9c52015-10-09 02:32:53 -07002971 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002972 cricket::StreamParams stream;
2973 stream.ssrcs.push_back(kSsrc2);
2974 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002975 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002976 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002977 float scale = 0;
2978 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2979 EXPECT_DOUBLE_EQ(3, scale);
2980}
2981
2982TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07002983 EXPECT_TRUE(SetupChannel());
solenberg1ac56142015-10-13 03:58:19 -07002984 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2985 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2986 int channel_id = voe_.GetLastChannel();
2987 float scale = 0;
2988 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2989 EXPECT_DOUBLE_EQ(2, scale);
2990 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07002991 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002992 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002993}
2994
pbos8fc7fa72015-07-15 08:02:58 -07002995TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02002996 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07002997 const std::string kSyncLabel = "AvSyncLabel";
2998
solenbergff976312016-03-30 23:28:51 -07002999 EXPECT_TRUE(SetupSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003000 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3001 sp.sync_label = kSyncLabel;
3002 // Creating two channels to make sure that sync label is set properly for both
3003 // the default voice channel and following ones.
3004 EXPECT_TRUE(channel_->AddRecvStream(sp));
3005 sp.ssrcs[0] += 1;
3006 EXPECT_TRUE(channel_->AddRecvStream(sp));
3007
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003008 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003009 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003010 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003011 << "SyncGroup should be set based on sync_label";
3012 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003013 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003014 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003015}
3016
solenberg3a941542015-11-16 07:34:50 -08003017// TODO(solenberg): Remove, once recv streams are configured through Call.
3018// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003019TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003020 // Test that setting the header extensions results in the expected state
3021 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003022 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003023 ssrcs.push_back(223);
3024 ssrcs.push_back(224);
3025
solenbergff976312016-03-30 23:28:51 -07003026 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003027 cricket::WebRtcVoiceMediaChannel* media_channel =
3028 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003029 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003030 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003031 EXPECT_TRUE(media_channel->AddRecvStream(
3032 cricket::StreamParams::CreateLegacy(ssrc)));
3033 }
3034
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003035 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003036 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003037 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003038 EXPECT_NE(nullptr, s);
3039 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3040 }
3041
3042 // Set up receive extensions.
solenbergbc37fc82016-04-04 09:54:44 -07003043 cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003044 cricket::AudioRecvParameters recv_parameters;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003045 recv_parameters.extensions = capabilities.header_extensions;
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003046 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003047 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003048 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003049 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003050 EXPECT_NE(nullptr, s);
3051 const auto& s_exts = s->GetConfig().rtp.extensions;
Stefan Holmer9d69c3f2015-12-07 10:45:43 +01003052 EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
3053 for (const auto& e_ext : capabilities.header_extensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003054 for (const auto& s_ext : s_exts) {
3055 if (e_ext.id == s_ext.id) {
3056 EXPECT_EQ(e_ext.uri, s_ext.name);
3057 }
3058 }
3059 }
3060 }
3061
3062 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003063 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003064 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003065 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003066 EXPECT_NE(nullptr, s);
3067 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3068 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003069}
3070
3071TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3072 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003073 const uint32_t kAudioSsrc = 1;
jbaucheec21bd2016-03-20 06:15:43 -07003074 rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003075 static const unsigned char kRtcp[] = {
3076 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3077 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3078 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3079 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3080 };
jbaucheec21bd2016-03-20 06:15:43 -07003081 rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003082
solenbergff976312016-03-30 23:28:51 -07003083 EXPECT_TRUE(SetupSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003084 cricket::WebRtcVoiceMediaChannel* media_channel =
3085 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003086 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003087 EXPECT_TRUE(media_channel->AddRecvStream(
3088 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3089
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003090 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003091 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003092 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003093 EXPECT_EQ(0, s->received_packets());
3094 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3095 EXPECT_EQ(1, s->received_packets());
3096 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3097 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003098}
Minyue2013aec2015-05-13 14:14:42 +02003099
solenberg0a617e22015-10-20 15:49:38 -07003100// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003101// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003102TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenbergff976312016-03-30 23:28:51 -07003103 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003104 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003105 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003106 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3107 int recv_ch = voe_.GetLastChannel();
3108 EXPECT_NE(recv_ch, default_channel);
3109 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3110 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3111 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003112 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3113 recv_ch = voe_.GetLastChannel();
3114 EXPECT_NE(recv_ch, default_channel);
3115 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003116}
3117
3118TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenbergff976312016-03-30 23:28:51 -07003119 EXPECT_TRUE(SetupSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003120 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003121
3122 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3123 int recv_ch = voe_.GetLastChannel();
3124
3125 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3126 int send_ch = voe_.GetLastChannel();
3127
3128 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3129 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3130 // channel of |recv_ch|.This is not a common case, since, normally, only the
3131 // default channel can be associated. However, the default is not deletable.
3132 // So we force the |recv_ch| to associate with a non-default channel.
3133 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3134 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3135
3136 EXPECT_TRUE(channel_->RemoveSendStream(2));
3137 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3138}
stefan658910c2015-09-03 05:48:32 -07003139
deadbeef884f5852016-01-15 09:20:04 -08003140TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
solenbergff976312016-03-30 23:28:51 -07003141 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003142 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3143 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003144
3145 // Setting the sink before a recv stream exists should do nothing.
3146 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
3147 EXPECT_TRUE(
3148 channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
3149 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3150
3151 // Now try actually setting the sink.
3152 channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_2));
3153 EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
3154
3155 // Now try resetting it.
3156 channel_->SetRawAudioSink(kSsrc1, nullptr);
3157 EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
3158}
3159
3160TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkDefaultRecvStream) {
solenbergff976312016-03-30 23:28:51 -07003161 EXPECT_TRUE(SetupChannel());
kwiberg686a8ef2016-02-26 03:00:35 -08003162 std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
3163 std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
deadbeef884f5852016-01-15 09:20:04 -08003164
3165 // Should be able to set a default sink even when no stream exists.
3166 channel_->SetRawAudioSink(0, std::move(fake_sink_1));
3167
3168 // Create default channel and ensure it's assigned the default sink.
3169 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3170 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3171
3172 // Try resetting the default sink.
3173 channel_->SetRawAudioSink(0, nullptr);
3174 EXPECT_EQ(nullptr, GetRecvStream(0x01).sink());
3175
3176 // Try setting the default sink while the default stream exists.
3177 channel_->SetRawAudioSink(0, std::move(fake_sink_2));
3178 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3179
3180 // If we remove and add a default stream, it should get the same sink.
3181 EXPECT_TRUE(channel_->RemoveRecvStream(0x01));
3182 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3183 EXPECT_NE(nullptr, GetRecvStream(0x01).sink());
3184}
3185
skvlad7a43d252016-03-22 15:32:27 -07003186// Test that, just like the video channel, the voice channel communicates the
3187// network state to the call.
3188TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
solenbergff976312016-03-30 23:28:51 -07003189 EXPECT_TRUE(SetupChannel());
skvlad7a43d252016-03-22 15:32:27 -07003190
3191 EXPECT_EQ(webrtc::kNetworkUp,
3192 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3193 EXPECT_EQ(webrtc::kNetworkUp,
3194 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3195
3196 channel_->OnReadyToSend(false);
3197 EXPECT_EQ(webrtc::kNetworkDown,
3198 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3199 EXPECT_EQ(webrtc::kNetworkUp,
3200 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3201
3202 channel_->OnReadyToSend(true);
3203 EXPECT_EQ(webrtc::kNetworkUp,
3204 call_.GetNetworkState(webrtc::MediaType::AUDIO));
3205 EXPECT_EQ(webrtc::kNetworkUp,
3206 call_.GetNetworkState(webrtc::MediaType::VIDEO));
3207}
3208
stefan658910c2015-09-03 05:48:32 -07003209// Tests that the library initializes and shuts down properly.
3210TEST(WebRtcVoiceEngineTest, StartupShutdown) {
solenbergff976312016-03-30 23:28:51 -07003211 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003212 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003213 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003214 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3215 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003216 EXPECT_TRUE(channel != nullptr);
3217 delete channel;
solenbergff976312016-03-30 23:28:51 -07003218}
stefan658910c2015-09-03 05:48:32 -07003219
solenbergff976312016-03-30 23:28:51 -07003220// Tests that reference counting on the external ADM is correct.
solenbergbc37fc82016-04-04 09:54:44 -07003221TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
3222 testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
3223 EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
3224 EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
solenbergff976312016-03-30 23:28:51 -07003225 {
3226 cricket::WebRtcVoiceEngine engine(&adm);
3227 std::unique_ptr<webrtc::Call> call(
3228 webrtc::Call::Create(webrtc::Call::Config()));
3229 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3230 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
3231 EXPECT_TRUE(channel != nullptr);
3232 delete channel;
3233 }
stefan658910c2015-09-03 05:48:32 -07003234}
3235
3236// Tests that the library is configured with the codecs we want.
3237TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003238 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003239 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3240 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0), nullptr));
3241 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3242 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0), nullptr));
3243 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3244 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003245 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003246 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3247 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0), nullptr));
3248 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3249 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0), nullptr));
3250 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3251 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0), nullptr));
3252 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3253 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0), nullptr));
3254 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3255 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0), nullptr));
3256 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3257 cricket::AudioCodec(96, "red", 8000, 0, 1, 0), nullptr));
3258 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3259 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0), nullptr));
3260 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3261 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0), nullptr));
3262 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3263 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0), nullptr));
3264 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3265 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003266 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003267 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3268 cricket::AudioCodec(0, "", 8000, 0, 1, 0), nullptr)); // PCMU
3269 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3270 cricket::AudioCodec(8, "", 8000, 0, 1, 0), nullptr)); // PCMA
3271 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3272 cricket::AudioCodec(9, "", 8000, 0, 1, 0), nullptr)); // G722
3273 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3274 cricket::AudioCodec(13, "", 8000, 0, 1, 0), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003275 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003276 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3277 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003278 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003279 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3280 cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0), nullptr));
3281 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3282 cricket::AudioCodec(88, "", 0, 0, 1, 0), nullptr));
3283 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3284 cricket::AudioCodec(0, "", 0, 0, 2, 0), nullptr));
3285 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3286 cricket::AudioCodec(0, "", 5000, 0, 1, 0), nullptr));
3287 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3288 cricket::AudioCodec(0, "", 0, 5000, 1, 0), nullptr));
3289
stefan658910c2015-09-03 05:48:32 -07003290 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenbergff976312016-03-30 23:28:51 -07003291 cricket::WebRtcVoiceEngine engine(nullptr);
stefan658910c2015-09-03 05:48:32 -07003292 for (std::vector<cricket::AudioCodec>::const_iterator it =
3293 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3294 if (it->name == "CN" && it->clockrate == 16000) {
3295 EXPECT_EQ(105, it->id);
3296 } else if (it->name == "CN" && it->clockrate == 32000) {
3297 EXPECT_EQ(106, it->id);
3298 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3299 EXPECT_EQ(103, it->id);
3300 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3301 EXPECT_EQ(104, it->id);
3302 } else if (it->name == "G722" && it->clockrate == 8000) {
3303 EXPECT_EQ(9, it->id);
3304 } else if (it->name == "telephone-event") {
3305 EXPECT_EQ(126, it->id);
3306 } else if (it->name == "red") {
3307 EXPECT_EQ(127, it->id);
3308 } else if (it->name == "opus") {
3309 EXPECT_EQ(111, it->id);
3310 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3311 EXPECT_EQ("10", it->params.find("minptime")->second);
3312 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3313 EXPECT_EQ("60", it->params.find("maxptime")->second);
3314 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3315 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3316 }
3317 }
stefan658910c2015-09-03 05:48:32 -07003318}
3319
3320// Tests that VoE supports at least 32 channels
3321TEST(WebRtcVoiceEngineTest, Has32Channels) {
solenbergff976312016-03-30 23:28:51 -07003322 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003323 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003324 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003325
3326 cricket::VoiceMediaChannel* channels[32];
3327 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003328 while (num_channels < arraysize(channels)) {
nisse51542be2016-02-12 02:27:06 -08003329 cricket::VoiceMediaChannel* channel = engine.CreateChannel(
3330 call.get(), cricket::MediaConfig(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003331 if (!channel)
3332 break;
stefan658910c2015-09-03 05:48:32 -07003333 channels[num_channels++] = channel;
3334 }
3335
tfarina5237aaf2015-11-10 23:44:30 -08003336 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003337 EXPECT_EQ(expected, num_channels);
3338
3339 while (num_channels > 0) {
3340 delete channels[--num_channels];
3341 }
stefan658910c2015-09-03 05:48:32 -07003342}
3343
3344// Test that we set our preferred codecs properly.
3345TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
solenbergff976312016-03-30 23:28:51 -07003346 cricket::WebRtcVoiceEngine engine(nullptr);
kwiberg686a8ef2016-02-26 03:00:35 -08003347 std::unique_ptr<webrtc::Call> call(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003348 webrtc::Call::Create(webrtc::Call::Config()));
nisse51542be2016-02-12 02:27:06 -08003349 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
3350 cricket::AudioOptions(), call.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003351 cricket::AudioRecvParameters parameters;
3352 parameters.codecs = engine.codecs();
3353 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003354}