blob: af4239ed6bd3d401a885ccdb8a718cdaf56433a6 [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"
wu@webrtc.orgde305012013-10-31 15:40:38 +000033#include "talk/media/base/fakenetworkinterface.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034#include "talk/media/base/fakertp.h"
Fredrik Solenberg4b60c732015-05-07 14:07:48 +020035#include "talk/media/webrtc/fakewebrtccall.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000036#include "talk/media/webrtc/fakewebrtcvoiceengine.h"
37#include "talk/media/webrtc/webrtcvoiceengine.h"
torbjornga81a42f2015-09-23 02:16:58 -070038#include "webrtc/p2p/base/fakesession.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000039#include "talk/session/media/channel.h"
40
41// Tests for the WebRtcVoiceEngine/VoiceChannel code.
42
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000043using cricket::kRtpAudioLevelHeaderExtension;
44using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
45
henrike@webrtc.org28e20752013-07-10 00:45:36 +000046static const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
47static const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000048static const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +000049static const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
50static const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000051static const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
52static const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
53static const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
54static const cricket::AudioCodec
55 kTelephoneEventCodec(106, "telephone-event", 8000, 0, 1, 0);
56static const cricket::AudioCodec* const kAudioCodecs[] = {
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +000057 &kPcmuCodec, &kIsacCodec, &kOpusCodec, &kG722CodecVoE, &kRedCodec,
58 &kCn8000Codec, &kCn16000Codec, &kTelephoneEventCodec,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000059};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060static uint32 kSsrc1 = 0x99;
61static uint32 kSsrc2 = 0x98;
62
63class FakeVoEWrapper : public cricket::VoEWrapper {
64 public:
65 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
66 : cricket::VoEWrapper(engine, // processing
67 engine, // base
68 engine, // codec
69 engine, // dtmf
henrike@webrtc.org28e20752013-07-10 00:45:36 +000070 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000071 engine, // neteq
72 engine, // network
73 engine, // rtp
74 engine, // sync
75 engine) { // volume
76 }
77};
78
wu@webrtc.org97077a32013-10-25 21:18:33 +000079class FakeVoETraceWrapper : public cricket::VoETraceWrapper {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080 public:
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +020081 int SetTraceFilter(const unsigned int filter) override {
wu@webrtc.org97077a32013-10-25 21:18:33 +000082 filter_ = filter;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083 return 0;
84 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +020085 int SetTraceFile(const char* fileNameUTF8) override { return 0; }
86 int SetTraceCallback(webrtc::TraceCallback* callback) override { return 0; }
wu@webrtc.org97077a32013-10-25 21:18:33 +000087 unsigned int filter_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088};
89
90class WebRtcVoiceEngineTestFake : public testing::Test {
91 public:
92 class ChannelErrorListener : public sigslot::has_slots<> {
93 public:
94 explicit ChannelErrorListener(cricket::VoiceMediaChannel* channel)
95 : ssrc_(0), error_(cricket::VoiceMediaChannel::ERROR_NONE) {
henrikg91d6ede2015-09-17 00:24:34 -070096 RTC_DCHECK(channel != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000097 channel->SignalMediaError.connect(
98 this, &ChannelErrorListener::OnVoiceChannelError);
99 }
100 void OnVoiceChannelError(uint32 ssrc,
101 cricket::VoiceMediaChannel::Error error) {
102 ssrc_ = ssrc;
103 error_ = error;
104 }
105 void Reset() {
106 ssrc_ = 0;
107 error_ = cricket::VoiceMediaChannel::ERROR_NONE;
108 }
109 uint32 ssrc() const {
110 return ssrc_;
111 }
112 cricket::VoiceMediaChannel::Error error() const {
113 return error_;
114 }
115
116 private:
117 uint32 ssrc_;
118 cricket::VoiceMediaChannel::Error error_;
119 };
120
121 WebRtcVoiceEngineTestFake()
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200122 : call_(webrtc::Call::Config()),
123 voe_(kAudioCodecs, ARRAY_SIZE(kAudioCodecs)),
wu@webrtc.org97077a32013-10-25 21:18:33 +0000124 trace_wrapper_(new FakeVoETraceWrapper()),
Jelena Marusicc28a8962015-05-29 15:05:44 +0200125 engine_(new FakeVoEWrapper(&voe_), trace_wrapper_),
126 channel_(nullptr) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200127 send_parameters_.codecs.push_back(kPcmuCodec);
128 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000129 options_conference_.conference_mode.Set(true);
130 options_adjust_agc_.adjust_agc_delta.Set(-10);
131 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000132 bool SetupEngineWithoutStream() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000133 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000134 return false;
135 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200136 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200137 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000138 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000139 bool SetupEngine() {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000140 if (!SetupEngineWithoutStream()) {
141 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000142 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000143 return channel_->AddSendStream(
144 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000145 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000146 void SetupForMultiSendStream() {
147 EXPECT_TRUE(SetupEngine());
148 // Remove stream added in Setup, which is corresponding to default channel.
149 int default_channel_num = voe_.GetLastChannel();
henrike@webrtc.org7666db72013-08-22 14:45:42 +0000150 uint32 default_send_ssrc = 0u;
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000151 EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
152 EXPECT_EQ(kSsrc1, default_send_ssrc);
153 EXPECT_TRUE(channel_->RemoveSendStream(default_send_ssrc));
154
155 // Verify the default channel still exists.
156 EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
157 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000158 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200159 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000160 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000161 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200162 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000163 delete channel_;
164 engine_.Terminate();
165 }
166
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000167 void TestInsertDtmf(uint32 ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000168 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200169 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200170 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000171 if (caller) {
172 // if this is a caller, local description will be applied and add the
173 // send stream.
174 EXPECT_TRUE(channel_->AddSendStream(
175 cricket::StreamParams::CreateLegacy(kSsrc1)));
176 }
177 int channel_id = voe_.GetLastChannel();
178
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000179 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200180 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000181 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
182 EXPECT_FALSE(channel_->CanInsertDtmf());
183 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111, cricket::DF_SEND));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200184 send_parameters_.codecs.push_back(kTelephoneEventCodec);
185 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000186 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000187
188 if (!caller) {
189 // There's no active send channel yet.
190 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
191 EXPECT_TRUE(channel_->AddSendStream(
192 cricket::StreamParams::CreateLegacy(kSsrc1)));
193 }
194
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000195 // Check we fail if the ssrc is invalid.
196 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111, cricket::DF_SEND));
197
198 // Test send
199 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
200 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
201 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
202
203 // Test play
204 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(3, 134));
205 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 3, 134, cricket::DF_PLAY));
206 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(3, 134));
207
208 // Test send and play
209 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
210 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(4, 145));
211 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 4, 145,
212 cricket::DF_PLAY | cricket::DF_SEND));
213 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
214 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(4, 145));
215 }
216
217 // Test that send bandwidth is set correctly.
218 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000219 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
220 // |expected_result| is the expected result from SetMaxSendBandwidth().
221 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000222 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000223 int max_bitrate,
224 bool expected_result,
225 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200226 cricket::AudioSendParameters parameters;
227 parameters.codecs.push_back(codec);
228 parameters.max_bandwidth_bps = max_bitrate;
229 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
230
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000231 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000232 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000233 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000234 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000235 }
236
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000237 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
238 EXPECT_TRUE(SetupEngineWithoutStream());
239 int channel_num = voe_.GetLastChannel();
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000240
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000241 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000242 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000243
244 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200245 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000246 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200247 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000248 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000249
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000250 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200251 send_parameters_.extensions.clear();
252 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000253 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000254
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000255 // Ensure extension is set properly.
256 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200257 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
258 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000259 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000260
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000261 // Ensure extension is set properly on new channel.
262 // The first stream to occupy the default channel.
263 EXPECT_TRUE(channel_->AddSendStream(
264 cricket::StreamParams::CreateLegacy(123)));
265 EXPECT_TRUE(channel_->AddSendStream(
266 cricket::StreamParams::CreateLegacy(234)));
267 int new_channel_num = voe_.GetLastChannel();
268 EXPECT_NE(channel_num, new_channel_num);
269 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000270
271 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200272 send_parameters_.codecs.push_back(kPcmuCodec);
273 send_parameters_.extensions.clear();
274 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000275 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
276 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000277 }
278
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000279 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
280 EXPECT_TRUE(SetupEngineWithoutStream());
281 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000282
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000283 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000284 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000285
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200286 cricket::AudioRecvParameters parameters;
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000287 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200288 parameters.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000289 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200290 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000291 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000292
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000293 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200294 parameters.extensions.clear();
295 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000296 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000297
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000298 // Ensure extension is set properly.
299 const int id = 2;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200300 parameters.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
301 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000302 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000303
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000304 // Ensure extension is set properly on new channel.
305 // The first stream to occupy the default channel.
306 EXPECT_TRUE(channel_->AddRecvStream(
307 cricket::StreamParams::CreateLegacy(345)));
308 EXPECT_TRUE(channel_->AddRecvStream(
309 cricket::StreamParams::CreateLegacy(456)));
310 int new_channel_num = voe_.GetLastChannel();
311 EXPECT_NE(channel_num, new_channel_num);
312 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
313
314 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200315 parameters.extensions.clear();
316 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000317 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
318 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000319 }
320
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000321 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200322 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000323 cricket::FakeWebRtcVoiceEngine voe_;
wu@webrtc.org97077a32013-10-25 21:18:33 +0000324 FakeVoETraceWrapper* trace_wrapper_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000325 cricket::WebRtcVoiceEngine engine_;
326 cricket::VoiceMediaChannel* channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000327
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200328 cricket::AudioSendParameters send_parameters_;
329 cricket::AudioRecvParameters recv_parameters_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000330 cricket::AudioOptions options_conference_;
331 cricket::AudioOptions options_adjust_agc_;
332};
333
334// Tests that our stub library "works".
335TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
336 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000337 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000338 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000339 engine_.Terminate();
340 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000341}
342
343// Tests that we can create and destroy a channel.
344TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000345 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200346 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200347 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000348}
349
350// Tests that we properly handle failures in CreateChannel.
351TEST_F(WebRtcVoiceEngineTestFake, CreateChannelFail) {
352 voe_.set_fail_create_channel(true);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000353 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200354 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200355 EXPECT_TRUE(channel_ == nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000356}
357
358// Tests that the list of supported codecs is created properly and ordered
359// correctly
360TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
361 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
362 ASSERT_FALSE(codecs.empty());
363 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
364 EXPECT_EQ(48000, codecs[0].clockrate);
365 EXPECT_EQ(2, codecs[0].channels);
366 EXPECT_EQ(64000, codecs[0].bitrate);
367 int pref = codecs[0].preference;
368 for (size_t i = 1; i < codecs.size(); ++i) {
369 EXPECT_GT(pref, codecs[i].preference);
370 pref = codecs[i].preference;
371 }
372}
373
374// Tests that we can find codecs by name or id, and that we interpret the
375// clockrate and bitrate fields properly.
376TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
377 cricket::AudioCodec codec;
378 webrtc::CodecInst codec_inst;
379 // Find PCMU with explicit clockrate and bitrate.
380 EXPECT_TRUE(engine_.FindWebRtcCodec(kPcmuCodec, &codec_inst));
381 // Find ISAC with explicit clockrate and 0 bitrate.
382 EXPECT_TRUE(engine_.FindWebRtcCodec(kIsacCodec, &codec_inst));
383 // Find telephone-event with explicit clockrate and 0 bitrate.
384 EXPECT_TRUE(engine_.FindWebRtcCodec(kTelephoneEventCodec, &codec_inst));
385 // Find ISAC with a different payload id.
386 codec = kIsacCodec;
387 codec.id = 127;
388 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
389 EXPECT_EQ(codec.id, codec_inst.pltype);
390 // Find PCMU with a 0 clockrate.
391 codec = kPcmuCodec;
392 codec.clockrate = 0;
393 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
394 EXPECT_EQ(codec.id, codec_inst.pltype);
395 EXPECT_EQ(8000, codec_inst.plfreq);
396 // Find PCMU with a 0 bitrate.
397 codec = kPcmuCodec;
398 codec.bitrate = 0;
399 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
400 EXPECT_EQ(codec.id, codec_inst.pltype);
401 EXPECT_EQ(64000, codec_inst.rate);
402 // Find ISAC with an explicit bitrate.
403 codec = kIsacCodec;
404 codec.bitrate = 32000;
405 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
406 EXPECT_EQ(codec.id, codec_inst.pltype);
407 EXPECT_EQ(32000, codec_inst.rate);
408}
409
410// Test that we set our inbound codecs properly, including changing PT.
411TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
412 EXPECT_TRUE(SetupEngine());
413 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200414 cricket::AudioRecvParameters parameters;
415 parameters.codecs.push_back(kIsacCodec);
416 parameters.codecs.push_back(kPcmuCodec);
417 parameters.codecs.push_back(kTelephoneEventCodec);
418 parameters.codecs[0].id = 106; // collide with existing telephone-event
419 parameters.codecs[2].id = 126;
420 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000421 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000422 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000423 gcodec.plfreq = 16000;
424 gcodec.channels = 1;
425 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
426 EXPECT_EQ(106, gcodec.pltype);
427 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000428 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000429 "telephone-event");
430 gcodec.plfreq = 8000;
431 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
432 EXPECT_EQ(126, gcodec.pltype);
433 EXPECT_STREQ("telephone-event", gcodec.plname);
434}
435
436// Test that we fail to set an unknown inbound codec.
437TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
438 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200439 cricket::AudioRecvParameters parameters;
440 parameters.codecs.push_back(kIsacCodec);
441 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
442 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000443}
444
445// Test that we fail if we have duplicate types in the inbound list.
446TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
447 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200448 cricket::AudioRecvParameters parameters;
449 parameters.codecs.push_back(kIsacCodec);
450 parameters.codecs.push_back(kCn16000Codec);
451 parameters.codecs[1].id = kIsacCodec.id;
452 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000453}
454
455// Test that we can decode OPUS without stereo parameters.
456TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
457 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200458 cricket::AudioRecvParameters parameters;
459 parameters.codecs.push_back(kIsacCodec);
460 parameters.codecs.push_back(kPcmuCodec);
461 parameters.codecs.push_back(kOpusCodec);
462 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000463 EXPECT_TRUE(channel_->AddRecvStream(
464 cricket::StreamParams::CreateLegacy(kSsrc1)));
465 int channel_num2 = voe_.GetLastChannel();
466 webrtc::CodecInst opus;
467 engine_.FindWebRtcCodec(kOpusCodec, &opus);
468 // Even without stereo parameters, recv codecs still specify channels = 2.
469 EXPECT_EQ(2, opus.channels);
470 EXPECT_EQ(111, opus.pltype);
471 EXPECT_STREQ("opus", opus.plname);
472 opus.pltype = 0;
473 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
474 EXPECT_EQ(111, opus.pltype);
475}
476
477// Test that we can decode OPUS with stereo = 0.
478TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
479 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200480 cricket::AudioRecvParameters parameters;
481 parameters.codecs.push_back(kIsacCodec);
482 parameters.codecs.push_back(kPcmuCodec);
483 parameters.codecs.push_back(kOpusCodec);
484 parameters.codecs[2].params["stereo"] = "0";
485 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000486 EXPECT_TRUE(channel_->AddRecvStream(
487 cricket::StreamParams::CreateLegacy(kSsrc1)));
488 int channel_num2 = voe_.GetLastChannel();
489 webrtc::CodecInst opus;
490 engine_.FindWebRtcCodec(kOpusCodec, &opus);
491 // Even when stereo is off, recv codecs still specify channels = 2.
492 EXPECT_EQ(2, opus.channels);
493 EXPECT_EQ(111, opus.pltype);
494 EXPECT_STREQ("opus", opus.plname);
495 opus.pltype = 0;
496 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
497 EXPECT_EQ(111, opus.pltype);
498}
499
500// Test that we can decode OPUS with stereo = 1.
501TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
502 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200503 cricket::AudioRecvParameters parameters;
504 parameters.codecs.push_back(kIsacCodec);
505 parameters.codecs.push_back(kPcmuCodec);
506 parameters.codecs.push_back(kOpusCodec);
507 parameters.codecs[2].params["stereo"] = "1";
508 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000509 EXPECT_TRUE(channel_->AddRecvStream(
510 cricket::StreamParams::CreateLegacy(kSsrc1)));
511 int channel_num2 = voe_.GetLastChannel();
512 webrtc::CodecInst opus;
513 engine_.FindWebRtcCodec(kOpusCodec, &opus);
514 EXPECT_EQ(2, opus.channels);
515 EXPECT_EQ(111, opus.pltype);
516 EXPECT_STREQ("opus", opus.plname);
517 opus.pltype = 0;
518 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
519 EXPECT_EQ(111, opus.pltype);
520}
521
522// Test that changes to recv codecs are applied to all streams.
523TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
524 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200525 cricket::AudioRecvParameters parameters;
526 parameters.codecs.push_back(kIsacCodec);
527 parameters.codecs.push_back(kPcmuCodec);
528 parameters.codecs.push_back(kTelephoneEventCodec);
529 parameters.codecs[0].id = 106; // collide with existing telephone-event
530 parameters.codecs[2].id = 126;
531 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000532 EXPECT_TRUE(channel_->AddRecvStream(
533 cricket::StreamParams::CreateLegacy(kSsrc1)));
534 int channel_num2 = voe_.GetLastChannel();
535 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000536 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000537 gcodec.plfreq = 16000;
538 gcodec.channels = 1;
539 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
540 EXPECT_EQ(106, gcodec.pltype);
541 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000542 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000543 "telephone-event");
544 gcodec.plfreq = 8000;
545 gcodec.channels = 1;
546 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
547 EXPECT_EQ(126, gcodec.pltype);
548 EXPECT_STREQ("telephone-event", gcodec.plname);
549}
550
551TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
552 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200553 cricket::AudioRecvParameters parameters;
554 parameters.codecs.push_back(kIsacCodec);
555 parameters.codecs[0].id = 106; // collide with existing telephone-event
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000556 EXPECT_TRUE(channel_->AddRecvStream(
557 cricket::StreamParams::CreateLegacy(kSsrc1)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200558 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000559
560 int channel_num2 = voe_.GetLastChannel();
561 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000562 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000563 gcodec.plfreq = 16000;
564 gcodec.channels = 1;
565 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
566 EXPECT_EQ(106, gcodec.pltype);
567 EXPECT_STREQ("ISAC", gcodec.plname);
568}
569
570// Test that we can apply the same set of codecs again while playing.
571TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
572 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200573 cricket::AudioRecvParameters parameters;
574 parameters.codecs.push_back(kIsacCodec);
575 parameters.codecs.push_back(kCn16000Codec);
576 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000577 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200578 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000579
580 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200581 parameters.codecs[0].id = 127;
582 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
583 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000584 EXPECT_TRUE(voe_.GetPlayout(channel_num));
585}
586
587// Test that we can add a codec while playing.
588TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
589 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200590 cricket::AudioRecvParameters parameters;
591 parameters.codecs.push_back(kIsacCodec);
592 parameters.codecs.push_back(kCn16000Codec);
593 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000594 EXPECT_TRUE(channel_->SetPlayout(true));
595
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200596 parameters.codecs.push_back(kOpusCodec);
597 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
598 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000599 EXPECT_TRUE(voe_.GetPlayout(channel_num));
600 webrtc::CodecInst gcodec;
601 EXPECT_TRUE(engine_.FindWebRtcCodec(kOpusCodec, &gcodec));
602 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
603}
604
605TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
606 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000607
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000608 // Test that when autobw is enabled, bitrate is kept as the default
609 // value. autobw is enabled for the following tests because the target
610 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000611
612 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000613 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000614
615 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000616 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000618 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000619 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000620}
621
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000622TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000623 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000624
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000625 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000626
627 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000628 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
629 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000630
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000632 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
633 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000634}
635
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000636TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
637 EXPECT_TRUE(SetupEngine());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000638
639 // Test that we can only set a maximum bitrate for a fixed-rate codec
640 // if it's bigger than the fixed rate.
641
642 // PCMU, fixed bitrate == 64000.
643 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
644 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
645 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
646 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
647 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
648 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
649 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
650}
651
652TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200653 EXPECT_TRUE(SetupEngineWithoutStream());
654 const int kDesiredBitrate = 128000;
655 cricket::AudioSendParameters parameters;
656 parameters.codecs = engine_.codecs();
657 parameters.max_bandwidth_bps = kDesiredBitrate;
658 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000659
660 EXPECT_TRUE(channel_->AddSendStream(
661 cricket::StreamParams::CreateLegacy(kSsrc1)));
662
663 int channel_num = voe_.GetLastChannel();
664 webrtc::CodecInst codec;
665 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200666 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000667}
668
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000669// Test that bitrate cannot be set for CBR codecs.
670// Bitrate is ignored if it is higher than the fixed bitrate.
671// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000672TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000673 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000674
675 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200676 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
677 int channel_num = voe_.GetLastChannel();
678 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000679 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
680 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200681
682 send_parameters_.max_bandwidth_bps = 128000;
683 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000684 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
685 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200686
687 send_parameters_.max_bandwidth_bps = 128;
688 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000689 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
690 EXPECT_EQ(64000, codec.rate);
691}
692
693// Test that we apply codecs properly.
694TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
695 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200696 cricket::AudioSendParameters parameters;
697 parameters.codecs.push_back(kIsacCodec);
698 parameters.codecs.push_back(kPcmuCodec);
699 parameters.codecs.push_back(kRedCodec);
700 parameters.codecs[0].id = 96;
701 parameters.codecs[0].bitrate = 48000;
702 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000703 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200704 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000705 webrtc::CodecInst gcodec;
706 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
707 EXPECT_EQ(96, gcodec.pltype);
708 EXPECT_EQ(48000, gcodec.rate);
709 EXPECT_STREQ("ISAC", gcodec.plname);
710 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000711 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000712 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
713 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
714 EXPECT_EQ(106, voe_.GetSendTelephoneEventPayloadType(channel_num));
715}
716
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000717// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
718// to apply.
719TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
720 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200721 cricket::AudioSendParameters parameters;
722 parameters.codecs.push_back(kIsacCodec);
723 parameters.codecs.push_back(kPcmuCodec);
724 parameters.codecs.push_back(kRedCodec);
725 parameters.codecs[0].id = 96;
726 parameters.codecs[0].bitrate = 48000;
727 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000728 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
729 // Calling SetSendCodec again with same codec which is already set.
730 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200731 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000732 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
733}
734
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000735// Verify that G722 is set with 16000 samples per second to WebRTC.
736TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
737 EXPECT_TRUE(SetupEngine());
738 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200739 cricket::AudioSendParameters parameters;
740 parameters.codecs.push_back(kG722CodecSdp);
741 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000742 webrtc::CodecInst gcodec;
743 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
744 EXPECT_STREQ("G722", gcodec.plname);
745 EXPECT_EQ(1, gcodec.channels);
746 EXPECT_EQ(16000, gcodec.plfreq);
747}
748
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000749// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000750TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
751 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200752 cricket::AudioSendParameters parameters;
753 parameters.codecs.push_back(kOpusCodec);
754 parameters.codecs[0].bitrate = 0;
755 parameters.codecs[0].clockrate = 50000;
756 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000757}
758
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000759// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000760TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
761 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200762 cricket::AudioSendParameters parameters;
763 parameters.codecs.push_back(kOpusCodec);
764 parameters.codecs[0].bitrate = 0;
765 parameters.codecs[0].channels = 0;
766 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000767}
768
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000769// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000770TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
771 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200772 cricket::AudioSendParameters parameters;
773 parameters.codecs.push_back(kOpusCodec);
774 parameters.codecs[0].bitrate = 0;
775 parameters.codecs[0].channels = 0;
776 parameters.codecs[0].params["stereo"] = "1";
777 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000778}
779
780// Test that if channel is 1 for opus and there's no stereo, we fail.
781TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
782 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200783 cricket::AudioSendParameters parameters;
784 parameters.codecs.push_back(kOpusCodec);
785 parameters.codecs[0].bitrate = 0;
786 parameters.codecs[0].channels = 1;
787 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000788}
789
790// Test that if channel is 1 for opus and stereo=0, we fail.
791TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
792 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200793 cricket::AudioSendParameters parameters;
794 parameters.codecs.push_back(kOpusCodec);
795 parameters.codecs[0].bitrate = 0;
796 parameters.codecs[0].channels = 1;
797 parameters.codecs[0].params["stereo"] = "0";
798 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000799}
800
801// Test that if channel is 1 for opus and stereo=1, we fail.
802TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
803 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200804 cricket::AudioSendParameters parameters;
805 parameters.codecs.push_back(kOpusCodec);
806 parameters.codecs[0].bitrate = 0;
807 parameters.codecs[0].channels = 1;
808 parameters.codecs[0].params["stereo"] = "1";
809 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000810}
811
812// Test that with bitrate=0 and no stereo,
813// channels and bitrate are 1 and 32000.
814TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
815 EXPECT_TRUE(SetupEngine());
816 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200817 cricket::AudioSendParameters parameters;
818 parameters.codecs.push_back(kOpusCodec);
819 parameters.codecs[0].bitrate = 0;
820 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000821 webrtc::CodecInst gcodec;
822 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
823 EXPECT_STREQ("opus", gcodec.plname);
824 EXPECT_EQ(1, gcodec.channels);
825 EXPECT_EQ(32000, gcodec.rate);
826}
827
828// Test that with bitrate=0 and stereo=0,
829// channels and bitrate are 1 and 32000.
830TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
831 EXPECT_TRUE(SetupEngine());
832 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200833 cricket::AudioSendParameters parameters;
834 parameters.codecs.push_back(kOpusCodec);
835 parameters.codecs[0].bitrate = 0;
836 parameters.codecs[0].params["stereo"] = "0";
837 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000838 webrtc::CodecInst gcodec;
839 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
840 EXPECT_STREQ("opus", gcodec.plname);
841 EXPECT_EQ(1, gcodec.channels);
842 EXPECT_EQ(32000, gcodec.rate);
843}
844
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000845// Test that with bitrate=invalid and stereo=0,
846// channels and bitrate are 1 and 32000.
847TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
848 EXPECT_TRUE(SetupEngine());
849 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200850 cricket::AudioSendParameters parameters;
851 parameters.codecs.push_back(kOpusCodec);
852 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000853 webrtc::CodecInst gcodec;
854
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000855 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200856 parameters.codecs[0].bitrate = 5999;
857 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000858 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
859 EXPECT_STREQ("opus", gcodec.plname);
860 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000861 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000862
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200863 parameters.codecs[0].bitrate = 510001;
864 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000865 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
866 EXPECT_STREQ("opus", gcodec.plname);
867 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000868 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000869}
870
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000871// Test that with bitrate=0 and stereo=1,
872// channels and bitrate are 2 and 64000.
873TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
874 EXPECT_TRUE(SetupEngine());
875 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200876 cricket::AudioSendParameters parameters;
877 parameters.codecs.push_back(kOpusCodec);
878 parameters.codecs[0].bitrate = 0;
879 parameters.codecs[0].params["stereo"] = "1";
880 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000881 webrtc::CodecInst gcodec;
882 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
883 EXPECT_STREQ("opus", gcodec.plname);
884 EXPECT_EQ(2, gcodec.channels);
885 EXPECT_EQ(64000, gcodec.rate);
886}
887
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000888// Test that with bitrate=invalid and stereo=1,
889// channels and bitrate are 2 and 64000.
890TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
891 EXPECT_TRUE(SetupEngine());
892 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200893 cricket::AudioSendParameters parameters;
894 parameters.codecs.push_back(kOpusCodec);
895 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000896 webrtc::CodecInst gcodec;
897
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000898 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200899 parameters.codecs[0].bitrate = 5999;
900 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000901 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
902 EXPECT_STREQ("opus", gcodec.plname);
903 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000904 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000905
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200906 parameters.codecs[0].bitrate = 510001;
907 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000908 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
909 EXPECT_STREQ("opus", gcodec.plname);
910 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000911 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000912}
913
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000914// Test that with bitrate=N and stereo unset,
915// channels and bitrate are 1 and N.
916TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
917 EXPECT_TRUE(SetupEngine());
918 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200919 cricket::AudioSendParameters parameters;
920 parameters.codecs.push_back(kOpusCodec);
921 parameters.codecs[0].bitrate = 96000;
922 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000923 webrtc::CodecInst gcodec;
924 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
925 EXPECT_EQ(111, gcodec.pltype);
926 EXPECT_EQ(96000, gcodec.rate);
927 EXPECT_STREQ("opus", gcodec.plname);
928 EXPECT_EQ(1, gcodec.channels);
929 EXPECT_EQ(48000, gcodec.plfreq);
930}
931
932// Test that with bitrate=N and stereo=0,
933// channels and bitrate are 1 and N.
934TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
935 EXPECT_TRUE(SetupEngine());
936 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200937 cricket::AudioSendParameters parameters;
938 parameters.codecs.push_back(kOpusCodec);
939 parameters.codecs[0].bitrate = 30000;
940 parameters.codecs[0].params["stereo"] = "0";
941 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000942 webrtc::CodecInst gcodec;
943 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
944 EXPECT_EQ(1, gcodec.channels);
945 EXPECT_EQ(30000, gcodec.rate);
946 EXPECT_STREQ("opus", gcodec.plname);
947}
948
949// Test that with bitrate=N and without any parameters,
950// channels and bitrate are 1 and N.
951TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
952 EXPECT_TRUE(SetupEngine());
953 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200954 cricket::AudioSendParameters parameters;
955 parameters.codecs.push_back(kOpusCodec);
956 parameters.codecs[0].bitrate = 30000;
957 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000958 webrtc::CodecInst gcodec;
959 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
960 EXPECT_EQ(1, gcodec.channels);
961 EXPECT_EQ(30000, gcodec.rate);
962 EXPECT_STREQ("opus", gcodec.plname);
963}
964
965// Test that with bitrate=N and stereo=1,
966// channels and bitrate are 2 and N.
967TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
968 EXPECT_TRUE(SetupEngine());
969 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200970 cricket::AudioSendParameters parameters;
971 parameters.codecs.push_back(kOpusCodec);
972 parameters.codecs[0].bitrate = 30000;
973 parameters.codecs[0].params["stereo"] = "1";
974 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000975 webrtc::CodecInst gcodec;
976 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
977 EXPECT_EQ(2, gcodec.channels);
978 EXPECT_EQ(30000, gcodec.rate);
979 EXPECT_STREQ("opus", gcodec.plname);
980}
981
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000982// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
983// Also test that the "maxaveragebitrate" can't be set to values outside the
984// range of 6000 and 510000
985TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
986 EXPECT_TRUE(SetupEngine());
987 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200988 cricket::AudioSendParameters parameters;
989 parameters.codecs.push_back(kOpusCodec);
990 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000991 webrtc::CodecInst gcodec;
992
993 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200994 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
995 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000996 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000997 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000998
999 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001000 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1001 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001002 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001003 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001004
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001005 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1006 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001007 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1008 EXPECT_EQ(200000, gcodec.rate);
1009}
1010
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001011// Test that we can enable NACK with opus as caller.
1012TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001013 EXPECT_TRUE(SetupEngine());
1014 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001015 cricket::AudioSendParameters parameters;
1016 parameters.codecs.push_back(kOpusCodec);
1017 parameters.codecs[0].AddFeedbackParam(
1018 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1019 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001020 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001021 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001022 EXPECT_TRUE(voe_.GetNACK(channel_num));
1023}
1024
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001025// Test that we can enable NACK with opus as callee.
1026TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001027 EXPECT_TRUE(SetupEngineWithoutStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001028 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001029 cricket::AudioSendParameters parameters;
1030 parameters.codecs.push_back(kOpusCodec);
1031 parameters.codecs[0].AddFeedbackParam(
1032 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1033 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001034 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001035 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001036 EXPECT_FALSE(voe_.GetNACK(channel_num));
1037
1038 EXPECT_TRUE(channel_->AddSendStream(
1039 cricket::StreamParams::CreateLegacy(kSsrc1)));
1040 EXPECT_TRUE(voe_.GetNACK(channel_num));
1041}
1042
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001043// Test that we can enable NACK on receive streams.
1044TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
1045 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001046 int channel_num1 = voe_.GetLastChannel();
1047 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1048 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001049 cricket::AudioSendParameters parameters;
1050 parameters.codecs.push_back(kOpusCodec);
1051 parameters.codecs[0].AddFeedbackParam(
1052 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1053 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001054 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1055 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001056 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001057 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1058 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1059}
1060
1061// Test that we can disable NACK.
1062TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
1063 EXPECT_TRUE(SetupEngine());
1064 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001065 cricket::AudioSendParameters parameters;
1066 parameters.codecs.push_back(kOpusCodec);
1067 parameters.codecs[0].AddFeedbackParam(
1068 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1069 cricket::kParamValueEmpty));
1070 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001071 EXPECT_TRUE(voe_.GetNACK(channel_num));
1072
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001073 parameters.codecs.clear();
1074 parameters.codecs.push_back(kOpusCodec);
1075 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001076 EXPECT_FALSE(voe_.GetNACK(channel_num));
1077}
1078
1079// Test that we can disable NACK on receive streams.
1080TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
1081 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001082 int channel_num1 = voe_.GetLastChannel();
1083 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1084 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001085 cricket::AudioSendParameters parameters;
1086 parameters.codecs.push_back(kOpusCodec);
1087 parameters.codecs[0].AddFeedbackParam(
1088 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1089 cricket::kParamValueEmpty));
1090 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001091 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1092 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1093
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001094 parameters.codecs.clear();
1095 parameters.codecs.push_back(kOpusCodec);
1096 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001097 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1098 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1099}
1100
1101// Test that NACK is enabled on a new receive stream.
1102TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
1103 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001104 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001105 cricket::AudioSendParameters parameters;
1106 parameters.codecs.push_back(kIsacCodec);
1107 parameters.codecs.push_back(kCn16000Codec);
1108 parameters.codecs[0].AddFeedbackParam(
1109 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1110 cricket::kParamValueEmpty));
1111 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001112 EXPECT_TRUE(voe_.GetNACK(channel_num));
1113
1114 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1115 channel_num = voe_.GetLastChannel();
1116 EXPECT_TRUE(voe_.GetNACK(channel_num));
1117 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1118 channel_num = voe_.GetLastChannel();
1119 EXPECT_TRUE(voe_.GetNACK(channel_num));
1120}
1121
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001122// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001123TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001124 EXPECT_TRUE(SetupEngine());
1125 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001126 cricket::AudioSendParameters parameters;
1127 parameters.codecs.push_back(kOpusCodec);
1128 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001129 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1130}
1131
1132// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001133TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001134 EXPECT_TRUE(SetupEngine());
1135 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001136 cricket::AudioSendParameters parameters;
1137 parameters.codecs.push_back(kOpusCodec);
1138 parameters.codecs[0].bitrate = 0;
1139 parameters.codecs[0].params["useinbandfec"] = "0";
1140 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001141 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1142 webrtc::CodecInst gcodec;
1143 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1144 EXPECT_STREQ("opus", gcodec.plname);
1145 EXPECT_EQ(1, gcodec.channels);
1146 EXPECT_EQ(32000, gcodec.rate);
1147}
1148
1149// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001150TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001151 EXPECT_TRUE(SetupEngine());
1152 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001153 cricket::AudioSendParameters parameters;
1154 parameters.codecs.push_back(kOpusCodec);
1155 parameters.codecs[0].bitrate = 0;
1156 parameters.codecs[0].params["useinbandfec"] = "1";
1157 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001158 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1159 webrtc::CodecInst gcodec;
1160 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1161 EXPECT_STREQ("opus", gcodec.plname);
1162 EXPECT_EQ(1, gcodec.channels);
1163 EXPECT_EQ(32000, gcodec.rate);
1164}
1165
1166// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001167TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001168 EXPECT_TRUE(SetupEngine());
1169 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001170 cricket::AudioSendParameters parameters;
1171 parameters.codecs.push_back(kOpusCodec);
1172 parameters.codecs[0].bitrate = 0;
1173 parameters.codecs[0].params["stereo"] = "1";
1174 parameters.codecs[0].params["useinbandfec"] = "1";
1175 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001176 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1177 webrtc::CodecInst gcodec;
1178 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1179 EXPECT_STREQ("opus", gcodec.plname);
1180 EXPECT_EQ(2, gcodec.channels);
1181 EXPECT_EQ(64000, gcodec.rate);
1182}
1183
1184// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001185TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001186 EXPECT_TRUE(SetupEngine());
1187 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001188 cricket::AudioSendParameters parameters;
1189 parameters.codecs.push_back(kIsacCodec);
1190 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001191 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1192}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001193
1194// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1195TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
1196 EXPECT_TRUE(SetupEngine());
1197 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001198 cricket::AudioSendParameters parameters;
1199 parameters.codecs.push_back(kIsacCodec);
1200 parameters.codecs[0].params["useinbandfec"] = "1";
1201 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001202 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1203}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001204
1205// Test that Opus FEC status can be changed.
1206TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
1207 EXPECT_TRUE(SetupEngine());
1208 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001209 cricket::AudioSendParameters parameters;
1210 parameters.codecs.push_back(kOpusCodec);
1211 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001212 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001213 parameters.codecs[0].params["useinbandfec"] = "1";
1214 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001215 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1216}
1217
1218// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1219TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
1220 EXPECT_TRUE(SetupEngine());
1221 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001222 cricket::AudioSendParameters parameters;
1223 parameters.codecs.push_back(kOpusCodec);
1224 parameters.codecs[0].bitrate = 0;
1225 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1226 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001227 EXPECT_EQ(cricket::kOpusBandwidthNb,
1228 voe_.GetMaxEncodingBandwidth(channel_num));
1229 webrtc::CodecInst gcodec;
1230 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1231 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001232
1233 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001234 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1235 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001236 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1237 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001238}
1239
1240// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1241TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
1242 EXPECT_TRUE(SetupEngine());
1243 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001244 cricket::AudioSendParameters parameters;
1245 parameters.codecs.push_back(kOpusCodec);
1246 parameters.codecs[0].bitrate = 0;
1247 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1248 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001249 EXPECT_EQ(cricket::kOpusBandwidthMb,
1250 voe_.GetMaxEncodingBandwidth(channel_num));
1251 webrtc::CodecInst gcodec;
1252 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1253 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001254
1255 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001256 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1257 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001258 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1259 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001260}
1261
1262// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1263TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
1264 EXPECT_TRUE(SetupEngine());
1265 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001266 cricket::AudioSendParameters parameters;
1267 parameters.codecs.push_back(kOpusCodec);
1268 parameters.codecs[0].bitrate = 0;
1269 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1270 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001271 EXPECT_EQ(cricket::kOpusBandwidthWb,
1272 voe_.GetMaxEncodingBandwidth(channel_num));
1273 webrtc::CodecInst gcodec;
1274 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1275 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001276
1277 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001278 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1279 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001280 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1281 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001282}
1283
1284// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1285TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
1286 EXPECT_TRUE(SetupEngine());
1287 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001288 cricket::AudioSendParameters parameters;
1289 parameters.codecs.push_back(kOpusCodec);
1290 parameters.codecs[0].bitrate = 0;
1291 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1292 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001293 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1294 voe_.GetMaxEncodingBandwidth(channel_num));
1295 webrtc::CodecInst gcodec;
1296 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1297 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001298
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001299 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001300 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1301 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001302 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1303 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001304}
1305
1306// Test 24000 < maxplaybackrate triggers Opus full band mode.
1307TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
1308 EXPECT_TRUE(SetupEngine());
1309 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001310 cricket::AudioSendParameters parameters;
1311 parameters.codecs.push_back(kOpusCodec);
1312 parameters.codecs[0].bitrate = 0;
1313 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1314 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001315 EXPECT_EQ(cricket::kOpusBandwidthFb,
1316 voe_.GetMaxEncodingBandwidth(channel_num));
1317 webrtc::CodecInst gcodec;
1318 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1319 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001320
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001321 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001322 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1323 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001324 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1325 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001326}
1327
1328// Test Opus that without maxplaybackrate, default playback rate is used.
1329TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
1330 EXPECT_TRUE(SetupEngine());
1331 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001332 cricket::AudioSendParameters parameters;
1333 parameters.codecs.push_back(kOpusCodec);
1334 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001335 EXPECT_EQ(cricket::kOpusBandwidthFb,
1336 voe_.GetMaxEncodingBandwidth(channel_num));
1337}
1338
1339// Test the with non-Opus, maxplaybackrate has no effect.
1340TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
1341 EXPECT_TRUE(SetupEngine());
1342 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001343 cricket::AudioSendParameters parameters;
1344 parameters.codecs.push_back(kIsacCodec);
1345 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1346 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001347 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1348}
1349
1350// Test maxplaybackrate can be set on two streams.
1351TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
1352 EXPECT_TRUE(SetupEngine());
1353 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001354 cricket::AudioSendParameters parameters;
1355 parameters.codecs.push_back(kOpusCodec);
1356 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001357 // Default bandwidth is 24000.
1358 EXPECT_EQ(cricket::kOpusBandwidthFb,
1359 voe_.GetMaxEncodingBandwidth(channel_num));
1360
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001361 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001362
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001363 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001364 EXPECT_EQ(cricket::kOpusBandwidthNb,
1365 voe_.GetMaxEncodingBandwidth(channel_num));
1366
1367 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1368 channel_num = voe_.GetLastChannel();
1369 EXPECT_EQ(cricket::kOpusBandwidthNb,
1370 voe_.GetMaxEncodingBandwidth(channel_num));
1371}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001372
Minyue Li7100dcd2015-03-27 05:05:59 +01001373// Test that with usedtx=0, Opus DTX is off.
1374TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
1375 EXPECT_TRUE(SetupEngine());
1376 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001377 cricket::AudioSendParameters parameters;
1378 parameters.codecs.push_back(kOpusCodec);
1379 parameters.codecs[0].params["usedtx"] = "0";
1380 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001381 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1382}
1383
1384// Test that with usedtx=1, Opus DTX is on.
1385TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
1386 EXPECT_TRUE(SetupEngine());
1387 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001388 cricket::AudioSendParameters parameters;
1389 parameters.codecs.push_back(kOpusCodec);
1390 parameters.codecs[0].params["usedtx"] = "1";
1391 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001392 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1393 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1394}
1395
1396// Test that usedtx=1 works with stereo Opus.
1397TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
1398 EXPECT_TRUE(SetupEngine());
1399 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001400 cricket::AudioSendParameters parameters;
1401 parameters.codecs.push_back(kOpusCodec);
1402 parameters.codecs[0].params["usedtx"] = "1";
1403 parameters.codecs[0].params["stereo"] = "1";
1404 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001405 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1406 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1407}
1408
1409// Test that usedtx=1 does not work with non Opus.
1410TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
1411 EXPECT_TRUE(SetupEngine());
1412 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001413 cricket::AudioSendParameters parameters;
1414 parameters.codecs.push_back(kIsacCodec);
1415 parameters.codecs[0].params["usedtx"] = "1";
1416 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001417 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1418}
1419
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001420// Test that we can switch back and forth between Opus and ISAC with CN.
1421TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001422 EXPECT_TRUE(SetupEngine());
1423 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001424 cricket::AudioSendParameters opus_parameters;
1425 opus_parameters.codecs.push_back(kOpusCodec);
1426 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001427 webrtc::CodecInst gcodec;
1428 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001429 EXPECT_EQ(111, gcodec.pltype);
1430 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001431
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001432 cricket::AudioSendParameters isac_parameters;
1433 isac_parameters.codecs.push_back(kIsacCodec);
1434 isac_parameters.codecs.push_back(kCn16000Codec);
1435 isac_parameters.codecs.push_back(kOpusCodec);
1436 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001437 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1438 EXPECT_EQ(103, gcodec.pltype);
1439 EXPECT_STREQ("ISAC", gcodec.plname);
1440
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001441 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001442 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001443 EXPECT_EQ(111, gcodec.pltype);
1444 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001445}
1446
1447// Test that we handle various ways of specifying bitrate.
1448TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
1449 EXPECT_TRUE(SetupEngine());
1450 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001451 cricket::AudioSendParameters parameters;
1452 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1453 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001454 webrtc::CodecInst gcodec;
1455 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1456 EXPECT_EQ(103, gcodec.pltype);
1457 EXPECT_STREQ("ISAC", gcodec.plname);
1458 EXPECT_EQ(32000, gcodec.rate);
1459
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001460 parameters.codecs[0].bitrate = 0; // bitrate == default
1461 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001462 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1463 EXPECT_EQ(103, gcodec.pltype);
1464 EXPECT_STREQ("ISAC", gcodec.plname);
1465 EXPECT_EQ(-1, gcodec.rate);
1466
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001467 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1468 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001469 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1470 EXPECT_EQ(103, gcodec.pltype);
1471 EXPECT_STREQ("ISAC", gcodec.plname);
1472 EXPECT_EQ(28000, gcodec.rate);
1473
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001474 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1475 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001476 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1477 EXPECT_EQ(0, gcodec.pltype);
1478 EXPECT_STREQ("PCMU", gcodec.plname);
1479 EXPECT_EQ(64000, gcodec.rate);
1480
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001481 parameters.codecs[0].bitrate = 0; // bitrate == default
1482 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001483 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1484 EXPECT_EQ(0, gcodec.pltype);
1485 EXPECT_STREQ("PCMU", gcodec.plname);
1486 EXPECT_EQ(64000, gcodec.rate);
1487
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001488 parameters.codecs[0] = kOpusCodec;
1489 parameters.codecs[0].bitrate = 0; // bitrate == default
1490 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001491 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1492 EXPECT_EQ(111, gcodec.pltype);
1493 EXPECT_STREQ("opus", gcodec.plname);
1494 EXPECT_EQ(32000, gcodec.rate);
1495}
1496
Brave Yao5225dd82015-03-26 07:39:19 +08001497// Test that we could set packet size specified in kCodecParamPTime.
1498TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
1499 EXPECT_TRUE(SetupEngine());
1500 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001501 cricket::AudioSendParameters parameters;
1502 parameters.codecs.push_back(kOpusCodec);
1503 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1504 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001505 webrtc::CodecInst gcodec;
1506 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1507 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1508
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001509 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1510 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001511 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1512 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1513
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001514 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1515 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001516 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1517 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1518
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001519 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1520 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1521 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001522 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1523 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1524
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001525 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1526 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1527 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001528 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1529 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1530}
1531
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001532// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001533TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
1534 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001535 cricket::AudioSendParameters parameters;
1536 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001537}
1538
1539// Test that we can set send codecs even with telephone-event codec as the first
1540// one on the list.
1541TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
1542 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001543 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001544 cricket::AudioSendParameters parameters;
1545 parameters.codecs.push_back(kTelephoneEventCodec);
1546 parameters.codecs.push_back(kIsacCodec);
1547 parameters.codecs.push_back(kPcmuCodec);
1548 parameters.codecs[0].id = 98; // DTMF
1549 parameters.codecs[1].id = 96;
1550 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001551 webrtc::CodecInst gcodec;
1552 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001553 EXPECT_EQ(96, gcodec.pltype);
1554 EXPECT_STREQ("ISAC", gcodec.plname);
1555 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1556}
1557
1558// Test that we can set send codecs even with CN codec as the first
1559// one on the list.
1560TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
1561 EXPECT_TRUE(SetupEngine());
1562 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001563 cricket::AudioSendParameters parameters;
1564 parameters.codecs.push_back(kCn16000Codec);
1565 parameters.codecs.push_back(kIsacCodec);
1566 parameters.codecs.push_back(kPcmuCodec);
1567 parameters.codecs[0].id = 98; // wideband CN
1568 parameters.codecs[1].id = 96;
1569 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001570 webrtc::CodecInst gcodec;
1571 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1572 EXPECT_EQ(96, gcodec.pltype);
1573 EXPECT_STREQ("ISAC", gcodec.plname);
1574 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001575}
1576
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001577// Test that we set VAD and DTMF types correctly as caller.
1578TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001579 EXPECT_TRUE(SetupEngine());
1580 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001581 cricket::AudioSendParameters parameters;
1582 parameters.codecs.push_back(kIsacCodec);
1583 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001584 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001585 parameters.codecs.push_back(kCn16000Codec);
1586 parameters.codecs.push_back(kCn8000Codec);
1587 parameters.codecs.push_back(kTelephoneEventCodec);
1588 parameters.codecs.push_back(kRedCodec);
1589 parameters.codecs[0].id = 96;
1590 parameters.codecs[2].id = 97; // wideband CN
1591 parameters.codecs[4].id = 98; // DTMF
1592 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001593 webrtc::CodecInst gcodec;
1594 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1595 EXPECT_EQ(96, gcodec.pltype);
1596 EXPECT_STREQ("ISAC", gcodec.plname);
1597 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001598 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001599 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1600 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1601 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1602}
1603
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001604// Test that we set VAD and DTMF types correctly as callee.
1605TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001606 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001607 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001608 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001609
1610 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001611 cricket::AudioSendParameters parameters;
1612 parameters.codecs.push_back(kIsacCodec);
1613 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001614 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001615 parameters.codecs.push_back(kCn16000Codec);
1616 parameters.codecs.push_back(kCn8000Codec);
1617 parameters.codecs.push_back(kTelephoneEventCodec);
1618 parameters.codecs.push_back(kRedCodec);
1619 parameters.codecs[0].id = 96;
1620 parameters.codecs[2].id = 97; // wideband CN
1621 parameters.codecs[4].id = 98; // DTMF
1622 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001623 EXPECT_TRUE(channel_->AddSendStream(
1624 cricket::StreamParams::CreateLegacy(kSsrc1)));
1625
1626 webrtc::CodecInst gcodec;
1627 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1628 EXPECT_EQ(96, gcodec.pltype);
1629 EXPECT_STREQ("ISAC", gcodec.plname);
1630 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001631 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001632 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1633 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1634 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1635}
1636
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001637// Test that we only apply VAD if we have a CN codec that matches the
1638// send codec clockrate.
1639TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
1640 EXPECT_TRUE(SetupEngine());
1641 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001642 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001643 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001644 parameters.codecs.push_back(kIsacCodec);
1645 parameters.codecs.push_back(kCn16000Codec);
1646 parameters.codecs[1].id = 97;
1647 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001648 webrtc::CodecInst gcodec;
1649 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1650 EXPECT_STREQ("ISAC", gcodec.plname);
1651 EXPECT_TRUE(voe_.GetVAD(channel_num));
1652 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1653 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001654 parameters.codecs[0] = kPcmuCodec;
1655 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001656 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1657 EXPECT_STREQ("PCMU", gcodec.plname);
1658 EXPECT_FALSE(voe_.GetVAD(channel_num));
1659 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001660 parameters.codecs[1] = kCn8000Codec;
1661 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001662 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1663 EXPECT_STREQ("PCMU", gcodec.plname);
1664 EXPECT_TRUE(voe_.GetVAD(channel_num));
1665 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001666 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001667 parameters.codecs[0] = kIsacCodec;
1668 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001669 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1670 EXPECT_STREQ("ISAC", gcodec.plname);
1671 EXPECT_FALSE(voe_.GetVAD(channel_num));
1672}
1673
1674// Test that we perform case-insensitive matching of codec names.
1675TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
1676 EXPECT_TRUE(SetupEngine());
1677 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001678 cricket::AudioSendParameters parameters;
1679 parameters.codecs.push_back(kIsacCodec);
1680 parameters.codecs.push_back(kPcmuCodec);
1681 parameters.codecs.push_back(kCn16000Codec);
1682 parameters.codecs.push_back(kCn8000Codec);
1683 parameters.codecs.push_back(kTelephoneEventCodec);
1684 parameters.codecs.push_back(kRedCodec);
1685 parameters.codecs[0].name = "iSaC";
1686 parameters.codecs[0].id = 96;
1687 parameters.codecs[2].id = 97; // wideband CN
1688 parameters.codecs[4].id = 98; // DTMF
1689 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001690 webrtc::CodecInst gcodec;
1691 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1692 EXPECT_EQ(96, gcodec.pltype);
1693 EXPECT_STREQ("ISAC", gcodec.plname);
1694 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001695 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001696 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1697 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1698 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1699}
1700
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001701// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001702TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001703 EXPECT_TRUE(SetupEngine());
1704 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001705 cricket::AudioSendParameters parameters;
1706 parameters.codecs.push_back(kRedCodec);
1707 parameters.codecs.push_back(kIsacCodec);
1708 parameters.codecs.push_back(kPcmuCodec);
1709 parameters.codecs[0].id = 127;
1710 parameters.codecs[0].params[""] = "96/96";
1711 parameters.codecs[1].id = 96;
1712 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001713 webrtc::CodecInst gcodec;
1714 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1715 EXPECT_EQ(96, gcodec.pltype);
1716 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001717 EXPECT_TRUE(voe_.GetRED(channel_num));
1718 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001719}
1720
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001721// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001722TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001723 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001724 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001725 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001726
1727 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001728 cricket::AudioSendParameters parameters;
1729 parameters.codecs.push_back(kRedCodec);
1730 parameters.codecs.push_back(kIsacCodec);
1731 parameters.codecs.push_back(kPcmuCodec);
1732 parameters.codecs[0].id = 127;
1733 parameters.codecs[0].params[""] = "96/96";
1734 parameters.codecs[1].id = 96;
1735 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001736 EXPECT_TRUE(channel_->AddSendStream(
1737 cricket::StreamParams::CreateLegacy(kSsrc1)));
1738 webrtc::CodecInst gcodec;
1739 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1740 EXPECT_EQ(96, gcodec.pltype);
1741 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001742 EXPECT_TRUE(voe_.GetRED(channel_num));
1743 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001744}
1745
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001746// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001747TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
1748 EXPECT_TRUE(SetupEngine());
1749 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001750 cricket::AudioSendParameters parameters;
1751 parameters.codecs.push_back(kRedCodec);
1752 parameters.codecs.push_back(kIsacCodec);
1753 parameters.codecs.push_back(kPcmuCodec);
1754 parameters.codecs[0].id = 127;
1755 parameters.codecs[1].id = 96;
1756 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001757 webrtc::CodecInst gcodec;
1758 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1759 EXPECT_EQ(96, gcodec.pltype);
1760 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001761 EXPECT_TRUE(voe_.GetRED(channel_num));
1762 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001763}
1764
1765// Test that we ignore RED if the parameters aren't named the way we expect.
1766TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
1767 EXPECT_TRUE(SetupEngine());
1768 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001769 cricket::AudioSendParameters parameters;
1770 parameters.codecs.push_back(kRedCodec);
1771 parameters.codecs.push_back(kIsacCodec);
1772 parameters.codecs.push_back(kPcmuCodec);
1773 parameters.codecs[0].id = 127;
1774 parameters.codecs[0].params["ABC"] = "96/96";
1775 parameters.codecs[1].id = 96;
1776 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001777 webrtc::CodecInst gcodec;
1778 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1779 EXPECT_EQ(96, gcodec.pltype);
1780 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001781 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001782}
1783
1784// Test that we ignore RED if it uses different primary/secondary encoding.
1785TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
1786 EXPECT_TRUE(SetupEngine());
1787 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001788 cricket::AudioSendParameters parameters;
1789 parameters.codecs.push_back(kRedCodec);
1790 parameters.codecs.push_back(kIsacCodec);
1791 parameters.codecs.push_back(kPcmuCodec);
1792 parameters.codecs[0].id = 127;
1793 parameters.codecs[0].params[""] = "96/0";
1794 parameters.codecs[1].id = 96;
1795 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001796 webrtc::CodecInst gcodec;
1797 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1798 EXPECT_EQ(96, gcodec.pltype);
1799 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001800 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001801}
1802
1803// Test that we ignore RED if it uses more than 2 encodings.
1804TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
1805 EXPECT_TRUE(SetupEngine());
1806 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001807 cricket::AudioSendParameters parameters;
1808 parameters.codecs.push_back(kRedCodec);
1809 parameters.codecs.push_back(kIsacCodec);
1810 parameters.codecs.push_back(kPcmuCodec);
1811 parameters.codecs[0].id = 127;
1812 parameters.codecs[0].params[""] = "96/96/96";
1813 parameters.codecs[1].id = 96;
1814 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001815 webrtc::CodecInst gcodec;
1816 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1817 EXPECT_EQ(96, gcodec.pltype);
1818 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001819 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001820}
1821
1822// Test that we ignore RED if it has bogus codec ids.
1823TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
1824 EXPECT_TRUE(SetupEngine());
1825 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001826 cricket::AudioSendParameters parameters;
1827 parameters.codecs.push_back(kRedCodec);
1828 parameters.codecs.push_back(kIsacCodec);
1829 parameters.codecs.push_back(kPcmuCodec);
1830 parameters.codecs[0].id = 127;
1831 parameters.codecs[0].params[""] = "ABC/ABC";
1832 parameters.codecs[1].id = 96;
1833 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001834 webrtc::CodecInst gcodec;
1835 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1836 EXPECT_EQ(96, gcodec.pltype);
1837 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001838 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001839}
1840
1841// Test that we ignore RED if it refers to a codec that is not present.
1842TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
1843 EXPECT_TRUE(SetupEngine());
1844 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001845 cricket::AudioSendParameters parameters;
1846 parameters.codecs.push_back(kRedCodec);
1847 parameters.codecs.push_back(kIsacCodec);
1848 parameters.codecs.push_back(kPcmuCodec);
1849 parameters.codecs[0].id = 127;
1850 parameters.codecs[0].params[""] = "97/97";
1851 parameters.codecs[1].id = 96;
1852 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001853 webrtc::CodecInst gcodec;
1854 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1855 EXPECT_EQ(96, gcodec.pltype);
1856 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001857 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001858}
1859
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001860// Test support for audio level header extension.
1861TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1862 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001863}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001864TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1865 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1866}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001867
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001868// Test support for absolute send time header extension.
1869TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1870 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1871}
1872TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1873 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001874}
1875
1876// Test that we can create a channel and start sending/playing out on it.
1877TEST_F(WebRtcVoiceEngineTestFake, SendAndPlayout) {
1878 EXPECT_TRUE(SetupEngine());
1879 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001880 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001881 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1882 EXPECT_TRUE(voe_.GetSend(channel_num));
1883 EXPECT_TRUE(channel_->SetPlayout(true));
1884 EXPECT_TRUE(voe_.GetPlayout(channel_num));
1885 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1886 EXPECT_FALSE(voe_.GetSend(channel_num));
1887 EXPECT_TRUE(channel_->SetPlayout(false));
1888 EXPECT_FALSE(voe_.GetPlayout(channel_num));
1889}
1890
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001891// Test that we can add and remove send streams.
1892TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
1893 SetupForMultiSendStream();
1894
1895 static const uint32 kSsrcs4[] = {1, 2, 3, 4};
1896
1897 // Set the global state for sending.
1898 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1899
1900 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1901 EXPECT_TRUE(channel_->AddSendStream(
1902 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1903
1904 // Verify that we are in a sending state for all the created streams.
1905 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1906 EXPECT_TRUE(voe_.GetSend(channel_num));
1907 }
1908
1909 // Remove the first send channel, which is the default channel. It will only
1910 // recycle the default channel but not delete it.
1911 EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[0]));
1912 // Stream should already be Removed from the send stream list.
1913 EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[0]));
1914 // But the default still exists.
1915 EXPECT_EQ(0, voe_.GetChannelFromLocalSsrc(kSsrcs4[0]));
1916
1917 // Delete the rest of send channel streams.
1918 for (unsigned int i = 1; i < ARRAY_SIZE(kSsrcs4); ++i) {
1919 EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[i]));
1920 // Stream should already be deleted.
1921 EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[i]));
1922 EXPECT_EQ(-1, voe_.GetChannelFromLocalSsrc(kSsrcs4[i]));
1923 }
1924}
1925
1926// Test SetSendCodecs correctly configure the codecs in all send streams.
1927TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
1928 SetupForMultiSendStream();
1929
1930 static const uint32 kSsrcs4[] = {1, 2, 3, 4};
1931 // Create send streams.
1932 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1933 EXPECT_TRUE(channel_->AddSendStream(
1934 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1935 }
1936
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001937 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001938 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001939 parameters.codecs.push_back(kIsacCodec);
1940 parameters.codecs.push_back(kCn16000Codec);
1941 parameters.codecs[1].id = 97;
1942 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001943
1944 // Verify ISAC and VAD are corrected configured on all send channels.
1945 webrtc::CodecInst gcodec;
1946 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1947 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1948 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1949 EXPECT_STREQ("ISAC", gcodec.plname);
1950 EXPECT_TRUE(voe_.GetVAD(channel_num));
1951 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1952 }
1953
1954 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001955 parameters.codecs[0] = kPcmuCodec;
1956 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001957 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1958 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1959 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1960 EXPECT_STREQ("PCMU", gcodec.plname);
1961 EXPECT_FALSE(voe_.GetVAD(channel_num));
1962 }
1963}
1964
1965// Test we can SetSend on all send streams correctly.
1966TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
1967 SetupForMultiSendStream();
1968
1969 static const uint32 kSsrcs4[] = {1, 2, 3, 4};
1970 // Create the send channels and they should be a SEND_NOTHING date.
1971 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1972 EXPECT_TRUE(channel_->AddSendStream(
1973 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1974 int channel_num = voe_.GetLastChannel();
1975 EXPECT_FALSE(voe_.GetSend(channel_num));
1976 }
1977
1978 // Set the global state for starting sending.
1979 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1980 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1981 // Verify that we are in a sending state for all the send streams.
1982 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1983 EXPECT_TRUE(voe_.GetSend(channel_num));
1984 }
1985
1986 // Set the global state for stopping sending.
1987 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1988 for (unsigned int i = 1; i < ARRAY_SIZE(kSsrcs4); ++i) {
1989 // Verify that we are in a stop state for all the send streams.
1990 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1991 EXPECT_FALSE(voe_.GetSend(channel_num));
1992 }
1993}
1994
1995// Test we can set the correct statistics on all send streams.
1996TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
1997 SetupForMultiSendStream();
1998
1999 static const uint32 kSsrcs4[] = {1, 2, 3, 4};
2000 // Create send streams.
2001 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
2002 EXPECT_TRUE(channel_->AddSendStream(
2003 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
2004 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002005 // Create a receive stream to check that none of the send streams end up in
2006 // the receive stream stats.
2007 EXPECT_TRUE(channel_->AddRecvStream(
2008 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002009 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002010 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2011 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002012
2013 cricket::VoiceMediaInfo info;
2014 EXPECT_EQ(true, channel_->GetStats(&info));
2015 EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size());
2016
2017 // Verify the statistic information is correct.
2018 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +00002019 EXPECT_EQ(kSsrcs4[i], info.senders[i].ssrc());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002020 EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
2021 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].bytes_sent);
2022 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_sent);
2023 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_lost);
2024 EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[i].fraction_lost);
2025 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].ext_seqnum);
2026 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].rtt_ms);
2027 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].jitter_ms);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002028 EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002029 }
2030
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002031 EXPECT_EQ(0u, info.receivers.size());
2032 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2033 EXPECT_EQ(true, channel_->GetStats(&info));
2034
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002035 EXPECT_EQ(1u, info.receivers.size());
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002036 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd);
2037 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd);
2038 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost);
2039 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum);
2040 EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name);
minyue@webrtc.orgc0bd7be2015-02-18 15:24:13 +00002041 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentExpandRate) /
2042 (1 << 14), info.receivers[0].expand_rate);
2043 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSpeechExpandRate) /
2044 (1 << 14), info.receivers[0].speech_expand_rate);
2045 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSecondaryDecodedRate) /
2046 (1 << 14), info.receivers[0].secondary_decoded_rate);
Henrik Lundin8e6fd462015-06-02 09:24:52 +02002047 EXPECT_EQ(
2048 static_cast<float>(cricket::kNetStats.currentAccelerateRate) / (1 << 14),
2049 info.receivers[0].accelerate_rate);
2050 EXPECT_EQ(
2051 static_cast<float>(cricket::kNetStats.currentPreemptiveRate) / (1 << 14),
2052 info.receivers[0].preemptive_expand_rate);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002053}
2054
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002055// Test that we can add and remove receive streams, and do proper send/playout.
2056// We can receive on multiple streams while sending one stream.
2057TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002058 EXPECT_TRUE(SetupEngine());
2059 int channel_num1 = voe_.GetLastChannel();
2060
2061 // Start playout on the default channel.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002062 send_parameters_.options = options_conference_;
2063 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002064 EXPECT_TRUE(channel_->SetPlayout(true));
2065 EXPECT_TRUE(voe_.GetPlayout(channel_num1));
2066
2067 // Adding another stream should disable playout on the default channel.
2068 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2069 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002070 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2071 EXPECT_TRUE(voe_.GetSend(channel_num1));
2072 EXPECT_FALSE(voe_.GetSend(channel_num2));
2073
2074 // Make sure only the new channel is played out.
2075 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2076 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2077
2078 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2079 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2080 int channel_num3 = voe_.GetLastChannel();
2081 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2082 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2083 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2084 EXPECT_FALSE(voe_.GetSend(channel_num3));
2085
2086 // Stop sending.
2087 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2088 EXPECT_FALSE(voe_.GetSend(channel_num1));
2089 EXPECT_FALSE(voe_.GetSend(channel_num2));
2090 EXPECT_FALSE(voe_.GetSend(channel_num3));
2091
2092 // Stop playout.
2093 EXPECT_TRUE(channel_->SetPlayout(false));
2094 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2095 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2096 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2097
2098 // Restart playout and make sure the default channel still is not played out.
2099 EXPECT_TRUE(channel_->SetPlayout(true));
2100 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2101 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2102 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2103
2104 // Now remove the new streams and verify that the default channel is
2105 // played out again.
2106 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2107 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2108
2109 EXPECT_TRUE(voe_.GetPlayout(channel_num1));
2110}
2111
2112// Test that we can set the devices to use.
2113TEST_F(WebRtcVoiceEngineTestFake, SetDevices) {
2114 EXPECT_TRUE(SetupEngine());
2115 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002116 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002117
2118 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2119 cricket::kFakeDefaultDeviceId);
2120 cricket::Device dev(cricket::kFakeDeviceName,
2121 cricket::kFakeDeviceId);
2122
2123 // Test SetDevices() while not sending or playing.
2124 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2125
2126 // Test SetDevices() while sending and playing.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002127 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2128 EXPECT_TRUE(channel_->SetPlayout(true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002129 EXPECT_TRUE(voe_.GetSend(channel_num));
2130 EXPECT_TRUE(voe_.GetPlayout(channel_num));
2131
2132 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2133
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002134 EXPECT_TRUE(voe_.GetSend(channel_num));
2135 EXPECT_TRUE(voe_.GetPlayout(channel_num));
2136
2137 // Test that failure to open newly selected devices does not prevent opening
2138 // ones after that.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002139 voe_.set_playout_fail_channel(channel_num);
2140 voe_.set_send_fail_channel(channel_num);
2141
2142 EXPECT_FALSE(engine_.SetDevices(&default_dev, &default_dev));
2143
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002144 EXPECT_FALSE(voe_.GetSend(channel_num));
2145 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2146
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002147 voe_.set_playout_fail_channel(-1);
2148 voe_.set_send_fail_channel(-1);
2149
2150 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2151
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002152 EXPECT_TRUE(voe_.GetSend(channel_num));
2153 EXPECT_TRUE(voe_.GetPlayout(channel_num));
2154}
2155
2156// Test that we can set the devices to use even if we failed to
2157// open the initial ones.
2158TEST_F(WebRtcVoiceEngineTestFake, SetDevicesWithInitiallyBadDevices) {
2159 EXPECT_TRUE(SetupEngine());
2160 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002161 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002162
2163 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2164 cricket::kFakeDefaultDeviceId);
2165 cricket::Device dev(cricket::kFakeDeviceName,
2166 cricket::kFakeDeviceId);
2167
2168 // Test that failure to open devices selected before starting
2169 // send/play does not prevent opening newly selected ones after that.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002170 voe_.set_playout_fail_channel(channel_num);
2171 voe_.set_send_fail_channel(channel_num);
2172
2173 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2174
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002175 EXPECT_FALSE(channel_->SetSend(cricket::SEND_MICROPHONE));
2176 EXPECT_FALSE(channel_->SetPlayout(true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002177 EXPECT_FALSE(voe_.GetSend(channel_num));
2178 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2179
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002180 voe_.set_playout_fail_channel(-1);
2181 voe_.set_send_fail_channel(-1);
2182
2183 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2184
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002185 EXPECT_TRUE(voe_.GetSend(channel_num));
2186 EXPECT_TRUE(voe_.GetPlayout(channel_num));
2187}
2188
2189// Test that we can create a channel configured for multi-point conferences,
2190// and start sending/playing out on it.
2191TEST_F(WebRtcVoiceEngineTestFake, ConferenceSendAndPlayout) {
2192 EXPECT_TRUE(SetupEngine());
2193 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002194 send_parameters_.options = options_conference_;
2195 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002196 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2197 EXPECT_TRUE(voe_.GetSend(channel_num));
2198}
2199
2200// Test that we can create a channel configured for Codian bridges,
2201// and start sending/playing out on it.
2202TEST_F(WebRtcVoiceEngineTestFake, CodianSendAndPlayout) {
2203 EXPECT_TRUE(SetupEngine());
2204 int channel_num = voe_.GetLastChannel();
2205 webrtc::AgcConfig agc_config;
2206 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2207 EXPECT_EQ(0, agc_config.targetLeveldBOv);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002208 send_parameters_.options = options_adjust_agc_;
2209 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002210 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2211 EXPECT_TRUE(voe_.GetSend(channel_num));
2212 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2213 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
2214 EXPECT_TRUE(channel_->SetPlayout(true));
2215 EXPECT_TRUE(voe_.GetPlayout(channel_num));
2216 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2217 EXPECT_FALSE(voe_.GetSend(channel_num));
2218 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2219 EXPECT_EQ(0, agc_config.targetLeveldBOv); // level was restored
2220 EXPECT_TRUE(channel_->SetPlayout(false));
2221 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2222}
2223
wu@webrtc.org97077a32013-10-25 21:18:33 +00002224TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
2225 EXPECT_TRUE(SetupEngine());
2226 webrtc::AgcConfig agc_config;
2227 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2228 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2229
2230 cricket::AudioOptions options;
2231 options.tx_agc_target_dbov.Set(3);
2232 options.tx_agc_digital_compression_gain.Set(9);
2233 options.tx_agc_limiter.Set(true);
2234 options.auto_gain_control.Set(true);
2235 EXPECT_TRUE(engine_.SetOptions(options));
2236
2237 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2238 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2239 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2240 EXPECT_TRUE(agc_config.limiterEnable);
2241
2242 // Check interaction with adjust_agc_delta. Both should be respected, for
2243 // backwards compatibility.
2244 options.adjust_agc_delta.Set(-10);
2245 EXPECT_TRUE(engine_.SetOptions(options));
2246
2247 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2248 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2249}
2250
2251TEST_F(WebRtcVoiceEngineTestFake, RxAgcConfigViaOptions) {
2252 EXPECT_TRUE(SetupEngine());
2253 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002254 send_parameters_.options.rx_agc_target_dbov.Set(6);
2255 send_parameters_.options.rx_agc_digital_compression_gain.Set(0);
2256 send_parameters_.options.rx_agc_limiter.Set(true);
2257 send_parameters_.options.rx_auto_gain_control.Set(true);
2258 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002259
2260 webrtc::AgcConfig agc_config;
2261 EXPECT_EQ(0, engine_.voe()->processing()->GetRxAgcConfig(
2262 channel_num, agc_config));
2263 EXPECT_EQ(6, agc_config.targetLeveldBOv);
2264 EXPECT_EQ(0, agc_config.digitalCompressionGaindB);
2265 EXPECT_TRUE(agc_config.limiterEnable);
2266}
2267
2268TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
2269 EXPECT_TRUE(SetupEngine());
2270 cricket::AudioOptions options;
2271 options.recording_sample_rate.Set(48000u);
2272 options.playout_sample_rate.Set(44100u);
2273 EXPECT_TRUE(engine_.SetOptions(options));
2274
2275 unsigned int recording_sample_rate, playout_sample_rate;
2276 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2277 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2278 EXPECT_EQ(48000u, recording_sample_rate);
2279 EXPECT_EQ(44100u, playout_sample_rate);
2280}
2281
2282TEST_F(WebRtcVoiceEngineTestFake, TraceFilterViaTraceOptions) {
2283 EXPECT_TRUE(SetupEngine());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002284 engine_.SetLogging(rtc::LS_INFO, "");
wu@webrtc.org97077a32013-10-25 21:18:33 +00002285 EXPECT_EQ(
2286 // Info:
2287 webrtc::kTraceStateInfo | webrtc::kTraceInfo |
2288 // Warning:
2289 webrtc::kTraceTerseInfo | webrtc::kTraceWarning |
2290 // Error:
2291 webrtc::kTraceError | webrtc::kTraceCritical,
2292 static_cast<int>(trace_wrapper_->filter_));
2293 // Now set it explicitly
2294 std::string filter =
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002295 "tracefilter " + rtc::ToString(webrtc::kTraceDefault);
2296 engine_.SetLogging(rtc::LS_VERBOSE, filter.c_str());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002297 EXPECT_EQ(static_cast<unsigned int>(webrtc::kTraceDefault),
2298 trace_wrapper_->filter_);
2299}
2300
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002301// Test that we can set the outgoing SSRC properly.
2302// SSRC is set in SetupEngine by calling AddSendStream.
2303TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
2304 EXPECT_TRUE(SetupEngine());
2305 int channel_num = voe_.GetLastChannel();
2306 unsigned int send_ssrc;
2307 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
2308 EXPECT_NE(0U, send_ssrc);
2309 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
2310 EXPECT_EQ(kSsrc1, send_ssrc);
2311}
2312
2313TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2314 // Setup. We need send codec to be set to get all stats.
2315 EXPECT_TRUE(SetupEngine());
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002316 // SetupEngine adds a send stream with kSsrc1, so the receive stream has to
2317 // use a different SSRC.
2318 EXPECT_TRUE(channel_->AddRecvStream(
2319 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002320 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2321 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002322
2323 cricket::VoiceMediaInfo info;
2324 EXPECT_EQ(true, channel_->GetStats(&info));
2325 EXPECT_EQ(1u, info.senders.size());
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +00002326 EXPECT_EQ(kSsrc1, info.senders[0].ssrc());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002327 EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
2328 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].bytes_sent);
2329 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_sent);
2330 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_lost);
2331 EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[0].fraction_lost);
2332 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].ext_seqnum);
2333 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].rtt_ms);
2334 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].jitter_ms);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002335 EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002336 // TODO(sriniv): Add testing for more fields. These are not populated
2337 // in FakeWebrtcVoiceEngine yet.
2338 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].audio_level);
2339 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_median_ms);
2340 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_std_ms);
2341 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_return_loss);
2342 // EXPECT_EQ(cricket::kIntStatValue,
2343 // info.senders[0].echo_return_loss_enhancement);
2344
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002345 EXPECT_EQ(0u, info.receivers.size());
2346 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2347 EXPECT_EQ(true, channel_->GetStats(&info));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002348 EXPECT_EQ(1u, info.receivers.size());
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002349
2350 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd);
2351 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd);
2352 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost);
2353 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum);
2354 EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name);
minyue@webrtc.orgc0bd7be2015-02-18 15:24:13 +00002355 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentExpandRate) /
2356 (1 << 14), info.receivers[0].expand_rate);
2357 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSpeechExpandRate) /
2358 (1 << 14), info.receivers[0].speech_expand_rate);
2359 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSecondaryDecodedRate) /
2360 (1 << 14), info.receivers[0].secondary_decoded_rate);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002361 // TODO(sriniv): Add testing for more receiver fields.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002362}
2363
2364// Test that we can set the outgoing SSRC properly with multiple streams.
2365// SSRC is set in SetupEngine by calling AddSendStream.
2366TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
2367 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002368 int channel_num1 = voe_.GetLastChannel();
2369 unsigned int send_ssrc;
2370 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num1, send_ssrc));
2371 EXPECT_EQ(kSsrc1, send_ssrc);
2372
2373 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2374 int channel_num2 = voe_.GetLastChannel();
2375 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num2, send_ssrc));
2376 EXPECT_EQ(kSsrc1, send_ssrc);
2377}
2378
2379// Test that the local SSRC is the same on sending and receiving channels if the
2380// receive channel is created before the send channel.
2381TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002382 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002383 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002384
2385 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2386 int receive_channel_num = voe_.GetLastChannel();
2387 EXPECT_TRUE(channel_->AddSendStream(
2388 cricket::StreamParams::CreateLegacy(1234)));
2389 int send_channel_num = voe_.GetLastChannel();
2390
2391 unsigned int ssrc = 0;
2392 EXPECT_EQ(0, voe_.GetLocalSSRC(send_channel_num, ssrc));
2393 EXPECT_EQ(1234U, ssrc);
2394 ssrc = 0;
2395 EXPECT_EQ(0, voe_.GetLocalSSRC(receive_channel_num, ssrc));
2396 EXPECT_EQ(1234U, ssrc);
2397}
2398
2399// Test that we can properly receive packets.
2400TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2401 EXPECT_TRUE(SetupEngine());
2402 int channel_num = voe_.GetLastChannel();
2403 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2404 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame,
2405 sizeof(kPcmuFrame)));
2406}
2407
2408// Test that we can properly receive packets on multiple streams.
2409TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
2410 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002411 send_parameters_.options = options_conference_;
2412 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002413 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2414 int channel_num1 = voe_.GetLastChannel();
2415 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2416 int channel_num2 = voe_.GetLastChannel();
2417 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2418 int channel_num3 = voe_.GetLastChannel();
2419 // Create packets with the right SSRCs.
2420 char packets[4][sizeof(kPcmuFrame)];
2421 for (size_t i = 0; i < ARRAY_SIZE(packets); ++i) {
2422 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002423 rtc::SetBE32(packets[i] + 8, static_cast<uint32>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002424 }
2425 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2426 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2427 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2428 DeliverPacket(packets[0], sizeof(packets[0]));
2429 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2430 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2431 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2432 DeliverPacket(packets[1], sizeof(packets[1]));
2433 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1],
2434 sizeof(packets[1])));
2435 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2436 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2437 DeliverPacket(packets[2], sizeof(packets[2]));
2438 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2439 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2],
2440 sizeof(packets[2])));
2441 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2442 DeliverPacket(packets[3], sizeof(packets[3]));
2443 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2444 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2445 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3],
2446 sizeof(packets[3])));
2447 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2448 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2449 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2450}
2451
2452// Test that we properly handle failures to add a stream.
2453TEST_F(WebRtcVoiceEngineTestFake, AddStreamFail) {
2454 EXPECT_TRUE(SetupEngine());
2455 voe_.set_fail_create_channel(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002456 send_parameters_.options = options_conference_;
2457 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002458 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2459
2460 // In 1:1 call, we should not try to create a new channel.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002461 send_parameters_.options.conference_mode.Set(false);
2462 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002463 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2464}
2465
2466// Test that AddRecvStream doesn't create new channel for 1:1 call.
2467TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream1On1) {
2468 EXPECT_TRUE(SetupEngine());
2469 int channel_num = voe_.GetLastChannel();
2470 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2471 EXPECT_EQ(channel_num, voe_.GetLastChannel());
2472}
2473
2474// Test that after adding a recv stream, we do not decode more codecs than
2475// those previously passed into SetRecvCodecs.
2476TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
2477 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002478 cricket::AudioRecvParameters parameters;
2479 parameters.codecs.push_back(kIsacCodec);
2480 parameters.codecs.push_back(kPcmuCodec);
2481 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002482 EXPECT_TRUE(channel_->AddRecvStream(
2483 cricket::StreamParams::CreateLegacy(kSsrc1)));
2484 int channel_num2 = voe_.GetLastChannel();
2485 webrtc::CodecInst gcodec;
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002486 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "opus");
2487 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002488 gcodec.channels = 2;
2489 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2490}
2491
2492// Test that we properly clean up any streams that were added, even if
2493// not explicitly removed.
2494TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
2495 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002496 send_parameters_.options = options_conference_;
2497 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002498 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2499 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2500 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2501 delete channel_;
2502 channel_ = NULL;
2503 EXPECT_EQ(0, voe_.GetNumChannels());
2504}
2505
wu@webrtc.org78187522013-10-07 23:32:02 +00002506TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
2507 EXPECT_TRUE(SetupEngine());
2508 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2509}
2510
2511TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2512 EXPECT_TRUE(SetupEngine());
2513 // Stream 1 reuses default channel.
2514 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2515 // Manually delete default channel to simulate a failure.
2516 int default_channel = voe_.GetLastChannel();
2517 EXPECT_EQ(0, voe_.DeleteChannel(default_channel));
2518 // Add recv stream 2 should fail because default channel is gone.
2519 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2520 int new_channel = voe_.GetLastChannel();
2521 EXPECT_NE(default_channel, new_channel);
2522 // The last created channel should have already been deleted.
2523 EXPECT_EQ(-1, voe_.DeleteChannel(new_channel));
2524}
2525
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002526// Test the InsertDtmf on default send stream as caller.
2527TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2528 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002529}
2530
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002531// Test the InsertDtmf on default send stream as callee
2532TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2533 TestInsertDtmf(0, false);
2534}
2535
2536// Test the InsertDtmf on specified send stream as caller.
2537TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2538 TestInsertDtmf(kSsrc1, true);
2539}
2540
2541// Test the InsertDtmf on specified send stream as callee.
2542TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2543 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002544}
2545
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002546TEST_F(WebRtcVoiceEngineTestFake, MediaEngineCallbackOnError) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002547 rtc::scoped_ptr<ChannelErrorListener> listener;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002548 cricket::WebRtcVoiceMediaChannel* media_channel;
2549 unsigned int ssrc = 0;
2550
2551 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002552 send_parameters_.options = options_conference_;
2553 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002554 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2555
2556 media_channel = static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2557 listener.reset(new ChannelErrorListener(channel_));
2558
2559 // Test on WebRtc VoE channel.
2560 voe_.TriggerCallbackOnError(media_channel->voe_channel(),
2561 VE_SATURATION_WARNING);
2562 EXPECT_EQ(cricket::VoiceMediaChannel::ERROR_REC_DEVICE_SATURATION,
2563 listener->error());
2564 EXPECT_NE(-1, voe_.GetLocalSSRC(voe_.GetLastChannel(), ssrc));
2565 EXPECT_EQ(ssrc, listener->ssrc());
2566
2567 listener->Reset();
2568 voe_.TriggerCallbackOnError(-1, VE_TYPING_NOISE_WARNING);
2569 EXPECT_EQ(cricket::VoiceMediaChannel::ERROR_REC_TYPING_NOISE_DETECTED,
2570 listener->error());
2571 EXPECT_EQ(0U, listener->ssrc());
2572
2573 // Add another stream and test on that.
2574 ++ssrc;
2575 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(
2576 ssrc)));
2577 listener->Reset();
2578 voe_.TriggerCallbackOnError(voe_.GetLastChannel(),
2579 VE_SATURATION_WARNING);
2580 EXPECT_EQ(cricket::VoiceMediaChannel::ERROR_REC_DEVICE_SATURATION,
2581 listener->error());
2582 EXPECT_EQ(ssrc, listener->ssrc());
2583
2584 // Testing a non-existing channel.
2585 listener->Reset();
2586 voe_.TriggerCallbackOnError(voe_.GetLastChannel() + 2,
2587 VE_SATURATION_WARNING);
2588 EXPECT_EQ(0, listener->error());
2589}
2590
2591TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
2592 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002593 send_parameters_.options = options_conference_;
2594 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002595 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2596 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2597 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2598 EXPECT_TRUE(channel_->SetPlayout(true));
2599 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2600 EXPECT_TRUE(channel_->SetPlayout(false));
2601 EXPECT_FALSE(channel_->SetPlayout(true));
2602}
2603
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002604TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
2605 EXPECT_TRUE(SetupEngine());
2606
2607 bool ec_enabled;
2608 webrtc::EcModes ec_mode;
2609 bool ec_metrics_enabled;
2610 webrtc::AecmModes aecm_mode;
2611 bool cng_enabled;
2612 bool agc_enabled;
2613 webrtc::AgcModes agc_mode;
2614 webrtc::AgcConfig agc_config;
2615 bool ns_enabled;
2616 webrtc::NsModes ns_mode;
2617 bool highpass_filter_enabled;
2618 bool stereo_swapping_enabled;
2619 bool typing_detection_enabled;
2620 voe_.GetEcStatus(ec_enabled, ec_mode);
2621 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2622 voe_.GetAecmMode(aecm_mode, cng_enabled);
2623 voe_.GetAgcStatus(agc_enabled, agc_mode);
2624 voe_.GetAgcConfig(agc_config);
2625 voe_.GetNsStatus(ns_enabled, ns_mode);
2626 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2627 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2628 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2629 EXPECT_TRUE(ec_enabled);
2630 EXPECT_TRUE(ec_metrics_enabled);
2631 EXPECT_FALSE(cng_enabled);
2632 EXPECT_TRUE(agc_enabled);
2633 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2634 EXPECT_TRUE(ns_enabled);
2635 EXPECT_TRUE(highpass_filter_enabled);
2636 EXPECT_FALSE(stereo_swapping_enabled);
2637 EXPECT_TRUE(typing_detection_enabled);
2638 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2639 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2640
2641 // Nothing set, so all ignored.
2642 cricket::AudioOptions options;
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002643 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002644 voe_.GetEcStatus(ec_enabled, ec_mode);
2645 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2646 voe_.GetAecmMode(aecm_mode, cng_enabled);
2647 voe_.GetAgcStatus(agc_enabled, agc_mode);
2648 voe_.GetAgcConfig(agc_config);
2649 voe_.GetNsStatus(ns_enabled, ns_mode);
2650 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2651 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2652 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2653 EXPECT_TRUE(ec_enabled);
2654 EXPECT_TRUE(ec_metrics_enabled);
2655 EXPECT_FALSE(cng_enabled);
2656 EXPECT_TRUE(agc_enabled);
2657 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2658 EXPECT_TRUE(ns_enabled);
2659 EXPECT_TRUE(highpass_filter_enabled);
2660 EXPECT_FALSE(stereo_swapping_enabled);
2661 EXPECT_TRUE(typing_detection_enabled);
2662 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2663 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
Henrik Lundin64dad832015-05-11 12:44:23 +02002664 EXPECT_EQ(50, voe_.GetNetEqCapacity()); // From GetDefaultEngineOptions().
Henrik Lundin5263b3c2015-06-01 10:29:41 +02002665 EXPECT_FALSE(
2666 voe_.GetNetEqFastAccelerate()); // From GetDefaultEngineOptions().
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002667
2668 // Turn echo cancellation off
2669 options.echo_cancellation.Set(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002670 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002671 voe_.GetEcStatus(ec_enabled, ec_mode);
2672 EXPECT_FALSE(ec_enabled);
2673
2674 // Turn echo cancellation back on, with settings, and make sure
2675 // nothing else changed.
2676 options.echo_cancellation.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002677 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002678 voe_.GetEcStatus(ec_enabled, ec_mode);
2679 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2680 voe_.GetAecmMode(aecm_mode, cng_enabled);
2681 voe_.GetAgcStatus(agc_enabled, agc_mode);
2682 voe_.GetAgcConfig(agc_config);
2683 voe_.GetNsStatus(ns_enabled, ns_mode);
2684 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2685 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2686 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2687 EXPECT_TRUE(ec_enabled);
2688 EXPECT_TRUE(ec_metrics_enabled);
2689 EXPECT_TRUE(agc_enabled);
2690 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2691 EXPECT_TRUE(ns_enabled);
2692 EXPECT_TRUE(highpass_filter_enabled);
2693 EXPECT_FALSE(stereo_swapping_enabled);
2694 EXPECT_TRUE(typing_detection_enabled);
2695 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2696 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2697
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002698 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2699 // control.
2700 options.delay_agnostic_aec.Set(true);
2701 ASSERT_TRUE(engine_.SetOptions(options));
2702 voe_.GetEcStatus(ec_enabled, ec_mode);
2703 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2704 voe_.GetAecmMode(aecm_mode, cng_enabled);
2705 EXPECT_TRUE(ec_enabled);
2706 EXPECT_TRUE(ec_metrics_enabled);
2707 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2708
2709 // Turn off echo cancellation and delay agnostic aec.
2710 options.delay_agnostic_aec.Set(false);
Henrik Lundin441f6342015-06-09 16:03:13 +02002711 options.extended_filter_aec.Set(false);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002712 options.echo_cancellation.Set(false);
2713 ASSERT_TRUE(engine_.SetOptions(options));
2714 voe_.GetEcStatus(ec_enabled, ec_mode);
2715 EXPECT_FALSE(ec_enabled);
2716 // Turning delay agnostic aec back on should also turn on echo cancellation.
2717 options.delay_agnostic_aec.Set(true);
2718 ASSERT_TRUE(engine_.SetOptions(options));
2719 voe_.GetEcStatus(ec_enabled, ec_mode);
2720 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2721 EXPECT_TRUE(ec_enabled);
2722 EXPECT_TRUE(ec_metrics_enabled);
2723 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2724
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002725 // Turn off AGC
2726 options.auto_gain_control.Set(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002727 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002728 voe_.GetAgcStatus(agc_enabled, agc_mode);
2729 EXPECT_FALSE(agc_enabled);
2730
2731 // Turn AGC back on
2732 options.auto_gain_control.Set(true);
2733 options.adjust_agc_delta.Clear();
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002734 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002735 voe_.GetAgcStatus(agc_enabled, agc_mode);
2736 EXPECT_TRUE(agc_enabled);
2737 voe_.GetAgcConfig(agc_config);
2738 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2739
2740 // Turn off other options (and stereo swapping on).
2741 options.noise_suppression.Set(false);
2742 options.highpass_filter.Set(false);
2743 options.typing_detection.Set(false);
2744 options.stereo_swapping.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002745 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002746 voe_.GetNsStatus(ns_enabled, ns_mode);
2747 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2748 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2749 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2750 EXPECT_FALSE(ns_enabled);
2751 EXPECT_FALSE(highpass_filter_enabled);
2752 EXPECT_FALSE(typing_detection_enabled);
2753 EXPECT_TRUE(stereo_swapping_enabled);
2754
2755 // Turn on "conference mode" to ensure it has no impact.
2756 options.conference_mode.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002757 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002758 voe_.GetEcStatus(ec_enabled, ec_mode);
2759 voe_.GetNsStatus(ns_enabled, ns_mode);
2760 EXPECT_TRUE(ec_enabled);
2761 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2762 EXPECT_FALSE(ns_enabled);
2763 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2764}
2765
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002766TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002767 EXPECT_TRUE(SetupEngine());
2768
2769 bool ec_enabled;
2770 webrtc::EcModes ec_mode;
2771 bool ec_metrics_enabled;
2772 bool agc_enabled;
2773 webrtc::AgcModes agc_mode;
2774 bool ns_enabled;
2775 webrtc::NsModes ns_mode;
2776 bool highpass_filter_enabled;
2777 bool stereo_swapping_enabled;
2778 bool typing_detection_enabled;
2779
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002780 voe_.GetEcStatus(ec_enabled, ec_mode);
2781 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2782 voe_.GetAgcStatus(agc_enabled, agc_mode);
2783 voe_.GetNsStatus(ns_enabled, ns_mode);
2784 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2785 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2786 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2787 EXPECT_TRUE(ec_enabled);
2788 EXPECT_TRUE(agc_enabled);
2789 EXPECT_TRUE(ns_enabled);
2790 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002791 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002792 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002793}
2794
2795TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2796 webrtc::AgcConfig set_config = {0};
2797 set_config.targetLeveldBOv = 3;
2798 set_config.digitalCompressionGaindB = 9;
2799 set_config.limiterEnable = true;
2800 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002801 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002802
2803 webrtc::AgcConfig config = {0};
2804 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2805 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2806 EXPECT_EQ(set_config.digitalCompressionGaindB,
2807 config.digitalCompressionGaindB);
2808 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2809}
2810
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002811TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
2812 EXPECT_TRUE(SetupEngine());
solenberg66f43392015-09-09 01:36:22 -07002813 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2814 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002815 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002816 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2817 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002818 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002819
2820 // Have to add a stream to make SetSend work.
2821 cricket::StreamParams stream1;
2822 stream1.ssrcs.push_back(1);
2823 channel1->AddSendStream(stream1);
2824 cricket::StreamParams stream2;
2825 stream2.ssrcs.push_back(2);
2826 channel2->AddSendStream(stream2);
2827
2828 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002829 cricket::AudioSendParameters parameters_options_all = send_parameters_;
2830 parameters_options_all.options.echo_cancellation.Set(true);
2831 parameters_options_all.options.auto_gain_control.Set(true);
2832 parameters_options_all.options.noise_suppression.Set(true);
2833 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2834 EXPECT_EQ(parameters_options_all.options, channel1->options());
2835 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2836 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002837
2838 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002839 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
2840 parameters_options_no_ns.options.noise_suppression.Set(false);
2841 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2842 cricket::AudioOptions expected_options = parameters_options_all.options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002843 expected_options.echo_cancellation.Set(true);
2844 expected_options.auto_gain_control.Set(true);
2845 expected_options.noise_suppression.Set(false);
solenberg66f43392015-09-09 01:36:22 -07002846 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002847
2848 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002849 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
2850 parameters_options_no_agc.options.auto_gain_control.Set(false);
2851 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002852 expected_options.echo_cancellation.Set(true);
2853 expected_options.auto_gain_control.Set(false);
2854 expected_options.noise_suppression.Set(true);
solenberg66f43392015-09-09 01:36:22 -07002855 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002856
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002857 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002858 bool ec_enabled;
2859 webrtc::EcModes ec_mode;
2860 bool agc_enabled;
2861 webrtc::AgcModes agc_mode;
2862 bool ns_enabled;
2863 webrtc::NsModes ns_mode;
2864 voe_.GetEcStatus(ec_enabled, ec_mode);
2865 voe_.GetAgcStatus(agc_enabled, agc_mode);
2866 voe_.GetNsStatus(ns_enabled, ns_mode);
2867 EXPECT_TRUE(ec_enabled);
2868 EXPECT_TRUE(agc_enabled);
2869 EXPECT_TRUE(ns_enabled);
2870
2871 channel1->SetSend(cricket::SEND_MICROPHONE);
2872 voe_.GetEcStatus(ec_enabled, ec_mode);
2873 voe_.GetAgcStatus(agc_enabled, agc_mode);
2874 voe_.GetNsStatus(ns_enabled, ns_mode);
2875 EXPECT_TRUE(ec_enabled);
2876 EXPECT_TRUE(agc_enabled);
2877 EXPECT_FALSE(ns_enabled);
2878
2879 channel1->SetSend(cricket::SEND_NOTHING);
2880 voe_.GetEcStatus(ec_enabled, ec_mode);
2881 voe_.GetAgcStatus(agc_enabled, agc_mode);
2882 voe_.GetNsStatus(ns_enabled, ns_mode);
2883 EXPECT_TRUE(ec_enabled);
2884 EXPECT_TRUE(agc_enabled);
2885 EXPECT_TRUE(ns_enabled);
2886
2887 channel2->SetSend(cricket::SEND_MICROPHONE);
2888 voe_.GetEcStatus(ec_enabled, ec_mode);
2889 voe_.GetAgcStatus(agc_enabled, agc_mode);
2890 voe_.GetNsStatus(ns_enabled, ns_mode);
2891 EXPECT_TRUE(ec_enabled);
2892 EXPECT_FALSE(agc_enabled);
2893 EXPECT_TRUE(ns_enabled);
2894
2895 channel2->SetSend(cricket::SEND_NOTHING);
2896 voe_.GetEcStatus(ec_enabled, ec_mode);
2897 voe_.GetAgcStatus(agc_enabled, agc_mode);
2898 voe_.GetNsStatus(ns_enabled, ns_mode);
2899 EXPECT_TRUE(ec_enabled);
2900 EXPECT_TRUE(agc_enabled);
2901 EXPECT_TRUE(ns_enabled);
2902
2903 // Make sure settings take effect while we are sending.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002904 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
2905 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2906 send_parameters_;
2907 parameters_options_no_agc_nor_ns.options.auto_gain_control.Set(false);
2908 parameters_options_no_agc_nor_ns.options.noise_suppression.Set(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002909 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002910 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002911 expected_options.echo_cancellation.Set(true);
2912 expected_options.auto_gain_control.Set(false);
2913 expected_options.noise_suppression.Set(false);
solenberg66f43392015-09-09 01:36:22 -07002914 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002915 voe_.GetEcStatus(ec_enabled, ec_mode);
2916 voe_.GetAgcStatus(agc_enabled, agc_mode);
2917 voe_.GetNsStatus(ns_enabled, ns_mode);
2918 EXPECT_TRUE(ec_enabled);
2919 EXPECT_FALSE(agc_enabled);
2920 EXPECT_FALSE(ns_enabled);
2921}
2922
wu@webrtc.orgde305012013-10-31 15:40:38 +00002923// This test verifies DSCP settings are properly applied on voice media channel.
2924TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
2925 EXPECT_TRUE(SetupEngine());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002926 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002927 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002928 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00002929 new cricket::FakeNetworkInterface);
2930 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002931 cricket::AudioSendParameters parameters = send_parameters_;
2932 parameters.options.dscp.Set(true);
2933 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002934 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00002935 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002936 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002937 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002938 parameters.options.dscp.Set(false);
2939 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002940 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00002941}
2942
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002943// Test that GetReceiveChannelNum returns the default channel for the first
2944// recv stream in 1-1 calls.
2945TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelNumIn1To1Calls) {
2946 EXPECT_TRUE(SetupEngine());
2947 cricket::WebRtcVoiceMediaChannel* media_channel =
2948 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2949 // Test that GetChannelNum returns the default channel if the SSRC is unknown.
2950 EXPECT_EQ(media_channel->voe_channel(),
2951 media_channel->GetReceiveChannelNum(0));
2952 cricket::StreamParams stream;
2953 stream.ssrcs.push_back(kSsrc2);
2954 EXPECT_TRUE(channel_->AddRecvStream(stream));
2955 EXPECT_EQ(media_channel->voe_channel(),
2956 media_channel->GetReceiveChannelNum(kSsrc2));
2957}
2958
2959// Test that GetReceiveChannelNum doesn't return the default channel for the
2960// first recv stream in conference calls.
2961TEST_F(WebRtcVoiceEngineTestFake, TestGetChannelNumInConferenceCalls) {
2962 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002963 send_parameters_.options = options_conference_;
2964 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002965 cricket::StreamParams stream;
2966 stream.ssrcs.push_back(kSsrc2);
2967 EXPECT_TRUE(channel_->AddRecvStream(stream));
2968 cricket::WebRtcVoiceMediaChannel* media_channel =
2969 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2970 EXPECT_LT(media_channel->voe_channel(),
2971 media_channel->GetReceiveChannelNum(kSsrc2));
2972}
2973
2974TEST_F(WebRtcVoiceEngineTestFake, SetOutputScaling) {
2975 EXPECT_TRUE(SetupEngine());
solenbergbb741b32015-09-07 03:56:38 -07002976 float scale, left, right;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002977 EXPECT_TRUE(channel_->SetOutputScaling(0, 1, 2));
solenbergbb741b32015-09-07 03:56:38 -07002978 int channel_id = voe_.GetLastChannel();
2979 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2980 EXPECT_EQ(0, voe_.GetOutputVolumePan(channel_id, left, right));
2981 EXPECT_DOUBLE_EQ(1, left * scale);
2982 EXPECT_DOUBLE_EQ(2, right * scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002983
2984 EXPECT_FALSE(channel_->SetOutputScaling(kSsrc2, 1, 2));
2985 cricket::StreamParams stream;
2986 stream.ssrcs.push_back(kSsrc2);
2987 EXPECT_TRUE(channel_->AddRecvStream(stream));
2988
2989 EXPECT_TRUE(channel_->SetOutputScaling(kSsrc2, 2, 1));
solenbergbb741b32015-09-07 03:56:38 -07002990 channel_id = voe_.GetLastChannel();
2991 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2992 EXPECT_EQ(0, voe_.GetOutputVolumePan(channel_id, left, right));
2993 EXPECT_DOUBLE_EQ(2, left * scale);
2994 EXPECT_DOUBLE_EQ(1, right * scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002995}
2996
pbos8fc7fa72015-07-15 08:02:58 -07002997TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
pbos8fc7fa72015-07-15 08:02:58 -07002998 const uint32 kAudioSsrc = 123;
2999 const std::string kSyncLabel = "AvSyncLabel";
3000
3001 EXPECT_TRUE(SetupEngine());
pbos8fc7fa72015-07-15 08:02:58 -07003002 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3003 sp.sync_label = kSyncLabel;
3004 // Creating two channels to make sure that sync label is set properly for both
3005 // the default voice channel and following ones.
3006 EXPECT_TRUE(channel_->AddRecvStream(sp));
3007 sp.ssrcs[0] += 1;
3008 EXPECT_TRUE(channel_->AddRecvStream(sp));
3009
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003010 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003011 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003012 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003013 << "SyncGroup should be set based on sync_label";
3014 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003015 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003016 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003017}
3018
pbos6bb1b6e2015-07-24 07:10:18 -07003019TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003020 // Test that changing the combined_audio_video_bwe option results in the
3021 // expected state changes on an associated Call.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003022 std::vector<uint32> ssrcs;
3023 ssrcs.push_back(223);
3024 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003025
3026 EXPECT_TRUE(SetupEngine());
3027 cricket::WebRtcVoiceMediaChannel* media_channel =
3028 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003029 for (uint32 ssrc : ssrcs) {
3030 EXPECT_TRUE(media_channel->AddRecvStream(
3031 cricket::StreamParams::CreateLegacy(ssrc)));
3032 }
3033 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003034
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003035 // Combined BWE should be disabled.
3036 for (uint32 ssrc : ssrcs) {
3037 const auto* s = call_.GetAudioReceiveStream(ssrc);
3038 EXPECT_NE(nullptr, s);
3039 EXPECT_EQ(false, s->GetConfig().combined_audio_video_bwe);
3040 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003041
3042 // Enable combined BWE option - now it should be set up.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003043 send_parameters_.options.combined_audio_video_bwe.Set(true);
3044 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003045 for (uint32 ssrc : ssrcs) {
3046 const auto* s = call_.GetAudioReceiveStream(ssrc);
3047 EXPECT_NE(nullptr, s);
3048 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
3049 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003050
3051 // Disable combined BWE option - should be disabled again.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003052 send_parameters_.options.combined_audio_video_bwe.Set(false);
3053 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003054 for (uint32 ssrc : ssrcs) {
3055 const auto* s = call_.GetAudioReceiveStream(ssrc);
3056 EXPECT_NE(nullptr, s);
3057 EXPECT_EQ(false, s->GetConfig().combined_audio_video_bwe);
3058 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003059
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003060 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003061}
3062
pbos6bb1b6e2015-07-24 07:10:18 -07003063TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003064 // Test that adding receive streams after enabling combined bandwidth
3065 // estimation will correctly configure each channel.
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003066 EXPECT_TRUE(SetupEngine());
3067 cricket::WebRtcVoiceMediaChannel* media_channel =
3068 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003069 send_parameters_.options.combined_audio_video_bwe.Set(true);
3070 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003071
3072 static const uint32 kSsrcs[] = {1, 2, 3, 4};
3073 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs); ++i) {
3074 EXPECT_TRUE(media_channel->AddRecvStream(
3075 cricket::StreamParams::CreateLegacy(kSsrcs[i])));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003076 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(kSsrcs[i]));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003077 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003078 EXPECT_EQ(ARRAY_SIZE(kSsrcs), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003079}
3080
pbos6bb1b6e2015-07-24 07:10:18 -07003081TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003082 // Test that setting the header extensions results in the expected state
3083 // changes on an associated Call.
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003084 std::vector<uint32> ssrcs;
3085 ssrcs.push_back(223);
3086 ssrcs.push_back(224);
3087
3088 EXPECT_TRUE(SetupEngine());
3089 cricket::WebRtcVoiceMediaChannel* media_channel =
3090 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003091 send_parameters_.options.combined_audio_video_bwe.Set(true);
3092 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003093 for (uint32 ssrc : ssrcs) {
3094 EXPECT_TRUE(media_channel->AddRecvStream(
3095 cricket::StreamParams::CreateLegacy(ssrc)));
3096 }
3097
3098 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003099 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003100 for (uint32 ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003101 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003102 EXPECT_NE(nullptr, s);
3103 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3104 }
3105
3106 // Set up receive extensions.
3107 const auto& e_exts = engine_.rtp_header_extensions();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003108 cricket::AudioRecvParameters recv_parameters;
3109 recv_parameters.extensions = e_exts;
3110 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003111 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003112 for (uint32 ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003113 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003114 EXPECT_NE(nullptr, s);
3115 const auto& s_exts = s->GetConfig().rtp.extensions;
3116 EXPECT_EQ(e_exts.size(), s_exts.size());
3117 for (const auto& e_ext : e_exts) {
3118 for (const auto& s_ext : s_exts) {
3119 if (e_ext.id == s_ext.id) {
3120 EXPECT_EQ(e_ext.uri, s_ext.name);
3121 }
3122 }
3123 }
3124 }
3125
3126 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003127 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003128 for (uint32 ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003129 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003130 EXPECT_NE(nullptr, s);
3131 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3132 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003133}
3134
3135TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3136 // Test that packets are forwarded to the Call when configured accordingly.
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003137 const uint32 kAudioSsrc = 1;
3138 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3139 static const unsigned char kRtcp[] = {
3140 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3141 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3143 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3144 };
3145 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3146
3147 EXPECT_TRUE(SetupEngine());
3148 cricket::WebRtcVoiceMediaChannel* media_channel =
3149 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003150 send_parameters_.options.combined_audio_video_bwe.Set(true);
3151 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003152 EXPECT_TRUE(media_channel->AddRecvStream(
3153 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3154
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003155 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003156 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003157 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003158 EXPECT_EQ(0, s->received_packets());
3159 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3160 EXPECT_EQ(1, s->received_packets());
3161 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3162 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003163}
Minyue2013aec2015-05-13 14:14:42 +02003164
3165// Associate channel should not set on 1:1 call, since the receive channel also
3166// sends RTCP SR.
3167TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelUnset1On1) {
3168 EXPECT_TRUE(SetupEngine());
3169 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3170 int recv_ch = voe_.GetLastChannel();
3171 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3172}
3173
3174// This test is an extension of AssociateChannelUnset1On1. We create two receive
3175// channels. The second should be associated with the default channel, since it
3176// does not send RTCP SR.
3177TEST_F(WebRtcVoiceEngineTestFake, AssociateDefaultChannelOnSecondRecvChannel) {
3178 EXPECT_TRUE(SetupEngine());
3179 cricket::WebRtcVoiceMediaChannel* media_channel =
3180 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3181 int default_channel = media_channel->voe_channel();
3182 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3183 int recv_ch_1 = voe_.GetLastChannel();
3184 EXPECT_EQ(recv_ch_1, default_channel);
3185 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
3186 int recv_ch_2 = voe_.GetLastChannel();
3187 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_1), -1);
3188 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_2), default_channel);
3189 // Add send stream, the association remains.
3190 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(3)));
3191 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_1), -1);
3192 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_2), default_channel);
3193}
3194
3195// In conference mode, all receive channels should be associated with the
3196// default channel, since they do not send RTCP SR.
3197TEST_F(WebRtcVoiceEngineTestFake, AssociateDefaultChannelOnConference) {
3198 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003199 send_parameters_.options = options_conference_;
3200 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003201 cricket::WebRtcVoiceMediaChannel* media_channel =
3202 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3203 int default_channel = media_channel->voe_channel();
3204 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3205 int recv_ch = voe_.GetLastChannel();
3206 EXPECT_NE(recv_ch, default_channel);
3207 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3208 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3209 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3210}
3211
3212TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
3213 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003214 send_parameters_.options = options_conference_;
3215 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003216
3217 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3218 int recv_ch = voe_.GetLastChannel();
3219
3220 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3221 int send_ch = voe_.GetLastChannel();
3222
3223 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3224 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3225 // channel of |recv_ch|.This is not a common case, since, normally, only the
3226 // default channel can be associated. However, the default is not deletable.
3227 // So we force the |recv_ch| to associate with a non-default channel.
3228 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3229 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3230
3231 EXPECT_TRUE(channel_->RemoveSendStream(2));
3232 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3233}
stefan658910c2015-09-03 05:48:32 -07003234
3235// Tests for the actual WebRtc VoE library.
3236
3237TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
3238 cricket::WebRtcVoiceEngine engine;
3239 cricket::AudioOptions options = engine.GetOptions();
3240 // The default options should have at least a few things set. We purposefully
3241 // don't check the option values here, though.
3242 EXPECT_TRUE(options.echo_cancellation.IsSet());
3243 EXPECT_TRUE(options.auto_gain_control.IsSet());
3244 EXPECT_TRUE(options.noise_suppression.IsSet());
3245}
3246
3247// Tests that the library initializes and shuts down properly.
3248TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3249 cricket::WebRtcVoiceEngine engine;
3250 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003251 rtc::scoped_ptr<webrtc::Call> call(
3252 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003253 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003254 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003255 EXPECT_TRUE(channel != nullptr);
3256 delete channel;
3257 engine.Terminate();
3258
3259 // Reinit to catch regression where VoiceEngineObserver reference is lost
3260 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3261 engine.Terminate();
3262}
3263
3264// Tests that the library is configured with the codecs we want.
3265TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
3266 cricket::WebRtcVoiceEngine engine;
3267 // Check codecs by name.
3268 EXPECT_TRUE(engine.FindCodec(
3269 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0)));
3270 EXPECT_TRUE(engine.FindCodec(
3271 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0)));
3272 EXPECT_TRUE(engine.FindCodec(
3273 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0)));
3274 // Check that name matching is case-insensitive.
3275 EXPECT_TRUE(engine.FindCodec(
3276 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0)));
3277 EXPECT_TRUE(engine.FindCodec(
3278 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0)));
3279 EXPECT_TRUE(engine.FindCodec(
3280 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0)));
3281 EXPECT_TRUE(engine.FindCodec(
3282 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0)));
3283 EXPECT_TRUE(engine.FindCodec(
3284 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0)));
3285 EXPECT_TRUE(engine.FindCodec(
3286 cricket::AudioCodec(96, "red", 8000, 0, 1, 0)));
3287 EXPECT_TRUE(engine.FindCodec(
3288 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0)));
3289 EXPECT_TRUE(engine.FindCodec(
3290 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0)));
3291 EXPECT_TRUE(engine.FindCodec(
3292 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0)));
3293 EXPECT_TRUE(engine.FindCodec(
3294 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0)));
3295 // Check codecs with an id by id.
3296 EXPECT_TRUE(engine.FindCodec(
3297 cricket::AudioCodec(0, "", 8000, 0, 1, 0))); // PCMU
3298 EXPECT_TRUE(engine.FindCodec(
3299 cricket::AudioCodec(8, "", 8000, 0, 1, 0))); // PCMA
3300 EXPECT_TRUE(engine.FindCodec(
3301 cricket::AudioCodec(9, "", 8000, 0, 1, 0))); // G722
3302 EXPECT_TRUE(engine.FindCodec(
3303 cricket::AudioCodec(13, "", 8000, 0, 1, 0))); // CN
3304 // Check sample/bitrate matching.
3305 EXPECT_TRUE(engine.FindCodec(
3306 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0)));
3307 // Check that bad codecs fail.
3308 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0)));
3309 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(88, "", 0, 0, 1, 0)));
3310 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 0, 2, 0)));
3311 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 5000, 0, 1, 0)));
3312 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 5000, 1, 0)));
3313 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3314 for (std::vector<cricket::AudioCodec>::const_iterator it =
3315 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3316 if (it->name == "CN" && it->clockrate == 16000) {
3317 EXPECT_EQ(105, it->id);
3318 } else if (it->name == "CN" && it->clockrate == 32000) {
3319 EXPECT_EQ(106, it->id);
3320 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3321 EXPECT_EQ(103, it->id);
3322 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3323 EXPECT_EQ(104, it->id);
3324 } else if (it->name == "G722" && it->clockrate == 8000) {
3325 EXPECT_EQ(9, it->id);
3326 } else if (it->name == "telephone-event") {
3327 EXPECT_EQ(126, it->id);
3328 } else if (it->name == "red") {
3329 EXPECT_EQ(127, it->id);
3330 } else if (it->name == "opus") {
3331 EXPECT_EQ(111, it->id);
3332 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3333 EXPECT_EQ("10", it->params.find("minptime")->second);
3334 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3335 EXPECT_EQ("60", it->params.find("maxptime")->second);
3336 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3337 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3338 }
3339 }
3340
3341 engine.Terminate();
3342}
3343
3344// Tests that VoE supports at least 32 channels
3345TEST(WebRtcVoiceEngineTest, Has32Channels) {
3346 cricket::WebRtcVoiceEngine engine;
3347 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003348 rtc::scoped_ptr<webrtc::Call> call(
3349 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003350
3351 cricket::VoiceMediaChannel* channels[32];
3352 int num_channels = 0;
stefan658910c2015-09-03 05:48:32 -07003353 while (num_channels < ARRAY_SIZE(channels)) {
3354 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003355 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003356 if (!channel)
3357 break;
stefan658910c2015-09-03 05:48:32 -07003358 channels[num_channels++] = channel;
3359 }
3360
3361 int expected = ARRAY_SIZE(channels);
3362 EXPECT_EQ(expected, num_channels);
3363
3364 while (num_channels > 0) {
3365 delete channels[--num_channels];
3366 }
3367
3368 engine.Terminate();
3369}
3370
3371// Test that we set our preferred codecs properly.
3372TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3373 cricket::WebRtcVoiceEngine engine;
3374 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003375 rtc::scoped_ptr<webrtc::Call> call(
3376 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003377 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3378 call.get());
3379 cricket::AudioRecvParameters parameters;
3380 parameters.codecs = engine.codecs();
3381 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003382}