blob: 888de7d8a485e4254a9edaa898efa06edf75a080 [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
2 * libjingle
3 * Copyright 2008 Google Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000027
tfarina5237aaf2015-11-10 23:44:30 -080028#include "webrtc/base/arraysize.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000029#include "webrtc/base/byteorder.h"
30#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020031#include "webrtc/call.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032#include "talk/media/base/constants.h"
33#include "talk/media/base/fakemediaengine.h"
wu@webrtc.orgde305012013-10-31 15:40:38 +000034#include "talk/media/base/fakenetworkinterface.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035#include "talk/media/base/fakertp.h"
Fredrik Solenberg4b60c732015-05-07 14:07:48 +020036#include "talk/media/webrtc/fakewebrtccall.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000037#include "talk/media/webrtc/fakewebrtcvoiceengine.h"
38#include "talk/media/webrtc/webrtcvoiceengine.h"
deadbeefcbecd352015-09-23 11:50:27 -070039#include "webrtc/p2p/base/faketransportcontroller.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000040#include "talk/session/media/channel.h"
41
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000042using cricket::kRtpAudioLevelHeaderExtension;
43using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
44
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020045namespace {
46
47const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
48const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
49const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
50const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
51const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
52const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
53const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
54const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
55const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, 0,
56 1, 0);
solenberg85a04962015-10-27 03:35:21 -070057const uint32_t kSsrc1 = 0x99;
58const uint32_t kSsrc2 = 0x98;
59const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060
61class FakeVoEWrapper : public cricket::VoEWrapper {
62 public:
63 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
64 : cricket::VoEWrapper(engine, // processing
65 engine, // base
66 engine, // codec
67 engine, // dtmf
henrike@webrtc.org28e20752013-07-10 00:45:36 +000068 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000069 engine, // network
70 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000071 engine) { // volume
72 }
73};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020074} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000075
76class WebRtcVoiceEngineTestFake : public testing::Test {
77 public:
henrike@webrtc.org28e20752013-07-10 00:45:36 +000078 WebRtcVoiceEngineTestFake()
Fredrik Solenberg709ed672015-09-15 12:26:33 +020079 : call_(webrtc::Call::Config()),
solenbergbd138382015-11-20 16:08:07 -080080 engine_(new FakeVoEWrapper(&voe_)),
Jelena Marusicc28a8962015-05-29 15:05:44 +020081 channel_(nullptr) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +020082 send_parameters_.codecs.push_back(kPcmuCodec);
83 recv_parameters_.codecs.push_back(kPcmuCodec);
Karl Wibergbe579832015-11-10 22:34:18 +010084 options_adjust_agc_.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000085 }
solenberg1ac56142015-10-13 03:58:19 -070086 bool SetupEngine() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000087 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000088 return false;
89 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +020090 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +020091 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000092 }
solenberg1ac56142015-10-13 03:58:19 -070093 bool SetupEngineWithRecvStream() {
94 if (!SetupEngine()) {
95 return false;
96 }
97 return channel_->AddRecvStream(
98 cricket::StreamParams::CreateLegacy(kSsrc1));
99 }
100 bool SetupEngineWithSendStream() {
101 if (!SetupEngine()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000102 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000103 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000104 return channel_->AddSendStream(
105 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000106 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000107 void SetupForMultiSendStream() {
solenberg1ac56142015-10-13 03:58:19 -0700108 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700109 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800110 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700111 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700112 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800113 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000114 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000115 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200116 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000117 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000118 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200119 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000120 delete channel_;
121 engine_.Terminate();
122 }
123
solenberg3a941542015-11-16 07:34:50 -0800124 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
125 const auto* send_stream = call_.GetAudioSendStream(ssrc);
126 EXPECT_TRUE(send_stream);
127 return send_stream->GetConfig();
128 }
129
solenberg7add0582015-11-20 09:59:34 -0800130 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
131 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
132 EXPECT_TRUE(recv_stream);
133 return recv_stream->GetConfig();
134 }
135
Peter Boström0c4e06b2015-10-07 12:23:21 +0200136 void TestInsertDtmf(uint32_t ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000137 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200138 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200139 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000140 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700141 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000142 // send stream.
143 EXPECT_TRUE(channel_->AddSendStream(
144 cricket::StreamParams::CreateLegacy(kSsrc1)));
145 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000146
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000147 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200148 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000149 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
150 EXPECT_FALSE(channel_->CanInsertDtmf());
151 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111, cricket::DF_SEND));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200152 send_parameters_.codecs.push_back(kTelephoneEventCodec);
153 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000154 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000155
156 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700157 // If this is callee, there's no active send channel yet.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000158 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
159 EXPECT_TRUE(channel_->AddSendStream(
160 cricket::StreamParams::CreateLegacy(kSsrc1)));
161 }
162
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000163 // Check we fail if the ssrc is invalid.
164 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111, cricket::DF_SEND));
165
166 // Test send
solenberg0a617e22015-10-20 15:49:38 -0700167 int channel_id = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000168 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
169 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
170 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
171
172 // Test play
173 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(3, 134));
174 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 3, 134, cricket::DF_PLAY));
175 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(3, 134));
176
177 // Test send and play
178 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
179 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(4, 145));
180 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 4, 145,
181 cricket::DF_PLAY | cricket::DF_SEND));
182 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
183 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(4, 145));
184 }
185
186 // Test that send bandwidth is set correctly.
187 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000188 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
189 // |expected_result| is the expected result from SetMaxSendBandwidth().
190 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000191 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000192 int max_bitrate,
193 bool expected_result,
194 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200195 cricket::AudioSendParameters parameters;
196 parameters.codecs.push_back(codec);
197 parameters.max_bandwidth_bps = max_bitrate;
198 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
199
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000200 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000201 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000202 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000203 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000204 }
205
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000206 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenberg0a617e22015-10-20 15:49:38 -0700207 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000208
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000209 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800210 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000211
212 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200213 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000214 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200215 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800216 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000217
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000218 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200219 send_parameters_.extensions.clear();
220 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800221 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000222
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000223 // Ensure extension is set properly.
224 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200225 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
226 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800227 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
228 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
229 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000230
solenberg7add0582015-11-20 09:59:34 -0800231 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000232 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700233 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800234 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
235 call_.GetAudioSendStream(kSsrc2));
236 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
237 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
238 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000239
240 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200241 send_parameters_.codecs.push_back(kPcmuCodec);
242 send_parameters_.extensions.clear();
243 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800244 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
245 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000246 }
247
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000248 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700249 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000250
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000251 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800252 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000253
254 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800255 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000256 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800257 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
258 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000259
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000260 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800261 recv_parameters_.extensions.clear();
262 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
263 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000264
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000265 // Ensure extension is set properly.
266 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800267 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
268 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
269 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
270 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
271 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000272
solenberg7add0582015-11-20 09:59:34 -0800273 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000274 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700275 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800276 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
277 call_.GetAudioReceiveStream(kSsrc2));
278 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
279 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
280 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000281
282 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800283 recv_parameters_.extensions.clear();
284 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
285 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
286 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000287 }
288
solenberg85a04962015-10-27 03:35:21 -0700289 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
290 webrtc::AudioSendStream::Stats stats;
291 stats.local_ssrc = 12;
292 stats.bytes_sent = 345;
293 stats.packets_sent = 678;
294 stats.packets_lost = 9012;
295 stats.fraction_lost = 34.56f;
296 stats.codec_name = "codec_name_send";
297 stats.ext_seqnum = 789;
298 stats.jitter_ms = 12;
299 stats.rtt_ms = 345;
300 stats.audio_level = 678;
301 stats.aec_quality_min = 9.01f;
302 stats.echo_delay_median_ms = 234;
303 stats.echo_delay_std_ms = 567;
304 stats.echo_return_loss = 890;
305 stats.echo_return_loss_enhancement = 1234;
306 stats.typing_noise_detected = true;
307 return stats;
308 }
309 void SetAudioSendStreamStats() {
310 for (auto* s : call_.GetAudioSendStreams()) {
311 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200312 }
solenberg85a04962015-10-27 03:35:21 -0700313 }
solenberg566ef242015-11-06 15:34:49 -0800314 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
315 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700316 const auto stats = GetAudioSendStreamStats();
317 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
318 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
319 EXPECT_EQ(info.packets_sent, stats.packets_sent);
320 EXPECT_EQ(info.packets_lost, stats.packets_lost);
321 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
322 EXPECT_EQ(info.codec_name, stats.codec_name);
323 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
324 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
325 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
326 EXPECT_EQ(info.audio_level, stats.audio_level);
327 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
328 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
329 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
330 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
331 EXPECT_EQ(info.echo_return_loss_enhancement,
332 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800333 EXPECT_EQ(info.typing_noise_detected,
334 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700335 }
336
337 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
338 webrtc::AudioReceiveStream::Stats stats;
339 stats.remote_ssrc = 123;
340 stats.bytes_rcvd = 456;
341 stats.packets_rcvd = 768;
342 stats.packets_lost = 101;
343 stats.fraction_lost = 23.45f;
344 stats.codec_name = "codec_name_recv";
345 stats.ext_seqnum = 678;
346 stats.jitter_ms = 901;
347 stats.jitter_buffer_ms = 234;
348 stats.jitter_buffer_preferred_ms = 567;
349 stats.delay_estimate_ms = 890;
350 stats.audio_level = 1234;
351 stats.expand_rate = 5.67f;
352 stats.speech_expand_rate = 8.90f;
353 stats.secondary_decoded_rate = 1.23f;
354 stats.accelerate_rate = 4.56f;
355 stats.preemptive_expand_rate = 7.89f;
356 stats.decoding_calls_to_silence_generator = 12;
357 stats.decoding_calls_to_neteq = 345;
358 stats.decoding_normal = 67890;
359 stats.decoding_plc = 1234;
360 stats.decoding_cng = 5678;
361 stats.decoding_plc_cng = 9012;
362 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200363 return stats;
364 }
365 void SetAudioReceiveStreamStats() {
366 for (auto* s : call_.GetAudioReceiveStreams()) {
367 s->SetStats(GetAudioReceiveStreamStats());
368 }
369 }
370 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700371 const auto stats = GetAudioReceiveStreamStats();
372 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
373 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
374 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
375 EXPECT_EQ(info.packets_lost, stats.packets_lost);
376 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
377 EXPECT_EQ(info.codec_name, stats.codec_name);
378 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
379 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
380 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200381 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700382 stats.jitter_buffer_preferred_ms);
383 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
384 EXPECT_EQ(info.audio_level, stats.audio_level);
385 EXPECT_EQ(info.expand_rate, stats.expand_rate);
386 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
387 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
388 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
389 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200390 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700391 stats.decoding_calls_to_silence_generator);
392 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
393 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
394 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
395 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
396 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
397 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200398 }
399
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000400 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200401 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000402 cricket::FakeWebRtcVoiceEngine voe_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000403 cricket::WebRtcVoiceEngine engine_;
404 cricket::VoiceMediaChannel* channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000405
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200406 cricket::AudioSendParameters send_parameters_;
407 cricket::AudioRecvParameters recv_parameters_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000408 cricket::AudioOptions options_adjust_agc_;
409};
410
411// Tests that our stub library "works".
412TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
413 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000414 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000415 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000416 engine_.Terminate();
417 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000418}
419
420// Tests that we can create and destroy a channel.
421TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000422 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200423 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200424 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000425}
426
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000427// Tests that the list of supported codecs is created properly and ordered
428// correctly
429TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
430 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
431 ASSERT_FALSE(codecs.empty());
432 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
433 EXPECT_EQ(48000, codecs[0].clockrate);
434 EXPECT_EQ(2, codecs[0].channels);
435 EXPECT_EQ(64000, codecs[0].bitrate);
436 int pref = codecs[0].preference;
437 for (size_t i = 1; i < codecs.size(); ++i) {
438 EXPECT_GT(pref, codecs[i].preference);
439 pref = codecs[i].preference;
440 }
441}
442
443// Tests that we can find codecs by name or id, and that we interpret the
444// clockrate and bitrate fields properly.
445TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
446 cricket::AudioCodec codec;
447 webrtc::CodecInst codec_inst;
448 // Find PCMU with explicit clockrate and bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800449 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000450 // Find ISAC with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800451 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000452 // Find telephone-event with explicit clockrate and 0 bitrate.
solenberg26c8c912015-11-27 04:00:25 -0800453 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
454 &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000455 // Find ISAC with a different payload id.
456 codec = kIsacCodec;
457 codec.id = 127;
solenberg26c8c912015-11-27 04:00:25 -0800458 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000459 EXPECT_EQ(codec.id, codec_inst.pltype);
460 // Find PCMU with a 0 clockrate.
461 codec = kPcmuCodec;
462 codec.clockrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800463 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000464 EXPECT_EQ(codec.id, codec_inst.pltype);
465 EXPECT_EQ(8000, codec_inst.plfreq);
466 // Find PCMU with a 0 bitrate.
467 codec = kPcmuCodec;
468 codec.bitrate = 0;
solenberg26c8c912015-11-27 04:00:25 -0800469 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000470 EXPECT_EQ(codec.id, codec_inst.pltype);
471 EXPECT_EQ(64000, codec_inst.rate);
472 // Find ISAC with an explicit bitrate.
473 codec = kIsacCodec;
474 codec.bitrate = 32000;
solenberg26c8c912015-11-27 04:00:25 -0800475 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000476 EXPECT_EQ(codec.id, codec_inst.pltype);
477 EXPECT_EQ(32000, codec_inst.rate);
478}
479
480// Test that we set our inbound codecs properly, including changing PT.
481TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
482 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200483 cricket::AudioRecvParameters parameters;
484 parameters.codecs.push_back(kIsacCodec);
485 parameters.codecs.push_back(kPcmuCodec);
486 parameters.codecs.push_back(kTelephoneEventCodec);
487 parameters.codecs[0].id = 106; // collide with existing telephone-event
488 parameters.codecs[2].id = 126;
489 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700490 EXPECT_TRUE(channel_->AddRecvStream(
491 cricket::StreamParams::CreateLegacy(kSsrc1)));
492 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000493 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800494 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000495 gcodec.plfreq = 16000;
496 gcodec.channels = 1;
497 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
498 EXPECT_EQ(106, gcodec.pltype);
499 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800500 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000501 gcodec.plfreq = 8000;
502 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
503 EXPECT_EQ(126, gcodec.pltype);
504 EXPECT_STREQ("telephone-event", gcodec.plname);
505}
506
507// Test that we fail to set an unknown inbound codec.
508TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
509 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200510 cricket::AudioRecvParameters parameters;
511 parameters.codecs.push_back(kIsacCodec);
512 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
513 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000514}
515
516// Test that we fail if we have duplicate types in the inbound list.
517TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
518 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200519 cricket::AudioRecvParameters parameters;
520 parameters.codecs.push_back(kIsacCodec);
521 parameters.codecs.push_back(kCn16000Codec);
522 parameters.codecs[1].id = kIsacCodec.id;
523 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000524}
525
526// Test that we can decode OPUS without stereo parameters.
527TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
528 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200529 cricket::AudioRecvParameters parameters;
530 parameters.codecs.push_back(kIsacCodec);
531 parameters.codecs.push_back(kPcmuCodec);
532 parameters.codecs.push_back(kOpusCodec);
533 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000534 EXPECT_TRUE(channel_->AddRecvStream(
535 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700536 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000537 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800538 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000539 // Even without stereo parameters, recv codecs still specify channels = 2.
540 EXPECT_EQ(2, opus.channels);
541 EXPECT_EQ(111, opus.pltype);
542 EXPECT_STREQ("opus", opus.plname);
543 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700544 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000545 EXPECT_EQ(111, opus.pltype);
546}
547
548// Test that we can decode OPUS with stereo = 0.
549TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
550 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200551 cricket::AudioRecvParameters parameters;
552 parameters.codecs.push_back(kIsacCodec);
553 parameters.codecs.push_back(kPcmuCodec);
554 parameters.codecs.push_back(kOpusCodec);
555 parameters.codecs[2].params["stereo"] = "0";
556 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000557 EXPECT_TRUE(channel_->AddRecvStream(
558 cricket::StreamParams::CreateLegacy(kSsrc1)));
559 int channel_num2 = voe_.GetLastChannel();
560 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800561 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000562 // Even when stereo is off, recv codecs still specify channels = 2.
563 EXPECT_EQ(2, opus.channels);
564 EXPECT_EQ(111, opus.pltype);
565 EXPECT_STREQ("opus", opus.plname);
566 opus.pltype = 0;
567 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
568 EXPECT_EQ(111, opus.pltype);
569}
570
571// Test that we can decode OPUS with stereo = 1.
572TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
573 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200574 cricket::AudioRecvParameters parameters;
575 parameters.codecs.push_back(kIsacCodec);
576 parameters.codecs.push_back(kPcmuCodec);
577 parameters.codecs.push_back(kOpusCodec);
578 parameters.codecs[2].params["stereo"] = "1";
579 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000580 EXPECT_TRUE(channel_->AddRecvStream(
581 cricket::StreamParams::CreateLegacy(kSsrc1)));
582 int channel_num2 = voe_.GetLastChannel();
583 webrtc::CodecInst opus;
solenberg26c8c912015-11-27 04:00:25 -0800584 cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000585 EXPECT_EQ(2, opus.channels);
586 EXPECT_EQ(111, opus.pltype);
587 EXPECT_STREQ("opus", opus.plname);
588 opus.pltype = 0;
589 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
590 EXPECT_EQ(111, opus.pltype);
591}
592
593// Test that changes to recv codecs are applied to all streams.
594TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
595 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200596 cricket::AudioRecvParameters parameters;
597 parameters.codecs.push_back(kIsacCodec);
598 parameters.codecs.push_back(kPcmuCodec);
599 parameters.codecs.push_back(kTelephoneEventCodec);
600 parameters.codecs[0].id = 106; // collide with existing telephone-event
601 parameters.codecs[2].id = 126;
602 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000603 EXPECT_TRUE(channel_->AddRecvStream(
604 cricket::StreamParams::CreateLegacy(kSsrc1)));
605 int channel_num2 = voe_.GetLastChannel();
606 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800607 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000608 gcodec.plfreq = 16000;
609 gcodec.channels = 1;
610 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
611 EXPECT_EQ(106, gcodec.pltype);
612 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800613 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000614 gcodec.plfreq = 8000;
615 gcodec.channels = 1;
616 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
617 EXPECT_EQ(126, gcodec.pltype);
618 EXPECT_STREQ("telephone-event", gcodec.plname);
619}
620
621TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenberg1ac56142015-10-13 03:58:19 -0700622 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200623 cricket::AudioRecvParameters parameters;
624 parameters.codecs.push_back(kIsacCodec);
625 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200626 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000627
628 int channel_num2 = voe_.GetLastChannel();
629 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800630 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631 gcodec.plfreq = 16000;
632 gcodec.channels = 1;
633 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
634 EXPECT_EQ(106, gcodec.pltype);
635 EXPECT_STREQ("ISAC", gcodec.plname);
636}
637
638// Test that we can apply the same set of codecs again while playing.
639TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700640 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200641 cricket::AudioRecvParameters parameters;
642 parameters.codecs.push_back(kIsacCodec);
643 parameters.codecs.push_back(kCn16000Codec);
644 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200646 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000647
648 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200649 parameters.codecs[0].id = 127;
650 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
651 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000652 EXPECT_TRUE(voe_.GetPlayout(channel_num));
653}
654
655// Test that we can add a codec while playing.
656TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700657 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200658 cricket::AudioRecvParameters parameters;
659 parameters.codecs.push_back(kIsacCodec);
660 parameters.codecs.push_back(kCn16000Codec);
661 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662 EXPECT_TRUE(channel_->SetPlayout(true));
663
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200664 parameters.codecs.push_back(kOpusCodec);
665 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
666 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000667 EXPECT_TRUE(voe_.GetPlayout(channel_num));
668 webrtc::CodecInst gcodec;
solenberg26c8c912015-11-27 04:00:25 -0800669 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000670 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
671}
672
673TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenberg1ac56142015-10-13 03:58:19 -0700674 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000675
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000676 // Test that when autobw is enabled, bitrate is kept as the default
677 // value. autobw is enabled for the following tests because the target
678 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000679
680 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000681 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000682
683 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000684 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000685
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000686 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000687 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000688}
689
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000690TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700691 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000693 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000694
695 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000696 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
697 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000698
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000699 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000700 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
701 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000702}
703
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000704TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700705 EXPECT_TRUE(SetupEngineWithSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000706
707 // Test that we can only set a maximum bitrate for a fixed-rate codec
708 // if it's bigger than the fixed rate.
709
710 // PCMU, fixed bitrate == 64000.
711 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
712 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
713 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
714 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
715 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
716 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
717 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
718}
719
720TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -0700721 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200722 const int kDesiredBitrate = 128000;
723 cricket::AudioSendParameters parameters;
724 parameters.codecs = engine_.codecs();
725 parameters.max_bandwidth_bps = kDesiredBitrate;
726 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000727
728 EXPECT_TRUE(channel_->AddSendStream(
729 cricket::StreamParams::CreateLegacy(kSsrc1)));
730
731 int channel_num = voe_.GetLastChannel();
732 webrtc::CodecInst codec;
733 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200734 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000735}
736
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000737// Test that bitrate cannot be set for CBR codecs.
738// Bitrate is ignored if it is higher than the fixed bitrate.
739// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000740TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenberg1ac56142015-10-13 03:58:19 -0700741 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000742
743 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200744 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
745 int channel_num = voe_.GetLastChannel();
746 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000747 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
748 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200749
750 send_parameters_.max_bandwidth_bps = 128000;
751 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000752 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
753 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200754
755 send_parameters_.max_bandwidth_bps = 128;
756 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000757 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
758 EXPECT_EQ(64000, codec.rate);
759}
760
761// Test that we apply codecs properly.
762TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenberg1ac56142015-10-13 03:58:19 -0700763 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200764 cricket::AudioSendParameters parameters;
765 parameters.codecs.push_back(kIsacCodec);
766 parameters.codecs.push_back(kPcmuCodec);
767 parameters.codecs.push_back(kRedCodec);
768 parameters.codecs[0].id = 96;
769 parameters.codecs[0].bitrate = 48000;
770 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000771 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200772 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000773 webrtc::CodecInst gcodec;
774 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
775 EXPECT_EQ(96, gcodec.pltype);
776 EXPECT_EQ(48000, gcodec.rate);
777 EXPECT_STREQ("ISAC", gcodec.plname);
778 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000779 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000780 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
781 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
782 EXPECT_EQ(106, voe_.GetSendTelephoneEventPayloadType(channel_num));
783}
784
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000785// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
786// to apply.
787TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenberg1ac56142015-10-13 03:58:19 -0700788 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200789 cricket::AudioSendParameters parameters;
790 parameters.codecs.push_back(kIsacCodec);
791 parameters.codecs.push_back(kPcmuCodec);
792 parameters.codecs.push_back(kRedCodec);
793 parameters.codecs[0].id = 96;
794 parameters.codecs[0].bitrate = 48000;
795 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000796 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
797 // Calling SetSendCodec again with same codec which is already set.
798 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200799 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000800 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
801}
802
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000803// Verify that G722 is set with 16000 samples per second to WebRTC.
804TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenberg1ac56142015-10-13 03:58:19 -0700805 EXPECT_TRUE(SetupEngineWithSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000806 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200807 cricket::AudioSendParameters parameters;
808 parameters.codecs.push_back(kG722CodecSdp);
809 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000810 webrtc::CodecInst gcodec;
811 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
812 EXPECT_STREQ("G722", gcodec.plname);
813 EXPECT_EQ(1, gcodec.channels);
814 EXPECT_EQ(16000, gcodec.plfreq);
815}
816
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000817// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000818TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenberg1ac56142015-10-13 03:58:19 -0700819 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200820 cricket::AudioSendParameters parameters;
821 parameters.codecs.push_back(kOpusCodec);
822 parameters.codecs[0].bitrate = 0;
823 parameters.codecs[0].clockrate = 50000;
824 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000825}
826
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000827// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000828TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700829 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200830 cricket::AudioSendParameters parameters;
831 parameters.codecs.push_back(kOpusCodec);
832 parameters.codecs[0].bitrate = 0;
833 parameters.codecs[0].channels = 0;
834 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000835}
836
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000837// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000838TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700839 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200840 cricket::AudioSendParameters parameters;
841 parameters.codecs.push_back(kOpusCodec);
842 parameters.codecs[0].bitrate = 0;
843 parameters.codecs[0].channels = 0;
844 parameters.codecs[0].params["stereo"] = "1";
845 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000846}
847
848// Test that if channel is 1 for opus and there's no stereo, we fail.
849TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700850 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200851 cricket::AudioSendParameters parameters;
852 parameters.codecs.push_back(kOpusCodec);
853 parameters.codecs[0].bitrate = 0;
854 parameters.codecs[0].channels = 1;
855 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000856}
857
858// Test that if channel is 1 for opus and stereo=0, we fail.
859TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700860 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200861 cricket::AudioSendParameters parameters;
862 parameters.codecs.push_back(kOpusCodec);
863 parameters.codecs[0].bitrate = 0;
864 parameters.codecs[0].channels = 1;
865 parameters.codecs[0].params["stereo"] = "0";
866 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000867}
868
869// Test that if channel is 1 for opus and stereo=1, we fail.
870TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700871 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200872 cricket::AudioSendParameters parameters;
873 parameters.codecs.push_back(kOpusCodec);
874 parameters.codecs[0].bitrate = 0;
875 parameters.codecs[0].channels = 1;
876 parameters.codecs[0].params["stereo"] = "1";
877 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000878}
879
880// Test that with bitrate=0 and no stereo,
881// channels and bitrate are 1 and 32000.
882TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700883 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000884 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200885 cricket::AudioSendParameters parameters;
886 parameters.codecs.push_back(kOpusCodec);
887 parameters.codecs[0].bitrate = 0;
888 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000889 webrtc::CodecInst gcodec;
890 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
891 EXPECT_STREQ("opus", gcodec.plname);
892 EXPECT_EQ(1, gcodec.channels);
893 EXPECT_EQ(32000, gcodec.rate);
894}
895
896// Test that with bitrate=0 and stereo=0,
897// channels and bitrate are 1 and 32000.
898TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700899 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000900 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200901 cricket::AudioSendParameters parameters;
902 parameters.codecs.push_back(kOpusCodec);
903 parameters.codecs[0].bitrate = 0;
904 parameters.codecs[0].params["stereo"] = "0";
905 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000906 webrtc::CodecInst gcodec;
907 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
908 EXPECT_STREQ("opus", gcodec.plname);
909 EXPECT_EQ(1, gcodec.channels);
910 EXPECT_EQ(32000, gcodec.rate);
911}
912
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000913// Test that with bitrate=invalid and stereo=0,
914// channels and bitrate are 1 and 32000.
915TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700916 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000917 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200918 cricket::AudioSendParameters parameters;
919 parameters.codecs.push_back(kOpusCodec);
920 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000921 webrtc::CodecInst gcodec;
922
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000923 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200924 parameters.codecs[0].bitrate = 5999;
925 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000926 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
927 EXPECT_STREQ("opus", gcodec.plname);
928 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000929 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000930
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200931 parameters.codecs[0].bitrate = 510001;
932 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000933 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
934 EXPECT_STREQ("opus", gcodec.plname);
935 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000936 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000937}
938
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000939// Test that with bitrate=0 and stereo=1,
940// channels and bitrate are 2 and 64000.
941TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700942 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000943 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200944 cricket::AudioSendParameters parameters;
945 parameters.codecs.push_back(kOpusCodec);
946 parameters.codecs[0].bitrate = 0;
947 parameters.codecs[0].params["stereo"] = "1";
948 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000949 webrtc::CodecInst gcodec;
950 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
951 EXPECT_STREQ("opus", gcodec.plname);
952 EXPECT_EQ(2, gcodec.channels);
953 EXPECT_EQ(64000, gcodec.rate);
954}
955
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000956// Test that with bitrate=invalid and stereo=1,
957// channels and bitrate are 2 and 64000.
958TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700959 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000960 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200961 cricket::AudioSendParameters parameters;
962 parameters.codecs.push_back(kOpusCodec);
963 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000964 webrtc::CodecInst gcodec;
965
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000966 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200967 parameters.codecs[0].bitrate = 5999;
968 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000969 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
970 EXPECT_STREQ("opus", gcodec.plname);
971 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000972 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000973
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200974 parameters.codecs[0].bitrate = 510001;
975 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000976 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
977 EXPECT_STREQ("opus", gcodec.plname);
978 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000979 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000980}
981
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000982// Test that with bitrate=N and stereo unset,
983// channels and bitrate are 1 and N.
984TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700985 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000986 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200987 cricket::AudioSendParameters parameters;
988 parameters.codecs.push_back(kOpusCodec);
989 parameters.codecs[0].bitrate = 96000;
990 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000991 webrtc::CodecInst gcodec;
992 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
993 EXPECT_EQ(111, gcodec.pltype);
994 EXPECT_EQ(96000, gcodec.rate);
995 EXPECT_STREQ("opus", gcodec.plname);
996 EXPECT_EQ(1, gcodec.channels);
997 EXPECT_EQ(48000, gcodec.plfreq);
998}
999
1000// Test that with bitrate=N and stereo=0,
1001// channels and bitrate are 1 and N.
1002TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001003 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001004 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001005 cricket::AudioSendParameters parameters;
1006 parameters.codecs.push_back(kOpusCodec);
1007 parameters.codecs[0].bitrate = 30000;
1008 parameters.codecs[0].params["stereo"] = "0";
1009 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001010 webrtc::CodecInst gcodec;
1011 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1012 EXPECT_EQ(1, gcodec.channels);
1013 EXPECT_EQ(30000, gcodec.rate);
1014 EXPECT_STREQ("opus", gcodec.plname);
1015}
1016
1017// Test that with bitrate=N and without any parameters,
1018// channels and bitrate are 1 and N.
1019TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenberg1ac56142015-10-13 03:58:19 -07001020 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001021 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001022 cricket::AudioSendParameters parameters;
1023 parameters.codecs.push_back(kOpusCodec);
1024 parameters.codecs[0].bitrate = 30000;
1025 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001026 webrtc::CodecInst gcodec;
1027 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1028 EXPECT_EQ(1, gcodec.channels);
1029 EXPECT_EQ(30000, gcodec.rate);
1030 EXPECT_STREQ("opus", gcodec.plname);
1031}
1032
1033// Test that with bitrate=N and stereo=1,
1034// channels and bitrate are 2 and N.
1035TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001036 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001037 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001038 cricket::AudioSendParameters parameters;
1039 parameters.codecs.push_back(kOpusCodec);
1040 parameters.codecs[0].bitrate = 30000;
1041 parameters.codecs[0].params["stereo"] = "1";
1042 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001043 webrtc::CodecInst gcodec;
1044 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1045 EXPECT_EQ(2, gcodec.channels);
1046 EXPECT_EQ(30000, gcodec.rate);
1047 EXPECT_STREQ("opus", gcodec.plname);
1048}
1049
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001050// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1051// Also test that the "maxaveragebitrate" can't be set to values outside the
1052// range of 6000 and 510000
1053TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001054 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001055 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001056 cricket::AudioSendParameters parameters;
1057 parameters.codecs.push_back(kOpusCodec);
1058 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001059 webrtc::CodecInst gcodec;
1060
1061 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001062 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1063 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001064 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001065 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001066
1067 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001068 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1069 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001070 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001071 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001072
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001073 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1074 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001075 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1076 EXPECT_EQ(200000, gcodec.rate);
1077}
1078
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001079// Test that we can enable NACK with opus as caller.
1080TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001081 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001082 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001083 cricket::AudioSendParameters parameters;
1084 parameters.codecs.push_back(kOpusCodec);
1085 parameters.codecs[0].AddFeedbackParam(
1086 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1087 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001088 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001089 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001090 EXPECT_TRUE(voe_.GetNACK(channel_num));
1091}
1092
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001093// Test that we can enable NACK with opus as callee.
1094TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenberg0a617e22015-10-20 15:49:38 -07001095 EXPECT_TRUE(SetupEngineWithRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +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));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001102 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001103 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001104 EXPECT_FALSE(voe_.GetNACK(channel_num));
1105
1106 EXPECT_TRUE(channel_->AddSendStream(
1107 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001108 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001109}
1110
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001111// Test that we can enable NACK on receive streams.
1112TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001113 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001114 int channel_num1 = voe_.GetLastChannel();
1115 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1116 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001117 cricket::AudioSendParameters parameters;
1118 parameters.codecs.push_back(kOpusCodec);
1119 parameters.codecs[0].AddFeedbackParam(
1120 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1121 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001122 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1123 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001124 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001125 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1126 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1127}
1128
1129// Test that we can disable NACK.
1130TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001131 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001132 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001133 cricket::AudioSendParameters parameters;
1134 parameters.codecs.push_back(kOpusCodec);
1135 parameters.codecs[0].AddFeedbackParam(
1136 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1137 cricket::kParamValueEmpty));
1138 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001139 EXPECT_TRUE(voe_.GetNACK(channel_num));
1140
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001141 parameters.codecs.clear();
1142 parameters.codecs.push_back(kOpusCodec);
1143 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001144 EXPECT_FALSE(voe_.GetNACK(channel_num));
1145}
1146
1147// Test that we can disable NACK on receive streams.
1148TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001149 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001150 int channel_num1 = voe_.GetLastChannel();
1151 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1152 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001153 cricket::AudioSendParameters parameters;
1154 parameters.codecs.push_back(kOpusCodec);
1155 parameters.codecs[0].AddFeedbackParam(
1156 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1157 cricket::kParamValueEmpty));
1158 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001159 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1160 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1161
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001162 parameters.codecs.clear();
1163 parameters.codecs.push_back(kOpusCodec);
1164 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001165 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1166 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1167}
1168
1169// Test that NACK is enabled on a new receive stream.
1170TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001171 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001172 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001173 cricket::AudioSendParameters parameters;
1174 parameters.codecs.push_back(kIsacCodec);
1175 parameters.codecs.push_back(kCn16000Codec);
1176 parameters.codecs[0].AddFeedbackParam(
1177 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1178 cricket::kParamValueEmpty));
1179 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001180 EXPECT_TRUE(voe_.GetNACK(channel_num));
1181
1182 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1183 channel_num = voe_.GetLastChannel();
1184 EXPECT_TRUE(voe_.GetNACK(channel_num));
1185 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1186 channel_num = voe_.GetLastChannel();
1187 EXPECT_TRUE(voe_.GetNACK(channel_num));
1188}
1189
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001190// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001191TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenberg1ac56142015-10-13 03:58:19 -07001192 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001193 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001194 cricket::AudioSendParameters parameters;
1195 parameters.codecs.push_back(kOpusCodec);
1196 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001197 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1198}
1199
1200// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001201TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001202 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001203 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001204 cricket::AudioSendParameters parameters;
1205 parameters.codecs.push_back(kOpusCodec);
1206 parameters.codecs[0].bitrate = 0;
1207 parameters.codecs[0].params["useinbandfec"] = "0";
1208 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001209 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1210 webrtc::CodecInst gcodec;
1211 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1212 EXPECT_STREQ("opus", gcodec.plname);
1213 EXPECT_EQ(1, gcodec.channels);
1214 EXPECT_EQ(32000, gcodec.rate);
1215}
1216
1217// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001218TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001219 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001220 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001221 cricket::AudioSendParameters parameters;
1222 parameters.codecs.push_back(kOpusCodec);
1223 parameters.codecs[0].bitrate = 0;
1224 parameters.codecs[0].params["useinbandfec"] = "1";
1225 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001226 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1227 webrtc::CodecInst gcodec;
1228 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1229 EXPECT_STREQ("opus", gcodec.plname);
1230 EXPECT_EQ(1, gcodec.channels);
1231 EXPECT_EQ(32000, gcodec.rate);
1232}
1233
1234// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001235TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001236 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001237 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001238 cricket::AudioSendParameters parameters;
1239 parameters.codecs.push_back(kOpusCodec);
1240 parameters.codecs[0].bitrate = 0;
1241 parameters.codecs[0].params["stereo"] = "1";
1242 parameters.codecs[0].params["useinbandfec"] = "1";
1243 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001244 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1245 webrtc::CodecInst gcodec;
1246 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1247 EXPECT_STREQ("opus", gcodec.plname);
1248 EXPECT_EQ(2, gcodec.channels);
1249 EXPECT_EQ(64000, gcodec.rate);
1250}
1251
1252// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001253TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001254 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001255 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001256 cricket::AudioSendParameters parameters;
1257 parameters.codecs.push_back(kIsacCodec);
1258 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001259 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1260}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001261
1262// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1263TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001264 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001265 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001266 cricket::AudioSendParameters parameters;
1267 parameters.codecs.push_back(kIsacCodec);
1268 parameters.codecs[0].params["useinbandfec"] = "1";
1269 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001270 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1271}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001272
1273// Test that Opus FEC status can be changed.
1274TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenberg1ac56142015-10-13 03:58:19 -07001275 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001276 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001277 cricket::AudioSendParameters parameters;
1278 parameters.codecs.push_back(kOpusCodec);
1279 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001280 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001281 parameters.codecs[0].params["useinbandfec"] = "1";
1282 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001283 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1284}
1285
1286// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1287TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenberg1ac56142015-10-13 03:58:19 -07001288 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001289 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001290 cricket::AudioSendParameters parameters;
1291 parameters.codecs.push_back(kOpusCodec);
1292 parameters.codecs[0].bitrate = 0;
1293 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1294 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001295 EXPECT_EQ(cricket::kOpusBandwidthNb,
1296 voe_.GetMaxEncodingBandwidth(channel_num));
1297 webrtc::CodecInst gcodec;
1298 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1299 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001300
1301 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001302 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1303 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001304 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1305 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001306}
1307
1308// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1309TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenberg1ac56142015-10-13 03:58:19 -07001310 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001311 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001312 cricket::AudioSendParameters parameters;
1313 parameters.codecs.push_back(kOpusCodec);
1314 parameters.codecs[0].bitrate = 0;
1315 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1316 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001317 EXPECT_EQ(cricket::kOpusBandwidthMb,
1318 voe_.GetMaxEncodingBandwidth(channel_num));
1319 webrtc::CodecInst gcodec;
1320 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1321 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001322
1323 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001324 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1325 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001326 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1327 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001328}
1329
1330// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1331TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenberg1ac56142015-10-13 03:58:19 -07001332 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001333 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001334 cricket::AudioSendParameters parameters;
1335 parameters.codecs.push_back(kOpusCodec);
1336 parameters.codecs[0].bitrate = 0;
1337 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1338 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001339 EXPECT_EQ(cricket::kOpusBandwidthWb,
1340 voe_.GetMaxEncodingBandwidth(channel_num));
1341 webrtc::CodecInst gcodec;
1342 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1343 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001344
1345 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001346 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1347 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001348 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1349 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001350}
1351
1352// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1353TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenberg1ac56142015-10-13 03:58:19 -07001354 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001355 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001356 cricket::AudioSendParameters parameters;
1357 parameters.codecs.push_back(kOpusCodec);
1358 parameters.codecs[0].bitrate = 0;
1359 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1360 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001361 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1362 voe_.GetMaxEncodingBandwidth(channel_num));
1363 webrtc::CodecInst gcodec;
1364 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1365 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001366
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001367 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001368 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1369 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001370 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1371 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001372}
1373
1374// Test 24000 < maxplaybackrate triggers Opus full band mode.
1375TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenberg1ac56142015-10-13 03:58:19 -07001376 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001377 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001378 cricket::AudioSendParameters parameters;
1379 parameters.codecs.push_back(kOpusCodec);
1380 parameters.codecs[0].bitrate = 0;
1381 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1382 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001383 EXPECT_EQ(cricket::kOpusBandwidthFb,
1384 voe_.GetMaxEncodingBandwidth(channel_num));
1385 webrtc::CodecInst gcodec;
1386 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1387 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001388
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001389 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001390 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1391 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001392 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1393 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001394}
1395
1396// Test Opus that without maxplaybackrate, default playback rate is used.
1397TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001398 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001399 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001400 cricket::AudioSendParameters parameters;
1401 parameters.codecs.push_back(kOpusCodec);
1402 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001403 EXPECT_EQ(cricket::kOpusBandwidthFb,
1404 voe_.GetMaxEncodingBandwidth(channel_num));
1405}
1406
1407// Test the with non-Opus, maxplaybackrate has no effect.
1408TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001409 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001410 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001411 cricket::AudioSendParameters parameters;
1412 parameters.codecs.push_back(kIsacCodec);
1413 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1414 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001415 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1416}
1417
1418// Test maxplaybackrate can be set on two streams.
1419TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001420 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001421 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001422 cricket::AudioSendParameters parameters;
1423 parameters.codecs.push_back(kOpusCodec);
1424 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001425 // Default bandwidth is 24000.
1426 EXPECT_EQ(cricket::kOpusBandwidthFb,
1427 voe_.GetMaxEncodingBandwidth(channel_num));
1428
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001429 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001430
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001431 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001432 EXPECT_EQ(cricket::kOpusBandwidthNb,
1433 voe_.GetMaxEncodingBandwidth(channel_num));
1434
1435 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1436 channel_num = voe_.GetLastChannel();
1437 EXPECT_EQ(cricket::kOpusBandwidthNb,
1438 voe_.GetMaxEncodingBandwidth(channel_num));
1439}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001440
Minyue Li7100dcd2015-03-27 05:05:59 +01001441// Test that with usedtx=0, Opus DTX is off.
1442TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001443 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001444 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001445 cricket::AudioSendParameters parameters;
1446 parameters.codecs.push_back(kOpusCodec);
1447 parameters.codecs[0].params["usedtx"] = "0";
1448 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001449 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1450}
1451
1452// Test that with usedtx=1, Opus DTX is on.
1453TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001454 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001455 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001456 cricket::AudioSendParameters parameters;
1457 parameters.codecs.push_back(kOpusCodec);
1458 parameters.codecs[0].params["usedtx"] = "1";
1459 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001460 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1461 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1462}
1463
1464// Test that usedtx=1 works with stereo Opus.
1465TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001466 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001467 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001468 cricket::AudioSendParameters parameters;
1469 parameters.codecs.push_back(kOpusCodec);
1470 parameters.codecs[0].params["usedtx"] = "1";
1471 parameters.codecs[0].params["stereo"] = "1";
1472 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001473 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1474 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1475}
1476
1477// Test that usedtx=1 does not work with non Opus.
1478TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001479 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001480 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001481 cricket::AudioSendParameters parameters;
1482 parameters.codecs.push_back(kIsacCodec);
1483 parameters.codecs[0].params["usedtx"] = "1";
1484 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001485 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1486}
1487
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001488// Test that we can switch back and forth between Opus and ISAC with CN.
1489TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenberg1ac56142015-10-13 03:58:19 -07001490 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001491 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001492 cricket::AudioSendParameters opus_parameters;
1493 opus_parameters.codecs.push_back(kOpusCodec);
1494 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001495 webrtc::CodecInst gcodec;
1496 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001497 EXPECT_EQ(111, gcodec.pltype);
1498 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001499
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001500 cricket::AudioSendParameters isac_parameters;
1501 isac_parameters.codecs.push_back(kIsacCodec);
1502 isac_parameters.codecs.push_back(kCn16000Codec);
1503 isac_parameters.codecs.push_back(kOpusCodec);
1504 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001505 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1506 EXPECT_EQ(103, gcodec.pltype);
1507 EXPECT_STREQ("ISAC", gcodec.plname);
1508
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001509 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001510 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001511 EXPECT_EQ(111, gcodec.pltype);
1512 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001513}
1514
1515// Test that we handle various ways of specifying bitrate.
1516TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001517 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001518 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001519 cricket::AudioSendParameters parameters;
1520 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1521 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001522 webrtc::CodecInst gcodec;
1523 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1524 EXPECT_EQ(103, gcodec.pltype);
1525 EXPECT_STREQ("ISAC", gcodec.plname);
1526 EXPECT_EQ(32000, gcodec.rate);
1527
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001528 parameters.codecs[0].bitrate = 0; // bitrate == default
1529 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001530 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1531 EXPECT_EQ(103, gcodec.pltype);
1532 EXPECT_STREQ("ISAC", gcodec.plname);
1533 EXPECT_EQ(-1, gcodec.rate);
1534
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001535 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1536 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001537 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1538 EXPECT_EQ(103, gcodec.pltype);
1539 EXPECT_STREQ("ISAC", gcodec.plname);
1540 EXPECT_EQ(28000, gcodec.rate);
1541
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001542 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1543 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001544 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1545 EXPECT_EQ(0, gcodec.pltype);
1546 EXPECT_STREQ("PCMU", gcodec.plname);
1547 EXPECT_EQ(64000, gcodec.rate);
1548
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001549 parameters.codecs[0].bitrate = 0; // bitrate == default
1550 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001551 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1552 EXPECT_EQ(0, gcodec.pltype);
1553 EXPECT_STREQ("PCMU", gcodec.plname);
1554 EXPECT_EQ(64000, gcodec.rate);
1555
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001556 parameters.codecs[0] = kOpusCodec;
1557 parameters.codecs[0].bitrate = 0; // bitrate == default
1558 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001559 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1560 EXPECT_EQ(111, gcodec.pltype);
1561 EXPECT_STREQ("opus", gcodec.plname);
1562 EXPECT_EQ(32000, gcodec.rate);
1563}
1564
Brave Yao5225dd82015-03-26 07:39:19 +08001565// Test that we could set packet size specified in kCodecParamPTime.
1566TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenberg1ac56142015-10-13 03:58:19 -07001567 EXPECT_TRUE(SetupEngineWithSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001568 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001569 cricket::AudioSendParameters parameters;
1570 parameters.codecs.push_back(kOpusCodec);
1571 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1572 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001573 webrtc::CodecInst gcodec;
1574 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1575 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1576
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001577 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1578 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001579 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1580 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1581
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001582 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1583 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001584 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1585 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1586
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001587 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1588 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1589 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001590 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1591 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1592
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001593 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1594 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1595 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001596 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1597 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1598}
1599
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001600// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001601TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenberg1ac56142015-10-13 03:58:19 -07001602 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001603 cricket::AudioSendParameters parameters;
1604 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001605}
1606
1607// Test that we can set send codecs even with telephone-event codec as the first
1608// one on the list.
1609TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001610 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001611 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001612 cricket::AudioSendParameters parameters;
1613 parameters.codecs.push_back(kTelephoneEventCodec);
1614 parameters.codecs.push_back(kIsacCodec);
1615 parameters.codecs.push_back(kPcmuCodec);
1616 parameters.codecs[0].id = 98; // DTMF
1617 parameters.codecs[1].id = 96;
1618 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001619 webrtc::CodecInst gcodec;
1620 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001621 EXPECT_EQ(96, gcodec.pltype);
1622 EXPECT_STREQ("ISAC", gcodec.plname);
1623 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1624}
1625
1626// Test that we can set send codecs even with CN codec as the first
1627// one on the list.
1628TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001629 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001630 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001631 cricket::AudioSendParameters parameters;
1632 parameters.codecs.push_back(kCn16000Codec);
1633 parameters.codecs.push_back(kIsacCodec);
1634 parameters.codecs.push_back(kPcmuCodec);
1635 parameters.codecs[0].id = 98; // wideband CN
1636 parameters.codecs[1].id = 96;
1637 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001638 webrtc::CodecInst gcodec;
1639 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1640 EXPECT_EQ(96, gcodec.pltype);
1641 EXPECT_STREQ("ISAC", gcodec.plname);
1642 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001643}
1644
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001645// Test that we set VAD and DTMF types correctly as caller.
1646TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001647 EXPECT_TRUE(SetupEngineWithSendStream());
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(kIsacCodec);
1651 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001652 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001653 parameters.codecs.push_back(kCn16000Codec);
1654 parameters.codecs.push_back(kCn8000Codec);
1655 parameters.codecs.push_back(kTelephoneEventCodec);
1656 parameters.codecs.push_back(kRedCodec);
1657 parameters.codecs[0].id = 96;
1658 parameters.codecs[2].id = 97; // wideband CN
1659 parameters.codecs[4].id = 98; // DTMF
1660 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001661 webrtc::CodecInst gcodec;
1662 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1663 EXPECT_EQ(96, gcodec.pltype);
1664 EXPECT_STREQ("ISAC", gcodec.plname);
1665 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001666 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001667 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1668 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1669 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1670}
1671
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001672// Test that we set VAD and DTMF types correctly as callee.
1673TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001674 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001675 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001676 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001677
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001678 cricket::AudioSendParameters parameters;
1679 parameters.codecs.push_back(kIsacCodec);
1680 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001681 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001682 parameters.codecs.push_back(kCn16000Codec);
1683 parameters.codecs.push_back(kCn8000Codec);
1684 parameters.codecs.push_back(kTelephoneEventCodec);
1685 parameters.codecs.push_back(kRedCodec);
1686 parameters.codecs[0].id = 96;
1687 parameters.codecs[2].id = 97; // wideband CN
1688 parameters.codecs[4].id = 98; // DTMF
1689 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001690 EXPECT_TRUE(channel_->AddSendStream(
1691 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001692 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001693
1694 webrtc::CodecInst gcodec;
1695 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1696 EXPECT_EQ(96, gcodec.pltype);
1697 EXPECT_STREQ("ISAC", gcodec.plname);
1698 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001699 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001700 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1701 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1702 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1703}
1704
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001705// Test that we only apply VAD if we have a CN codec that matches the
1706// send codec clockrate.
1707TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenberg1ac56142015-10-13 03:58:19 -07001708 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001709 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001710 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001711 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001712 parameters.codecs.push_back(kIsacCodec);
1713 parameters.codecs.push_back(kCn16000Codec);
1714 parameters.codecs[1].id = 97;
1715 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001716 webrtc::CodecInst gcodec;
1717 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1718 EXPECT_STREQ("ISAC", gcodec.plname);
1719 EXPECT_TRUE(voe_.GetVAD(channel_num));
1720 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1721 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001722 parameters.codecs[0] = kPcmuCodec;
1723 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001724 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1725 EXPECT_STREQ("PCMU", gcodec.plname);
1726 EXPECT_FALSE(voe_.GetVAD(channel_num));
1727 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001728 parameters.codecs[1] = kCn8000Codec;
1729 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001730 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1731 EXPECT_STREQ("PCMU", gcodec.plname);
1732 EXPECT_TRUE(voe_.GetVAD(channel_num));
1733 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001734 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001735 parameters.codecs[0] = kIsacCodec;
1736 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001737 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1738 EXPECT_STREQ("ISAC", gcodec.plname);
1739 EXPECT_FALSE(voe_.GetVAD(channel_num));
1740}
1741
1742// Test that we perform case-insensitive matching of codec names.
1743TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenberg1ac56142015-10-13 03:58:19 -07001744 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001745 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001746 cricket::AudioSendParameters parameters;
1747 parameters.codecs.push_back(kIsacCodec);
1748 parameters.codecs.push_back(kPcmuCodec);
1749 parameters.codecs.push_back(kCn16000Codec);
1750 parameters.codecs.push_back(kCn8000Codec);
1751 parameters.codecs.push_back(kTelephoneEventCodec);
1752 parameters.codecs.push_back(kRedCodec);
1753 parameters.codecs[0].name = "iSaC";
1754 parameters.codecs[0].id = 96;
1755 parameters.codecs[2].id = 97; // wideband CN
1756 parameters.codecs[4].id = 98; // DTMF
1757 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001758 webrtc::CodecInst gcodec;
1759 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1760 EXPECT_EQ(96, gcodec.pltype);
1761 EXPECT_STREQ("ISAC", gcodec.plname);
1762 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001763 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001764 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1765 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1766 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1767}
1768
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001769// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001770TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001771 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001772 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001773 cricket::AudioSendParameters parameters;
1774 parameters.codecs.push_back(kRedCodec);
1775 parameters.codecs.push_back(kIsacCodec);
1776 parameters.codecs.push_back(kPcmuCodec);
1777 parameters.codecs[0].id = 127;
1778 parameters.codecs[0].params[""] = "96/96";
1779 parameters.codecs[1].id = 96;
1780 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001781 webrtc::CodecInst gcodec;
1782 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1783 EXPECT_EQ(96, gcodec.pltype);
1784 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001785 EXPECT_TRUE(voe_.GetRED(channel_num));
1786 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001787}
1788
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001789// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001790TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001791 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001792 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001793 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001794
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001795 cricket::AudioSendParameters parameters;
1796 parameters.codecs.push_back(kRedCodec);
1797 parameters.codecs.push_back(kIsacCodec);
1798 parameters.codecs.push_back(kPcmuCodec);
1799 parameters.codecs[0].id = 127;
1800 parameters.codecs[0].params[""] = "96/96";
1801 parameters.codecs[1].id = 96;
1802 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001803 EXPECT_TRUE(channel_->AddSendStream(
1804 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001805 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001806 webrtc::CodecInst gcodec;
1807 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1808 EXPECT_EQ(96, gcodec.pltype);
1809 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001810 EXPECT_TRUE(voe_.GetRED(channel_num));
1811 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001812}
1813
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001814// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001815TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenberg1ac56142015-10-13 03:58:19 -07001816 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001817 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001818 cricket::AudioSendParameters parameters;
1819 parameters.codecs.push_back(kRedCodec);
1820 parameters.codecs.push_back(kIsacCodec);
1821 parameters.codecs.push_back(kPcmuCodec);
1822 parameters.codecs[0].id = 127;
1823 parameters.codecs[1].id = 96;
1824 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001825 webrtc::CodecInst gcodec;
1826 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1827 EXPECT_EQ(96, gcodec.pltype);
1828 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001829 EXPECT_TRUE(voe_.GetRED(channel_num));
1830 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001831}
1832
1833// Test that we ignore RED if the parameters aren't named the way we expect.
1834TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001835 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001836 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001837 cricket::AudioSendParameters parameters;
1838 parameters.codecs.push_back(kRedCodec);
1839 parameters.codecs.push_back(kIsacCodec);
1840 parameters.codecs.push_back(kPcmuCodec);
1841 parameters.codecs[0].id = 127;
1842 parameters.codecs[0].params["ABC"] = "96/96";
1843 parameters.codecs[1].id = 96;
1844 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001845 webrtc::CodecInst gcodec;
1846 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1847 EXPECT_EQ(96, gcodec.pltype);
1848 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001849 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001850}
1851
1852// Test that we ignore RED if it uses different primary/secondary encoding.
1853TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001854 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001855 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001856 cricket::AudioSendParameters parameters;
1857 parameters.codecs.push_back(kRedCodec);
1858 parameters.codecs.push_back(kIsacCodec);
1859 parameters.codecs.push_back(kPcmuCodec);
1860 parameters.codecs[0].id = 127;
1861 parameters.codecs[0].params[""] = "96/0";
1862 parameters.codecs[1].id = 96;
1863 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001864 webrtc::CodecInst gcodec;
1865 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1866 EXPECT_EQ(96, gcodec.pltype);
1867 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001868 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001869}
1870
1871// Test that we ignore RED if it uses more than 2 encodings.
1872TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001873 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001874 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001875 cricket::AudioSendParameters parameters;
1876 parameters.codecs.push_back(kRedCodec);
1877 parameters.codecs.push_back(kIsacCodec);
1878 parameters.codecs.push_back(kPcmuCodec);
1879 parameters.codecs[0].id = 127;
1880 parameters.codecs[0].params[""] = "96/96/96";
1881 parameters.codecs[1].id = 96;
1882 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001883 webrtc::CodecInst gcodec;
1884 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1885 EXPECT_EQ(96, gcodec.pltype);
1886 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001887 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001888}
1889
1890// Test that we ignore RED if it has bogus codec ids.
1891TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001892 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001893 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001894 cricket::AudioSendParameters parameters;
1895 parameters.codecs.push_back(kRedCodec);
1896 parameters.codecs.push_back(kIsacCodec);
1897 parameters.codecs.push_back(kPcmuCodec);
1898 parameters.codecs[0].id = 127;
1899 parameters.codecs[0].params[""] = "ABC/ABC";
1900 parameters.codecs[1].id = 96;
1901 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001902 webrtc::CodecInst gcodec;
1903 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1904 EXPECT_EQ(96, gcodec.pltype);
1905 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001906 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001907}
1908
1909// Test that we ignore RED if it refers to a codec that is not present.
1910TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001911 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001912 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001913 cricket::AudioSendParameters parameters;
1914 parameters.codecs.push_back(kRedCodec);
1915 parameters.codecs.push_back(kIsacCodec);
1916 parameters.codecs.push_back(kPcmuCodec);
1917 parameters.codecs[0].id = 127;
1918 parameters.codecs[0].params[""] = "97/97";
1919 parameters.codecs[1].id = 96;
1920 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001921 webrtc::CodecInst gcodec;
1922 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1923 EXPECT_EQ(96, gcodec.pltype);
1924 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001925 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001926}
1927
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001928// Test support for audio level header extension.
1929TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1930 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001931}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001932TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1933 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1934}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001935
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001936// Test support for absolute send time header extension.
1937TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1938 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1939}
1940TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1941 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001942}
1943
solenberg1ac56142015-10-13 03:58:19 -07001944// Test that we can create a channel and start sending on it.
1945TEST_F(WebRtcVoiceEngineTestFake, Send) {
1946 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001947 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001948 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001949 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1950 EXPECT_TRUE(voe_.GetSend(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001951 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1952 EXPECT_FALSE(voe_.GetSend(channel_num));
solenberg1ac56142015-10-13 03:58:19 -07001953}
1954
1955// Test that we can create a channel and start playing out on it.
1956TEST_F(WebRtcVoiceEngineTestFake, Playout) {
1957 EXPECT_TRUE(SetupEngineWithRecvStream());
1958 int channel_num = voe_.GetLastChannel();
1959 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
1960 EXPECT_TRUE(channel_->SetPlayout(true));
1961 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001962 EXPECT_TRUE(channel_->SetPlayout(false));
1963 EXPECT_FALSE(voe_.GetPlayout(channel_num));
1964}
1965
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001966// Test that we can add and remove send streams.
1967TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
1968 SetupForMultiSendStream();
1969
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001970 // Set the global state for sending.
1971 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1972
solenbergc96df772015-10-21 13:01:53 -07001973 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001974 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07001975 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001976 // Verify that we are in a sending state for all the created streams.
solenberg3a941542015-11-16 07:34:50 -08001977 EXPECT_TRUE(voe_.GetSend(GetSendStreamConfig(ssrc).voe_channel_id));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001978 }
tfarina5237aaf2015-11-10 23:44:30 -08001979 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001980
solenbergc96df772015-10-21 13:01:53 -07001981 // Delete the send streams.
1982 for (uint32_t ssrc : kSsrcs4) {
1983 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08001984 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07001985 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001986 }
solenbergc96df772015-10-21 13:01:53 -07001987 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001988}
1989
1990// Test SetSendCodecs correctly configure the codecs in all send streams.
1991TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
1992 SetupForMultiSendStream();
1993
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001994 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07001995 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001996 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07001997 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001998 }
1999
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002000 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002001 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002002 parameters.codecs.push_back(kIsacCodec);
2003 parameters.codecs.push_back(kCn16000Codec);
2004 parameters.codecs[1].id = 97;
2005 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002006
2007 // Verify ISAC and VAD are corrected configured on all send channels.
2008 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002009 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002010 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002011 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2012 EXPECT_STREQ("ISAC", gcodec.plname);
2013 EXPECT_TRUE(voe_.GetVAD(channel_num));
2014 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2015 }
2016
2017 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002018 parameters.codecs[0] = kPcmuCodec;
2019 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002020 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002021 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002022 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2023 EXPECT_STREQ("PCMU", gcodec.plname);
2024 EXPECT_FALSE(voe_.GetVAD(channel_num));
2025 }
2026}
2027
2028// Test we can SetSend on all send streams correctly.
2029TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2030 SetupForMultiSendStream();
2031
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002032 // Create the send channels and they should be a SEND_NOTHING date.
solenbergc96df772015-10-21 13:01:53 -07002033 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002034 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002035 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002036 int channel_num = voe_.GetLastChannel();
2037 EXPECT_FALSE(voe_.GetSend(channel_num));
2038 }
2039
2040 // Set the global state for starting sending.
2041 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
solenbergc96df772015-10-21 13:01:53 -07002042 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002043 // Verify that we are in a sending state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002044 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002045 EXPECT_TRUE(voe_.GetSend(channel_num));
2046 }
2047
2048 // Set the global state for stopping sending.
2049 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
solenbergc96df772015-10-21 13:01:53 -07002050 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002051 // Verify that we are in a stop state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002052 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002053 EXPECT_FALSE(voe_.GetSend(channel_num));
2054 }
2055}
2056
2057// Test we can set the correct statistics on all send streams.
2058TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2059 SetupForMultiSendStream();
2060
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002061 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002062 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002063 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002064 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002065 }
solenberg85a04962015-10-27 03:35:21 -07002066 SetAudioSendStreamStats();
2067
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002068 // Create a receive stream to check that none of the send streams end up in
2069 // the receive stream stats.
2070 EXPECT_TRUE(channel_->AddRecvStream(
2071 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002072 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002073 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2074 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002075
solenberg85a04962015-10-27 03:35:21 -07002076 // Check stats for the added streams.
2077 {
2078 cricket::VoiceMediaInfo info;
2079 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002080
solenberg85a04962015-10-27 03:35:21 -07002081 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002082 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002083 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002084 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002085 }
2086
2087 // We have added one receive stream. We should see empty stats.
2088 EXPECT_EQ(info.receivers.size(), 1u);
2089 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002090 }
solenberg1ac56142015-10-13 03:58:19 -07002091
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002092 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002093 {
2094 cricket::VoiceMediaInfo info;
2095 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2096 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002097 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002098 EXPECT_EQ(0u, info.receivers.size());
2099 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002100
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002101 // Deliver a new packet - a default receive stream should be created and we
2102 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002103 {
2104 cricket::VoiceMediaInfo info;
2105 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2106 SetAudioReceiveStreamStats();
2107 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002108 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002109 EXPECT_EQ(1u, info.receivers.size());
2110 VerifyVoiceReceiverInfo(info.receivers[0]);
2111 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002112}
2113
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002114// Test that we can add and remove receive streams, and do proper send/playout.
2115// We can receive on multiple streams while sending one stream.
2116TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002117 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002118 int channel_num1 = voe_.GetLastChannel();
2119
solenberg1ac56142015-10-13 03:58:19 -07002120 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002121 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002122 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002123 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002124
solenberg1ac56142015-10-13 03:58:19 -07002125 // Adding another stream should enable playout on the new stream only.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002126 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2127 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002128 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2129 EXPECT_TRUE(voe_.GetSend(channel_num1));
2130 EXPECT_FALSE(voe_.GetSend(channel_num2));
2131
solenberg1ac56142015-10-13 03:58:19 -07002132 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002133 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2134 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2135
2136 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2137 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2138 int channel_num3 = voe_.GetLastChannel();
2139 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2140 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2141 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2142 EXPECT_FALSE(voe_.GetSend(channel_num3));
2143
2144 // Stop sending.
2145 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2146 EXPECT_FALSE(voe_.GetSend(channel_num1));
2147 EXPECT_FALSE(voe_.GetSend(channel_num2));
2148 EXPECT_FALSE(voe_.GetSend(channel_num3));
2149
2150 // Stop playout.
2151 EXPECT_TRUE(channel_->SetPlayout(false));
2152 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2153 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2154 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2155
solenberg1ac56142015-10-13 03:58:19 -07002156 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002157 EXPECT_TRUE(channel_->SetPlayout(true));
2158 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2159 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2160 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2161
solenberg1ac56142015-10-13 03:58:19 -07002162 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002163 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2164 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002165 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002166}
2167
2168// Test that we can set the devices to use.
2169TEST_F(WebRtcVoiceEngineTestFake, SetDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002170 EXPECT_TRUE(SetupEngineWithSendStream());
2171 int send_channel = voe_.GetLastChannel();
2172 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2173 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002174 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002175
2176 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2177 cricket::kFakeDefaultDeviceId);
2178 cricket::Device dev(cricket::kFakeDeviceName,
2179 cricket::kFakeDeviceId);
2180
2181 // Test SetDevices() while not sending or playing.
2182 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2183
2184 // Test SetDevices() while sending and playing.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002185 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2186 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002187 EXPECT_TRUE(voe_.GetSend(send_channel));
2188 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002189
2190 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2191
solenberg1ac56142015-10-13 03:58:19 -07002192 EXPECT_TRUE(voe_.GetSend(send_channel));
2193 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002194
2195 // Test that failure to open newly selected devices does not prevent opening
2196 // ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002197 voe_.set_playout_fail_channel(recv_channel);
2198 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002199
2200 EXPECT_FALSE(engine_.SetDevices(&default_dev, &default_dev));
2201
solenberg1ac56142015-10-13 03:58:19 -07002202 EXPECT_FALSE(voe_.GetSend(send_channel));
2203 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002204
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002205 voe_.set_playout_fail_channel(-1);
2206 voe_.set_send_fail_channel(-1);
2207
2208 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2209
solenberg1ac56142015-10-13 03:58:19 -07002210 EXPECT_TRUE(voe_.GetSend(send_channel));
2211 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002212}
2213
2214// Test that we can set the devices to use even if we failed to
2215// open the initial ones.
2216TEST_F(WebRtcVoiceEngineTestFake, SetDevicesWithInitiallyBadDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002217 EXPECT_TRUE(SetupEngineWithSendStream());
2218 int send_channel = voe_.GetLastChannel();
2219 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2220 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002221 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002222
2223 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2224 cricket::kFakeDefaultDeviceId);
2225 cricket::Device dev(cricket::kFakeDeviceName,
2226 cricket::kFakeDeviceId);
2227
2228 // Test that failure to open devices selected before starting
2229 // send/play does not prevent opening newly selected ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002230 voe_.set_playout_fail_channel(recv_channel);
2231 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002232
2233 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2234
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002235 EXPECT_FALSE(channel_->SetSend(cricket::SEND_MICROPHONE));
2236 EXPECT_FALSE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002237 EXPECT_FALSE(voe_.GetSend(send_channel));
2238 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002239
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002240 voe_.set_playout_fail_channel(-1);
2241 voe_.set_send_fail_channel(-1);
2242
2243 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2244
solenberg1ac56142015-10-13 03:58:19 -07002245 EXPECT_TRUE(voe_.GetSend(send_channel));
2246 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002247}
2248
2249// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002250// and start sending on it.
2251TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2252 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002253 int channel_num = voe_.GetLastChannel();
2254 webrtc::AgcConfig agc_config;
2255 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2256 EXPECT_EQ(0, agc_config.targetLeveldBOv);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002257 send_parameters_.options = options_adjust_agc_;
2258 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002259 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2260 EXPECT_TRUE(voe_.GetSend(channel_num));
2261 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2262 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002263 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2264 EXPECT_FALSE(voe_.GetSend(channel_num));
2265 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2266 EXPECT_EQ(0, agc_config.targetLeveldBOv); // level was restored
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002267}
2268
wu@webrtc.org97077a32013-10-25 21:18:33 +00002269TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002270 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002271 webrtc::AgcConfig agc_config;
2272 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2273 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2274
2275 cricket::AudioOptions options;
Karl Wibergbe579832015-11-10 22:34:18 +01002276 options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2277 options.tx_agc_digital_compression_gain = rtc::Optional<uint16_t>(9);
2278 options.tx_agc_limiter = rtc::Optional<bool>(true);
2279 options.auto_gain_control = rtc::Optional<bool>(true);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002280 EXPECT_TRUE(engine_.SetOptions(options));
2281
2282 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.
Karl Wibergbe579832015-11-10 22:34:18 +01002289 options.adjust_agc_delta = rtc::Optional<int>(-10);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002290 EXPECT_TRUE(engine_.SetOptions(options));
2291
2292 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2293 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2294}
2295
wu@webrtc.org97077a32013-10-25 21:18:33 +00002296TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002297 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002298 cricket::AudioOptions options;
Karl Wibergbe579832015-11-10 22:34:18 +01002299 options.recording_sample_rate = rtc::Optional<uint32_t>(48000);
2300 options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002301 EXPECT_TRUE(engine_.SetOptions(options));
2302
2303 unsigned int recording_sample_rate, playout_sample_rate;
2304 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2305 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2306 EXPECT_EQ(48000u, recording_sample_rate);
2307 EXPECT_EQ(44100u, playout_sample_rate);
2308}
2309
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002310// Test that we can set the outgoing SSRC properly.
2311// SSRC is set in SetupEngine by calling AddSendStream.
2312TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002313 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002314 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002315}
2316
2317TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2318 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002319 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002320 SetAudioSendStreamStats();
solenberg1ac56142015-10-13 03:58:19 -07002321 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2322 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002323 EXPECT_TRUE(channel_->AddRecvStream(
2324 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002325 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2326 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002327
solenberg85a04962015-10-27 03:35:21 -07002328 // Check stats for the added streams.
2329 {
2330 cricket::VoiceMediaInfo info;
2331 EXPECT_EQ(true, channel_->GetStats(&info));
2332
2333 // We have added one send stream. We should see the stats we've set.
2334 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002335 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002336 // We have added one receive stream. We should see empty stats.
2337 EXPECT_EQ(info.receivers.size(), 1u);
2338 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2339 }
solenberg1ac56142015-10-13 03:58:19 -07002340
solenberg566ef242015-11-06 15:34:49 -08002341 // Start sending - this affects some reported stats.
2342 {
2343 cricket::VoiceMediaInfo info;
2344 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2345 EXPECT_EQ(true, channel_->GetStats(&info));
2346 VerifyVoiceSenderInfo(info.senders[0], true);
2347 }
2348
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002349 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002350 {
2351 cricket::VoiceMediaInfo info;
2352 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2353 EXPECT_EQ(true, channel_->GetStats(&info));
2354 EXPECT_EQ(1u, info.senders.size());
2355 EXPECT_EQ(0u, info.receivers.size());
2356 }
solenberg1ac56142015-10-13 03:58:19 -07002357
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002358 // Deliver a new packet - a default receive stream should be created and we
2359 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002360 {
2361 cricket::VoiceMediaInfo info;
2362 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2363 SetAudioReceiveStreamStats();
2364 EXPECT_EQ(true, channel_->GetStats(&info));
2365 EXPECT_EQ(1u, info.senders.size());
2366 EXPECT_EQ(1u, info.receivers.size());
2367 VerifyVoiceReceiverInfo(info.receivers[0]);
2368 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002369}
2370
2371// Test that we can set the outgoing SSRC properly with multiple streams.
2372// SSRC is set in SetupEngine by calling AddSendStream.
2373TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002374 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002375 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002376 EXPECT_TRUE(channel_->AddRecvStream(
2377 cricket::StreamParams::CreateLegacy(kSsrc2)));
2378 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002379}
2380
2381// Test that the local SSRC is the same on sending and receiving channels if the
2382// receive channel is created before the send channel.
2383TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002384 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002385 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002386
2387 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2388 int receive_channel_num = voe_.GetLastChannel();
2389 EXPECT_TRUE(channel_->AddSendStream(
2390 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002391
solenberg3a941542015-11-16 07:34:50 -08002392 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002393 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002394}
2395
2396// Test that we can properly receive packets.
2397TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2398 EXPECT_TRUE(SetupEngine());
solenberg7e63ef02015-11-20 00:19:43 -08002399 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002400 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002401 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002402 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002403}
2404
2405// Test that we can properly receive packets on multiple streams.
2406TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg7e63ef02015-11-20 00:19:43 -08002407 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002408 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2409 int channel_num1 = voe_.GetLastChannel();
2410 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2411 int channel_num2 = voe_.GetLastChannel();
2412 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2413 int channel_num3 = voe_.GetLastChannel();
2414 // Create packets with the right SSRCs.
2415 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002416 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002417 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002418 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002419 }
2420 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2421 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2422 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002423
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002424 DeliverPacket(packets[0], sizeof(packets[0]));
2425 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2426 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2427 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002428
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002429 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002430 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002431 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2432 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002433
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002434 DeliverPacket(packets[2], sizeof(packets[2]));
2435 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002436 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002437 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002438
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002439 DeliverPacket(packets[3], sizeof(packets[3]));
2440 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2441 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002442 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2443
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002444 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2445 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2446 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2447}
2448
solenberg7e63ef02015-11-20 00:19:43 -08002449// Test that receiving on an unsignalled stream works (default channel will be
2450// created).
2451TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
2452 EXPECT_TRUE(SetupEngine());
2453 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2454 int channel_num = voe_.GetLastChannel();
2455 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2456}
2457
2458// Test that receiving on an unsignalled stream works (default channel will be
2459// created), and that packets will be forwarded to the default channel
2460// regardless of their SSRCs.
2461TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
2462 EXPECT_TRUE(SetupEngine());
2463 char packet[sizeof(kPcmuFrame)];
2464 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2465
2466 // Note that the first unknown SSRC cannot be 0, because we only support
2467 // creating receive streams for SSRC!=0.
2468 DeliverPacket(packet, sizeof(packet));
2469 int channel_num = voe_.GetLastChannel();
2470 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2471 // Once we have the default channel, SSRC==0 will be ok.
2472 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2473 rtc::SetBE32(&packet[8], ssrc);
2474 DeliverPacket(packet, sizeof(packet));
2475 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2476 }
2477}
2478
2479// Test that a default channel is created even after a signalled stream has been
2480// added, and that this stream will get any packets for unknown SSRCs.
2481TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
2482 EXPECT_TRUE(SetupEngine());
2483 char packet[sizeof(kPcmuFrame)];
2484 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2485
2486 // Add a known stream, send packet and verify we got it.
2487 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2488 int signalled_channel_num = voe_.GetLastChannel();
2489 DeliverPacket(packet, sizeof(packet));
2490 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2491
2492 // Note that the first unknown SSRC cannot be 0, because we only support
2493 // creating receive streams for SSRC!=0.
2494 rtc::SetBE32(&packet[8], 7011);
2495 DeliverPacket(packet, sizeof(packet));
2496 int channel_num = voe_.GetLastChannel();
2497 EXPECT_NE(channel_num, signalled_channel_num);
2498 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2499 // Once we have the default channel, SSRC==0 will be ok.
2500 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2501 rtc::SetBE32(&packet[8], ssrc);
2502 DeliverPacket(packet, sizeof(packet));
2503 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2504 }
2505}
2506
solenberg0a617e22015-10-20 15:49:38 -07002507// Test that we properly handle failures to add a receive stream.
2508TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
2509 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002510 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002511 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002512}
2513
solenberg0a617e22015-10-20 15:49:38 -07002514// Test that we properly handle failures to add a send stream.
2515TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
2516 EXPECT_TRUE(SetupEngine());
2517 voe_.set_fail_create_channel(true);
2518 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2519}
2520
solenberg1ac56142015-10-13 03:58:19 -07002521// Test that AddRecvStream creates new stream.
2522TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2523 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002524 int channel_num = voe_.GetLastChannel();
2525 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002526 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002527}
2528
2529// Test that after adding a recv stream, we do not decode more codecs than
2530// those previously passed into SetRecvCodecs.
2531TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002532 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002533 cricket::AudioRecvParameters parameters;
2534 parameters.codecs.push_back(kIsacCodec);
2535 parameters.codecs.push_back(kPcmuCodec);
2536 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002537 EXPECT_TRUE(channel_->AddRecvStream(
2538 cricket::StreamParams::CreateLegacy(kSsrc1)));
2539 int channel_num2 = voe_.GetLastChannel();
2540 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002541 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002542 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002543 gcodec.channels = 2;
2544 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2545}
2546
2547// Test that we properly clean up any streams that were added, even if
2548// not explicitly removed.
2549TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002550 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002551 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002552 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2553 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2554 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2555 delete channel_;
2556 channel_ = NULL;
2557 EXPECT_EQ(0, voe_.GetNumChannels());
2558}
2559
wu@webrtc.org78187522013-10-07 23:32:02 +00002560TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002561 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002562 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2563}
2564
2565TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2566 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002567 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002568 // Manually delete channel to simulate a failure.
2569 int channel = voe_.GetLastChannel();
2570 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2571 // Add recv stream 2 should work.
2572 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002573 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002574 EXPECT_NE(channel, new_channel);
2575 // The last created channel is deleted too.
2576 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002577}
2578
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002579// Test the InsertDtmf on default send stream as caller.
2580TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2581 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002582}
2583
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002584// Test the InsertDtmf on default send stream as callee
2585TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2586 TestInsertDtmf(0, false);
2587}
2588
2589// Test the InsertDtmf on specified send stream as caller.
2590TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2591 TestInsertDtmf(kSsrc1, true);
2592}
2593
2594// Test the InsertDtmf on specified send stream as callee.
2595TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2596 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002597}
2598
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002599TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002600 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002601 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002602 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2603 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2604 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2605 EXPECT_TRUE(channel_->SetPlayout(true));
2606 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2607 EXPECT_TRUE(channel_->SetPlayout(false));
2608 EXPECT_FALSE(channel_->SetPlayout(true));
2609}
2610
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002611TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002612 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002613
2614 bool ec_enabled;
2615 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002616 webrtc::AecmModes aecm_mode;
2617 bool cng_enabled;
2618 bool agc_enabled;
2619 webrtc::AgcModes agc_mode;
2620 webrtc::AgcConfig agc_config;
2621 bool ns_enabled;
2622 webrtc::NsModes ns_mode;
2623 bool highpass_filter_enabled;
2624 bool stereo_swapping_enabled;
2625 bool typing_detection_enabled;
2626 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002627 voe_.GetAecmMode(aecm_mode, cng_enabled);
2628 voe_.GetAgcStatus(agc_enabled, agc_mode);
2629 voe_.GetAgcConfig(agc_config);
2630 voe_.GetNsStatus(ns_enabled, ns_mode);
2631 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2632 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2633 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2634 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002635 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002636 EXPECT_FALSE(cng_enabled);
2637 EXPECT_TRUE(agc_enabled);
2638 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2639 EXPECT_TRUE(ns_enabled);
2640 EXPECT_TRUE(highpass_filter_enabled);
2641 EXPECT_FALSE(stereo_swapping_enabled);
2642 EXPECT_TRUE(typing_detection_enabled);
2643 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2644 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2645
2646 // Nothing set, so all ignored.
2647 cricket::AudioOptions options;
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002648 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002649 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002650 voe_.GetAecmMode(aecm_mode, cng_enabled);
2651 voe_.GetAgcStatus(agc_enabled, agc_mode);
2652 voe_.GetAgcConfig(agc_config);
2653 voe_.GetNsStatus(ns_enabled, ns_mode);
2654 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2655 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2656 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2657 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002658 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002659 EXPECT_FALSE(cng_enabled);
2660 EXPECT_TRUE(agc_enabled);
2661 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2662 EXPECT_TRUE(ns_enabled);
2663 EXPECT_TRUE(highpass_filter_enabled);
2664 EXPECT_FALSE(stereo_swapping_enabled);
2665 EXPECT_TRUE(typing_detection_enabled);
2666 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2667 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
Henrik Lundin64dad832015-05-11 12:44:23 +02002668 EXPECT_EQ(50, voe_.GetNetEqCapacity()); // From GetDefaultEngineOptions().
Henrik Lundin5263b3c2015-06-01 10:29:41 +02002669 EXPECT_FALSE(
2670 voe_.GetNetEqFastAccelerate()); // From GetDefaultEngineOptions().
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002671
2672 // Turn echo cancellation off
Karl Wibergbe579832015-11-10 22:34:18 +01002673 options.echo_cancellation = rtc::Optional<bool>(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002674 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002675 voe_.GetEcStatus(ec_enabled, ec_mode);
2676 EXPECT_FALSE(ec_enabled);
2677
2678 // Turn echo cancellation back on, with settings, and make sure
2679 // nothing else changed.
Karl Wibergbe579832015-11-10 22:34:18 +01002680 options.echo_cancellation = rtc::Optional<bool>(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002681 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002682 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002683 voe_.GetAecmMode(aecm_mode, cng_enabled);
2684 voe_.GetAgcStatus(agc_enabled, agc_mode);
2685 voe_.GetAgcConfig(agc_config);
2686 voe_.GetNsStatus(ns_enabled, ns_mode);
2687 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2688 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2689 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2690 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002691 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002692 EXPECT_TRUE(agc_enabled);
2693 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2694 EXPECT_TRUE(ns_enabled);
2695 EXPECT_TRUE(highpass_filter_enabled);
2696 EXPECT_FALSE(stereo_swapping_enabled);
2697 EXPECT_TRUE(typing_detection_enabled);
2698 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2699 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2700
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002701 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2702 // control.
Karl Wibergbe579832015-11-10 22:34:18 +01002703 options.delay_agnostic_aec = rtc::Optional<bool>(true);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002704 ASSERT_TRUE(engine_.SetOptions(options));
2705 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002706 voe_.GetAecmMode(aecm_mode, cng_enabled);
2707 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002708 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002709 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2710
2711 // Turn off echo cancellation and delay agnostic aec.
Karl Wibergbe579832015-11-10 22:34:18 +01002712 options.delay_agnostic_aec = rtc::Optional<bool>(false);
2713 options.extended_filter_aec = rtc::Optional<bool>(false);
2714 options.echo_cancellation = rtc::Optional<bool>(false);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002715 ASSERT_TRUE(engine_.SetOptions(options));
2716 voe_.GetEcStatus(ec_enabled, ec_mode);
2717 EXPECT_FALSE(ec_enabled);
2718 // Turning delay agnostic aec back on should also turn on echo cancellation.
Karl Wibergbe579832015-11-10 22:34:18 +01002719 options.delay_agnostic_aec = rtc::Optional<bool>(true);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002720 ASSERT_TRUE(engine_.SetOptions(options));
2721 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002722 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002723 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002724 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2725
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002726 // Turn off AGC
Karl Wibergbe579832015-11-10 22:34:18 +01002727 options.auto_gain_control = rtc::Optional<bool>(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002728 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002729 voe_.GetAgcStatus(agc_enabled, agc_mode);
2730 EXPECT_FALSE(agc_enabled);
2731
2732 // Turn AGC back on
Karl Wibergbe579832015-11-10 22:34:18 +01002733 options.auto_gain_control = rtc::Optional<bool>(true);
2734 options.adjust_agc_delta = rtc::Optional<int>();
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002735 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002736 voe_.GetAgcStatus(agc_enabled, agc_mode);
2737 EXPECT_TRUE(agc_enabled);
2738 voe_.GetAgcConfig(agc_config);
2739 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2740
2741 // Turn off other options (and stereo swapping on).
Karl Wibergbe579832015-11-10 22:34:18 +01002742 options.noise_suppression = rtc::Optional<bool>(false);
2743 options.highpass_filter = rtc::Optional<bool>(false);
2744 options.typing_detection = rtc::Optional<bool>(false);
2745 options.stereo_swapping = rtc::Optional<bool>(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002746 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002747 voe_.GetNsStatus(ns_enabled, ns_mode);
2748 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2749 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2750 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2751 EXPECT_FALSE(ns_enabled);
2752 EXPECT_FALSE(highpass_filter_enabled);
2753 EXPECT_FALSE(typing_detection_enabled);
2754 EXPECT_TRUE(stereo_swapping_enabled);
2755
solenberg1ac56142015-10-13 03:58:19 -07002756 // Set options again to ensure it has no impact.
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002757 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002758 voe_.GetEcStatus(ec_enabled, ec_mode);
2759 voe_.GetNsStatus(ns_enabled, ns_mode);
2760 EXPECT_TRUE(ec_enabled);
2761 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2762 EXPECT_FALSE(ns_enabled);
2763 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2764}
2765
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002766TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002767 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002768
2769 bool ec_enabled;
2770 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002771 bool agc_enabled;
2772 webrtc::AgcModes agc_mode;
2773 bool ns_enabled;
2774 webrtc::NsModes ns_mode;
2775 bool highpass_filter_enabled;
2776 bool stereo_swapping_enabled;
2777 bool typing_detection_enabled;
2778
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002779 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002780 voe_.GetAgcStatus(agc_enabled, agc_mode);
2781 voe_.GetNsStatus(ns_enabled, ns_mode);
2782 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2783 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2784 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2785 EXPECT_TRUE(ec_enabled);
2786 EXPECT_TRUE(agc_enabled);
2787 EXPECT_TRUE(ns_enabled);
2788 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002789 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002790 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002791}
2792
2793TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2794 webrtc::AgcConfig set_config = {0};
2795 set_config.targetLeveldBOv = 3;
2796 set_config.digitalCompressionGaindB = 9;
2797 set_config.limiterEnable = true;
2798 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002799 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002800
2801 webrtc::AgcConfig config = {0};
2802 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2803 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2804 EXPECT_EQ(set_config.digitalCompressionGaindB,
2805 config.digitalCompressionGaindB);
2806 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2807}
2808
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002809TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002810 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg66f43392015-09-09 01:36:22 -07002811 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2812 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002813 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002814 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2815 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002816 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002817
2818 // Have to add a stream to make SetSend work.
2819 cricket::StreamParams stream1;
2820 stream1.ssrcs.push_back(1);
2821 channel1->AddSendStream(stream1);
2822 cricket::StreamParams stream2;
2823 stream2.ssrcs.push_back(2);
2824 channel2->AddSendStream(stream2);
2825
2826 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002827 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002828 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2829 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2830 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002831 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2832 EXPECT_EQ(parameters_options_all.options, channel1->options());
2833 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2834 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002835
2836 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002837 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002838 parameters_options_no_ns.options.noise_suppression =
2839 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002840 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2841 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002842 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2843 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2844 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002845 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002846
2847 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002848 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002849 parameters_options_no_agc.options.auto_gain_control =
2850 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002851 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002852 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2853 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2854 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002855 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002856
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002857 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002858 bool ec_enabled;
2859 webrtc::EcModes ec_mode;
2860 bool agc_enabled;
2861 webrtc::AgcModes agc_mode;
2862 bool ns_enabled;
2863 webrtc::NsModes ns_mode;
2864 voe_.GetEcStatus(ec_enabled, ec_mode);
2865 voe_.GetAgcStatus(agc_enabled, agc_mode);
2866 voe_.GetNsStatus(ns_enabled, ns_mode);
2867 EXPECT_TRUE(ec_enabled);
2868 EXPECT_TRUE(agc_enabled);
2869 EXPECT_TRUE(ns_enabled);
2870
2871 channel1->SetSend(cricket::SEND_MICROPHONE);
2872 voe_.GetEcStatus(ec_enabled, ec_mode);
2873 voe_.GetAgcStatus(agc_enabled, agc_mode);
2874 voe_.GetNsStatus(ns_enabled, ns_mode);
2875 EXPECT_TRUE(ec_enabled);
2876 EXPECT_TRUE(agc_enabled);
2877 EXPECT_FALSE(ns_enabled);
2878
2879 channel1->SetSend(cricket::SEND_NOTHING);
2880 voe_.GetEcStatus(ec_enabled, ec_mode);
2881 voe_.GetAgcStatus(agc_enabled, agc_mode);
2882 voe_.GetNsStatus(ns_enabled, ns_mode);
2883 EXPECT_TRUE(ec_enabled);
2884 EXPECT_TRUE(agc_enabled);
2885 EXPECT_TRUE(ns_enabled);
2886
2887 channel2->SetSend(cricket::SEND_MICROPHONE);
2888 voe_.GetEcStatus(ec_enabled, ec_mode);
2889 voe_.GetAgcStatus(agc_enabled, agc_mode);
2890 voe_.GetNsStatus(ns_enabled, ns_mode);
2891 EXPECT_TRUE(ec_enabled);
2892 EXPECT_FALSE(agc_enabled);
2893 EXPECT_TRUE(ns_enabled);
2894
2895 channel2->SetSend(cricket::SEND_NOTHING);
2896 voe_.GetEcStatus(ec_enabled, ec_mode);
2897 voe_.GetAgcStatus(agc_enabled, agc_mode);
2898 voe_.GetNsStatus(ns_enabled, ns_mode);
2899 EXPECT_TRUE(ec_enabled);
2900 EXPECT_TRUE(agc_enabled);
2901 EXPECT_TRUE(ns_enabled);
2902
2903 // Make sure settings take effect while we are sending.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002904 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
2905 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2906 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002907 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01002908 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07002909 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01002910 rtc::Optional<bool>(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002911 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002912 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01002913 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2914 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2915 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002916 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002917 voe_.GetEcStatus(ec_enabled, ec_mode);
2918 voe_.GetAgcStatus(agc_enabled, agc_mode);
2919 voe_.GetNsStatus(ns_enabled, ns_mode);
2920 EXPECT_TRUE(ec_enabled);
2921 EXPECT_FALSE(agc_enabled);
2922 EXPECT_FALSE(ns_enabled);
2923}
2924
wu@webrtc.orgde305012013-10-31 15:40:38 +00002925// This test verifies DSCP settings are properly applied on voice media channel.
2926TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002927 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002928 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002929 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002930 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00002931 new cricket::FakeNetworkInterface);
2932 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002933 cricket::AudioSendParameters parameters = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002934 parameters.options.dscp = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002935 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002936 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00002937 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002938 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002939 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
Karl Wibergbe579832015-11-10 22:34:18 +01002940 parameters.options.dscp = rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002941 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002942 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00002943}
2944
solenberg1ac56142015-10-13 03:58:19 -07002945TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002946 EXPECT_TRUE(SetupEngine());
2947 cricket::WebRtcVoiceMediaChannel* media_channel =
2948 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002949 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2950 EXPECT_TRUE(channel_->AddRecvStream(
2951 cricket::StreamParams::CreateLegacy(kSsrc1)));
2952 int channel_id = voe_.GetLastChannel();
2953 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2954 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2955 EXPECT_TRUE(channel_->AddRecvStream(
2956 cricket::StreamParams::CreateLegacy(kSsrc2)));
2957 int channel_id2 = voe_.GetLastChannel();
2958 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002959}
2960
solenberg1ac56142015-10-13 03:58:19 -07002961TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002962 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002963 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002964 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2965 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2966 EXPECT_TRUE(channel_->AddSendStream(
2967 cricket::StreamParams::CreateLegacy(kSsrc1)));
2968 int channel_id = voe_.GetLastChannel();
2969 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2970 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2971 EXPECT_TRUE(channel_->AddSendStream(
2972 cricket::StreamParams::CreateLegacy(kSsrc2)));
2973 int channel_id2 = voe_.GetLastChannel();
2974 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002975}
2976
solenberg4bac9c52015-10-09 02:32:53 -07002977TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002978 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002979 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002980 cricket::StreamParams stream;
2981 stream.ssrcs.push_back(kSsrc2);
2982 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002983 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002984 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002985 float scale = 0;
2986 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2987 EXPECT_DOUBLE_EQ(3, scale);
2988}
2989
2990TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
2991 EXPECT_TRUE(SetupEngine());
2992 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2993 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2994 int channel_id = voe_.GetLastChannel();
2995 float scale = 0;
2996 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2997 EXPECT_DOUBLE_EQ(2, scale);
2998 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07002999 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003000 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003001}
3002
pbos8fc7fa72015-07-15 08:02:58 -07003003TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003004 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003005 const std::string kSyncLabel = "AvSyncLabel";
3006
solenberg1ac56142015-10-13 03:58:19 -07003007 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003008 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3009 sp.sync_label = kSyncLabel;
3010 // Creating two channels to make sure that sync label is set properly for both
3011 // the default voice channel and following ones.
3012 EXPECT_TRUE(channel_->AddRecvStream(sp));
3013 sp.ssrcs[0] += 1;
3014 EXPECT_TRUE(channel_->AddRecvStream(sp));
3015
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003016 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003017 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003018 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003019 << "SyncGroup should be set based on sync_label";
3020 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003021 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003022 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003023}
3024
pbos6bb1b6e2015-07-24 07:10:18 -07003025TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003026 // Test that changing the combined_audio_video_bwe option results in the
3027 // expected state changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003028 std::vector<uint32_t> ssrcs;
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003029 ssrcs.push_back(223);
3030 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003031
solenberg1ac56142015-10-13 03:58:19 -07003032 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003033 cricket::WebRtcVoiceMediaChannel* media_channel =
3034 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02003035 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003036 EXPECT_TRUE(media_channel->AddRecvStream(
3037 cricket::StreamParams::CreateLegacy(ssrc)));
3038 }
3039 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003040
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003041 // Combined BWE should be disabled.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003042 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003043 const auto* s = call_.GetAudioReceiveStream(ssrc);
3044 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07003045 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003046 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003047
3048 // Enable combined BWE option - now it should be set up.
Karl Wibergbe579832015-11-10 22:34:18 +01003049 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003050 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003051 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003052 const auto* s = call_.GetAudioReceiveStream(ssrc);
3053 EXPECT_NE(nullptr, s);
3054 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
3055 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003056
3057 // Disable combined BWE option - should be disabled again.
Karl Wibergbe579832015-11-10 22:34:18 +01003058 send_parameters_.options.combined_audio_video_bwe =
3059 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003060 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003061 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003062 const auto* s = call_.GetAudioReceiveStream(ssrc);
3063 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07003064 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003065 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003066
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003067 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003068}
3069
pbos6bb1b6e2015-07-24 07:10:18 -07003070TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003071 // Test that adding receive streams after enabling combined bandwidth
3072 // estimation will correctly configure each channel.
solenberg1ac56142015-10-13 03:58:19 -07003073 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003074 cricket::WebRtcVoiceMediaChannel* media_channel =
3075 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003076 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003077 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003078
Peter Boström0c4e06b2015-10-07 12:23:21 +02003079 static const uint32_t kSsrcs[] = {1, 2, 3, 4};
tfarina5237aaf2015-11-10 23:44:30 -08003080 for (unsigned int i = 0; i < arraysize(kSsrcs); ++i) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003081 EXPECT_TRUE(media_channel->AddRecvStream(
3082 cricket::StreamParams::CreateLegacy(kSsrcs[i])));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003083 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(kSsrcs[i]));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003084 }
tfarina5237aaf2015-11-10 23:44:30 -08003085 EXPECT_EQ(arraysize(kSsrcs), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003086}
3087
solenberg3a941542015-11-16 07:34:50 -08003088// TODO(solenberg): Remove, once recv streams are configured through Call.
3089// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003090TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003091 // Test that setting the header extensions results in the expected state
3092 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003093 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003094 ssrcs.push_back(223);
3095 ssrcs.push_back(224);
3096
solenberg1ac56142015-10-13 03:58:19 -07003097 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003098 cricket::WebRtcVoiceMediaChannel* media_channel =
3099 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003100 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003101 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003102 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003103 EXPECT_TRUE(media_channel->AddRecvStream(
3104 cricket::StreamParams::CreateLegacy(ssrc)));
3105 }
3106
3107 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003108 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003109 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003110 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003111 EXPECT_NE(nullptr, s);
3112 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3113 }
3114
3115 // Set up receive extensions.
3116 const auto& e_exts = engine_.rtp_header_extensions();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003117 cricket::AudioRecvParameters recv_parameters;
3118 recv_parameters.extensions = e_exts;
3119 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003120 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003121 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003122 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003123 EXPECT_NE(nullptr, s);
3124 const auto& s_exts = s->GetConfig().rtp.extensions;
3125 EXPECT_EQ(e_exts.size(), s_exts.size());
3126 for (const auto& e_ext : e_exts) {
3127 for (const auto& s_ext : s_exts) {
3128 if (e_ext.id == s_ext.id) {
3129 EXPECT_EQ(e_ext.uri, s_ext.name);
3130 }
3131 }
3132 }
3133 }
3134
3135 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003136 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003137 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003138 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003139 EXPECT_NE(nullptr, s);
3140 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3141 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003142}
3143
3144TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3145 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003146 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003147 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3148 static const unsigned char kRtcp[] = {
3149 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3150 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3153 };
3154 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3155
solenberg1ac56142015-10-13 03:58:19 -07003156 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003157 cricket::WebRtcVoiceMediaChannel* media_channel =
3158 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003159 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003160 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003161 EXPECT_TRUE(media_channel->AddRecvStream(
3162 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3163
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003164 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003165 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003166 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003167 EXPECT_EQ(0, s->received_packets());
3168 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3169 EXPECT_EQ(1, s->received_packets());
3170 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3171 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003172}
Minyue2013aec2015-05-13 14:14:42 +02003173
solenberg0a617e22015-10-20 15:49:38 -07003174// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003175// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003176TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenberg1ac56142015-10-13 03:58:19 -07003177 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003178 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003179 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003180 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3181 int recv_ch = voe_.GetLastChannel();
3182 EXPECT_NE(recv_ch, default_channel);
3183 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3184 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3185 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003186 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3187 recv_ch = voe_.GetLastChannel();
3188 EXPECT_NE(recv_ch, default_channel);
3189 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003190}
3191
3192TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003193 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003194 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003195
3196 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3197 int recv_ch = voe_.GetLastChannel();
3198
3199 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3200 int send_ch = voe_.GetLastChannel();
3201
3202 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3203 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3204 // channel of |recv_ch|.This is not a common case, since, normally, only the
3205 // default channel can be associated. However, the default is not deletable.
3206 // So we force the |recv_ch| to associate with a non-default channel.
3207 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3208 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3209
3210 EXPECT_TRUE(channel_->RemoveSendStream(2));
3211 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3212}
stefan658910c2015-09-03 05:48:32 -07003213
3214// Tests for the actual WebRtc VoE library.
3215
3216TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
3217 cricket::WebRtcVoiceEngine engine;
3218 cricket::AudioOptions options = engine.GetOptions();
3219 // The default options should have at least a few things set. We purposefully
3220 // don't check the option values here, though.
kwiberg102c6a62015-10-30 02:47:38 -07003221 EXPECT_TRUE(options.echo_cancellation);
3222 EXPECT_TRUE(options.auto_gain_control);
3223 EXPECT_TRUE(options.noise_suppression);
stefan658910c2015-09-03 05:48:32 -07003224}
3225
3226// Tests that the library initializes and shuts down properly.
3227TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3228 cricket::WebRtcVoiceEngine engine;
3229 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003230 rtc::scoped_ptr<webrtc::Call> call(
3231 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003232 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003233 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003234 EXPECT_TRUE(channel != nullptr);
3235 delete channel;
3236 engine.Terminate();
3237
3238 // Reinit to catch regression where VoiceEngineObserver reference is lost
3239 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3240 engine.Terminate();
3241}
3242
3243// Tests that the library is configured with the codecs we want.
3244TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
stefan658910c2015-09-03 05:48:32 -07003245 // Check codecs by name.
solenberg26c8c912015-11-27 04:00:25 -08003246 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3247 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0), nullptr));
3248 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3249 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0), nullptr));
3250 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3251 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003252 // Check that name matching is case-insensitive.
solenberg26c8c912015-11-27 04:00:25 -08003253 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3254 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0), nullptr));
3255 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3256 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0), nullptr));
3257 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3258 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0), nullptr));
3259 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3260 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0), nullptr));
3261 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3262 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0), nullptr));
3263 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3264 cricket::AudioCodec(96, "red", 8000, 0, 1, 0), nullptr));
3265 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3266 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0), nullptr));
3267 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3268 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0), nullptr));
3269 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3270 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0), nullptr));
3271 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3272 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003273 // Check codecs with an id by id.
solenberg26c8c912015-11-27 04:00:25 -08003274 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3275 cricket::AudioCodec(0, "", 8000, 0, 1, 0), nullptr)); // PCMU
3276 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3277 cricket::AudioCodec(8, "", 8000, 0, 1, 0), nullptr)); // PCMA
3278 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3279 cricket::AudioCodec(9, "", 8000, 0, 1, 0), nullptr)); // G722
3280 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3281 cricket::AudioCodec(13, "", 8000, 0, 1, 0), nullptr)); // CN
stefan658910c2015-09-03 05:48:32 -07003282 // Check sample/bitrate matching.
solenberg26c8c912015-11-27 04:00:25 -08003283 EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
3284 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0), nullptr));
stefan658910c2015-09-03 05:48:32 -07003285 // Check that bad codecs fail.
solenberg26c8c912015-11-27 04:00:25 -08003286 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3287 cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0), nullptr));
3288 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3289 cricket::AudioCodec(88, "", 0, 0, 1, 0), nullptr));
3290 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3291 cricket::AudioCodec(0, "", 0, 0, 2, 0), nullptr));
3292 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3293 cricket::AudioCodec(0, "", 5000, 0, 1, 0), nullptr));
3294 EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
3295 cricket::AudioCodec(0, "", 0, 5000, 1, 0), nullptr));
3296
stefan658910c2015-09-03 05:48:32 -07003297 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
solenberg26c8c912015-11-27 04:00:25 -08003298 cricket::WebRtcVoiceEngine engine;
stefan658910c2015-09-03 05:48:32 -07003299 for (std::vector<cricket::AudioCodec>::const_iterator it =
3300 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3301 if (it->name == "CN" && it->clockrate == 16000) {
3302 EXPECT_EQ(105, it->id);
3303 } else if (it->name == "CN" && it->clockrate == 32000) {
3304 EXPECT_EQ(106, it->id);
3305 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3306 EXPECT_EQ(103, it->id);
3307 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3308 EXPECT_EQ(104, it->id);
3309 } else if (it->name == "G722" && it->clockrate == 8000) {
3310 EXPECT_EQ(9, it->id);
3311 } else if (it->name == "telephone-event") {
3312 EXPECT_EQ(126, it->id);
3313 } else if (it->name == "red") {
3314 EXPECT_EQ(127, it->id);
3315 } else if (it->name == "opus") {
3316 EXPECT_EQ(111, it->id);
3317 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3318 EXPECT_EQ("10", it->params.find("minptime")->second);
3319 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3320 EXPECT_EQ("60", it->params.find("maxptime")->second);
3321 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3322 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3323 }
3324 }
stefan658910c2015-09-03 05:48:32 -07003325 engine.Terminate();
3326}
3327
3328// Tests that VoE supports at least 32 channels
3329TEST(WebRtcVoiceEngineTest, Has32Channels) {
3330 cricket::WebRtcVoiceEngine engine;
3331 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003332 rtc::scoped_ptr<webrtc::Call> call(
3333 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003334
3335 cricket::VoiceMediaChannel* channels[32];
3336 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003337 while (num_channels < arraysize(channels)) {
stefan658910c2015-09-03 05:48:32 -07003338 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003339 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003340 if (!channel)
3341 break;
stefan658910c2015-09-03 05:48:32 -07003342 channels[num_channels++] = channel;
3343 }
3344
tfarina5237aaf2015-11-10 23:44:30 -08003345 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003346 EXPECT_EQ(expected, num_channels);
3347
3348 while (num_channels > 0) {
3349 delete channels[--num_channels];
3350 }
stefan658910c2015-09-03 05:48:32 -07003351 engine.Terminate();
3352}
3353
3354// Test that we set our preferred codecs properly.
3355TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3356 cricket::WebRtcVoiceEngine engine;
3357 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003358 rtc::scoped_ptr<webrtc::Call> call(
3359 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003360 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3361 call.get());
3362 cricket::AudioRecvParameters parameters;
3363 parameters.codecs = engine.codecs();
3364 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003365}