blob: 6300f1df58f7c5e38172313dd098dc2dd896e4fc [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
wu@webrtc.org97077a32013-10-25 21:18:33 +00002222TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
2223 EXPECT_TRUE(SetupEngine());
2224 cricket::AudioOptions options;
2225 options.recording_sample_rate.Set(48000u);
2226 options.playout_sample_rate.Set(44100u);
2227 EXPECT_TRUE(engine_.SetOptions(options));
2228
2229 unsigned int recording_sample_rate, playout_sample_rate;
2230 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2231 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2232 EXPECT_EQ(48000u, recording_sample_rate);
2233 EXPECT_EQ(44100u, playout_sample_rate);
2234}
2235
2236TEST_F(WebRtcVoiceEngineTestFake, TraceFilterViaTraceOptions) {
2237 EXPECT_TRUE(SetupEngine());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002238 engine_.SetLogging(rtc::LS_INFO, "");
wu@webrtc.org97077a32013-10-25 21:18:33 +00002239 EXPECT_EQ(
2240 // Info:
2241 webrtc::kTraceStateInfo | webrtc::kTraceInfo |
2242 // Warning:
2243 webrtc::kTraceTerseInfo | webrtc::kTraceWarning |
2244 // Error:
2245 webrtc::kTraceError | webrtc::kTraceCritical,
2246 static_cast<int>(trace_wrapper_->filter_));
2247 // Now set it explicitly
2248 std::string filter =
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002249 "tracefilter " + rtc::ToString(webrtc::kTraceDefault);
2250 engine_.SetLogging(rtc::LS_VERBOSE, filter.c_str());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002251 EXPECT_EQ(static_cast<unsigned int>(webrtc::kTraceDefault),
2252 trace_wrapper_->filter_);
2253}
2254
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002255// Test that we can set the outgoing SSRC properly.
2256// SSRC is set in SetupEngine by calling AddSendStream.
2257TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
2258 EXPECT_TRUE(SetupEngine());
2259 int channel_num = voe_.GetLastChannel();
2260 unsigned int send_ssrc;
2261 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
2262 EXPECT_NE(0U, send_ssrc);
2263 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
2264 EXPECT_EQ(kSsrc1, send_ssrc);
2265}
2266
2267TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2268 // Setup. We need send codec to be set to get all stats.
2269 EXPECT_TRUE(SetupEngine());
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002270 // SetupEngine adds a send stream with kSsrc1, so the receive stream has to
2271 // use a different SSRC.
2272 EXPECT_TRUE(channel_->AddRecvStream(
2273 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002274 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2275 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002276
2277 cricket::VoiceMediaInfo info;
2278 EXPECT_EQ(true, channel_->GetStats(&info));
2279 EXPECT_EQ(1u, info.senders.size());
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +00002280 EXPECT_EQ(kSsrc1, info.senders[0].ssrc());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002281 EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
2282 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].bytes_sent);
2283 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_sent);
2284 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_lost);
2285 EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[0].fraction_lost);
2286 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].ext_seqnum);
2287 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].rtt_ms);
2288 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].jitter_ms);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002289 EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002290 // TODO(sriniv): Add testing for more fields. These are not populated
2291 // in FakeWebrtcVoiceEngine yet.
2292 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].audio_level);
2293 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_median_ms);
2294 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_std_ms);
2295 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_return_loss);
2296 // EXPECT_EQ(cricket::kIntStatValue,
2297 // info.senders[0].echo_return_loss_enhancement);
2298
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002299 EXPECT_EQ(0u, info.receivers.size());
2300 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2301 EXPECT_EQ(true, channel_->GetStats(&info));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002302 EXPECT_EQ(1u, info.receivers.size());
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002303
2304 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd);
2305 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd);
2306 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost);
2307 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum);
2308 EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name);
minyue@webrtc.orgc0bd7be2015-02-18 15:24:13 +00002309 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentExpandRate) /
2310 (1 << 14), info.receivers[0].expand_rate);
2311 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSpeechExpandRate) /
2312 (1 << 14), info.receivers[0].speech_expand_rate);
2313 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSecondaryDecodedRate) /
2314 (1 << 14), info.receivers[0].secondary_decoded_rate);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002315 // TODO(sriniv): Add testing for more receiver fields.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002316}
2317
2318// Test that we can set the outgoing SSRC properly with multiple streams.
2319// SSRC is set in SetupEngine by calling AddSendStream.
2320TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
2321 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002322 int channel_num1 = voe_.GetLastChannel();
2323 unsigned int send_ssrc;
2324 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num1, send_ssrc));
2325 EXPECT_EQ(kSsrc1, send_ssrc);
2326
2327 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2328 int channel_num2 = voe_.GetLastChannel();
2329 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num2, send_ssrc));
2330 EXPECT_EQ(kSsrc1, send_ssrc);
2331}
2332
2333// Test that the local SSRC is the same on sending and receiving channels if the
2334// receive channel is created before the send channel.
2335TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002336 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002337 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002338
2339 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2340 int receive_channel_num = voe_.GetLastChannel();
2341 EXPECT_TRUE(channel_->AddSendStream(
2342 cricket::StreamParams::CreateLegacy(1234)));
2343 int send_channel_num = voe_.GetLastChannel();
2344
2345 unsigned int ssrc = 0;
2346 EXPECT_EQ(0, voe_.GetLocalSSRC(send_channel_num, ssrc));
2347 EXPECT_EQ(1234U, ssrc);
2348 ssrc = 0;
2349 EXPECT_EQ(0, voe_.GetLocalSSRC(receive_channel_num, ssrc));
2350 EXPECT_EQ(1234U, ssrc);
2351}
2352
2353// Test that we can properly receive packets.
2354TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2355 EXPECT_TRUE(SetupEngine());
2356 int channel_num = voe_.GetLastChannel();
2357 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2358 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame,
2359 sizeof(kPcmuFrame)));
2360}
2361
2362// Test that we can properly receive packets on multiple streams.
2363TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
2364 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002365 send_parameters_.options = options_conference_;
2366 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002367 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2368 int channel_num1 = voe_.GetLastChannel();
2369 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2370 int channel_num2 = voe_.GetLastChannel();
2371 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2372 int channel_num3 = voe_.GetLastChannel();
2373 // Create packets with the right SSRCs.
2374 char packets[4][sizeof(kPcmuFrame)];
2375 for (size_t i = 0; i < ARRAY_SIZE(packets); ++i) {
2376 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002377 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002378 }
2379 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2380 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2381 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2382 DeliverPacket(packets[0], sizeof(packets[0]));
2383 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2384 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2385 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2386 DeliverPacket(packets[1], sizeof(packets[1]));
2387 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1],
2388 sizeof(packets[1])));
2389 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2390 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2391 DeliverPacket(packets[2], sizeof(packets[2]));
2392 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2393 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2],
2394 sizeof(packets[2])));
2395 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2396 DeliverPacket(packets[3], sizeof(packets[3]));
2397 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2398 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2399 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3],
2400 sizeof(packets[3])));
2401 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2402 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2403 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2404}
2405
2406// Test that we properly handle failures to add a stream.
2407TEST_F(WebRtcVoiceEngineTestFake, AddStreamFail) {
2408 EXPECT_TRUE(SetupEngine());
2409 voe_.set_fail_create_channel(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002410 send_parameters_.options = options_conference_;
2411 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002412 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2413
2414 // In 1:1 call, we should not try to create a new channel.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002415 send_parameters_.options.conference_mode.Set(false);
2416 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002417 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2418}
2419
2420// Test that AddRecvStream doesn't create new channel for 1:1 call.
2421TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream1On1) {
2422 EXPECT_TRUE(SetupEngine());
2423 int channel_num = voe_.GetLastChannel();
2424 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2425 EXPECT_EQ(channel_num, voe_.GetLastChannel());
2426}
2427
2428// Test that after adding a recv stream, we do not decode more codecs than
2429// those previously passed into SetRecvCodecs.
2430TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
2431 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002432 cricket::AudioRecvParameters parameters;
2433 parameters.codecs.push_back(kIsacCodec);
2434 parameters.codecs.push_back(kPcmuCodec);
2435 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002436 EXPECT_TRUE(channel_->AddRecvStream(
2437 cricket::StreamParams::CreateLegacy(kSsrc1)));
2438 int channel_num2 = voe_.GetLastChannel();
2439 webrtc::CodecInst gcodec;
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002440 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "opus");
2441 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002442 gcodec.channels = 2;
2443 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2444}
2445
2446// Test that we properly clean up any streams that were added, even if
2447// not explicitly removed.
2448TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
2449 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002450 send_parameters_.options = options_conference_;
2451 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002452 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2453 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2454 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2455 delete channel_;
2456 channel_ = NULL;
2457 EXPECT_EQ(0, voe_.GetNumChannels());
2458}
2459
wu@webrtc.org78187522013-10-07 23:32:02 +00002460TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
2461 EXPECT_TRUE(SetupEngine());
2462 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2463}
2464
2465TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2466 EXPECT_TRUE(SetupEngine());
2467 // Stream 1 reuses default channel.
2468 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2469 // Manually delete default channel to simulate a failure.
2470 int default_channel = voe_.GetLastChannel();
2471 EXPECT_EQ(0, voe_.DeleteChannel(default_channel));
2472 // Add recv stream 2 should fail because default channel is gone.
2473 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2474 int new_channel = voe_.GetLastChannel();
2475 EXPECT_NE(default_channel, new_channel);
2476 // The last created channel should have already been deleted.
2477 EXPECT_EQ(-1, voe_.DeleteChannel(new_channel));
2478}
2479
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002480// Test the InsertDtmf on default send stream as caller.
2481TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2482 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002483}
2484
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002485// Test the InsertDtmf on default send stream as callee
2486TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2487 TestInsertDtmf(0, false);
2488}
2489
2490// Test the InsertDtmf on specified send stream as caller.
2491TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2492 TestInsertDtmf(kSsrc1, true);
2493}
2494
2495// Test the InsertDtmf on specified send stream as callee.
2496TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2497 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002498}
2499
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002500TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
2501 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002502 send_parameters_.options = options_conference_;
2503 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002504 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2505 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2506 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2507 EXPECT_TRUE(channel_->SetPlayout(true));
2508 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2509 EXPECT_TRUE(channel_->SetPlayout(false));
2510 EXPECT_FALSE(channel_->SetPlayout(true));
2511}
2512
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002513TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
2514 EXPECT_TRUE(SetupEngine());
2515
2516 bool ec_enabled;
2517 webrtc::EcModes ec_mode;
2518 bool ec_metrics_enabled;
2519 webrtc::AecmModes aecm_mode;
2520 bool cng_enabled;
2521 bool agc_enabled;
2522 webrtc::AgcModes agc_mode;
2523 webrtc::AgcConfig agc_config;
2524 bool ns_enabled;
2525 webrtc::NsModes ns_mode;
2526 bool highpass_filter_enabled;
2527 bool stereo_swapping_enabled;
2528 bool typing_detection_enabled;
2529 voe_.GetEcStatus(ec_enabled, ec_mode);
2530 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2531 voe_.GetAecmMode(aecm_mode, cng_enabled);
2532 voe_.GetAgcStatus(agc_enabled, agc_mode);
2533 voe_.GetAgcConfig(agc_config);
2534 voe_.GetNsStatus(ns_enabled, ns_mode);
2535 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2536 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2537 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2538 EXPECT_TRUE(ec_enabled);
2539 EXPECT_TRUE(ec_metrics_enabled);
2540 EXPECT_FALSE(cng_enabled);
2541 EXPECT_TRUE(agc_enabled);
2542 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2543 EXPECT_TRUE(ns_enabled);
2544 EXPECT_TRUE(highpass_filter_enabled);
2545 EXPECT_FALSE(stereo_swapping_enabled);
2546 EXPECT_TRUE(typing_detection_enabled);
2547 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2548 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2549
2550 // Nothing set, so all ignored.
2551 cricket::AudioOptions options;
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002552 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002553 voe_.GetEcStatus(ec_enabled, ec_mode);
2554 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2555 voe_.GetAecmMode(aecm_mode, cng_enabled);
2556 voe_.GetAgcStatus(agc_enabled, agc_mode);
2557 voe_.GetAgcConfig(agc_config);
2558 voe_.GetNsStatus(ns_enabled, ns_mode);
2559 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2560 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2561 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2562 EXPECT_TRUE(ec_enabled);
2563 EXPECT_TRUE(ec_metrics_enabled);
2564 EXPECT_FALSE(cng_enabled);
2565 EXPECT_TRUE(agc_enabled);
2566 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2567 EXPECT_TRUE(ns_enabled);
2568 EXPECT_TRUE(highpass_filter_enabled);
2569 EXPECT_FALSE(stereo_swapping_enabled);
2570 EXPECT_TRUE(typing_detection_enabled);
2571 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2572 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
Henrik Lundin64dad832015-05-11 12:44:23 +02002573 EXPECT_EQ(50, voe_.GetNetEqCapacity()); // From GetDefaultEngineOptions().
Henrik Lundin5263b3c2015-06-01 10:29:41 +02002574 EXPECT_FALSE(
2575 voe_.GetNetEqFastAccelerate()); // From GetDefaultEngineOptions().
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002576
2577 // Turn echo cancellation off
2578 options.echo_cancellation.Set(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002579 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002580 voe_.GetEcStatus(ec_enabled, ec_mode);
2581 EXPECT_FALSE(ec_enabled);
2582
2583 // Turn echo cancellation back on, with settings, and make sure
2584 // nothing else changed.
2585 options.echo_cancellation.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002586 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002587 voe_.GetEcStatus(ec_enabled, ec_mode);
2588 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2589 voe_.GetAecmMode(aecm_mode, cng_enabled);
2590 voe_.GetAgcStatus(agc_enabled, agc_mode);
2591 voe_.GetAgcConfig(agc_config);
2592 voe_.GetNsStatus(ns_enabled, ns_mode);
2593 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2594 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2595 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2596 EXPECT_TRUE(ec_enabled);
2597 EXPECT_TRUE(ec_metrics_enabled);
2598 EXPECT_TRUE(agc_enabled);
2599 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2600 EXPECT_TRUE(ns_enabled);
2601 EXPECT_TRUE(highpass_filter_enabled);
2602 EXPECT_FALSE(stereo_swapping_enabled);
2603 EXPECT_TRUE(typing_detection_enabled);
2604 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2605 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2606
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002607 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2608 // control.
2609 options.delay_agnostic_aec.Set(true);
2610 ASSERT_TRUE(engine_.SetOptions(options));
2611 voe_.GetEcStatus(ec_enabled, ec_mode);
2612 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2613 voe_.GetAecmMode(aecm_mode, cng_enabled);
2614 EXPECT_TRUE(ec_enabled);
2615 EXPECT_TRUE(ec_metrics_enabled);
2616 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2617
2618 // Turn off echo cancellation and delay agnostic aec.
2619 options.delay_agnostic_aec.Set(false);
Henrik Lundin441f6342015-06-09 16:03:13 +02002620 options.extended_filter_aec.Set(false);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002621 options.echo_cancellation.Set(false);
2622 ASSERT_TRUE(engine_.SetOptions(options));
2623 voe_.GetEcStatus(ec_enabled, ec_mode);
2624 EXPECT_FALSE(ec_enabled);
2625 // Turning delay agnostic aec back on should also turn on echo cancellation.
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 EXPECT_TRUE(ec_enabled);
2631 EXPECT_TRUE(ec_metrics_enabled);
2632 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2633
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002634 // Turn off AGC
2635 options.auto_gain_control.Set(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002636 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002637 voe_.GetAgcStatus(agc_enabled, agc_mode);
2638 EXPECT_FALSE(agc_enabled);
2639
2640 // Turn AGC back on
2641 options.auto_gain_control.Set(true);
2642 options.adjust_agc_delta.Clear();
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002643 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002644 voe_.GetAgcStatus(agc_enabled, agc_mode);
2645 EXPECT_TRUE(agc_enabled);
2646 voe_.GetAgcConfig(agc_config);
2647 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2648
2649 // Turn off other options (and stereo swapping on).
2650 options.noise_suppression.Set(false);
2651 options.highpass_filter.Set(false);
2652 options.typing_detection.Set(false);
2653 options.stereo_swapping.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002654 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002655 voe_.GetNsStatus(ns_enabled, ns_mode);
2656 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2657 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2658 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2659 EXPECT_FALSE(ns_enabled);
2660 EXPECT_FALSE(highpass_filter_enabled);
2661 EXPECT_FALSE(typing_detection_enabled);
2662 EXPECT_TRUE(stereo_swapping_enabled);
2663
2664 // Turn on "conference mode" to ensure it has no impact.
2665 options.conference_mode.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002666 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002667 voe_.GetEcStatus(ec_enabled, ec_mode);
2668 voe_.GetNsStatus(ns_enabled, ns_mode);
2669 EXPECT_TRUE(ec_enabled);
2670 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2671 EXPECT_FALSE(ns_enabled);
2672 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2673}
2674
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002675TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002676 EXPECT_TRUE(SetupEngine());
2677
2678 bool ec_enabled;
2679 webrtc::EcModes ec_mode;
2680 bool ec_metrics_enabled;
2681 bool agc_enabled;
2682 webrtc::AgcModes agc_mode;
2683 bool ns_enabled;
2684 webrtc::NsModes ns_mode;
2685 bool highpass_filter_enabled;
2686 bool stereo_swapping_enabled;
2687 bool typing_detection_enabled;
2688
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002689 voe_.GetEcStatus(ec_enabled, ec_mode);
2690 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2691 voe_.GetAgcStatus(agc_enabled, agc_mode);
2692 voe_.GetNsStatus(ns_enabled, ns_mode);
2693 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2694 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2695 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2696 EXPECT_TRUE(ec_enabled);
2697 EXPECT_TRUE(agc_enabled);
2698 EXPECT_TRUE(ns_enabled);
2699 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002700 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002701 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002702}
2703
2704TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2705 webrtc::AgcConfig set_config = {0};
2706 set_config.targetLeveldBOv = 3;
2707 set_config.digitalCompressionGaindB = 9;
2708 set_config.limiterEnable = true;
2709 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002710 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002711
2712 webrtc::AgcConfig config = {0};
2713 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2714 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2715 EXPECT_EQ(set_config.digitalCompressionGaindB,
2716 config.digitalCompressionGaindB);
2717 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2718}
2719
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002720TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
2721 EXPECT_TRUE(SetupEngine());
solenberg66f43392015-09-09 01:36:22 -07002722 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2723 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002724 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002725 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2726 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002727 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002728
2729 // Have to add a stream to make SetSend work.
2730 cricket::StreamParams stream1;
2731 stream1.ssrcs.push_back(1);
2732 channel1->AddSendStream(stream1);
2733 cricket::StreamParams stream2;
2734 stream2.ssrcs.push_back(2);
2735 channel2->AddSendStream(stream2);
2736
2737 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002738 cricket::AudioSendParameters parameters_options_all = send_parameters_;
2739 parameters_options_all.options.echo_cancellation.Set(true);
2740 parameters_options_all.options.auto_gain_control.Set(true);
2741 parameters_options_all.options.noise_suppression.Set(true);
2742 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2743 EXPECT_EQ(parameters_options_all.options, channel1->options());
2744 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2745 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002746
2747 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002748 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
2749 parameters_options_no_ns.options.noise_suppression.Set(false);
2750 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2751 cricket::AudioOptions expected_options = parameters_options_all.options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002752 expected_options.echo_cancellation.Set(true);
2753 expected_options.auto_gain_control.Set(true);
2754 expected_options.noise_suppression.Set(false);
solenberg66f43392015-09-09 01:36:22 -07002755 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002756
2757 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002758 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
2759 parameters_options_no_agc.options.auto_gain_control.Set(false);
2760 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002761 expected_options.echo_cancellation.Set(true);
2762 expected_options.auto_gain_control.Set(false);
2763 expected_options.noise_suppression.Set(true);
solenberg66f43392015-09-09 01:36:22 -07002764 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002765
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002766 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002767 bool ec_enabled;
2768 webrtc::EcModes ec_mode;
2769 bool agc_enabled;
2770 webrtc::AgcModes agc_mode;
2771 bool ns_enabled;
2772 webrtc::NsModes ns_mode;
2773 voe_.GetEcStatus(ec_enabled, ec_mode);
2774 voe_.GetAgcStatus(agc_enabled, agc_mode);
2775 voe_.GetNsStatus(ns_enabled, ns_mode);
2776 EXPECT_TRUE(ec_enabled);
2777 EXPECT_TRUE(agc_enabled);
2778 EXPECT_TRUE(ns_enabled);
2779
2780 channel1->SetSend(cricket::SEND_MICROPHONE);
2781 voe_.GetEcStatus(ec_enabled, ec_mode);
2782 voe_.GetAgcStatus(agc_enabled, agc_mode);
2783 voe_.GetNsStatus(ns_enabled, ns_mode);
2784 EXPECT_TRUE(ec_enabled);
2785 EXPECT_TRUE(agc_enabled);
2786 EXPECT_FALSE(ns_enabled);
2787
2788 channel1->SetSend(cricket::SEND_NOTHING);
2789 voe_.GetEcStatus(ec_enabled, ec_mode);
2790 voe_.GetAgcStatus(agc_enabled, agc_mode);
2791 voe_.GetNsStatus(ns_enabled, ns_mode);
2792 EXPECT_TRUE(ec_enabled);
2793 EXPECT_TRUE(agc_enabled);
2794 EXPECT_TRUE(ns_enabled);
2795
2796 channel2->SetSend(cricket::SEND_MICROPHONE);
2797 voe_.GetEcStatus(ec_enabled, ec_mode);
2798 voe_.GetAgcStatus(agc_enabled, agc_mode);
2799 voe_.GetNsStatus(ns_enabled, ns_mode);
2800 EXPECT_TRUE(ec_enabled);
2801 EXPECT_FALSE(agc_enabled);
2802 EXPECT_TRUE(ns_enabled);
2803
2804 channel2->SetSend(cricket::SEND_NOTHING);
2805 voe_.GetEcStatus(ec_enabled, ec_mode);
2806 voe_.GetAgcStatus(agc_enabled, agc_mode);
2807 voe_.GetNsStatus(ns_enabled, ns_mode);
2808 EXPECT_TRUE(ec_enabled);
2809 EXPECT_TRUE(agc_enabled);
2810 EXPECT_TRUE(ns_enabled);
2811
2812 // Make sure settings take effect while we are sending.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002813 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
2814 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2815 send_parameters_;
2816 parameters_options_no_agc_nor_ns.options.auto_gain_control.Set(false);
2817 parameters_options_no_agc_nor_ns.options.noise_suppression.Set(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002818 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002819 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002820 expected_options.echo_cancellation.Set(true);
2821 expected_options.auto_gain_control.Set(false);
2822 expected_options.noise_suppression.Set(false);
solenberg66f43392015-09-09 01:36:22 -07002823 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002824 voe_.GetEcStatus(ec_enabled, ec_mode);
2825 voe_.GetAgcStatus(agc_enabled, agc_mode);
2826 voe_.GetNsStatus(ns_enabled, ns_mode);
2827 EXPECT_TRUE(ec_enabled);
2828 EXPECT_FALSE(agc_enabled);
2829 EXPECT_FALSE(ns_enabled);
2830}
2831
wu@webrtc.orgde305012013-10-31 15:40:38 +00002832// This test verifies DSCP settings are properly applied on voice media channel.
2833TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
2834 EXPECT_TRUE(SetupEngine());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002835 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002836 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002837 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00002838 new cricket::FakeNetworkInterface);
2839 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002840 cricket::AudioSendParameters parameters = send_parameters_;
2841 parameters.options.dscp.Set(true);
2842 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002843 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00002844 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002845 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002846 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002847 parameters.options.dscp.Set(false);
2848 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002849 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00002850}
2851
solenbergd97ec302015-10-07 01:40:33 -07002852// Test that GetReceiveChannelId returns the default channel for the first
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002853// recv stream in 1-1 calls.
solenbergd97ec302015-10-07 01:40:33 -07002854TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelIdIn1To1Calls) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002855 EXPECT_TRUE(SetupEngine());
2856 cricket::WebRtcVoiceMediaChannel* media_channel =
2857 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2858 // Test that GetChannelNum returns the default channel if the SSRC is unknown.
solenberg8fb30c32015-10-13 03:06:58 -07002859 EXPECT_EQ(media_channel->default_send_channel_id(),
solenbergd97ec302015-10-07 01:40:33 -07002860 media_channel->GetReceiveChannelId(0));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002861 cricket::StreamParams stream;
2862 stream.ssrcs.push_back(kSsrc2);
2863 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg8fb30c32015-10-13 03:06:58 -07002864 EXPECT_EQ(media_channel->default_send_channel_id(),
solenbergd97ec302015-10-07 01:40:33 -07002865 media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002866}
2867
solenbergd97ec302015-10-07 01:40:33 -07002868// Test that GetReceiveChannelId doesn't return the default channel for the
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002869// first recv stream in conference calls.
2870TEST_F(WebRtcVoiceEngineTestFake, TestGetChannelNumInConferenceCalls) {
2871 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002872 send_parameters_.options = options_conference_;
2873 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002874 cricket::StreamParams stream;
2875 stream.ssrcs.push_back(kSsrc2);
2876 EXPECT_TRUE(channel_->AddRecvStream(stream));
2877 cricket::WebRtcVoiceMediaChannel* media_channel =
2878 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg8fb30c32015-10-13 03:06:58 -07002879 EXPECT_LT(media_channel->default_send_channel_id(),
solenbergd97ec302015-10-07 01:40:33 -07002880 media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002881}
2882
solenberg4bac9c52015-10-09 02:32:53 -07002883TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002884 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002885 float scale;
2886 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
solenbergbb741b32015-09-07 03:56:38 -07002887 int channel_id = voe_.GetLastChannel();
2888 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002889 EXPECT_DOUBLE_EQ(2, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002890
solenberg4bac9c52015-10-09 02:32:53 -07002891 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002892 cricket::StreamParams stream;
2893 stream.ssrcs.push_back(kSsrc2);
2894 EXPECT_TRUE(channel_->AddRecvStream(stream));
2895
solenberg4bac9c52015-10-09 02:32:53 -07002896 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenbergbb741b32015-09-07 03:56:38 -07002897 channel_id = voe_.GetLastChannel();
2898 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002899 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002900}
2901
pbos8fc7fa72015-07-15 08:02:58 -07002902TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02002903 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07002904 const std::string kSyncLabel = "AvSyncLabel";
2905
2906 EXPECT_TRUE(SetupEngine());
pbos8fc7fa72015-07-15 08:02:58 -07002907 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
2908 sp.sync_label = kSyncLabel;
2909 // Creating two channels to make sure that sync label is set properly for both
2910 // the default voice channel and following ones.
2911 EXPECT_TRUE(channel_->AddRecvStream(sp));
2912 sp.ssrcs[0] += 1;
2913 EXPECT_TRUE(channel_->AddRecvStream(sp));
2914
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002915 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07002916 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002917 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002918 << "SyncGroup should be set based on sync_label";
2919 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002920 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002921 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07002922}
2923
pbos6bb1b6e2015-07-24 07:10:18 -07002924TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002925 // Test that changing the combined_audio_video_bwe option results in the
2926 // expected state changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002927 std::vector<uint32_t> ssrcs;
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002928 ssrcs.push_back(223);
2929 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002930
2931 EXPECT_TRUE(SetupEngine());
2932 cricket::WebRtcVoiceMediaChannel* media_channel =
2933 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02002934 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002935 EXPECT_TRUE(media_channel->AddRecvStream(
2936 cricket::StreamParams::CreateLegacy(ssrc)));
2937 }
2938 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002939
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002940 // Combined BWE should be disabled.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002941 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002942 const auto* s = call_.GetAudioReceiveStream(ssrc);
2943 EXPECT_NE(nullptr, s);
2944 EXPECT_EQ(false, s->GetConfig().combined_audio_video_bwe);
2945 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002946
2947 // Enable combined BWE option - now it should be set up.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002948 send_parameters_.options.combined_audio_video_bwe.Set(true);
2949 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002950 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002951 const auto* s = call_.GetAudioReceiveStream(ssrc);
2952 EXPECT_NE(nullptr, s);
2953 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
2954 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002955
2956 // Disable combined BWE option - should be disabled again.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002957 send_parameters_.options.combined_audio_video_bwe.Set(false);
2958 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002959 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002960 const auto* s = call_.GetAudioReceiveStream(ssrc);
2961 EXPECT_NE(nullptr, s);
2962 EXPECT_EQ(false, s->GetConfig().combined_audio_video_bwe);
2963 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002964
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002965 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002966}
2967
pbos6bb1b6e2015-07-24 07:10:18 -07002968TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002969 // Test that adding receive streams after enabling combined bandwidth
2970 // estimation will correctly configure each channel.
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002971 EXPECT_TRUE(SetupEngine());
2972 cricket::WebRtcVoiceMediaChannel* media_channel =
2973 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002974 send_parameters_.options.combined_audio_video_bwe.Set(true);
2975 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002976
Peter Boström0c4e06b2015-10-07 12:23:21 +02002977 static const uint32_t kSsrcs[] = {1, 2, 3, 4};
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002978 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs); ++i) {
2979 EXPECT_TRUE(media_channel->AddRecvStream(
2980 cricket::StreamParams::CreateLegacy(kSsrcs[i])));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002981 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(kSsrcs[i]));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002982 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002983 EXPECT_EQ(ARRAY_SIZE(kSsrcs), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002984}
2985
pbos6bb1b6e2015-07-24 07:10:18 -07002986TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002987 // Test that setting the header extensions results in the expected state
2988 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002989 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002990 ssrcs.push_back(223);
2991 ssrcs.push_back(224);
2992
2993 EXPECT_TRUE(SetupEngine());
2994 cricket::WebRtcVoiceMediaChannel* media_channel =
2995 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002996 send_parameters_.options.combined_audio_video_bwe.Set(true);
2997 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002998 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002999 EXPECT_TRUE(media_channel->AddRecvStream(
3000 cricket::StreamParams::CreateLegacy(ssrc)));
3001 }
3002
3003 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003004 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003005 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003006 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003007 EXPECT_NE(nullptr, s);
3008 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3009 }
3010
3011 // Set up receive extensions.
3012 const auto& e_exts = engine_.rtp_header_extensions();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003013 cricket::AudioRecvParameters recv_parameters;
3014 recv_parameters.extensions = e_exts;
3015 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003016 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003017 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003018 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003019 EXPECT_NE(nullptr, s);
3020 const auto& s_exts = s->GetConfig().rtp.extensions;
3021 EXPECT_EQ(e_exts.size(), s_exts.size());
3022 for (const auto& e_ext : e_exts) {
3023 for (const auto& s_ext : s_exts) {
3024 if (e_ext.id == s_ext.id) {
3025 EXPECT_EQ(e_ext.uri, s_ext.name);
3026 }
3027 }
3028 }
3029 }
3030
3031 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003032 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003033 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003034 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003035 EXPECT_NE(nullptr, s);
3036 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3037 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003038}
3039
3040TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3041 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003042 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003043 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3044 static const unsigned char kRtcp[] = {
3045 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3046 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3047 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3048 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3049 };
3050 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3051
3052 EXPECT_TRUE(SetupEngine());
3053 cricket::WebRtcVoiceMediaChannel* media_channel =
3054 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003055 send_parameters_.options.combined_audio_video_bwe.Set(true);
3056 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003057 EXPECT_TRUE(media_channel->AddRecvStream(
3058 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3059
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003060 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003061 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003062 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003063 EXPECT_EQ(0, s->received_packets());
3064 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3065 EXPECT_EQ(1, s->received_packets());
3066 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3067 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003068}
Minyue2013aec2015-05-13 14:14:42 +02003069
3070// Associate channel should not set on 1:1 call, since the receive channel also
3071// sends RTCP SR.
3072TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelUnset1On1) {
3073 EXPECT_TRUE(SetupEngine());
3074 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3075 int recv_ch = voe_.GetLastChannel();
3076 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3077}
3078
3079// This test is an extension of AssociateChannelUnset1On1. We create two receive
3080// channels. The second should be associated with the default channel, since it
3081// does not send RTCP SR.
3082TEST_F(WebRtcVoiceEngineTestFake, AssociateDefaultChannelOnSecondRecvChannel) {
3083 EXPECT_TRUE(SetupEngine());
solenberg8fb30c32015-10-13 03:06:58 -07003084 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003085 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3086 int recv_ch_1 = voe_.GetLastChannel();
3087 EXPECT_EQ(recv_ch_1, default_channel);
3088 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
3089 int recv_ch_2 = voe_.GetLastChannel();
3090 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_1), -1);
3091 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_2), default_channel);
3092 // Add send stream, the association remains.
3093 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(3)));
3094 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_1), -1);
3095 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch_2), default_channel);
3096}
3097
3098// In conference mode, all receive channels should be associated with the
3099// default channel, since they do not send RTCP SR.
3100TEST_F(WebRtcVoiceEngineTestFake, AssociateDefaultChannelOnConference) {
3101 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003102 send_parameters_.options = options_conference_;
3103 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003104 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003105 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3106 int recv_ch = voe_.GetLastChannel();
3107 EXPECT_NE(recv_ch, default_channel);
3108 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3109 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3110 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3111}
3112
3113TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
3114 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003115 send_parameters_.options = options_conference_;
3116 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003117
3118 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3119 int recv_ch = voe_.GetLastChannel();
3120
3121 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3122 int send_ch = voe_.GetLastChannel();
3123
3124 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3125 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3126 // channel of |recv_ch|.This is not a common case, since, normally, only the
3127 // default channel can be associated. However, the default is not deletable.
3128 // So we force the |recv_ch| to associate with a non-default channel.
3129 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3130 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3131
3132 EXPECT_TRUE(channel_->RemoveSendStream(2));
3133 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3134}
stefan658910c2015-09-03 05:48:32 -07003135
3136// Tests for the actual WebRtc VoE library.
3137
3138TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
3139 cricket::WebRtcVoiceEngine engine;
3140 cricket::AudioOptions options = engine.GetOptions();
3141 // The default options should have at least a few things set. We purposefully
3142 // don't check the option values here, though.
3143 EXPECT_TRUE(options.echo_cancellation.IsSet());
3144 EXPECT_TRUE(options.auto_gain_control.IsSet());
3145 EXPECT_TRUE(options.noise_suppression.IsSet());
3146}
3147
3148// Tests that the library initializes and shuts down properly.
3149TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3150 cricket::WebRtcVoiceEngine engine;
3151 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003152 rtc::scoped_ptr<webrtc::Call> call(
3153 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003154 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003155 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003156 EXPECT_TRUE(channel != nullptr);
3157 delete channel;
3158 engine.Terminate();
3159
3160 // Reinit to catch regression where VoiceEngineObserver reference is lost
3161 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3162 engine.Terminate();
3163}
3164
3165// Tests that the library is configured with the codecs we want.
3166TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
3167 cricket::WebRtcVoiceEngine engine;
3168 // Check codecs by name.
3169 EXPECT_TRUE(engine.FindCodec(
3170 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0)));
3171 EXPECT_TRUE(engine.FindCodec(
3172 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0)));
3173 EXPECT_TRUE(engine.FindCodec(
3174 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0)));
3175 // Check that name matching is case-insensitive.
3176 EXPECT_TRUE(engine.FindCodec(
3177 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0)));
3178 EXPECT_TRUE(engine.FindCodec(
3179 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0)));
3180 EXPECT_TRUE(engine.FindCodec(
3181 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0)));
3182 EXPECT_TRUE(engine.FindCodec(
3183 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0)));
3184 EXPECT_TRUE(engine.FindCodec(
3185 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0)));
3186 EXPECT_TRUE(engine.FindCodec(
3187 cricket::AudioCodec(96, "red", 8000, 0, 1, 0)));
3188 EXPECT_TRUE(engine.FindCodec(
3189 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0)));
3190 EXPECT_TRUE(engine.FindCodec(
3191 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0)));
3192 EXPECT_TRUE(engine.FindCodec(
3193 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0)));
3194 EXPECT_TRUE(engine.FindCodec(
3195 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0)));
3196 // Check codecs with an id by id.
3197 EXPECT_TRUE(engine.FindCodec(
3198 cricket::AudioCodec(0, "", 8000, 0, 1, 0))); // PCMU
3199 EXPECT_TRUE(engine.FindCodec(
3200 cricket::AudioCodec(8, "", 8000, 0, 1, 0))); // PCMA
3201 EXPECT_TRUE(engine.FindCodec(
3202 cricket::AudioCodec(9, "", 8000, 0, 1, 0))); // G722
3203 EXPECT_TRUE(engine.FindCodec(
3204 cricket::AudioCodec(13, "", 8000, 0, 1, 0))); // CN
3205 // Check sample/bitrate matching.
3206 EXPECT_TRUE(engine.FindCodec(
3207 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0)));
3208 // Check that bad codecs fail.
3209 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0)));
3210 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(88, "", 0, 0, 1, 0)));
3211 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 0, 2, 0)));
3212 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 5000, 0, 1, 0)));
3213 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 5000, 1, 0)));
3214 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3215 for (std::vector<cricket::AudioCodec>::const_iterator it =
3216 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3217 if (it->name == "CN" && it->clockrate == 16000) {
3218 EXPECT_EQ(105, it->id);
3219 } else if (it->name == "CN" && it->clockrate == 32000) {
3220 EXPECT_EQ(106, it->id);
3221 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3222 EXPECT_EQ(103, it->id);
3223 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3224 EXPECT_EQ(104, it->id);
3225 } else if (it->name == "G722" && it->clockrate == 8000) {
3226 EXPECT_EQ(9, it->id);
3227 } else if (it->name == "telephone-event") {
3228 EXPECT_EQ(126, it->id);
3229 } else if (it->name == "red") {
3230 EXPECT_EQ(127, it->id);
3231 } else if (it->name == "opus") {
3232 EXPECT_EQ(111, it->id);
3233 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3234 EXPECT_EQ("10", it->params.find("minptime")->second);
3235 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3236 EXPECT_EQ("60", it->params.find("maxptime")->second);
3237 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3238 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3239 }
3240 }
3241
3242 engine.Terminate();
3243}
3244
3245// Tests that VoE supports at least 32 channels
3246TEST(WebRtcVoiceEngineTest, Has32Channels) {
3247 cricket::WebRtcVoiceEngine engine;
3248 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003249 rtc::scoped_ptr<webrtc::Call> call(
3250 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003251
3252 cricket::VoiceMediaChannel* channels[32];
3253 int num_channels = 0;
stefan658910c2015-09-03 05:48:32 -07003254 while (num_channels < ARRAY_SIZE(channels)) {
3255 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003256 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003257 if (!channel)
3258 break;
stefan658910c2015-09-03 05:48:32 -07003259 channels[num_channels++] = channel;
3260 }
3261
3262 int expected = ARRAY_SIZE(channels);
3263 EXPECT_EQ(expected, num_channels);
3264
3265 while (num_channels > 0) {
3266 delete channels[--num_channels];
3267 }
3268
3269 engine.Terminate();
3270}
3271
3272// Test that we set our preferred codecs properly.
3273TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3274 cricket::WebRtcVoiceEngine engine;
3275 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003276 rtc::scoped_ptr<webrtc::Call> call(
3277 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003278 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3279 call.get());
3280 cricket::AudioRecvParameters parameters;
3281 parameters.codecs = engine.codecs();
3282 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003283}