blob: ea9c40e0b55d0e5cb45a2f49fe4b4dcd9d87a6e0 [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
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000028#include "webrtc/base/byteorder.h"
29#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020030#include "webrtc/call.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000031#include "talk/media/base/constants.h"
32#include "talk/media/base/fakemediaengine.h"
33#include "talk/media/base/fakemediaprocessor.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"
deadbeef47ee2f32015-09-22 15:08:23 -070039#include "webrtc/p2p/base/faketransportcontroller.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000040#include "talk/session/media/channel.h"
41
42// Tests for the WebRtcVoiceEngine/VoiceChannel code.
43
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000044using cricket::kRtpAudioLevelHeaderExtension;
45using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
46
henrike@webrtc.org28e20752013-07-10 00:45:36 +000047static const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
48static const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000049static const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +000050static const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
51static const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052static const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
53static const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
54static const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
55static const cricket::AudioCodec
56 kTelephoneEventCodec(106, "telephone-event", 8000, 0, 1, 0);
57static const cricket::AudioCodec* const kAudioCodecs[] = {
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +000058 &kPcmuCodec, &kIsacCodec, &kOpusCodec, &kG722CodecVoE, &kRedCodec,
59 &kCn8000Codec, &kCn16000Codec, &kTelephoneEventCodec,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000061static uint32 kSsrc1 = 0x99;
62static uint32 kSsrc2 = 0x98;
63
64class FakeVoEWrapper : public cricket::VoEWrapper {
65 public:
66 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
67 : cricket::VoEWrapper(engine, // processing
68 engine, // base
69 engine, // codec
70 engine, // dtmf
71 engine, // file
72 engine, // hw
73 engine, // media
74 engine, // neteq
75 engine, // network
76 engine, // rtp
77 engine, // sync
78 engine) { // volume
79 }
80};
81
wu@webrtc.org97077a32013-10-25 21:18:33 +000082class FakeVoETraceWrapper : public cricket::VoETraceWrapper {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083 public:
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +020084 int SetTraceFilter(const unsigned int filter) override {
wu@webrtc.org97077a32013-10-25 21:18:33 +000085 filter_ = filter;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000086 return 0;
87 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +020088 int SetTraceFile(const char* fileNameUTF8) override { return 0; }
89 int SetTraceCallback(webrtc::TraceCallback* callback) override { return 0; }
wu@webrtc.org97077a32013-10-25 21:18:33 +000090 unsigned int filter_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000091};
92
93class WebRtcVoiceEngineTestFake : public testing::Test {
94 public:
95 class ChannelErrorListener : public sigslot::has_slots<> {
96 public:
97 explicit ChannelErrorListener(cricket::VoiceMediaChannel* channel)
98 : ssrc_(0), error_(cricket::VoiceMediaChannel::ERROR_NONE) {
henrikg91d6ede2015-09-17 00:24:34 -070099 RTC_DCHECK(channel != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000100 channel->SignalMediaError.connect(
101 this, &ChannelErrorListener::OnVoiceChannelError);
102 }
103 void OnVoiceChannelError(uint32 ssrc,
104 cricket::VoiceMediaChannel::Error error) {
105 ssrc_ = ssrc;
106 error_ = error;
107 }
108 void Reset() {
109 ssrc_ = 0;
110 error_ = cricket::VoiceMediaChannel::ERROR_NONE;
111 }
112 uint32 ssrc() const {
113 return ssrc_;
114 }
115 cricket::VoiceMediaChannel::Error error() const {
116 return error_;
117 }
118
119 private:
120 uint32 ssrc_;
121 cricket::VoiceMediaChannel::Error error_;
122 };
123
124 WebRtcVoiceEngineTestFake()
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200125 : call_(webrtc::Call::Config()),
126 voe_(kAudioCodecs, ARRAY_SIZE(kAudioCodecs)),
wu@webrtc.org97077a32013-10-25 21:18:33 +0000127 trace_wrapper_(new FakeVoETraceWrapper()),
Jelena Marusicc28a8962015-05-29 15:05:44 +0200128 engine_(new FakeVoEWrapper(&voe_), trace_wrapper_),
129 channel_(nullptr) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200130 send_parameters_.codecs.push_back(kPcmuCodec);
131 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000132 options_conference_.conference_mode.Set(true);
133 options_adjust_agc_.adjust_agc_delta.Set(-10);
134 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000135 bool SetupEngineWithoutStream() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000136 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000137 return false;
138 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200139 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200140 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000141 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000142 bool SetupEngine() {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000143 if (!SetupEngineWithoutStream()) {
144 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000145 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000146 return channel_->AddSendStream(
147 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000148 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000149 void SetupForMultiSendStream() {
150 EXPECT_TRUE(SetupEngine());
151 // Remove stream added in Setup, which is corresponding to default channel.
152 int default_channel_num = voe_.GetLastChannel();
henrike@webrtc.org7666db72013-08-22 14:45:42 +0000153 uint32 default_send_ssrc = 0u;
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000154 EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
155 EXPECT_EQ(kSsrc1, default_send_ssrc);
156 EXPECT_TRUE(channel_->RemoveSendStream(default_send_ssrc));
157
158 // Verify the default channel still exists.
159 EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
160 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000161 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200162 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000163 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000164 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200165 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000166 delete channel_;
167 engine_.Terminate();
168 }
169
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000170 void TestInsertDtmf(uint32 ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000171 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200172 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200173 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000174 if (caller) {
175 // if this is a caller, local description will be applied and add the
176 // send stream.
177 EXPECT_TRUE(channel_->AddSendStream(
178 cricket::StreamParams::CreateLegacy(kSsrc1)));
179 }
180 int channel_id = voe_.GetLastChannel();
181
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000182 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200183 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000184 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
185 EXPECT_FALSE(channel_->CanInsertDtmf());
186 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111, cricket::DF_SEND));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200187 send_parameters_.codecs.push_back(kTelephoneEventCodec);
188 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000189 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000190
191 if (!caller) {
192 // There's no active send channel yet.
193 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
194 EXPECT_TRUE(channel_->AddSendStream(
195 cricket::StreamParams::CreateLegacy(kSsrc1)));
196 }
197
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000198 // Check we fail if the ssrc is invalid.
199 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111, cricket::DF_SEND));
200
201 // Test send
202 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
203 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
204 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
205
206 // Test play
207 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(3, 134));
208 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 3, 134, cricket::DF_PLAY));
209 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(3, 134));
210
211 // Test send and play
212 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
213 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(4, 145));
214 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 4, 145,
215 cricket::DF_PLAY | cricket::DF_SEND));
216 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
217 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(4, 145));
218 }
219
220 // Test that send bandwidth is set correctly.
221 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000222 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
223 // |expected_result| is the expected result from SetMaxSendBandwidth().
224 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000225 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000226 int max_bitrate,
227 bool expected_result,
228 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200229 cricket::AudioSendParameters parameters;
230 parameters.codecs.push_back(codec);
231 parameters.max_bandwidth_bps = max_bitrate;
232 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
233
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000234 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000235 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000236 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000237 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000238 }
239
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000240 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
241 EXPECT_TRUE(SetupEngineWithoutStream());
242 int channel_num = voe_.GetLastChannel();
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000243
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000244 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000245 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000246
247 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200248 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000249 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200250 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000251 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000252
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000253 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200254 send_parameters_.extensions.clear();
255 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000256 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000257
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000258 // Ensure extension is set properly.
259 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200260 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
261 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000262 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000263
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000264 // Ensure extension is set properly on new channel.
265 // The first stream to occupy the default channel.
266 EXPECT_TRUE(channel_->AddSendStream(
267 cricket::StreamParams::CreateLegacy(123)));
268 EXPECT_TRUE(channel_->AddSendStream(
269 cricket::StreamParams::CreateLegacy(234)));
270 int new_channel_num = voe_.GetLastChannel();
271 EXPECT_NE(channel_num, new_channel_num);
272 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000273
274 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200275 send_parameters_.codecs.push_back(kPcmuCodec);
276 send_parameters_.extensions.clear();
277 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000278 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
279 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000280 }
281
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000282 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
283 EXPECT_TRUE(SetupEngineWithoutStream());
284 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000285
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000286 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000287 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000288
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200289 cricket::AudioRecvParameters parameters;
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000290 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200291 parameters.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000292 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200293 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000294 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000295
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000296 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200297 parameters.extensions.clear();
298 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000299 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000300
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000301 // Ensure extension is set properly.
302 const int id = 2;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200303 parameters.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
304 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000305 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000306
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000307 // Ensure extension is set properly on new channel.
308 // The first stream to occupy the default channel.
309 EXPECT_TRUE(channel_->AddRecvStream(
310 cricket::StreamParams::CreateLegacy(345)));
311 EXPECT_TRUE(channel_->AddRecvStream(
312 cricket::StreamParams::CreateLegacy(456)));
313 int new_channel_num = voe_.GetLastChannel();
314 EXPECT_NE(channel_num, new_channel_num);
315 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
316
317 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200318 parameters.extensions.clear();
319 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000320 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
321 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000322 }
323
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000324 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200325 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000326 cricket::FakeWebRtcVoiceEngine voe_;
wu@webrtc.org97077a32013-10-25 21:18:33 +0000327 FakeVoETraceWrapper* trace_wrapper_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000328 cricket::WebRtcVoiceEngine engine_;
329 cricket::VoiceMediaChannel* channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000330
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200331 cricket::AudioSendParameters send_parameters_;
332 cricket::AudioRecvParameters recv_parameters_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000333 cricket::AudioOptions options_conference_;
334 cricket::AudioOptions options_adjust_agc_;
335};
336
337// Tests that our stub library "works".
338TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
339 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000340 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000341 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000342 engine_.Terminate();
343 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000344}
345
346// Tests that we can create and destroy a channel.
347TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000348 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200349 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200350 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000351}
352
353// Tests that we properly handle failures in CreateChannel.
354TEST_F(WebRtcVoiceEngineTestFake, CreateChannelFail) {
355 voe_.set_fail_create_channel(true);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000356 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200357 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200358 EXPECT_TRUE(channel_ == nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000359}
360
361// Tests that the list of supported codecs is created properly and ordered
362// correctly
363TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
364 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
365 ASSERT_FALSE(codecs.empty());
366 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
367 EXPECT_EQ(48000, codecs[0].clockrate);
368 EXPECT_EQ(2, codecs[0].channels);
369 EXPECT_EQ(64000, codecs[0].bitrate);
370 int pref = codecs[0].preference;
371 for (size_t i = 1; i < codecs.size(); ++i) {
372 EXPECT_GT(pref, codecs[i].preference);
373 pref = codecs[i].preference;
374 }
375}
376
377// Tests that we can find codecs by name or id, and that we interpret the
378// clockrate and bitrate fields properly.
379TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
380 cricket::AudioCodec codec;
381 webrtc::CodecInst codec_inst;
382 // Find PCMU with explicit clockrate and bitrate.
383 EXPECT_TRUE(engine_.FindWebRtcCodec(kPcmuCodec, &codec_inst));
384 // Find ISAC with explicit clockrate and 0 bitrate.
385 EXPECT_TRUE(engine_.FindWebRtcCodec(kIsacCodec, &codec_inst));
386 // Find telephone-event with explicit clockrate and 0 bitrate.
387 EXPECT_TRUE(engine_.FindWebRtcCodec(kTelephoneEventCodec, &codec_inst));
388 // Find ISAC with a different payload id.
389 codec = kIsacCodec;
390 codec.id = 127;
391 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
392 EXPECT_EQ(codec.id, codec_inst.pltype);
393 // Find PCMU with a 0 clockrate.
394 codec = kPcmuCodec;
395 codec.clockrate = 0;
396 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
397 EXPECT_EQ(codec.id, codec_inst.pltype);
398 EXPECT_EQ(8000, codec_inst.plfreq);
399 // Find PCMU with a 0 bitrate.
400 codec = kPcmuCodec;
401 codec.bitrate = 0;
402 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
403 EXPECT_EQ(codec.id, codec_inst.pltype);
404 EXPECT_EQ(64000, codec_inst.rate);
405 // Find ISAC with an explicit bitrate.
406 codec = kIsacCodec;
407 codec.bitrate = 32000;
408 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
409 EXPECT_EQ(codec.id, codec_inst.pltype);
410 EXPECT_EQ(32000, codec_inst.rate);
411}
412
413// Test that we set our inbound codecs properly, including changing PT.
414TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
415 EXPECT_TRUE(SetupEngine());
416 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200417 cricket::AudioRecvParameters parameters;
418 parameters.codecs.push_back(kIsacCodec);
419 parameters.codecs.push_back(kPcmuCodec);
420 parameters.codecs.push_back(kTelephoneEventCodec);
421 parameters.codecs[0].id = 106; // collide with existing telephone-event
422 parameters.codecs[2].id = 126;
423 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000424 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000425 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000426 gcodec.plfreq = 16000;
427 gcodec.channels = 1;
428 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
429 EXPECT_EQ(106, gcodec.pltype);
430 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000431 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000432 "telephone-event");
433 gcodec.plfreq = 8000;
434 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
435 EXPECT_EQ(126, gcodec.pltype);
436 EXPECT_STREQ("telephone-event", gcodec.plname);
437}
438
439// Test that we fail to set an unknown inbound codec.
440TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
441 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200442 cricket::AudioRecvParameters parameters;
443 parameters.codecs.push_back(kIsacCodec);
444 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
445 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000446}
447
448// Test that we fail if we have duplicate types in the inbound list.
449TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
450 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200451 cricket::AudioRecvParameters parameters;
452 parameters.codecs.push_back(kIsacCodec);
453 parameters.codecs.push_back(kCn16000Codec);
454 parameters.codecs[1].id = kIsacCodec.id;
455 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000456}
457
458// Test that we can decode OPUS without stereo parameters.
459TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
460 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200461 cricket::AudioRecvParameters parameters;
462 parameters.codecs.push_back(kIsacCodec);
463 parameters.codecs.push_back(kPcmuCodec);
464 parameters.codecs.push_back(kOpusCodec);
465 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000466 EXPECT_TRUE(channel_->AddRecvStream(
467 cricket::StreamParams::CreateLegacy(kSsrc1)));
468 int channel_num2 = voe_.GetLastChannel();
469 webrtc::CodecInst opus;
470 engine_.FindWebRtcCodec(kOpusCodec, &opus);
471 // Even without stereo parameters, recv codecs still specify channels = 2.
472 EXPECT_EQ(2, opus.channels);
473 EXPECT_EQ(111, opus.pltype);
474 EXPECT_STREQ("opus", opus.plname);
475 opus.pltype = 0;
476 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
477 EXPECT_EQ(111, opus.pltype);
478}
479
480// Test that we can decode OPUS with stereo = 0.
481TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
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(kOpusCodec);
487 parameters.codecs[2].params["stereo"] = "0";
488 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000489 EXPECT_TRUE(channel_->AddRecvStream(
490 cricket::StreamParams::CreateLegacy(kSsrc1)));
491 int channel_num2 = voe_.GetLastChannel();
492 webrtc::CodecInst opus;
493 engine_.FindWebRtcCodec(kOpusCodec, &opus);
494 // Even when stereo is off, recv codecs still specify channels = 2.
495 EXPECT_EQ(2, opus.channels);
496 EXPECT_EQ(111, opus.pltype);
497 EXPECT_STREQ("opus", opus.plname);
498 opus.pltype = 0;
499 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
500 EXPECT_EQ(111, opus.pltype);
501}
502
503// Test that we can decode OPUS with stereo = 1.
504TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
505 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200506 cricket::AudioRecvParameters parameters;
507 parameters.codecs.push_back(kIsacCodec);
508 parameters.codecs.push_back(kPcmuCodec);
509 parameters.codecs.push_back(kOpusCodec);
510 parameters.codecs[2].params["stereo"] = "1";
511 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000512 EXPECT_TRUE(channel_->AddRecvStream(
513 cricket::StreamParams::CreateLegacy(kSsrc1)));
514 int channel_num2 = voe_.GetLastChannel();
515 webrtc::CodecInst opus;
516 engine_.FindWebRtcCodec(kOpusCodec, &opus);
517 EXPECT_EQ(2, opus.channels);
518 EXPECT_EQ(111, opus.pltype);
519 EXPECT_STREQ("opus", opus.plname);
520 opus.pltype = 0;
521 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
522 EXPECT_EQ(111, opus.pltype);
523}
524
525// Test that changes to recv codecs are applied to all streams.
526TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
527 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200528 cricket::AudioRecvParameters parameters;
529 parameters.codecs.push_back(kIsacCodec);
530 parameters.codecs.push_back(kPcmuCodec);
531 parameters.codecs.push_back(kTelephoneEventCodec);
532 parameters.codecs[0].id = 106; // collide with existing telephone-event
533 parameters.codecs[2].id = 126;
534 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000535 EXPECT_TRUE(channel_->AddRecvStream(
536 cricket::StreamParams::CreateLegacy(kSsrc1)));
537 int channel_num2 = voe_.GetLastChannel();
538 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000539 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000540 gcodec.plfreq = 16000;
541 gcodec.channels = 1;
542 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
543 EXPECT_EQ(106, gcodec.pltype);
544 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000545 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000546 "telephone-event");
547 gcodec.plfreq = 8000;
548 gcodec.channels = 1;
549 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
550 EXPECT_EQ(126, gcodec.pltype);
551 EXPECT_STREQ("telephone-event", gcodec.plname);
552}
553
554TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
555 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200556 cricket::AudioRecvParameters parameters;
557 parameters.codecs.push_back(kIsacCodec);
558 parameters.codecs[0].id = 106; // collide with existing telephone-event
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000559 EXPECT_TRUE(channel_->AddRecvStream(
560 cricket::StreamParams::CreateLegacy(kSsrc1)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200561 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000562
563 int channel_num2 = voe_.GetLastChannel();
564 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000565 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000566 gcodec.plfreq = 16000;
567 gcodec.channels = 1;
568 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
569 EXPECT_EQ(106, gcodec.pltype);
570 EXPECT_STREQ("ISAC", gcodec.plname);
571}
572
573// Test that we can apply the same set of codecs again while playing.
574TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
575 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200576 cricket::AudioRecvParameters parameters;
577 parameters.codecs.push_back(kIsacCodec);
578 parameters.codecs.push_back(kCn16000Codec);
579 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000580 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200581 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000582
583 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200584 parameters.codecs[0].id = 127;
585 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
586 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000587 EXPECT_TRUE(voe_.GetPlayout(channel_num));
588}
589
590// Test that we can add a codec while playing.
591TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
592 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200593 cricket::AudioRecvParameters parameters;
594 parameters.codecs.push_back(kIsacCodec);
595 parameters.codecs.push_back(kCn16000Codec);
596 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000597 EXPECT_TRUE(channel_->SetPlayout(true));
598
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200599 parameters.codecs.push_back(kOpusCodec);
600 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
601 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000602 EXPECT_TRUE(voe_.GetPlayout(channel_num));
603 webrtc::CodecInst gcodec;
604 EXPECT_TRUE(engine_.FindWebRtcCodec(kOpusCodec, &gcodec));
605 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
606}
607
608TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
609 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000610
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000611 // Test that when autobw is enabled, bitrate is kept as the default
612 // value. autobw is enabled for the following tests because the target
613 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000614
615 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000616 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617
618 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000619 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000620
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000621 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000622 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000623}
624
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000625TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000626 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000627
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000628 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000629
630 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000631 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
632 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000633
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000634 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000635 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
636 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000637}
638
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000639TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
640 EXPECT_TRUE(SetupEngine());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000641
642 // Test that we can only set a maximum bitrate for a fixed-rate codec
643 // if it's bigger than the fixed rate.
644
645 // PCMU, fixed bitrate == 64000.
646 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
647 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
648 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
649 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
650 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
651 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
652 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
653}
654
655TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200656 EXPECT_TRUE(SetupEngineWithoutStream());
657 const int kDesiredBitrate = 128000;
658 cricket::AudioSendParameters parameters;
659 parameters.codecs = engine_.codecs();
660 parameters.max_bandwidth_bps = kDesiredBitrate;
661 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000662
663 EXPECT_TRUE(channel_->AddSendStream(
664 cricket::StreamParams::CreateLegacy(kSsrc1)));
665
666 int channel_num = voe_.GetLastChannel();
667 webrtc::CodecInst codec;
668 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200669 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000670}
671
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000672// Test that bitrate cannot be set for CBR codecs.
673// Bitrate is ignored if it is higher than the fixed bitrate.
674// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000675TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000676 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000677
678 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200679 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
680 int channel_num = voe_.GetLastChannel();
681 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000682 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
683 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200684
685 send_parameters_.max_bandwidth_bps = 128000;
686 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000687 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
688 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200689
690 send_parameters_.max_bandwidth_bps = 128;
691 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
693 EXPECT_EQ(64000, codec.rate);
694}
695
696// Test that we apply codecs properly.
697TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
698 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200699 cricket::AudioSendParameters parameters;
700 parameters.codecs.push_back(kIsacCodec);
701 parameters.codecs.push_back(kPcmuCodec);
702 parameters.codecs.push_back(kRedCodec);
703 parameters.codecs[0].id = 96;
704 parameters.codecs[0].bitrate = 48000;
705 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000706 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200707 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000708 webrtc::CodecInst gcodec;
709 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
710 EXPECT_EQ(96, gcodec.pltype);
711 EXPECT_EQ(48000, gcodec.rate);
712 EXPECT_STREQ("ISAC", gcodec.plname);
713 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000714 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000715 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
716 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
717 EXPECT_EQ(106, voe_.GetSendTelephoneEventPayloadType(channel_num));
718}
719
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000720// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
721// to apply.
722TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
723 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200724 cricket::AudioSendParameters parameters;
725 parameters.codecs.push_back(kIsacCodec);
726 parameters.codecs.push_back(kPcmuCodec);
727 parameters.codecs.push_back(kRedCodec);
728 parameters.codecs[0].id = 96;
729 parameters.codecs[0].bitrate = 48000;
730 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000731 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
732 // Calling SetSendCodec again with same codec which is already set.
733 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200734 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000735 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
736}
737
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000738// Verify that G722 is set with 16000 samples per second to WebRTC.
739TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
740 EXPECT_TRUE(SetupEngine());
741 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200742 cricket::AudioSendParameters parameters;
743 parameters.codecs.push_back(kG722CodecSdp);
744 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000745 webrtc::CodecInst gcodec;
746 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
747 EXPECT_STREQ("G722", gcodec.plname);
748 EXPECT_EQ(1, gcodec.channels);
749 EXPECT_EQ(16000, gcodec.plfreq);
750}
751
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000752// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000753TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
754 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200755 cricket::AudioSendParameters parameters;
756 parameters.codecs.push_back(kOpusCodec);
757 parameters.codecs[0].bitrate = 0;
758 parameters.codecs[0].clockrate = 50000;
759 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000760}
761
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000762// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000763TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
764 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200765 cricket::AudioSendParameters parameters;
766 parameters.codecs.push_back(kOpusCodec);
767 parameters.codecs[0].bitrate = 0;
768 parameters.codecs[0].channels = 0;
769 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000770}
771
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000772// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000773TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
774 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200775 cricket::AudioSendParameters parameters;
776 parameters.codecs.push_back(kOpusCodec);
777 parameters.codecs[0].bitrate = 0;
778 parameters.codecs[0].channels = 0;
779 parameters.codecs[0].params["stereo"] = "1";
780 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000781}
782
783// Test that if channel is 1 for opus and there's no stereo, we fail.
784TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
785 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200786 cricket::AudioSendParameters parameters;
787 parameters.codecs.push_back(kOpusCodec);
788 parameters.codecs[0].bitrate = 0;
789 parameters.codecs[0].channels = 1;
790 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000791}
792
793// Test that if channel is 1 for opus and stereo=0, we fail.
794TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
795 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200796 cricket::AudioSendParameters parameters;
797 parameters.codecs.push_back(kOpusCodec);
798 parameters.codecs[0].bitrate = 0;
799 parameters.codecs[0].channels = 1;
800 parameters.codecs[0].params["stereo"] = "0";
801 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000802}
803
804// Test that if channel is 1 for opus and stereo=1, we fail.
805TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
806 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200807 cricket::AudioSendParameters parameters;
808 parameters.codecs.push_back(kOpusCodec);
809 parameters.codecs[0].bitrate = 0;
810 parameters.codecs[0].channels = 1;
811 parameters.codecs[0].params["stereo"] = "1";
812 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000813}
814
815// Test that with bitrate=0 and no stereo,
816// channels and bitrate are 1 and 32000.
817TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
818 EXPECT_TRUE(SetupEngine());
819 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200820 cricket::AudioSendParameters parameters;
821 parameters.codecs.push_back(kOpusCodec);
822 parameters.codecs[0].bitrate = 0;
823 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000824 webrtc::CodecInst gcodec;
825 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
826 EXPECT_STREQ("opus", gcodec.plname);
827 EXPECT_EQ(1, gcodec.channels);
828 EXPECT_EQ(32000, gcodec.rate);
829}
830
831// Test that with bitrate=0 and stereo=0,
832// channels and bitrate are 1 and 32000.
833TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
834 EXPECT_TRUE(SetupEngine());
835 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200836 cricket::AudioSendParameters parameters;
837 parameters.codecs.push_back(kOpusCodec);
838 parameters.codecs[0].bitrate = 0;
839 parameters.codecs[0].params["stereo"] = "0";
840 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000841 webrtc::CodecInst gcodec;
842 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
843 EXPECT_STREQ("opus", gcodec.plname);
844 EXPECT_EQ(1, gcodec.channels);
845 EXPECT_EQ(32000, gcodec.rate);
846}
847
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000848// Test that with bitrate=invalid and stereo=0,
849// channels and bitrate are 1 and 32000.
850TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
851 EXPECT_TRUE(SetupEngine());
852 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200853 cricket::AudioSendParameters parameters;
854 parameters.codecs.push_back(kOpusCodec);
855 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000856 webrtc::CodecInst gcodec;
857
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000858 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200859 parameters.codecs[0].bitrate = 5999;
860 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000861 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
862 EXPECT_STREQ("opus", gcodec.plname);
863 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000864 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000865
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200866 parameters.codecs[0].bitrate = 510001;
867 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000868 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
869 EXPECT_STREQ("opus", gcodec.plname);
870 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000871 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000872}
873
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000874// Test that with bitrate=0 and stereo=1,
875// channels and bitrate are 2 and 64000.
876TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
877 EXPECT_TRUE(SetupEngine());
878 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200879 cricket::AudioSendParameters parameters;
880 parameters.codecs.push_back(kOpusCodec);
881 parameters.codecs[0].bitrate = 0;
882 parameters.codecs[0].params["stereo"] = "1";
883 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000884 webrtc::CodecInst gcodec;
885 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
886 EXPECT_STREQ("opus", gcodec.plname);
887 EXPECT_EQ(2, gcodec.channels);
888 EXPECT_EQ(64000, gcodec.rate);
889}
890
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000891// Test that with bitrate=invalid and stereo=1,
892// channels and bitrate are 2 and 64000.
893TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
894 EXPECT_TRUE(SetupEngine());
895 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200896 cricket::AudioSendParameters parameters;
897 parameters.codecs.push_back(kOpusCodec);
898 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000899 webrtc::CodecInst gcodec;
900
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000901 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200902 parameters.codecs[0].bitrate = 5999;
903 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000904 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
905 EXPECT_STREQ("opus", gcodec.plname);
906 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000907 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000908
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200909 parameters.codecs[0].bitrate = 510001;
910 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000911 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
912 EXPECT_STREQ("opus", gcodec.plname);
913 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000914 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000915}
916
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000917// Test that with bitrate=N and stereo unset,
918// channels and bitrate are 1 and N.
919TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
920 EXPECT_TRUE(SetupEngine());
921 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200922 cricket::AudioSendParameters parameters;
923 parameters.codecs.push_back(kOpusCodec);
924 parameters.codecs[0].bitrate = 96000;
925 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000926 webrtc::CodecInst gcodec;
927 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
928 EXPECT_EQ(111, gcodec.pltype);
929 EXPECT_EQ(96000, gcodec.rate);
930 EXPECT_STREQ("opus", gcodec.plname);
931 EXPECT_EQ(1, gcodec.channels);
932 EXPECT_EQ(48000, gcodec.plfreq);
933}
934
935// Test that with bitrate=N and stereo=0,
936// channels and bitrate are 1 and N.
937TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
938 EXPECT_TRUE(SetupEngine());
939 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200940 cricket::AudioSendParameters parameters;
941 parameters.codecs.push_back(kOpusCodec);
942 parameters.codecs[0].bitrate = 30000;
943 parameters.codecs[0].params["stereo"] = "0";
944 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000945 webrtc::CodecInst gcodec;
946 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
947 EXPECT_EQ(1, gcodec.channels);
948 EXPECT_EQ(30000, gcodec.rate);
949 EXPECT_STREQ("opus", gcodec.plname);
950}
951
952// Test that with bitrate=N and without any parameters,
953// channels and bitrate are 1 and N.
954TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
955 EXPECT_TRUE(SetupEngine());
956 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200957 cricket::AudioSendParameters parameters;
958 parameters.codecs.push_back(kOpusCodec);
959 parameters.codecs[0].bitrate = 30000;
960 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000961 webrtc::CodecInst gcodec;
962 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
963 EXPECT_EQ(1, gcodec.channels);
964 EXPECT_EQ(30000, gcodec.rate);
965 EXPECT_STREQ("opus", gcodec.plname);
966}
967
968// Test that with bitrate=N and stereo=1,
969// channels and bitrate are 2 and N.
970TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
971 EXPECT_TRUE(SetupEngine());
972 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200973 cricket::AudioSendParameters parameters;
974 parameters.codecs.push_back(kOpusCodec);
975 parameters.codecs[0].bitrate = 30000;
976 parameters.codecs[0].params["stereo"] = "1";
977 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000978 webrtc::CodecInst gcodec;
979 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
980 EXPECT_EQ(2, gcodec.channels);
981 EXPECT_EQ(30000, gcodec.rate);
982 EXPECT_STREQ("opus", gcodec.plname);
983}
984
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000985// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
986// Also test that the "maxaveragebitrate" can't be set to values outside the
987// range of 6000 and 510000
988TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
989 EXPECT_TRUE(SetupEngine());
990 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200991 cricket::AudioSendParameters parameters;
992 parameters.codecs.push_back(kOpusCodec);
993 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000994 webrtc::CodecInst gcodec;
995
996 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200997 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
998 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000999 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001000 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001001
1002 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001003 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1004 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001005 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001006 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001007
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001008 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1009 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001010 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1011 EXPECT_EQ(200000, gcodec.rate);
1012}
1013
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001014// Test that we can enable NACK with opus as caller.
1015TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001016 EXPECT_TRUE(SetupEngine());
1017 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001018 cricket::AudioSendParameters parameters;
1019 parameters.codecs.push_back(kOpusCodec);
1020 parameters.codecs[0].AddFeedbackParam(
1021 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1022 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001023 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001024 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001025 EXPECT_TRUE(voe_.GetNACK(channel_num));
1026}
1027
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001028// Test that we can enable NACK with opus as callee.
1029TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001030 EXPECT_TRUE(SetupEngineWithoutStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001031 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001032 cricket::AudioSendParameters parameters;
1033 parameters.codecs.push_back(kOpusCodec);
1034 parameters.codecs[0].AddFeedbackParam(
1035 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1036 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001037 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001038 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001039 EXPECT_FALSE(voe_.GetNACK(channel_num));
1040
1041 EXPECT_TRUE(channel_->AddSendStream(
1042 cricket::StreamParams::CreateLegacy(kSsrc1)));
1043 EXPECT_TRUE(voe_.GetNACK(channel_num));
1044}
1045
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001046// Test that we can enable NACK on receive streams.
1047TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
1048 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001049 int channel_num1 = voe_.GetLastChannel();
1050 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1051 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001052 cricket::AudioSendParameters parameters;
1053 parameters.codecs.push_back(kOpusCodec);
1054 parameters.codecs[0].AddFeedbackParam(
1055 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1056 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001057 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1058 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001059 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001060 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1061 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1062}
1063
1064// Test that we can disable NACK.
1065TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
1066 EXPECT_TRUE(SetupEngine());
1067 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001068 cricket::AudioSendParameters parameters;
1069 parameters.codecs.push_back(kOpusCodec);
1070 parameters.codecs[0].AddFeedbackParam(
1071 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1072 cricket::kParamValueEmpty));
1073 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001074 EXPECT_TRUE(voe_.GetNACK(channel_num));
1075
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001076 parameters.codecs.clear();
1077 parameters.codecs.push_back(kOpusCodec);
1078 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001079 EXPECT_FALSE(voe_.GetNACK(channel_num));
1080}
1081
1082// Test that we can disable NACK on receive streams.
1083TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
1084 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001085 int channel_num1 = voe_.GetLastChannel();
1086 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1087 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001088 cricket::AudioSendParameters parameters;
1089 parameters.codecs.push_back(kOpusCodec);
1090 parameters.codecs[0].AddFeedbackParam(
1091 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1092 cricket::kParamValueEmpty));
1093 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001094 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1095 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1096
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001097 parameters.codecs.clear();
1098 parameters.codecs.push_back(kOpusCodec);
1099 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001100 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1101 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1102}
1103
1104// Test that NACK is enabled on a new receive stream.
1105TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
1106 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001107 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001108 cricket::AudioSendParameters parameters;
1109 parameters.codecs.push_back(kIsacCodec);
1110 parameters.codecs.push_back(kCn16000Codec);
1111 parameters.codecs[0].AddFeedbackParam(
1112 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1113 cricket::kParamValueEmpty));
1114 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001115 EXPECT_TRUE(voe_.GetNACK(channel_num));
1116
1117 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1118 channel_num = voe_.GetLastChannel();
1119 EXPECT_TRUE(voe_.GetNACK(channel_num));
1120 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1121 channel_num = voe_.GetLastChannel();
1122 EXPECT_TRUE(voe_.GetNACK(channel_num));
1123}
1124
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001125// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001126TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001127 EXPECT_TRUE(SetupEngine());
1128 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001129 cricket::AudioSendParameters parameters;
1130 parameters.codecs.push_back(kOpusCodec);
1131 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001132 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1133}
1134
1135// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001136TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001137 EXPECT_TRUE(SetupEngine());
1138 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001139 cricket::AudioSendParameters parameters;
1140 parameters.codecs.push_back(kOpusCodec);
1141 parameters.codecs[0].bitrate = 0;
1142 parameters.codecs[0].params["useinbandfec"] = "0";
1143 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001144 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1145 webrtc::CodecInst gcodec;
1146 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1147 EXPECT_STREQ("opus", gcodec.plname);
1148 EXPECT_EQ(1, gcodec.channels);
1149 EXPECT_EQ(32000, gcodec.rate);
1150}
1151
1152// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001153TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001154 EXPECT_TRUE(SetupEngine());
1155 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001156 cricket::AudioSendParameters parameters;
1157 parameters.codecs.push_back(kOpusCodec);
1158 parameters.codecs[0].bitrate = 0;
1159 parameters.codecs[0].params["useinbandfec"] = "1";
1160 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001161 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1162 webrtc::CodecInst gcodec;
1163 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1164 EXPECT_STREQ("opus", gcodec.plname);
1165 EXPECT_EQ(1, gcodec.channels);
1166 EXPECT_EQ(32000, gcodec.rate);
1167}
1168
1169// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001170TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001171 EXPECT_TRUE(SetupEngine());
1172 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001173 cricket::AudioSendParameters parameters;
1174 parameters.codecs.push_back(kOpusCodec);
1175 parameters.codecs[0].bitrate = 0;
1176 parameters.codecs[0].params["stereo"] = "1";
1177 parameters.codecs[0].params["useinbandfec"] = "1";
1178 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001179 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1180 webrtc::CodecInst gcodec;
1181 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1182 EXPECT_STREQ("opus", gcodec.plname);
1183 EXPECT_EQ(2, gcodec.channels);
1184 EXPECT_EQ(64000, gcodec.rate);
1185}
1186
1187// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001188TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001189 EXPECT_TRUE(SetupEngine());
1190 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001191 cricket::AudioSendParameters parameters;
1192 parameters.codecs.push_back(kIsacCodec);
1193 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001194 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1195}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001196
1197// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1198TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
1199 EXPECT_TRUE(SetupEngine());
1200 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001201 cricket::AudioSendParameters parameters;
1202 parameters.codecs.push_back(kIsacCodec);
1203 parameters.codecs[0].params["useinbandfec"] = "1";
1204 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001205 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1206}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001207
1208// Test that Opus FEC status can be changed.
1209TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
1210 EXPECT_TRUE(SetupEngine());
1211 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001212 cricket::AudioSendParameters parameters;
1213 parameters.codecs.push_back(kOpusCodec);
1214 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001215 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001216 parameters.codecs[0].params["useinbandfec"] = "1";
1217 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001218 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1219}
1220
1221// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1222TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
1223 EXPECT_TRUE(SetupEngine());
1224 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001225 cricket::AudioSendParameters parameters;
1226 parameters.codecs.push_back(kOpusCodec);
1227 parameters.codecs[0].bitrate = 0;
1228 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1229 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001230 EXPECT_EQ(cricket::kOpusBandwidthNb,
1231 voe_.GetMaxEncodingBandwidth(channel_num));
1232 webrtc::CodecInst gcodec;
1233 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1234 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001235
1236 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001237 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1238 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001239 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1240 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001241}
1242
1243// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1244TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
1245 EXPECT_TRUE(SetupEngine());
1246 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001247 cricket::AudioSendParameters parameters;
1248 parameters.codecs.push_back(kOpusCodec);
1249 parameters.codecs[0].bitrate = 0;
1250 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1251 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001252 EXPECT_EQ(cricket::kOpusBandwidthMb,
1253 voe_.GetMaxEncodingBandwidth(channel_num));
1254 webrtc::CodecInst gcodec;
1255 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1256 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001257
1258 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001259 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1260 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001261 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1262 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001263}
1264
1265// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1266TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
1267 EXPECT_TRUE(SetupEngine());
1268 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001269 cricket::AudioSendParameters parameters;
1270 parameters.codecs.push_back(kOpusCodec);
1271 parameters.codecs[0].bitrate = 0;
1272 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1273 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001274 EXPECT_EQ(cricket::kOpusBandwidthWb,
1275 voe_.GetMaxEncodingBandwidth(channel_num));
1276 webrtc::CodecInst gcodec;
1277 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1278 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001279
1280 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001281 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1282 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001283 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1284 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001285}
1286
1287// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1288TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
1289 EXPECT_TRUE(SetupEngine());
1290 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001291 cricket::AudioSendParameters parameters;
1292 parameters.codecs.push_back(kOpusCodec);
1293 parameters.codecs[0].bitrate = 0;
1294 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1295 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001296 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1297 voe_.GetMaxEncodingBandwidth(channel_num));
1298 webrtc::CodecInst gcodec;
1299 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1300 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001301
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001302 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001303 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1304 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001305 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1306 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001307}
1308
1309// Test 24000 < maxplaybackrate triggers Opus full band mode.
1310TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
1311 EXPECT_TRUE(SetupEngine());
1312 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001313 cricket::AudioSendParameters parameters;
1314 parameters.codecs.push_back(kOpusCodec);
1315 parameters.codecs[0].bitrate = 0;
1316 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1317 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001318 EXPECT_EQ(cricket::kOpusBandwidthFb,
1319 voe_.GetMaxEncodingBandwidth(channel_num));
1320 webrtc::CodecInst gcodec;
1321 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1322 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001323
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001324 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001325 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1326 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001327 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1328 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001329}
1330
1331// Test Opus that without maxplaybackrate, default playback rate is used.
1332TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
1333 EXPECT_TRUE(SetupEngine());
1334 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001335 cricket::AudioSendParameters parameters;
1336 parameters.codecs.push_back(kOpusCodec);
1337 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001338 EXPECT_EQ(cricket::kOpusBandwidthFb,
1339 voe_.GetMaxEncodingBandwidth(channel_num));
1340}
1341
1342// Test the with non-Opus, maxplaybackrate has no effect.
1343TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
1344 EXPECT_TRUE(SetupEngine());
1345 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001346 cricket::AudioSendParameters parameters;
1347 parameters.codecs.push_back(kIsacCodec);
1348 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1349 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001350 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1351}
1352
1353// Test maxplaybackrate can be set on two streams.
1354TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
1355 EXPECT_TRUE(SetupEngine());
1356 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001357 cricket::AudioSendParameters parameters;
1358 parameters.codecs.push_back(kOpusCodec);
1359 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001360 // Default bandwidth is 24000.
1361 EXPECT_EQ(cricket::kOpusBandwidthFb,
1362 voe_.GetMaxEncodingBandwidth(channel_num));
1363
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001364 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001365
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001366 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001367 EXPECT_EQ(cricket::kOpusBandwidthNb,
1368 voe_.GetMaxEncodingBandwidth(channel_num));
1369
1370 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1371 channel_num = voe_.GetLastChannel();
1372 EXPECT_EQ(cricket::kOpusBandwidthNb,
1373 voe_.GetMaxEncodingBandwidth(channel_num));
1374}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001375
Minyue Li7100dcd2015-03-27 05:05:59 +01001376// Test that with usedtx=0, Opus DTX is off.
1377TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
1378 EXPECT_TRUE(SetupEngine());
1379 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001380 cricket::AudioSendParameters parameters;
1381 parameters.codecs.push_back(kOpusCodec);
1382 parameters.codecs[0].params["usedtx"] = "0";
1383 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001384 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1385}
1386
1387// Test that with usedtx=1, Opus DTX is on.
1388TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
1389 EXPECT_TRUE(SetupEngine());
1390 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001391 cricket::AudioSendParameters parameters;
1392 parameters.codecs.push_back(kOpusCodec);
1393 parameters.codecs[0].params["usedtx"] = "1";
1394 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001395 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1396 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1397}
1398
1399// Test that usedtx=1 works with stereo Opus.
1400TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
1401 EXPECT_TRUE(SetupEngine());
1402 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001403 cricket::AudioSendParameters parameters;
1404 parameters.codecs.push_back(kOpusCodec);
1405 parameters.codecs[0].params["usedtx"] = "1";
1406 parameters.codecs[0].params["stereo"] = "1";
1407 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001408 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1409 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1410}
1411
1412// Test that usedtx=1 does not work with non Opus.
1413TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
1414 EXPECT_TRUE(SetupEngine());
1415 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001416 cricket::AudioSendParameters parameters;
1417 parameters.codecs.push_back(kIsacCodec);
1418 parameters.codecs[0].params["usedtx"] = "1";
1419 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001420 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1421}
1422
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001423// Test that we can switch back and forth between Opus and ISAC with CN.
1424TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001425 EXPECT_TRUE(SetupEngine());
1426 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001427 cricket::AudioSendParameters opus_parameters;
1428 opus_parameters.codecs.push_back(kOpusCodec);
1429 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001430 webrtc::CodecInst gcodec;
1431 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001432 EXPECT_EQ(111, gcodec.pltype);
1433 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001434
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001435 cricket::AudioSendParameters isac_parameters;
1436 isac_parameters.codecs.push_back(kIsacCodec);
1437 isac_parameters.codecs.push_back(kCn16000Codec);
1438 isac_parameters.codecs.push_back(kOpusCodec);
1439 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001440 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1441 EXPECT_EQ(103, gcodec.pltype);
1442 EXPECT_STREQ("ISAC", gcodec.plname);
1443
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001444 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001445 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001446 EXPECT_EQ(111, gcodec.pltype);
1447 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001448}
1449
1450// Test that we handle various ways of specifying bitrate.
1451TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
1452 EXPECT_TRUE(SetupEngine());
1453 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001454 cricket::AudioSendParameters parameters;
1455 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1456 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001457 webrtc::CodecInst gcodec;
1458 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1459 EXPECT_EQ(103, gcodec.pltype);
1460 EXPECT_STREQ("ISAC", gcodec.plname);
1461 EXPECT_EQ(32000, gcodec.rate);
1462
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001463 parameters.codecs[0].bitrate = 0; // bitrate == default
1464 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001465 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1466 EXPECT_EQ(103, gcodec.pltype);
1467 EXPECT_STREQ("ISAC", gcodec.plname);
1468 EXPECT_EQ(-1, gcodec.rate);
1469
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001470 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1471 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001472 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1473 EXPECT_EQ(103, gcodec.pltype);
1474 EXPECT_STREQ("ISAC", gcodec.plname);
1475 EXPECT_EQ(28000, gcodec.rate);
1476
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001477 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1478 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001479 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1480 EXPECT_EQ(0, gcodec.pltype);
1481 EXPECT_STREQ("PCMU", gcodec.plname);
1482 EXPECT_EQ(64000, gcodec.rate);
1483
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001484 parameters.codecs[0].bitrate = 0; // bitrate == default
1485 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001486 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1487 EXPECT_EQ(0, gcodec.pltype);
1488 EXPECT_STREQ("PCMU", gcodec.plname);
1489 EXPECT_EQ(64000, gcodec.rate);
1490
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001491 parameters.codecs[0] = kOpusCodec;
1492 parameters.codecs[0].bitrate = 0; // bitrate == default
1493 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001494 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1495 EXPECT_EQ(111, gcodec.pltype);
1496 EXPECT_STREQ("opus", gcodec.plname);
1497 EXPECT_EQ(32000, gcodec.rate);
1498}
1499
Brave Yao5225dd82015-03-26 07:39:19 +08001500// Test that we could set packet size specified in kCodecParamPTime.
1501TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
1502 EXPECT_TRUE(SetupEngine());
1503 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001504 cricket::AudioSendParameters parameters;
1505 parameters.codecs.push_back(kOpusCodec);
1506 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1507 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001508 webrtc::CodecInst gcodec;
1509 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1510 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1511
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001512 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1513 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001514 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1515 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1516
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001517 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1518 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001519 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1520 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1521
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001522 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1523 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1524 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001525 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1526 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1527
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001528 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1529 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1530 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001531 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1532 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1533}
1534
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001535// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001536TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
1537 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001538 cricket::AudioSendParameters parameters;
1539 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001540}
1541
1542// Test that we can set send codecs even with telephone-event codec as the first
1543// one on the list.
1544TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
1545 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001546 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001547 cricket::AudioSendParameters parameters;
1548 parameters.codecs.push_back(kTelephoneEventCodec);
1549 parameters.codecs.push_back(kIsacCodec);
1550 parameters.codecs.push_back(kPcmuCodec);
1551 parameters.codecs[0].id = 98; // DTMF
1552 parameters.codecs[1].id = 96;
1553 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001554 webrtc::CodecInst gcodec;
1555 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001556 EXPECT_EQ(96, gcodec.pltype);
1557 EXPECT_STREQ("ISAC", gcodec.plname);
1558 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1559}
1560
1561// Test that we can set send codecs even with CN codec as the first
1562// one on the list.
1563TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
1564 EXPECT_TRUE(SetupEngine());
1565 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001566 cricket::AudioSendParameters parameters;
1567 parameters.codecs.push_back(kCn16000Codec);
1568 parameters.codecs.push_back(kIsacCodec);
1569 parameters.codecs.push_back(kPcmuCodec);
1570 parameters.codecs[0].id = 98; // wideband CN
1571 parameters.codecs[1].id = 96;
1572 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001573 webrtc::CodecInst gcodec;
1574 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1575 EXPECT_EQ(96, gcodec.pltype);
1576 EXPECT_STREQ("ISAC", gcodec.plname);
1577 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001578}
1579
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001580// Test that we set VAD and DTMF types correctly as caller.
1581TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001582 EXPECT_TRUE(SetupEngine());
1583 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001584 cricket::AudioSendParameters parameters;
1585 parameters.codecs.push_back(kIsacCodec);
1586 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001587 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001588 parameters.codecs.push_back(kCn16000Codec);
1589 parameters.codecs.push_back(kCn8000Codec);
1590 parameters.codecs.push_back(kTelephoneEventCodec);
1591 parameters.codecs.push_back(kRedCodec);
1592 parameters.codecs[0].id = 96;
1593 parameters.codecs[2].id = 97; // wideband CN
1594 parameters.codecs[4].id = 98; // DTMF
1595 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001596 webrtc::CodecInst gcodec;
1597 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1598 EXPECT_EQ(96, gcodec.pltype);
1599 EXPECT_STREQ("ISAC", gcodec.plname);
1600 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001601 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001602 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1603 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1604 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1605}
1606
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001607// Test that we set VAD and DTMF types correctly as callee.
1608TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001609 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001610 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001611 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001612
1613 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001614 cricket::AudioSendParameters parameters;
1615 parameters.codecs.push_back(kIsacCodec);
1616 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001617 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001618 parameters.codecs.push_back(kCn16000Codec);
1619 parameters.codecs.push_back(kCn8000Codec);
1620 parameters.codecs.push_back(kTelephoneEventCodec);
1621 parameters.codecs.push_back(kRedCodec);
1622 parameters.codecs[0].id = 96;
1623 parameters.codecs[2].id = 97; // wideband CN
1624 parameters.codecs[4].id = 98; // DTMF
1625 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001626 EXPECT_TRUE(channel_->AddSendStream(
1627 cricket::StreamParams::CreateLegacy(kSsrc1)));
1628
1629 webrtc::CodecInst gcodec;
1630 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1631 EXPECT_EQ(96, gcodec.pltype);
1632 EXPECT_STREQ("ISAC", gcodec.plname);
1633 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001634 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001635 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1636 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1637 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1638}
1639
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001640// Test that we only apply VAD if we have a CN codec that matches the
1641// send codec clockrate.
1642TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
1643 EXPECT_TRUE(SetupEngine());
1644 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001645 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001646 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001647 parameters.codecs.push_back(kIsacCodec);
1648 parameters.codecs.push_back(kCn16000Codec);
1649 parameters.codecs[1].id = 97;
1650 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001651 webrtc::CodecInst gcodec;
1652 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1653 EXPECT_STREQ("ISAC", gcodec.plname);
1654 EXPECT_TRUE(voe_.GetVAD(channel_num));
1655 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1656 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001657 parameters.codecs[0] = kPcmuCodec;
1658 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001659 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1660 EXPECT_STREQ("PCMU", gcodec.plname);
1661 EXPECT_FALSE(voe_.GetVAD(channel_num));
1662 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001663 parameters.codecs[1] = kCn8000Codec;
1664 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001665 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1666 EXPECT_STREQ("PCMU", gcodec.plname);
1667 EXPECT_TRUE(voe_.GetVAD(channel_num));
1668 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001669 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001670 parameters.codecs[0] = kIsacCodec;
1671 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001672 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1673 EXPECT_STREQ("ISAC", gcodec.plname);
1674 EXPECT_FALSE(voe_.GetVAD(channel_num));
1675}
1676
1677// Test that we perform case-insensitive matching of codec names.
1678TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
1679 EXPECT_TRUE(SetupEngine());
1680 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001681 cricket::AudioSendParameters parameters;
1682 parameters.codecs.push_back(kIsacCodec);
1683 parameters.codecs.push_back(kPcmuCodec);
1684 parameters.codecs.push_back(kCn16000Codec);
1685 parameters.codecs.push_back(kCn8000Codec);
1686 parameters.codecs.push_back(kTelephoneEventCodec);
1687 parameters.codecs.push_back(kRedCodec);
1688 parameters.codecs[0].name = "iSaC";
1689 parameters.codecs[0].id = 96;
1690 parameters.codecs[2].id = 97; // wideband CN
1691 parameters.codecs[4].id = 98; // DTMF
1692 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001693 webrtc::CodecInst gcodec;
1694 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1695 EXPECT_EQ(96, gcodec.pltype);
1696 EXPECT_STREQ("ISAC", gcodec.plname);
1697 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001698 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001699 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1700 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1701 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1702}
1703
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001704// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001705TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001706 EXPECT_TRUE(SetupEngine());
1707 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001708 cricket::AudioSendParameters parameters;
1709 parameters.codecs.push_back(kRedCodec);
1710 parameters.codecs.push_back(kIsacCodec);
1711 parameters.codecs.push_back(kPcmuCodec);
1712 parameters.codecs[0].id = 127;
1713 parameters.codecs[0].params[""] = "96/96";
1714 parameters.codecs[1].id = 96;
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_EQ(96, gcodec.pltype);
1719 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001720 EXPECT_TRUE(voe_.GetRED(channel_num));
1721 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001722}
1723
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001724// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001725TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001726 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001727 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001728 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001729
1730 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001731 cricket::AudioSendParameters parameters;
1732 parameters.codecs.push_back(kRedCodec);
1733 parameters.codecs.push_back(kIsacCodec);
1734 parameters.codecs.push_back(kPcmuCodec);
1735 parameters.codecs[0].id = 127;
1736 parameters.codecs[0].params[""] = "96/96";
1737 parameters.codecs[1].id = 96;
1738 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001739 EXPECT_TRUE(channel_->AddSendStream(
1740 cricket::StreamParams::CreateLegacy(kSsrc1)));
1741 webrtc::CodecInst gcodec;
1742 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1743 EXPECT_EQ(96, gcodec.pltype);
1744 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001745 EXPECT_TRUE(voe_.GetRED(channel_num));
1746 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001747}
1748
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001749// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001750TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
1751 EXPECT_TRUE(SetupEngine());
1752 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001753 cricket::AudioSendParameters parameters;
1754 parameters.codecs.push_back(kRedCodec);
1755 parameters.codecs.push_back(kIsacCodec);
1756 parameters.codecs.push_back(kPcmuCodec);
1757 parameters.codecs[0].id = 127;
1758 parameters.codecs[1].id = 96;
1759 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001760 webrtc::CodecInst gcodec;
1761 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1762 EXPECT_EQ(96, gcodec.pltype);
1763 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001764 EXPECT_TRUE(voe_.GetRED(channel_num));
1765 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001766}
1767
1768// Test that we ignore RED if the parameters aren't named the way we expect.
1769TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
1770 EXPECT_TRUE(SetupEngine());
1771 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001772 cricket::AudioSendParameters parameters;
1773 parameters.codecs.push_back(kRedCodec);
1774 parameters.codecs.push_back(kIsacCodec);
1775 parameters.codecs.push_back(kPcmuCodec);
1776 parameters.codecs[0].id = 127;
1777 parameters.codecs[0].params["ABC"] = "96/96";
1778 parameters.codecs[1].id = 96;
1779 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001780 webrtc::CodecInst gcodec;
1781 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1782 EXPECT_EQ(96, gcodec.pltype);
1783 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001784 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001785}
1786
1787// Test that we ignore RED if it uses different primary/secondary encoding.
1788TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
1789 EXPECT_TRUE(SetupEngine());
1790 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001791 cricket::AudioSendParameters parameters;
1792 parameters.codecs.push_back(kRedCodec);
1793 parameters.codecs.push_back(kIsacCodec);
1794 parameters.codecs.push_back(kPcmuCodec);
1795 parameters.codecs[0].id = 127;
1796 parameters.codecs[0].params[""] = "96/0";
1797 parameters.codecs[1].id = 96;
1798 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001799 webrtc::CodecInst gcodec;
1800 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1801 EXPECT_EQ(96, gcodec.pltype);
1802 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001803 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001804}
1805
1806// Test that we ignore RED if it uses more than 2 encodings.
1807TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
1808 EXPECT_TRUE(SetupEngine());
1809 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001810 cricket::AudioSendParameters parameters;
1811 parameters.codecs.push_back(kRedCodec);
1812 parameters.codecs.push_back(kIsacCodec);
1813 parameters.codecs.push_back(kPcmuCodec);
1814 parameters.codecs[0].id = 127;
1815 parameters.codecs[0].params[""] = "96/96/96";
1816 parameters.codecs[1].id = 96;
1817 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001818 webrtc::CodecInst gcodec;
1819 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1820 EXPECT_EQ(96, gcodec.pltype);
1821 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001822 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001823}
1824
1825// Test that we ignore RED if it has bogus codec ids.
1826TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
1827 EXPECT_TRUE(SetupEngine());
1828 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001829 cricket::AudioSendParameters parameters;
1830 parameters.codecs.push_back(kRedCodec);
1831 parameters.codecs.push_back(kIsacCodec);
1832 parameters.codecs.push_back(kPcmuCodec);
1833 parameters.codecs[0].id = 127;
1834 parameters.codecs[0].params[""] = "ABC/ABC";
1835 parameters.codecs[1].id = 96;
1836 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001837 webrtc::CodecInst gcodec;
1838 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1839 EXPECT_EQ(96, gcodec.pltype);
1840 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001841 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001842}
1843
1844// Test that we ignore RED if it refers to a codec that is not present.
1845TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
1846 EXPECT_TRUE(SetupEngine());
1847 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001848 cricket::AudioSendParameters parameters;
1849 parameters.codecs.push_back(kRedCodec);
1850 parameters.codecs.push_back(kIsacCodec);
1851 parameters.codecs.push_back(kPcmuCodec);
1852 parameters.codecs[0].id = 127;
1853 parameters.codecs[0].params[""] = "97/97";
1854 parameters.codecs[1].id = 96;
1855 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001856 webrtc::CodecInst gcodec;
1857 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1858 EXPECT_EQ(96, gcodec.pltype);
1859 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001860 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001861}
1862
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001863// Test support for audio level header extension.
1864TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1865 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001866}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001867TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1868 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1869}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001870
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001871// Test support for absolute send time header extension.
1872TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1873 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1874}
1875TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1876 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001877}
1878
1879// Test that we can create a channel and start sending/playing out on it.
1880TEST_F(WebRtcVoiceEngineTestFake, SendAndPlayout) {
1881 EXPECT_TRUE(SetupEngine());
1882 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001883 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001884 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1885 EXPECT_TRUE(voe_.GetSend(channel_num));
1886 EXPECT_TRUE(channel_->SetPlayout(true));
1887 EXPECT_TRUE(voe_.GetPlayout(channel_num));
1888 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1889 EXPECT_FALSE(voe_.GetSend(channel_num));
1890 EXPECT_TRUE(channel_->SetPlayout(false));
1891 EXPECT_FALSE(voe_.GetPlayout(channel_num));
1892}
1893
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001894// Test that we can add and remove send streams.
1895TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
1896 SetupForMultiSendStream();
1897
1898 static const uint32 kSsrcs4[] = {1, 2, 3, 4};
1899
1900 // Set the global state for sending.
1901 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1902
1903 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1904 EXPECT_TRUE(channel_->AddSendStream(
1905 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1906
1907 // Verify that we are in a sending state for all the created streams.
1908 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1909 EXPECT_TRUE(voe_.GetSend(channel_num));
1910 }
1911
1912 // Remove the first send channel, which is the default channel. It will only
1913 // recycle the default channel but not delete it.
1914 EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[0]));
1915 // Stream should already be Removed from the send stream list.
1916 EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[0]));
1917 // But the default still exists.
1918 EXPECT_EQ(0, voe_.GetChannelFromLocalSsrc(kSsrcs4[0]));
1919
1920 // Delete the rest of send channel streams.
1921 for (unsigned int i = 1; i < ARRAY_SIZE(kSsrcs4); ++i) {
1922 EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[i]));
1923 // Stream should already be deleted.
1924 EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[i]));
1925 EXPECT_EQ(-1, voe_.GetChannelFromLocalSsrc(kSsrcs4[i]));
1926 }
1927}
1928
1929// Test SetSendCodecs correctly configure the codecs in all send streams.
1930TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
1931 SetupForMultiSendStream();
1932
1933 static const uint32 kSsrcs4[] = {1, 2, 3, 4};
1934 // Create send streams.
1935 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1936 EXPECT_TRUE(channel_->AddSendStream(
1937 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1938 }
1939
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001940 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001941 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001942 parameters.codecs.push_back(kIsacCodec);
1943 parameters.codecs.push_back(kCn16000Codec);
1944 parameters.codecs[1].id = 97;
1945 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001946
1947 // Verify ISAC and VAD are corrected configured on all send channels.
1948 webrtc::CodecInst gcodec;
1949 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1950 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1951 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1952 EXPECT_STREQ("ISAC", gcodec.plname);
1953 EXPECT_TRUE(voe_.GetVAD(channel_num));
1954 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1955 }
1956
1957 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001958 parameters.codecs[0] = kPcmuCodec;
1959 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001960 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1961 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1962 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1963 EXPECT_STREQ("PCMU", gcodec.plname);
1964 EXPECT_FALSE(voe_.GetVAD(channel_num));
1965 }
1966}
1967
1968// Test we can SetSend on all send streams correctly.
1969TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
1970 SetupForMultiSendStream();
1971
1972 static const uint32 kSsrcs4[] = {1, 2, 3, 4};
1973 // Create the send channels and they should be a SEND_NOTHING date.
1974 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1975 EXPECT_TRUE(channel_->AddSendStream(
1976 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1977 int channel_num = voe_.GetLastChannel();
1978 EXPECT_FALSE(voe_.GetSend(channel_num));
1979 }
1980
1981 // Set the global state for starting sending.
1982 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1983 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1984 // Verify that we are in a sending state for all the send streams.
1985 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1986 EXPECT_TRUE(voe_.GetSend(channel_num));
1987 }
1988
1989 // Set the global state for stopping sending.
1990 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1991 for (unsigned int i = 1; i < ARRAY_SIZE(kSsrcs4); ++i) {
1992 // Verify that we are in a stop state for all the send streams.
1993 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1994 EXPECT_FALSE(voe_.GetSend(channel_num));
1995 }
1996}
1997
1998// Test we can set the correct statistics on all send streams.
1999TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2000 SetupForMultiSendStream();
2001
2002 static const uint32 kSsrcs4[] = {1, 2, 3, 4};
2003 // Create send streams.
2004 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
2005 EXPECT_TRUE(channel_->AddSendStream(
2006 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
2007 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002008 // Create a receive stream to check that none of the send streams end up in
2009 // the receive stream stats.
2010 EXPECT_TRUE(channel_->AddRecvStream(
2011 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002012 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002013 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2014 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002015
2016 cricket::VoiceMediaInfo info;
2017 EXPECT_EQ(true, channel_->GetStats(&info));
2018 EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size());
2019
2020 // Verify the statistic information is correct.
2021 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +00002022 EXPECT_EQ(kSsrcs4[i], info.senders[i].ssrc());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002023 EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
2024 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].bytes_sent);
2025 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_sent);
2026 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_lost);
2027 EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[i].fraction_lost);
2028 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].ext_seqnum);
2029 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].rtt_ms);
2030 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].jitter_ms);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002031 EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002032 }
2033
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002034 EXPECT_EQ(0u, info.receivers.size());
2035 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2036 EXPECT_EQ(true, channel_->GetStats(&info));
2037
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002038 EXPECT_EQ(1u, info.receivers.size());
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002039 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd);
2040 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd);
2041 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost);
2042 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum);
2043 EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name);
minyue@webrtc.orgc0bd7be2015-02-18 15:24:13 +00002044 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentExpandRate) /
2045 (1 << 14), info.receivers[0].expand_rate);
2046 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSpeechExpandRate) /
2047 (1 << 14), info.receivers[0].speech_expand_rate);
2048 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSecondaryDecodedRate) /
2049 (1 << 14), info.receivers[0].secondary_decoded_rate);
Henrik Lundin8e6fd462015-06-02 09:24:52 +02002050 EXPECT_EQ(
2051 static_cast<float>(cricket::kNetStats.currentAccelerateRate) / (1 << 14),
2052 info.receivers[0].accelerate_rate);
2053 EXPECT_EQ(
2054 static_cast<float>(cricket::kNetStats.currentPreemptiveRate) / (1 << 14),
2055 info.receivers[0].preemptive_expand_rate);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002056}
2057
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002058// Test that we can add and remove receive streams, and do proper send/playout.
2059// We can receive on multiple streams while sending one stream.
2060TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002061 EXPECT_TRUE(SetupEngine());
2062 int channel_num1 = voe_.GetLastChannel();
2063
2064 // Start playout on the default channel.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002065 send_parameters_.options = options_conference_;
2066 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002067 EXPECT_TRUE(channel_->SetPlayout(true));
2068 EXPECT_TRUE(voe_.GetPlayout(channel_num1));
2069
2070 // Adding another stream should disable playout on the default channel.
2071 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2072 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002073 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2074 EXPECT_TRUE(voe_.GetSend(channel_num1));
2075 EXPECT_FALSE(voe_.GetSend(channel_num2));
2076
2077 // Make sure only the new channel is played out.
2078 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2079 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2080
2081 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2082 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2083 int channel_num3 = voe_.GetLastChannel();
2084 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2085 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2086 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2087 EXPECT_FALSE(voe_.GetSend(channel_num3));
2088
2089 // Stop sending.
2090 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2091 EXPECT_FALSE(voe_.GetSend(channel_num1));
2092 EXPECT_FALSE(voe_.GetSend(channel_num2));
2093 EXPECT_FALSE(voe_.GetSend(channel_num3));
2094
2095 // Stop playout.
2096 EXPECT_TRUE(channel_->SetPlayout(false));
2097 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2098 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2099 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2100
2101 // Restart playout and make sure the default channel still is not played out.
2102 EXPECT_TRUE(channel_->SetPlayout(true));
2103 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2104 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2105 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2106
2107 // Now remove the new streams and verify that the default channel is
2108 // played out again.
2109 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2110 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2111
2112 EXPECT_TRUE(voe_.GetPlayout(channel_num1));
2113}
2114
2115// Test that we can set the devices to use.
2116TEST_F(WebRtcVoiceEngineTestFake, SetDevices) {
2117 EXPECT_TRUE(SetupEngine());
2118 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002119 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002120
2121 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2122 cricket::kFakeDefaultDeviceId);
2123 cricket::Device dev(cricket::kFakeDeviceName,
2124 cricket::kFakeDeviceId);
2125
2126 // Test SetDevices() while not sending or playing.
2127 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2128
2129 // Test SetDevices() while sending and playing.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002130 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2131 EXPECT_TRUE(channel_->SetPlayout(true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002132 EXPECT_TRUE(voe_.GetSend(channel_num));
2133 EXPECT_TRUE(voe_.GetPlayout(channel_num));
2134
2135 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2136
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002137 EXPECT_TRUE(voe_.GetSend(channel_num));
2138 EXPECT_TRUE(voe_.GetPlayout(channel_num));
2139
2140 // Test that failure to open newly selected devices does not prevent opening
2141 // ones after that.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002142 voe_.set_playout_fail_channel(channel_num);
2143 voe_.set_send_fail_channel(channel_num);
2144
2145 EXPECT_FALSE(engine_.SetDevices(&default_dev, &default_dev));
2146
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002147 EXPECT_FALSE(voe_.GetSend(channel_num));
2148 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2149
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002150 voe_.set_playout_fail_channel(-1);
2151 voe_.set_send_fail_channel(-1);
2152
2153 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2154
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002155 EXPECT_TRUE(voe_.GetSend(channel_num));
2156 EXPECT_TRUE(voe_.GetPlayout(channel_num));
2157}
2158
2159// Test that we can set the devices to use even if we failed to
2160// open the initial ones.
2161TEST_F(WebRtcVoiceEngineTestFake, SetDevicesWithInitiallyBadDevices) {
2162 EXPECT_TRUE(SetupEngine());
2163 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002164 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002165
2166 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2167 cricket::kFakeDefaultDeviceId);
2168 cricket::Device dev(cricket::kFakeDeviceName,
2169 cricket::kFakeDeviceId);
2170
2171 // Test that failure to open devices selected before starting
2172 // send/play does not prevent opening newly selected ones after that.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002173 voe_.set_playout_fail_channel(channel_num);
2174 voe_.set_send_fail_channel(channel_num);
2175
2176 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2177
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002178 EXPECT_FALSE(channel_->SetSend(cricket::SEND_MICROPHONE));
2179 EXPECT_FALSE(channel_->SetPlayout(true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002180 EXPECT_FALSE(voe_.GetSend(channel_num));
2181 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2182
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002183 voe_.set_playout_fail_channel(-1);
2184 voe_.set_send_fail_channel(-1);
2185
2186 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2187
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002188 EXPECT_TRUE(voe_.GetSend(channel_num));
2189 EXPECT_TRUE(voe_.GetPlayout(channel_num));
2190}
2191
2192// Test that we can create a channel configured for multi-point conferences,
2193// and start sending/playing out on it.
2194TEST_F(WebRtcVoiceEngineTestFake, ConferenceSendAndPlayout) {
2195 EXPECT_TRUE(SetupEngine());
2196 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002197 send_parameters_.options = options_conference_;
2198 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002199 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2200 EXPECT_TRUE(voe_.GetSend(channel_num));
2201}
2202
2203// Test that we can create a channel configured for Codian bridges,
2204// and start sending/playing out on it.
2205TEST_F(WebRtcVoiceEngineTestFake, CodianSendAndPlayout) {
2206 EXPECT_TRUE(SetupEngine());
2207 int channel_num = voe_.GetLastChannel();
2208 webrtc::AgcConfig agc_config;
2209 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2210 EXPECT_EQ(0, agc_config.targetLeveldBOv);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002211 send_parameters_.options = options_adjust_agc_;
2212 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002213 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2214 EXPECT_TRUE(voe_.GetSend(channel_num));
2215 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2216 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
2217 EXPECT_TRUE(channel_->SetPlayout(true));
2218 EXPECT_TRUE(voe_.GetPlayout(channel_num));
2219 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2220 EXPECT_FALSE(voe_.GetSend(channel_num));
2221 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2222 EXPECT_EQ(0, agc_config.targetLeveldBOv); // level was restored
2223 EXPECT_TRUE(channel_->SetPlayout(false));
2224 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2225}
2226
wu@webrtc.org97077a32013-10-25 21:18:33 +00002227TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
2228 EXPECT_TRUE(SetupEngine());
2229 webrtc::AgcConfig agc_config;
2230 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2231 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2232
2233 cricket::AudioOptions options;
2234 options.tx_agc_target_dbov.Set(3);
2235 options.tx_agc_digital_compression_gain.Set(9);
2236 options.tx_agc_limiter.Set(true);
2237 options.auto_gain_control.Set(true);
2238 EXPECT_TRUE(engine_.SetOptions(options));
2239
2240 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2241 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2242 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2243 EXPECT_TRUE(agc_config.limiterEnable);
2244
2245 // Check interaction with adjust_agc_delta. Both should be respected, for
2246 // backwards compatibility.
2247 options.adjust_agc_delta.Set(-10);
2248 EXPECT_TRUE(engine_.SetOptions(options));
2249
2250 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2251 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2252}
2253
2254TEST_F(WebRtcVoiceEngineTestFake, RxAgcConfigViaOptions) {
2255 EXPECT_TRUE(SetupEngine());
2256 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002257 send_parameters_.options.rx_agc_target_dbov.Set(6);
2258 send_parameters_.options.rx_agc_digital_compression_gain.Set(0);
2259 send_parameters_.options.rx_agc_limiter.Set(true);
2260 send_parameters_.options.rx_auto_gain_control.Set(true);
2261 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002262
2263 webrtc::AgcConfig agc_config;
2264 EXPECT_EQ(0, engine_.voe()->processing()->GetRxAgcConfig(
2265 channel_num, agc_config));
2266 EXPECT_EQ(6, agc_config.targetLeveldBOv);
2267 EXPECT_EQ(0, agc_config.digitalCompressionGaindB);
2268 EXPECT_TRUE(agc_config.limiterEnable);
2269}
2270
2271TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
2272 EXPECT_TRUE(SetupEngine());
2273 cricket::AudioOptions options;
2274 options.recording_sample_rate.Set(48000u);
2275 options.playout_sample_rate.Set(44100u);
2276 EXPECT_TRUE(engine_.SetOptions(options));
2277
2278 unsigned int recording_sample_rate, playout_sample_rate;
2279 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2280 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2281 EXPECT_EQ(48000u, recording_sample_rate);
2282 EXPECT_EQ(44100u, playout_sample_rate);
2283}
2284
2285TEST_F(WebRtcVoiceEngineTestFake, TraceFilterViaTraceOptions) {
2286 EXPECT_TRUE(SetupEngine());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002287 engine_.SetLogging(rtc::LS_INFO, "");
wu@webrtc.org97077a32013-10-25 21:18:33 +00002288 EXPECT_EQ(
2289 // Info:
2290 webrtc::kTraceStateInfo | webrtc::kTraceInfo |
2291 // Warning:
2292 webrtc::kTraceTerseInfo | webrtc::kTraceWarning |
2293 // Error:
2294 webrtc::kTraceError | webrtc::kTraceCritical,
2295 static_cast<int>(trace_wrapper_->filter_));
2296 // Now set it explicitly
2297 std::string filter =
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002298 "tracefilter " + rtc::ToString(webrtc::kTraceDefault);
2299 engine_.SetLogging(rtc::LS_VERBOSE, filter.c_str());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002300 EXPECT_EQ(static_cast<unsigned int>(webrtc::kTraceDefault),
2301 trace_wrapper_->filter_);
2302}
2303
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002304// Test that we can set the outgoing SSRC properly.
2305// SSRC is set in SetupEngine by calling AddSendStream.
2306TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
2307 EXPECT_TRUE(SetupEngine());
2308 int channel_num = voe_.GetLastChannel();
2309 unsigned int send_ssrc;
2310 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
2311 EXPECT_NE(0U, send_ssrc);
2312 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
2313 EXPECT_EQ(kSsrc1, send_ssrc);
2314}
2315
2316TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2317 // Setup. We need send codec to be set to get all stats.
2318 EXPECT_TRUE(SetupEngine());
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002319 // SetupEngine adds a send stream with kSsrc1, so the receive stream has to
2320 // use a different SSRC.
2321 EXPECT_TRUE(channel_->AddRecvStream(
2322 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002323 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2324 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002325
2326 cricket::VoiceMediaInfo info;
2327 EXPECT_EQ(true, channel_->GetStats(&info));
2328 EXPECT_EQ(1u, info.senders.size());
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +00002329 EXPECT_EQ(kSsrc1, info.senders[0].ssrc());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002330 EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
2331 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].bytes_sent);
2332 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_sent);
2333 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_lost);
2334 EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[0].fraction_lost);
2335 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].ext_seqnum);
2336 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].rtt_ms);
2337 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].jitter_ms);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002338 EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002339 // TODO(sriniv): Add testing for more fields. These are not populated
2340 // in FakeWebrtcVoiceEngine yet.
2341 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].audio_level);
2342 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_median_ms);
2343 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_std_ms);
2344 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_return_loss);
2345 // EXPECT_EQ(cricket::kIntStatValue,
2346 // info.senders[0].echo_return_loss_enhancement);
2347
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002348 EXPECT_EQ(0u, info.receivers.size());
2349 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2350 EXPECT_EQ(true, channel_->GetStats(&info));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002351 EXPECT_EQ(1u, info.receivers.size());
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002352
2353 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd);
2354 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd);
2355 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost);
2356 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum);
2357 EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name);
minyue@webrtc.orgc0bd7be2015-02-18 15:24:13 +00002358 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentExpandRate) /
2359 (1 << 14), info.receivers[0].expand_rate);
2360 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSpeechExpandRate) /
2361 (1 << 14), info.receivers[0].speech_expand_rate);
2362 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSecondaryDecodedRate) /
2363 (1 << 14), info.receivers[0].secondary_decoded_rate);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002364 // TODO(sriniv): Add testing for more receiver fields.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002365}
2366
2367// Test that we can set the outgoing SSRC properly with multiple streams.
2368// SSRC is set in SetupEngine by calling AddSendStream.
2369TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
2370 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002371 int channel_num1 = voe_.GetLastChannel();
2372 unsigned int send_ssrc;
2373 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num1, send_ssrc));
2374 EXPECT_EQ(kSsrc1, send_ssrc);
2375
2376 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2377 int channel_num2 = voe_.GetLastChannel();
2378 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num2, send_ssrc));
2379 EXPECT_EQ(kSsrc1, send_ssrc);
2380}
2381
2382// Test that the local SSRC is the same on sending and receiving channels if the
2383// receive channel is created before the send channel.
2384TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002385 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002386 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002387
2388 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2389 int receive_channel_num = voe_.GetLastChannel();
2390 EXPECT_TRUE(channel_->AddSendStream(
2391 cricket::StreamParams::CreateLegacy(1234)));
2392 int send_channel_num = voe_.GetLastChannel();
2393
2394 unsigned int ssrc = 0;
2395 EXPECT_EQ(0, voe_.GetLocalSSRC(send_channel_num, ssrc));
2396 EXPECT_EQ(1234U, ssrc);
2397 ssrc = 0;
2398 EXPECT_EQ(0, voe_.GetLocalSSRC(receive_channel_num, ssrc));
2399 EXPECT_EQ(1234U, ssrc);
2400}
2401
2402// Test that we can properly receive packets.
2403TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2404 EXPECT_TRUE(SetupEngine());
2405 int channel_num = voe_.GetLastChannel();
2406 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2407 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame,
2408 sizeof(kPcmuFrame)));
2409}
2410
2411// Test that we can properly receive packets on multiple streams.
2412TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
2413 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002414 send_parameters_.options = options_conference_;
2415 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002416 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2417 int channel_num1 = voe_.GetLastChannel();
2418 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2419 int channel_num2 = voe_.GetLastChannel();
2420 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2421 int channel_num3 = voe_.GetLastChannel();
2422 // Create packets with the right SSRCs.
2423 char packets[4][sizeof(kPcmuFrame)];
2424 for (size_t i = 0; i < ARRAY_SIZE(packets); ++i) {
2425 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002426 rtc::SetBE32(packets[i] + 8, static_cast<uint32>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002427 }
2428 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2429 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2430 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2431 DeliverPacket(packets[0], sizeof(packets[0]));
2432 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2433 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2434 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2435 DeliverPacket(packets[1], sizeof(packets[1]));
2436 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1],
2437 sizeof(packets[1])));
2438 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2439 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2440 DeliverPacket(packets[2], sizeof(packets[2]));
2441 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2442 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2],
2443 sizeof(packets[2])));
2444 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2445 DeliverPacket(packets[3], sizeof(packets[3]));
2446 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2447 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2448 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3],
2449 sizeof(packets[3])));
2450 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2451 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2452 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2453}
2454
2455// Test that we properly handle failures to add a stream.
2456TEST_F(WebRtcVoiceEngineTestFake, AddStreamFail) {
2457 EXPECT_TRUE(SetupEngine());
2458 voe_.set_fail_create_channel(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002459 send_parameters_.options = options_conference_;
2460 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002461 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2462
2463 // In 1:1 call, we should not try to create a new channel.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002464 send_parameters_.options.conference_mode.Set(false);
2465 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002466 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2467}
2468
2469// Test that AddRecvStream doesn't create new channel for 1:1 call.
2470TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream1On1) {
2471 EXPECT_TRUE(SetupEngine());
2472 int channel_num = voe_.GetLastChannel();
2473 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2474 EXPECT_EQ(channel_num, voe_.GetLastChannel());
2475}
2476
2477// Test that after adding a recv stream, we do not decode more codecs than
2478// those previously passed into SetRecvCodecs.
2479TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
2480 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002481 cricket::AudioRecvParameters parameters;
2482 parameters.codecs.push_back(kIsacCodec);
2483 parameters.codecs.push_back(kPcmuCodec);
2484 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002485 EXPECT_TRUE(channel_->AddRecvStream(
2486 cricket::StreamParams::CreateLegacy(kSsrc1)));
2487 int channel_num2 = voe_.GetLastChannel();
2488 webrtc::CodecInst gcodec;
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002489 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "opus");
2490 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002491 gcodec.channels = 2;
2492 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2493}
2494
2495// Test that we properly clean up any streams that were added, even if
2496// not explicitly removed.
2497TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
2498 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002499 send_parameters_.options = options_conference_;
2500 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002501 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2502 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2503 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2504 delete channel_;
2505 channel_ = NULL;
2506 EXPECT_EQ(0, voe_.GetNumChannels());
2507}
2508
wu@webrtc.org78187522013-10-07 23:32:02 +00002509TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
2510 EXPECT_TRUE(SetupEngine());
2511 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2512}
2513
2514TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2515 EXPECT_TRUE(SetupEngine());
2516 // Stream 1 reuses default channel.
2517 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2518 // Manually delete default channel to simulate a failure.
2519 int default_channel = voe_.GetLastChannel();
2520 EXPECT_EQ(0, voe_.DeleteChannel(default_channel));
2521 // Add recv stream 2 should fail because default channel is gone.
2522 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2523 int new_channel = voe_.GetLastChannel();
2524 EXPECT_NE(default_channel, new_channel);
2525 // The last created channel should have already been deleted.
2526 EXPECT_EQ(-1, voe_.DeleteChannel(new_channel));
2527}
2528
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002529// Test the InsertDtmf on default send stream as caller.
2530TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2531 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002532}
2533
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002534// Test the InsertDtmf on default send stream as callee
2535TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2536 TestInsertDtmf(0, false);
2537}
2538
2539// Test the InsertDtmf on specified send stream as caller.
2540TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2541 TestInsertDtmf(kSsrc1, true);
2542}
2543
2544// Test the InsertDtmf on specified send stream as callee.
2545TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2546 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002547}
2548
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002549TEST_F(WebRtcVoiceEngineTestFake, MediaEngineCallbackOnError) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002550 rtc::scoped_ptr<ChannelErrorListener> listener;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002551 cricket::WebRtcVoiceMediaChannel* media_channel;
2552 unsigned int ssrc = 0;
2553
2554 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002555 send_parameters_.options = options_conference_;
2556 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002557 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2558
2559 media_channel = static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2560 listener.reset(new ChannelErrorListener(channel_));
2561
2562 // Test on WebRtc VoE channel.
2563 voe_.TriggerCallbackOnError(media_channel->voe_channel(),
2564 VE_SATURATION_WARNING);
2565 EXPECT_EQ(cricket::VoiceMediaChannel::ERROR_REC_DEVICE_SATURATION,
2566 listener->error());
2567 EXPECT_NE(-1, voe_.GetLocalSSRC(voe_.GetLastChannel(), ssrc));
2568 EXPECT_EQ(ssrc, listener->ssrc());
2569
2570 listener->Reset();
2571 voe_.TriggerCallbackOnError(-1, VE_TYPING_NOISE_WARNING);
2572 EXPECT_EQ(cricket::VoiceMediaChannel::ERROR_REC_TYPING_NOISE_DETECTED,
2573 listener->error());
2574 EXPECT_EQ(0U, listener->ssrc());
2575
2576 // Add another stream and test on that.
2577 ++ssrc;
2578 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(
2579 ssrc)));
2580 listener->Reset();
2581 voe_.TriggerCallbackOnError(voe_.GetLastChannel(),
2582 VE_SATURATION_WARNING);
2583 EXPECT_EQ(cricket::VoiceMediaChannel::ERROR_REC_DEVICE_SATURATION,
2584 listener->error());
2585 EXPECT_EQ(ssrc, listener->ssrc());
2586
2587 // Testing a non-existing channel.
2588 listener->Reset();
2589 voe_.TriggerCallbackOnError(voe_.GetLastChannel() + 2,
2590 VE_SATURATION_WARNING);
2591 EXPECT_EQ(0, listener->error());
2592}
2593
2594TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
2595 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002596 send_parameters_.options = options_conference_;
2597 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002598 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2599 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2600 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2601 EXPECT_TRUE(channel_->SetPlayout(true));
2602 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2603 EXPECT_TRUE(channel_->SetPlayout(false));
2604 EXPECT_FALSE(channel_->SetPlayout(true));
2605}
2606
2607// Test that the Registering/Unregistering with the
2608// webrtcvoiceengine works as expected
2609TEST_F(WebRtcVoiceEngineTestFake, RegisterVoiceProcessor) {
2610 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002611 EXPECT_TRUE(channel_->AddRecvStream(
2612 cricket::StreamParams::CreateLegacy(kSsrc2)));
2613 cricket::FakeMediaProcessor vp_1;
2614 cricket::FakeMediaProcessor vp_2;
2615
2616 EXPECT_FALSE(engine_.RegisterProcessor(kSsrc2, &vp_1, cricket::MPD_TX));
2617 EXPECT_TRUE(engine_.RegisterProcessor(kSsrc2, &vp_1, cricket::MPD_RX));
2618 EXPECT_TRUE(engine_.RegisterProcessor(kSsrc2, &vp_2, cricket::MPD_RX));
2619 voe_.TriggerProcessPacket(cricket::MPD_RX);
2620 voe_.TriggerProcessPacket(cricket::MPD_TX);
2621
2622 EXPECT_TRUE(voe_.IsExternalMediaProcessorRegistered());
2623 EXPECT_EQ(1, vp_1.voice_frame_count());
2624 EXPECT_EQ(1, vp_2.voice_frame_count());
2625
2626 EXPECT_TRUE(engine_.UnregisterProcessor(kSsrc2,
2627 &vp_2,
2628 cricket::MPD_RX));
2629 voe_.TriggerProcessPacket(cricket::MPD_RX);
2630 EXPECT_TRUE(voe_.IsExternalMediaProcessorRegistered());
2631 EXPECT_EQ(1, vp_2.voice_frame_count());
2632 EXPECT_EQ(2, vp_1.voice_frame_count());
2633
2634 EXPECT_TRUE(engine_.UnregisterProcessor(kSsrc2,
2635 &vp_1,
2636 cricket::MPD_RX));
2637 voe_.TriggerProcessPacket(cricket::MPD_RX);
2638 EXPECT_FALSE(voe_.IsExternalMediaProcessorRegistered());
2639 EXPECT_EQ(2, vp_1.voice_frame_count());
2640
2641 EXPECT_FALSE(engine_.RegisterProcessor(kSsrc1, &vp_1, cricket::MPD_RX));
2642 EXPECT_TRUE(engine_.RegisterProcessor(kSsrc1, &vp_1, cricket::MPD_TX));
2643 voe_.TriggerProcessPacket(cricket::MPD_RX);
2644 voe_.TriggerProcessPacket(cricket::MPD_TX);
2645 EXPECT_TRUE(voe_.IsExternalMediaProcessorRegistered());
2646 EXPECT_EQ(3, vp_1.voice_frame_count());
2647
2648 EXPECT_TRUE(engine_.UnregisterProcessor(kSsrc1,
2649 &vp_1,
2650 cricket::MPD_RX_AND_TX));
2651 voe_.TriggerProcessPacket(cricket::MPD_TX);
2652 EXPECT_FALSE(voe_.IsExternalMediaProcessorRegistered());
2653 EXPECT_EQ(3, vp_1.voice_frame_count());
2654 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2655 EXPECT_FALSE(engine_.RegisterProcessor(kSsrc2, &vp_1, cricket::MPD_RX));
2656 EXPECT_FALSE(voe_.IsExternalMediaProcessorRegistered());
2657
2658 // Test that we can register a processor on the receive channel on SSRC 0.
2659 // This tests the 1:1 case when the receive SSRC is unknown.
2660 EXPECT_TRUE(engine_.RegisterProcessor(0, &vp_1, cricket::MPD_RX));
2661 voe_.TriggerProcessPacket(cricket::MPD_RX);
2662 EXPECT_TRUE(voe_.IsExternalMediaProcessorRegistered());
2663 EXPECT_EQ(4, vp_1.voice_frame_count());
2664 EXPECT_TRUE(engine_.UnregisterProcessor(0,
2665 &vp_1,
2666 cricket::MPD_RX));
2667
2668 // The following tests test that FindChannelNumFromSsrc is doing
2669 // what we expect.
2670 // pick an invalid ssrc and make sure we can't register
2671 EXPECT_FALSE(engine_.RegisterProcessor(99,
2672 &vp_1,
2673 cricket::MPD_RX));
2674 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2675 EXPECT_TRUE(engine_.RegisterProcessor(1,
2676 &vp_1,
2677 cricket::MPD_RX));
2678 EXPECT_TRUE(engine_.UnregisterProcessor(1,
2679 &vp_1,
2680 cricket::MPD_RX));
2681 EXPECT_FALSE(engine_.RegisterProcessor(1,
2682 &vp_1,
2683 cricket::MPD_TX));
2684 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2685}
2686
2687TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
2688 EXPECT_TRUE(SetupEngine());
2689
2690 bool ec_enabled;
2691 webrtc::EcModes ec_mode;
2692 bool ec_metrics_enabled;
2693 webrtc::AecmModes aecm_mode;
2694 bool cng_enabled;
2695 bool agc_enabled;
2696 webrtc::AgcModes agc_mode;
2697 webrtc::AgcConfig agc_config;
2698 bool ns_enabled;
2699 webrtc::NsModes ns_mode;
2700 bool highpass_filter_enabled;
2701 bool stereo_swapping_enabled;
2702 bool typing_detection_enabled;
2703 voe_.GetEcStatus(ec_enabled, ec_mode);
2704 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2705 voe_.GetAecmMode(aecm_mode, cng_enabled);
2706 voe_.GetAgcStatus(agc_enabled, agc_mode);
2707 voe_.GetAgcConfig(agc_config);
2708 voe_.GetNsStatus(ns_enabled, ns_mode);
2709 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2710 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2711 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2712 EXPECT_TRUE(ec_enabled);
2713 EXPECT_TRUE(ec_metrics_enabled);
2714 EXPECT_FALSE(cng_enabled);
2715 EXPECT_TRUE(agc_enabled);
2716 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2717 EXPECT_TRUE(ns_enabled);
2718 EXPECT_TRUE(highpass_filter_enabled);
2719 EXPECT_FALSE(stereo_swapping_enabled);
2720 EXPECT_TRUE(typing_detection_enabled);
2721 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2722 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2723
2724 // Nothing set, so all ignored.
2725 cricket::AudioOptions options;
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002726 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002727 voe_.GetEcStatus(ec_enabled, ec_mode);
2728 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2729 voe_.GetAecmMode(aecm_mode, cng_enabled);
2730 voe_.GetAgcStatus(agc_enabled, agc_mode);
2731 voe_.GetAgcConfig(agc_config);
2732 voe_.GetNsStatus(ns_enabled, ns_mode);
2733 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2734 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2735 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2736 EXPECT_TRUE(ec_enabled);
2737 EXPECT_TRUE(ec_metrics_enabled);
2738 EXPECT_FALSE(cng_enabled);
2739 EXPECT_TRUE(agc_enabled);
2740 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2741 EXPECT_TRUE(ns_enabled);
2742 EXPECT_TRUE(highpass_filter_enabled);
2743 EXPECT_FALSE(stereo_swapping_enabled);
2744 EXPECT_TRUE(typing_detection_enabled);
2745 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2746 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
Henrik Lundin64dad832015-05-11 12:44:23 +02002747 EXPECT_EQ(50, voe_.GetNetEqCapacity()); // From GetDefaultEngineOptions().
Henrik Lundin5263b3c2015-06-01 10:29:41 +02002748 EXPECT_FALSE(
2749 voe_.GetNetEqFastAccelerate()); // From GetDefaultEngineOptions().
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002750
2751 // Turn echo cancellation off
2752 options.echo_cancellation.Set(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002753 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002754 voe_.GetEcStatus(ec_enabled, ec_mode);
2755 EXPECT_FALSE(ec_enabled);
2756
2757 // Turn echo cancellation back on, with settings, and make sure
2758 // nothing else changed.
2759 options.echo_cancellation.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002760 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002761 voe_.GetEcStatus(ec_enabled, ec_mode);
2762 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2763 voe_.GetAecmMode(aecm_mode, cng_enabled);
2764 voe_.GetAgcStatus(agc_enabled, agc_mode);
2765 voe_.GetAgcConfig(agc_config);
2766 voe_.GetNsStatus(ns_enabled, ns_mode);
2767 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2768 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2769 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2770 EXPECT_TRUE(ec_enabled);
2771 EXPECT_TRUE(ec_metrics_enabled);
2772 EXPECT_TRUE(agc_enabled);
2773 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2774 EXPECT_TRUE(ns_enabled);
2775 EXPECT_TRUE(highpass_filter_enabled);
2776 EXPECT_FALSE(stereo_swapping_enabled);
2777 EXPECT_TRUE(typing_detection_enabled);
2778 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2779 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2780
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002781 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2782 // control.
2783 options.delay_agnostic_aec.Set(true);
2784 ASSERT_TRUE(engine_.SetOptions(options));
2785 voe_.GetEcStatus(ec_enabled, ec_mode);
2786 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2787 voe_.GetAecmMode(aecm_mode, cng_enabled);
2788 EXPECT_TRUE(ec_enabled);
2789 EXPECT_TRUE(ec_metrics_enabled);
2790 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2791
2792 // Turn off echo cancellation and delay agnostic aec.
2793 options.delay_agnostic_aec.Set(false);
Henrik Lundin441f6342015-06-09 16:03:13 +02002794 options.extended_filter_aec.Set(false);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002795 options.echo_cancellation.Set(false);
2796 ASSERT_TRUE(engine_.SetOptions(options));
2797 voe_.GetEcStatus(ec_enabled, ec_mode);
2798 EXPECT_FALSE(ec_enabled);
2799 // Turning delay agnostic aec back on should also turn on echo cancellation.
2800 options.delay_agnostic_aec.Set(true);
2801 ASSERT_TRUE(engine_.SetOptions(options));
2802 voe_.GetEcStatus(ec_enabled, ec_mode);
2803 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2804 EXPECT_TRUE(ec_enabled);
2805 EXPECT_TRUE(ec_metrics_enabled);
2806 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2807
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002808 // Turn off AGC
2809 options.auto_gain_control.Set(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002810 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002811 voe_.GetAgcStatus(agc_enabled, agc_mode);
2812 EXPECT_FALSE(agc_enabled);
2813
2814 // Turn AGC back on
2815 options.auto_gain_control.Set(true);
2816 options.adjust_agc_delta.Clear();
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002817 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002818 voe_.GetAgcStatus(agc_enabled, agc_mode);
2819 EXPECT_TRUE(agc_enabled);
2820 voe_.GetAgcConfig(agc_config);
2821 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2822
2823 // Turn off other options (and stereo swapping on).
2824 options.noise_suppression.Set(false);
2825 options.highpass_filter.Set(false);
2826 options.typing_detection.Set(false);
2827 options.stereo_swapping.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002828 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002829 voe_.GetNsStatus(ns_enabled, ns_mode);
2830 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2831 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2832 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2833 EXPECT_FALSE(ns_enabled);
2834 EXPECT_FALSE(highpass_filter_enabled);
2835 EXPECT_FALSE(typing_detection_enabled);
2836 EXPECT_TRUE(stereo_swapping_enabled);
2837
2838 // Turn on "conference mode" to ensure it has no impact.
2839 options.conference_mode.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002840 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002841 voe_.GetEcStatus(ec_enabled, ec_mode);
2842 voe_.GetNsStatus(ns_enabled, ns_mode);
2843 EXPECT_TRUE(ec_enabled);
2844 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2845 EXPECT_FALSE(ns_enabled);
2846 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2847}
2848
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002849TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002850 EXPECT_TRUE(SetupEngine());
2851
2852 bool ec_enabled;
2853 webrtc::EcModes ec_mode;
2854 bool ec_metrics_enabled;
2855 bool agc_enabled;
2856 webrtc::AgcModes agc_mode;
2857 bool ns_enabled;
2858 webrtc::NsModes ns_mode;
2859 bool highpass_filter_enabled;
2860 bool stereo_swapping_enabled;
2861 bool typing_detection_enabled;
2862
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002863 voe_.GetEcStatus(ec_enabled, ec_mode);
2864 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2865 voe_.GetAgcStatus(agc_enabled, agc_mode);
2866 voe_.GetNsStatus(ns_enabled, ns_mode);
2867 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2868 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2869 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2870 EXPECT_TRUE(ec_enabled);
2871 EXPECT_TRUE(agc_enabled);
2872 EXPECT_TRUE(ns_enabled);
2873 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002874 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002875 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002876}
2877
2878TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2879 webrtc::AgcConfig set_config = {0};
2880 set_config.targetLeveldBOv = 3;
2881 set_config.digitalCompressionGaindB = 9;
2882 set_config.limiterEnable = true;
2883 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002884 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002885
2886 webrtc::AgcConfig config = {0};
2887 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2888 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2889 EXPECT_EQ(set_config.digitalCompressionGaindB,
2890 config.digitalCompressionGaindB);
2891 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2892}
2893
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002894TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
2895 EXPECT_TRUE(SetupEngine());
solenberg66f43392015-09-09 01:36:22 -07002896 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2897 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002898 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002899 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2900 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002901 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002902
2903 // Have to add a stream to make SetSend work.
2904 cricket::StreamParams stream1;
2905 stream1.ssrcs.push_back(1);
2906 channel1->AddSendStream(stream1);
2907 cricket::StreamParams stream2;
2908 stream2.ssrcs.push_back(2);
2909 channel2->AddSendStream(stream2);
2910
2911 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002912 cricket::AudioSendParameters parameters_options_all = send_parameters_;
2913 parameters_options_all.options.echo_cancellation.Set(true);
2914 parameters_options_all.options.auto_gain_control.Set(true);
2915 parameters_options_all.options.noise_suppression.Set(true);
2916 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2917 EXPECT_EQ(parameters_options_all.options, channel1->options());
2918 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2919 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002920
2921 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002922 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
2923 parameters_options_no_ns.options.noise_suppression.Set(false);
2924 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2925 cricket::AudioOptions expected_options = parameters_options_all.options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002926 expected_options.echo_cancellation.Set(true);
2927 expected_options.auto_gain_control.Set(true);
2928 expected_options.noise_suppression.Set(false);
solenberg66f43392015-09-09 01:36:22 -07002929 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002930
2931 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002932 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
2933 parameters_options_no_agc.options.auto_gain_control.Set(false);
2934 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002935 expected_options.echo_cancellation.Set(true);
2936 expected_options.auto_gain_control.Set(false);
2937 expected_options.noise_suppression.Set(true);
solenberg66f43392015-09-09 01:36:22 -07002938 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002939
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002940 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002941 bool ec_enabled;
2942 webrtc::EcModes ec_mode;
2943 bool agc_enabled;
2944 webrtc::AgcModes agc_mode;
2945 bool ns_enabled;
2946 webrtc::NsModes ns_mode;
2947 voe_.GetEcStatus(ec_enabled, ec_mode);
2948 voe_.GetAgcStatus(agc_enabled, agc_mode);
2949 voe_.GetNsStatus(ns_enabled, ns_mode);
2950 EXPECT_TRUE(ec_enabled);
2951 EXPECT_TRUE(agc_enabled);
2952 EXPECT_TRUE(ns_enabled);
2953
2954 channel1->SetSend(cricket::SEND_MICROPHONE);
2955 voe_.GetEcStatus(ec_enabled, ec_mode);
2956 voe_.GetAgcStatus(agc_enabled, agc_mode);
2957 voe_.GetNsStatus(ns_enabled, ns_mode);
2958 EXPECT_TRUE(ec_enabled);
2959 EXPECT_TRUE(agc_enabled);
2960 EXPECT_FALSE(ns_enabled);
2961
2962 channel1->SetSend(cricket::SEND_NOTHING);
2963 voe_.GetEcStatus(ec_enabled, ec_mode);
2964 voe_.GetAgcStatus(agc_enabled, agc_mode);
2965 voe_.GetNsStatus(ns_enabled, ns_mode);
2966 EXPECT_TRUE(ec_enabled);
2967 EXPECT_TRUE(agc_enabled);
2968 EXPECT_TRUE(ns_enabled);
2969
2970 channel2->SetSend(cricket::SEND_MICROPHONE);
2971 voe_.GetEcStatus(ec_enabled, ec_mode);
2972 voe_.GetAgcStatus(agc_enabled, agc_mode);
2973 voe_.GetNsStatus(ns_enabled, ns_mode);
2974 EXPECT_TRUE(ec_enabled);
2975 EXPECT_FALSE(agc_enabled);
2976 EXPECT_TRUE(ns_enabled);
2977
2978 channel2->SetSend(cricket::SEND_NOTHING);
2979 voe_.GetEcStatus(ec_enabled, ec_mode);
2980 voe_.GetAgcStatus(agc_enabled, agc_mode);
2981 voe_.GetNsStatus(ns_enabled, ns_mode);
2982 EXPECT_TRUE(ec_enabled);
2983 EXPECT_TRUE(agc_enabled);
2984 EXPECT_TRUE(ns_enabled);
2985
2986 // Make sure settings take effect while we are sending.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002987 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
2988 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2989 send_parameters_;
2990 parameters_options_no_agc_nor_ns.options.auto_gain_control.Set(false);
2991 parameters_options_no_agc_nor_ns.options.noise_suppression.Set(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002992 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002993 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002994 expected_options.echo_cancellation.Set(true);
2995 expected_options.auto_gain_control.Set(false);
2996 expected_options.noise_suppression.Set(false);
solenberg66f43392015-09-09 01:36:22 -07002997 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002998 voe_.GetEcStatus(ec_enabled, ec_mode);
2999 voe_.GetAgcStatus(agc_enabled, agc_mode);
3000 voe_.GetNsStatus(ns_enabled, ns_mode);
3001 EXPECT_TRUE(ec_enabled);
3002 EXPECT_FALSE(agc_enabled);
3003 EXPECT_FALSE(ns_enabled);
3004}
3005
wu@webrtc.orgde305012013-10-31 15:40:38 +00003006// This test verifies DSCP settings are properly applied on voice media channel.
3007TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
3008 EXPECT_TRUE(SetupEngine());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00003009 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003010 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00003011 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00003012 new cricket::FakeNetworkInterface);
3013 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003014 cricket::AudioSendParameters parameters = send_parameters_;
3015 parameters.options.dscp.Set(true);
3016 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00003017 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00003018 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003019 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00003020 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003021 parameters.options.dscp.Set(false);
3022 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00003023 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00003024}
3025
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003026// Test that GetReceiveChannelNum returns the default channel for the first
3027// recv stream in 1-1 calls.
3028TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelNumIn1To1Calls) {
3029 EXPECT_TRUE(SetupEngine());
3030 cricket::WebRtcVoiceMediaChannel* media_channel =
3031 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3032 // Test that GetChannelNum returns the default channel if the SSRC is unknown.
3033 EXPECT_EQ(media_channel->voe_channel(),
3034 media_channel->GetReceiveChannelNum(0));
3035 cricket::StreamParams stream;
3036 stream.ssrcs.push_back(kSsrc2);
3037 EXPECT_TRUE(channel_->AddRecvStream(stream));
3038 EXPECT_EQ(media_channel->voe_channel(),
3039 media_channel->GetReceiveChannelNum(kSsrc2));
3040}
3041
3042// Test that GetReceiveChannelNum doesn't return the default channel for the
3043// first recv stream in conference calls.
3044TEST_F(WebRtcVoiceEngineTestFake, TestGetChannelNumInConferenceCalls) {
3045 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003046 send_parameters_.options = options_conference_;
3047 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003048 cricket::StreamParams stream;
3049 stream.ssrcs.push_back(kSsrc2);
3050 EXPECT_TRUE(channel_->AddRecvStream(stream));
3051 cricket::WebRtcVoiceMediaChannel* media_channel =
3052 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3053 EXPECT_LT(media_channel->voe_channel(),
3054 media_channel->GetReceiveChannelNum(kSsrc2));
3055}
3056
3057TEST_F(WebRtcVoiceEngineTestFake, SetOutputScaling) {
3058 EXPECT_TRUE(SetupEngine());
solenbergbb741b32015-09-07 03:56:38 -07003059 float scale, left, right;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003060 EXPECT_TRUE(channel_->SetOutputScaling(0, 1, 2));
solenbergbb741b32015-09-07 03:56:38 -07003061 int channel_id = voe_.GetLastChannel();
3062 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3063 EXPECT_EQ(0, voe_.GetOutputVolumePan(channel_id, left, right));
3064 EXPECT_DOUBLE_EQ(1, left * scale);
3065 EXPECT_DOUBLE_EQ(2, right * scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003066
3067 EXPECT_FALSE(channel_->SetOutputScaling(kSsrc2, 1, 2));
3068 cricket::StreamParams stream;
3069 stream.ssrcs.push_back(kSsrc2);
3070 EXPECT_TRUE(channel_->AddRecvStream(stream));
3071
3072 EXPECT_TRUE(channel_->SetOutputScaling(kSsrc2, 2, 1));
solenbergbb741b32015-09-07 03:56:38 -07003073 channel_id = voe_.GetLastChannel();
3074 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3075 EXPECT_EQ(0, voe_.GetOutputVolumePan(channel_id, left, right));
3076 EXPECT_DOUBLE_EQ(2, left * scale);
3077 EXPECT_DOUBLE_EQ(1, right * scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003078}
3079
pbos8fc7fa72015-07-15 08:02:58 -07003080TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
pbos8fc7fa72015-07-15 08:02:58 -07003081 const uint32 kAudioSsrc = 123;
3082 const std::string kSyncLabel = "AvSyncLabel";
3083
3084 EXPECT_TRUE(SetupEngine());
pbos8fc7fa72015-07-15 08:02:58 -07003085 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3086 sp.sync_label = kSyncLabel;
3087 // Creating two channels to make sure that sync label is set properly for both
3088 // the default voice channel and following ones.
3089 EXPECT_TRUE(channel_->AddRecvStream(sp));
3090 sp.ssrcs[0] += 1;
3091 EXPECT_TRUE(channel_->AddRecvStream(sp));
3092
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003093 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003094 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003095 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003096 << "SyncGroup should be set based on sync_label";
3097 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003098 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003099 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003100}
3101
pbos6bb1b6e2015-07-24 07:10:18 -07003102TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003103 // Test that changing the combined_audio_video_bwe option results in the
3104 // expected state changes on an associated Call.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003105 std::vector<uint32> ssrcs;
3106 ssrcs.push_back(223);
3107 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003108
3109 EXPECT_TRUE(SetupEngine());
3110 cricket::WebRtcVoiceMediaChannel* media_channel =
3111 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003112 for (uint32 ssrc : ssrcs) {
3113 EXPECT_TRUE(media_channel->AddRecvStream(
3114 cricket::StreamParams::CreateLegacy(ssrc)));
3115 }
3116 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003117
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003118 // Combined BWE should be disabled.
3119 for (uint32 ssrc : ssrcs) {
3120 const auto* s = call_.GetAudioReceiveStream(ssrc);
3121 EXPECT_NE(nullptr, s);
3122 EXPECT_EQ(false, s->GetConfig().combined_audio_video_bwe);
3123 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003124
3125 // Enable combined BWE option - now it should be set up.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003126 send_parameters_.options.combined_audio_video_bwe.Set(true);
3127 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003128 for (uint32 ssrc : ssrcs) {
3129 const auto* s = call_.GetAudioReceiveStream(ssrc);
3130 EXPECT_NE(nullptr, s);
3131 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
3132 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003133
3134 // Disable combined BWE option - should be disabled again.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003135 send_parameters_.options.combined_audio_video_bwe.Set(false);
3136 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003137 for (uint32 ssrc : ssrcs) {
3138 const auto* s = call_.GetAudioReceiveStream(ssrc);
3139 EXPECT_NE(nullptr, s);
3140 EXPECT_EQ(false, s->GetConfig().combined_audio_video_bwe);
3141 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003142
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003143 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003144}
3145
pbos6bb1b6e2015-07-24 07:10:18 -07003146TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003147 // Test that adding receive streams after enabling combined bandwidth
3148 // estimation will correctly configure each channel.
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003149 EXPECT_TRUE(SetupEngine());
3150 cricket::WebRtcVoiceMediaChannel* media_channel =
3151 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003152 send_parameters_.options.combined_audio_video_bwe.Set(true);
3153 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003154
3155 static const uint32 kSsrcs[] = {1, 2, 3, 4};
3156 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs); ++i) {
3157 EXPECT_TRUE(media_channel->AddRecvStream(
3158 cricket::StreamParams::CreateLegacy(kSsrcs[i])));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003159 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(kSsrcs[i]));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003160 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003161 EXPECT_EQ(ARRAY_SIZE(kSsrcs), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003162}
3163
pbos6bb1b6e2015-07-24 07:10:18 -07003164TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003165 // Test that setting the header extensions results in the expected state
3166 // changes on an associated Call.
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003167 std::vector<uint32> ssrcs;
3168 ssrcs.push_back(223);
3169 ssrcs.push_back(224);
3170
3171 EXPECT_TRUE(SetupEngine());
3172 cricket::WebRtcVoiceMediaChannel* media_channel =
3173 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003174 send_parameters_.options.combined_audio_video_bwe.Set(true);
3175 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003176 for (uint32 ssrc : ssrcs) {
3177 EXPECT_TRUE(media_channel->AddRecvStream(
3178 cricket::StreamParams::CreateLegacy(ssrc)));
3179 }
3180
3181 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003182 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003183 for (uint32 ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003184 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003185 EXPECT_NE(nullptr, s);
3186 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3187 }
3188
3189 // Set up receive extensions.
3190 const auto& e_exts = engine_.rtp_header_extensions();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003191 cricket::AudioRecvParameters recv_parameters;
3192 recv_parameters.extensions = e_exts;
3193 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003194 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003195 for (uint32 ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003196 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003197 EXPECT_NE(nullptr, s);
3198 const auto& s_exts = s->GetConfig().rtp.extensions;
3199 EXPECT_EQ(e_exts.size(), s_exts.size());
3200 for (const auto& e_ext : e_exts) {
3201 for (const auto& s_ext : s_exts) {
3202 if (e_ext.id == s_ext.id) {
3203 EXPECT_EQ(e_ext.uri, s_ext.name);
3204 }
3205 }
3206 }
3207 }
3208
3209 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003210 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003211 for (uint32 ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003212 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003213 EXPECT_NE(nullptr, s);
3214 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3215 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003216}
3217
3218TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3219 // Test that packets are forwarded to the Call when configured accordingly.
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003220 const uint32 kAudioSsrc = 1;
3221 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3222 static const unsigned char kRtcp[] = {
3223 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3224 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3227 };
3228 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3229
3230 EXPECT_TRUE(SetupEngine());
3231 cricket::WebRtcVoiceMediaChannel* media_channel =
3232 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003233 send_parameters_.options.combined_audio_video_bwe.Set(true);
3234 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003235 EXPECT_TRUE(media_channel->AddRecvStream(
3236 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3237
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003238 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003239 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003240 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003241 EXPECT_EQ(0, s->received_packets());
3242 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3243 EXPECT_EQ(1, s->received_packets());
3244 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3245 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003246}
Minyue2013aec2015-05-13 14:14:42 +02003247
3248// Associate channel should not set on 1:1 call, since the receive channel also
3249// sends RTCP SR.
3250TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelUnset1On1) {
3251 EXPECT_TRUE(SetupEngine());
3252 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3253 int recv_ch = voe_.GetLastChannel();
3254 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3255}
3256
3257// This test is an extension of AssociateChannelUnset1On1. We create two receive
3258// channels. The second should be associated with the default channel, since it
3259// does not send RTCP SR.
3260TEST_F(WebRtcVoiceEngineTestFake, AssociateDefaultChannelOnSecondRecvChannel) {
3261 EXPECT_TRUE(SetupEngine());
3262 cricket::WebRtcVoiceMediaChannel* media_channel =
3263 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3264 int default_channel = media_channel->voe_channel();
3265 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3266 int recv_ch_1 = voe_.GetLastChannel();
3267 EXPECT_EQ(recv_ch_1, default_channel);
3268 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
3269 int recv_ch_2 = voe_.GetLastChannel();
3270 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_1), -1);
3271 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_2), default_channel);
3272 // Add send stream, the association remains.
3273 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(3)));
3274 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_1), -1);
3275 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_2), default_channel);
3276}
3277
3278// In conference mode, all receive channels should be associated with the
3279// default channel, since they do not send RTCP SR.
3280TEST_F(WebRtcVoiceEngineTestFake, AssociateDefaultChannelOnConference) {
3281 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003282 send_parameters_.options = options_conference_;
3283 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003284 cricket::WebRtcVoiceMediaChannel* media_channel =
3285 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3286 int default_channel = media_channel->voe_channel();
3287 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3288 int recv_ch = voe_.GetLastChannel();
3289 EXPECT_NE(recv_ch, default_channel);
3290 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3291 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3292 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3293}
3294
3295TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
3296 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003297 send_parameters_.options = options_conference_;
3298 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003299
3300 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3301 int recv_ch = voe_.GetLastChannel();
3302
3303 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3304 int send_ch = voe_.GetLastChannel();
3305
3306 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3307 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3308 // channel of |recv_ch|.This is not a common case, since, normally, only the
3309 // default channel can be associated. However, the default is not deletable.
3310 // So we force the |recv_ch| to associate with a non-default channel.
3311 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3312 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3313
3314 EXPECT_TRUE(channel_->RemoveSendStream(2));
3315 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3316}
stefan658910c2015-09-03 05:48:32 -07003317
3318// Tests for the actual WebRtc VoE library.
3319
3320TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
3321 cricket::WebRtcVoiceEngine engine;
3322 cricket::AudioOptions options = engine.GetOptions();
3323 // The default options should have at least a few things set. We purposefully
3324 // don't check the option values here, though.
3325 EXPECT_TRUE(options.echo_cancellation.IsSet());
3326 EXPECT_TRUE(options.auto_gain_control.IsSet());
3327 EXPECT_TRUE(options.noise_suppression.IsSet());
3328}
3329
3330// Tests that the library initializes and shuts down properly.
3331TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3332 cricket::WebRtcVoiceEngine engine;
3333 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003334 rtc::scoped_ptr<webrtc::Call> call(
3335 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003336 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003337 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003338 EXPECT_TRUE(channel != nullptr);
3339 delete channel;
3340 engine.Terminate();
3341
3342 // Reinit to catch regression where VoiceEngineObserver reference is lost
3343 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3344 engine.Terminate();
3345}
3346
3347// Tests that the library is configured with the codecs we want.
3348TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
3349 cricket::WebRtcVoiceEngine engine;
3350 // Check codecs by name.
3351 EXPECT_TRUE(engine.FindCodec(
3352 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0)));
3353 EXPECT_TRUE(engine.FindCodec(
3354 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0)));
3355 EXPECT_TRUE(engine.FindCodec(
3356 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0)));
3357 // Check that name matching is case-insensitive.
3358 EXPECT_TRUE(engine.FindCodec(
3359 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0)));
3360 EXPECT_TRUE(engine.FindCodec(
3361 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0)));
3362 EXPECT_TRUE(engine.FindCodec(
3363 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0)));
3364 EXPECT_TRUE(engine.FindCodec(
3365 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0)));
3366 EXPECT_TRUE(engine.FindCodec(
3367 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0)));
3368 EXPECT_TRUE(engine.FindCodec(
3369 cricket::AudioCodec(96, "red", 8000, 0, 1, 0)));
3370 EXPECT_TRUE(engine.FindCodec(
3371 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0)));
3372 EXPECT_TRUE(engine.FindCodec(
3373 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0)));
3374 EXPECT_TRUE(engine.FindCodec(
3375 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0)));
3376 EXPECT_TRUE(engine.FindCodec(
3377 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0)));
3378 // Check codecs with an id by id.
3379 EXPECT_TRUE(engine.FindCodec(
3380 cricket::AudioCodec(0, "", 8000, 0, 1, 0))); // PCMU
3381 EXPECT_TRUE(engine.FindCodec(
3382 cricket::AudioCodec(8, "", 8000, 0, 1, 0))); // PCMA
3383 EXPECT_TRUE(engine.FindCodec(
3384 cricket::AudioCodec(9, "", 8000, 0, 1, 0))); // G722
3385 EXPECT_TRUE(engine.FindCodec(
3386 cricket::AudioCodec(13, "", 8000, 0, 1, 0))); // CN
3387 // Check sample/bitrate matching.
3388 EXPECT_TRUE(engine.FindCodec(
3389 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0)));
3390 // Check that bad codecs fail.
3391 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0)));
3392 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(88, "", 0, 0, 1, 0)));
3393 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 0, 2, 0)));
3394 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 5000, 0, 1, 0)));
3395 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 5000, 1, 0)));
3396 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3397 for (std::vector<cricket::AudioCodec>::const_iterator it =
3398 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3399 if (it->name == "CN" && it->clockrate == 16000) {
3400 EXPECT_EQ(105, it->id);
3401 } else if (it->name == "CN" && it->clockrate == 32000) {
3402 EXPECT_EQ(106, it->id);
3403 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3404 EXPECT_EQ(103, it->id);
3405 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3406 EXPECT_EQ(104, it->id);
3407 } else if (it->name == "G722" && it->clockrate == 8000) {
3408 EXPECT_EQ(9, it->id);
3409 } else if (it->name == "telephone-event") {
3410 EXPECT_EQ(126, it->id);
3411 } else if (it->name == "red") {
3412 EXPECT_EQ(127, it->id);
3413 } else if (it->name == "opus") {
3414 EXPECT_EQ(111, it->id);
3415 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3416 EXPECT_EQ("10", it->params.find("minptime")->second);
3417 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3418 EXPECT_EQ("60", it->params.find("maxptime")->second);
3419 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3420 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3421 }
3422 }
3423
3424 engine.Terminate();
3425}
3426
3427// Tests that VoE supports at least 32 channels
3428TEST(WebRtcVoiceEngineTest, Has32Channels) {
3429 cricket::WebRtcVoiceEngine engine;
3430 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003431 rtc::scoped_ptr<webrtc::Call> call(
3432 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003433
3434 cricket::VoiceMediaChannel* channels[32];
3435 int num_channels = 0;
stefan658910c2015-09-03 05:48:32 -07003436 while (num_channels < ARRAY_SIZE(channels)) {
3437 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003438 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003439 if (!channel)
3440 break;
stefan658910c2015-09-03 05:48:32 -07003441 channels[num_channels++] = channel;
3442 }
3443
3444 int expected = ARRAY_SIZE(channels);
3445 EXPECT_EQ(expected, num_channels);
3446
3447 while (num_channels > 0) {
3448 delete channels[--num_channels];
3449 }
3450
3451 engine.Terminate();
3452}
3453
3454// Test that we set our preferred codecs properly.
3455TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3456 cricket::WebRtcVoiceEngine engine;
3457 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003458 rtc::scoped_ptr<webrtc::Call> call(
3459 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003460 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3461 call.get());
3462 cricket::AudioRecvParameters parameters;
3463 parameters.codecs = engine.codecs();
3464 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003465}