blob: 70318d14f72c5cbaada7e39359a9eb5f6e3fe969 [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
2 * libjingle
3 * Copyright 2008 Google Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000027
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000028#include "webrtc/base/byteorder.h"
29#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020030#include "webrtc/call.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000031#include "talk/media/base/constants.h"
32#include "talk/media/base/fakemediaengine.h"
wu@webrtc.orgde305012013-10-31 15:40:38 +000033#include "talk/media/base/fakenetworkinterface.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034#include "talk/media/base/fakertp.h"
Fredrik Solenberg4b60c732015-05-07 14:07:48 +020035#include "talk/media/webrtc/fakewebrtccall.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000036#include "talk/media/webrtc/fakewebrtcvoiceengine.h"
37#include "talk/media/webrtc/webrtcvoiceengine.h"
deadbeefcbecd352015-09-23 11:50:27 -070038#include "webrtc/p2p/base/faketransportcontroller.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000039#include "talk/session/media/channel.h"
40
41// Tests for the WebRtcVoiceEngine/VoiceChannel code.
42
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000043using cricket::kRtpAudioLevelHeaderExtension;
44using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
45
henrike@webrtc.org28e20752013-07-10 00:45:36 +000046static const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
47static const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000048static const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +000049static const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
50static const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000051static const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
52static const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
53static const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
54static const cricket::AudioCodec
55 kTelephoneEventCodec(106, "telephone-event", 8000, 0, 1, 0);
56static const cricket::AudioCodec* const kAudioCodecs[] = {
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +000057 &kPcmuCodec, &kIsacCodec, &kOpusCodec, &kG722CodecVoE, &kRedCodec,
58 &kCn8000Codec, &kCn16000Codec, &kTelephoneEventCodec,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000059};
Peter Boström0c4e06b2015-10-07 12:23:21 +020060static uint32_t kSsrc1 = 0x99;
61static uint32_t kSsrc2 = 0x98;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000062
63class FakeVoEWrapper : public cricket::VoEWrapper {
64 public:
65 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
66 : cricket::VoEWrapper(engine, // processing
67 engine, // base
68 engine, // codec
69 engine, // dtmf
henrike@webrtc.org28e20752013-07-10 00:45:36 +000070 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000071 engine, // neteq
72 engine, // network
73 engine, // rtp
74 engine, // sync
75 engine) { // volume
76 }
77};
78
wu@webrtc.org97077a32013-10-25 21:18:33 +000079class FakeVoETraceWrapper : public cricket::VoETraceWrapper {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080 public:
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +020081 int SetTraceFilter(const unsigned int filter) override {
wu@webrtc.org97077a32013-10-25 21:18:33 +000082 filter_ = filter;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083 return 0;
84 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +020085 int SetTraceFile(const char* fileNameUTF8) override { return 0; }
86 int SetTraceCallback(webrtc::TraceCallback* callback) override { return 0; }
wu@webrtc.org97077a32013-10-25 21:18:33 +000087 unsigned int filter_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088};
89
90class WebRtcVoiceEngineTestFake : public testing::Test {
91 public:
henrike@webrtc.org28e20752013-07-10 00:45:36 +000092 WebRtcVoiceEngineTestFake()
Fredrik Solenberg709ed672015-09-15 12:26:33 +020093 : call_(webrtc::Call::Config()),
94 voe_(kAudioCodecs, ARRAY_SIZE(kAudioCodecs)),
wu@webrtc.org97077a32013-10-25 21:18:33 +000095 trace_wrapper_(new FakeVoETraceWrapper()),
Jelena Marusicc28a8962015-05-29 15:05:44 +020096 engine_(new FakeVoEWrapper(&voe_), trace_wrapper_),
97 channel_(nullptr) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +020098 send_parameters_.codecs.push_back(kPcmuCodec);
99 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000100 options_conference_.conference_mode.Set(true);
101 options_adjust_agc_.adjust_agc_delta.Set(-10);
102 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000103 bool SetupEngineWithoutStream() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000104 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000105 return false;
106 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200107 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200108 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000109 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000110 bool SetupEngine() {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000111 if (!SetupEngineWithoutStream()) {
112 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000113 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000114 return channel_->AddSendStream(
115 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000116 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000117 void SetupForMultiSendStream() {
118 EXPECT_TRUE(SetupEngine());
119 // Remove stream added in Setup, which is corresponding to default channel.
120 int default_channel_num = voe_.GetLastChannel();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200121 uint32_t default_send_ssrc = 0u;
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000122 EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
123 EXPECT_EQ(kSsrc1, default_send_ssrc);
124 EXPECT_TRUE(channel_->RemoveSendStream(default_send_ssrc));
125
126 // Verify the default channel still exists.
127 EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
128 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000129 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200130 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000131 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000132 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200133 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000134 delete channel_;
135 engine_.Terminate();
136 }
137
Peter Boström0c4e06b2015-10-07 12:23:21 +0200138 void TestInsertDtmf(uint32_t ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000139 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200140 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200141 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000142 if (caller) {
143 // if this is a caller, local description will be applied and add the
144 // send stream.
145 EXPECT_TRUE(channel_->AddSendStream(
146 cricket::StreamParams::CreateLegacy(kSsrc1)));
147 }
148 int channel_id = voe_.GetLastChannel();
149
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000150 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200151 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000152 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
153 EXPECT_FALSE(channel_->CanInsertDtmf());
154 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111, cricket::DF_SEND));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200155 send_parameters_.codecs.push_back(kTelephoneEventCodec);
156 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000157 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000158
159 if (!caller) {
160 // There's no active send channel yet.
161 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
162 EXPECT_TRUE(channel_->AddSendStream(
163 cricket::StreamParams::CreateLegacy(kSsrc1)));
164 }
165
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000166 // Check we fail if the ssrc is invalid.
167 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111, cricket::DF_SEND));
168
169 // Test send
170 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
171 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
172 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
173
174 // Test play
175 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(3, 134));
176 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 3, 134, cricket::DF_PLAY));
177 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(3, 134));
178
179 // Test send and play
180 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
181 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(4, 145));
182 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 4, 145,
183 cricket::DF_PLAY | cricket::DF_SEND));
184 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
185 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(4, 145));
186 }
187
188 // Test that send bandwidth is set correctly.
189 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000190 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
191 // |expected_result| is the expected result from SetMaxSendBandwidth().
192 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000193 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000194 int max_bitrate,
195 bool expected_result,
196 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200197 cricket::AudioSendParameters parameters;
198 parameters.codecs.push_back(codec);
199 parameters.max_bandwidth_bps = max_bitrate;
200 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
201
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000202 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000203 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000204 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000205 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000206 }
207
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000208 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
209 EXPECT_TRUE(SetupEngineWithoutStream());
210 int channel_num = voe_.GetLastChannel();
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000211
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000212 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000213 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000214
215 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200216 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000217 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200218 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000219 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000220
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000221 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200222 send_parameters_.extensions.clear();
223 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000224 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000225
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000226 // Ensure extension is set properly.
227 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200228 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
229 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000230 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000231
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000232 // Ensure extension is set properly on new channel.
233 // The first stream to occupy the default channel.
234 EXPECT_TRUE(channel_->AddSendStream(
235 cricket::StreamParams::CreateLegacy(123)));
236 EXPECT_TRUE(channel_->AddSendStream(
237 cricket::StreamParams::CreateLegacy(234)));
238 int new_channel_num = voe_.GetLastChannel();
239 EXPECT_NE(channel_num, new_channel_num);
240 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000241
242 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200243 send_parameters_.codecs.push_back(kPcmuCodec);
244 send_parameters_.extensions.clear();
245 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000246 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
247 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000248 }
249
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000250 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
251 EXPECT_TRUE(SetupEngineWithoutStream());
252 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000253
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000254 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000255 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000256
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200257 cricket::AudioRecvParameters parameters;
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000258 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200259 parameters.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000260 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200261 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000262 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000263
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000264 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200265 parameters.extensions.clear();
266 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000267 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000268
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000269 // Ensure extension is set properly.
270 const int id = 2;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200271 parameters.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
272 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000273 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000274
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000275 // Ensure extension is set properly on new channel.
276 // The first stream to occupy the default channel.
277 EXPECT_TRUE(channel_->AddRecvStream(
278 cricket::StreamParams::CreateLegacy(345)));
279 EXPECT_TRUE(channel_->AddRecvStream(
280 cricket::StreamParams::CreateLegacy(456)));
281 int new_channel_num = voe_.GetLastChannel();
282 EXPECT_NE(channel_num, new_channel_num);
283 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
284
285 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200286 parameters.extensions.clear();
287 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000288 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
289 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000290 }
291
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000292 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200293 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000294 cricket::FakeWebRtcVoiceEngine voe_;
wu@webrtc.org97077a32013-10-25 21:18:33 +0000295 FakeVoETraceWrapper* trace_wrapper_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000296 cricket::WebRtcVoiceEngine engine_;
297 cricket::VoiceMediaChannel* channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000298
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200299 cricket::AudioSendParameters send_parameters_;
300 cricket::AudioRecvParameters recv_parameters_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000301 cricket::AudioOptions options_conference_;
302 cricket::AudioOptions options_adjust_agc_;
303};
304
305// Tests that our stub library "works".
306TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
307 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000308 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000309 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000310 engine_.Terminate();
311 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000312}
313
314// Tests that we can create and destroy a channel.
315TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000316 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200317 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200318 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000319}
320
321// Tests that we properly handle failures in CreateChannel.
322TEST_F(WebRtcVoiceEngineTestFake, CreateChannelFail) {
323 voe_.set_fail_create_channel(true);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000324 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200325 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200326 EXPECT_TRUE(channel_ == nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000327}
328
329// Tests that the list of supported codecs is created properly and ordered
330// correctly
331TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
332 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
333 ASSERT_FALSE(codecs.empty());
334 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
335 EXPECT_EQ(48000, codecs[0].clockrate);
336 EXPECT_EQ(2, codecs[0].channels);
337 EXPECT_EQ(64000, codecs[0].bitrate);
338 int pref = codecs[0].preference;
339 for (size_t i = 1; i < codecs.size(); ++i) {
340 EXPECT_GT(pref, codecs[i].preference);
341 pref = codecs[i].preference;
342 }
343}
344
345// Tests that we can find codecs by name or id, and that we interpret the
346// clockrate and bitrate fields properly.
347TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
348 cricket::AudioCodec codec;
349 webrtc::CodecInst codec_inst;
350 // Find PCMU with explicit clockrate and bitrate.
351 EXPECT_TRUE(engine_.FindWebRtcCodec(kPcmuCodec, &codec_inst));
352 // Find ISAC with explicit clockrate and 0 bitrate.
353 EXPECT_TRUE(engine_.FindWebRtcCodec(kIsacCodec, &codec_inst));
354 // Find telephone-event with explicit clockrate and 0 bitrate.
355 EXPECT_TRUE(engine_.FindWebRtcCodec(kTelephoneEventCodec, &codec_inst));
356 // Find ISAC with a different payload id.
357 codec = kIsacCodec;
358 codec.id = 127;
359 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
360 EXPECT_EQ(codec.id, codec_inst.pltype);
361 // Find PCMU with a 0 clockrate.
362 codec = kPcmuCodec;
363 codec.clockrate = 0;
364 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
365 EXPECT_EQ(codec.id, codec_inst.pltype);
366 EXPECT_EQ(8000, codec_inst.plfreq);
367 // Find PCMU with a 0 bitrate.
368 codec = kPcmuCodec;
369 codec.bitrate = 0;
370 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
371 EXPECT_EQ(codec.id, codec_inst.pltype);
372 EXPECT_EQ(64000, codec_inst.rate);
373 // Find ISAC with an explicit bitrate.
374 codec = kIsacCodec;
375 codec.bitrate = 32000;
376 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
377 EXPECT_EQ(codec.id, codec_inst.pltype);
378 EXPECT_EQ(32000, codec_inst.rate);
379}
380
381// Test that we set our inbound codecs properly, including changing PT.
382TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
383 EXPECT_TRUE(SetupEngine());
384 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200385 cricket::AudioRecvParameters parameters;
386 parameters.codecs.push_back(kIsacCodec);
387 parameters.codecs.push_back(kPcmuCodec);
388 parameters.codecs.push_back(kTelephoneEventCodec);
389 parameters.codecs[0].id = 106; // collide with existing telephone-event
390 parameters.codecs[2].id = 126;
391 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000392 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000393 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000394 gcodec.plfreq = 16000;
395 gcodec.channels = 1;
396 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
397 EXPECT_EQ(106, gcodec.pltype);
398 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000399 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000400 "telephone-event");
401 gcodec.plfreq = 8000;
402 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
403 EXPECT_EQ(126, gcodec.pltype);
404 EXPECT_STREQ("telephone-event", gcodec.plname);
405}
406
407// Test that we fail to set an unknown inbound codec.
408TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
409 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200410 cricket::AudioRecvParameters parameters;
411 parameters.codecs.push_back(kIsacCodec);
412 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
413 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000414}
415
416// Test that we fail if we have duplicate types in the inbound list.
417TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
418 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200419 cricket::AudioRecvParameters parameters;
420 parameters.codecs.push_back(kIsacCodec);
421 parameters.codecs.push_back(kCn16000Codec);
422 parameters.codecs[1].id = kIsacCodec.id;
423 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000424}
425
426// Test that we can decode OPUS without stereo parameters.
427TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
428 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200429 cricket::AudioRecvParameters parameters;
430 parameters.codecs.push_back(kIsacCodec);
431 parameters.codecs.push_back(kPcmuCodec);
432 parameters.codecs.push_back(kOpusCodec);
433 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000434 EXPECT_TRUE(channel_->AddRecvStream(
435 cricket::StreamParams::CreateLegacy(kSsrc1)));
436 int channel_num2 = voe_.GetLastChannel();
437 webrtc::CodecInst opus;
438 engine_.FindWebRtcCodec(kOpusCodec, &opus);
439 // Even without stereo parameters, recv codecs still specify channels = 2.
440 EXPECT_EQ(2, opus.channels);
441 EXPECT_EQ(111, opus.pltype);
442 EXPECT_STREQ("opus", opus.plname);
443 opus.pltype = 0;
444 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
445 EXPECT_EQ(111, opus.pltype);
446}
447
448// Test that we can decode OPUS with stereo = 0.
449TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
450 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200451 cricket::AudioRecvParameters parameters;
452 parameters.codecs.push_back(kIsacCodec);
453 parameters.codecs.push_back(kPcmuCodec);
454 parameters.codecs.push_back(kOpusCodec);
455 parameters.codecs[2].params["stereo"] = "0";
456 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000457 EXPECT_TRUE(channel_->AddRecvStream(
458 cricket::StreamParams::CreateLegacy(kSsrc1)));
459 int channel_num2 = voe_.GetLastChannel();
460 webrtc::CodecInst opus;
461 engine_.FindWebRtcCodec(kOpusCodec, &opus);
462 // Even when stereo is off, recv codecs still specify channels = 2.
463 EXPECT_EQ(2, opus.channels);
464 EXPECT_EQ(111, opus.pltype);
465 EXPECT_STREQ("opus", opus.plname);
466 opus.pltype = 0;
467 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
468 EXPECT_EQ(111, opus.pltype);
469}
470
471// Test that we can decode OPUS with stereo = 1.
472TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
473 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200474 cricket::AudioRecvParameters parameters;
475 parameters.codecs.push_back(kIsacCodec);
476 parameters.codecs.push_back(kPcmuCodec);
477 parameters.codecs.push_back(kOpusCodec);
478 parameters.codecs[2].params["stereo"] = "1";
479 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000480 EXPECT_TRUE(channel_->AddRecvStream(
481 cricket::StreamParams::CreateLegacy(kSsrc1)));
482 int channel_num2 = voe_.GetLastChannel();
483 webrtc::CodecInst opus;
484 engine_.FindWebRtcCodec(kOpusCodec, &opus);
485 EXPECT_EQ(2, opus.channels);
486 EXPECT_EQ(111, opus.pltype);
487 EXPECT_STREQ("opus", opus.plname);
488 opus.pltype = 0;
489 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
490 EXPECT_EQ(111, opus.pltype);
491}
492
493// Test that changes to recv codecs are applied to all streams.
494TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
495 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200496 cricket::AudioRecvParameters parameters;
497 parameters.codecs.push_back(kIsacCodec);
498 parameters.codecs.push_back(kPcmuCodec);
499 parameters.codecs.push_back(kTelephoneEventCodec);
500 parameters.codecs[0].id = 106; // collide with existing telephone-event
501 parameters.codecs[2].id = 126;
502 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000503 EXPECT_TRUE(channel_->AddRecvStream(
504 cricket::StreamParams::CreateLegacy(kSsrc1)));
505 int channel_num2 = voe_.GetLastChannel();
506 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000507 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000508 gcodec.plfreq = 16000;
509 gcodec.channels = 1;
510 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
511 EXPECT_EQ(106, gcodec.pltype);
512 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000513 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000514 "telephone-event");
515 gcodec.plfreq = 8000;
516 gcodec.channels = 1;
517 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
518 EXPECT_EQ(126, gcodec.pltype);
519 EXPECT_STREQ("telephone-event", gcodec.plname);
520}
521
522TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
523 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200524 cricket::AudioRecvParameters parameters;
525 parameters.codecs.push_back(kIsacCodec);
526 parameters.codecs[0].id = 106; // collide with existing telephone-event
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000527 EXPECT_TRUE(channel_->AddRecvStream(
528 cricket::StreamParams::CreateLegacy(kSsrc1)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200529 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000530
531 int channel_num2 = voe_.GetLastChannel();
532 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000533 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000534 gcodec.plfreq = 16000;
535 gcodec.channels = 1;
536 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
537 EXPECT_EQ(106, gcodec.pltype);
538 EXPECT_STREQ("ISAC", gcodec.plname);
539}
540
541// Test that we can apply the same set of codecs again while playing.
542TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
543 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200544 cricket::AudioRecvParameters parameters;
545 parameters.codecs.push_back(kIsacCodec);
546 parameters.codecs.push_back(kCn16000Codec);
547 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000548 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200549 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000550
551 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200552 parameters.codecs[0].id = 127;
553 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
554 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000555 EXPECT_TRUE(voe_.GetPlayout(channel_num));
556}
557
558// Test that we can add a codec while playing.
559TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
560 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200561 cricket::AudioRecvParameters parameters;
562 parameters.codecs.push_back(kIsacCodec);
563 parameters.codecs.push_back(kCn16000Codec);
564 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000565 EXPECT_TRUE(channel_->SetPlayout(true));
566
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200567 parameters.codecs.push_back(kOpusCodec);
568 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
569 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000570 EXPECT_TRUE(voe_.GetPlayout(channel_num));
571 webrtc::CodecInst gcodec;
572 EXPECT_TRUE(engine_.FindWebRtcCodec(kOpusCodec, &gcodec));
573 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
574}
575
576TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
577 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000578
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000579 // Test that when autobw is enabled, bitrate is kept as the default
580 // value. autobw is enabled for the following tests because the target
581 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000582
583 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000584 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000585
586 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000587 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000588
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000589 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000590 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000591}
592
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000593TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000594 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000595
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000596 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000597
598 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000599 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
600 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000602 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000603 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
604 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000605}
606
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000607TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
608 EXPECT_TRUE(SetupEngine());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000609
610 // Test that we can only set a maximum bitrate for a fixed-rate codec
611 // if it's bigger than the fixed rate.
612
613 // PCMU, fixed bitrate == 64000.
614 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
615 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
616 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
617 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
618 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
619 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
620 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
621}
622
623TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200624 EXPECT_TRUE(SetupEngineWithoutStream());
625 const int kDesiredBitrate = 128000;
626 cricket::AudioSendParameters parameters;
627 parameters.codecs = engine_.codecs();
628 parameters.max_bandwidth_bps = kDesiredBitrate;
629 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000630
631 EXPECT_TRUE(channel_->AddSendStream(
632 cricket::StreamParams::CreateLegacy(kSsrc1)));
633
634 int channel_num = voe_.GetLastChannel();
635 webrtc::CodecInst codec;
636 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200637 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000638}
639
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000640// Test that bitrate cannot be set for CBR codecs.
641// Bitrate is ignored if it is higher than the fixed bitrate.
642// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000643TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000644 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645
646 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200647 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
648 int channel_num = voe_.GetLastChannel();
649 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000650 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
651 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200652
653 send_parameters_.max_bandwidth_bps = 128000;
654 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000655 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
656 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200657
658 send_parameters_.max_bandwidth_bps = 128;
659 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000660 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
661 EXPECT_EQ(64000, codec.rate);
662}
663
664// Test that we apply codecs properly.
665TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
666 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200667 cricket::AudioSendParameters parameters;
668 parameters.codecs.push_back(kIsacCodec);
669 parameters.codecs.push_back(kPcmuCodec);
670 parameters.codecs.push_back(kRedCodec);
671 parameters.codecs[0].id = 96;
672 parameters.codecs[0].bitrate = 48000;
673 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000674 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200675 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000676 webrtc::CodecInst gcodec;
677 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
678 EXPECT_EQ(96, gcodec.pltype);
679 EXPECT_EQ(48000, gcodec.rate);
680 EXPECT_STREQ("ISAC", gcodec.plname);
681 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000682 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000683 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
684 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
685 EXPECT_EQ(106, voe_.GetSendTelephoneEventPayloadType(channel_num));
686}
687
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000688// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
689// to apply.
690TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
691 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200692 cricket::AudioSendParameters parameters;
693 parameters.codecs.push_back(kIsacCodec);
694 parameters.codecs.push_back(kPcmuCodec);
695 parameters.codecs.push_back(kRedCodec);
696 parameters.codecs[0].id = 96;
697 parameters.codecs[0].bitrate = 48000;
698 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000699 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
700 // Calling SetSendCodec again with same codec which is already set.
701 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200702 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000703 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
704}
705
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000706// Verify that G722 is set with 16000 samples per second to WebRTC.
707TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
708 EXPECT_TRUE(SetupEngine());
709 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200710 cricket::AudioSendParameters parameters;
711 parameters.codecs.push_back(kG722CodecSdp);
712 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000713 webrtc::CodecInst gcodec;
714 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
715 EXPECT_STREQ("G722", gcodec.plname);
716 EXPECT_EQ(1, gcodec.channels);
717 EXPECT_EQ(16000, gcodec.plfreq);
718}
719
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000720// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000721TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
722 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200723 cricket::AudioSendParameters parameters;
724 parameters.codecs.push_back(kOpusCodec);
725 parameters.codecs[0].bitrate = 0;
726 parameters.codecs[0].clockrate = 50000;
727 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000728}
729
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000730// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000731TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
732 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200733 cricket::AudioSendParameters parameters;
734 parameters.codecs.push_back(kOpusCodec);
735 parameters.codecs[0].bitrate = 0;
736 parameters.codecs[0].channels = 0;
737 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000738}
739
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000740// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000741TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
742 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200743 cricket::AudioSendParameters parameters;
744 parameters.codecs.push_back(kOpusCodec);
745 parameters.codecs[0].bitrate = 0;
746 parameters.codecs[0].channels = 0;
747 parameters.codecs[0].params["stereo"] = "1";
748 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000749}
750
751// Test that if channel is 1 for opus and there's no stereo, we fail.
752TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
753 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200754 cricket::AudioSendParameters parameters;
755 parameters.codecs.push_back(kOpusCodec);
756 parameters.codecs[0].bitrate = 0;
757 parameters.codecs[0].channels = 1;
758 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000759}
760
761// Test that if channel is 1 for opus and stereo=0, we fail.
762TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
763 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200764 cricket::AudioSendParameters parameters;
765 parameters.codecs.push_back(kOpusCodec);
766 parameters.codecs[0].bitrate = 0;
767 parameters.codecs[0].channels = 1;
768 parameters.codecs[0].params["stereo"] = "0";
769 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000770}
771
772// Test that if channel is 1 for opus and stereo=1, we fail.
773TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
774 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200775 cricket::AudioSendParameters parameters;
776 parameters.codecs.push_back(kOpusCodec);
777 parameters.codecs[0].bitrate = 0;
778 parameters.codecs[0].channels = 1;
779 parameters.codecs[0].params["stereo"] = "1";
780 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000781}
782
783// Test that with bitrate=0 and no stereo,
784// channels and bitrate are 1 and 32000.
785TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
786 EXPECT_TRUE(SetupEngine());
787 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200788 cricket::AudioSendParameters parameters;
789 parameters.codecs.push_back(kOpusCodec);
790 parameters.codecs[0].bitrate = 0;
791 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000792 webrtc::CodecInst gcodec;
793 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
794 EXPECT_STREQ("opus", gcodec.plname);
795 EXPECT_EQ(1, gcodec.channels);
796 EXPECT_EQ(32000, gcodec.rate);
797}
798
799// Test that with bitrate=0 and stereo=0,
800// channels and bitrate are 1 and 32000.
801TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
802 EXPECT_TRUE(SetupEngine());
803 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200804 cricket::AudioSendParameters parameters;
805 parameters.codecs.push_back(kOpusCodec);
806 parameters.codecs[0].bitrate = 0;
807 parameters.codecs[0].params["stereo"] = "0";
808 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000809 webrtc::CodecInst gcodec;
810 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
811 EXPECT_STREQ("opus", gcodec.plname);
812 EXPECT_EQ(1, gcodec.channels);
813 EXPECT_EQ(32000, gcodec.rate);
814}
815
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000816// Test that with bitrate=invalid and stereo=0,
817// channels and bitrate are 1 and 32000.
818TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
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].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000824 webrtc::CodecInst gcodec;
825
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000826 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200827 parameters.codecs[0].bitrate = 5999;
828 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000829 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
830 EXPECT_STREQ("opus", gcodec.plname);
831 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000832 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000833
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200834 parameters.codecs[0].bitrate = 510001;
835 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000836 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
837 EXPECT_STREQ("opus", gcodec.plname);
838 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000839 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000840}
841
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000842// Test that with bitrate=0 and stereo=1,
843// channels and bitrate are 2 and 64000.
844TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
845 EXPECT_TRUE(SetupEngine());
846 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200847 cricket::AudioSendParameters parameters;
848 parameters.codecs.push_back(kOpusCodec);
849 parameters.codecs[0].bitrate = 0;
850 parameters.codecs[0].params["stereo"] = "1";
851 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000852 webrtc::CodecInst gcodec;
853 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
854 EXPECT_STREQ("opus", gcodec.plname);
855 EXPECT_EQ(2, gcodec.channels);
856 EXPECT_EQ(64000, gcodec.rate);
857}
858
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000859// Test that with bitrate=invalid and stereo=1,
860// channels and bitrate are 2 and 64000.
861TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
862 EXPECT_TRUE(SetupEngine());
863 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200864 cricket::AudioSendParameters parameters;
865 parameters.codecs.push_back(kOpusCodec);
866 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000867 webrtc::CodecInst gcodec;
868
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000869 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200870 parameters.codecs[0].bitrate = 5999;
871 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000872 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
873 EXPECT_STREQ("opus", gcodec.plname);
874 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000875 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000876
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200877 parameters.codecs[0].bitrate = 510001;
878 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000879 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
880 EXPECT_STREQ("opus", gcodec.plname);
881 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000882 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000883}
884
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000885// Test that with bitrate=N and stereo unset,
886// channels and bitrate are 1 and N.
887TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
888 EXPECT_TRUE(SetupEngine());
889 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200890 cricket::AudioSendParameters parameters;
891 parameters.codecs.push_back(kOpusCodec);
892 parameters.codecs[0].bitrate = 96000;
893 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000894 webrtc::CodecInst gcodec;
895 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
896 EXPECT_EQ(111, gcodec.pltype);
897 EXPECT_EQ(96000, gcodec.rate);
898 EXPECT_STREQ("opus", gcodec.plname);
899 EXPECT_EQ(1, gcodec.channels);
900 EXPECT_EQ(48000, gcodec.plfreq);
901}
902
903// Test that with bitrate=N and stereo=0,
904// channels and bitrate are 1 and N.
905TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
906 EXPECT_TRUE(SetupEngine());
907 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200908 cricket::AudioSendParameters parameters;
909 parameters.codecs.push_back(kOpusCodec);
910 parameters.codecs[0].bitrate = 30000;
911 parameters.codecs[0].params["stereo"] = "0";
912 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000913 webrtc::CodecInst gcodec;
914 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
915 EXPECT_EQ(1, gcodec.channels);
916 EXPECT_EQ(30000, gcodec.rate);
917 EXPECT_STREQ("opus", gcodec.plname);
918}
919
920// Test that with bitrate=N and without any parameters,
921// channels and bitrate are 1 and N.
922TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
923 EXPECT_TRUE(SetupEngine());
924 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200925 cricket::AudioSendParameters parameters;
926 parameters.codecs.push_back(kOpusCodec);
927 parameters.codecs[0].bitrate = 30000;
928 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000929 webrtc::CodecInst gcodec;
930 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
931 EXPECT_EQ(1, gcodec.channels);
932 EXPECT_EQ(30000, gcodec.rate);
933 EXPECT_STREQ("opus", gcodec.plname);
934}
935
936// Test that with bitrate=N and stereo=1,
937// channels and bitrate are 2 and N.
938TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
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"] = "1";
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(2, gcodec.channels);
949 EXPECT_EQ(30000, gcodec.rate);
950 EXPECT_STREQ("opus", gcodec.plname);
951}
952
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000953// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
954// Also test that the "maxaveragebitrate" can't be set to values outside the
955// range of 6000 and 510000
956TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
957 EXPECT_TRUE(SetupEngine());
958 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200959 cricket::AudioSendParameters parameters;
960 parameters.codecs.push_back(kOpusCodec);
961 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000962 webrtc::CodecInst gcodec;
963
964 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200965 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
966 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000967 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000968 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000969
970 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200971 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
972 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000973 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000974 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000975
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200976 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
977 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000978 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
979 EXPECT_EQ(200000, gcodec.rate);
980}
981
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000982// Test that we can enable NACK with opus as caller.
983TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000984 EXPECT_TRUE(SetupEngine());
985 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200986 cricket::AudioSendParameters parameters;
987 parameters.codecs.push_back(kOpusCodec);
988 parameters.codecs[0].AddFeedbackParam(
989 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
990 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000991 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200992 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000993 EXPECT_TRUE(voe_.GetNACK(channel_num));
994}
995
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000996// Test that we can enable NACK with opus as callee.
997TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200998 EXPECT_TRUE(SetupEngineWithoutStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000999 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001000 cricket::AudioSendParameters parameters;
1001 parameters.codecs.push_back(kOpusCodec);
1002 parameters.codecs[0].AddFeedbackParam(
1003 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1004 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001005 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001006 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001007 EXPECT_FALSE(voe_.GetNACK(channel_num));
1008
1009 EXPECT_TRUE(channel_->AddSendStream(
1010 cricket::StreamParams::CreateLegacy(kSsrc1)));
1011 EXPECT_TRUE(voe_.GetNACK(channel_num));
1012}
1013
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001014// Test that we can enable NACK on receive streams.
1015TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
1016 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001017 int channel_num1 = voe_.GetLastChannel();
1018 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1019 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001020 cricket::AudioSendParameters parameters;
1021 parameters.codecs.push_back(kOpusCodec);
1022 parameters.codecs[0].AddFeedbackParam(
1023 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1024 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001025 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1026 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001027 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001028 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1029 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1030}
1031
1032// Test that we can disable NACK.
1033TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
1034 EXPECT_TRUE(SetupEngine());
1035 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001036 cricket::AudioSendParameters parameters;
1037 parameters.codecs.push_back(kOpusCodec);
1038 parameters.codecs[0].AddFeedbackParam(
1039 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1040 cricket::kParamValueEmpty));
1041 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001042 EXPECT_TRUE(voe_.GetNACK(channel_num));
1043
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001044 parameters.codecs.clear();
1045 parameters.codecs.push_back(kOpusCodec);
1046 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001047 EXPECT_FALSE(voe_.GetNACK(channel_num));
1048}
1049
1050// Test that we can disable NACK on receive streams.
1051TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
1052 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001053 int channel_num1 = voe_.GetLastChannel();
1054 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1055 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001056 cricket::AudioSendParameters parameters;
1057 parameters.codecs.push_back(kOpusCodec);
1058 parameters.codecs[0].AddFeedbackParam(
1059 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1060 cricket::kParamValueEmpty));
1061 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001062 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1063 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1064
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001065 parameters.codecs.clear();
1066 parameters.codecs.push_back(kOpusCodec);
1067 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001068 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1069 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1070}
1071
1072// Test that NACK is enabled on a new receive stream.
1073TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
1074 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001075 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001076 cricket::AudioSendParameters parameters;
1077 parameters.codecs.push_back(kIsacCodec);
1078 parameters.codecs.push_back(kCn16000Codec);
1079 parameters.codecs[0].AddFeedbackParam(
1080 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1081 cricket::kParamValueEmpty));
1082 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001083 EXPECT_TRUE(voe_.GetNACK(channel_num));
1084
1085 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1086 channel_num = voe_.GetLastChannel();
1087 EXPECT_TRUE(voe_.GetNACK(channel_num));
1088 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1089 channel_num = voe_.GetLastChannel();
1090 EXPECT_TRUE(voe_.GetNACK(channel_num));
1091}
1092
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001093// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001094TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001095 EXPECT_TRUE(SetupEngine());
1096 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001097 cricket::AudioSendParameters parameters;
1098 parameters.codecs.push_back(kOpusCodec);
1099 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001100 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1101}
1102
1103// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001104TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001105 EXPECT_TRUE(SetupEngine());
1106 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001107 cricket::AudioSendParameters parameters;
1108 parameters.codecs.push_back(kOpusCodec);
1109 parameters.codecs[0].bitrate = 0;
1110 parameters.codecs[0].params["useinbandfec"] = "0";
1111 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001112 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1113 webrtc::CodecInst gcodec;
1114 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1115 EXPECT_STREQ("opus", gcodec.plname);
1116 EXPECT_EQ(1, gcodec.channels);
1117 EXPECT_EQ(32000, gcodec.rate);
1118}
1119
1120// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001121TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001122 EXPECT_TRUE(SetupEngine());
1123 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001124 cricket::AudioSendParameters parameters;
1125 parameters.codecs.push_back(kOpusCodec);
1126 parameters.codecs[0].bitrate = 0;
1127 parameters.codecs[0].params["useinbandfec"] = "1";
1128 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001129 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1130 webrtc::CodecInst gcodec;
1131 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1132 EXPECT_STREQ("opus", gcodec.plname);
1133 EXPECT_EQ(1, gcodec.channels);
1134 EXPECT_EQ(32000, gcodec.rate);
1135}
1136
1137// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001138TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001139 EXPECT_TRUE(SetupEngine());
1140 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001141 cricket::AudioSendParameters parameters;
1142 parameters.codecs.push_back(kOpusCodec);
1143 parameters.codecs[0].bitrate = 0;
1144 parameters.codecs[0].params["stereo"] = "1";
1145 parameters.codecs[0].params["useinbandfec"] = "1";
1146 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001147 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1148 webrtc::CodecInst gcodec;
1149 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1150 EXPECT_STREQ("opus", gcodec.plname);
1151 EXPECT_EQ(2, gcodec.channels);
1152 EXPECT_EQ(64000, gcodec.rate);
1153}
1154
1155// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001156TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001157 EXPECT_TRUE(SetupEngine());
1158 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001159 cricket::AudioSendParameters parameters;
1160 parameters.codecs.push_back(kIsacCodec);
1161 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001162 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1163}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001164
1165// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1166TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
1167 EXPECT_TRUE(SetupEngine());
1168 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001169 cricket::AudioSendParameters parameters;
1170 parameters.codecs.push_back(kIsacCodec);
1171 parameters.codecs[0].params["useinbandfec"] = "1";
1172 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001173 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1174}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001175
1176// Test that Opus FEC status can be changed.
1177TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
1178 EXPECT_TRUE(SetupEngine());
1179 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001180 cricket::AudioSendParameters parameters;
1181 parameters.codecs.push_back(kOpusCodec);
1182 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001183 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001184 parameters.codecs[0].params["useinbandfec"] = "1";
1185 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001186 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1187}
1188
1189// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1190TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
1191 EXPECT_TRUE(SetupEngine());
1192 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001193 cricket::AudioSendParameters parameters;
1194 parameters.codecs.push_back(kOpusCodec);
1195 parameters.codecs[0].bitrate = 0;
1196 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1197 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001198 EXPECT_EQ(cricket::kOpusBandwidthNb,
1199 voe_.GetMaxEncodingBandwidth(channel_num));
1200 webrtc::CodecInst gcodec;
1201 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1202 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001203
1204 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001205 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1206 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001207 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1208 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001209}
1210
1211// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1212TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
1213 EXPECT_TRUE(SetupEngine());
1214 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001215 cricket::AudioSendParameters parameters;
1216 parameters.codecs.push_back(kOpusCodec);
1217 parameters.codecs[0].bitrate = 0;
1218 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1219 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001220 EXPECT_EQ(cricket::kOpusBandwidthMb,
1221 voe_.GetMaxEncodingBandwidth(channel_num));
1222 webrtc::CodecInst gcodec;
1223 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1224 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001225
1226 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001227 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1228 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001229 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1230 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001231}
1232
1233// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1234TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
1235 EXPECT_TRUE(SetupEngine());
1236 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001237 cricket::AudioSendParameters parameters;
1238 parameters.codecs.push_back(kOpusCodec);
1239 parameters.codecs[0].bitrate = 0;
1240 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1241 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001242 EXPECT_EQ(cricket::kOpusBandwidthWb,
1243 voe_.GetMaxEncodingBandwidth(channel_num));
1244 webrtc::CodecInst gcodec;
1245 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1246 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001247
1248 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001249 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1250 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001251 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1252 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001253}
1254
1255// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1256TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
1257 EXPECT_TRUE(SetupEngine());
1258 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001259 cricket::AudioSendParameters parameters;
1260 parameters.codecs.push_back(kOpusCodec);
1261 parameters.codecs[0].bitrate = 0;
1262 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1263 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001264 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1265 voe_.GetMaxEncodingBandwidth(channel_num));
1266 webrtc::CodecInst gcodec;
1267 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1268 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001269
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001270 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001271 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1272 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001273 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1274 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001275}
1276
1277// Test 24000 < maxplaybackrate triggers Opus full band mode.
1278TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
1279 EXPECT_TRUE(SetupEngine());
1280 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001281 cricket::AudioSendParameters parameters;
1282 parameters.codecs.push_back(kOpusCodec);
1283 parameters.codecs[0].bitrate = 0;
1284 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1285 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001286 EXPECT_EQ(cricket::kOpusBandwidthFb,
1287 voe_.GetMaxEncodingBandwidth(channel_num));
1288 webrtc::CodecInst gcodec;
1289 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1290 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001291
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001292 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001293 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1294 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001295 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1296 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001297}
1298
1299// Test Opus that without maxplaybackrate, default playback rate is used.
1300TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
1301 EXPECT_TRUE(SetupEngine());
1302 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001303 cricket::AudioSendParameters parameters;
1304 parameters.codecs.push_back(kOpusCodec);
1305 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001306 EXPECT_EQ(cricket::kOpusBandwidthFb,
1307 voe_.GetMaxEncodingBandwidth(channel_num));
1308}
1309
1310// Test the with non-Opus, maxplaybackrate has no effect.
1311TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
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(kIsacCodec);
1316 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1317 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001318 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1319}
1320
1321// Test maxplaybackrate can be set on two streams.
1322TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
1323 EXPECT_TRUE(SetupEngine());
1324 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001325 cricket::AudioSendParameters parameters;
1326 parameters.codecs.push_back(kOpusCodec);
1327 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001328 // Default bandwidth is 24000.
1329 EXPECT_EQ(cricket::kOpusBandwidthFb,
1330 voe_.GetMaxEncodingBandwidth(channel_num));
1331
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001332 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001333
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001334 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001335 EXPECT_EQ(cricket::kOpusBandwidthNb,
1336 voe_.GetMaxEncodingBandwidth(channel_num));
1337
1338 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1339 channel_num = voe_.GetLastChannel();
1340 EXPECT_EQ(cricket::kOpusBandwidthNb,
1341 voe_.GetMaxEncodingBandwidth(channel_num));
1342}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001343
Minyue Li7100dcd2015-03-27 05:05:59 +01001344// Test that with usedtx=0, Opus DTX is off.
1345TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
1346 EXPECT_TRUE(SetupEngine());
1347 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001348 cricket::AudioSendParameters parameters;
1349 parameters.codecs.push_back(kOpusCodec);
1350 parameters.codecs[0].params["usedtx"] = "0";
1351 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001352 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1353}
1354
1355// Test that with usedtx=1, Opus DTX is on.
1356TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
1357 EXPECT_TRUE(SetupEngine());
1358 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001359 cricket::AudioSendParameters parameters;
1360 parameters.codecs.push_back(kOpusCodec);
1361 parameters.codecs[0].params["usedtx"] = "1";
1362 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001363 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1364 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1365}
1366
1367// Test that usedtx=1 works with stereo Opus.
1368TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
1369 EXPECT_TRUE(SetupEngine());
1370 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001371 cricket::AudioSendParameters parameters;
1372 parameters.codecs.push_back(kOpusCodec);
1373 parameters.codecs[0].params["usedtx"] = "1";
1374 parameters.codecs[0].params["stereo"] = "1";
1375 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001376 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1377 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1378}
1379
1380// Test that usedtx=1 does not work with non Opus.
1381TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
1382 EXPECT_TRUE(SetupEngine());
1383 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001384 cricket::AudioSendParameters parameters;
1385 parameters.codecs.push_back(kIsacCodec);
1386 parameters.codecs[0].params["usedtx"] = "1";
1387 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001388 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1389}
1390
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001391// Test that we can switch back and forth between Opus and ISAC with CN.
1392TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001393 EXPECT_TRUE(SetupEngine());
1394 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001395 cricket::AudioSendParameters opus_parameters;
1396 opus_parameters.codecs.push_back(kOpusCodec);
1397 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001398 webrtc::CodecInst gcodec;
1399 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001400 EXPECT_EQ(111, gcodec.pltype);
1401 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001402
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001403 cricket::AudioSendParameters isac_parameters;
1404 isac_parameters.codecs.push_back(kIsacCodec);
1405 isac_parameters.codecs.push_back(kCn16000Codec);
1406 isac_parameters.codecs.push_back(kOpusCodec);
1407 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001408 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1409 EXPECT_EQ(103, gcodec.pltype);
1410 EXPECT_STREQ("ISAC", gcodec.plname);
1411
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001412 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001413 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001414 EXPECT_EQ(111, gcodec.pltype);
1415 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001416}
1417
1418// Test that we handle various ways of specifying bitrate.
1419TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
1420 EXPECT_TRUE(SetupEngine());
1421 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001422 cricket::AudioSendParameters parameters;
1423 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1424 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001425 webrtc::CodecInst gcodec;
1426 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1427 EXPECT_EQ(103, gcodec.pltype);
1428 EXPECT_STREQ("ISAC", gcodec.plname);
1429 EXPECT_EQ(32000, gcodec.rate);
1430
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001431 parameters.codecs[0].bitrate = 0; // bitrate == default
1432 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001433 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1434 EXPECT_EQ(103, gcodec.pltype);
1435 EXPECT_STREQ("ISAC", gcodec.plname);
1436 EXPECT_EQ(-1, gcodec.rate);
1437
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001438 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1439 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001440 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1441 EXPECT_EQ(103, gcodec.pltype);
1442 EXPECT_STREQ("ISAC", gcodec.plname);
1443 EXPECT_EQ(28000, gcodec.rate);
1444
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001445 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1446 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001447 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1448 EXPECT_EQ(0, gcodec.pltype);
1449 EXPECT_STREQ("PCMU", gcodec.plname);
1450 EXPECT_EQ(64000, gcodec.rate);
1451
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001452 parameters.codecs[0].bitrate = 0; // bitrate == default
1453 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001454 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1455 EXPECT_EQ(0, gcodec.pltype);
1456 EXPECT_STREQ("PCMU", gcodec.plname);
1457 EXPECT_EQ(64000, gcodec.rate);
1458
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001459 parameters.codecs[0] = kOpusCodec;
1460 parameters.codecs[0].bitrate = 0; // bitrate == default
1461 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001462 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1463 EXPECT_EQ(111, gcodec.pltype);
1464 EXPECT_STREQ("opus", gcodec.plname);
1465 EXPECT_EQ(32000, gcodec.rate);
1466}
1467
Brave Yao5225dd82015-03-26 07:39:19 +08001468// Test that we could set packet size specified in kCodecParamPTime.
1469TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
1470 EXPECT_TRUE(SetupEngine());
1471 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001472 cricket::AudioSendParameters parameters;
1473 parameters.codecs.push_back(kOpusCodec);
1474 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1475 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001476 webrtc::CodecInst gcodec;
1477 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1478 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1479
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001480 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1481 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001482 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1483 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1484
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001485 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1486 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001487 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1488 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1489
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001490 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1491 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1492 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001493 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1494 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1495
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001496 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1497 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1498 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001499 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1500 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1501}
1502
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001503// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001504TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
1505 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001506 cricket::AudioSendParameters parameters;
1507 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001508}
1509
1510// Test that we can set send codecs even with telephone-event codec as the first
1511// one on the list.
1512TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
1513 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001514 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001515 cricket::AudioSendParameters parameters;
1516 parameters.codecs.push_back(kTelephoneEventCodec);
1517 parameters.codecs.push_back(kIsacCodec);
1518 parameters.codecs.push_back(kPcmuCodec);
1519 parameters.codecs[0].id = 98; // DTMF
1520 parameters.codecs[1].id = 96;
1521 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001522 webrtc::CodecInst gcodec;
1523 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001524 EXPECT_EQ(96, gcodec.pltype);
1525 EXPECT_STREQ("ISAC", gcodec.plname);
1526 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1527}
1528
1529// Test that we can set send codecs even with CN codec as the first
1530// one on the list.
1531TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
1532 EXPECT_TRUE(SetupEngine());
1533 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001534 cricket::AudioSendParameters parameters;
1535 parameters.codecs.push_back(kCn16000Codec);
1536 parameters.codecs.push_back(kIsacCodec);
1537 parameters.codecs.push_back(kPcmuCodec);
1538 parameters.codecs[0].id = 98; // wideband CN
1539 parameters.codecs[1].id = 96;
1540 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001541 webrtc::CodecInst gcodec;
1542 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1543 EXPECT_EQ(96, gcodec.pltype);
1544 EXPECT_STREQ("ISAC", gcodec.plname);
1545 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001546}
1547
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001548// Test that we set VAD and DTMF types correctly as caller.
1549TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001550 EXPECT_TRUE(SetupEngine());
1551 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001552 cricket::AudioSendParameters parameters;
1553 parameters.codecs.push_back(kIsacCodec);
1554 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001555 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001556 parameters.codecs.push_back(kCn16000Codec);
1557 parameters.codecs.push_back(kCn8000Codec);
1558 parameters.codecs.push_back(kTelephoneEventCodec);
1559 parameters.codecs.push_back(kRedCodec);
1560 parameters.codecs[0].id = 96;
1561 parameters.codecs[2].id = 97; // wideband CN
1562 parameters.codecs[4].id = 98; // DTMF
1563 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001564 webrtc::CodecInst gcodec;
1565 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1566 EXPECT_EQ(96, gcodec.pltype);
1567 EXPECT_STREQ("ISAC", gcodec.plname);
1568 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001569 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001570 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1571 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1572 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1573}
1574
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001575// Test that we set VAD and DTMF types correctly as callee.
1576TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001577 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001578 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001579 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001580
1581 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001582 cricket::AudioSendParameters parameters;
1583 parameters.codecs.push_back(kIsacCodec);
1584 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001585 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001586 parameters.codecs.push_back(kCn16000Codec);
1587 parameters.codecs.push_back(kCn8000Codec);
1588 parameters.codecs.push_back(kTelephoneEventCodec);
1589 parameters.codecs.push_back(kRedCodec);
1590 parameters.codecs[0].id = 96;
1591 parameters.codecs[2].id = 97; // wideband CN
1592 parameters.codecs[4].id = 98; // DTMF
1593 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001594 EXPECT_TRUE(channel_->AddSendStream(
1595 cricket::StreamParams::CreateLegacy(kSsrc1)));
1596
1597 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));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +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
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001608// Test that we only apply VAD if we have a CN codec that matches the
1609// send codec clockrate.
1610TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
1611 EXPECT_TRUE(SetupEngine());
1612 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001613 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001614 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001615 parameters.codecs.push_back(kIsacCodec);
1616 parameters.codecs.push_back(kCn16000Codec);
1617 parameters.codecs[1].id = 97;
1618 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001619 webrtc::CodecInst gcodec;
1620 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1621 EXPECT_STREQ("ISAC", gcodec.plname);
1622 EXPECT_TRUE(voe_.GetVAD(channel_num));
1623 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1624 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001625 parameters.codecs[0] = kPcmuCodec;
1626 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001627 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1628 EXPECT_STREQ("PCMU", gcodec.plname);
1629 EXPECT_FALSE(voe_.GetVAD(channel_num));
1630 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001631 parameters.codecs[1] = kCn8000Codec;
1632 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001633 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1634 EXPECT_STREQ("PCMU", gcodec.plname);
1635 EXPECT_TRUE(voe_.GetVAD(channel_num));
1636 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001637 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001638 parameters.codecs[0] = kIsacCodec;
1639 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001640 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1641 EXPECT_STREQ("ISAC", gcodec.plname);
1642 EXPECT_FALSE(voe_.GetVAD(channel_num));
1643}
1644
1645// Test that we perform case-insensitive matching of codec names.
1646TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
1647 EXPECT_TRUE(SetupEngine());
1648 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001649 cricket::AudioSendParameters parameters;
1650 parameters.codecs.push_back(kIsacCodec);
1651 parameters.codecs.push_back(kPcmuCodec);
1652 parameters.codecs.push_back(kCn16000Codec);
1653 parameters.codecs.push_back(kCn8000Codec);
1654 parameters.codecs.push_back(kTelephoneEventCodec);
1655 parameters.codecs.push_back(kRedCodec);
1656 parameters.codecs[0].name = "iSaC";
1657 parameters.codecs[0].id = 96;
1658 parameters.codecs[2].id = 97; // wideband CN
1659 parameters.codecs[4].id = 98; // DTMF
1660 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001661 webrtc::CodecInst gcodec;
1662 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1663 EXPECT_EQ(96, gcodec.pltype);
1664 EXPECT_STREQ("ISAC", gcodec.plname);
1665 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001666 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001667 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1668 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1669 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1670}
1671
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001672// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001673TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001674 EXPECT_TRUE(SetupEngine());
1675 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001676 cricket::AudioSendParameters parameters;
1677 parameters.codecs.push_back(kRedCodec);
1678 parameters.codecs.push_back(kIsacCodec);
1679 parameters.codecs.push_back(kPcmuCodec);
1680 parameters.codecs[0].id = 127;
1681 parameters.codecs[0].params[""] = "96/96";
1682 parameters.codecs[1].id = 96;
1683 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001684 webrtc::CodecInst gcodec;
1685 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1686 EXPECT_EQ(96, gcodec.pltype);
1687 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001688 EXPECT_TRUE(voe_.GetRED(channel_num));
1689 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001690}
1691
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001692// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001693TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001694 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001695 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001696 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001697
1698 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001699 cricket::AudioSendParameters parameters;
1700 parameters.codecs.push_back(kRedCodec);
1701 parameters.codecs.push_back(kIsacCodec);
1702 parameters.codecs.push_back(kPcmuCodec);
1703 parameters.codecs[0].id = 127;
1704 parameters.codecs[0].params[""] = "96/96";
1705 parameters.codecs[1].id = 96;
1706 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001707 EXPECT_TRUE(channel_->AddSendStream(
1708 cricket::StreamParams::CreateLegacy(kSsrc1)));
1709 webrtc::CodecInst gcodec;
1710 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1711 EXPECT_EQ(96, gcodec.pltype);
1712 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001713 EXPECT_TRUE(voe_.GetRED(channel_num));
1714 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001715}
1716
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001717// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001718TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
1719 EXPECT_TRUE(SetupEngine());
1720 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001721 cricket::AudioSendParameters parameters;
1722 parameters.codecs.push_back(kRedCodec);
1723 parameters.codecs.push_back(kIsacCodec);
1724 parameters.codecs.push_back(kPcmuCodec);
1725 parameters.codecs[0].id = 127;
1726 parameters.codecs[1].id = 96;
1727 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001728 webrtc::CodecInst gcodec;
1729 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1730 EXPECT_EQ(96, gcodec.pltype);
1731 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001732 EXPECT_TRUE(voe_.GetRED(channel_num));
1733 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001734}
1735
1736// Test that we ignore RED if the parameters aren't named the way we expect.
1737TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
1738 EXPECT_TRUE(SetupEngine());
1739 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001740 cricket::AudioSendParameters parameters;
1741 parameters.codecs.push_back(kRedCodec);
1742 parameters.codecs.push_back(kIsacCodec);
1743 parameters.codecs.push_back(kPcmuCodec);
1744 parameters.codecs[0].id = 127;
1745 parameters.codecs[0].params["ABC"] = "96/96";
1746 parameters.codecs[1].id = 96;
1747 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001748 webrtc::CodecInst gcodec;
1749 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1750 EXPECT_EQ(96, gcodec.pltype);
1751 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001752 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001753}
1754
1755// Test that we ignore RED if it uses different primary/secondary encoding.
1756TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
1757 EXPECT_TRUE(SetupEngine());
1758 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001759 cricket::AudioSendParameters parameters;
1760 parameters.codecs.push_back(kRedCodec);
1761 parameters.codecs.push_back(kIsacCodec);
1762 parameters.codecs.push_back(kPcmuCodec);
1763 parameters.codecs[0].id = 127;
1764 parameters.codecs[0].params[""] = "96/0";
1765 parameters.codecs[1].id = 96;
1766 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001767 webrtc::CodecInst gcodec;
1768 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1769 EXPECT_EQ(96, gcodec.pltype);
1770 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001771 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001772}
1773
1774// Test that we ignore RED if it uses more than 2 encodings.
1775TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
1776 EXPECT_TRUE(SetupEngine());
1777 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001778 cricket::AudioSendParameters parameters;
1779 parameters.codecs.push_back(kRedCodec);
1780 parameters.codecs.push_back(kIsacCodec);
1781 parameters.codecs.push_back(kPcmuCodec);
1782 parameters.codecs[0].id = 127;
1783 parameters.codecs[0].params[""] = "96/96/96";
1784 parameters.codecs[1].id = 96;
1785 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001786 webrtc::CodecInst gcodec;
1787 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1788 EXPECT_EQ(96, gcodec.pltype);
1789 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001790 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001791}
1792
1793// Test that we ignore RED if it has bogus codec ids.
1794TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
1795 EXPECT_TRUE(SetupEngine());
1796 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001797 cricket::AudioSendParameters parameters;
1798 parameters.codecs.push_back(kRedCodec);
1799 parameters.codecs.push_back(kIsacCodec);
1800 parameters.codecs.push_back(kPcmuCodec);
1801 parameters.codecs[0].id = 127;
1802 parameters.codecs[0].params[""] = "ABC/ABC";
1803 parameters.codecs[1].id = 96;
1804 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001805 webrtc::CodecInst gcodec;
1806 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1807 EXPECT_EQ(96, gcodec.pltype);
1808 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001809 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001810}
1811
1812// Test that we ignore RED if it refers to a codec that is not present.
1813TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
1814 EXPECT_TRUE(SetupEngine());
1815 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001816 cricket::AudioSendParameters parameters;
1817 parameters.codecs.push_back(kRedCodec);
1818 parameters.codecs.push_back(kIsacCodec);
1819 parameters.codecs.push_back(kPcmuCodec);
1820 parameters.codecs[0].id = 127;
1821 parameters.codecs[0].params[""] = "97/97";
1822 parameters.codecs[1].id = 96;
1823 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001824 webrtc::CodecInst gcodec;
1825 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1826 EXPECT_EQ(96, gcodec.pltype);
1827 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001828 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001829}
1830
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001831// Test support for audio level header extension.
1832TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1833 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001834}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001835TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1836 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1837}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001838
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001839// Test support for absolute send time header extension.
1840TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1841 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1842}
1843TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1844 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001845}
1846
1847// Test that we can create a channel and start sending/playing out on it.
1848TEST_F(WebRtcVoiceEngineTestFake, SendAndPlayout) {
1849 EXPECT_TRUE(SetupEngine());
1850 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001851 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001852 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1853 EXPECT_TRUE(voe_.GetSend(channel_num));
1854 EXPECT_TRUE(channel_->SetPlayout(true));
1855 EXPECT_TRUE(voe_.GetPlayout(channel_num));
1856 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1857 EXPECT_FALSE(voe_.GetSend(channel_num));
1858 EXPECT_TRUE(channel_->SetPlayout(false));
1859 EXPECT_FALSE(voe_.GetPlayout(channel_num));
1860}
1861
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001862// Test that we can add and remove send streams.
1863TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
1864 SetupForMultiSendStream();
1865
Peter Boström0c4e06b2015-10-07 12:23:21 +02001866 static const uint32_t kSsrcs4[] = {1, 2, 3, 4};
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001867
1868 // Set the global state for sending.
1869 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1870
1871 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1872 EXPECT_TRUE(channel_->AddSendStream(
1873 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1874
1875 // Verify that we are in a sending state for all the created streams.
1876 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1877 EXPECT_TRUE(voe_.GetSend(channel_num));
1878 }
1879
1880 // Remove the first send channel, which is the default channel. It will only
1881 // recycle the default channel but not delete it.
1882 EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[0]));
1883 // Stream should already be Removed from the send stream list.
1884 EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[0]));
1885 // But the default still exists.
1886 EXPECT_EQ(0, voe_.GetChannelFromLocalSsrc(kSsrcs4[0]));
1887
1888 // Delete the rest of send channel streams.
1889 for (unsigned int i = 1; i < ARRAY_SIZE(kSsrcs4); ++i) {
1890 EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[i]));
1891 // Stream should already be deleted.
1892 EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[i]));
1893 EXPECT_EQ(-1, voe_.GetChannelFromLocalSsrc(kSsrcs4[i]));
1894 }
1895}
1896
1897// Test SetSendCodecs correctly configure the codecs in all send streams.
1898TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
1899 SetupForMultiSendStream();
1900
Peter Boström0c4e06b2015-10-07 12:23:21 +02001901 static const uint32_t kSsrcs4[] = {1, 2, 3, 4};
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001902 // Create send streams.
1903 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1904 EXPECT_TRUE(channel_->AddSendStream(
1905 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1906 }
1907
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001908 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001909 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001910 parameters.codecs.push_back(kIsacCodec);
1911 parameters.codecs.push_back(kCn16000Codec);
1912 parameters.codecs[1].id = 97;
1913 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001914
1915 // Verify ISAC and VAD are corrected configured on all send channels.
1916 webrtc::CodecInst gcodec;
1917 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1918 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1919 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1920 EXPECT_STREQ("ISAC", gcodec.plname);
1921 EXPECT_TRUE(voe_.GetVAD(channel_num));
1922 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1923 }
1924
1925 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001926 parameters.codecs[0] = kPcmuCodec;
1927 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001928 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1929 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1930 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1931 EXPECT_STREQ("PCMU", gcodec.plname);
1932 EXPECT_FALSE(voe_.GetVAD(channel_num));
1933 }
1934}
1935
1936// Test we can SetSend on all send streams correctly.
1937TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
1938 SetupForMultiSendStream();
1939
Peter Boström0c4e06b2015-10-07 12:23:21 +02001940 static const uint32_t kSsrcs4[] = {1, 2, 3, 4};
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001941 // Create the send channels and they should be a SEND_NOTHING date.
1942 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1943 EXPECT_TRUE(channel_->AddSendStream(
1944 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1945 int channel_num = voe_.GetLastChannel();
1946 EXPECT_FALSE(voe_.GetSend(channel_num));
1947 }
1948
1949 // Set the global state for starting sending.
1950 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1951 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1952 // Verify that we are in a sending state for all the send streams.
1953 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1954 EXPECT_TRUE(voe_.GetSend(channel_num));
1955 }
1956
1957 // Set the global state for stopping sending.
1958 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1959 for (unsigned int i = 1; i < ARRAY_SIZE(kSsrcs4); ++i) {
1960 // Verify that we are in a stop state for all the send streams.
1961 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1962 EXPECT_FALSE(voe_.GetSend(channel_num));
1963 }
1964}
1965
1966// Test we can set the correct statistics on all send streams.
1967TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
1968 SetupForMultiSendStream();
1969
Peter Boström0c4e06b2015-10-07 12:23:21 +02001970 static const uint32_t kSsrcs4[] = {1, 2, 3, 4};
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001971 // Create send streams.
1972 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1973 EXPECT_TRUE(channel_->AddSendStream(
1974 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1975 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00001976 // Create a receive stream to check that none of the send streams end up in
1977 // the receive stream stats.
1978 EXPECT_TRUE(channel_->AddRecvStream(
1979 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001980 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001981 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
1982 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001983
1984 cricket::VoiceMediaInfo info;
1985 EXPECT_EQ(true, channel_->GetStats(&info));
1986 EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size());
1987
1988 // Verify the statistic information is correct.
1989 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +00001990 EXPECT_EQ(kSsrcs4[i], info.senders[i].ssrc());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001991 EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
1992 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].bytes_sent);
1993 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_sent);
1994 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_lost);
1995 EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[i].fraction_lost);
1996 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].ext_seqnum);
1997 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].rtt_ms);
1998 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].jitter_ms);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00001999 EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002000 }
2001
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002002 EXPECT_EQ(0u, info.receivers.size());
2003 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2004 EXPECT_EQ(true, channel_->GetStats(&info));
2005
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002006 EXPECT_EQ(1u, info.receivers.size());
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002007 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd);
2008 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd);
2009 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost);
2010 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum);
2011 EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name);
minyue@webrtc.orgc0bd7be2015-02-18 15:24:13 +00002012 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentExpandRate) /
2013 (1 << 14), info.receivers[0].expand_rate);
2014 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSpeechExpandRate) /
2015 (1 << 14), info.receivers[0].speech_expand_rate);
2016 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSecondaryDecodedRate) /
2017 (1 << 14), info.receivers[0].secondary_decoded_rate);
Henrik Lundin8e6fd462015-06-02 09:24:52 +02002018 EXPECT_EQ(
2019 static_cast<float>(cricket::kNetStats.currentAccelerateRate) / (1 << 14),
2020 info.receivers[0].accelerate_rate);
2021 EXPECT_EQ(
2022 static_cast<float>(cricket::kNetStats.currentPreemptiveRate) / (1 << 14),
2023 info.receivers[0].preemptive_expand_rate);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002024}
2025
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002026// Test that we can add and remove receive streams, and do proper send/playout.
2027// We can receive on multiple streams while sending one stream.
2028TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002029 EXPECT_TRUE(SetupEngine());
2030 int channel_num1 = voe_.GetLastChannel();
2031
2032 // Start playout on the default channel.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002033 send_parameters_.options = options_conference_;
2034 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002035 EXPECT_TRUE(channel_->SetPlayout(true));
2036 EXPECT_TRUE(voe_.GetPlayout(channel_num1));
2037
2038 // Adding another stream should disable playout on the default channel.
2039 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2040 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002041 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2042 EXPECT_TRUE(voe_.GetSend(channel_num1));
2043 EXPECT_FALSE(voe_.GetSend(channel_num2));
2044
2045 // Make sure only the new channel is played out.
2046 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2047 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2048
2049 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2050 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2051 int channel_num3 = voe_.GetLastChannel();
2052 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2053 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2054 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2055 EXPECT_FALSE(voe_.GetSend(channel_num3));
2056
2057 // Stop sending.
2058 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2059 EXPECT_FALSE(voe_.GetSend(channel_num1));
2060 EXPECT_FALSE(voe_.GetSend(channel_num2));
2061 EXPECT_FALSE(voe_.GetSend(channel_num3));
2062
2063 // Stop playout.
2064 EXPECT_TRUE(channel_->SetPlayout(false));
2065 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2066 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2067 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2068
2069 // Restart playout and make sure the default channel still is not played out.
2070 EXPECT_TRUE(channel_->SetPlayout(true));
2071 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2072 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2073 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2074
2075 // Now remove the new streams and verify that the default channel is
2076 // played out again.
2077 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2078 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2079
2080 EXPECT_TRUE(voe_.GetPlayout(channel_num1));
2081}
2082
2083// Test that we can set the devices to use.
2084TEST_F(WebRtcVoiceEngineTestFake, SetDevices) {
2085 EXPECT_TRUE(SetupEngine());
2086 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002087 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002088
2089 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2090 cricket::kFakeDefaultDeviceId);
2091 cricket::Device dev(cricket::kFakeDeviceName,
2092 cricket::kFakeDeviceId);
2093
2094 // Test SetDevices() while not sending or playing.
2095 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2096
2097 // Test SetDevices() while sending and playing.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002098 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2099 EXPECT_TRUE(channel_->SetPlayout(true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002100 EXPECT_TRUE(voe_.GetSend(channel_num));
2101 EXPECT_TRUE(voe_.GetPlayout(channel_num));
2102
2103 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2104
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002105 EXPECT_TRUE(voe_.GetSend(channel_num));
2106 EXPECT_TRUE(voe_.GetPlayout(channel_num));
2107
2108 // Test that failure to open newly selected devices does not prevent opening
2109 // ones after that.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002110 voe_.set_playout_fail_channel(channel_num);
2111 voe_.set_send_fail_channel(channel_num);
2112
2113 EXPECT_FALSE(engine_.SetDevices(&default_dev, &default_dev));
2114
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002115 EXPECT_FALSE(voe_.GetSend(channel_num));
2116 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2117
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002118 voe_.set_playout_fail_channel(-1);
2119 voe_.set_send_fail_channel(-1);
2120
2121 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2122
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002123 EXPECT_TRUE(voe_.GetSend(channel_num));
2124 EXPECT_TRUE(voe_.GetPlayout(channel_num));
2125}
2126
2127// Test that we can set the devices to use even if we failed to
2128// open the initial ones.
2129TEST_F(WebRtcVoiceEngineTestFake, SetDevicesWithInitiallyBadDevices) {
2130 EXPECT_TRUE(SetupEngine());
2131 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002132 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002133
2134 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2135 cricket::kFakeDefaultDeviceId);
2136 cricket::Device dev(cricket::kFakeDeviceName,
2137 cricket::kFakeDeviceId);
2138
2139 // Test that failure to open devices selected before starting
2140 // send/play does not prevent opening newly selected ones after that.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002141 voe_.set_playout_fail_channel(channel_num);
2142 voe_.set_send_fail_channel(channel_num);
2143
2144 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2145
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002146 EXPECT_FALSE(channel_->SetSend(cricket::SEND_MICROPHONE));
2147 EXPECT_FALSE(channel_->SetPlayout(true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002148 EXPECT_FALSE(voe_.GetSend(channel_num));
2149 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2150
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002151 voe_.set_playout_fail_channel(-1);
2152 voe_.set_send_fail_channel(-1);
2153
2154 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2155
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002156 EXPECT_TRUE(voe_.GetSend(channel_num));
2157 EXPECT_TRUE(voe_.GetPlayout(channel_num));
2158}
2159
2160// Test that we can create a channel configured for multi-point conferences,
2161// and start sending/playing out on it.
2162TEST_F(WebRtcVoiceEngineTestFake, ConferenceSendAndPlayout) {
2163 EXPECT_TRUE(SetupEngine());
2164 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002165 send_parameters_.options = options_conference_;
2166 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002167 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2168 EXPECT_TRUE(voe_.GetSend(channel_num));
2169}
2170
2171// Test that we can create a channel configured for Codian bridges,
2172// and start sending/playing out on it.
2173TEST_F(WebRtcVoiceEngineTestFake, CodianSendAndPlayout) {
2174 EXPECT_TRUE(SetupEngine());
2175 int channel_num = voe_.GetLastChannel();
2176 webrtc::AgcConfig agc_config;
2177 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2178 EXPECT_EQ(0, agc_config.targetLeveldBOv);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002179 send_parameters_.options = options_adjust_agc_;
2180 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002181 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2182 EXPECT_TRUE(voe_.GetSend(channel_num));
2183 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2184 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
2185 EXPECT_TRUE(channel_->SetPlayout(true));
2186 EXPECT_TRUE(voe_.GetPlayout(channel_num));
2187 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2188 EXPECT_FALSE(voe_.GetSend(channel_num));
2189 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2190 EXPECT_EQ(0, agc_config.targetLeveldBOv); // level was restored
2191 EXPECT_TRUE(channel_->SetPlayout(false));
2192 EXPECT_FALSE(voe_.GetPlayout(channel_num));
2193}
2194
wu@webrtc.org97077a32013-10-25 21:18:33 +00002195TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
2196 EXPECT_TRUE(SetupEngine());
2197 webrtc::AgcConfig agc_config;
2198 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2199 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2200
2201 cricket::AudioOptions options;
2202 options.tx_agc_target_dbov.Set(3);
2203 options.tx_agc_digital_compression_gain.Set(9);
2204 options.tx_agc_limiter.Set(true);
2205 options.auto_gain_control.Set(true);
2206 EXPECT_TRUE(engine_.SetOptions(options));
2207
2208 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2209 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2210 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2211 EXPECT_TRUE(agc_config.limiterEnable);
2212
2213 // Check interaction with adjust_agc_delta. Both should be respected, for
2214 // backwards compatibility.
2215 options.adjust_agc_delta.Set(-10);
2216 EXPECT_TRUE(engine_.SetOptions(options));
2217
2218 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2219 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2220}
2221
2222TEST_F(WebRtcVoiceEngineTestFake, RxAgcConfigViaOptions) {
2223 EXPECT_TRUE(SetupEngine());
2224 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002225 send_parameters_.options.rx_agc_target_dbov.Set(6);
2226 send_parameters_.options.rx_agc_digital_compression_gain.Set(0);
2227 send_parameters_.options.rx_agc_limiter.Set(true);
2228 send_parameters_.options.rx_auto_gain_control.Set(true);
2229 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
wu@webrtc.org97077a32013-10-25 21:18:33 +00002230
2231 webrtc::AgcConfig agc_config;
2232 EXPECT_EQ(0, engine_.voe()->processing()->GetRxAgcConfig(
2233 channel_num, agc_config));
2234 EXPECT_EQ(6, agc_config.targetLeveldBOv);
2235 EXPECT_EQ(0, agc_config.digitalCompressionGaindB);
2236 EXPECT_TRUE(agc_config.limiterEnable);
2237}
2238
2239TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
2240 EXPECT_TRUE(SetupEngine());
2241 cricket::AudioOptions options;
2242 options.recording_sample_rate.Set(48000u);
2243 options.playout_sample_rate.Set(44100u);
2244 EXPECT_TRUE(engine_.SetOptions(options));
2245
2246 unsigned int recording_sample_rate, playout_sample_rate;
2247 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2248 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2249 EXPECT_EQ(48000u, recording_sample_rate);
2250 EXPECT_EQ(44100u, playout_sample_rate);
2251}
2252
2253TEST_F(WebRtcVoiceEngineTestFake, TraceFilterViaTraceOptions) {
2254 EXPECT_TRUE(SetupEngine());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002255 engine_.SetLogging(rtc::LS_INFO, "");
wu@webrtc.org97077a32013-10-25 21:18:33 +00002256 EXPECT_EQ(
2257 // Info:
2258 webrtc::kTraceStateInfo | webrtc::kTraceInfo |
2259 // Warning:
2260 webrtc::kTraceTerseInfo | webrtc::kTraceWarning |
2261 // Error:
2262 webrtc::kTraceError | webrtc::kTraceCritical,
2263 static_cast<int>(trace_wrapper_->filter_));
2264 // Now set it explicitly
2265 std::string filter =
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002266 "tracefilter " + rtc::ToString(webrtc::kTraceDefault);
2267 engine_.SetLogging(rtc::LS_VERBOSE, filter.c_str());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002268 EXPECT_EQ(static_cast<unsigned int>(webrtc::kTraceDefault),
2269 trace_wrapper_->filter_);
2270}
2271
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002272// Test that we can set the outgoing SSRC properly.
2273// SSRC is set in SetupEngine by calling AddSendStream.
2274TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
2275 EXPECT_TRUE(SetupEngine());
2276 int channel_num = voe_.GetLastChannel();
2277 unsigned int send_ssrc;
2278 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
2279 EXPECT_NE(0U, send_ssrc);
2280 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
2281 EXPECT_EQ(kSsrc1, send_ssrc);
2282}
2283
2284TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2285 // Setup. We need send codec to be set to get all stats.
2286 EXPECT_TRUE(SetupEngine());
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002287 // SetupEngine adds a send stream with kSsrc1, so the receive stream has to
2288 // use a different SSRC.
2289 EXPECT_TRUE(channel_->AddRecvStream(
2290 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002291 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2292 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002293
2294 cricket::VoiceMediaInfo info;
2295 EXPECT_EQ(true, channel_->GetStats(&info));
2296 EXPECT_EQ(1u, info.senders.size());
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +00002297 EXPECT_EQ(kSsrc1, info.senders[0].ssrc());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002298 EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
2299 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].bytes_sent);
2300 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_sent);
2301 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_lost);
2302 EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[0].fraction_lost);
2303 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].ext_seqnum);
2304 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].rtt_ms);
2305 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].jitter_ms);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002306 EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002307 // TODO(sriniv): Add testing for more fields. These are not populated
2308 // in FakeWebrtcVoiceEngine yet.
2309 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].audio_level);
2310 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_median_ms);
2311 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_std_ms);
2312 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_return_loss);
2313 // EXPECT_EQ(cricket::kIntStatValue,
2314 // info.senders[0].echo_return_loss_enhancement);
2315
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002316 EXPECT_EQ(0u, info.receivers.size());
2317 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2318 EXPECT_EQ(true, channel_->GetStats(&info));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002319 EXPECT_EQ(1u, info.receivers.size());
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002320
2321 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd);
2322 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd);
2323 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost);
2324 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum);
2325 EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name);
minyue@webrtc.orgc0bd7be2015-02-18 15:24:13 +00002326 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentExpandRate) /
2327 (1 << 14), info.receivers[0].expand_rate);
2328 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSpeechExpandRate) /
2329 (1 << 14), info.receivers[0].speech_expand_rate);
2330 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSecondaryDecodedRate) /
2331 (1 << 14), info.receivers[0].secondary_decoded_rate);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002332 // TODO(sriniv): Add testing for more receiver fields.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002333}
2334
2335// Test that we can set the outgoing SSRC properly with multiple streams.
2336// SSRC is set in SetupEngine by calling AddSendStream.
2337TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
2338 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002339 int channel_num1 = voe_.GetLastChannel();
2340 unsigned int send_ssrc;
2341 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num1, send_ssrc));
2342 EXPECT_EQ(kSsrc1, send_ssrc);
2343
2344 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2345 int channel_num2 = voe_.GetLastChannel();
2346 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num2, send_ssrc));
2347 EXPECT_EQ(kSsrc1, send_ssrc);
2348}
2349
2350// Test that the local SSRC is the same on sending and receiving channels if the
2351// receive channel is created before the send channel.
2352TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002353 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002354 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002355
2356 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2357 int receive_channel_num = voe_.GetLastChannel();
2358 EXPECT_TRUE(channel_->AddSendStream(
2359 cricket::StreamParams::CreateLegacy(1234)));
2360 int send_channel_num = voe_.GetLastChannel();
2361
2362 unsigned int ssrc = 0;
2363 EXPECT_EQ(0, voe_.GetLocalSSRC(send_channel_num, ssrc));
2364 EXPECT_EQ(1234U, ssrc);
2365 ssrc = 0;
2366 EXPECT_EQ(0, voe_.GetLocalSSRC(receive_channel_num, ssrc));
2367 EXPECT_EQ(1234U, ssrc);
2368}
2369
2370// Test that we can properly receive packets.
2371TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2372 EXPECT_TRUE(SetupEngine());
2373 int channel_num = voe_.GetLastChannel();
2374 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2375 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame,
2376 sizeof(kPcmuFrame)));
2377}
2378
2379// Test that we can properly receive packets on multiple streams.
2380TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
2381 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002382 send_parameters_.options = options_conference_;
2383 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002384 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2385 int channel_num1 = voe_.GetLastChannel();
2386 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2387 int channel_num2 = voe_.GetLastChannel();
2388 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2389 int channel_num3 = voe_.GetLastChannel();
2390 // Create packets with the right SSRCs.
2391 char packets[4][sizeof(kPcmuFrame)];
2392 for (size_t i = 0; i < ARRAY_SIZE(packets); ++i) {
2393 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002394 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002395 }
2396 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2397 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2398 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2399 DeliverPacket(packets[0], sizeof(packets[0]));
2400 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2401 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2402 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2403 DeliverPacket(packets[1], sizeof(packets[1]));
2404 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1],
2405 sizeof(packets[1])));
2406 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2407 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2408 DeliverPacket(packets[2], sizeof(packets[2]));
2409 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2410 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2],
2411 sizeof(packets[2])));
2412 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2413 DeliverPacket(packets[3], sizeof(packets[3]));
2414 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2415 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2416 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3],
2417 sizeof(packets[3])));
2418 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2419 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2420 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2421}
2422
2423// Test that we properly handle failures to add a stream.
2424TEST_F(WebRtcVoiceEngineTestFake, AddStreamFail) {
2425 EXPECT_TRUE(SetupEngine());
2426 voe_.set_fail_create_channel(true);
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_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2430
2431 // In 1:1 call, we should not try to create a new channel.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002432 send_parameters_.options.conference_mode.Set(false);
2433 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002434 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2435}
2436
2437// Test that AddRecvStream doesn't create new channel for 1:1 call.
2438TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream1On1) {
2439 EXPECT_TRUE(SetupEngine());
2440 int channel_num = voe_.GetLastChannel();
2441 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2442 EXPECT_EQ(channel_num, voe_.GetLastChannel());
2443}
2444
2445// Test that after adding a recv stream, we do not decode more codecs than
2446// those previously passed into SetRecvCodecs.
2447TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
2448 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002449 cricket::AudioRecvParameters parameters;
2450 parameters.codecs.push_back(kIsacCodec);
2451 parameters.codecs.push_back(kPcmuCodec);
2452 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002453 EXPECT_TRUE(channel_->AddRecvStream(
2454 cricket::StreamParams::CreateLegacy(kSsrc1)));
2455 int channel_num2 = voe_.GetLastChannel();
2456 webrtc::CodecInst gcodec;
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002457 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "opus");
2458 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002459 gcodec.channels = 2;
2460 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2461}
2462
2463// Test that we properly clean up any streams that were added, even if
2464// not explicitly removed.
2465TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
2466 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002467 send_parameters_.options = options_conference_;
2468 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002469 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2470 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2471 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2472 delete channel_;
2473 channel_ = NULL;
2474 EXPECT_EQ(0, voe_.GetNumChannels());
2475}
2476
wu@webrtc.org78187522013-10-07 23:32:02 +00002477TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
2478 EXPECT_TRUE(SetupEngine());
2479 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2480}
2481
2482TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2483 EXPECT_TRUE(SetupEngine());
2484 // Stream 1 reuses default channel.
2485 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2486 // Manually delete default channel to simulate a failure.
2487 int default_channel = voe_.GetLastChannel();
2488 EXPECT_EQ(0, voe_.DeleteChannel(default_channel));
2489 // Add recv stream 2 should fail because default channel is gone.
2490 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2491 int new_channel = voe_.GetLastChannel();
2492 EXPECT_NE(default_channel, new_channel);
2493 // The last created channel should have already been deleted.
2494 EXPECT_EQ(-1, voe_.DeleteChannel(new_channel));
2495}
2496
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002497// Test the InsertDtmf on default send stream as caller.
2498TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2499 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002500}
2501
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002502// Test the InsertDtmf on default send stream as callee
2503TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2504 TestInsertDtmf(0, false);
2505}
2506
2507// Test the InsertDtmf on specified send stream as caller.
2508TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2509 TestInsertDtmf(kSsrc1, true);
2510}
2511
2512// Test the InsertDtmf on specified send stream as callee.
2513TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2514 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002515}
2516
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002517TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
2518 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002519 send_parameters_.options = options_conference_;
2520 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002521 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2522 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2523 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2524 EXPECT_TRUE(channel_->SetPlayout(true));
2525 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2526 EXPECT_TRUE(channel_->SetPlayout(false));
2527 EXPECT_FALSE(channel_->SetPlayout(true));
2528}
2529
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002530TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
2531 EXPECT_TRUE(SetupEngine());
2532
2533 bool ec_enabled;
2534 webrtc::EcModes ec_mode;
2535 bool ec_metrics_enabled;
2536 webrtc::AecmModes aecm_mode;
2537 bool cng_enabled;
2538 bool agc_enabled;
2539 webrtc::AgcModes agc_mode;
2540 webrtc::AgcConfig agc_config;
2541 bool ns_enabled;
2542 webrtc::NsModes ns_mode;
2543 bool highpass_filter_enabled;
2544 bool stereo_swapping_enabled;
2545 bool typing_detection_enabled;
2546 voe_.GetEcStatus(ec_enabled, ec_mode);
2547 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2548 voe_.GetAecmMode(aecm_mode, cng_enabled);
2549 voe_.GetAgcStatus(agc_enabled, agc_mode);
2550 voe_.GetAgcConfig(agc_config);
2551 voe_.GetNsStatus(ns_enabled, ns_mode);
2552 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2553 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2554 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2555 EXPECT_TRUE(ec_enabled);
2556 EXPECT_TRUE(ec_metrics_enabled);
2557 EXPECT_FALSE(cng_enabled);
2558 EXPECT_TRUE(agc_enabled);
2559 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2560 EXPECT_TRUE(ns_enabled);
2561 EXPECT_TRUE(highpass_filter_enabled);
2562 EXPECT_FALSE(stereo_swapping_enabled);
2563 EXPECT_TRUE(typing_detection_enabled);
2564 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2565 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2566
2567 // Nothing set, so all ignored.
2568 cricket::AudioOptions options;
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002569 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002570 voe_.GetEcStatus(ec_enabled, ec_mode);
2571 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2572 voe_.GetAecmMode(aecm_mode, cng_enabled);
2573 voe_.GetAgcStatus(agc_enabled, agc_mode);
2574 voe_.GetAgcConfig(agc_config);
2575 voe_.GetNsStatus(ns_enabled, ns_mode);
2576 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2577 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2578 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2579 EXPECT_TRUE(ec_enabled);
2580 EXPECT_TRUE(ec_metrics_enabled);
2581 EXPECT_FALSE(cng_enabled);
2582 EXPECT_TRUE(agc_enabled);
2583 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2584 EXPECT_TRUE(ns_enabled);
2585 EXPECT_TRUE(highpass_filter_enabled);
2586 EXPECT_FALSE(stereo_swapping_enabled);
2587 EXPECT_TRUE(typing_detection_enabled);
2588 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2589 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
Henrik Lundin64dad832015-05-11 12:44:23 +02002590 EXPECT_EQ(50, voe_.GetNetEqCapacity()); // From GetDefaultEngineOptions().
Henrik Lundin5263b3c2015-06-01 10:29:41 +02002591 EXPECT_FALSE(
2592 voe_.GetNetEqFastAccelerate()); // From GetDefaultEngineOptions().
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002593
2594 // Turn echo cancellation off
2595 options.echo_cancellation.Set(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002596 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002597 voe_.GetEcStatus(ec_enabled, ec_mode);
2598 EXPECT_FALSE(ec_enabled);
2599
2600 // Turn echo cancellation back on, with settings, and make sure
2601 // nothing else changed.
2602 options.echo_cancellation.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002603 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002604 voe_.GetEcStatus(ec_enabled, ec_mode);
2605 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2606 voe_.GetAecmMode(aecm_mode, cng_enabled);
2607 voe_.GetAgcStatus(agc_enabled, agc_mode);
2608 voe_.GetAgcConfig(agc_config);
2609 voe_.GetNsStatus(ns_enabled, ns_mode);
2610 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2611 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2612 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2613 EXPECT_TRUE(ec_enabled);
2614 EXPECT_TRUE(ec_metrics_enabled);
2615 EXPECT_TRUE(agc_enabled);
2616 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2617 EXPECT_TRUE(ns_enabled);
2618 EXPECT_TRUE(highpass_filter_enabled);
2619 EXPECT_FALSE(stereo_swapping_enabled);
2620 EXPECT_TRUE(typing_detection_enabled);
2621 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2622 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2623
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002624 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2625 // control.
2626 options.delay_agnostic_aec.Set(true);
2627 ASSERT_TRUE(engine_.SetOptions(options));
2628 voe_.GetEcStatus(ec_enabled, ec_mode);
2629 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2630 voe_.GetAecmMode(aecm_mode, cng_enabled);
2631 EXPECT_TRUE(ec_enabled);
2632 EXPECT_TRUE(ec_metrics_enabled);
2633 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2634
2635 // Turn off echo cancellation and delay agnostic aec.
2636 options.delay_agnostic_aec.Set(false);
Henrik Lundin441f6342015-06-09 16:03:13 +02002637 options.extended_filter_aec.Set(false);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002638 options.echo_cancellation.Set(false);
2639 ASSERT_TRUE(engine_.SetOptions(options));
2640 voe_.GetEcStatus(ec_enabled, ec_mode);
2641 EXPECT_FALSE(ec_enabled);
2642 // Turning delay agnostic aec back on should also turn on echo cancellation.
2643 options.delay_agnostic_aec.Set(true);
2644 ASSERT_TRUE(engine_.SetOptions(options));
2645 voe_.GetEcStatus(ec_enabled, ec_mode);
2646 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2647 EXPECT_TRUE(ec_enabled);
2648 EXPECT_TRUE(ec_metrics_enabled);
2649 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2650
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002651 // Turn off AGC
2652 options.auto_gain_control.Set(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002653 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002654 voe_.GetAgcStatus(agc_enabled, agc_mode);
2655 EXPECT_FALSE(agc_enabled);
2656
2657 // Turn AGC back on
2658 options.auto_gain_control.Set(true);
2659 options.adjust_agc_delta.Clear();
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002660 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002661 voe_.GetAgcStatus(agc_enabled, agc_mode);
2662 EXPECT_TRUE(agc_enabled);
2663 voe_.GetAgcConfig(agc_config);
2664 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2665
2666 // Turn off other options (and stereo swapping on).
2667 options.noise_suppression.Set(false);
2668 options.highpass_filter.Set(false);
2669 options.typing_detection.Set(false);
2670 options.stereo_swapping.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002671 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002672 voe_.GetNsStatus(ns_enabled, ns_mode);
2673 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2674 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2675 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2676 EXPECT_FALSE(ns_enabled);
2677 EXPECT_FALSE(highpass_filter_enabled);
2678 EXPECT_FALSE(typing_detection_enabled);
2679 EXPECT_TRUE(stereo_swapping_enabled);
2680
2681 // Turn on "conference mode" to ensure it has no impact.
2682 options.conference_mode.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002683 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002684 voe_.GetEcStatus(ec_enabled, ec_mode);
2685 voe_.GetNsStatus(ns_enabled, ns_mode);
2686 EXPECT_TRUE(ec_enabled);
2687 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2688 EXPECT_FALSE(ns_enabled);
2689 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2690}
2691
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002692TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002693 EXPECT_TRUE(SetupEngine());
2694
2695 bool ec_enabled;
2696 webrtc::EcModes ec_mode;
2697 bool ec_metrics_enabled;
2698 bool agc_enabled;
2699 webrtc::AgcModes agc_mode;
2700 bool ns_enabled;
2701 webrtc::NsModes ns_mode;
2702 bool highpass_filter_enabled;
2703 bool stereo_swapping_enabled;
2704 bool typing_detection_enabled;
2705
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002706 voe_.GetEcStatus(ec_enabled, ec_mode);
2707 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2708 voe_.GetAgcStatus(agc_enabled, agc_mode);
2709 voe_.GetNsStatus(ns_enabled, ns_mode);
2710 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2711 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2712 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2713 EXPECT_TRUE(ec_enabled);
2714 EXPECT_TRUE(agc_enabled);
2715 EXPECT_TRUE(ns_enabled);
2716 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002717 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002718 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002719}
2720
2721TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2722 webrtc::AgcConfig set_config = {0};
2723 set_config.targetLeveldBOv = 3;
2724 set_config.digitalCompressionGaindB = 9;
2725 set_config.limiterEnable = true;
2726 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002727 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002728
2729 webrtc::AgcConfig config = {0};
2730 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2731 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2732 EXPECT_EQ(set_config.digitalCompressionGaindB,
2733 config.digitalCompressionGaindB);
2734 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2735}
2736
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002737TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
2738 EXPECT_TRUE(SetupEngine());
solenberg66f43392015-09-09 01:36:22 -07002739 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2740 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002741 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002742 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2743 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002744 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002745
2746 // Have to add a stream to make SetSend work.
2747 cricket::StreamParams stream1;
2748 stream1.ssrcs.push_back(1);
2749 channel1->AddSendStream(stream1);
2750 cricket::StreamParams stream2;
2751 stream2.ssrcs.push_back(2);
2752 channel2->AddSendStream(stream2);
2753
2754 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002755 cricket::AudioSendParameters parameters_options_all = send_parameters_;
2756 parameters_options_all.options.echo_cancellation.Set(true);
2757 parameters_options_all.options.auto_gain_control.Set(true);
2758 parameters_options_all.options.noise_suppression.Set(true);
2759 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2760 EXPECT_EQ(parameters_options_all.options, channel1->options());
2761 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2762 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002763
2764 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002765 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
2766 parameters_options_no_ns.options.noise_suppression.Set(false);
2767 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2768 cricket::AudioOptions expected_options = parameters_options_all.options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002769 expected_options.echo_cancellation.Set(true);
2770 expected_options.auto_gain_control.Set(true);
2771 expected_options.noise_suppression.Set(false);
solenberg66f43392015-09-09 01:36:22 -07002772 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002773
2774 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002775 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
2776 parameters_options_no_agc.options.auto_gain_control.Set(false);
2777 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002778 expected_options.echo_cancellation.Set(true);
2779 expected_options.auto_gain_control.Set(false);
2780 expected_options.noise_suppression.Set(true);
solenberg66f43392015-09-09 01:36:22 -07002781 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002782
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002783 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002784 bool ec_enabled;
2785 webrtc::EcModes ec_mode;
2786 bool agc_enabled;
2787 webrtc::AgcModes agc_mode;
2788 bool ns_enabled;
2789 webrtc::NsModes ns_mode;
2790 voe_.GetEcStatus(ec_enabled, ec_mode);
2791 voe_.GetAgcStatus(agc_enabled, agc_mode);
2792 voe_.GetNsStatus(ns_enabled, ns_mode);
2793 EXPECT_TRUE(ec_enabled);
2794 EXPECT_TRUE(agc_enabled);
2795 EXPECT_TRUE(ns_enabled);
2796
2797 channel1->SetSend(cricket::SEND_MICROPHONE);
2798 voe_.GetEcStatus(ec_enabled, ec_mode);
2799 voe_.GetAgcStatus(agc_enabled, agc_mode);
2800 voe_.GetNsStatus(ns_enabled, ns_mode);
2801 EXPECT_TRUE(ec_enabled);
2802 EXPECT_TRUE(agc_enabled);
2803 EXPECT_FALSE(ns_enabled);
2804
2805 channel1->SetSend(cricket::SEND_NOTHING);
2806 voe_.GetEcStatus(ec_enabled, ec_mode);
2807 voe_.GetAgcStatus(agc_enabled, agc_mode);
2808 voe_.GetNsStatus(ns_enabled, ns_mode);
2809 EXPECT_TRUE(ec_enabled);
2810 EXPECT_TRUE(agc_enabled);
2811 EXPECT_TRUE(ns_enabled);
2812
2813 channel2->SetSend(cricket::SEND_MICROPHONE);
2814 voe_.GetEcStatus(ec_enabled, ec_mode);
2815 voe_.GetAgcStatus(agc_enabled, agc_mode);
2816 voe_.GetNsStatus(ns_enabled, ns_mode);
2817 EXPECT_TRUE(ec_enabled);
2818 EXPECT_FALSE(agc_enabled);
2819 EXPECT_TRUE(ns_enabled);
2820
2821 channel2->SetSend(cricket::SEND_NOTHING);
2822 voe_.GetEcStatus(ec_enabled, ec_mode);
2823 voe_.GetAgcStatus(agc_enabled, agc_mode);
2824 voe_.GetNsStatus(ns_enabled, ns_mode);
2825 EXPECT_TRUE(ec_enabled);
2826 EXPECT_TRUE(agc_enabled);
2827 EXPECT_TRUE(ns_enabled);
2828
2829 // Make sure settings take effect while we are sending.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002830 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
2831 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2832 send_parameters_;
2833 parameters_options_no_agc_nor_ns.options.auto_gain_control.Set(false);
2834 parameters_options_no_agc_nor_ns.options.noise_suppression.Set(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002835 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002836 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002837 expected_options.echo_cancellation.Set(true);
2838 expected_options.auto_gain_control.Set(false);
2839 expected_options.noise_suppression.Set(false);
solenberg66f43392015-09-09 01:36:22 -07002840 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002841 voe_.GetEcStatus(ec_enabled, ec_mode);
2842 voe_.GetAgcStatus(agc_enabled, agc_mode);
2843 voe_.GetNsStatus(ns_enabled, ns_mode);
2844 EXPECT_TRUE(ec_enabled);
2845 EXPECT_FALSE(agc_enabled);
2846 EXPECT_FALSE(ns_enabled);
2847}
2848
wu@webrtc.orgde305012013-10-31 15:40:38 +00002849// This test verifies DSCP settings are properly applied on voice media channel.
2850TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
2851 EXPECT_TRUE(SetupEngine());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002852 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002853 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002854 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00002855 new cricket::FakeNetworkInterface);
2856 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002857 cricket::AudioSendParameters parameters = send_parameters_;
2858 parameters.options.dscp.Set(true);
2859 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002860 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00002861 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002862 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002863 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002864 parameters.options.dscp.Set(false);
2865 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002866 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00002867}
2868
solenbergd97ec302015-10-07 01:40:33 -07002869// Test that GetReceiveChannelId returns the default channel for the first
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002870// recv stream in 1-1 calls.
solenbergd97ec302015-10-07 01:40:33 -07002871TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelIdIn1To1Calls) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002872 EXPECT_TRUE(SetupEngine());
2873 cricket::WebRtcVoiceMediaChannel* media_channel =
2874 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2875 // Test that GetChannelNum returns the default channel if the SSRC is unknown.
2876 EXPECT_EQ(media_channel->voe_channel(),
solenbergd97ec302015-10-07 01:40:33 -07002877 media_channel->GetReceiveChannelId(0));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002878 cricket::StreamParams stream;
2879 stream.ssrcs.push_back(kSsrc2);
2880 EXPECT_TRUE(channel_->AddRecvStream(stream));
2881 EXPECT_EQ(media_channel->voe_channel(),
solenbergd97ec302015-10-07 01:40:33 -07002882 media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002883}
2884
solenbergd97ec302015-10-07 01:40:33 -07002885// Test that GetReceiveChannelId doesn't return the default channel for the
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002886// first recv stream in conference calls.
2887TEST_F(WebRtcVoiceEngineTestFake, TestGetChannelNumInConferenceCalls) {
2888 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002889 send_parameters_.options = options_conference_;
2890 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002891 cricket::StreamParams stream;
2892 stream.ssrcs.push_back(kSsrc2);
2893 EXPECT_TRUE(channel_->AddRecvStream(stream));
2894 cricket::WebRtcVoiceMediaChannel* media_channel =
2895 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2896 EXPECT_LT(media_channel->voe_channel(),
solenbergd97ec302015-10-07 01:40:33 -07002897 media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002898}
2899
2900TEST_F(WebRtcVoiceEngineTestFake, SetOutputScaling) {
2901 EXPECT_TRUE(SetupEngine());
solenbergbb741b32015-09-07 03:56:38 -07002902 float scale, left, right;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002903 EXPECT_TRUE(channel_->SetOutputScaling(0, 1, 2));
solenbergbb741b32015-09-07 03:56:38 -07002904 int channel_id = voe_.GetLastChannel();
2905 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2906 EXPECT_EQ(0, voe_.GetOutputVolumePan(channel_id, left, right));
2907 EXPECT_DOUBLE_EQ(1, left * scale);
2908 EXPECT_DOUBLE_EQ(2, right * scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002909
2910 EXPECT_FALSE(channel_->SetOutputScaling(kSsrc2, 1, 2));
2911 cricket::StreamParams stream;
2912 stream.ssrcs.push_back(kSsrc2);
2913 EXPECT_TRUE(channel_->AddRecvStream(stream));
2914
2915 EXPECT_TRUE(channel_->SetOutputScaling(kSsrc2, 2, 1));
solenbergbb741b32015-09-07 03:56:38 -07002916 channel_id = voe_.GetLastChannel();
2917 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2918 EXPECT_EQ(0, voe_.GetOutputVolumePan(channel_id, left, right));
2919 EXPECT_DOUBLE_EQ(2, left * scale);
2920 EXPECT_DOUBLE_EQ(1, right * scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002921}
2922
pbos8fc7fa72015-07-15 08:02:58 -07002923TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02002924 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07002925 const std::string kSyncLabel = "AvSyncLabel";
2926
2927 EXPECT_TRUE(SetupEngine());
pbos8fc7fa72015-07-15 08:02:58 -07002928 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
2929 sp.sync_label = kSyncLabel;
2930 // Creating two channels to make sure that sync label is set properly for both
2931 // the default voice channel and following ones.
2932 EXPECT_TRUE(channel_->AddRecvStream(sp));
2933 sp.ssrcs[0] += 1;
2934 EXPECT_TRUE(channel_->AddRecvStream(sp));
2935
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002936 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07002937 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002938 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002939 << "SyncGroup should be set based on sync_label";
2940 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002941 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002942 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07002943}
2944
pbos6bb1b6e2015-07-24 07:10:18 -07002945TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002946 // Test that changing the combined_audio_video_bwe option results in the
2947 // expected state changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002948 std::vector<uint32_t> ssrcs;
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002949 ssrcs.push_back(223);
2950 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002951
2952 EXPECT_TRUE(SetupEngine());
2953 cricket::WebRtcVoiceMediaChannel* media_channel =
2954 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02002955 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002956 EXPECT_TRUE(media_channel->AddRecvStream(
2957 cricket::StreamParams::CreateLegacy(ssrc)));
2958 }
2959 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002960
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002961 // Combined BWE should be disabled.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002962 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002963 const auto* s = call_.GetAudioReceiveStream(ssrc);
2964 EXPECT_NE(nullptr, s);
2965 EXPECT_EQ(false, s->GetConfig().combined_audio_video_bwe);
2966 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002967
2968 // Enable combined BWE option - now it should be set up.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002969 send_parameters_.options.combined_audio_video_bwe.Set(true);
2970 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002971 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002972 const auto* s = call_.GetAudioReceiveStream(ssrc);
2973 EXPECT_NE(nullptr, s);
2974 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
2975 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002976
2977 // Disable combined BWE option - should be disabled again.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002978 send_parameters_.options.combined_audio_video_bwe.Set(false);
2979 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002980 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002981 const auto* s = call_.GetAudioReceiveStream(ssrc);
2982 EXPECT_NE(nullptr, s);
2983 EXPECT_EQ(false, s->GetConfig().combined_audio_video_bwe);
2984 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002985
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002986 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002987}
2988
pbos6bb1b6e2015-07-24 07:10:18 -07002989TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002990 // Test that adding receive streams after enabling combined bandwidth
2991 // estimation will correctly configure each channel.
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002992 EXPECT_TRUE(SetupEngine());
2993 cricket::WebRtcVoiceMediaChannel* media_channel =
2994 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002995 send_parameters_.options.combined_audio_video_bwe.Set(true);
2996 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002997
Peter Boström0c4e06b2015-10-07 12:23:21 +02002998 static const uint32_t kSsrcs[] = {1, 2, 3, 4};
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002999 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs); ++i) {
3000 EXPECT_TRUE(media_channel->AddRecvStream(
3001 cricket::StreamParams::CreateLegacy(kSsrcs[i])));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003002 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(kSsrcs[i]));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003003 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003004 EXPECT_EQ(ARRAY_SIZE(kSsrcs), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003005}
3006
pbos6bb1b6e2015-07-24 07:10:18 -07003007TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003008 // Test that setting the header extensions results in the expected state
3009 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003010 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003011 ssrcs.push_back(223);
3012 ssrcs.push_back(224);
3013
3014 EXPECT_TRUE(SetupEngine());
3015 cricket::WebRtcVoiceMediaChannel* media_channel =
3016 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003017 send_parameters_.options.combined_audio_video_bwe.Set(true);
3018 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003019 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003020 EXPECT_TRUE(media_channel->AddRecvStream(
3021 cricket::StreamParams::CreateLegacy(ssrc)));
3022 }
3023
3024 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003025 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003026 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003027 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003028 EXPECT_NE(nullptr, s);
3029 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3030 }
3031
3032 // Set up receive extensions.
3033 const auto& e_exts = engine_.rtp_header_extensions();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003034 cricket::AudioRecvParameters recv_parameters;
3035 recv_parameters.extensions = e_exts;
3036 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003037 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003038 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003039 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003040 EXPECT_NE(nullptr, s);
3041 const auto& s_exts = s->GetConfig().rtp.extensions;
3042 EXPECT_EQ(e_exts.size(), s_exts.size());
3043 for (const auto& e_ext : e_exts) {
3044 for (const auto& s_ext : s_exts) {
3045 if (e_ext.id == s_ext.id) {
3046 EXPECT_EQ(e_ext.uri, s_ext.name);
3047 }
3048 }
3049 }
3050 }
3051
3052 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003053 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003054 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003055 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003056 EXPECT_NE(nullptr, s);
3057 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3058 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003059}
3060
3061TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3062 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003063 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003064 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3065 static const unsigned char kRtcp[] = {
3066 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3067 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3068 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3069 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3070 };
3071 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3072
3073 EXPECT_TRUE(SetupEngine());
3074 cricket::WebRtcVoiceMediaChannel* media_channel =
3075 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003076 send_parameters_.options.combined_audio_video_bwe.Set(true);
3077 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003078 EXPECT_TRUE(media_channel->AddRecvStream(
3079 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3080
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003081 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003082 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003083 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003084 EXPECT_EQ(0, s->received_packets());
3085 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3086 EXPECT_EQ(1, s->received_packets());
3087 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3088 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003089}
Minyue2013aec2015-05-13 14:14:42 +02003090
3091// Associate channel should not set on 1:1 call, since the receive channel also
3092// sends RTCP SR.
3093TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelUnset1On1) {
3094 EXPECT_TRUE(SetupEngine());
3095 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3096 int recv_ch = voe_.GetLastChannel();
3097 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3098}
3099
3100// This test is an extension of AssociateChannelUnset1On1. We create two receive
3101// channels. The second should be associated with the default channel, since it
3102// does not send RTCP SR.
3103TEST_F(WebRtcVoiceEngineTestFake, AssociateDefaultChannelOnSecondRecvChannel) {
3104 EXPECT_TRUE(SetupEngine());
3105 cricket::WebRtcVoiceMediaChannel* media_channel =
3106 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3107 int default_channel = media_channel->voe_channel();
3108 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3109 int recv_ch_1 = voe_.GetLastChannel();
3110 EXPECT_EQ(recv_ch_1, default_channel);
3111 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
3112 int recv_ch_2 = voe_.GetLastChannel();
3113 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_1), -1);
3114 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_2), default_channel);
3115 // Add send stream, the association remains.
3116 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(3)));
3117 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_1), -1);
3118 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_2), default_channel);
3119}
3120
3121// In conference mode, all receive channels should be associated with the
3122// default channel, since they do not send RTCP SR.
3123TEST_F(WebRtcVoiceEngineTestFake, AssociateDefaultChannelOnConference) {
3124 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003125 send_parameters_.options = options_conference_;
3126 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003127 cricket::WebRtcVoiceMediaChannel* media_channel =
3128 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3129 int default_channel = media_channel->voe_channel();
3130 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3131 int recv_ch = voe_.GetLastChannel();
3132 EXPECT_NE(recv_ch, default_channel);
3133 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3134 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3135 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3136}
3137
3138TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
3139 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003140 send_parameters_.options = options_conference_;
3141 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003142
3143 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3144 int recv_ch = voe_.GetLastChannel();
3145
3146 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3147 int send_ch = voe_.GetLastChannel();
3148
3149 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3150 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3151 // channel of |recv_ch|.This is not a common case, since, normally, only the
3152 // default channel can be associated. However, the default is not deletable.
3153 // So we force the |recv_ch| to associate with a non-default channel.
3154 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3155 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3156
3157 EXPECT_TRUE(channel_->RemoveSendStream(2));
3158 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3159}
stefan658910c2015-09-03 05:48:32 -07003160
3161// Tests for the actual WebRtc VoE library.
3162
3163TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
3164 cricket::WebRtcVoiceEngine engine;
3165 cricket::AudioOptions options = engine.GetOptions();
3166 // The default options should have at least a few things set. We purposefully
3167 // don't check the option values here, though.
3168 EXPECT_TRUE(options.echo_cancellation.IsSet());
3169 EXPECT_TRUE(options.auto_gain_control.IsSet());
3170 EXPECT_TRUE(options.noise_suppression.IsSet());
3171}
3172
3173// Tests that the library initializes and shuts down properly.
3174TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3175 cricket::WebRtcVoiceEngine engine;
3176 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003177 rtc::scoped_ptr<webrtc::Call> call(
3178 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003179 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003180 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003181 EXPECT_TRUE(channel != nullptr);
3182 delete channel;
3183 engine.Terminate();
3184
3185 // Reinit to catch regression where VoiceEngineObserver reference is lost
3186 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3187 engine.Terminate();
3188}
3189
3190// Tests that the library is configured with the codecs we want.
3191TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
3192 cricket::WebRtcVoiceEngine engine;
3193 // Check codecs by name.
3194 EXPECT_TRUE(engine.FindCodec(
3195 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0)));
3196 EXPECT_TRUE(engine.FindCodec(
3197 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0)));
3198 EXPECT_TRUE(engine.FindCodec(
3199 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0)));
3200 // Check that name matching is case-insensitive.
3201 EXPECT_TRUE(engine.FindCodec(
3202 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0)));
3203 EXPECT_TRUE(engine.FindCodec(
3204 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0)));
3205 EXPECT_TRUE(engine.FindCodec(
3206 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0)));
3207 EXPECT_TRUE(engine.FindCodec(
3208 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0)));
3209 EXPECT_TRUE(engine.FindCodec(
3210 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0)));
3211 EXPECT_TRUE(engine.FindCodec(
3212 cricket::AudioCodec(96, "red", 8000, 0, 1, 0)));
3213 EXPECT_TRUE(engine.FindCodec(
3214 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0)));
3215 EXPECT_TRUE(engine.FindCodec(
3216 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0)));
3217 EXPECT_TRUE(engine.FindCodec(
3218 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0)));
3219 EXPECT_TRUE(engine.FindCodec(
3220 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0)));
3221 // Check codecs with an id by id.
3222 EXPECT_TRUE(engine.FindCodec(
3223 cricket::AudioCodec(0, "", 8000, 0, 1, 0))); // PCMU
3224 EXPECT_TRUE(engine.FindCodec(
3225 cricket::AudioCodec(8, "", 8000, 0, 1, 0))); // PCMA
3226 EXPECT_TRUE(engine.FindCodec(
3227 cricket::AudioCodec(9, "", 8000, 0, 1, 0))); // G722
3228 EXPECT_TRUE(engine.FindCodec(
3229 cricket::AudioCodec(13, "", 8000, 0, 1, 0))); // CN
3230 // Check sample/bitrate matching.
3231 EXPECT_TRUE(engine.FindCodec(
3232 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0)));
3233 // Check that bad codecs fail.
3234 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0)));
3235 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(88, "", 0, 0, 1, 0)));
3236 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 0, 2, 0)));
3237 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 5000, 0, 1, 0)));
3238 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 5000, 1, 0)));
3239 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3240 for (std::vector<cricket::AudioCodec>::const_iterator it =
3241 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3242 if (it->name == "CN" && it->clockrate == 16000) {
3243 EXPECT_EQ(105, it->id);
3244 } else if (it->name == "CN" && it->clockrate == 32000) {
3245 EXPECT_EQ(106, it->id);
3246 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3247 EXPECT_EQ(103, it->id);
3248 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3249 EXPECT_EQ(104, it->id);
3250 } else if (it->name == "G722" && it->clockrate == 8000) {
3251 EXPECT_EQ(9, it->id);
3252 } else if (it->name == "telephone-event") {
3253 EXPECT_EQ(126, it->id);
3254 } else if (it->name == "red") {
3255 EXPECT_EQ(127, it->id);
3256 } else if (it->name == "opus") {
3257 EXPECT_EQ(111, it->id);
3258 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3259 EXPECT_EQ("10", it->params.find("minptime")->second);
3260 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3261 EXPECT_EQ("60", it->params.find("maxptime")->second);
3262 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3263 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3264 }
3265 }
3266
3267 engine.Terminate();
3268}
3269
3270// Tests that VoE supports at least 32 channels
3271TEST(WebRtcVoiceEngineTest, Has32Channels) {
3272 cricket::WebRtcVoiceEngine engine;
3273 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003274 rtc::scoped_ptr<webrtc::Call> call(
3275 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003276
3277 cricket::VoiceMediaChannel* channels[32];
3278 int num_channels = 0;
stefan658910c2015-09-03 05:48:32 -07003279 while (num_channels < ARRAY_SIZE(channels)) {
3280 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003281 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003282 if (!channel)
3283 break;
stefan658910c2015-09-03 05:48:32 -07003284 channels[num_channels++] = channel;
3285 }
3286
3287 int expected = ARRAY_SIZE(channels);
3288 EXPECT_EQ(expected, num_channels);
3289
3290 while (num_channels > 0) {
3291 delete channels[--num_channels];
3292 }
3293
3294 engine.Terminate();
3295}
3296
3297// Test that we set our preferred codecs properly.
3298TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3299 cricket::WebRtcVoiceEngine engine;
3300 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003301 rtc::scoped_ptr<webrtc::Call> call(
3302 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003303 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3304 call.get());
3305 cricket::AudioRecvParameters parameters;
3306 parameters.codecs = engine.codecs();
3307 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003308}