blob: fc373db916a361b9b8ffa19938f2e5a2ef0e9291 [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
2 * libjingle
3 * Copyright 2008 Google Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000027
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000028#include "webrtc/base/byteorder.h"
29#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020030#include "webrtc/call.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000031#include "talk/media/base/constants.h"
32#include "talk/media/base/fakemediaengine.h"
33#include "talk/media/base/fakemediaprocessor.h"
wu@webrtc.orgde305012013-10-31 15:40:38 +000034#include "talk/media/base/fakenetworkinterface.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035#include "talk/media/base/fakertp.h"
Fredrik Solenberg4b60c732015-05-07 14:07:48 +020036#include "talk/media/webrtc/fakewebrtccall.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000037#include "talk/media/webrtc/fakewebrtcvoiceengine.h"
38#include "talk/media/webrtc/webrtcvoiceengine.h"
Guo-wei Shieh89024332015-09-18 13:50:22 -070039#include "webrtc/p2p/base/fakesession.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000040#include "talk/session/media/channel.h"
41
42// Tests for the WebRtcVoiceEngine/VoiceChannel code.
43
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000044using cricket::kRtpAudioLevelHeaderExtension;
45using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
46
henrike@webrtc.org28e20752013-07-10 00:45:36 +000047static const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
48static const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000049static const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +000050static const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
51static const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052static const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
53static const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
54static const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
55static const cricket::AudioCodec
56 kTelephoneEventCodec(106, "telephone-event", 8000, 0, 1, 0);
57static const cricket::AudioCodec* const kAudioCodecs[] = {
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +000058 &kPcmuCodec, &kIsacCodec, &kOpusCodec, &kG722CodecVoE, &kRedCodec,
59 &kCn8000Codec, &kCn16000Codec, &kTelephoneEventCodec,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060};
61const char kRingbackTone[] = "RIFF____WAVE____ABCD1234";
62static uint32 kSsrc1 = 0x99;
63static uint32 kSsrc2 = 0x98;
64
65class FakeVoEWrapper : public cricket::VoEWrapper {
66 public:
67 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
68 : cricket::VoEWrapper(engine, // processing
69 engine, // base
70 engine, // codec
71 engine, // dtmf
72 engine, // file
73 engine, // hw
74 engine, // media
75 engine, // neteq
76 engine, // network
77 engine, // rtp
78 engine, // sync
79 engine) { // volume
80 }
81};
82
wu@webrtc.org97077a32013-10-25 21:18:33 +000083class FakeVoETraceWrapper : public cricket::VoETraceWrapper {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000084 public:
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +020085 int SetTraceFilter(const unsigned int filter) override {
wu@webrtc.org97077a32013-10-25 21:18:33 +000086 filter_ = filter;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000087 return 0;
88 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +020089 int SetTraceFile(const char* fileNameUTF8) override { return 0; }
90 int SetTraceCallback(webrtc::TraceCallback* callback) override { return 0; }
wu@webrtc.org97077a32013-10-25 21:18:33 +000091 unsigned int filter_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000092};
93
94class WebRtcVoiceEngineTestFake : public testing::Test {
95 public:
96 class ChannelErrorListener : public sigslot::has_slots<> {
97 public:
98 explicit ChannelErrorListener(cricket::VoiceMediaChannel* channel)
99 : ssrc_(0), error_(cricket::VoiceMediaChannel::ERROR_NONE) {
henrikg91d6ede2015-09-17 00:24:34 -0700100 RTC_DCHECK(channel != NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000101 channel->SignalMediaError.connect(
102 this, &ChannelErrorListener::OnVoiceChannelError);
103 }
104 void OnVoiceChannelError(uint32 ssrc,
105 cricket::VoiceMediaChannel::Error error) {
106 ssrc_ = ssrc;
107 error_ = error;
108 }
109 void Reset() {
110 ssrc_ = 0;
111 error_ = cricket::VoiceMediaChannel::ERROR_NONE;
112 }
113 uint32 ssrc() const {
114 return ssrc_;
115 }
116 cricket::VoiceMediaChannel::Error error() const {
117 return error_;
118 }
119
120 private:
121 uint32 ssrc_;
122 cricket::VoiceMediaChannel::Error error_;
123 };
124
125 WebRtcVoiceEngineTestFake()
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200126 : call_(webrtc::Call::Config()),
127 voe_(kAudioCodecs, ARRAY_SIZE(kAudioCodecs)),
wu@webrtc.org97077a32013-10-25 21:18:33 +0000128 trace_wrapper_(new FakeVoETraceWrapper()),
Jelena Marusicc28a8962015-05-29 15:05:44 +0200129 engine_(new FakeVoEWrapper(&voe_), trace_wrapper_),
130 channel_(nullptr) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200131 send_parameters_.codecs.push_back(kPcmuCodec);
132 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000133 options_conference_.conference_mode.Set(true);
134 options_adjust_agc_.adjust_agc_delta.Set(-10);
135 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000136 bool SetupEngineWithoutStream() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000137 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000138 return false;
139 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200140 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200141 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000142 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000143 bool SetupEngine() {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000144 if (!SetupEngineWithoutStream()) {
145 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000146 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000147 return channel_->AddSendStream(
148 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000149 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000150 void SetupForMultiSendStream() {
151 EXPECT_TRUE(SetupEngine());
152 // Remove stream added in Setup, which is corresponding to default channel.
153 int default_channel_num = voe_.GetLastChannel();
henrike@webrtc.org7666db72013-08-22 14:45:42 +0000154 uint32 default_send_ssrc = 0u;
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000155 EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
156 EXPECT_EQ(kSsrc1, default_send_ssrc);
157 EXPECT_TRUE(channel_->RemoveSendStream(default_send_ssrc));
158
159 // Verify the default channel still exists.
160 EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
161 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000162 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200163 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000164 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000165 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200166 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000167 delete channel_;
168 engine_.Terminate();
169 }
170
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000171 void TestInsertDtmf(uint32 ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000172 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200173 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200174 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000175 if (caller) {
176 // if this is a caller, local description will be applied and add the
177 // send stream.
178 EXPECT_TRUE(channel_->AddSendStream(
179 cricket::StreamParams::CreateLegacy(kSsrc1)));
180 }
181 int channel_id = voe_.GetLastChannel();
182
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000183 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200184 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000185 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
186 EXPECT_FALSE(channel_->CanInsertDtmf());
187 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111, cricket::DF_SEND));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200188 send_parameters_.codecs.push_back(kTelephoneEventCodec);
189 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000190 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000191
192 if (!caller) {
193 // There's no active send channel yet.
194 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
195 EXPECT_TRUE(channel_->AddSendStream(
196 cricket::StreamParams::CreateLegacy(kSsrc1)));
197 }
198
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000199 // Check we fail if the ssrc is invalid.
200 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111, cricket::DF_SEND));
201
202 // Test send
203 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
204 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
205 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
206
207 // Test play
208 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(3, 134));
209 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 3, 134, cricket::DF_PLAY));
210 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(3, 134));
211
212 // Test send and play
213 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
214 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(4, 145));
215 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 4, 145,
216 cricket::DF_PLAY | cricket::DF_SEND));
217 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
218 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(4, 145));
219 }
220
221 // Test that send bandwidth is set correctly.
222 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000223 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
224 // |expected_result| is the expected result from SetMaxSendBandwidth().
225 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000226 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000227 int max_bitrate,
228 bool expected_result,
229 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200230 cricket::AudioSendParameters parameters;
231 parameters.codecs.push_back(codec);
232 parameters.max_bandwidth_bps = max_bitrate;
233 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
234
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000235 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000236 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000237 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000238 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000239 }
240
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000241 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
242 EXPECT_TRUE(SetupEngineWithoutStream());
243 int channel_num = voe_.GetLastChannel();
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000244
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000245 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000246 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000247
248 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200249 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000250 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200251 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000252 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000253
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000254 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200255 send_parameters_.extensions.clear();
256 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000257 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000258
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000259 // Ensure extension is set properly.
260 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200261 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
262 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000263 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000264
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000265 // Ensure extension is set properly on new channel.
266 // The first stream to occupy the default channel.
267 EXPECT_TRUE(channel_->AddSendStream(
268 cricket::StreamParams::CreateLegacy(123)));
269 EXPECT_TRUE(channel_->AddSendStream(
270 cricket::StreamParams::CreateLegacy(234)));
271 int new_channel_num = voe_.GetLastChannel();
272 EXPECT_NE(channel_num, new_channel_num);
273 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000274
275 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200276 send_parameters_.codecs.push_back(kPcmuCodec);
277 send_parameters_.extensions.clear();
278 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000279 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
280 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000281 }
282
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000283 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
284 EXPECT_TRUE(SetupEngineWithoutStream());
285 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000286
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000287 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000288 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000289
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200290 cricket::AudioRecvParameters parameters;
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000291 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200292 parameters.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000293 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200294 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000295 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000296
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000297 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200298 parameters.extensions.clear();
299 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000300 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000301
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000302 // Ensure extension is set properly.
303 const int id = 2;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200304 parameters.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
305 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000306 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000307
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000308 // Ensure extension is set properly on new channel.
309 // The first stream to occupy the default channel.
310 EXPECT_TRUE(channel_->AddRecvStream(
311 cricket::StreamParams::CreateLegacy(345)));
312 EXPECT_TRUE(channel_->AddRecvStream(
313 cricket::StreamParams::CreateLegacy(456)));
314 int new_channel_num = voe_.GetLastChannel();
315 EXPECT_NE(channel_num, new_channel_num);
316 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
317
318 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200319 parameters.extensions.clear();
320 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000321 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
322 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000323 }
324
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000325 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200326 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000327 cricket::FakeWebRtcVoiceEngine voe_;
wu@webrtc.org97077a32013-10-25 21:18:33 +0000328 FakeVoETraceWrapper* trace_wrapper_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000329 cricket::WebRtcVoiceEngine engine_;
330 cricket::VoiceMediaChannel* channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000331
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200332 cricket::AudioSendParameters send_parameters_;
333 cricket::AudioRecvParameters recv_parameters_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000334 cricket::AudioOptions options_conference_;
335 cricket::AudioOptions options_adjust_agc_;
336};
337
338// Tests that our stub library "works".
339TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
340 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000341 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000342 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000343 engine_.Terminate();
344 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000345}
346
347// Tests that we can create and destroy a channel.
348TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000349 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200350 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200351 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000352}
353
354// Tests that we properly handle failures in CreateChannel.
355TEST_F(WebRtcVoiceEngineTestFake, CreateChannelFail) {
356 voe_.set_fail_create_channel(true);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000357 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200358 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200359 EXPECT_TRUE(channel_ == nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000360}
361
362// Tests that the list of supported codecs is created properly and ordered
363// correctly
364TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
365 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
366 ASSERT_FALSE(codecs.empty());
367 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
368 EXPECT_EQ(48000, codecs[0].clockrate);
369 EXPECT_EQ(2, codecs[0].channels);
370 EXPECT_EQ(64000, codecs[0].bitrate);
371 int pref = codecs[0].preference;
372 for (size_t i = 1; i < codecs.size(); ++i) {
373 EXPECT_GT(pref, codecs[i].preference);
374 pref = codecs[i].preference;
375 }
376}
377
378// Tests that we can find codecs by name or id, and that we interpret the
379// clockrate and bitrate fields properly.
380TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
381 cricket::AudioCodec codec;
382 webrtc::CodecInst codec_inst;
383 // Find PCMU with explicit clockrate and bitrate.
384 EXPECT_TRUE(engine_.FindWebRtcCodec(kPcmuCodec, &codec_inst));
385 // Find ISAC with explicit clockrate and 0 bitrate.
386 EXPECT_TRUE(engine_.FindWebRtcCodec(kIsacCodec, &codec_inst));
387 // Find telephone-event with explicit clockrate and 0 bitrate.
388 EXPECT_TRUE(engine_.FindWebRtcCodec(kTelephoneEventCodec, &codec_inst));
389 // Find ISAC with a different payload id.
390 codec = kIsacCodec;
391 codec.id = 127;
392 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
393 EXPECT_EQ(codec.id, codec_inst.pltype);
394 // Find PCMU with a 0 clockrate.
395 codec = kPcmuCodec;
396 codec.clockrate = 0;
397 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
398 EXPECT_EQ(codec.id, codec_inst.pltype);
399 EXPECT_EQ(8000, codec_inst.plfreq);
400 // Find PCMU with a 0 bitrate.
401 codec = kPcmuCodec;
402 codec.bitrate = 0;
403 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
404 EXPECT_EQ(codec.id, codec_inst.pltype);
405 EXPECT_EQ(64000, codec_inst.rate);
406 // Find ISAC with an explicit bitrate.
407 codec = kIsacCodec;
408 codec.bitrate = 32000;
409 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
410 EXPECT_EQ(codec.id, codec_inst.pltype);
411 EXPECT_EQ(32000, codec_inst.rate);
412}
413
414// Test that we set our inbound codecs properly, including changing PT.
415TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
416 EXPECT_TRUE(SetupEngine());
417 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200418 cricket::AudioRecvParameters parameters;
419 parameters.codecs.push_back(kIsacCodec);
420 parameters.codecs.push_back(kPcmuCodec);
421 parameters.codecs.push_back(kTelephoneEventCodec);
422 parameters.codecs[0].id = 106; // collide with existing telephone-event
423 parameters.codecs[2].id = 126;
424 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000425 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000426 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000427 gcodec.plfreq = 16000;
428 gcodec.channels = 1;
429 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
430 EXPECT_EQ(106, gcodec.pltype);
431 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000432 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000433 "telephone-event");
434 gcodec.plfreq = 8000;
435 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
436 EXPECT_EQ(126, gcodec.pltype);
437 EXPECT_STREQ("telephone-event", gcodec.plname);
438}
439
440// Test that we fail to set an unknown inbound codec.
441TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
442 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200443 cricket::AudioRecvParameters parameters;
444 parameters.codecs.push_back(kIsacCodec);
445 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
446 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000447}
448
449// Test that we fail if we have duplicate types in the inbound list.
450TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
451 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200452 cricket::AudioRecvParameters parameters;
453 parameters.codecs.push_back(kIsacCodec);
454 parameters.codecs.push_back(kCn16000Codec);
455 parameters.codecs[1].id = kIsacCodec.id;
456 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000457}
458
459// Test that we can decode OPUS without stereo parameters.
460TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
461 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200462 cricket::AudioRecvParameters parameters;
463 parameters.codecs.push_back(kIsacCodec);
464 parameters.codecs.push_back(kPcmuCodec);
465 parameters.codecs.push_back(kOpusCodec);
466 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000467 EXPECT_TRUE(channel_->AddRecvStream(
468 cricket::StreamParams::CreateLegacy(kSsrc1)));
469 int channel_num2 = voe_.GetLastChannel();
470 webrtc::CodecInst opus;
471 engine_.FindWebRtcCodec(kOpusCodec, &opus);
472 // Even without stereo parameters, recv codecs still specify channels = 2.
473 EXPECT_EQ(2, opus.channels);
474 EXPECT_EQ(111, opus.pltype);
475 EXPECT_STREQ("opus", opus.plname);
476 opus.pltype = 0;
477 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
478 EXPECT_EQ(111, opus.pltype);
479}
480
481// Test that we can decode OPUS with stereo = 0.
482TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
483 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200484 cricket::AudioRecvParameters parameters;
485 parameters.codecs.push_back(kIsacCodec);
486 parameters.codecs.push_back(kPcmuCodec);
487 parameters.codecs.push_back(kOpusCodec);
488 parameters.codecs[2].params["stereo"] = "0";
489 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000490 EXPECT_TRUE(channel_->AddRecvStream(
491 cricket::StreamParams::CreateLegacy(kSsrc1)));
492 int channel_num2 = voe_.GetLastChannel();
493 webrtc::CodecInst opus;
494 engine_.FindWebRtcCodec(kOpusCodec, &opus);
495 // Even when stereo is off, recv codecs still specify channels = 2.
496 EXPECT_EQ(2, opus.channels);
497 EXPECT_EQ(111, opus.pltype);
498 EXPECT_STREQ("opus", opus.plname);
499 opus.pltype = 0;
500 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
501 EXPECT_EQ(111, opus.pltype);
502}
503
504// Test that we can decode OPUS with stereo = 1.
505TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
506 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200507 cricket::AudioRecvParameters parameters;
508 parameters.codecs.push_back(kIsacCodec);
509 parameters.codecs.push_back(kPcmuCodec);
510 parameters.codecs.push_back(kOpusCodec);
511 parameters.codecs[2].params["stereo"] = "1";
512 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000513 EXPECT_TRUE(channel_->AddRecvStream(
514 cricket::StreamParams::CreateLegacy(kSsrc1)));
515 int channel_num2 = voe_.GetLastChannel();
516 webrtc::CodecInst opus;
517 engine_.FindWebRtcCodec(kOpusCodec, &opus);
518 EXPECT_EQ(2, opus.channels);
519 EXPECT_EQ(111, opus.pltype);
520 EXPECT_STREQ("opus", opus.plname);
521 opus.pltype = 0;
522 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
523 EXPECT_EQ(111, opus.pltype);
524}
525
526// Test that changes to recv codecs are applied to all streams.
527TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
528 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200529 cricket::AudioRecvParameters parameters;
530 parameters.codecs.push_back(kIsacCodec);
531 parameters.codecs.push_back(kPcmuCodec);
532 parameters.codecs.push_back(kTelephoneEventCodec);
533 parameters.codecs[0].id = 106; // collide with existing telephone-event
534 parameters.codecs[2].id = 126;
535 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000536 EXPECT_TRUE(channel_->AddRecvStream(
537 cricket::StreamParams::CreateLegacy(kSsrc1)));
538 int channel_num2 = voe_.GetLastChannel();
539 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000540 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000541 gcodec.plfreq = 16000;
542 gcodec.channels = 1;
543 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
544 EXPECT_EQ(106, gcodec.pltype);
545 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000546 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000547 "telephone-event");
548 gcodec.plfreq = 8000;
549 gcodec.channels = 1;
550 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
551 EXPECT_EQ(126, gcodec.pltype);
552 EXPECT_STREQ("telephone-event", gcodec.plname);
553}
554
555TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
556 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200557 cricket::AudioRecvParameters parameters;
558 parameters.codecs.push_back(kIsacCodec);
559 parameters.codecs[0].id = 106; // collide with existing telephone-event
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000560 EXPECT_TRUE(channel_->AddRecvStream(
561 cricket::StreamParams::CreateLegacy(kSsrc1)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200562 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000563
564 int channel_num2 = voe_.GetLastChannel();
565 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000566 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000567 gcodec.plfreq = 16000;
568 gcodec.channels = 1;
569 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
570 EXPECT_EQ(106, gcodec.pltype);
571 EXPECT_STREQ("ISAC", gcodec.plname);
572}
573
574// Test that we can apply the same set of codecs again while playing.
575TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
576 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200577 cricket::AudioRecvParameters parameters;
578 parameters.codecs.push_back(kIsacCodec);
579 parameters.codecs.push_back(kCn16000Codec);
580 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000581 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200582 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000583
584 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200585 parameters.codecs[0].id = 127;
586 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
587 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000588 EXPECT_TRUE(voe_.GetPlayout(channel_num));
589}
590
591// Test that we can add a codec while playing.
592TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
593 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200594 cricket::AudioRecvParameters parameters;
595 parameters.codecs.push_back(kIsacCodec);
596 parameters.codecs.push_back(kCn16000Codec);
597 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000598 EXPECT_TRUE(channel_->SetPlayout(true));
599
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200600 parameters.codecs.push_back(kOpusCodec);
601 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
602 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000603 EXPECT_TRUE(voe_.GetPlayout(channel_num));
604 webrtc::CodecInst gcodec;
605 EXPECT_TRUE(engine_.FindWebRtcCodec(kOpusCodec, &gcodec));
606 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
607}
608
609TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
610 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000611
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000612 // Test that when autobw is enabled, bitrate is kept as the default
613 // value. autobw is enabled for the following tests because the target
614 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000615
616 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000617 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000618
619 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000620 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000621
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000622 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000623 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000624}
625
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000626TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000627 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000628
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000629 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000630
631 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000632 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
633 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000634
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000635 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000636 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
637 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000638}
639
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000640TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
641 EXPECT_TRUE(SetupEngine());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000642
643 // Test that we can only set a maximum bitrate for a fixed-rate codec
644 // if it's bigger than the fixed rate.
645
646 // PCMU, fixed bitrate == 64000.
647 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
648 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
649 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
650 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
651 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
652 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
653 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
654}
655
656TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200657 EXPECT_TRUE(SetupEngineWithoutStream());
658 const int kDesiredBitrate = 128000;
659 cricket::AudioSendParameters parameters;
660 parameters.codecs = engine_.codecs();
661 parameters.max_bandwidth_bps = kDesiredBitrate;
662 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000663
664 EXPECT_TRUE(channel_->AddSendStream(
665 cricket::StreamParams::CreateLegacy(kSsrc1)));
666
667 int channel_num = voe_.GetLastChannel();
668 webrtc::CodecInst codec;
669 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200670 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000671}
672
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000673// Test that bitrate cannot be set for CBR codecs.
674// Bitrate is ignored if it is higher than the fixed bitrate.
675// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000676TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000677 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000678
679 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200680 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
681 int channel_num = voe_.GetLastChannel();
682 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000683 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
684 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200685
686 send_parameters_.max_bandwidth_bps = 128000;
687 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000688 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
689 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200690
691 send_parameters_.max_bandwidth_bps = 128;
692 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000693 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
694 EXPECT_EQ(64000, codec.rate);
695}
696
697// Test that we apply codecs properly.
698TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
699 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200700 cricket::AudioSendParameters parameters;
701 parameters.codecs.push_back(kIsacCodec);
702 parameters.codecs.push_back(kPcmuCodec);
703 parameters.codecs.push_back(kRedCodec);
704 parameters.codecs[0].id = 96;
705 parameters.codecs[0].bitrate = 48000;
706 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000707 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200708 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000709 webrtc::CodecInst gcodec;
710 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
711 EXPECT_EQ(96, gcodec.pltype);
712 EXPECT_EQ(48000, gcodec.rate);
713 EXPECT_STREQ("ISAC", gcodec.plname);
714 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000715 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000716 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
717 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
718 EXPECT_EQ(106, voe_.GetSendTelephoneEventPayloadType(channel_num));
719}
720
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000721// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
722// to apply.
723TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
724 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200725 cricket::AudioSendParameters parameters;
726 parameters.codecs.push_back(kIsacCodec);
727 parameters.codecs.push_back(kPcmuCodec);
728 parameters.codecs.push_back(kRedCodec);
729 parameters.codecs[0].id = 96;
730 parameters.codecs[0].bitrate = 48000;
731 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000732 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
733 // Calling SetSendCodec again with same codec which is already set.
734 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200735 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000736 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
737}
738
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000739// Verify that G722 is set with 16000 samples per second to WebRTC.
740TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
741 EXPECT_TRUE(SetupEngine());
742 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200743 cricket::AudioSendParameters parameters;
744 parameters.codecs.push_back(kG722CodecSdp);
745 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000746 webrtc::CodecInst gcodec;
747 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
748 EXPECT_STREQ("G722", gcodec.plname);
749 EXPECT_EQ(1, gcodec.channels);
750 EXPECT_EQ(16000, gcodec.plfreq);
751}
752
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000753// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000754TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
755 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200756 cricket::AudioSendParameters parameters;
757 parameters.codecs.push_back(kOpusCodec);
758 parameters.codecs[0].bitrate = 0;
759 parameters.codecs[0].clockrate = 50000;
760 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000761}
762
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000763// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000764TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
765 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200766 cricket::AudioSendParameters parameters;
767 parameters.codecs.push_back(kOpusCodec);
768 parameters.codecs[0].bitrate = 0;
769 parameters.codecs[0].channels = 0;
770 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000771}
772
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000773// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000774TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
775 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200776 cricket::AudioSendParameters parameters;
777 parameters.codecs.push_back(kOpusCodec);
778 parameters.codecs[0].bitrate = 0;
779 parameters.codecs[0].channels = 0;
780 parameters.codecs[0].params["stereo"] = "1";
781 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000782}
783
784// Test that if channel is 1 for opus and there's no stereo, we fail.
785TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
786 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200787 cricket::AudioSendParameters parameters;
788 parameters.codecs.push_back(kOpusCodec);
789 parameters.codecs[0].bitrate = 0;
790 parameters.codecs[0].channels = 1;
791 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000792}
793
794// Test that if channel is 1 for opus and stereo=0, we fail.
795TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
796 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200797 cricket::AudioSendParameters parameters;
798 parameters.codecs.push_back(kOpusCodec);
799 parameters.codecs[0].bitrate = 0;
800 parameters.codecs[0].channels = 1;
801 parameters.codecs[0].params["stereo"] = "0";
802 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000803}
804
805// Test that if channel is 1 for opus and stereo=1, we fail.
806TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
807 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200808 cricket::AudioSendParameters parameters;
809 parameters.codecs.push_back(kOpusCodec);
810 parameters.codecs[0].bitrate = 0;
811 parameters.codecs[0].channels = 1;
812 parameters.codecs[0].params["stereo"] = "1";
813 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000814}
815
816// Test that with bitrate=0 and no stereo,
817// channels and bitrate are 1 and 32000.
818TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
819 EXPECT_TRUE(SetupEngine());
820 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200821 cricket::AudioSendParameters parameters;
822 parameters.codecs.push_back(kOpusCodec);
823 parameters.codecs[0].bitrate = 0;
824 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000825 webrtc::CodecInst gcodec;
826 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
827 EXPECT_STREQ("opus", gcodec.plname);
828 EXPECT_EQ(1, gcodec.channels);
829 EXPECT_EQ(32000, gcodec.rate);
830}
831
832// Test that with bitrate=0 and stereo=0,
833// channels and bitrate are 1 and 32000.
834TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
835 EXPECT_TRUE(SetupEngine());
836 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200837 cricket::AudioSendParameters parameters;
838 parameters.codecs.push_back(kOpusCodec);
839 parameters.codecs[0].bitrate = 0;
840 parameters.codecs[0].params["stereo"] = "0";
841 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000842 webrtc::CodecInst gcodec;
843 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
844 EXPECT_STREQ("opus", gcodec.plname);
845 EXPECT_EQ(1, gcodec.channels);
846 EXPECT_EQ(32000, gcodec.rate);
847}
848
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000849// Test that with bitrate=invalid and stereo=0,
850// channels and bitrate are 1 and 32000.
851TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
852 EXPECT_TRUE(SetupEngine());
853 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200854 cricket::AudioSendParameters parameters;
855 parameters.codecs.push_back(kOpusCodec);
856 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000857 webrtc::CodecInst gcodec;
858
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000859 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200860 parameters.codecs[0].bitrate = 5999;
861 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000862 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
863 EXPECT_STREQ("opus", gcodec.plname);
864 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000865 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000866
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200867 parameters.codecs[0].bitrate = 510001;
868 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000869 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
870 EXPECT_STREQ("opus", gcodec.plname);
871 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000872 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000873}
874
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000875// Test that with bitrate=0 and stereo=1,
876// channels and bitrate are 2 and 64000.
877TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
878 EXPECT_TRUE(SetupEngine());
879 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200880 cricket::AudioSendParameters parameters;
881 parameters.codecs.push_back(kOpusCodec);
882 parameters.codecs[0].bitrate = 0;
883 parameters.codecs[0].params["stereo"] = "1";
884 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000885 webrtc::CodecInst gcodec;
886 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
887 EXPECT_STREQ("opus", gcodec.plname);
888 EXPECT_EQ(2, gcodec.channels);
889 EXPECT_EQ(64000, gcodec.rate);
890}
891
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000892// Test that with bitrate=invalid and stereo=1,
893// channels and bitrate are 2 and 64000.
894TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
895 EXPECT_TRUE(SetupEngine());
896 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200897 cricket::AudioSendParameters parameters;
898 parameters.codecs.push_back(kOpusCodec);
899 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000900 webrtc::CodecInst gcodec;
901
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000902 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200903 parameters.codecs[0].bitrate = 5999;
904 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000905 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
906 EXPECT_STREQ("opus", gcodec.plname);
907 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000908 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000909
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200910 parameters.codecs[0].bitrate = 510001;
911 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000912 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
913 EXPECT_STREQ("opus", gcodec.plname);
914 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000915 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000916}
917
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000918// Test that with bitrate=N and stereo unset,
919// channels and bitrate are 1 and N.
920TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
921 EXPECT_TRUE(SetupEngine());
922 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200923 cricket::AudioSendParameters parameters;
924 parameters.codecs.push_back(kOpusCodec);
925 parameters.codecs[0].bitrate = 96000;
926 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000927 webrtc::CodecInst gcodec;
928 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
929 EXPECT_EQ(111, gcodec.pltype);
930 EXPECT_EQ(96000, gcodec.rate);
931 EXPECT_STREQ("opus", gcodec.plname);
932 EXPECT_EQ(1, gcodec.channels);
933 EXPECT_EQ(48000, gcodec.plfreq);
934}
935
936// Test that with bitrate=N and stereo=0,
937// channels and bitrate are 1 and N.
938TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
939 EXPECT_TRUE(SetupEngine());
940 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200941 cricket::AudioSendParameters parameters;
942 parameters.codecs.push_back(kOpusCodec);
943 parameters.codecs[0].bitrate = 30000;
944 parameters.codecs[0].params["stereo"] = "0";
945 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000946 webrtc::CodecInst gcodec;
947 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
948 EXPECT_EQ(1, gcodec.channels);
949 EXPECT_EQ(30000, gcodec.rate);
950 EXPECT_STREQ("opus", gcodec.plname);
951}
952
953// Test that with bitrate=N and without any parameters,
954// channels and bitrate are 1 and N.
955TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
956 EXPECT_TRUE(SetupEngine());
957 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200958 cricket::AudioSendParameters parameters;
959 parameters.codecs.push_back(kOpusCodec);
960 parameters.codecs[0].bitrate = 30000;
961 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000962 webrtc::CodecInst gcodec;
963 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
964 EXPECT_EQ(1, gcodec.channels);
965 EXPECT_EQ(30000, gcodec.rate);
966 EXPECT_STREQ("opus", gcodec.plname);
967}
968
969// Test that with bitrate=N and stereo=1,
970// channels and bitrate are 2 and N.
971TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
972 EXPECT_TRUE(SetupEngine());
973 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200974 cricket::AudioSendParameters parameters;
975 parameters.codecs.push_back(kOpusCodec);
976 parameters.codecs[0].bitrate = 30000;
977 parameters.codecs[0].params["stereo"] = "1";
978 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000979 webrtc::CodecInst gcodec;
980 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
981 EXPECT_EQ(2, gcodec.channels);
982 EXPECT_EQ(30000, gcodec.rate);
983 EXPECT_STREQ("opus", gcodec.plname);
984}
985
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000986// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
987// Also test that the "maxaveragebitrate" can't be set to values outside the
988// range of 6000 and 510000
989TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
990 EXPECT_TRUE(SetupEngine());
991 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200992 cricket::AudioSendParameters parameters;
993 parameters.codecs.push_back(kOpusCodec);
994 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000995 webrtc::CodecInst gcodec;
996
997 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200998 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
999 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001000 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001001 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001002
1003 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001004 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1005 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001006 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001007 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001008
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001009 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1010 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001011 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1012 EXPECT_EQ(200000, gcodec.rate);
1013}
1014
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001015// Test that we can enable NACK with opus as caller.
1016TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001017 EXPECT_TRUE(SetupEngine());
1018 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001019 cricket::AudioSendParameters parameters;
1020 parameters.codecs.push_back(kOpusCodec);
1021 parameters.codecs[0].AddFeedbackParam(
1022 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1023 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001024 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001025 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001026 EXPECT_TRUE(voe_.GetNACK(channel_num));
1027}
1028
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001029// Test that we can enable NACK with opus as callee.
1030TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001031 EXPECT_TRUE(SetupEngineWithoutStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001032 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001033 cricket::AudioSendParameters parameters;
1034 parameters.codecs.push_back(kOpusCodec);
1035 parameters.codecs[0].AddFeedbackParam(
1036 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1037 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001038 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001039 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001040 EXPECT_FALSE(voe_.GetNACK(channel_num));
1041
1042 EXPECT_TRUE(channel_->AddSendStream(
1043 cricket::StreamParams::CreateLegacy(kSsrc1)));
1044 EXPECT_TRUE(voe_.GetNACK(channel_num));
1045}
1046
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001047// Test that we can enable NACK on receive streams.
1048TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
1049 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001050 int channel_num1 = voe_.GetLastChannel();
1051 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1052 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001053 cricket::AudioSendParameters parameters;
1054 parameters.codecs.push_back(kOpusCodec);
1055 parameters.codecs[0].AddFeedbackParam(
1056 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1057 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001058 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1059 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001060 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001061 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1062 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1063}
1064
1065// Test that we can disable NACK.
1066TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
1067 EXPECT_TRUE(SetupEngine());
1068 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001069 cricket::AudioSendParameters parameters;
1070 parameters.codecs.push_back(kOpusCodec);
1071 parameters.codecs[0].AddFeedbackParam(
1072 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1073 cricket::kParamValueEmpty));
1074 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001075 EXPECT_TRUE(voe_.GetNACK(channel_num));
1076
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001077 parameters.codecs.clear();
1078 parameters.codecs.push_back(kOpusCodec);
1079 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001080 EXPECT_FALSE(voe_.GetNACK(channel_num));
1081}
1082
1083// Test that we can disable NACK on receive streams.
1084TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
1085 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001086 int channel_num1 = voe_.GetLastChannel();
1087 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1088 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001089 cricket::AudioSendParameters parameters;
1090 parameters.codecs.push_back(kOpusCodec);
1091 parameters.codecs[0].AddFeedbackParam(
1092 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1093 cricket::kParamValueEmpty));
1094 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001095 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1096 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1097
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001098 parameters.codecs.clear();
1099 parameters.codecs.push_back(kOpusCodec);
1100 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001101 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1102 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1103}
1104
1105// Test that NACK is enabled on a new receive stream.
1106TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
1107 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001108 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001109 cricket::AudioSendParameters parameters;
1110 parameters.codecs.push_back(kIsacCodec);
1111 parameters.codecs.push_back(kCn16000Codec);
1112 parameters.codecs[0].AddFeedbackParam(
1113 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1114 cricket::kParamValueEmpty));
1115 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001116 EXPECT_TRUE(voe_.GetNACK(channel_num));
1117
1118 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1119 channel_num = voe_.GetLastChannel();
1120 EXPECT_TRUE(voe_.GetNACK(channel_num));
1121 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1122 channel_num = voe_.GetLastChannel();
1123 EXPECT_TRUE(voe_.GetNACK(channel_num));
1124}
1125
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001126// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001127TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001128 EXPECT_TRUE(SetupEngine());
1129 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001130 cricket::AudioSendParameters parameters;
1131 parameters.codecs.push_back(kOpusCodec);
1132 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001133 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1134}
1135
1136// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001137TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001138 EXPECT_TRUE(SetupEngine());
1139 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001140 cricket::AudioSendParameters parameters;
1141 parameters.codecs.push_back(kOpusCodec);
1142 parameters.codecs[0].bitrate = 0;
1143 parameters.codecs[0].params["useinbandfec"] = "0";
1144 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001145 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1146 webrtc::CodecInst gcodec;
1147 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1148 EXPECT_STREQ("opus", gcodec.plname);
1149 EXPECT_EQ(1, gcodec.channels);
1150 EXPECT_EQ(32000, gcodec.rate);
1151}
1152
1153// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001154TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001155 EXPECT_TRUE(SetupEngine());
1156 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001157 cricket::AudioSendParameters parameters;
1158 parameters.codecs.push_back(kOpusCodec);
1159 parameters.codecs[0].bitrate = 0;
1160 parameters.codecs[0].params["useinbandfec"] = "1";
1161 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001162 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1163 webrtc::CodecInst gcodec;
1164 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1165 EXPECT_STREQ("opus", gcodec.plname);
1166 EXPECT_EQ(1, gcodec.channels);
1167 EXPECT_EQ(32000, gcodec.rate);
1168}
1169
1170// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001171TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001172 EXPECT_TRUE(SetupEngine());
1173 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001174 cricket::AudioSendParameters parameters;
1175 parameters.codecs.push_back(kOpusCodec);
1176 parameters.codecs[0].bitrate = 0;
1177 parameters.codecs[0].params["stereo"] = "1";
1178 parameters.codecs[0].params["useinbandfec"] = "1";
1179 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001180 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1181 webrtc::CodecInst gcodec;
1182 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1183 EXPECT_STREQ("opus", gcodec.plname);
1184 EXPECT_EQ(2, gcodec.channels);
1185 EXPECT_EQ(64000, gcodec.rate);
1186}
1187
1188// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001189TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001190 EXPECT_TRUE(SetupEngine());
1191 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001192 cricket::AudioSendParameters parameters;
1193 parameters.codecs.push_back(kIsacCodec);
1194 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001195 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1196}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001197
1198// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1199TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
1200 EXPECT_TRUE(SetupEngine());
1201 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001202 cricket::AudioSendParameters parameters;
1203 parameters.codecs.push_back(kIsacCodec);
1204 parameters.codecs[0].params["useinbandfec"] = "1";
1205 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001206 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1207}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001208
1209// Test that Opus FEC status can be changed.
1210TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
1211 EXPECT_TRUE(SetupEngine());
1212 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001213 cricket::AudioSendParameters parameters;
1214 parameters.codecs.push_back(kOpusCodec);
1215 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001216 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001217 parameters.codecs[0].params["useinbandfec"] = "1";
1218 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001219 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1220}
1221
1222// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1223TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
1224 EXPECT_TRUE(SetupEngine());
1225 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001226 cricket::AudioSendParameters parameters;
1227 parameters.codecs.push_back(kOpusCodec);
1228 parameters.codecs[0].bitrate = 0;
1229 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1230 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001231 EXPECT_EQ(cricket::kOpusBandwidthNb,
1232 voe_.GetMaxEncodingBandwidth(channel_num));
1233 webrtc::CodecInst gcodec;
1234 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1235 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001236
1237 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001238 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1239 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001240 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1241 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001242}
1243
1244// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1245TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
1246 EXPECT_TRUE(SetupEngine());
1247 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001248 cricket::AudioSendParameters parameters;
1249 parameters.codecs.push_back(kOpusCodec);
1250 parameters.codecs[0].bitrate = 0;
1251 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1252 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001253 EXPECT_EQ(cricket::kOpusBandwidthMb,
1254 voe_.GetMaxEncodingBandwidth(channel_num));
1255 webrtc::CodecInst gcodec;
1256 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1257 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001258
1259 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001260 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1261 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001262 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1263 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001264}
1265
1266// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1267TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
1268 EXPECT_TRUE(SetupEngine());
1269 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001270 cricket::AudioSendParameters parameters;
1271 parameters.codecs.push_back(kOpusCodec);
1272 parameters.codecs[0].bitrate = 0;
1273 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1274 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001275 EXPECT_EQ(cricket::kOpusBandwidthWb,
1276 voe_.GetMaxEncodingBandwidth(channel_num));
1277 webrtc::CodecInst gcodec;
1278 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1279 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001280
1281 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001282 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1283 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001284 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1285 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001286}
1287
1288// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1289TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
1290 EXPECT_TRUE(SetupEngine());
1291 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001292 cricket::AudioSendParameters parameters;
1293 parameters.codecs.push_back(kOpusCodec);
1294 parameters.codecs[0].bitrate = 0;
1295 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1296 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001297 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1298 voe_.GetMaxEncodingBandwidth(channel_num));
1299 webrtc::CodecInst gcodec;
1300 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1301 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001302
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001303 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001304 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1305 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001306 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1307 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001308}
1309
1310// Test 24000 < maxplaybackrate triggers Opus full band mode.
1311TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
1312 EXPECT_TRUE(SetupEngine());
1313 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001314 cricket::AudioSendParameters parameters;
1315 parameters.codecs.push_back(kOpusCodec);
1316 parameters.codecs[0].bitrate = 0;
1317 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1318 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001319 EXPECT_EQ(cricket::kOpusBandwidthFb,
1320 voe_.GetMaxEncodingBandwidth(channel_num));
1321 webrtc::CodecInst gcodec;
1322 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1323 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001324
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001325 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001326 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1327 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001328 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1329 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001330}
1331
1332// Test Opus that without maxplaybackrate, default playback rate is used.
1333TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
1334 EXPECT_TRUE(SetupEngine());
1335 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001336 cricket::AudioSendParameters parameters;
1337 parameters.codecs.push_back(kOpusCodec);
1338 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001339 EXPECT_EQ(cricket::kOpusBandwidthFb,
1340 voe_.GetMaxEncodingBandwidth(channel_num));
1341}
1342
1343// Test the with non-Opus, maxplaybackrate has no effect.
1344TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
1345 EXPECT_TRUE(SetupEngine());
1346 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001347 cricket::AudioSendParameters parameters;
1348 parameters.codecs.push_back(kIsacCodec);
1349 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1350 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001351 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1352}
1353
1354// Test maxplaybackrate can be set on two streams.
1355TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
1356 EXPECT_TRUE(SetupEngine());
1357 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001358 cricket::AudioSendParameters parameters;
1359 parameters.codecs.push_back(kOpusCodec);
1360 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001361 // Default bandwidth is 24000.
1362 EXPECT_EQ(cricket::kOpusBandwidthFb,
1363 voe_.GetMaxEncodingBandwidth(channel_num));
1364
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001365 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001366
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001367 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001368 EXPECT_EQ(cricket::kOpusBandwidthNb,
1369 voe_.GetMaxEncodingBandwidth(channel_num));
1370
1371 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1372 channel_num = voe_.GetLastChannel();
1373 EXPECT_EQ(cricket::kOpusBandwidthNb,
1374 voe_.GetMaxEncodingBandwidth(channel_num));
1375}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001376
Minyue Li7100dcd2015-03-27 05:05:59 +01001377// Test that with usedtx=0, Opus DTX is off.
1378TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
1379 EXPECT_TRUE(SetupEngine());
1380 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001381 cricket::AudioSendParameters parameters;
1382 parameters.codecs.push_back(kOpusCodec);
1383 parameters.codecs[0].params["usedtx"] = "0";
1384 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001385 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1386}
1387
1388// Test that with usedtx=1, Opus DTX is on.
1389TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
1390 EXPECT_TRUE(SetupEngine());
1391 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001392 cricket::AudioSendParameters parameters;
1393 parameters.codecs.push_back(kOpusCodec);
1394 parameters.codecs[0].params["usedtx"] = "1";
1395 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001396 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1397 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1398}
1399
1400// Test that usedtx=1 works with stereo Opus.
1401TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
1402 EXPECT_TRUE(SetupEngine());
1403 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001404 cricket::AudioSendParameters parameters;
1405 parameters.codecs.push_back(kOpusCodec);
1406 parameters.codecs[0].params["usedtx"] = "1";
1407 parameters.codecs[0].params["stereo"] = "1";
1408 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001409 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1410 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1411}
1412
1413// Test that usedtx=1 does not work with non Opus.
1414TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
1415 EXPECT_TRUE(SetupEngine());
1416 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001417 cricket::AudioSendParameters parameters;
1418 parameters.codecs.push_back(kIsacCodec);
1419 parameters.codecs[0].params["usedtx"] = "1";
1420 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001421 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1422}
1423
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001424// Test that we can switch back and forth between Opus and ISAC with CN.
1425TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001426 EXPECT_TRUE(SetupEngine());
1427 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001428 cricket::AudioSendParameters opus_parameters;
1429 opus_parameters.codecs.push_back(kOpusCodec);
1430 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001431 webrtc::CodecInst gcodec;
1432 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001433 EXPECT_EQ(111, gcodec.pltype);
1434 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001435
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001436 cricket::AudioSendParameters isac_parameters;
1437 isac_parameters.codecs.push_back(kIsacCodec);
1438 isac_parameters.codecs.push_back(kCn16000Codec);
1439 isac_parameters.codecs.push_back(kOpusCodec);
1440 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001441 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1442 EXPECT_EQ(103, gcodec.pltype);
1443 EXPECT_STREQ("ISAC", gcodec.plname);
1444
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001445 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001446 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001447 EXPECT_EQ(111, gcodec.pltype);
1448 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001449}
1450
1451// Test that we handle various ways of specifying bitrate.
1452TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
1453 EXPECT_TRUE(SetupEngine());
1454 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001455 cricket::AudioSendParameters parameters;
1456 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1457 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001458 webrtc::CodecInst gcodec;
1459 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1460 EXPECT_EQ(103, gcodec.pltype);
1461 EXPECT_STREQ("ISAC", gcodec.plname);
1462 EXPECT_EQ(32000, gcodec.rate);
1463
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001464 parameters.codecs[0].bitrate = 0; // bitrate == default
1465 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001466 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1467 EXPECT_EQ(103, gcodec.pltype);
1468 EXPECT_STREQ("ISAC", gcodec.plname);
1469 EXPECT_EQ(-1, gcodec.rate);
1470
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001471 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1472 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001473 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1474 EXPECT_EQ(103, gcodec.pltype);
1475 EXPECT_STREQ("ISAC", gcodec.plname);
1476 EXPECT_EQ(28000, gcodec.rate);
1477
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001478 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1479 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001480 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1481 EXPECT_EQ(0, gcodec.pltype);
1482 EXPECT_STREQ("PCMU", gcodec.plname);
1483 EXPECT_EQ(64000, gcodec.rate);
1484
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001485 parameters.codecs[0].bitrate = 0; // bitrate == default
1486 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001487 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1488 EXPECT_EQ(0, gcodec.pltype);
1489 EXPECT_STREQ("PCMU", gcodec.plname);
1490 EXPECT_EQ(64000, gcodec.rate);
1491
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001492 parameters.codecs[0] = kOpusCodec;
1493 parameters.codecs[0].bitrate = 0; // bitrate == default
1494 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001495 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1496 EXPECT_EQ(111, gcodec.pltype);
1497 EXPECT_STREQ("opus", gcodec.plname);
1498 EXPECT_EQ(32000, gcodec.rate);
1499}
1500
Brave Yao5225dd82015-03-26 07:39:19 +08001501// Test that we could set packet size specified in kCodecParamPTime.
1502TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
1503 EXPECT_TRUE(SetupEngine());
1504 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001505 cricket::AudioSendParameters parameters;
1506 parameters.codecs.push_back(kOpusCodec);
1507 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1508 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001509 webrtc::CodecInst gcodec;
1510 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1511 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1512
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001513 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1514 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001515 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1516 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1517
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001518 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1519 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001520 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1521 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1522
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001523 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1524 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1525 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001526 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1527 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1528
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001529 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1530 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1531 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001532 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1533 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1534}
1535
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001536// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001537TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
1538 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001539 cricket::AudioSendParameters parameters;
1540 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001541}
1542
1543// Test that we can set send codecs even with telephone-event codec as the first
1544// one on the list.
1545TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
1546 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001547 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001548 cricket::AudioSendParameters parameters;
1549 parameters.codecs.push_back(kTelephoneEventCodec);
1550 parameters.codecs.push_back(kIsacCodec);
1551 parameters.codecs.push_back(kPcmuCodec);
1552 parameters.codecs[0].id = 98; // DTMF
1553 parameters.codecs[1].id = 96;
1554 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001555 webrtc::CodecInst gcodec;
1556 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001557 EXPECT_EQ(96, gcodec.pltype);
1558 EXPECT_STREQ("ISAC", gcodec.plname);
1559 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1560}
1561
1562// Test that we can set send codecs even with CN codec as the first
1563// one on the list.
1564TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
1565 EXPECT_TRUE(SetupEngine());
1566 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001567 cricket::AudioSendParameters parameters;
1568 parameters.codecs.push_back(kCn16000Codec);
1569 parameters.codecs.push_back(kIsacCodec);
1570 parameters.codecs.push_back(kPcmuCodec);
1571 parameters.codecs[0].id = 98; // wideband CN
1572 parameters.codecs[1].id = 96;
1573 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001574 webrtc::CodecInst gcodec;
1575 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1576 EXPECT_EQ(96, gcodec.pltype);
1577 EXPECT_STREQ("ISAC", gcodec.plname);
1578 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001579}
1580
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001581// Test that we set VAD and DTMF types correctly as caller.
1582TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001583 EXPECT_TRUE(SetupEngine());
1584 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001585 cricket::AudioSendParameters parameters;
1586 parameters.codecs.push_back(kIsacCodec);
1587 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001588 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001589 parameters.codecs.push_back(kCn16000Codec);
1590 parameters.codecs.push_back(kCn8000Codec);
1591 parameters.codecs.push_back(kTelephoneEventCodec);
1592 parameters.codecs.push_back(kRedCodec);
1593 parameters.codecs[0].id = 96;
1594 parameters.codecs[2].id = 97; // wideband CN
1595 parameters.codecs[4].id = 98; // DTMF
1596 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001597 webrtc::CodecInst gcodec;
1598 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1599 EXPECT_EQ(96, gcodec.pltype);
1600 EXPECT_STREQ("ISAC", gcodec.plname);
1601 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001602 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001603 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1604 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1605 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1606}
1607
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001608// Test that we set VAD and DTMF types correctly as callee.
1609TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001610 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001611 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001612 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001613
1614 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001615 cricket::AudioSendParameters parameters;
1616 parameters.codecs.push_back(kIsacCodec);
1617 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001618 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001619 parameters.codecs.push_back(kCn16000Codec);
1620 parameters.codecs.push_back(kCn8000Codec);
1621 parameters.codecs.push_back(kTelephoneEventCodec);
1622 parameters.codecs.push_back(kRedCodec);
1623 parameters.codecs[0].id = 96;
1624 parameters.codecs[2].id = 97; // wideband CN
1625 parameters.codecs[4].id = 98; // DTMF
1626 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001627 EXPECT_TRUE(channel_->AddSendStream(
1628 cricket::StreamParams::CreateLegacy(kSsrc1)));
1629
1630 webrtc::CodecInst gcodec;
1631 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1632 EXPECT_EQ(96, gcodec.pltype);
1633 EXPECT_STREQ("ISAC", gcodec.plname);
1634 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001635 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001636 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1637 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1638 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1639}
1640
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001641// Test that we only apply VAD if we have a CN codec that matches the
1642// send codec clockrate.
1643TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
1644 EXPECT_TRUE(SetupEngine());
1645 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001646 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001647 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001648 parameters.codecs.push_back(kIsacCodec);
1649 parameters.codecs.push_back(kCn16000Codec);
1650 parameters.codecs[1].id = 97;
1651 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001652 webrtc::CodecInst gcodec;
1653 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1654 EXPECT_STREQ("ISAC", gcodec.plname);
1655 EXPECT_TRUE(voe_.GetVAD(channel_num));
1656 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1657 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001658 parameters.codecs[0] = kPcmuCodec;
1659 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001660 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1661 EXPECT_STREQ("PCMU", gcodec.plname);
1662 EXPECT_FALSE(voe_.GetVAD(channel_num));
1663 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001664 parameters.codecs[1] = kCn8000Codec;
1665 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001666 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1667 EXPECT_STREQ("PCMU", gcodec.plname);
1668 EXPECT_TRUE(voe_.GetVAD(channel_num));
1669 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001670 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001671 parameters.codecs[0] = kIsacCodec;
1672 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001673 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1674 EXPECT_STREQ("ISAC", gcodec.plname);
1675 EXPECT_FALSE(voe_.GetVAD(channel_num));
1676}
1677
1678// Test that we perform case-insensitive matching of codec names.
1679TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
1680 EXPECT_TRUE(SetupEngine());
1681 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001682 cricket::AudioSendParameters parameters;
1683 parameters.codecs.push_back(kIsacCodec);
1684 parameters.codecs.push_back(kPcmuCodec);
1685 parameters.codecs.push_back(kCn16000Codec);
1686 parameters.codecs.push_back(kCn8000Codec);
1687 parameters.codecs.push_back(kTelephoneEventCodec);
1688 parameters.codecs.push_back(kRedCodec);
1689 parameters.codecs[0].name = "iSaC";
1690 parameters.codecs[0].id = 96;
1691 parameters.codecs[2].id = 97; // wideband CN
1692 parameters.codecs[4].id = 98; // DTMF
1693 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001694 webrtc::CodecInst gcodec;
1695 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1696 EXPECT_EQ(96, gcodec.pltype);
1697 EXPECT_STREQ("ISAC", gcodec.plname);
1698 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001699 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001700 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1701 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1702 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1703}
1704
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001705// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001706TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001707 EXPECT_TRUE(SetupEngine());
1708 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001709 cricket::AudioSendParameters parameters;
1710 parameters.codecs.push_back(kRedCodec);
1711 parameters.codecs.push_back(kIsacCodec);
1712 parameters.codecs.push_back(kPcmuCodec);
1713 parameters.codecs[0].id = 127;
1714 parameters.codecs[0].params[""] = "96/96";
1715 parameters.codecs[1].id = 96;
1716 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001717 webrtc::CodecInst gcodec;
1718 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1719 EXPECT_EQ(96, gcodec.pltype);
1720 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001721 EXPECT_TRUE(voe_.GetRED(channel_num));
1722 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001723}
1724
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001725// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001726TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001727 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001728 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001729 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001730
1731 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001732 cricket::AudioSendParameters parameters;
1733 parameters.codecs.push_back(kRedCodec);
1734 parameters.codecs.push_back(kIsacCodec);
1735 parameters.codecs.push_back(kPcmuCodec);
1736 parameters.codecs[0].id = 127;
1737 parameters.codecs[0].params[""] = "96/96";
1738 parameters.codecs[1].id = 96;
1739 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001740 EXPECT_TRUE(channel_->AddSendStream(
1741 cricket::StreamParams::CreateLegacy(kSsrc1)));
1742 webrtc::CodecInst gcodec;
1743 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1744 EXPECT_EQ(96, gcodec.pltype);
1745 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001746 EXPECT_TRUE(voe_.GetRED(channel_num));
1747 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001748}
1749
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001750// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001751TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
1752 EXPECT_TRUE(SetupEngine());
1753 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001754 cricket::AudioSendParameters parameters;
1755 parameters.codecs.push_back(kRedCodec);
1756 parameters.codecs.push_back(kIsacCodec);
1757 parameters.codecs.push_back(kPcmuCodec);
1758 parameters.codecs[0].id = 127;
1759 parameters.codecs[1].id = 96;
1760 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001761 webrtc::CodecInst gcodec;
1762 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1763 EXPECT_EQ(96, gcodec.pltype);
1764 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001765 EXPECT_TRUE(voe_.GetRED(channel_num));
1766 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001767}
1768
1769// Test that we ignore RED if the parameters aren't named the way we expect.
1770TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
1771 EXPECT_TRUE(SetupEngine());
1772 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001773 cricket::AudioSendParameters parameters;
1774 parameters.codecs.push_back(kRedCodec);
1775 parameters.codecs.push_back(kIsacCodec);
1776 parameters.codecs.push_back(kPcmuCodec);
1777 parameters.codecs[0].id = 127;
1778 parameters.codecs[0].params["ABC"] = "96/96";
1779 parameters.codecs[1].id = 96;
1780 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001781 webrtc::CodecInst gcodec;
1782 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1783 EXPECT_EQ(96, gcodec.pltype);
1784 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001785 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001786}
1787
1788// Test that we ignore RED if it uses different primary/secondary encoding.
1789TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
1790 EXPECT_TRUE(SetupEngine());
1791 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001792 cricket::AudioSendParameters parameters;
1793 parameters.codecs.push_back(kRedCodec);
1794 parameters.codecs.push_back(kIsacCodec);
1795 parameters.codecs.push_back(kPcmuCodec);
1796 parameters.codecs[0].id = 127;
1797 parameters.codecs[0].params[""] = "96/0";
1798 parameters.codecs[1].id = 96;
1799 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001800 webrtc::CodecInst gcodec;
1801 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1802 EXPECT_EQ(96, gcodec.pltype);
1803 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001804 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001805}
1806
1807// Test that we ignore RED if it uses more than 2 encodings.
1808TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
1809 EXPECT_TRUE(SetupEngine());
1810 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001811 cricket::AudioSendParameters parameters;
1812 parameters.codecs.push_back(kRedCodec);
1813 parameters.codecs.push_back(kIsacCodec);
1814 parameters.codecs.push_back(kPcmuCodec);
1815 parameters.codecs[0].id = 127;
1816 parameters.codecs[0].params[""] = "96/96/96";
1817 parameters.codecs[1].id = 96;
1818 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001819 webrtc::CodecInst gcodec;
1820 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1821 EXPECT_EQ(96, gcodec.pltype);
1822 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001823 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001824}
1825
1826// Test that we ignore RED if it has bogus codec ids.
1827TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
1828 EXPECT_TRUE(SetupEngine());
1829 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001830 cricket::AudioSendParameters parameters;
1831 parameters.codecs.push_back(kRedCodec);
1832 parameters.codecs.push_back(kIsacCodec);
1833 parameters.codecs.push_back(kPcmuCodec);
1834 parameters.codecs[0].id = 127;
1835 parameters.codecs[0].params[""] = "ABC/ABC";
1836 parameters.codecs[1].id = 96;
1837 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001838 webrtc::CodecInst gcodec;
1839 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1840 EXPECT_EQ(96, gcodec.pltype);
1841 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001842 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001843}
1844
1845// Test that we ignore RED if it refers to a codec that is not present.
1846TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
1847 EXPECT_TRUE(SetupEngine());
1848 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001849 cricket::AudioSendParameters parameters;
1850 parameters.codecs.push_back(kRedCodec);
1851 parameters.codecs.push_back(kIsacCodec);
1852 parameters.codecs.push_back(kPcmuCodec);
1853 parameters.codecs[0].id = 127;
1854 parameters.codecs[0].params[""] = "97/97";
1855 parameters.codecs[1].id = 96;
1856 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001857 webrtc::CodecInst gcodec;
1858 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1859 EXPECT_EQ(96, gcodec.pltype);
1860 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001861 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001862}
1863
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001864// Test support for audio level header extension.
1865TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1866 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001867}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001868TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1869 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1870}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001871
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001872// Test support for absolute send time header extension.
1873TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1874 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1875}
1876TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1877 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001878}
1879
1880// Test that we can create a channel and start sending/playing out on it.
1881TEST_F(WebRtcVoiceEngineTestFake, SendAndPlayout) {
1882 EXPECT_TRUE(SetupEngine());
1883 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001884 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001885 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1886 EXPECT_TRUE(voe_.GetSend(channel_num));
1887 EXPECT_TRUE(channel_->SetPlayout(true));
1888 EXPECT_TRUE(voe_.GetPlayout(channel_num));
1889 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1890 EXPECT_FALSE(voe_.GetSend(channel_num));
1891 EXPECT_TRUE(channel_->SetPlayout(false));
1892 EXPECT_FALSE(voe_.GetPlayout(channel_num));
1893}
1894
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001895// Test that we can add and remove send streams.
1896TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
1897 SetupForMultiSendStream();
1898
1899 static const uint32 kSsrcs4[] = {1, 2, 3, 4};
1900
1901 // Set the global state for sending.
1902 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1903
1904 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1905 EXPECT_TRUE(channel_->AddSendStream(
1906 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1907
1908 // Verify that we are in a sending state for all the created streams.
1909 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1910 EXPECT_TRUE(voe_.GetSend(channel_num));
1911 }
1912
1913 // Remove the first send channel, which is the default channel. It will only
1914 // recycle the default channel but not delete it.
1915 EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[0]));
1916 // Stream should already be Removed from the send stream list.
1917 EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[0]));
1918 // But the default still exists.
1919 EXPECT_EQ(0, voe_.GetChannelFromLocalSsrc(kSsrcs4[0]));
1920
1921 // Delete the rest of send channel streams.
1922 for (unsigned int i = 1; i < ARRAY_SIZE(kSsrcs4); ++i) {
1923 EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[i]));
1924 // Stream should already be deleted.
1925 EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[i]));
1926 EXPECT_EQ(-1, voe_.GetChannelFromLocalSsrc(kSsrcs4[i]));
1927 }
1928}
1929
1930// Test SetSendCodecs correctly configure the codecs in all send streams.
1931TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
1932 SetupForMultiSendStream();
1933
1934 static const uint32 kSsrcs4[] = {1, 2, 3, 4};
1935 // Create send streams.
1936 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1937 EXPECT_TRUE(channel_->AddSendStream(
1938 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1939 }
1940
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001941 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001942 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001943 parameters.codecs.push_back(kIsacCodec);
1944 parameters.codecs.push_back(kCn16000Codec);
1945 parameters.codecs[1].id = 97;
1946 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001947
1948 // Verify ISAC and VAD are corrected configured on all send channels.
1949 webrtc::CodecInst gcodec;
1950 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1951 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1952 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1953 EXPECT_STREQ("ISAC", gcodec.plname);
1954 EXPECT_TRUE(voe_.GetVAD(channel_num));
1955 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1956 }
1957
1958 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001959 parameters.codecs[0] = kPcmuCodec;
1960 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001961 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1962 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1963 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1964 EXPECT_STREQ("PCMU", gcodec.plname);
1965 EXPECT_FALSE(voe_.GetVAD(channel_num));
1966 }
1967}
1968
1969// Test we can SetSend on all send streams correctly.
1970TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
1971 SetupForMultiSendStream();
1972
1973 static const uint32 kSsrcs4[] = {1, 2, 3, 4};
1974 // Create the send channels and they should be a SEND_NOTHING date.
1975 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1976 EXPECT_TRUE(channel_->AddSendStream(
1977 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1978 int channel_num = voe_.GetLastChannel();
1979 EXPECT_FALSE(voe_.GetSend(channel_num));
1980 }
1981
1982 // Set the global state for starting sending.
1983 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1984 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1985 // Verify that we are in a sending state for all the send streams.
1986 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1987 EXPECT_TRUE(voe_.GetSend(channel_num));
1988 }
1989
1990 // Set the global state for stopping sending.
1991 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1992 for (unsigned int i = 1; i < ARRAY_SIZE(kSsrcs4); ++i) {
1993 // Verify that we are in a stop state for all the send streams.
1994 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1995 EXPECT_FALSE(voe_.GetSend(channel_num));
1996 }
1997}
1998
1999// Test we can set the correct statistics on all send streams.
2000TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2001 SetupForMultiSendStream();
2002
2003 static const uint32 kSsrcs4[] = {1, 2, 3, 4};
2004 // Create send streams.
2005 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
2006 EXPECT_TRUE(channel_->AddSendStream(
2007 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
2008 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002009 // Create a receive stream to check that none of the send streams end up in
2010 // the receive stream stats.
2011 EXPECT_TRUE(channel_->AddRecvStream(
2012 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002013 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002014 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2015 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002016
2017 cricket::VoiceMediaInfo info;
2018 EXPECT_EQ(true, channel_->GetStats(&info));
2019 EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size());
2020
2021 // Verify the statistic information is correct.
2022 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +00002023 EXPECT_EQ(kSsrcs4[i], info.senders[i].ssrc());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002024 EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
2025 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].bytes_sent);
2026 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_sent);
2027 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_lost);
2028 EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[i].fraction_lost);
2029 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].ext_seqnum);
2030 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].rtt_ms);
2031 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].jitter_ms);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002032 EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002033 }
2034
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002035 EXPECT_EQ(0u, info.receivers.size());
2036 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2037 EXPECT_EQ(true, channel_->GetStats(&info));
2038
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002039 EXPECT_EQ(1u, info.receivers.size());
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002040 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd);
2041 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd);
2042 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost);
2043 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum);
2044 EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name);
minyue@webrtc.orgc0bd7be2015-02-18 15:24:13 +00002045 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentExpandRate) /
2046 (1 << 14), info.receivers[0].expand_rate);
2047 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSpeechExpandRate) /
2048 (1 << 14), info.receivers[0].speech_expand_rate);
2049 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSecondaryDecodedRate) /
2050 (1 << 14), info.receivers[0].secondary_decoded_rate);
Henrik Lundin8e6fd462015-06-02 09:24:52 +02002051 EXPECT_EQ(
2052 static_cast<float>(cricket::kNetStats.currentAccelerateRate) / (1 << 14),
2053 info.receivers[0].accelerate_rate);
2054 EXPECT_EQ(
2055 static_cast<float>(cricket::kNetStats.currentPreemptiveRate) / (1 << 14),
2056 info.receivers[0].preemptive_expand_rate);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002057}
2058
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002059// Test that we can add and remove receive streams, and do proper send/playout.
2060// We can receive on multiple streams while sending one stream.
2061TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002062 EXPECT_TRUE(SetupEngine());
2063 int channel_num1 = voe_.GetLastChannel();
2064
2065 // Start playout on the default channel.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002066 send_parameters_.options = options_conference_;
2067 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002068 EXPECT_TRUE(channel_->SetPlayout(true));
2069 EXPECT_TRUE(voe_.GetPlayout(channel_num1));
2070
2071 // Adding another stream should disable playout on the default channel.
2072 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2073 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002074 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2075 EXPECT_TRUE(voe_.GetSend(channel_num1));
2076 EXPECT_FALSE(voe_.GetSend(channel_num2));
2077
2078 // Make sure only the new channel is played out.
2079 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2080 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2081
2082 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2083 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2084 int channel_num3 = voe_.GetLastChannel();
2085 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2086 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2087 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2088 EXPECT_FALSE(voe_.GetSend(channel_num3));
2089
2090 // Stop sending.
2091 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2092 EXPECT_FALSE(voe_.GetSend(channel_num1));
2093 EXPECT_FALSE(voe_.GetSend(channel_num2));
2094 EXPECT_FALSE(voe_.GetSend(channel_num3));
2095
2096 // Stop playout.
2097 EXPECT_TRUE(channel_->SetPlayout(false));
2098 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2099 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2100 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2101
2102 // Restart playout and make sure the default channel still is not played out.
2103 EXPECT_TRUE(channel_->SetPlayout(true));
2104 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2105 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2106 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2107
2108 // Now remove the new streams and verify that the default channel is
2109 // played out again.
2110 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2111 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2112
2113 EXPECT_TRUE(voe_.GetPlayout(channel_num1));
2114}
2115
2116// Test that we can set the devices to use.
2117TEST_F(WebRtcVoiceEngineTestFake, SetDevices) {
2118 EXPECT_TRUE(SetupEngine());
2119 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002120 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002121
2122 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2123 cricket::kFakeDefaultDeviceId);
2124 cricket::Device dev(cricket::kFakeDeviceName,
2125 cricket::kFakeDeviceId);
2126
2127 // Test SetDevices() while not sending or playing.
2128 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2129
2130 // Test SetDevices() while sending and playing.
2131 EXPECT_TRUE(engine_.SetLocalMonitor(true));
2132 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2133 EXPECT_TRUE(channel_->SetPlayout(true));
2134 EXPECT_TRUE(voe_.GetRecordingMicrophone());
2135 EXPECT_TRUE(voe_.GetSend(channel_num));
2136 EXPECT_TRUE(voe_.GetPlayout(channel_num));
2137
2138 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2139
2140 EXPECT_TRUE(voe_.GetRecordingMicrophone());
2141 EXPECT_TRUE(voe_.GetSend(channel_num));
2142 EXPECT_TRUE(voe_.GetPlayout(channel_num));
2143
2144 // Test that failure to open newly selected devices does not prevent opening
2145 // ones after that.
2146 voe_.set_fail_start_recording_microphone(true);
2147 voe_.set_playout_fail_channel(channel_num);
2148 voe_.set_send_fail_channel(channel_num);
2149
2150 EXPECT_FALSE(engine_.SetDevices(&default_dev, &default_dev));
2151
2152 EXPECT_FALSE(voe_.GetRecordingMicrophone());
2153 EXPECT_FALSE(voe_.GetSend(channel_num));
2154 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2155
2156 voe_.set_fail_start_recording_microphone(false);
2157 voe_.set_playout_fail_channel(-1);
2158 voe_.set_send_fail_channel(-1);
2159
2160 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2161
2162 EXPECT_TRUE(voe_.GetRecordingMicrophone());
2163 EXPECT_TRUE(voe_.GetSend(channel_num));
2164 EXPECT_TRUE(voe_.GetPlayout(channel_num));
2165}
2166
2167// Test that we can set the devices to use even if we failed to
2168// open the initial ones.
2169TEST_F(WebRtcVoiceEngineTestFake, SetDevicesWithInitiallyBadDevices) {
2170 EXPECT_TRUE(SetupEngine());
2171 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002172 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002173
2174 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2175 cricket::kFakeDefaultDeviceId);
2176 cricket::Device dev(cricket::kFakeDeviceName,
2177 cricket::kFakeDeviceId);
2178
2179 // Test that failure to open devices selected before starting
2180 // send/play does not prevent opening newly selected ones after that.
2181 voe_.set_fail_start_recording_microphone(true);
2182 voe_.set_playout_fail_channel(channel_num);
2183 voe_.set_send_fail_channel(channel_num);
2184
2185 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2186
2187 EXPECT_FALSE(engine_.SetLocalMonitor(true));
2188 EXPECT_FALSE(channel_->SetSend(cricket::SEND_MICROPHONE));
2189 EXPECT_FALSE(channel_->SetPlayout(true));
2190 EXPECT_FALSE(voe_.GetRecordingMicrophone());
2191 EXPECT_FALSE(voe_.GetSend(channel_num));
2192 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2193
2194 voe_.set_fail_start_recording_microphone(false);
2195 voe_.set_playout_fail_channel(-1);
2196 voe_.set_send_fail_channel(-1);
2197
2198 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2199
2200 EXPECT_TRUE(voe_.GetRecordingMicrophone());
2201 EXPECT_TRUE(voe_.GetSend(channel_num));
2202 EXPECT_TRUE(voe_.GetPlayout(channel_num));
2203}
2204
2205// Test that we can create a channel configured for multi-point conferences,
2206// and start sending/playing out on it.
2207TEST_F(WebRtcVoiceEngineTestFake, ConferenceSendAndPlayout) {
2208 EXPECT_TRUE(SetupEngine());
2209 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002210 send_parameters_.options = options_conference_;
2211 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002212 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2213 EXPECT_TRUE(voe_.GetSend(channel_num));
2214}
2215
2216// Test that we can create a channel configured for Codian bridges,
2217// and start sending/playing out on it.
2218TEST_F(WebRtcVoiceEngineTestFake, CodianSendAndPlayout) {
2219 EXPECT_TRUE(SetupEngine());
2220 int channel_num = voe_.GetLastChannel();
2221 webrtc::AgcConfig agc_config;
2222 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2223 EXPECT_EQ(0, agc_config.targetLeveldBOv);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002224 send_parameters_.options = options_adjust_agc_;
2225 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002226 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2227 EXPECT_TRUE(voe_.GetSend(channel_num));
2228 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2229 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
2230 EXPECT_TRUE(channel_->SetPlayout(true));
2231 EXPECT_TRUE(voe_.GetPlayout(channel_num));
2232 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2233 EXPECT_FALSE(voe_.GetSend(channel_num));
2234 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2235 EXPECT_EQ(0, agc_config.targetLeveldBOv); // level was restored
2236 EXPECT_TRUE(channel_->SetPlayout(false));
2237 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2238}
2239
wu@webrtc.org97077a32013-10-25 21:18:33 +00002240TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
2241 EXPECT_TRUE(SetupEngine());
2242 webrtc::AgcConfig agc_config;
2243 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2244 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2245
2246 cricket::AudioOptions options;
2247 options.tx_agc_target_dbov.Set(3);
2248 options.tx_agc_digital_compression_gain.Set(9);
2249 options.tx_agc_limiter.Set(true);
2250 options.auto_gain_control.Set(true);
2251 EXPECT_TRUE(engine_.SetOptions(options));
2252
2253 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2254 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2255 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2256 EXPECT_TRUE(agc_config.limiterEnable);
2257
2258 // Check interaction with adjust_agc_delta. Both should be respected, for
2259 // backwards compatibility.
2260 options.adjust_agc_delta.Set(-10);
2261 EXPECT_TRUE(engine_.SetOptions(options));
2262
2263 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2264 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2265}
2266
2267TEST_F(WebRtcVoiceEngineTestFake, RxAgcConfigViaOptions) {
2268 EXPECT_TRUE(SetupEngine());
2269 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002270 send_parameters_.options.rx_agc_target_dbov.Set(6);
2271 send_parameters_.options.rx_agc_digital_compression_gain.Set(0);
2272 send_parameters_.options.rx_agc_limiter.Set(true);
2273 send_parameters_.options.rx_auto_gain_control.Set(true);
2274 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002275
2276 webrtc::AgcConfig agc_config;
2277 EXPECT_EQ(0, engine_.voe()->processing()->GetRxAgcConfig(
2278 channel_num, agc_config));
2279 EXPECT_EQ(6, agc_config.targetLeveldBOv);
2280 EXPECT_EQ(0, agc_config.digitalCompressionGaindB);
2281 EXPECT_TRUE(agc_config.limiterEnable);
2282}
2283
2284TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
2285 EXPECT_TRUE(SetupEngine());
2286 cricket::AudioOptions options;
2287 options.recording_sample_rate.Set(48000u);
2288 options.playout_sample_rate.Set(44100u);
2289 EXPECT_TRUE(engine_.SetOptions(options));
2290
2291 unsigned int recording_sample_rate, playout_sample_rate;
2292 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2293 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2294 EXPECT_EQ(48000u, recording_sample_rate);
2295 EXPECT_EQ(44100u, playout_sample_rate);
2296}
2297
2298TEST_F(WebRtcVoiceEngineTestFake, TraceFilterViaTraceOptions) {
2299 EXPECT_TRUE(SetupEngine());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002300 engine_.SetLogging(rtc::LS_INFO, "");
wu@webrtc.org97077a32013-10-25 21:18:33 +00002301 EXPECT_EQ(
2302 // Info:
2303 webrtc::kTraceStateInfo | webrtc::kTraceInfo |
2304 // Warning:
2305 webrtc::kTraceTerseInfo | webrtc::kTraceWarning |
2306 // Error:
2307 webrtc::kTraceError | webrtc::kTraceCritical,
2308 static_cast<int>(trace_wrapper_->filter_));
2309 // Now set it explicitly
2310 std::string filter =
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002311 "tracefilter " + rtc::ToString(webrtc::kTraceDefault);
2312 engine_.SetLogging(rtc::LS_VERBOSE, filter.c_str());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002313 EXPECT_EQ(static_cast<unsigned int>(webrtc::kTraceDefault),
2314 trace_wrapper_->filter_);
2315}
2316
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002317// Test that we can set the outgoing SSRC properly.
2318// SSRC is set in SetupEngine by calling AddSendStream.
2319TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
2320 EXPECT_TRUE(SetupEngine());
2321 int channel_num = voe_.GetLastChannel();
2322 unsigned int send_ssrc;
2323 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
2324 EXPECT_NE(0U, send_ssrc);
2325 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
2326 EXPECT_EQ(kSsrc1, send_ssrc);
2327}
2328
2329TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2330 // Setup. We need send codec to be set to get all stats.
2331 EXPECT_TRUE(SetupEngine());
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002332 // SetupEngine adds a send stream with kSsrc1, so the receive stream has to
2333 // use a different SSRC.
2334 EXPECT_TRUE(channel_->AddRecvStream(
2335 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002336 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2337 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002338
2339 cricket::VoiceMediaInfo info;
2340 EXPECT_EQ(true, channel_->GetStats(&info));
2341 EXPECT_EQ(1u, info.senders.size());
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +00002342 EXPECT_EQ(kSsrc1, info.senders[0].ssrc());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002343 EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
2344 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].bytes_sent);
2345 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_sent);
2346 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_lost);
2347 EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[0].fraction_lost);
2348 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].ext_seqnum);
2349 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].rtt_ms);
2350 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].jitter_ms);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002351 EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002352 // TODO(sriniv): Add testing for more fields. These are not populated
2353 // in FakeWebrtcVoiceEngine yet.
2354 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].audio_level);
2355 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_median_ms);
2356 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_std_ms);
2357 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_return_loss);
2358 // EXPECT_EQ(cricket::kIntStatValue,
2359 // info.senders[0].echo_return_loss_enhancement);
2360
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002361 EXPECT_EQ(0u, info.receivers.size());
2362 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2363 EXPECT_EQ(true, channel_->GetStats(&info));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002364 EXPECT_EQ(1u, info.receivers.size());
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002365
2366 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd);
2367 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd);
2368 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost);
2369 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum);
2370 EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name);
minyue@webrtc.orgc0bd7be2015-02-18 15:24:13 +00002371 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentExpandRate) /
2372 (1 << 14), info.receivers[0].expand_rate);
2373 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSpeechExpandRate) /
2374 (1 << 14), info.receivers[0].speech_expand_rate);
2375 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSecondaryDecodedRate) /
2376 (1 << 14), info.receivers[0].secondary_decoded_rate);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002377 // TODO(sriniv): Add testing for more receiver fields.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002378}
2379
2380// Test that we can set the outgoing SSRC properly with multiple streams.
2381// SSRC is set in SetupEngine by calling AddSendStream.
2382TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
2383 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002384 int channel_num1 = voe_.GetLastChannel();
2385 unsigned int send_ssrc;
2386 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num1, send_ssrc));
2387 EXPECT_EQ(kSsrc1, send_ssrc);
2388
2389 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2390 int channel_num2 = voe_.GetLastChannel();
2391 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num2, send_ssrc));
2392 EXPECT_EQ(kSsrc1, send_ssrc);
2393}
2394
2395// Test that the local SSRC is the same on sending and receiving channels if the
2396// receive channel is created before the send channel.
2397TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002398 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002399 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002400
2401 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2402 int receive_channel_num = voe_.GetLastChannel();
2403 EXPECT_TRUE(channel_->AddSendStream(
2404 cricket::StreamParams::CreateLegacy(1234)));
2405 int send_channel_num = voe_.GetLastChannel();
2406
2407 unsigned int ssrc = 0;
2408 EXPECT_EQ(0, voe_.GetLocalSSRC(send_channel_num, ssrc));
2409 EXPECT_EQ(1234U, ssrc);
2410 ssrc = 0;
2411 EXPECT_EQ(0, voe_.GetLocalSSRC(receive_channel_num, ssrc));
2412 EXPECT_EQ(1234U, ssrc);
2413}
2414
2415// Test that we can properly receive packets.
2416TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2417 EXPECT_TRUE(SetupEngine());
2418 int channel_num = voe_.GetLastChannel();
2419 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2420 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame,
2421 sizeof(kPcmuFrame)));
2422}
2423
2424// Test that we can properly receive packets on multiple streams.
2425TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
2426 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002427 send_parameters_.options = options_conference_;
2428 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002429 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2430 int channel_num1 = voe_.GetLastChannel();
2431 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2432 int channel_num2 = voe_.GetLastChannel();
2433 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2434 int channel_num3 = voe_.GetLastChannel();
2435 // Create packets with the right SSRCs.
2436 char packets[4][sizeof(kPcmuFrame)];
2437 for (size_t i = 0; i < ARRAY_SIZE(packets); ++i) {
2438 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002439 rtc::SetBE32(packets[i] + 8, static_cast<uint32>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002440 }
2441 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2442 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2443 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2444 DeliverPacket(packets[0], sizeof(packets[0]));
2445 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2446 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2447 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2448 DeliverPacket(packets[1], sizeof(packets[1]));
2449 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1],
2450 sizeof(packets[1])));
2451 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2452 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2453 DeliverPacket(packets[2], sizeof(packets[2]));
2454 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2455 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2],
2456 sizeof(packets[2])));
2457 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2458 DeliverPacket(packets[3], sizeof(packets[3]));
2459 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2460 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2461 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3],
2462 sizeof(packets[3])));
2463 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2464 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2465 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2466}
2467
2468// Test that we properly handle failures to add a stream.
2469TEST_F(WebRtcVoiceEngineTestFake, AddStreamFail) {
2470 EXPECT_TRUE(SetupEngine());
2471 voe_.set_fail_create_channel(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002472 send_parameters_.options = options_conference_;
2473 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002474 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2475
2476 // In 1:1 call, we should not try to create a new channel.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002477 send_parameters_.options.conference_mode.Set(false);
2478 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002479 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2480}
2481
2482// Test that AddRecvStream doesn't create new channel for 1:1 call.
2483TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream1On1) {
2484 EXPECT_TRUE(SetupEngine());
2485 int channel_num = voe_.GetLastChannel();
2486 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2487 EXPECT_EQ(channel_num, voe_.GetLastChannel());
2488}
2489
2490// Test that after adding a recv stream, we do not decode more codecs than
2491// those previously passed into SetRecvCodecs.
2492TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
2493 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002494 cricket::AudioRecvParameters parameters;
2495 parameters.codecs.push_back(kIsacCodec);
2496 parameters.codecs.push_back(kPcmuCodec);
2497 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002498 EXPECT_TRUE(channel_->AddRecvStream(
2499 cricket::StreamParams::CreateLegacy(kSsrc1)));
2500 int channel_num2 = voe_.GetLastChannel();
2501 webrtc::CodecInst gcodec;
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002502 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "opus");
2503 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002504 gcodec.channels = 2;
2505 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2506}
2507
2508// Test that we properly clean up any streams that were added, even if
2509// not explicitly removed.
2510TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
2511 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002512 send_parameters_.options = options_conference_;
2513 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002514 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2515 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2516 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2517 delete channel_;
2518 channel_ = NULL;
2519 EXPECT_EQ(0, voe_.GetNumChannels());
2520}
2521
wu@webrtc.org78187522013-10-07 23:32:02 +00002522TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
2523 EXPECT_TRUE(SetupEngine());
2524 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2525}
2526
2527TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2528 EXPECT_TRUE(SetupEngine());
2529 // Stream 1 reuses default channel.
2530 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2531 // Manually delete default channel to simulate a failure.
2532 int default_channel = voe_.GetLastChannel();
2533 EXPECT_EQ(0, voe_.DeleteChannel(default_channel));
2534 // Add recv stream 2 should fail because default channel is gone.
2535 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2536 int new_channel = voe_.GetLastChannel();
2537 EXPECT_NE(default_channel, new_channel);
2538 // The last created channel should have already been deleted.
2539 EXPECT_EQ(-1, voe_.DeleteChannel(new_channel));
2540}
2541
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002542// Test the InsertDtmf on default send stream as caller.
2543TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2544 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002545}
2546
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002547// Test the InsertDtmf on default send stream as callee
2548TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2549 TestInsertDtmf(0, false);
2550}
2551
2552// Test the InsertDtmf on specified send stream as caller.
2553TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2554 TestInsertDtmf(kSsrc1, true);
2555}
2556
2557// Test the InsertDtmf on specified send stream as callee.
2558TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2559 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002560}
2561
2562// Test that we can play a ringback tone properly in a single-stream call.
2563TEST_F(WebRtcVoiceEngineTestFake, PlayRingback) {
2564 EXPECT_TRUE(SetupEngine());
2565 int channel_num = voe_.GetLastChannel();
2566 EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num));
2567 // Check we fail if no ringback tone specified.
2568 EXPECT_FALSE(channel_->PlayRingbackTone(0, true, true));
2569 EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num));
2570 // Check we can set and play a ringback tone.
wu@webrtc.org9caf2762013-12-11 18:25:07 +00002571 EXPECT_TRUE(channel_->SetRingbackTone(
2572 kRingbackTone, static_cast<int>(strlen(kRingbackTone))));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002573 EXPECT_TRUE(channel_->PlayRingbackTone(0, true, true));
2574 EXPECT_EQ(1, voe_.IsPlayingFileLocally(channel_num));
2575 // Check we can stop the tone manually.
2576 EXPECT_TRUE(channel_->PlayRingbackTone(0, false, false));
2577 EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num));
2578 // Check we stop the tone if a packet arrives.
2579 EXPECT_TRUE(channel_->PlayRingbackTone(0, true, true));
2580 EXPECT_EQ(1, voe_.IsPlayingFileLocally(channel_num));
2581 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2582 EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num));
2583}
2584
2585// Test that we can play a ringback tone properly in a multi-stream call.
2586TEST_F(WebRtcVoiceEngineTestFake, PlayRingbackWithMultipleStreams) {
2587 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002588 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2589 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2590 int channel_num = voe_.GetLastChannel();
2591 EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num));
2592 // Check we fail if no ringback tone specified.
2593 EXPECT_FALSE(channel_->PlayRingbackTone(2, true, true));
2594 EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num));
2595 // Check we can set and play a ringback tone on the correct ssrc.
wu@webrtc.org9caf2762013-12-11 18:25:07 +00002596 EXPECT_TRUE(channel_->SetRingbackTone(
2597 kRingbackTone, static_cast<int>(strlen(kRingbackTone))));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002598 EXPECT_FALSE(channel_->PlayRingbackTone(77, true, true));
2599 EXPECT_TRUE(channel_->PlayRingbackTone(2, true, true));
2600 EXPECT_EQ(1, voe_.IsPlayingFileLocally(channel_num));
2601 // Check we can stop the tone manually.
2602 EXPECT_TRUE(channel_->PlayRingbackTone(2, false, false));
2603 EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num));
2604 // Check we stop the tone if a packet arrives, but only with the right SSRC.
2605 EXPECT_TRUE(channel_->PlayRingbackTone(2, true, true));
2606 EXPECT_EQ(1, voe_.IsPlayingFileLocally(channel_num));
2607 // Send a packet with SSRC 1; the tone should not stop.
2608 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2609 EXPECT_EQ(1, voe_.IsPlayingFileLocally(channel_num));
2610 // Send a packet with SSRC 2; the tone should stop.
2611 char packet[sizeof(kPcmuFrame)];
2612 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002613 rtc::SetBE32(packet + 8, 2);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002614 DeliverPacket(packet, sizeof(packet));
2615 EXPECT_EQ(0, voe_.IsPlayingFileLocally(channel_num));
2616}
2617
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002618TEST_F(WebRtcVoiceEngineTestFake, MediaEngineCallbackOnError) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002619 rtc::scoped_ptr<ChannelErrorListener> listener;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002620 cricket::WebRtcVoiceMediaChannel* media_channel;
2621 unsigned int ssrc = 0;
2622
2623 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002624 send_parameters_.options = options_conference_;
2625 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002626 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2627
2628 media_channel = static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2629 listener.reset(new ChannelErrorListener(channel_));
2630
2631 // Test on WebRtc VoE channel.
2632 voe_.TriggerCallbackOnError(media_channel->voe_channel(),
2633 VE_SATURATION_WARNING);
2634 EXPECT_EQ(cricket::VoiceMediaChannel::ERROR_REC_DEVICE_SATURATION,
2635 listener->error());
2636 EXPECT_NE(-1, voe_.GetLocalSSRC(voe_.GetLastChannel(), ssrc));
2637 EXPECT_EQ(ssrc, listener->ssrc());
2638
2639 listener->Reset();
2640 voe_.TriggerCallbackOnError(-1, VE_TYPING_NOISE_WARNING);
2641 EXPECT_EQ(cricket::VoiceMediaChannel::ERROR_REC_TYPING_NOISE_DETECTED,
2642 listener->error());
2643 EXPECT_EQ(0U, listener->ssrc());
2644
2645 // Add another stream and test on that.
2646 ++ssrc;
2647 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(
2648 ssrc)));
2649 listener->Reset();
2650 voe_.TriggerCallbackOnError(voe_.GetLastChannel(),
2651 VE_SATURATION_WARNING);
2652 EXPECT_EQ(cricket::VoiceMediaChannel::ERROR_REC_DEVICE_SATURATION,
2653 listener->error());
2654 EXPECT_EQ(ssrc, listener->ssrc());
2655
2656 // Testing a non-existing channel.
2657 listener->Reset();
2658 voe_.TriggerCallbackOnError(voe_.GetLastChannel() + 2,
2659 VE_SATURATION_WARNING);
2660 EXPECT_EQ(0, listener->error());
2661}
2662
2663TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
2664 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002665 send_parameters_.options = options_conference_;
2666 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002667 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2668 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2669 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2670 EXPECT_TRUE(channel_->SetPlayout(true));
2671 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2672 EXPECT_TRUE(channel_->SetPlayout(false));
2673 EXPECT_FALSE(channel_->SetPlayout(true));
2674}
2675
2676// Test that the Registering/Unregistering with the
2677// webrtcvoiceengine works as expected
2678TEST_F(WebRtcVoiceEngineTestFake, RegisterVoiceProcessor) {
2679 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002680 EXPECT_TRUE(channel_->AddRecvStream(
2681 cricket::StreamParams::CreateLegacy(kSsrc2)));
2682 cricket::FakeMediaProcessor vp_1;
2683 cricket::FakeMediaProcessor vp_2;
2684
2685 EXPECT_FALSE(engine_.RegisterProcessor(kSsrc2, &vp_1, cricket::MPD_TX));
2686 EXPECT_TRUE(engine_.RegisterProcessor(kSsrc2, &vp_1, cricket::MPD_RX));
2687 EXPECT_TRUE(engine_.RegisterProcessor(kSsrc2, &vp_2, cricket::MPD_RX));
2688 voe_.TriggerProcessPacket(cricket::MPD_RX);
2689 voe_.TriggerProcessPacket(cricket::MPD_TX);
2690
2691 EXPECT_TRUE(voe_.IsExternalMediaProcessorRegistered());
2692 EXPECT_EQ(1, vp_1.voice_frame_count());
2693 EXPECT_EQ(1, vp_2.voice_frame_count());
2694
2695 EXPECT_TRUE(engine_.UnregisterProcessor(kSsrc2,
2696 &vp_2,
2697 cricket::MPD_RX));
2698 voe_.TriggerProcessPacket(cricket::MPD_RX);
2699 EXPECT_TRUE(voe_.IsExternalMediaProcessorRegistered());
2700 EXPECT_EQ(1, vp_2.voice_frame_count());
2701 EXPECT_EQ(2, vp_1.voice_frame_count());
2702
2703 EXPECT_TRUE(engine_.UnregisterProcessor(kSsrc2,
2704 &vp_1,
2705 cricket::MPD_RX));
2706 voe_.TriggerProcessPacket(cricket::MPD_RX);
2707 EXPECT_FALSE(voe_.IsExternalMediaProcessorRegistered());
2708 EXPECT_EQ(2, vp_1.voice_frame_count());
2709
2710 EXPECT_FALSE(engine_.RegisterProcessor(kSsrc1, &vp_1, cricket::MPD_RX));
2711 EXPECT_TRUE(engine_.RegisterProcessor(kSsrc1, &vp_1, cricket::MPD_TX));
2712 voe_.TriggerProcessPacket(cricket::MPD_RX);
2713 voe_.TriggerProcessPacket(cricket::MPD_TX);
2714 EXPECT_TRUE(voe_.IsExternalMediaProcessorRegistered());
2715 EXPECT_EQ(3, vp_1.voice_frame_count());
2716
2717 EXPECT_TRUE(engine_.UnregisterProcessor(kSsrc1,
2718 &vp_1,
2719 cricket::MPD_RX_AND_TX));
2720 voe_.TriggerProcessPacket(cricket::MPD_TX);
2721 EXPECT_FALSE(voe_.IsExternalMediaProcessorRegistered());
2722 EXPECT_EQ(3, vp_1.voice_frame_count());
2723 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2724 EXPECT_FALSE(engine_.RegisterProcessor(kSsrc2, &vp_1, cricket::MPD_RX));
2725 EXPECT_FALSE(voe_.IsExternalMediaProcessorRegistered());
2726
2727 // Test that we can register a processor on the receive channel on SSRC 0.
2728 // This tests the 1:1 case when the receive SSRC is unknown.
2729 EXPECT_TRUE(engine_.RegisterProcessor(0, &vp_1, cricket::MPD_RX));
2730 voe_.TriggerProcessPacket(cricket::MPD_RX);
2731 EXPECT_TRUE(voe_.IsExternalMediaProcessorRegistered());
2732 EXPECT_EQ(4, vp_1.voice_frame_count());
2733 EXPECT_TRUE(engine_.UnregisterProcessor(0,
2734 &vp_1,
2735 cricket::MPD_RX));
2736
2737 // The following tests test that FindChannelNumFromSsrc is doing
2738 // what we expect.
2739 // pick an invalid ssrc and make sure we can't register
2740 EXPECT_FALSE(engine_.RegisterProcessor(99,
2741 &vp_1,
2742 cricket::MPD_RX));
2743 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2744 EXPECT_TRUE(engine_.RegisterProcessor(1,
2745 &vp_1,
2746 cricket::MPD_RX));
2747 EXPECT_TRUE(engine_.UnregisterProcessor(1,
2748 &vp_1,
2749 cricket::MPD_RX));
2750 EXPECT_FALSE(engine_.RegisterProcessor(1,
2751 &vp_1,
2752 cricket::MPD_TX));
2753 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2754}
2755
2756TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
2757 EXPECT_TRUE(SetupEngine());
2758
2759 bool ec_enabled;
2760 webrtc::EcModes ec_mode;
2761 bool ec_metrics_enabled;
2762 webrtc::AecmModes aecm_mode;
2763 bool cng_enabled;
2764 bool agc_enabled;
2765 webrtc::AgcModes agc_mode;
2766 webrtc::AgcConfig agc_config;
2767 bool ns_enabled;
2768 webrtc::NsModes ns_mode;
2769 bool highpass_filter_enabled;
2770 bool stereo_swapping_enabled;
2771 bool typing_detection_enabled;
2772 voe_.GetEcStatus(ec_enabled, ec_mode);
2773 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2774 voe_.GetAecmMode(aecm_mode, cng_enabled);
2775 voe_.GetAgcStatus(agc_enabled, agc_mode);
2776 voe_.GetAgcConfig(agc_config);
2777 voe_.GetNsStatus(ns_enabled, ns_mode);
2778 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2779 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2780 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2781 EXPECT_TRUE(ec_enabled);
2782 EXPECT_TRUE(ec_metrics_enabled);
2783 EXPECT_FALSE(cng_enabled);
2784 EXPECT_TRUE(agc_enabled);
2785 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2786 EXPECT_TRUE(ns_enabled);
2787 EXPECT_TRUE(highpass_filter_enabled);
2788 EXPECT_FALSE(stereo_swapping_enabled);
2789 EXPECT_TRUE(typing_detection_enabled);
2790 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2791 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2792
2793 // Nothing set, so all ignored.
2794 cricket::AudioOptions options;
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002795 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002796 voe_.GetEcStatus(ec_enabled, ec_mode);
2797 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2798 voe_.GetAecmMode(aecm_mode, cng_enabled);
2799 voe_.GetAgcStatus(agc_enabled, agc_mode);
2800 voe_.GetAgcConfig(agc_config);
2801 voe_.GetNsStatus(ns_enabled, ns_mode);
2802 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2803 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2804 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2805 EXPECT_TRUE(ec_enabled);
2806 EXPECT_TRUE(ec_metrics_enabled);
2807 EXPECT_FALSE(cng_enabled);
2808 EXPECT_TRUE(agc_enabled);
2809 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2810 EXPECT_TRUE(ns_enabled);
2811 EXPECT_TRUE(highpass_filter_enabled);
2812 EXPECT_FALSE(stereo_swapping_enabled);
2813 EXPECT_TRUE(typing_detection_enabled);
2814 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2815 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
Henrik Lundin64dad832015-05-11 12:44:23 +02002816 EXPECT_EQ(50, voe_.GetNetEqCapacity()); // From GetDefaultEngineOptions().
Henrik Lundin5263b3c2015-06-01 10:29:41 +02002817 EXPECT_FALSE(
2818 voe_.GetNetEqFastAccelerate()); // From GetDefaultEngineOptions().
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002819
2820 // Turn echo cancellation off
2821 options.echo_cancellation.Set(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002822 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002823 voe_.GetEcStatus(ec_enabled, ec_mode);
2824 EXPECT_FALSE(ec_enabled);
2825
2826 // Turn echo cancellation back on, with settings, and make sure
2827 // nothing else changed.
2828 options.echo_cancellation.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002829 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002830 voe_.GetEcStatus(ec_enabled, ec_mode);
2831 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2832 voe_.GetAecmMode(aecm_mode, cng_enabled);
2833 voe_.GetAgcStatus(agc_enabled, agc_mode);
2834 voe_.GetAgcConfig(agc_config);
2835 voe_.GetNsStatus(ns_enabled, ns_mode);
2836 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2837 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2838 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2839 EXPECT_TRUE(ec_enabled);
2840 EXPECT_TRUE(ec_metrics_enabled);
2841 EXPECT_TRUE(agc_enabled);
2842 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2843 EXPECT_TRUE(ns_enabled);
2844 EXPECT_TRUE(highpass_filter_enabled);
2845 EXPECT_FALSE(stereo_swapping_enabled);
2846 EXPECT_TRUE(typing_detection_enabled);
2847 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2848 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2849
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002850 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2851 // control.
2852 options.delay_agnostic_aec.Set(true);
2853 ASSERT_TRUE(engine_.SetOptions(options));
2854 voe_.GetEcStatus(ec_enabled, ec_mode);
2855 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2856 voe_.GetAecmMode(aecm_mode, cng_enabled);
2857 EXPECT_TRUE(ec_enabled);
2858 EXPECT_TRUE(ec_metrics_enabled);
2859 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2860
2861 // Turn off echo cancellation and delay agnostic aec.
2862 options.delay_agnostic_aec.Set(false);
Henrik Lundin441f6342015-06-09 16:03:13 +02002863 options.extended_filter_aec.Set(false);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002864 options.echo_cancellation.Set(false);
2865 ASSERT_TRUE(engine_.SetOptions(options));
2866 voe_.GetEcStatus(ec_enabled, ec_mode);
2867 EXPECT_FALSE(ec_enabled);
2868 // Turning delay agnostic aec back on should also turn on echo cancellation.
2869 options.delay_agnostic_aec.Set(true);
2870 ASSERT_TRUE(engine_.SetOptions(options));
2871 voe_.GetEcStatus(ec_enabled, ec_mode);
2872 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2873 EXPECT_TRUE(ec_enabled);
2874 EXPECT_TRUE(ec_metrics_enabled);
2875 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2876
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002877 // Turn off AGC
2878 options.auto_gain_control.Set(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002879 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002880 voe_.GetAgcStatus(agc_enabled, agc_mode);
2881 EXPECT_FALSE(agc_enabled);
2882
2883 // Turn AGC back on
2884 options.auto_gain_control.Set(true);
2885 options.adjust_agc_delta.Clear();
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002886 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002887 voe_.GetAgcStatus(agc_enabled, agc_mode);
2888 EXPECT_TRUE(agc_enabled);
2889 voe_.GetAgcConfig(agc_config);
2890 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2891
2892 // Turn off other options (and stereo swapping on).
2893 options.noise_suppression.Set(false);
2894 options.highpass_filter.Set(false);
2895 options.typing_detection.Set(false);
2896 options.stereo_swapping.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002897 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002898 voe_.GetNsStatus(ns_enabled, ns_mode);
2899 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2900 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2901 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2902 EXPECT_FALSE(ns_enabled);
2903 EXPECT_FALSE(highpass_filter_enabled);
2904 EXPECT_FALSE(typing_detection_enabled);
2905 EXPECT_TRUE(stereo_swapping_enabled);
2906
2907 // Turn on "conference mode" to ensure it has no impact.
2908 options.conference_mode.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002909 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002910 voe_.GetEcStatus(ec_enabled, ec_mode);
2911 voe_.GetNsStatus(ns_enabled, ns_mode);
2912 EXPECT_TRUE(ec_enabled);
2913 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2914 EXPECT_FALSE(ns_enabled);
2915 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2916}
2917
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002918TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002919 EXPECT_TRUE(SetupEngine());
2920
2921 bool ec_enabled;
2922 webrtc::EcModes ec_mode;
2923 bool ec_metrics_enabled;
2924 bool agc_enabled;
2925 webrtc::AgcModes agc_mode;
2926 bool ns_enabled;
2927 webrtc::NsModes ns_mode;
2928 bool highpass_filter_enabled;
2929 bool stereo_swapping_enabled;
2930 bool typing_detection_enabled;
2931
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002932 voe_.GetEcStatus(ec_enabled, ec_mode);
2933 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2934 voe_.GetAgcStatus(agc_enabled, agc_mode);
2935 voe_.GetNsStatus(ns_enabled, ns_mode);
2936 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2937 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2938 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2939 EXPECT_TRUE(ec_enabled);
2940 EXPECT_TRUE(agc_enabled);
2941 EXPECT_TRUE(ns_enabled);
2942 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002943 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002944 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002945}
2946
2947TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2948 webrtc::AgcConfig set_config = {0};
2949 set_config.targetLeveldBOv = 3;
2950 set_config.digitalCompressionGaindB = 9;
2951 set_config.limiterEnable = true;
2952 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002953 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002954
2955 webrtc::AgcConfig config = {0};
2956 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2957 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2958 EXPECT_EQ(set_config.digitalCompressionGaindB,
2959 config.digitalCompressionGaindB);
2960 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2961}
2962
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002963TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
2964 EXPECT_TRUE(SetupEngine());
solenberg66f43392015-09-09 01:36:22 -07002965 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2966 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002967 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002968 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2969 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002970 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002971
2972 // Have to add a stream to make SetSend work.
2973 cricket::StreamParams stream1;
2974 stream1.ssrcs.push_back(1);
2975 channel1->AddSendStream(stream1);
2976 cricket::StreamParams stream2;
2977 stream2.ssrcs.push_back(2);
2978 channel2->AddSendStream(stream2);
2979
2980 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002981 cricket::AudioSendParameters parameters_options_all = send_parameters_;
2982 parameters_options_all.options.echo_cancellation.Set(true);
2983 parameters_options_all.options.auto_gain_control.Set(true);
2984 parameters_options_all.options.noise_suppression.Set(true);
2985 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2986 EXPECT_EQ(parameters_options_all.options, channel1->options());
2987 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2988 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002989
2990 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002991 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
2992 parameters_options_no_ns.options.noise_suppression.Set(false);
2993 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2994 cricket::AudioOptions expected_options = parameters_options_all.options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002995 expected_options.echo_cancellation.Set(true);
2996 expected_options.auto_gain_control.Set(true);
2997 expected_options.noise_suppression.Set(false);
solenberg66f43392015-09-09 01:36:22 -07002998 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002999
3000 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003001 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
3002 parameters_options_no_agc.options.auto_gain_control.Set(false);
3003 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003004 expected_options.echo_cancellation.Set(true);
3005 expected_options.auto_gain_control.Set(false);
3006 expected_options.noise_suppression.Set(true);
solenberg66f43392015-09-09 01:36:22 -07003007 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003008
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003009 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003010 bool ec_enabled;
3011 webrtc::EcModes ec_mode;
3012 bool agc_enabled;
3013 webrtc::AgcModes agc_mode;
3014 bool ns_enabled;
3015 webrtc::NsModes ns_mode;
3016 voe_.GetEcStatus(ec_enabled, ec_mode);
3017 voe_.GetAgcStatus(agc_enabled, agc_mode);
3018 voe_.GetNsStatus(ns_enabled, ns_mode);
3019 EXPECT_TRUE(ec_enabled);
3020 EXPECT_TRUE(agc_enabled);
3021 EXPECT_TRUE(ns_enabled);
3022
3023 channel1->SetSend(cricket::SEND_MICROPHONE);
3024 voe_.GetEcStatus(ec_enabled, ec_mode);
3025 voe_.GetAgcStatus(agc_enabled, agc_mode);
3026 voe_.GetNsStatus(ns_enabled, ns_mode);
3027 EXPECT_TRUE(ec_enabled);
3028 EXPECT_TRUE(agc_enabled);
3029 EXPECT_FALSE(ns_enabled);
3030
3031 channel1->SetSend(cricket::SEND_NOTHING);
3032 voe_.GetEcStatus(ec_enabled, ec_mode);
3033 voe_.GetAgcStatus(agc_enabled, agc_mode);
3034 voe_.GetNsStatus(ns_enabled, ns_mode);
3035 EXPECT_TRUE(ec_enabled);
3036 EXPECT_TRUE(agc_enabled);
3037 EXPECT_TRUE(ns_enabled);
3038
3039 channel2->SetSend(cricket::SEND_MICROPHONE);
3040 voe_.GetEcStatus(ec_enabled, ec_mode);
3041 voe_.GetAgcStatus(agc_enabled, agc_mode);
3042 voe_.GetNsStatus(ns_enabled, ns_mode);
3043 EXPECT_TRUE(ec_enabled);
3044 EXPECT_FALSE(agc_enabled);
3045 EXPECT_TRUE(ns_enabled);
3046
3047 channel2->SetSend(cricket::SEND_NOTHING);
3048 voe_.GetEcStatus(ec_enabled, ec_mode);
3049 voe_.GetAgcStatus(agc_enabled, agc_mode);
3050 voe_.GetNsStatus(ns_enabled, ns_mode);
3051 EXPECT_TRUE(ec_enabled);
3052 EXPECT_TRUE(agc_enabled);
3053 EXPECT_TRUE(ns_enabled);
3054
3055 // Make sure settings take effect while we are sending.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003056 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
3057 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
3058 send_parameters_;
3059 parameters_options_no_agc_nor_ns.options.auto_gain_control.Set(false);
3060 parameters_options_no_agc_nor_ns.options.noise_suppression.Set(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003061 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003062 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003063 expected_options.echo_cancellation.Set(true);
3064 expected_options.auto_gain_control.Set(false);
3065 expected_options.noise_suppression.Set(false);
solenberg66f43392015-09-09 01:36:22 -07003066 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003067 voe_.GetEcStatus(ec_enabled, ec_mode);
3068 voe_.GetAgcStatus(agc_enabled, agc_mode);
3069 voe_.GetNsStatus(ns_enabled, ns_mode);
3070 EXPECT_TRUE(ec_enabled);
3071 EXPECT_FALSE(agc_enabled);
3072 EXPECT_FALSE(ns_enabled);
3073}
3074
wu@webrtc.orgde305012013-10-31 15:40:38 +00003075// This test verifies DSCP settings are properly applied on voice media channel.
3076TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
3077 EXPECT_TRUE(SetupEngine());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00003078 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003079 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00003080 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00003081 new cricket::FakeNetworkInterface);
3082 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003083 cricket::AudioSendParameters parameters = send_parameters_;
3084 parameters.options.dscp.Set(true);
3085 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00003086 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00003087 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003088 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00003089 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003090 parameters.options.dscp.Set(false);
3091 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00003092 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00003093}
3094
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003095// Test that GetReceiveChannelNum returns the default channel for the first
3096// recv stream in 1-1 calls.
3097TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelNumIn1To1Calls) {
3098 EXPECT_TRUE(SetupEngine());
3099 cricket::WebRtcVoiceMediaChannel* media_channel =
3100 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3101 // Test that GetChannelNum returns the default channel if the SSRC is unknown.
3102 EXPECT_EQ(media_channel->voe_channel(),
3103 media_channel->GetReceiveChannelNum(0));
3104 cricket::StreamParams stream;
3105 stream.ssrcs.push_back(kSsrc2);
3106 EXPECT_TRUE(channel_->AddRecvStream(stream));
3107 EXPECT_EQ(media_channel->voe_channel(),
3108 media_channel->GetReceiveChannelNum(kSsrc2));
3109}
3110
3111// Test that GetReceiveChannelNum doesn't return the default channel for the
3112// first recv stream in conference calls.
3113TEST_F(WebRtcVoiceEngineTestFake, TestGetChannelNumInConferenceCalls) {
3114 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003115 send_parameters_.options = options_conference_;
3116 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003117 cricket::StreamParams stream;
3118 stream.ssrcs.push_back(kSsrc2);
3119 EXPECT_TRUE(channel_->AddRecvStream(stream));
3120 cricket::WebRtcVoiceMediaChannel* media_channel =
3121 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3122 EXPECT_LT(media_channel->voe_channel(),
3123 media_channel->GetReceiveChannelNum(kSsrc2));
3124}
3125
3126TEST_F(WebRtcVoiceEngineTestFake, SetOutputScaling) {
3127 EXPECT_TRUE(SetupEngine());
solenbergbb741b32015-09-07 03:56:38 -07003128 float scale, left, right;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003129 EXPECT_TRUE(channel_->SetOutputScaling(0, 1, 2));
solenbergbb741b32015-09-07 03:56:38 -07003130 int channel_id = voe_.GetLastChannel();
3131 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3132 EXPECT_EQ(0, voe_.GetOutputVolumePan(channel_id, left, right));
3133 EXPECT_DOUBLE_EQ(1, left * scale);
3134 EXPECT_DOUBLE_EQ(2, right * scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003135
3136 EXPECT_FALSE(channel_->SetOutputScaling(kSsrc2, 1, 2));
3137 cricket::StreamParams stream;
3138 stream.ssrcs.push_back(kSsrc2);
3139 EXPECT_TRUE(channel_->AddRecvStream(stream));
3140
3141 EXPECT_TRUE(channel_->SetOutputScaling(kSsrc2, 2, 1));
solenbergbb741b32015-09-07 03:56:38 -07003142 channel_id = voe_.GetLastChannel();
3143 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3144 EXPECT_EQ(0, voe_.GetOutputVolumePan(channel_id, left, right));
3145 EXPECT_DOUBLE_EQ(2, left * scale);
3146 EXPECT_DOUBLE_EQ(1, right * scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003147}
3148
pbos8fc7fa72015-07-15 08:02:58 -07003149TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
pbos8fc7fa72015-07-15 08:02:58 -07003150 const uint32 kAudioSsrc = 123;
3151 const std::string kSyncLabel = "AvSyncLabel";
3152
3153 EXPECT_TRUE(SetupEngine());
pbos8fc7fa72015-07-15 08:02:58 -07003154 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3155 sp.sync_label = kSyncLabel;
3156 // Creating two channels to make sure that sync label is set properly for both
3157 // the default voice channel and following ones.
3158 EXPECT_TRUE(channel_->AddRecvStream(sp));
3159 sp.ssrcs[0] += 1;
3160 EXPECT_TRUE(channel_->AddRecvStream(sp));
3161
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003162 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003163 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003164 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003165 << "SyncGroup should be set based on sync_label";
3166 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003167 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003168 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003169}
3170
pbos6bb1b6e2015-07-24 07:10:18 -07003171TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003172 // Test that changing the combined_audio_video_bwe option results in the
3173 // expected state changes on an associated Call.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003174 std::vector<uint32> ssrcs;
3175 ssrcs.push_back(223);
3176 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003177
3178 EXPECT_TRUE(SetupEngine());
3179 cricket::WebRtcVoiceMediaChannel* media_channel =
3180 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003181 for (uint32 ssrc : ssrcs) {
3182 EXPECT_TRUE(media_channel->AddRecvStream(
3183 cricket::StreamParams::CreateLegacy(ssrc)));
3184 }
3185 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003186
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003187 // Combined BWE should be disabled.
3188 for (uint32 ssrc : ssrcs) {
3189 const auto* s = call_.GetAudioReceiveStream(ssrc);
3190 EXPECT_NE(nullptr, s);
3191 EXPECT_EQ(false, s->GetConfig().combined_audio_video_bwe);
3192 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003193
3194 // Enable combined BWE option - now it should be set up.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003195 send_parameters_.options.combined_audio_video_bwe.Set(true);
3196 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003197 for (uint32 ssrc : ssrcs) {
3198 const auto* s = call_.GetAudioReceiveStream(ssrc);
3199 EXPECT_NE(nullptr, s);
3200 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
3201 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003202
3203 // Disable combined BWE option - should be disabled again.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003204 send_parameters_.options.combined_audio_video_bwe.Set(false);
3205 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003206 for (uint32 ssrc : ssrcs) {
3207 const auto* s = call_.GetAudioReceiveStream(ssrc);
3208 EXPECT_NE(nullptr, s);
3209 EXPECT_EQ(false, s->GetConfig().combined_audio_video_bwe);
3210 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003211
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003212 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003213}
3214
pbos6bb1b6e2015-07-24 07:10:18 -07003215TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003216 // Test that adding receive streams after enabling combined bandwidth
3217 // estimation will correctly configure each channel.
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003218 EXPECT_TRUE(SetupEngine());
3219 cricket::WebRtcVoiceMediaChannel* media_channel =
3220 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003221 send_parameters_.options.combined_audio_video_bwe.Set(true);
3222 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003223
3224 static const uint32 kSsrcs[] = {1, 2, 3, 4};
3225 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs); ++i) {
3226 EXPECT_TRUE(media_channel->AddRecvStream(
3227 cricket::StreamParams::CreateLegacy(kSsrcs[i])));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003228 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(kSsrcs[i]));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003229 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003230 EXPECT_EQ(ARRAY_SIZE(kSsrcs), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003231}
3232
pbos6bb1b6e2015-07-24 07:10:18 -07003233TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003234 // Test that setting the header extensions results in the expected state
3235 // changes on an associated Call.
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003236 std::vector<uint32> ssrcs;
3237 ssrcs.push_back(223);
3238 ssrcs.push_back(224);
3239
3240 EXPECT_TRUE(SetupEngine());
3241 cricket::WebRtcVoiceMediaChannel* media_channel =
3242 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003243 send_parameters_.options.combined_audio_video_bwe.Set(true);
3244 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003245 for (uint32 ssrc : ssrcs) {
3246 EXPECT_TRUE(media_channel->AddRecvStream(
3247 cricket::StreamParams::CreateLegacy(ssrc)));
3248 }
3249
3250 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003251 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003252 for (uint32 ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003253 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003254 EXPECT_NE(nullptr, s);
3255 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3256 }
3257
3258 // Set up receive extensions.
3259 const auto& e_exts = engine_.rtp_header_extensions();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003260 cricket::AudioRecvParameters recv_parameters;
3261 recv_parameters.extensions = e_exts;
3262 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003263 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003264 for (uint32 ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003265 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003266 EXPECT_NE(nullptr, s);
3267 const auto& s_exts = s->GetConfig().rtp.extensions;
3268 EXPECT_EQ(e_exts.size(), s_exts.size());
3269 for (const auto& e_ext : e_exts) {
3270 for (const auto& s_ext : s_exts) {
3271 if (e_ext.id == s_ext.id) {
3272 EXPECT_EQ(e_ext.uri, s_ext.name);
3273 }
3274 }
3275 }
3276 }
3277
3278 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003279 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003280 for (uint32 ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003281 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003282 EXPECT_NE(nullptr, s);
3283 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3284 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003285}
3286
3287TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3288 // Test that packets are forwarded to the Call when configured accordingly.
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003289 const uint32 kAudioSsrc = 1;
3290 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3291 static const unsigned char kRtcp[] = {
3292 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3293 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3294 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3296 };
3297 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3298
3299 EXPECT_TRUE(SetupEngine());
3300 cricket::WebRtcVoiceMediaChannel* media_channel =
3301 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003302 send_parameters_.options.combined_audio_video_bwe.Set(true);
3303 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003304 EXPECT_TRUE(media_channel->AddRecvStream(
3305 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3306
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003307 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003308 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003309 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003310 EXPECT_EQ(0, s->received_packets());
3311 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3312 EXPECT_EQ(1, s->received_packets());
3313 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3314 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003315}
Minyue2013aec2015-05-13 14:14:42 +02003316
3317// Associate channel should not set on 1:1 call, since the receive channel also
3318// sends RTCP SR.
3319TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelUnset1On1) {
3320 EXPECT_TRUE(SetupEngine());
3321 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3322 int recv_ch = voe_.GetLastChannel();
3323 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3324}
3325
3326// This test is an extension of AssociateChannelUnset1On1. We create two receive
3327// channels. The second should be associated with the default channel, since it
3328// does not send RTCP SR.
3329TEST_F(WebRtcVoiceEngineTestFake, AssociateDefaultChannelOnSecondRecvChannel) {
3330 EXPECT_TRUE(SetupEngine());
3331 cricket::WebRtcVoiceMediaChannel* media_channel =
3332 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3333 int default_channel = media_channel->voe_channel();
3334 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3335 int recv_ch_1 = voe_.GetLastChannel();
3336 EXPECT_EQ(recv_ch_1, default_channel);
3337 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
3338 int recv_ch_2 = voe_.GetLastChannel();
3339 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_1), -1);
3340 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_2), default_channel);
3341 // Add send stream, the association remains.
3342 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(3)));
3343 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_1), -1);
3344 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_2), default_channel);
3345}
3346
3347// In conference mode, all receive channels should be associated with the
3348// default channel, since they do not send RTCP SR.
3349TEST_F(WebRtcVoiceEngineTestFake, AssociateDefaultChannelOnConference) {
3350 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003351 send_parameters_.options = options_conference_;
3352 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003353 cricket::WebRtcVoiceMediaChannel* media_channel =
3354 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3355 int default_channel = media_channel->voe_channel();
3356 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3357 int recv_ch = voe_.GetLastChannel();
3358 EXPECT_NE(recv_ch, default_channel);
3359 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3360 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3361 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3362}
3363
3364TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
3365 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003366 send_parameters_.options = options_conference_;
3367 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003368
3369 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3370 int recv_ch = voe_.GetLastChannel();
3371
3372 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3373 int send_ch = voe_.GetLastChannel();
3374
3375 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3376 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3377 // channel of |recv_ch|.This is not a common case, since, normally, only the
3378 // default channel can be associated. However, the default is not deletable.
3379 // So we force the |recv_ch| to associate with a non-default channel.
3380 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3381 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3382
3383 EXPECT_TRUE(channel_->RemoveSendStream(2));
3384 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3385}
stefan658910c2015-09-03 05:48:32 -07003386
3387// Tests for the actual WebRtc VoE library.
3388
3389TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
3390 cricket::WebRtcVoiceEngine engine;
3391 cricket::AudioOptions options = engine.GetOptions();
3392 // The default options should have at least a few things set. We purposefully
3393 // don't check the option values here, though.
3394 EXPECT_TRUE(options.echo_cancellation.IsSet());
3395 EXPECT_TRUE(options.auto_gain_control.IsSet());
3396 EXPECT_TRUE(options.noise_suppression.IsSet());
3397}
3398
3399// Tests that the library initializes and shuts down properly.
3400TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3401 cricket::WebRtcVoiceEngine engine;
3402 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003403 rtc::scoped_ptr<webrtc::Call> call(
3404 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003405 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003406 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003407 EXPECT_TRUE(channel != nullptr);
3408 delete channel;
3409 engine.Terminate();
3410
3411 // Reinit to catch regression where VoiceEngineObserver reference is lost
3412 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3413 engine.Terminate();
3414}
3415
3416// Tests that the library is configured with the codecs we want.
3417TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
3418 cricket::WebRtcVoiceEngine engine;
3419 // Check codecs by name.
3420 EXPECT_TRUE(engine.FindCodec(
3421 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0)));
3422 EXPECT_TRUE(engine.FindCodec(
3423 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0)));
3424 EXPECT_TRUE(engine.FindCodec(
3425 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0)));
3426 // Check that name matching is case-insensitive.
3427 EXPECT_TRUE(engine.FindCodec(
3428 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0)));
3429 EXPECT_TRUE(engine.FindCodec(
3430 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0)));
3431 EXPECT_TRUE(engine.FindCodec(
3432 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0)));
3433 EXPECT_TRUE(engine.FindCodec(
3434 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0)));
3435 EXPECT_TRUE(engine.FindCodec(
3436 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0)));
3437 EXPECT_TRUE(engine.FindCodec(
3438 cricket::AudioCodec(96, "red", 8000, 0, 1, 0)));
3439 EXPECT_TRUE(engine.FindCodec(
3440 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0)));
3441 EXPECT_TRUE(engine.FindCodec(
3442 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0)));
3443 EXPECT_TRUE(engine.FindCodec(
3444 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0)));
3445 EXPECT_TRUE(engine.FindCodec(
3446 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0)));
3447 // Check codecs with an id by id.
3448 EXPECT_TRUE(engine.FindCodec(
3449 cricket::AudioCodec(0, "", 8000, 0, 1, 0))); // PCMU
3450 EXPECT_TRUE(engine.FindCodec(
3451 cricket::AudioCodec(8, "", 8000, 0, 1, 0))); // PCMA
3452 EXPECT_TRUE(engine.FindCodec(
3453 cricket::AudioCodec(9, "", 8000, 0, 1, 0))); // G722
3454 EXPECT_TRUE(engine.FindCodec(
3455 cricket::AudioCodec(13, "", 8000, 0, 1, 0))); // CN
3456 // Check sample/bitrate matching.
3457 EXPECT_TRUE(engine.FindCodec(
3458 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0)));
3459 // Check that bad codecs fail.
3460 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0)));
3461 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(88, "", 0, 0, 1, 0)));
3462 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 0, 2, 0)));
3463 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 5000, 0, 1, 0)));
3464 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 5000, 1, 0)));
3465 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3466 for (std::vector<cricket::AudioCodec>::const_iterator it =
3467 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3468 if (it->name == "CN" && it->clockrate == 16000) {
3469 EXPECT_EQ(105, it->id);
3470 } else if (it->name == "CN" && it->clockrate == 32000) {
3471 EXPECT_EQ(106, it->id);
3472 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3473 EXPECT_EQ(103, it->id);
3474 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3475 EXPECT_EQ(104, it->id);
3476 } else if (it->name == "G722" && it->clockrate == 8000) {
3477 EXPECT_EQ(9, it->id);
3478 } else if (it->name == "telephone-event") {
3479 EXPECT_EQ(126, it->id);
3480 } else if (it->name == "red") {
3481 EXPECT_EQ(127, it->id);
3482 } else if (it->name == "opus") {
3483 EXPECT_EQ(111, it->id);
3484 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3485 EXPECT_EQ("10", it->params.find("minptime")->second);
3486 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3487 EXPECT_EQ("60", it->params.find("maxptime")->second);
3488 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3489 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3490 }
3491 }
3492
3493 engine.Terminate();
3494}
3495
3496// Tests that VoE supports at least 32 channels
3497TEST(WebRtcVoiceEngineTest, Has32Channels) {
3498 cricket::WebRtcVoiceEngine engine;
3499 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003500 rtc::scoped_ptr<webrtc::Call> call(
3501 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003502
3503 cricket::VoiceMediaChannel* channels[32];
3504 int num_channels = 0;
stefan658910c2015-09-03 05:48:32 -07003505 while (num_channels < ARRAY_SIZE(channels)) {
3506 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003507 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003508 if (!channel)
3509 break;
stefan658910c2015-09-03 05:48:32 -07003510 channels[num_channels++] = channel;
3511 }
3512
3513 int expected = ARRAY_SIZE(channels);
3514 EXPECT_EQ(expected, num_channels);
3515
3516 while (num_channels > 0) {
3517 delete channels[--num_channels];
3518 }
3519
3520 engine.Terminate();
3521}
3522
3523// Test that we set our preferred codecs properly.
3524TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3525 cricket::WebRtcVoiceEngine engine;
3526 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003527 rtc::scoped_ptr<webrtc::Call> call(
3528 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003529 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3530 call.get());
3531 cricket::AudioRecvParameters parameters;
3532 parameters.codecs = engine.codecs();
3533 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003534}