blob: b0fc2bb8d7b4c4c8a0316c5dfcfc1bd5c0e797a7 [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
solenberg43e83d42015-10-20 06:41:01 -070041// Tests for the WebRtcVoiceEngine/VoiceChannel code.
42
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000043using cricket::kRtpAudioLevelHeaderExtension;
44using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
45
solenberg43e83d42015-10-20 06:41:01 -070046static const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
47static const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
48static const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
49static const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
50static const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
51static 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};
solenberg43e83d42015-10-20 06:41:01 -070060static 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
solenberg43e83d42015-10-20 06:41:01 -070071 engine, // neteq
henrike@webrtc.org28e20752013-07-10 00:45:36 +000072 engine, // network
73 engine, // rtp
solenberg43e83d42015-10-20 06:41:01 -070074 engine, // sync
henrike@webrtc.org28e20752013-07-10 00:45:36 +000075 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_adjust_agc_.adjust_agc_delta.Set(-10);
101 }
solenberg1ac56142015-10-13 03:58:19 -0700102 bool SetupEngine() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000103 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000104 return false;
105 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200106 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200107 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000108 }
solenberg1ac56142015-10-13 03:58:19 -0700109 bool SetupEngineWithRecvStream() {
110 if (!SetupEngine()) {
111 return false;
112 }
113 return channel_->AddRecvStream(
114 cricket::StreamParams::CreateLegacy(kSsrc1));
115 }
116 bool SetupEngineWithSendStream() {
117 if (!SetupEngine()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000118 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000119 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000120 return channel_->AddSendStream(
121 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000122 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000123 void SetupForMultiSendStream() {
solenberg1ac56142015-10-13 03:58:19 -0700124 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000125 // Remove stream added in Setup, which is corresponding to default channel.
126 int default_channel_num = voe_.GetLastChannel();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200127 uint32_t default_send_ssrc = 0u;
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000128 EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
129 EXPECT_EQ(kSsrc1, default_send_ssrc);
130 EXPECT_TRUE(channel_->RemoveSendStream(default_send_ssrc));
131
132 // Verify the default channel still exists.
133 EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
134 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000135 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200136 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000137 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000138 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200139 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000140 delete channel_;
141 engine_.Terminate();
142 }
143
Peter Boström0c4e06b2015-10-07 12:23:21 +0200144 void TestInsertDtmf(uint32_t ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000145 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200146 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200147 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000148 if (caller) {
149 // if this is a caller, local description will be applied and add the
150 // send stream.
151 EXPECT_TRUE(channel_->AddSendStream(
152 cricket::StreamParams::CreateLegacy(kSsrc1)));
153 }
154 int channel_id = voe_.GetLastChannel();
155
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000156 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200157 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000158 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
159 EXPECT_FALSE(channel_->CanInsertDtmf());
160 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111, cricket::DF_SEND));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200161 send_parameters_.codecs.push_back(kTelephoneEventCodec);
162 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000163 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000164
165 if (!caller) {
166 // There's no active send channel yet.
167 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
168 EXPECT_TRUE(channel_->AddSendStream(
169 cricket::StreamParams::CreateLegacy(kSsrc1)));
170 }
171
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000172 // Check we fail if the ssrc is invalid.
173 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111, cricket::DF_SEND));
174
175 // Test send
176 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
177 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
178 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
179
180 // Test play
181 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(3, 134));
182 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 3, 134, cricket::DF_PLAY));
183 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(3, 134));
184
185 // Test send and play
186 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
187 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(4, 145));
188 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 4, 145,
189 cricket::DF_PLAY | cricket::DF_SEND));
190 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
191 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(4, 145));
192 }
193
194 // Test that send bandwidth is set correctly.
195 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000196 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
197 // |expected_result| is the expected result from SetMaxSendBandwidth().
198 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000199 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000200 int max_bitrate,
201 bool expected_result,
202 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200203 cricket::AudioSendParameters parameters;
204 parameters.codecs.push_back(codec);
205 parameters.max_bandwidth_bps = max_bitrate;
206 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
207
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000208 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000209 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000210 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000211 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000212 }
213
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000214 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700215 EXPECT_TRUE(SetupEngine());
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000216 int channel_num = voe_.GetLastChannel();
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000217
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000218 // Ensure extensions are off by default.
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
221 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200222 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000223 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200224 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000225 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000226
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000227 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200228 send_parameters_.extensions.clear();
229 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000230 EXPECT_EQ(-1, 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.
233 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200234 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
235 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000236 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000237
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000238 // Ensure extension is set properly on new channel.
239 // The first stream to occupy the default channel.
240 EXPECT_TRUE(channel_->AddSendStream(
241 cricket::StreamParams::CreateLegacy(123)));
242 EXPECT_TRUE(channel_->AddSendStream(
243 cricket::StreamParams::CreateLegacy(234)));
244 int new_channel_num = voe_.GetLastChannel();
245 EXPECT_NE(channel_num, new_channel_num);
246 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000247
248 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200249 send_parameters_.codecs.push_back(kPcmuCodec);
250 send_parameters_.extensions.clear();
251 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000252 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
253 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000254 }
255
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000256 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700257 EXPECT_TRUE(SetupEngineWithRecvStream());
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000258 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000259
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000260 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000261 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000262
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200263 cricket::AudioRecvParameters parameters;
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000264 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200265 parameters.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000266 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200267 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000268 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000269
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000270 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200271 parameters.extensions.clear();
272 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000273 EXPECT_EQ(-1, 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.
276 const int id = 2;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200277 parameters.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
278 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000279 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000280
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000281 // Ensure extension is set properly on new channel.
282 // The first stream to occupy the default channel.
283 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700284 cricket::StreamParams::CreateLegacy(kSsrc2)));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000285 int new_channel_num = voe_.GetLastChannel();
286 EXPECT_NE(channel_num, new_channel_num);
287 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
288
289 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200290 parameters.extensions.clear();
291 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000292 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
293 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000294 }
295
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000296 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200297 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000298 cricket::FakeWebRtcVoiceEngine voe_;
wu@webrtc.org97077a32013-10-25 21:18:33 +0000299 FakeVoETraceWrapper* trace_wrapper_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000300 cricket::WebRtcVoiceEngine engine_;
301 cricket::VoiceMediaChannel* channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000302
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200303 cricket::AudioSendParameters send_parameters_;
304 cricket::AudioRecvParameters recv_parameters_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000305 cricket::AudioOptions options_adjust_agc_;
306};
307
308// Tests that our stub library "works".
309TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
310 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000311 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000312 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000313 engine_.Terminate();
314 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000315}
316
317// Tests that we can create and destroy a channel.
318TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000319 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200320 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200321 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000322}
323
324// Tests that we properly handle failures in CreateChannel.
325TEST_F(WebRtcVoiceEngineTestFake, CreateChannelFail) {
326 voe_.set_fail_create_channel(true);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000327 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200328 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200329 EXPECT_TRUE(channel_ == nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000330}
331
332// Tests that the list of supported codecs is created properly and ordered
333// correctly
334TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
335 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
336 ASSERT_FALSE(codecs.empty());
337 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
338 EXPECT_EQ(48000, codecs[0].clockrate);
339 EXPECT_EQ(2, codecs[0].channels);
340 EXPECT_EQ(64000, codecs[0].bitrate);
341 int pref = codecs[0].preference;
342 for (size_t i = 1; i < codecs.size(); ++i) {
343 EXPECT_GT(pref, codecs[i].preference);
344 pref = codecs[i].preference;
345 }
346}
347
348// Tests that we can find codecs by name or id, and that we interpret the
349// clockrate and bitrate fields properly.
350TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
351 cricket::AudioCodec codec;
352 webrtc::CodecInst codec_inst;
353 // Find PCMU with explicit clockrate and bitrate.
354 EXPECT_TRUE(engine_.FindWebRtcCodec(kPcmuCodec, &codec_inst));
355 // Find ISAC with explicit clockrate and 0 bitrate.
356 EXPECT_TRUE(engine_.FindWebRtcCodec(kIsacCodec, &codec_inst));
357 // Find telephone-event with explicit clockrate and 0 bitrate.
358 EXPECT_TRUE(engine_.FindWebRtcCodec(kTelephoneEventCodec, &codec_inst));
359 // Find ISAC with a different payload id.
360 codec = kIsacCodec;
361 codec.id = 127;
362 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
363 EXPECT_EQ(codec.id, codec_inst.pltype);
364 // Find PCMU with a 0 clockrate.
365 codec = kPcmuCodec;
366 codec.clockrate = 0;
367 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
368 EXPECT_EQ(codec.id, codec_inst.pltype);
369 EXPECT_EQ(8000, codec_inst.plfreq);
370 // Find PCMU with a 0 bitrate.
371 codec = kPcmuCodec;
372 codec.bitrate = 0;
373 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
374 EXPECT_EQ(codec.id, codec_inst.pltype);
375 EXPECT_EQ(64000, codec_inst.rate);
376 // Find ISAC with an explicit bitrate.
377 codec = kIsacCodec;
378 codec.bitrate = 32000;
379 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
380 EXPECT_EQ(codec.id, codec_inst.pltype);
381 EXPECT_EQ(32000, codec_inst.rate);
382}
383
384// Test that we set our inbound codecs properly, including changing PT.
385TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
386 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200387 cricket::AudioRecvParameters parameters;
388 parameters.codecs.push_back(kIsacCodec);
389 parameters.codecs.push_back(kPcmuCodec);
390 parameters.codecs.push_back(kTelephoneEventCodec);
391 parameters.codecs[0].id = 106; // collide with existing telephone-event
392 parameters.codecs[2].id = 126;
393 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700394 EXPECT_TRUE(channel_->AddRecvStream(
395 cricket::StreamParams::CreateLegacy(kSsrc1)));
396 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000397 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000398 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000399 gcodec.plfreq = 16000;
400 gcodec.channels = 1;
401 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
402 EXPECT_EQ(106, gcodec.pltype);
403 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000404 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000405 "telephone-event");
406 gcodec.plfreq = 8000;
407 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
408 EXPECT_EQ(126, gcodec.pltype);
409 EXPECT_STREQ("telephone-event", gcodec.plname);
410}
411
412// Test that we fail to set an unknown inbound codec.
413TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
414 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200415 cricket::AudioRecvParameters parameters;
416 parameters.codecs.push_back(kIsacCodec);
417 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
418 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000419}
420
421// Test that we fail if we have duplicate types in the inbound list.
422TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
423 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200424 cricket::AudioRecvParameters parameters;
425 parameters.codecs.push_back(kIsacCodec);
426 parameters.codecs.push_back(kCn16000Codec);
427 parameters.codecs[1].id = kIsacCodec.id;
428 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000429}
430
431// Test that we can decode OPUS without stereo parameters.
432TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
433 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200434 cricket::AudioRecvParameters parameters;
435 parameters.codecs.push_back(kIsacCodec);
436 parameters.codecs.push_back(kPcmuCodec);
437 parameters.codecs.push_back(kOpusCodec);
438 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000439 EXPECT_TRUE(channel_->AddRecvStream(
440 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700441 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000442 webrtc::CodecInst opus;
443 engine_.FindWebRtcCodec(kOpusCodec, &opus);
444 // Even without stereo parameters, recv codecs still specify channels = 2.
445 EXPECT_EQ(2, opus.channels);
446 EXPECT_EQ(111, opus.pltype);
447 EXPECT_STREQ("opus", opus.plname);
448 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700449 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000450 EXPECT_EQ(111, opus.pltype);
451}
452
453// Test that we can decode OPUS with stereo = 0.
454TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
455 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200456 cricket::AudioRecvParameters parameters;
457 parameters.codecs.push_back(kIsacCodec);
458 parameters.codecs.push_back(kPcmuCodec);
459 parameters.codecs.push_back(kOpusCodec);
460 parameters.codecs[2].params["stereo"] = "0";
461 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000462 EXPECT_TRUE(channel_->AddRecvStream(
463 cricket::StreamParams::CreateLegacy(kSsrc1)));
464 int channel_num2 = voe_.GetLastChannel();
465 webrtc::CodecInst opus;
466 engine_.FindWebRtcCodec(kOpusCodec, &opus);
467 // Even when stereo is off, recv codecs still specify channels = 2.
468 EXPECT_EQ(2, opus.channels);
469 EXPECT_EQ(111, opus.pltype);
470 EXPECT_STREQ("opus", opus.plname);
471 opus.pltype = 0;
472 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
473 EXPECT_EQ(111, opus.pltype);
474}
475
476// Test that we can decode OPUS with stereo = 1.
477TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
478 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200479 cricket::AudioRecvParameters parameters;
480 parameters.codecs.push_back(kIsacCodec);
481 parameters.codecs.push_back(kPcmuCodec);
482 parameters.codecs.push_back(kOpusCodec);
483 parameters.codecs[2].params["stereo"] = "1";
484 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000485 EXPECT_TRUE(channel_->AddRecvStream(
486 cricket::StreamParams::CreateLegacy(kSsrc1)));
487 int channel_num2 = voe_.GetLastChannel();
488 webrtc::CodecInst opus;
489 engine_.FindWebRtcCodec(kOpusCodec, &opus);
490 EXPECT_EQ(2, opus.channels);
491 EXPECT_EQ(111, opus.pltype);
492 EXPECT_STREQ("opus", opus.plname);
493 opus.pltype = 0;
494 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
495 EXPECT_EQ(111, opus.pltype);
496}
497
498// Test that changes to recv codecs are applied to all streams.
499TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
500 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200501 cricket::AudioRecvParameters parameters;
502 parameters.codecs.push_back(kIsacCodec);
503 parameters.codecs.push_back(kPcmuCodec);
504 parameters.codecs.push_back(kTelephoneEventCodec);
505 parameters.codecs[0].id = 106; // collide with existing telephone-event
506 parameters.codecs[2].id = 126;
507 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000508 EXPECT_TRUE(channel_->AddRecvStream(
509 cricket::StreamParams::CreateLegacy(kSsrc1)));
510 int channel_num2 = voe_.GetLastChannel();
511 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000512 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000513 gcodec.plfreq = 16000;
514 gcodec.channels = 1;
515 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
516 EXPECT_EQ(106, gcodec.pltype);
517 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000518 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000519 "telephone-event");
520 gcodec.plfreq = 8000;
521 gcodec.channels = 1;
522 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
523 EXPECT_EQ(126, gcodec.pltype);
524 EXPECT_STREQ("telephone-event", gcodec.plname);
525}
526
527TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenberg1ac56142015-10-13 03:58:19 -0700528 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200529 cricket::AudioRecvParameters parameters;
530 parameters.codecs.push_back(kIsacCodec);
531 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200532 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000533
534 int channel_num2 = voe_.GetLastChannel();
535 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000536 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000537 gcodec.plfreq = 16000;
538 gcodec.channels = 1;
539 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
540 EXPECT_EQ(106, gcodec.pltype);
541 EXPECT_STREQ("ISAC", gcodec.plname);
542}
543
544// Test that we can apply the same set of codecs again while playing.
545TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700546 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200547 cricket::AudioRecvParameters parameters;
548 parameters.codecs.push_back(kIsacCodec);
549 parameters.codecs.push_back(kCn16000Codec);
550 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000551 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200552 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000553
554 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200555 parameters.codecs[0].id = 127;
556 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
557 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000558 EXPECT_TRUE(voe_.GetPlayout(channel_num));
559}
560
561// Test that we can add a codec while playing.
562TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700563 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200564 cricket::AudioRecvParameters parameters;
565 parameters.codecs.push_back(kIsacCodec);
566 parameters.codecs.push_back(kCn16000Codec);
567 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000568 EXPECT_TRUE(channel_->SetPlayout(true));
569
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200570 parameters.codecs.push_back(kOpusCodec);
571 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
572 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000573 EXPECT_TRUE(voe_.GetPlayout(channel_num));
574 webrtc::CodecInst gcodec;
575 EXPECT_TRUE(engine_.FindWebRtcCodec(kOpusCodec, &gcodec));
576 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
577}
578
579TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenberg1ac56142015-10-13 03:58:19 -0700580 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000581
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000582 // Test that when autobw is enabled, bitrate is kept as the default
583 // value. autobw is enabled for the following tests because the target
584 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000585
586 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000587 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000588
589 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000590 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000591
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000592 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000593 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000594}
595
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000596TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700597 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000598
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000599 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000600
601 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000602 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
603 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000604
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000605 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000606 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
607 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000608}
609
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000610TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700611 EXPECT_TRUE(SetupEngineWithSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000612
613 // Test that we can only set a maximum bitrate for a fixed-rate codec
614 // if it's bigger than the fixed rate.
615
616 // PCMU, fixed bitrate == 64000.
617 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
618 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
619 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
620 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
621 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
622 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
623 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
624}
625
626TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -0700627 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200628 const int kDesiredBitrate = 128000;
629 cricket::AudioSendParameters parameters;
630 parameters.codecs = engine_.codecs();
631 parameters.max_bandwidth_bps = kDesiredBitrate;
632 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000633
634 EXPECT_TRUE(channel_->AddSendStream(
635 cricket::StreamParams::CreateLegacy(kSsrc1)));
636
637 int channel_num = voe_.GetLastChannel();
638 webrtc::CodecInst codec;
639 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200640 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000641}
642
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000643// Test that bitrate cannot be set for CBR codecs.
644// Bitrate is ignored if it is higher than the fixed bitrate.
645// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000646TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenberg1ac56142015-10-13 03:58:19 -0700647 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648
649 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200650 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
651 int channel_num = voe_.GetLastChannel();
652 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000653 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
654 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200655
656 send_parameters_.max_bandwidth_bps = 128000;
657 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000658 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
659 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200660
661 send_parameters_.max_bandwidth_bps = 128;
662 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000663 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
664 EXPECT_EQ(64000, codec.rate);
665}
666
667// Test that we apply codecs properly.
668TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenberg1ac56142015-10-13 03:58:19 -0700669 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200670 cricket::AudioSendParameters parameters;
671 parameters.codecs.push_back(kIsacCodec);
672 parameters.codecs.push_back(kPcmuCodec);
673 parameters.codecs.push_back(kRedCodec);
674 parameters.codecs[0].id = 96;
675 parameters.codecs[0].bitrate = 48000;
676 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000677 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200678 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000679 webrtc::CodecInst gcodec;
680 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
681 EXPECT_EQ(96, gcodec.pltype);
682 EXPECT_EQ(48000, gcodec.rate);
683 EXPECT_STREQ("ISAC", gcodec.plname);
684 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000685 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000686 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
687 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
688 EXPECT_EQ(106, voe_.GetSendTelephoneEventPayloadType(channel_num));
689}
690
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000691// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
692// to apply.
693TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenberg1ac56142015-10-13 03:58:19 -0700694 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200695 cricket::AudioSendParameters parameters;
696 parameters.codecs.push_back(kIsacCodec);
697 parameters.codecs.push_back(kPcmuCodec);
698 parameters.codecs.push_back(kRedCodec);
699 parameters.codecs[0].id = 96;
700 parameters.codecs[0].bitrate = 48000;
701 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000702 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
703 // Calling SetSendCodec again with same codec which is already set.
704 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200705 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000706 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
707}
708
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000709// Verify that G722 is set with 16000 samples per second to WebRTC.
710TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenberg1ac56142015-10-13 03:58:19 -0700711 EXPECT_TRUE(SetupEngineWithSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000712 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200713 cricket::AudioSendParameters parameters;
714 parameters.codecs.push_back(kG722CodecSdp);
715 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000716 webrtc::CodecInst gcodec;
717 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
718 EXPECT_STREQ("G722", gcodec.plname);
719 EXPECT_EQ(1, gcodec.channels);
720 EXPECT_EQ(16000, gcodec.plfreq);
721}
722
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000723// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000724TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenberg1ac56142015-10-13 03:58:19 -0700725 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200726 cricket::AudioSendParameters parameters;
727 parameters.codecs.push_back(kOpusCodec);
728 parameters.codecs[0].bitrate = 0;
729 parameters.codecs[0].clockrate = 50000;
730 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000731}
732
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000733// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000734TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700735 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200736 cricket::AudioSendParameters parameters;
737 parameters.codecs.push_back(kOpusCodec);
738 parameters.codecs[0].bitrate = 0;
739 parameters.codecs[0].channels = 0;
740 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000741}
742
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000743// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000744TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700745 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200746 cricket::AudioSendParameters parameters;
747 parameters.codecs.push_back(kOpusCodec);
748 parameters.codecs[0].bitrate = 0;
749 parameters.codecs[0].channels = 0;
750 parameters.codecs[0].params["stereo"] = "1";
751 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000752}
753
754// Test that if channel is 1 for opus and there's no stereo, we fail.
755TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700756 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200757 cricket::AudioSendParameters parameters;
758 parameters.codecs.push_back(kOpusCodec);
759 parameters.codecs[0].bitrate = 0;
760 parameters.codecs[0].channels = 1;
761 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000762}
763
764// Test that if channel is 1 for opus and stereo=0, we fail.
765TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700766 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200767 cricket::AudioSendParameters parameters;
768 parameters.codecs.push_back(kOpusCodec);
769 parameters.codecs[0].bitrate = 0;
770 parameters.codecs[0].channels = 1;
771 parameters.codecs[0].params["stereo"] = "0";
772 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000773}
774
775// Test that if channel is 1 for opus and stereo=1, we fail.
776TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700777 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200778 cricket::AudioSendParameters parameters;
779 parameters.codecs.push_back(kOpusCodec);
780 parameters.codecs[0].bitrate = 0;
781 parameters.codecs[0].channels = 1;
782 parameters.codecs[0].params["stereo"] = "1";
783 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000784}
785
786// Test that with bitrate=0 and no stereo,
787// channels and bitrate are 1 and 32000.
788TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700789 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000790 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200791 cricket::AudioSendParameters parameters;
792 parameters.codecs.push_back(kOpusCodec);
793 parameters.codecs[0].bitrate = 0;
794 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000795 webrtc::CodecInst gcodec;
796 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
797 EXPECT_STREQ("opus", gcodec.plname);
798 EXPECT_EQ(1, gcodec.channels);
799 EXPECT_EQ(32000, gcodec.rate);
800}
801
802// Test that with bitrate=0 and stereo=0,
803// channels and bitrate are 1 and 32000.
804TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700805 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000806 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200807 cricket::AudioSendParameters parameters;
808 parameters.codecs.push_back(kOpusCodec);
809 parameters.codecs[0].bitrate = 0;
810 parameters.codecs[0].params["stereo"] = "0";
811 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000812 webrtc::CodecInst gcodec;
813 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
814 EXPECT_STREQ("opus", gcodec.plname);
815 EXPECT_EQ(1, gcodec.channels);
816 EXPECT_EQ(32000, gcodec.rate);
817}
818
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000819// Test that with bitrate=invalid and stereo=0,
820// channels and bitrate are 1 and 32000.
821TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700822 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000823 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200824 cricket::AudioSendParameters parameters;
825 parameters.codecs.push_back(kOpusCodec);
826 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000827 webrtc::CodecInst gcodec;
828
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000829 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200830 parameters.codecs[0].bitrate = 5999;
831 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000832 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
833 EXPECT_STREQ("opus", gcodec.plname);
834 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000835 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000836
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200837 parameters.codecs[0].bitrate = 510001;
838 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000839 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
840 EXPECT_STREQ("opus", gcodec.plname);
841 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000842 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000843}
844
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000845// Test that with bitrate=0 and stereo=1,
846// channels and bitrate are 2 and 64000.
847TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700848 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000849 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200850 cricket::AudioSendParameters parameters;
851 parameters.codecs.push_back(kOpusCodec);
852 parameters.codecs[0].bitrate = 0;
853 parameters.codecs[0].params["stereo"] = "1";
854 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000855 webrtc::CodecInst gcodec;
856 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
857 EXPECT_STREQ("opus", gcodec.plname);
858 EXPECT_EQ(2, gcodec.channels);
859 EXPECT_EQ(64000, gcodec.rate);
860}
861
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000862// Test that with bitrate=invalid and stereo=1,
863// channels and bitrate are 2 and 64000.
864TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700865 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000866 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200867 cricket::AudioSendParameters parameters;
868 parameters.codecs.push_back(kOpusCodec);
869 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000870 webrtc::CodecInst gcodec;
871
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000872 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200873 parameters.codecs[0].bitrate = 5999;
874 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000875 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
876 EXPECT_STREQ("opus", gcodec.plname);
877 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000878 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000879
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200880 parameters.codecs[0].bitrate = 510001;
881 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000882 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
883 EXPECT_STREQ("opus", gcodec.plname);
884 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000885 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000886}
887
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000888// Test that with bitrate=N and stereo unset,
889// channels and bitrate are 1 and N.
890TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700891 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000892 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200893 cricket::AudioSendParameters parameters;
894 parameters.codecs.push_back(kOpusCodec);
895 parameters.codecs[0].bitrate = 96000;
896 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000897 webrtc::CodecInst gcodec;
898 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
899 EXPECT_EQ(111, gcodec.pltype);
900 EXPECT_EQ(96000, gcodec.rate);
901 EXPECT_STREQ("opus", gcodec.plname);
902 EXPECT_EQ(1, gcodec.channels);
903 EXPECT_EQ(48000, gcodec.plfreq);
904}
905
906// Test that with bitrate=N and stereo=0,
907// channels and bitrate are 1 and N.
908TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700909 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000910 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200911 cricket::AudioSendParameters parameters;
912 parameters.codecs.push_back(kOpusCodec);
913 parameters.codecs[0].bitrate = 30000;
914 parameters.codecs[0].params["stereo"] = "0";
915 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000916 webrtc::CodecInst gcodec;
917 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
918 EXPECT_EQ(1, gcodec.channels);
919 EXPECT_EQ(30000, gcodec.rate);
920 EXPECT_STREQ("opus", gcodec.plname);
921}
922
923// Test that with bitrate=N and without any parameters,
924// channels and bitrate are 1 and N.
925TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenberg1ac56142015-10-13 03:58:19 -0700926 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000927 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200928 cricket::AudioSendParameters parameters;
929 parameters.codecs.push_back(kOpusCodec);
930 parameters.codecs[0].bitrate = 30000;
931 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000932 webrtc::CodecInst gcodec;
933 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
934 EXPECT_EQ(1, gcodec.channels);
935 EXPECT_EQ(30000, gcodec.rate);
936 EXPECT_STREQ("opus", gcodec.plname);
937}
938
939// Test that with bitrate=N and stereo=1,
940// channels and bitrate are 2 and N.
941TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700942 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000943 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200944 cricket::AudioSendParameters parameters;
945 parameters.codecs.push_back(kOpusCodec);
946 parameters.codecs[0].bitrate = 30000;
947 parameters.codecs[0].params["stereo"] = "1";
948 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000949 webrtc::CodecInst gcodec;
950 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
951 EXPECT_EQ(2, gcodec.channels);
952 EXPECT_EQ(30000, gcodec.rate);
953 EXPECT_STREQ("opus", gcodec.plname);
954}
955
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000956// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
957// Also test that the "maxaveragebitrate" can't be set to values outside the
958// range of 6000 and 510000
959TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenberg1ac56142015-10-13 03:58:19 -0700960 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000961 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200962 cricket::AudioSendParameters parameters;
963 parameters.codecs.push_back(kOpusCodec);
964 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000965 webrtc::CodecInst gcodec;
966
967 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200968 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
969 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000970 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000971 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000972
973 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200974 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
975 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000976 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000977 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000978
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200979 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
980 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000981 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
982 EXPECT_EQ(200000, gcodec.rate);
983}
984
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000985// Test that we can enable NACK with opus as caller.
986TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700987 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000988 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200989 cricket::AudioSendParameters parameters;
990 parameters.codecs.push_back(kOpusCodec);
991 parameters.codecs[0].AddFeedbackParam(
992 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
993 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000994 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200995 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000996 EXPECT_TRUE(voe_.GetNACK(channel_num));
997}
998
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000999// Test that we can enable NACK with opus as callee.
1000TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -07001001 EXPECT_TRUE(SetupEngine());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001002 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001003 cricket::AudioSendParameters parameters;
1004 parameters.codecs.push_back(kOpusCodec);
1005 parameters.codecs[0].AddFeedbackParam(
1006 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1007 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001008 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001009 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001010 EXPECT_FALSE(voe_.GetNACK(channel_num));
1011
1012 EXPECT_TRUE(channel_->AddSendStream(
1013 cricket::StreamParams::CreateLegacy(kSsrc1)));
1014 EXPECT_TRUE(voe_.GetNACK(channel_num));
1015}
1016
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001017// Test that we can enable NACK on receive streams.
1018TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001019 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001020 int channel_num1 = voe_.GetLastChannel();
1021 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1022 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001023 cricket::AudioSendParameters parameters;
1024 parameters.codecs.push_back(kOpusCodec);
1025 parameters.codecs[0].AddFeedbackParam(
1026 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1027 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001028 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1029 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001030 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001031 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1032 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1033}
1034
1035// Test that we can disable NACK.
1036TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001037 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001038 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001039 cricket::AudioSendParameters parameters;
1040 parameters.codecs.push_back(kOpusCodec);
1041 parameters.codecs[0].AddFeedbackParam(
1042 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1043 cricket::kParamValueEmpty));
1044 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001045 EXPECT_TRUE(voe_.GetNACK(channel_num));
1046
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001047 parameters.codecs.clear();
1048 parameters.codecs.push_back(kOpusCodec);
1049 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001050 EXPECT_FALSE(voe_.GetNACK(channel_num));
1051}
1052
1053// Test that we can disable NACK on receive streams.
1054TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001055 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001056 int channel_num1 = voe_.GetLastChannel();
1057 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1058 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001059 cricket::AudioSendParameters parameters;
1060 parameters.codecs.push_back(kOpusCodec);
1061 parameters.codecs[0].AddFeedbackParam(
1062 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1063 cricket::kParamValueEmpty));
1064 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001065 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1066 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1067
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001068 parameters.codecs.clear();
1069 parameters.codecs.push_back(kOpusCodec);
1070 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001071 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1072 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1073}
1074
1075// Test that NACK is enabled on a new receive stream.
1076TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001077 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001078 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001079 cricket::AudioSendParameters parameters;
1080 parameters.codecs.push_back(kIsacCodec);
1081 parameters.codecs.push_back(kCn16000Codec);
1082 parameters.codecs[0].AddFeedbackParam(
1083 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1084 cricket::kParamValueEmpty));
1085 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001086 EXPECT_TRUE(voe_.GetNACK(channel_num));
1087
1088 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1089 channel_num = voe_.GetLastChannel();
1090 EXPECT_TRUE(voe_.GetNACK(channel_num));
1091 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1092 channel_num = voe_.GetLastChannel();
1093 EXPECT_TRUE(voe_.GetNACK(channel_num));
1094}
1095
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001096// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001097TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenberg1ac56142015-10-13 03:58:19 -07001098 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001099 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001100 cricket::AudioSendParameters parameters;
1101 parameters.codecs.push_back(kOpusCodec);
1102 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001103 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1104}
1105
1106// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001107TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001108 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001109 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001110 cricket::AudioSendParameters parameters;
1111 parameters.codecs.push_back(kOpusCodec);
1112 parameters.codecs[0].bitrate = 0;
1113 parameters.codecs[0].params["useinbandfec"] = "0";
1114 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001115 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1116 webrtc::CodecInst gcodec;
1117 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1118 EXPECT_STREQ("opus", gcodec.plname);
1119 EXPECT_EQ(1, gcodec.channels);
1120 EXPECT_EQ(32000, gcodec.rate);
1121}
1122
1123// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001124TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001125 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001126 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001127 cricket::AudioSendParameters parameters;
1128 parameters.codecs.push_back(kOpusCodec);
1129 parameters.codecs[0].bitrate = 0;
1130 parameters.codecs[0].params["useinbandfec"] = "1";
1131 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001132 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1133 webrtc::CodecInst gcodec;
1134 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1135 EXPECT_STREQ("opus", gcodec.plname);
1136 EXPECT_EQ(1, gcodec.channels);
1137 EXPECT_EQ(32000, gcodec.rate);
1138}
1139
1140// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001141TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001142 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001143 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001144 cricket::AudioSendParameters parameters;
1145 parameters.codecs.push_back(kOpusCodec);
1146 parameters.codecs[0].bitrate = 0;
1147 parameters.codecs[0].params["stereo"] = "1";
1148 parameters.codecs[0].params["useinbandfec"] = "1";
1149 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001150 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1151 webrtc::CodecInst gcodec;
1152 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1153 EXPECT_STREQ("opus", gcodec.plname);
1154 EXPECT_EQ(2, gcodec.channels);
1155 EXPECT_EQ(64000, gcodec.rate);
1156}
1157
1158// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001159TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001160 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001161 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001162 cricket::AudioSendParameters parameters;
1163 parameters.codecs.push_back(kIsacCodec);
1164 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001165 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1166}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001167
1168// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1169TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001170 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001171 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001172 cricket::AudioSendParameters parameters;
1173 parameters.codecs.push_back(kIsacCodec);
1174 parameters.codecs[0].params["useinbandfec"] = "1";
1175 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001176 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1177}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001178
1179// Test that Opus FEC status can be changed.
1180TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenberg1ac56142015-10-13 03:58:19 -07001181 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001182 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001183 cricket::AudioSendParameters parameters;
1184 parameters.codecs.push_back(kOpusCodec);
1185 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001186 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001187 parameters.codecs[0].params["useinbandfec"] = "1";
1188 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001189 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1190}
1191
1192// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1193TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenberg1ac56142015-10-13 03:58:19 -07001194 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001195 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001196 cricket::AudioSendParameters parameters;
1197 parameters.codecs.push_back(kOpusCodec);
1198 parameters.codecs[0].bitrate = 0;
1199 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1200 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001201 EXPECT_EQ(cricket::kOpusBandwidthNb,
1202 voe_.GetMaxEncodingBandwidth(channel_num));
1203 webrtc::CodecInst gcodec;
1204 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1205 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001206
1207 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001208 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1209 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001210 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1211 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001212}
1213
1214// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1215TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenberg1ac56142015-10-13 03:58:19 -07001216 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001217 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001218 cricket::AudioSendParameters parameters;
1219 parameters.codecs.push_back(kOpusCodec);
1220 parameters.codecs[0].bitrate = 0;
1221 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1222 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001223 EXPECT_EQ(cricket::kOpusBandwidthMb,
1224 voe_.GetMaxEncodingBandwidth(channel_num));
1225 webrtc::CodecInst gcodec;
1226 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1227 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001228
1229 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001230 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1231 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001232 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1233 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001234}
1235
1236// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1237TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenberg1ac56142015-10-13 03:58:19 -07001238 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001239 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001240 cricket::AudioSendParameters parameters;
1241 parameters.codecs.push_back(kOpusCodec);
1242 parameters.codecs[0].bitrate = 0;
1243 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1244 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001245 EXPECT_EQ(cricket::kOpusBandwidthWb,
1246 voe_.GetMaxEncodingBandwidth(channel_num));
1247 webrtc::CodecInst gcodec;
1248 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1249 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001250
1251 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001252 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1253 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001254 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1255 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001256}
1257
1258// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1259TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenberg1ac56142015-10-13 03:58:19 -07001260 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001261 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001262 cricket::AudioSendParameters parameters;
1263 parameters.codecs.push_back(kOpusCodec);
1264 parameters.codecs[0].bitrate = 0;
1265 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1266 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001267 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1268 voe_.GetMaxEncodingBandwidth(channel_num));
1269 webrtc::CodecInst gcodec;
1270 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1271 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001272
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001273 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001274 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1275 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001276 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1277 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001278}
1279
1280// Test 24000 < maxplaybackrate triggers Opus full band mode.
1281TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenberg1ac56142015-10-13 03:58:19 -07001282 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001283 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001284 cricket::AudioSendParameters parameters;
1285 parameters.codecs.push_back(kOpusCodec);
1286 parameters.codecs[0].bitrate = 0;
1287 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1288 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001289 EXPECT_EQ(cricket::kOpusBandwidthFb,
1290 voe_.GetMaxEncodingBandwidth(channel_num));
1291 webrtc::CodecInst gcodec;
1292 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1293 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001294
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001295 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001296 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1297 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001298 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1299 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001300}
1301
1302// Test Opus that without maxplaybackrate, default playback rate is used.
1303TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001304 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001305 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001306 cricket::AudioSendParameters parameters;
1307 parameters.codecs.push_back(kOpusCodec);
1308 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001309 EXPECT_EQ(cricket::kOpusBandwidthFb,
1310 voe_.GetMaxEncodingBandwidth(channel_num));
1311}
1312
1313// Test the with non-Opus, maxplaybackrate has no effect.
1314TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001315 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001316 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001317 cricket::AudioSendParameters parameters;
1318 parameters.codecs.push_back(kIsacCodec);
1319 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1320 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001321 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1322}
1323
1324// Test maxplaybackrate can be set on two streams.
1325TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001326 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001327 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001328 cricket::AudioSendParameters parameters;
1329 parameters.codecs.push_back(kOpusCodec);
1330 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001331 // Default bandwidth is 24000.
1332 EXPECT_EQ(cricket::kOpusBandwidthFb,
1333 voe_.GetMaxEncodingBandwidth(channel_num));
1334
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001335 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001336
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001337 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001338 EXPECT_EQ(cricket::kOpusBandwidthNb,
1339 voe_.GetMaxEncodingBandwidth(channel_num));
1340
1341 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1342 channel_num = voe_.GetLastChannel();
1343 EXPECT_EQ(cricket::kOpusBandwidthNb,
1344 voe_.GetMaxEncodingBandwidth(channel_num));
1345}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001346
Minyue Li7100dcd2015-03-27 05:05:59 +01001347// Test that with usedtx=0, Opus DTX is off.
1348TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001349 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001350 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001351 cricket::AudioSendParameters parameters;
1352 parameters.codecs.push_back(kOpusCodec);
1353 parameters.codecs[0].params["usedtx"] = "0";
1354 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001355 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1356}
1357
1358// Test that with usedtx=1, Opus DTX is on.
1359TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001360 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001361 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001362 cricket::AudioSendParameters parameters;
1363 parameters.codecs.push_back(kOpusCodec);
1364 parameters.codecs[0].params["usedtx"] = "1";
1365 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001366 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1367 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1368}
1369
1370// Test that usedtx=1 works with stereo Opus.
1371TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001372 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001373 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001374 cricket::AudioSendParameters parameters;
1375 parameters.codecs.push_back(kOpusCodec);
1376 parameters.codecs[0].params["usedtx"] = "1";
1377 parameters.codecs[0].params["stereo"] = "1";
1378 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001379 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1380 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1381}
1382
1383// Test that usedtx=1 does not work with non Opus.
1384TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001385 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001386 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001387 cricket::AudioSendParameters parameters;
1388 parameters.codecs.push_back(kIsacCodec);
1389 parameters.codecs[0].params["usedtx"] = "1";
1390 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001391 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1392}
1393
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001394// Test that we can switch back and forth between Opus and ISAC with CN.
1395TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenberg1ac56142015-10-13 03:58:19 -07001396 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001397 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001398 cricket::AudioSendParameters opus_parameters;
1399 opus_parameters.codecs.push_back(kOpusCodec);
1400 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001401 webrtc::CodecInst gcodec;
1402 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001403 EXPECT_EQ(111, gcodec.pltype);
1404 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001405
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001406 cricket::AudioSendParameters isac_parameters;
1407 isac_parameters.codecs.push_back(kIsacCodec);
1408 isac_parameters.codecs.push_back(kCn16000Codec);
1409 isac_parameters.codecs.push_back(kOpusCodec);
1410 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001411 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1412 EXPECT_EQ(103, gcodec.pltype);
1413 EXPECT_STREQ("ISAC", gcodec.plname);
1414
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001415 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001416 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001417 EXPECT_EQ(111, gcodec.pltype);
1418 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001419}
1420
1421// Test that we handle various ways of specifying bitrate.
1422TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001423 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001424 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001425 cricket::AudioSendParameters parameters;
1426 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1427 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001428 webrtc::CodecInst gcodec;
1429 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1430 EXPECT_EQ(103, gcodec.pltype);
1431 EXPECT_STREQ("ISAC", gcodec.plname);
1432 EXPECT_EQ(32000, gcodec.rate);
1433
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001434 parameters.codecs[0].bitrate = 0; // bitrate == default
1435 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001436 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1437 EXPECT_EQ(103, gcodec.pltype);
1438 EXPECT_STREQ("ISAC", gcodec.plname);
1439 EXPECT_EQ(-1, gcodec.rate);
1440
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001441 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1442 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001443 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1444 EXPECT_EQ(103, gcodec.pltype);
1445 EXPECT_STREQ("ISAC", gcodec.plname);
1446 EXPECT_EQ(28000, gcodec.rate);
1447
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001448 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1449 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001450 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1451 EXPECT_EQ(0, gcodec.pltype);
1452 EXPECT_STREQ("PCMU", gcodec.plname);
1453 EXPECT_EQ(64000, gcodec.rate);
1454
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001455 parameters.codecs[0].bitrate = 0; // bitrate == default
1456 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001457 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1458 EXPECT_EQ(0, gcodec.pltype);
1459 EXPECT_STREQ("PCMU", gcodec.plname);
1460 EXPECT_EQ(64000, gcodec.rate);
1461
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001462 parameters.codecs[0] = kOpusCodec;
1463 parameters.codecs[0].bitrate = 0; // bitrate == default
1464 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001465 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1466 EXPECT_EQ(111, gcodec.pltype);
1467 EXPECT_STREQ("opus", gcodec.plname);
1468 EXPECT_EQ(32000, gcodec.rate);
1469}
1470
Brave Yao5225dd82015-03-26 07:39:19 +08001471// Test that we could set packet size specified in kCodecParamPTime.
1472TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenberg1ac56142015-10-13 03:58:19 -07001473 EXPECT_TRUE(SetupEngineWithSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001474 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001475 cricket::AudioSendParameters parameters;
1476 parameters.codecs.push_back(kOpusCodec);
1477 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1478 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001479 webrtc::CodecInst gcodec;
1480 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1481 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1482
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001483 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1484 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001485 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1486 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1487
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001488 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1489 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001490 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1491 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1492
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001493 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1494 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1495 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001496 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1497 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1498
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001499 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1500 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1501 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001502 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1503 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1504}
1505
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001506// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001507TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenberg1ac56142015-10-13 03:58:19 -07001508 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001509 cricket::AudioSendParameters parameters;
1510 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001511}
1512
1513// Test that we can set send codecs even with telephone-event codec as the first
1514// one on the list.
1515TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001516 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001517 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001518 cricket::AudioSendParameters parameters;
1519 parameters.codecs.push_back(kTelephoneEventCodec);
1520 parameters.codecs.push_back(kIsacCodec);
1521 parameters.codecs.push_back(kPcmuCodec);
1522 parameters.codecs[0].id = 98; // DTMF
1523 parameters.codecs[1].id = 96;
1524 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001525 webrtc::CodecInst gcodec;
1526 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001527 EXPECT_EQ(96, gcodec.pltype);
1528 EXPECT_STREQ("ISAC", gcodec.plname);
1529 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1530}
1531
1532// Test that we can set send codecs even with CN codec as the first
1533// one on the list.
1534TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001535 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001536 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001537 cricket::AudioSendParameters parameters;
1538 parameters.codecs.push_back(kCn16000Codec);
1539 parameters.codecs.push_back(kIsacCodec);
1540 parameters.codecs.push_back(kPcmuCodec);
1541 parameters.codecs[0].id = 98; // wideband CN
1542 parameters.codecs[1].id = 96;
1543 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001544 webrtc::CodecInst gcodec;
1545 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1546 EXPECT_EQ(96, gcodec.pltype);
1547 EXPECT_STREQ("ISAC", gcodec.plname);
1548 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001549}
1550
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001551// Test that we set VAD and DTMF types correctly as caller.
1552TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001553 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001554 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001555 cricket::AudioSendParameters parameters;
1556 parameters.codecs.push_back(kIsacCodec);
1557 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001558 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001559 parameters.codecs.push_back(kCn16000Codec);
1560 parameters.codecs.push_back(kCn8000Codec);
1561 parameters.codecs.push_back(kTelephoneEventCodec);
1562 parameters.codecs.push_back(kRedCodec);
1563 parameters.codecs[0].id = 96;
1564 parameters.codecs[2].id = 97; // wideband CN
1565 parameters.codecs[4].id = 98; // DTMF
1566 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001567 webrtc::CodecInst gcodec;
1568 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1569 EXPECT_EQ(96, gcodec.pltype);
1570 EXPECT_STREQ("ISAC", gcodec.plname);
1571 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001572 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001573 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1574 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1575 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1576}
1577
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001578// Test that we set VAD and DTMF types correctly as callee.
1579TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001580 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001581 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001582 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001583
1584 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001585 cricket::AudioSendParameters parameters;
1586 parameters.codecs.push_back(kIsacCodec);
1587 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001588 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001589 parameters.codecs.push_back(kCn16000Codec);
1590 parameters.codecs.push_back(kCn8000Codec);
1591 parameters.codecs.push_back(kTelephoneEventCodec);
1592 parameters.codecs.push_back(kRedCodec);
1593 parameters.codecs[0].id = 96;
1594 parameters.codecs[2].id = 97; // wideband CN
1595 parameters.codecs[4].id = 98; // DTMF
1596 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001597 EXPECT_TRUE(channel_->AddSendStream(
1598 cricket::StreamParams::CreateLegacy(kSsrc1)));
1599
1600 webrtc::CodecInst gcodec;
1601 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1602 EXPECT_EQ(96, gcodec.pltype);
1603 EXPECT_STREQ("ISAC", gcodec.plname);
1604 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001605 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001606 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1607 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1608 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1609}
1610
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001611// Test that we only apply VAD if we have a CN codec that matches the
1612// send codec clockrate.
1613TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenberg1ac56142015-10-13 03:58:19 -07001614 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001615 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001616 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001617 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001618 parameters.codecs.push_back(kIsacCodec);
1619 parameters.codecs.push_back(kCn16000Codec);
1620 parameters.codecs[1].id = 97;
1621 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001622 webrtc::CodecInst gcodec;
1623 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1624 EXPECT_STREQ("ISAC", gcodec.plname);
1625 EXPECT_TRUE(voe_.GetVAD(channel_num));
1626 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1627 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001628 parameters.codecs[0] = kPcmuCodec;
1629 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001630 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1631 EXPECT_STREQ("PCMU", gcodec.plname);
1632 EXPECT_FALSE(voe_.GetVAD(channel_num));
1633 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001634 parameters.codecs[1] = kCn8000Codec;
1635 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001636 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1637 EXPECT_STREQ("PCMU", gcodec.plname);
1638 EXPECT_TRUE(voe_.GetVAD(channel_num));
1639 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001640 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001641 parameters.codecs[0] = kIsacCodec;
1642 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001643 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1644 EXPECT_STREQ("ISAC", gcodec.plname);
1645 EXPECT_FALSE(voe_.GetVAD(channel_num));
1646}
1647
1648// Test that we perform case-insensitive matching of codec names.
1649TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenberg1ac56142015-10-13 03:58:19 -07001650 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001651 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001652 cricket::AudioSendParameters parameters;
1653 parameters.codecs.push_back(kIsacCodec);
1654 parameters.codecs.push_back(kPcmuCodec);
1655 parameters.codecs.push_back(kCn16000Codec);
1656 parameters.codecs.push_back(kCn8000Codec);
1657 parameters.codecs.push_back(kTelephoneEventCodec);
1658 parameters.codecs.push_back(kRedCodec);
1659 parameters.codecs[0].name = "iSaC";
1660 parameters.codecs[0].id = 96;
1661 parameters.codecs[2].id = 97; // wideband CN
1662 parameters.codecs[4].id = 98; // DTMF
1663 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001664 webrtc::CodecInst gcodec;
1665 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1666 EXPECT_EQ(96, gcodec.pltype);
1667 EXPECT_STREQ("ISAC", gcodec.plname);
1668 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001669 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001670 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1671 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1672 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1673}
1674
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001675// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001676TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001677 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001678 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001679 cricket::AudioSendParameters parameters;
1680 parameters.codecs.push_back(kRedCodec);
1681 parameters.codecs.push_back(kIsacCodec);
1682 parameters.codecs.push_back(kPcmuCodec);
1683 parameters.codecs[0].id = 127;
1684 parameters.codecs[0].params[""] = "96/96";
1685 parameters.codecs[1].id = 96;
1686 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001687 webrtc::CodecInst gcodec;
1688 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1689 EXPECT_EQ(96, gcodec.pltype);
1690 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001691 EXPECT_TRUE(voe_.GetRED(channel_num));
1692 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001693}
1694
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001695// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001696TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001697 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001698 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001699 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001700
1701 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001702 cricket::AudioSendParameters parameters;
1703 parameters.codecs.push_back(kRedCodec);
1704 parameters.codecs.push_back(kIsacCodec);
1705 parameters.codecs.push_back(kPcmuCodec);
1706 parameters.codecs[0].id = 127;
1707 parameters.codecs[0].params[""] = "96/96";
1708 parameters.codecs[1].id = 96;
1709 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001710 EXPECT_TRUE(channel_->AddSendStream(
1711 cricket::StreamParams::CreateLegacy(kSsrc1)));
1712 webrtc::CodecInst gcodec;
1713 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1714 EXPECT_EQ(96, gcodec.pltype);
1715 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001716 EXPECT_TRUE(voe_.GetRED(channel_num));
1717 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001718}
1719
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001720// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001721TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenberg1ac56142015-10-13 03:58:19 -07001722 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001723 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001724 cricket::AudioSendParameters parameters;
1725 parameters.codecs.push_back(kRedCodec);
1726 parameters.codecs.push_back(kIsacCodec);
1727 parameters.codecs.push_back(kPcmuCodec);
1728 parameters.codecs[0].id = 127;
1729 parameters.codecs[1].id = 96;
1730 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001731 webrtc::CodecInst gcodec;
1732 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1733 EXPECT_EQ(96, gcodec.pltype);
1734 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001735 EXPECT_TRUE(voe_.GetRED(channel_num));
1736 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001737}
1738
1739// Test that we ignore RED if the parameters aren't named the way we expect.
1740TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001741 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001742 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001743 cricket::AudioSendParameters parameters;
1744 parameters.codecs.push_back(kRedCodec);
1745 parameters.codecs.push_back(kIsacCodec);
1746 parameters.codecs.push_back(kPcmuCodec);
1747 parameters.codecs[0].id = 127;
1748 parameters.codecs[0].params["ABC"] = "96/96";
1749 parameters.codecs[1].id = 96;
1750 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001751 webrtc::CodecInst gcodec;
1752 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1753 EXPECT_EQ(96, gcodec.pltype);
1754 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001755 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001756}
1757
1758// Test that we ignore RED if it uses different primary/secondary encoding.
1759TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001760 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001761 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001762 cricket::AudioSendParameters parameters;
1763 parameters.codecs.push_back(kRedCodec);
1764 parameters.codecs.push_back(kIsacCodec);
1765 parameters.codecs.push_back(kPcmuCodec);
1766 parameters.codecs[0].id = 127;
1767 parameters.codecs[0].params[""] = "96/0";
1768 parameters.codecs[1].id = 96;
1769 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001770 webrtc::CodecInst gcodec;
1771 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1772 EXPECT_EQ(96, gcodec.pltype);
1773 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001774 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001775}
1776
1777// Test that we ignore RED if it uses more than 2 encodings.
1778TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001779 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001780 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001781 cricket::AudioSendParameters parameters;
1782 parameters.codecs.push_back(kRedCodec);
1783 parameters.codecs.push_back(kIsacCodec);
1784 parameters.codecs.push_back(kPcmuCodec);
1785 parameters.codecs[0].id = 127;
1786 parameters.codecs[0].params[""] = "96/96/96";
1787 parameters.codecs[1].id = 96;
1788 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001789 webrtc::CodecInst gcodec;
1790 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1791 EXPECT_EQ(96, gcodec.pltype);
1792 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001793 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001794}
1795
1796// Test that we ignore RED if it has bogus codec ids.
1797TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001798 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001799 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001800 cricket::AudioSendParameters parameters;
1801 parameters.codecs.push_back(kRedCodec);
1802 parameters.codecs.push_back(kIsacCodec);
1803 parameters.codecs.push_back(kPcmuCodec);
1804 parameters.codecs[0].id = 127;
1805 parameters.codecs[0].params[""] = "ABC/ABC";
1806 parameters.codecs[1].id = 96;
1807 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001808 webrtc::CodecInst gcodec;
1809 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1810 EXPECT_EQ(96, gcodec.pltype);
1811 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001812 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001813}
1814
1815// Test that we ignore RED if it refers to a codec that is not present.
1816TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001817 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001818 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001819 cricket::AudioSendParameters parameters;
1820 parameters.codecs.push_back(kRedCodec);
1821 parameters.codecs.push_back(kIsacCodec);
1822 parameters.codecs.push_back(kPcmuCodec);
1823 parameters.codecs[0].id = 127;
1824 parameters.codecs[0].params[""] = "97/97";
1825 parameters.codecs[1].id = 96;
1826 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001827 webrtc::CodecInst gcodec;
1828 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1829 EXPECT_EQ(96, gcodec.pltype);
1830 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001831 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001832}
1833
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001834// Test support for audio level header extension.
1835TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1836 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001837}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001838TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1839 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1840}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001841
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001842// Test support for absolute send time header extension.
1843TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1844 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1845}
1846TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1847 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001848}
1849
solenberg1ac56142015-10-13 03:58:19 -07001850// Test that we can create a channel and start sending on it.
1851TEST_F(WebRtcVoiceEngineTestFake, Send) {
1852 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001853 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001854 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001855 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1856 EXPECT_TRUE(voe_.GetSend(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001857 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1858 EXPECT_FALSE(voe_.GetSend(channel_num));
solenberg1ac56142015-10-13 03:58:19 -07001859}
1860
1861// Test that we can create a channel and start playing out on it.
1862TEST_F(WebRtcVoiceEngineTestFake, Playout) {
1863 EXPECT_TRUE(SetupEngineWithRecvStream());
1864 int channel_num = voe_.GetLastChannel();
1865 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
1866 EXPECT_TRUE(channel_->SetPlayout(true));
1867 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001868 EXPECT_TRUE(channel_->SetPlayout(false));
1869 EXPECT_FALSE(voe_.GetPlayout(channel_num));
1870}
1871
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001872// Test that we can add and remove send streams.
1873TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
1874 SetupForMultiSendStream();
1875
Peter Boström0c4e06b2015-10-07 12:23:21 +02001876 static const uint32_t kSsrcs4[] = {1, 2, 3, 4};
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001877
1878 // Set the global state for sending.
1879 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1880
1881 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1882 EXPECT_TRUE(channel_->AddSendStream(
1883 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1884
1885 // Verify that we are in a sending state for all the created streams.
1886 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1887 EXPECT_TRUE(voe_.GetSend(channel_num));
1888 }
1889
1890 // Remove the first send channel, which is the default channel. It will only
1891 // recycle the default channel but not delete it.
1892 EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[0]));
1893 // Stream should already be Removed from the send stream list.
1894 EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[0]));
1895 // But the default still exists.
1896 EXPECT_EQ(0, voe_.GetChannelFromLocalSsrc(kSsrcs4[0]));
1897
1898 // Delete the rest of send channel streams.
1899 for (unsigned int i = 1; i < ARRAY_SIZE(kSsrcs4); ++i) {
1900 EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[i]));
1901 // Stream should already be deleted.
1902 EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[i]));
1903 EXPECT_EQ(-1, voe_.GetChannelFromLocalSsrc(kSsrcs4[i]));
1904 }
1905}
1906
1907// Test SetSendCodecs correctly configure the codecs in all send streams.
1908TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
1909 SetupForMultiSendStream();
1910
Peter Boström0c4e06b2015-10-07 12:23:21 +02001911 static const uint32_t kSsrcs4[] = {1, 2, 3, 4};
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001912 // Create send streams.
1913 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1914 EXPECT_TRUE(channel_->AddSendStream(
1915 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1916 }
1917
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001918 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001919 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001920 parameters.codecs.push_back(kIsacCodec);
1921 parameters.codecs.push_back(kCn16000Codec);
1922 parameters.codecs[1].id = 97;
1923 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001924
1925 // Verify ISAC and VAD are corrected configured on all send channels.
1926 webrtc::CodecInst gcodec;
1927 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1928 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1929 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1930 EXPECT_STREQ("ISAC", gcodec.plname);
1931 EXPECT_TRUE(voe_.GetVAD(channel_num));
1932 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1933 }
1934
1935 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001936 parameters.codecs[0] = kPcmuCodec;
1937 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001938 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1939 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1940 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1941 EXPECT_STREQ("PCMU", gcodec.plname);
1942 EXPECT_FALSE(voe_.GetVAD(channel_num));
1943 }
1944}
1945
1946// Test we can SetSend on all send streams correctly.
1947TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
1948 SetupForMultiSendStream();
1949
Peter Boström0c4e06b2015-10-07 12:23:21 +02001950 static const uint32_t kSsrcs4[] = {1, 2, 3, 4};
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001951 // Create the send channels and they should be a SEND_NOTHING date.
1952 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1953 EXPECT_TRUE(channel_->AddSendStream(
1954 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1955 int channel_num = voe_.GetLastChannel();
1956 EXPECT_FALSE(voe_.GetSend(channel_num));
1957 }
1958
1959 // Set the global state for starting sending.
1960 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1961 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1962 // Verify that we are in a sending state for all the send streams.
1963 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1964 EXPECT_TRUE(voe_.GetSend(channel_num));
1965 }
1966
1967 // Set the global state for stopping sending.
1968 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1969 for (unsigned int i = 1; i < ARRAY_SIZE(kSsrcs4); ++i) {
1970 // Verify that we are in a stop state for all the send streams.
1971 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1972 EXPECT_FALSE(voe_.GetSend(channel_num));
1973 }
1974}
1975
1976// Test we can set the correct statistics on all send streams.
1977TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
1978 SetupForMultiSendStream();
1979
Peter Boström0c4e06b2015-10-07 12:23:21 +02001980 static const uint32_t kSsrcs4[] = {1, 2, 3, 4};
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001981 // Create send streams.
1982 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1983 EXPECT_TRUE(channel_->AddSendStream(
1984 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1985 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00001986 // Create a receive stream to check that none of the send streams end up in
1987 // the receive stream stats.
1988 EXPECT_TRUE(channel_->AddRecvStream(
1989 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001990 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001991 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
1992 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001993
1994 cricket::VoiceMediaInfo info;
1995 EXPECT_EQ(true, channel_->GetStats(&info));
1996 EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size());
1997
1998 // Verify the statistic information is correct.
1999 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +00002000 EXPECT_EQ(kSsrcs4[i], info.senders[i].ssrc());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002001 EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
2002 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].bytes_sent);
2003 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_sent);
2004 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_lost);
2005 EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[i].fraction_lost);
2006 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].ext_seqnum);
2007 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].rtt_ms);
2008 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].jitter_ms);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002009 EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002010 }
solenberg43e83d42015-10-20 06:41:01 -07002011 EXPECT_EQ(0u, info.receivers.size());
solenberg1ac56142015-10-13 03:58:19 -07002012
solenberg43e83d42015-10-20 06:41:01 -07002013 // Registered stream's remote SSRC is kSsrc2. Send a packet with SSRC=1.
2014 // We should drop the packet and no stats should be available.
2015 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002016 EXPECT_EQ(true, channel_->GetStats(&info));
solenberg1ac56142015-10-13 03:58:19 -07002017 EXPECT_EQ(0u, info.receivers.size());
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002018
solenberg43e83d42015-10-20 06:41:01 -07002019 // Remove the kSsrc2 stream and deliver a new packet - a default receive
2020 // stream should be created and we should see stats.
2021 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07002022 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2023 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002024 EXPECT_EQ(1u, info.receivers.size());
solenberg43e83d42015-10-20 06:41:01 -07002025
2026 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd);
2027 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd);
2028 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost);
2029 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum);
2030 EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name);
2031 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentExpandRate) /
2032 (1 << 14), info.receivers[0].expand_rate);
2033 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSpeechExpandRate) /
2034 (1 << 14), info.receivers[0].speech_expand_rate);
2035 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSecondaryDecodedRate) /
2036 (1 << 14), info.receivers[0].secondary_decoded_rate);
2037 EXPECT_EQ(
2038 static_cast<float>(cricket::kNetStats.currentAccelerateRate) / (1 << 14),
2039 info.receivers[0].accelerate_rate);
2040 EXPECT_EQ(
2041 static_cast<float>(cricket::kNetStats.currentPreemptiveRate) / (1 << 14),
2042 info.receivers[0].preemptive_expand_rate);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002043}
2044
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002045// Test that we can add and remove receive streams, and do proper send/playout.
2046// We can receive on multiple streams while sending one stream.
2047TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002048 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002049 int channel_num1 = voe_.GetLastChannel();
2050
solenberg1ac56142015-10-13 03:58:19 -07002051 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002052 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002053 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002054 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002055
solenberg1ac56142015-10-13 03:58:19 -07002056 // Adding another stream should enable playout on the new stream only.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002057 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2058 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002059 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2060 EXPECT_TRUE(voe_.GetSend(channel_num1));
2061 EXPECT_FALSE(voe_.GetSend(channel_num2));
2062
solenberg1ac56142015-10-13 03:58:19 -07002063 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002064 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2065 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2066
2067 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2068 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2069 int channel_num3 = voe_.GetLastChannel();
2070 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2071 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2072 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2073 EXPECT_FALSE(voe_.GetSend(channel_num3));
2074
2075 // Stop sending.
2076 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2077 EXPECT_FALSE(voe_.GetSend(channel_num1));
2078 EXPECT_FALSE(voe_.GetSend(channel_num2));
2079 EXPECT_FALSE(voe_.GetSend(channel_num3));
2080
2081 // Stop playout.
2082 EXPECT_TRUE(channel_->SetPlayout(false));
2083 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2084 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2085 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2086
solenberg1ac56142015-10-13 03:58:19 -07002087 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002088 EXPECT_TRUE(channel_->SetPlayout(true));
2089 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2090 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2091 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2092
solenberg1ac56142015-10-13 03:58:19 -07002093 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002094 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2095 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002096 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002097}
2098
2099// Test that we can set the devices to use.
2100TEST_F(WebRtcVoiceEngineTestFake, SetDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002101 EXPECT_TRUE(SetupEngineWithSendStream());
2102 int send_channel = voe_.GetLastChannel();
2103 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2104 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002105 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002106
2107 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2108 cricket::kFakeDefaultDeviceId);
2109 cricket::Device dev(cricket::kFakeDeviceName,
2110 cricket::kFakeDeviceId);
2111
2112 // Test SetDevices() while not sending or playing.
2113 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2114
2115 // Test SetDevices() while sending and playing.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002116 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2117 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002118 EXPECT_TRUE(voe_.GetSend(send_channel));
2119 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002120
2121 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2122
solenberg1ac56142015-10-13 03:58:19 -07002123 EXPECT_TRUE(voe_.GetSend(send_channel));
2124 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002125
2126 // Test that failure to open newly selected devices does not prevent opening
2127 // ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002128 voe_.set_playout_fail_channel(recv_channel);
2129 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002130
2131 EXPECT_FALSE(engine_.SetDevices(&default_dev, &default_dev));
2132
solenberg1ac56142015-10-13 03:58:19 -07002133 EXPECT_FALSE(voe_.GetSend(send_channel));
2134 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002135
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002136 voe_.set_playout_fail_channel(-1);
2137 voe_.set_send_fail_channel(-1);
2138
2139 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2140
solenberg1ac56142015-10-13 03:58:19 -07002141 EXPECT_TRUE(voe_.GetSend(send_channel));
2142 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002143}
2144
2145// Test that we can set the devices to use even if we failed to
2146// open the initial ones.
2147TEST_F(WebRtcVoiceEngineTestFake, SetDevicesWithInitiallyBadDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002148 EXPECT_TRUE(SetupEngineWithSendStream());
2149 int send_channel = voe_.GetLastChannel();
2150 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2151 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002152 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002153
2154 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2155 cricket::kFakeDefaultDeviceId);
2156 cricket::Device dev(cricket::kFakeDeviceName,
2157 cricket::kFakeDeviceId);
2158
2159 // Test that failure to open devices selected before starting
2160 // send/play does not prevent opening newly selected ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002161 voe_.set_playout_fail_channel(recv_channel);
2162 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002163
2164 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2165
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002166 EXPECT_FALSE(channel_->SetSend(cricket::SEND_MICROPHONE));
2167 EXPECT_FALSE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002168 EXPECT_FALSE(voe_.GetSend(send_channel));
2169 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002170
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002171 voe_.set_playout_fail_channel(-1);
2172 voe_.set_send_fail_channel(-1);
2173
2174 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2175
solenberg1ac56142015-10-13 03:58:19 -07002176 EXPECT_TRUE(voe_.GetSend(send_channel));
2177 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002178}
2179
2180// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002181// and start sending on it.
2182TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2183 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002184 int channel_num = voe_.GetLastChannel();
2185 webrtc::AgcConfig agc_config;
2186 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2187 EXPECT_EQ(0, agc_config.targetLeveldBOv);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002188 send_parameters_.options = options_adjust_agc_;
2189 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002190 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2191 EXPECT_TRUE(voe_.GetSend(channel_num));
2192 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2193 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002194 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2195 EXPECT_FALSE(voe_.GetSend(channel_num));
2196 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2197 EXPECT_EQ(0, agc_config.targetLeveldBOv); // level was restored
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002198}
2199
wu@webrtc.org97077a32013-10-25 21:18:33 +00002200TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002201 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002202 webrtc::AgcConfig agc_config;
2203 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2204 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2205
2206 cricket::AudioOptions options;
2207 options.tx_agc_target_dbov.Set(3);
2208 options.tx_agc_digital_compression_gain.Set(9);
2209 options.tx_agc_limiter.Set(true);
2210 options.auto_gain_control.Set(true);
2211 EXPECT_TRUE(engine_.SetOptions(options));
2212
2213 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2214 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2215 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2216 EXPECT_TRUE(agc_config.limiterEnable);
2217
2218 // Check interaction with adjust_agc_delta. Both should be respected, for
2219 // backwards compatibility.
2220 options.adjust_agc_delta.Set(-10);
2221 EXPECT_TRUE(engine_.SetOptions(options));
2222
2223 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2224 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2225}
2226
wu@webrtc.org97077a32013-10-25 21:18:33 +00002227TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002228 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002229 cricket::AudioOptions options;
2230 options.recording_sample_rate.Set(48000u);
2231 options.playout_sample_rate.Set(44100u);
2232 EXPECT_TRUE(engine_.SetOptions(options));
2233
2234 unsigned int recording_sample_rate, playout_sample_rate;
2235 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2236 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2237 EXPECT_EQ(48000u, recording_sample_rate);
2238 EXPECT_EQ(44100u, playout_sample_rate);
2239}
2240
2241TEST_F(WebRtcVoiceEngineTestFake, TraceFilterViaTraceOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002242 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002243 engine_.SetLogging(rtc::LS_INFO, "");
wu@webrtc.org97077a32013-10-25 21:18:33 +00002244 EXPECT_EQ(
2245 // Info:
2246 webrtc::kTraceStateInfo | webrtc::kTraceInfo |
2247 // Warning:
2248 webrtc::kTraceTerseInfo | webrtc::kTraceWarning |
2249 // Error:
2250 webrtc::kTraceError | webrtc::kTraceCritical,
2251 static_cast<int>(trace_wrapper_->filter_));
2252 // Now set it explicitly
2253 std::string filter =
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002254 "tracefilter " + rtc::ToString(webrtc::kTraceDefault);
2255 engine_.SetLogging(rtc::LS_VERBOSE, filter.c_str());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002256 EXPECT_EQ(static_cast<unsigned int>(webrtc::kTraceDefault),
2257 trace_wrapper_->filter_);
2258}
2259
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002260// Test that we can set the outgoing SSRC properly.
2261// SSRC is set in SetupEngine by calling AddSendStream.
2262TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002263 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002264 int channel_num = voe_.GetLastChannel();
2265 unsigned int send_ssrc;
2266 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
2267 EXPECT_NE(0U, send_ssrc);
2268 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
2269 EXPECT_EQ(kSsrc1, send_ssrc);
2270}
2271
2272TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2273 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002274 EXPECT_TRUE(SetupEngineWithSendStream());
2275 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2276 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002277 EXPECT_TRUE(channel_->AddRecvStream(
2278 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002279 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2280 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002281
2282 cricket::VoiceMediaInfo info;
2283 EXPECT_EQ(true, channel_->GetStats(&info));
2284 EXPECT_EQ(1u, info.senders.size());
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +00002285 EXPECT_EQ(kSsrc1, info.senders[0].ssrc());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002286 EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
2287 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].bytes_sent);
2288 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_sent);
2289 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_lost);
2290 EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[0].fraction_lost);
2291 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].ext_seqnum);
2292 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].rtt_ms);
2293 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].jitter_ms);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002294 EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002295 // TODO(sriniv): Add testing for more fields. These are not populated
2296 // in FakeWebrtcVoiceEngine yet.
2297 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].audio_level);
2298 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_median_ms);
2299 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_std_ms);
2300 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_return_loss);
2301 // EXPECT_EQ(cricket::kIntStatValue,
2302 // info.senders[0].echo_return_loss_enhancement);
solenberg43e83d42015-10-20 06:41:01 -07002303 EXPECT_EQ(0u, info.receivers.size());
solenberg1ac56142015-10-13 03:58:19 -07002304
solenberg43e83d42015-10-20 06:41:01 -07002305 // Registered stream's remote SSRC is kSsrc2. Send a packet with SSRC=1.
2306 // We should drop the packet and no stats should be available.
2307 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002308 EXPECT_EQ(true, channel_->GetStats(&info));
2309 EXPECT_EQ(0u, info.receivers.size());
2310
solenberg43e83d42015-10-20 06:41:01 -07002311 // Remove the kSsrc2 stream and deliver a new packet - a default receive
2312 // stream should be created and we should see stats.
2313 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002314 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2315 EXPECT_EQ(true, channel_->GetStats(&info));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002316 EXPECT_EQ(1u, info.receivers.size());
solenberg43e83d42015-10-20 06:41:01 -07002317
2318 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd);
2319 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd);
2320 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost);
2321 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum);
2322 EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name);
2323 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentExpandRate) /
2324 (1 << 14), info.receivers[0].expand_rate);
2325 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSpeechExpandRate) /
2326 (1 << 14), info.receivers[0].speech_expand_rate);
2327 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSecondaryDecodedRate) /
2328 (1 << 14), info.receivers[0].secondary_decoded_rate);
2329 // TODO(sriniv): Add testing for more receiver fields.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002330}
2331
2332// Test that we can set the outgoing SSRC properly with multiple streams.
2333// SSRC is set in SetupEngine by calling AddSendStream.
2334TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002335 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002336 int channel_num1 = voe_.GetLastChannel();
2337 unsigned int send_ssrc;
2338 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num1, send_ssrc));
2339 EXPECT_EQ(kSsrc1, send_ssrc);
2340
2341 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2342 int channel_num2 = voe_.GetLastChannel();
2343 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num2, send_ssrc));
2344 EXPECT_EQ(kSsrc1, send_ssrc);
2345}
2346
2347// Test that the local SSRC is the same on sending and receiving channels if the
2348// receive channel is created before the send channel.
2349TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002350 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002351 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002352
2353 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2354 int receive_channel_num = voe_.GetLastChannel();
2355 EXPECT_TRUE(channel_->AddSendStream(
2356 cricket::StreamParams::CreateLegacy(1234)));
2357 int send_channel_num = voe_.GetLastChannel();
2358
2359 unsigned int ssrc = 0;
2360 EXPECT_EQ(0, voe_.GetLocalSSRC(send_channel_num, ssrc));
2361 EXPECT_EQ(1234U, ssrc);
2362 ssrc = 0;
2363 EXPECT_EQ(0, voe_.GetLocalSSRC(receive_channel_num, ssrc));
2364 EXPECT_EQ(1234U, ssrc);
2365}
2366
2367// Test that we can properly receive packets.
2368TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2369 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002370 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002371 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002372 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame,
2373 sizeof(kPcmuFrame)));
2374}
2375
2376// Test that we can properly receive packets on multiple streams.
2377TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002378 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002379 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002380 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2381 int channel_num1 = voe_.GetLastChannel();
2382 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2383 int channel_num2 = voe_.GetLastChannel();
2384 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2385 int channel_num3 = voe_.GetLastChannel();
2386 // Create packets with the right SSRCs.
2387 char packets[4][sizeof(kPcmuFrame)];
2388 for (size_t i = 0; i < ARRAY_SIZE(packets); ++i) {
2389 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002390 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002391 }
2392 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2393 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2394 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2395 DeliverPacket(packets[0], sizeof(packets[0]));
2396 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2397 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2398 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2399 DeliverPacket(packets[1], sizeof(packets[1]));
2400 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1],
2401 sizeof(packets[1])));
2402 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2403 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2404 DeliverPacket(packets[2], sizeof(packets[2]));
2405 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2406 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2],
2407 sizeof(packets[2])));
2408 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2409 DeliverPacket(packets[3], sizeof(packets[3]));
2410 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2411 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2412 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3],
2413 sizeof(packets[3])));
2414 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2415 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2416 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2417}
2418
2419// Test that we properly handle failures to add a stream.
2420TEST_F(WebRtcVoiceEngineTestFake, AddStreamFail) {
solenberg1ac56142015-10-13 03:58:19 -07002421 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002422 voe_.set_fail_create_channel(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002423 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002424 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002425}
2426
solenberg1ac56142015-10-13 03:58:19 -07002427// Test that AddRecvStream creates new stream.
2428TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2429 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002430 int channel_num = voe_.GetLastChannel();
2431 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002432 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002433}
2434
2435// Test that after adding a recv stream, we do not decode more codecs than
2436// those previously passed into SetRecvCodecs.
2437TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002438 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002439 cricket::AudioRecvParameters parameters;
2440 parameters.codecs.push_back(kIsacCodec);
2441 parameters.codecs.push_back(kPcmuCodec);
2442 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002443 EXPECT_TRUE(channel_->AddRecvStream(
2444 cricket::StreamParams::CreateLegacy(kSsrc1)));
2445 int channel_num2 = voe_.GetLastChannel();
2446 webrtc::CodecInst gcodec;
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002447 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "opus");
2448 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002449 gcodec.channels = 2;
2450 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2451}
2452
2453// Test that we properly clean up any streams that were added, even if
2454// not explicitly removed.
2455TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002456 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002457 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002458 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2459 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2460 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2461 delete channel_;
2462 channel_ = NULL;
2463 EXPECT_EQ(0, voe_.GetNumChannels());
2464}
2465
wu@webrtc.org78187522013-10-07 23:32:02 +00002466TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002467 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002468 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2469}
2470
2471TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2472 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002473 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002474 // Manually delete channel to simulate a failure.
2475 int channel = voe_.GetLastChannel();
2476 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2477 // Add recv stream 2 should work.
2478 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002479 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002480 EXPECT_NE(channel, new_channel);
2481 // The last created channel is deleted too.
2482 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002483}
2484
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002485// Test the InsertDtmf on default send stream as caller.
2486TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2487 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002488}
2489
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002490// Test the InsertDtmf on default send stream as callee
2491TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2492 TestInsertDtmf(0, false);
2493}
2494
2495// Test the InsertDtmf on specified send stream as caller.
2496TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2497 TestInsertDtmf(kSsrc1, true);
2498}
2499
2500// Test the InsertDtmf on specified send stream as callee.
2501TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2502 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002503}
2504
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002505TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002506 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002507 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002508 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2509 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2510 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2511 EXPECT_TRUE(channel_->SetPlayout(true));
2512 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2513 EXPECT_TRUE(channel_->SetPlayout(false));
2514 EXPECT_FALSE(channel_->SetPlayout(true));
2515}
2516
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002517TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002518 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002519
2520 bool ec_enabled;
2521 webrtc::EcModes ec_mode;
2522 bool ec_metrics_enabled;
2523 webrtc::AecmModes aecm_mode;
2524 bool cng_enabled;
2525 bool agc_enabled;
2526 webrtc::AgcModes agc_mode;
2527 webrtc::AgcConfig agc_config;
2528 bool ns_enabled;
2529 webrtc::NsModes ns_mode;
2530 bool highpass_filter_enabled;
2531 bool stereo_swapping_enabled;
2532 bool typing_detection_enabled;
2533 voe_.GetEcStatus(ec_enabled, ec_mode);
2534 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2535 voe_.GetAecmMode(aecm_mode, cng_enabled);
2536 voe_.GetAgcStatus(agc_enabled, agc_mode);
2537 voe_.GetAgcConfig(agc_config);
2538 voe_.GetNsStatus(ns_enabled, ns_mode);
2539 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2540 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2541 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2542 EXPECT_TRUE(ec_enabled);
2543 EXPECT_TRUE(ec_metrics_enabled);
2544 EXPECT_FALSE(cng_enabled);
2545 EXPECT_TRUE(agc_enabled);
2546 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2547 EXPECT_TRUE(ns_enabled);
2548 EXPECT_TRUE(highpass_filter_enabled);
2549 EXPECT_FALSE(stereo_swapping_enabled);
2550 EXPECT_TRUE(typing_detection_enabled);
2551 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2552 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2553
2554 // Nothing set, so all ignored.
2555 cricket::AudioOptions options;
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002556 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002557 voe_.GetEcStatus(ec_enabled, ec_mode);
2558 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2559 voe_.GetAecmMode(aecm_mode, cng_enabled);
2560 voe_.GetAgcStatus(agc_enabled, agc_mode);
2561 voe_.GetAgcConfig(agc_config);
2562 voe_.GetNsStatus(ns_enabled, ns_mode);
2563 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2564 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2565 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2566 EXPECT_TRUE(ec_enabled);
2567 EXPECT_TRUE(ec_metrics_enabled);
2568 EXPECT_FALSE(cng_enabled);
2569 EXPECT_TRUE(agc_enabled);
2570 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2571 EXPECT_TRUE(ns_enabled);
2572 EXPECT_TRUE(highpass_filter_enabled);
2573 EXPECT_FALSE(stereo_swapping_enabled);
2574 EXPECT_TRUE(typing_detection_enabled);
2575 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2576 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
Henrik Lundin64dad832015-05-11 12:44:23 +02002577 EXPECT_EQ(50, voe_.GetNetEqCapacity()); // From GetDefaultEngineOptions().
Henrik Lundin5263b3c2015-06-01 10:29:41 +02002578 EXPECT_FALSE(
2579 voe_.GetNetEqFastAccelerate()); // From GetDefaultEngineOptions().
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002580
2581 // Turn echo cancellation off
2582 options.echo_cancellation.Set(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002583 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002584 voe_.GetEcStatus(ec_enabled, ec_mode);
2585 EXPECT_FALSE(ec_enabled);
2586
2587 // Turn echo cancellation back on, with settings, and make sure
2588 // nothing else changed.
2589 options.echo_cancellation.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002590 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002591 voe_.GetEcStatus(ec_enabled, ec_mode);
2592 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2593 voe_.GetAecmMode(aecm_mode, cng_enabled);
2594 voe_.GetAgcStatus(agc_enabled, agc_mode);
2595 voe_.GetAgcConfig(agc_config);
2596 voe_.GetNsStatus(ns_enabled, ns_mode);
2597 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2598 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2599 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2600 EXPECT_TRUE(ec_enabled);
2601 EXPECT_TRUE(ec_metrics_enabled);
2602 EXPECT_TRUE(agc_enabled);
2603 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2604 EXPECT_TRUE(ns_enabled);
2605 EXPECT_TRUE(highpass_filter_enabled);
2606 EXPECT_FALSE(stereo_swapping_enabled);
2607 EXPECT_TRUE(typing_detection_enabled);
2608 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2609 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2610
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002611 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2612 // control.
2613 options.delay_agnostic_aec.Set(true);
2614 ASSERT_TRUE(engine_.SetOptions(options));
2615 voe_.GetEcStatus(ec_enabled, ec_mode);
2616 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2617 voe_.GetAecmMode(aecm_mode, cng_enabled);
2618 EXPECT_TRUE(ec_enabled);
2619 EXPECT_TRUE(ec_metrics_enabled);
2620 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2621
2622 // Turn off echo cancellation and delay agnostic aec.
2623 options.delay_agnostic_aec.Set(false);
Henrik Lundin441f6342015-06-09 16:03:13 +02002624 options.extended_filter_aec.Set(false);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002625 options.echo_cancellation.Set(false);
2626 ASSERT_TRUE(engine_.SetOptions(options));
2627 voe_.GetEcStatus(ec_enabled, ec_mode);
2628 EXPECT_FALSE(ec_enabled);
2629 // Turning delay agnostic aec back on should also turn on echo cancellation.
2630 options.delay_agnostic_aec.Set(true);
2631 ASSERT_TRUE(engine_.SetOptions(options));
2632 voe_.GetEcStatus(ec_enabled, ec_mode);
2633 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2634 EXPECT_TRUE(ec_enabled);
2635 EXPECT_TRUE(ec_metrics_enabled);
2636 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2637
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002638 // Turn off AGC
2639 options.auto_gain_control.Set(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002640 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002641 voe_.GetAgcStatus(agc_enabled, agc_mode);
2642 EXPECT_FALSE(agc_enabled);
2643
2644 // Turn AGC back on
2645 options.auto_gain_control.Set(true);
2646 options.adjust_agc_delta.Clear();
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002647 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002648 voe_.GetAgcStatus(agc_enabled, agc_mode);
2649 EXPECT_TRUE(agc_enabled);
2650 voe_.GetAgcConfig(agc_config);
2651 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2652
2653 // Turn off other options (and stereo swapping on).
2654 options.noise_suppression.Set(false);
2655 options.highpass_filter.Set(false);
2656 options.typing_detection.Set(false);
2657 options.stereo_swapping.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002658 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002659 voe_.GetNsStatus(ns_enabled, ns_mode);
2660 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2661 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2662 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2663 EXPECT_FALSE(ns_enabled);
2664 EXPECT_FALSE(highpass_filter_enabled);
2665 EXPECT_FALSE(typing_detection_enabled);
2666 EXPECT_TRUE(stereo_swapping_enabled);
2667
solenberg1ac56142015-10-13 03:58:19 -07002668 // Set options again to ensure it has no impact.
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002669 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002670 voe_.GetEcStatus(ec_enabled, ec_mode);
2671 voe_.GetNsStatus(ns_enabled, ns_mode);
2672 EXPECT_TRUE(ec_enabled);
2673 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2674 EXPECT_FALSE(ns_enabled);
2675 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2676}
2677
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002678TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002679 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002680
2681 bool ec_enabled;
2682 webrtc::EcModes ec_mode;
2683 bool ec_metrics_enabled;
2684 bool agc_enabled;
2685 webrtc::AgcModes agc_mode;
2686 bool ns_enabled;
2687 webrtc::NsModes ns_mode;
2688 bool highpass_filter_enabled;
2689 bool stereo_swapping_enabled;
2690 bool typing_detection_enabled;
2691
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002692 voe_.GetEcStatus(ec_enabled, ec_mode);
2693 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2694 voe_.GetAgcStatus(agc_enabled, agc_mode);
2695 voe_.GetNsStatus(ns_enabled, ns_mode);
2696 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2697 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2698 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2699 EXPECT_TRUE(ec_enabled);
2700 EXPECT_TRUE(agc_enabled);
2701 EXPECT_TRUE(ns_enabled);
2702 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002703 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002704 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002705}
2706
2707TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2708 webrtc::AgcConfig set_config = {0};
2709 set_config.targetLeveldBOv = 3;
2710 set_config.digitalCompressionGaindB = 9;
2711 set_config.limiterEnable = true;
2712 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002713 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002714
2715 webrtc::AgcConfig config = {0};
2716 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2717 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2718 EXPECT_EQ(set_config.digitalCompressionGaindB,
2719 config.digitalCompressionGaindB);
2720 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2721}
2722
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002723TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002724 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg66f43392015-09-09 01:36:22 -07002725 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2726 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002727 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002728 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2729 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002730 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002731
2732 // Have to add a stream to make SetSend work.
2733 cricket::StreamParams stream1;
2734 stream1.ssrcs.push_back(1);
2735 channel1->AddSendStream(stream1);
2736 cricket::StreamParams stream2;
2737 stream2.ssrcs.push_back(2);
2738 channel2->AddSendStream(stream2);
2739
2740 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002741 cricket::AudioSendParameters parameters_options_all = send_parameters_;
2742 parameters_options_all.options.echo_cancellation.Set(true);
2743 parameters_options_all.options.auto_gain_control.Set(true);
2744 parameters_options_all.options.noise_suppression.Set(true);
2745 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2746 EXPECT_EQ(parameters_options_all.options, channel1->options());
2747 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2748 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002749
2750 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002751 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
2752 parameters_options_no_ns.options.noise_suppression.Set(false);
2753 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2754 cricket::AudioOptions expected_options = parameters_options_all.options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002755 expected_options.echo_cancellation.Set(true);
2756 expected_options.auto_gain_control.Set(true);
2757 expected_options.noise_suppression.Set(false);
solenberg66f43392015-09-09 01:36:22 -07002758 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002759
2760 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002761 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
2762 parameters_options_no_agc.options.auto_gain_control.Set(false);
2763 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002764 expected_options.echo_cancellation.Set(true);
2765 expected_options.auto_gain_control.Set(false);
2766 expected_options.noise_suppression.Set(true);
solenberg66f43392015-09-09 01:36:22 -07002767 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002768
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002769 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002770 bool ec_enabled;
2771 webrtc::EcModes ec_mode;
2772 bool agc_enabled;
2773 webrtc::AgcModes agc_mode;
2774 bool ns_enabled;
2775 webrtc::NsModes ns_mode;
2776 voe_.GetEcStatus(ec_enabled, ec_mode);
2777 voe_.GetAgcStatus(agc_enabled, agc_mode);
2778 voe_.GetNsStatus(ns_enabled, ns_mode);
2779 EXPECT_TRUE(ec_enabled);
2780 EXPECT_TRUE(agc_enabled);
2781 EXPECT_TRUE(ns_enabled);
2782
2783 channel1->SetSend(cricket::SEND_MICROPHONE);
2784 voe_.GetEcStatus(ec_enabled, ec_mode);
2785 voe_.GetAgcStatus(agc_enabled, agc_mode);
2786 voe_.GetNsStatus(ns_enabled, ns_mode);
2787 EXPECT_TRUE(ec_enabled);
2788 EXPECT_TRUE(agc_enabled);
2789 EXPECT_FALSE(ns_enabled);
2790
2791 channel1->SetSend(cricket::SEND_NOTHING);
2792 voe_.GetEcStatus(ec_enabled, ec_mode);
2793 voe_.GetAgcStatus(agc_enabled, agc_mode);
2794 voe_.GetNsStatus(ns_enabled, ns_mode);
2795 EXPECT_TRUE(ec_enabled);
2796 EXPECT_TRUE(agc_enabled);
2797 EXPECT_TRUE(ns_enabled);
2798
2799 channel2->SetSend(cricket::SEND_MICROPHONE);
2800 voe_.GetEcStatus(ec_enabled, ec_mode);
2801 voe_.GetAgcStatus(agc_enabled, agc_mode);
2802 voe_.GetNsStatus(ns_enabled, ns_mode);
2803 EXPECT_TRUE(ec_enabled);
2804 EXPECT_FALSE(agc_enabled);
2805 EXPECT_TRUE(ns_enabled);
2806
2807 channel2->SetSend(cricket::SEND_NOTHING);
2808 voe_.GetEcStatus(ec_enabled, ec_mode);
2809 voe_.GetAgcStatus(agc_enabled, agc_mode);
2810 voe_.GetNsStatus(ns_enabled, ns_mode);
2811 EXPECT_TRUE(ec_enabled);
2812 EXPECT_TRUE(agc_enabled);
2813 EXPECT_TRUE(ns_enabled);
2814
2815 // Make sure settings take effect while we are sending.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002816 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
2817 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2818 send_parameters_;
2819 parameters_options_no_agc_nor_ns.options.auto_gain_control.Set(false);
2820 parameters_options_no_agc_nor_ns.options.noise_suppression.Set(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002821 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002822 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002823 expected_options.echo_cancellation.Set(true);
2824 expected_options.auto_gain_control.Set(false);
2825 expected_options.noise_suppression.Set(false);
solenberg66f43392015-09-09 01:36:22 -07002826 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002827 voe_.GetEcStatus(ec_enabled, ec_mode);
2828 voe_.GetAgcStatus(agc_enabled, agc_mode);
2829 voe_.GetNsStatus(ns_enabled, ns_mode);
2830 EXPECT_TRUE(ec_enabled);
2831 EXPECT_FALSE(agc_enabled);
2832 EXPECT_FALSE(ns_enabled);
2833}
2834
wu@webrtc.orgde305012013-10-31 15:40:38 +00002835// This test verifies DSCP settings are properly applied on voice media channel.
2836TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002837 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002838 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002839 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002840 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00002841 new cricket::FakeNetworkInterface);
2842 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002843 cricket::AudioSendParameters parameters = send_parameters_;
2844 parameters.options.dscp.Set(true);
2845 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002846 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00002847 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002848 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002849 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002850 parameters.options.dscp.Set(false);
2851 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002852 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00002853}
2854
solenberg1ac56142015-10-13 03:58:19 -07002855TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002856 EXPECT_TRUE(SetupEngine());
2857 cricket::WebRtcVoiceMediaChannel* media_channel =
2858 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002859 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2860 EXPECT_TRUE(channel_->AddRecvStream(
2861 cricket::StreamParams::CreateLegacy(kSsrc1)));
2862 int channel_id = voe_.GetLastChannel();
2863 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2864 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2865 EXPECT_TRUE(channel_->AddRecvStream(
2866 cricket::StreamParams::CreateLegacy(kSsrc2)));
2867 int channel_id2 = voe_.GetLastChannel();
2868 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002869}
2870
solenberg1ac56142015-10-13 03:58:19 -07002871TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002872 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002873 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002874 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2875 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2876 EXPECT_TRUE(channel_->AddSendStream(
2877 cricket::StreamParams::CreateLegacy(kSsrc1)));
2878 int channel_id = voe_.GetLastChannel();
2879 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2880 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2881 EXPECT_TRUE(channel_->AddSendStream(
2882 cricket::StreamParams::CreateLegacy(kSsrc2)));
2883 int channel_id2 = voe_.GetLastChannel();
2884 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002885}
2886
solenberg4bac9c52015-10-09 02:32:53 -07002887TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002888 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002889 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002890 cricket::StreamParams stream;
2891 stream.ssrcs.push_back(kSsrc2);
2892 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002893 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002894 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002895 float scale = 0;
2896 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2897 EXPECT_DOUBLE_EQ(3, scale);
2898}
2899
2900TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
2901 EXPECT_TRUE(SetupEngine());
2902 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2903 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2904 int channel_id = voe_.GetLastChannel();
2905 float scale = 0;
2906 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2907 EXPECT_DOUBLE_EQ(2, scale);
2908 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07002909 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002910 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002911}
2912
pbos8fc7fa72015-07-15 08:02:58 -07002913TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02002914 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07002915 const std::string kSyncLabel = "AvSyncLabel";
2916
solenberg1ac56142015-10-13 03:58:19 -07002917 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07002918 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
2919 sp.sync_label = kSyncLabel;
2920 // Creating two channels to make sure that sync label is set properly for both
2921 // the default voice channel and following ones.
2922 EXPECT_TRUE(channel_->AddRecvStream(sp));
2923 sp.ssrcs[0] += 1;
2924 EXPECT_TRUE(channel_->AddRecvStream(sp));
2925
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002926 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07002927 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002928 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002929 << "SyncGroup should be set based on sync_label";
2930 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002931 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002932 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07002933}
2934
pbos6bb1b6e2015-07-24 07:10:18 -07002935TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002936 // Test that changing the combined_audio_video_bwe option results in the
2937 // expected state changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002938 std::vector<uint32_t> ssrcs;
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002939 ssrcs.push_back(223);
2940 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002941
solenberg1ac56142015-10-13 03:58:19 -07002942 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002943 cricket::WebRtcVoiceMediaChannel* media_channel =
2944 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02002945 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002946 EXPECT_TRUE(media_channel->AddRecvStream(
2947 cricket::StreamParams::CreateLegacy(ssrc)));
2948 }
2949 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002950
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002951 // Combined BWE should be disabled.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002952 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002953 const auto* s = call_.GetAudioReceiveStream(ssrc);
2954 EXPECT_NE(nullptr, s);
2955 EXPECT_EQ(false, s->GetConfig().combined_audio_video_bwe);
2956 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002957
2958 // Enable combined BWE option - now it should be set up.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002959 send_parameters_.options.combined_audio_video_bwe.Set(true);
2960 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002961 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002962 const auto* s = call_.GetAudioReceiveStream(ssrc);
2963 EXPECT_NE(nullptr, s);
2964 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
2965 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002966
2967 // Disable combined BWE option - should be disabled again.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002968 send_parameters_.options.combined_audio_video_bwe.Set(false);
2969 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002970 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002971 const auto* s = call_.GetAudioReceiveStream(ssrc);
2972 EXPECT_NE(nullptr, s);
2973 EXPECT_EQ(false, s->GetConfig().combined_audio_video_bwe);
2974 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002975
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002976 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002977}
2978
pbos6bb1b6e2015-07-24 07:10:18 -07002979TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002980 // Test that adding receive streams after enabling combined bandwidth
2981 // estimation will correctly configure each channel.
solenberg1ac56142015-10-13 03:58:19 -07002982 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002983 cricket::WebRtcVoiceMediaChannel* media_channel =
2984 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002985 send_parameters_.options.combined_audio_video_bwe.Set(true);
2986 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002987
Peter Boström0c4e06b2015-10-07 12:23:21 +02002988 static const uint32_t kSsrcs[] = {1, 2, 3, 4};
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002989 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs); ++i) {
2990 EXPECT_TRUE(media_channel->AddRecvStream(
2991 cricket::StreamParams::CreateLegacy(kSsrcs[i])));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002992 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(kSsrcs[i]));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002993 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002994 EXPECT_EQ(ARRAY_SIZE(kSsrcs), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002995}
2996
pbos6bb1b6e2015-07-24 07:10:18 -07002997TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002998 // Test that setting the header extensions results in the expected state
2999 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003000 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003001 ssrcs.push_back(223);
3002 ssrcs.push_back(224);
3003
solenberg1ac56142015-10-13 03:58:19 -07003004 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003005 cricket::WebRtcVoiceMediaChannel* media_channel =
3006 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003007 send_parameters_.options.combined_audio_video_bwe.Set(true);
3008 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003009 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003010 EXPECT_TRUE(media_channel->AddRecvStream(
3011 cricket::StreamParams::CreateLegacy(ssrc)));
3012 }
3013
3014 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003015 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003016 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003017 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003018 EXPECT_NE(nullptr, s);
3019 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3020 }
3021
3022 // Set up receive extensions.
3023 const auto& e_exts = engine_.rtp_header_extensions();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003024 cricket::AudioRecvParameters recv_parameters;
3025 recv_parameters.extensions = e_exts;
3026 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003027 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003028 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003029 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003030 EXPECT_NE(nullptr, s);
3031 const auto& s_exts = s->GetConfig().rtp.extensions;
3032 EXPECT_EQ(e_exts.size(), s_exts.size());
3033 for (const auto& e_ext : e_exts) {
3034 for (const auto& s_ext : s_exts) {
3035 if (e_ext.id == s_ext.id) {
3036 EXPECT_EQ(e_ext.uri, s_ext.name);
3037 }
3038 }
3039 }
3040 }
3041
3042 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003043 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003044 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003045 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003046 EXPECT_NE(nullptr, s);
3047 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3048 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003049}
3050
3051TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3052 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003053 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003054 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3055 static const unsigned char kRtcp[] = {
3056 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3057 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3058 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3059 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3060 };
3061 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3062
solenberg1ac56142015-10-13 03:58:19 -07003063 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003064 cricket::WebRtcVoiceMediaChannel* media_channel =
3065 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003066 send_parameters_.options.combined_audio_video_bwe.Set(true);
3067 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003068 EXPECT_TRUE(media_channel->AddRecvStream(
3069 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3070
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003071 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003072 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003073 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003074 EXPECT_EQ(0, s->received_packets());
3075 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3076 EXPECT_EQ(1, s->received_packets());
3077 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3078 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003079}
Minyue2013aec2015-05-13 14:14:42 +02003080
solenberg1ac56142015-10-13 03:58:19 -07003081// All receive channels should be associated with the default send channel,
3082// since they do not send RTCP SR.
Minyue2013aec2015-05-13 14:14:42 +02003083TEST_F(WebRtcVoiceEngineTestFake, AssociateDefaultChannelOnConference) {
solenberg1ac56142015-10-13 03:58:19 -07003084 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003085 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003086 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003087 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3088 int recv_ch = voe_.GetLastChannel();
3089 EXPECT_NE(recv_ch, default_channel);
3090 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3091 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3092 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003093 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3094 recv_ch = voe_.GetLastChannel();
3095 EXPECT_NE(recv_ch, default_channel);
3096 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003097}
3098
3099TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003100 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003101 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003102
3103 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3104 int recv_ch = voe_.GetLastChannel();
3105
3106 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3107 int send_ch = voe_.GetLastChannel();
3108
3109 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3110 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3111 // channel of |recv_ch|.This is not a common case, since, normally, only the
3112 // default channel can be associated. However, the default is not deletable.
3113 // So we force the |recv_ch| to associate with a non-default channel.
3114 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3115 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3116
3117 EXPECT_TRUE(channel_->RemoveSendStream(2));
3118 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3119}
stefan658910c2015-09-03 05:48:32 -07003120
3121// Tests for the actual WebRtc VoE library.
3122
3123TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
3124 cricket::WebRtcVoiceEngine engine;
3125 cricket::AudioOptions options = engine.GetOptions();
3126 // The default options should have at least a few things set. We purposefully
3127 // don't check the option values here, though.
3128 EXPECT_TRUE(options.echo_cancellation.IsSet());
3129 EXPECT_TRUE(options.auto_gain_control.IsSet());
3130 EXPECT_TRUE(options.noise_suppression.IsSet());
3131}
3132
3133// Tests that the library initializes and shuts down properly.
3134TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3135 cricket::WebRtcVoiceEngine engine;
3136 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003137 rtc::scoped_ptr<webrtc::Call> call(
3138 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003139 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003140 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003141 EXPECT_TRUE(channel != nullptr);
3142 delete channel;
3143 engine.Terminate();
3144
3145 // Reinit to catch regression where VoiceEngineObserver reference is lost
3146 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3147 engine.Terminate();
3148}
3149
3150// Tests that the library is configured with the codecs we want.
3151TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
3152 cricket::WebRtcVoiceEngine engine;
3153 // Check codecs by name.
3154 EXPECT_TRUE(engine.FindCodec(
3155 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0)));
3156 EXPECT_TRUE(engine.FindCodec(
3157 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0)));
3158 EXPECT_TRUE(engine.FindCodec(
3159 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0)));
3160 // Check that name matching is case-insensitive.
3161 EXPECT_TRUE(engine.FindCodec(
3162 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0)));
3163 EXPECT_TRUE(engine.FindCodec(
3164 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0)));
3165 EXPECT_TRUE(engine.FindCodec(
3166 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0)));
3167 EXPECT_TRUE(engine.FindCodec(
3168 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0)));
3169 EXPECT_TRUE(engine.FindCodec(
3170 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0)));
3171 EXPECT_TRUE(engine.FindCodec(
3172 cricket::AudioCodec(96, "red", 8000, 0, 1, 0)));
3173 EXPECT_TRUE(engine.FindCodec(
3174 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0)));
3175 EXPECT_TRUE(engine.FindCodec(
3176 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0)));
3177 EXPECT_TRUE(engine.FindCodec(
3178 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0)));
3179 EXPECT_TRUE(engine.FindCodec(
3180 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0)));
3181 // Check codecs with an id by id.
3182 EXPECT_TRUE(engine.FindCodec(
3183 cricket::AudioCodec(0, "", 8000, 0, 1, 0))); // PCMU
3184 EXPECT_TRUE(engine.FindCodec(
3185 cricket::AudioCodec(8, "", 8000, 0, 1, 0))); // PCMA
3186 EXPECT_TRUE(engine.FindCodec(
3187 cricket::AudioCodec(9, "", 8000, 0, 1, 0))); // G722
3188 EXPECT_TRUE(engine.FindCodec(
3189 cricket::AudioCodec(13, "", 8000, 0, 1, 0))); // CN
3190 // Check sample/bitrate matching.
3191 EXPECT_TRUE(engine.FindCodec(
3192 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0)));
3193 // Check that bad codecs fail.
3194 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0)));
3195 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(88, "", 0, 0, 1, 0)));
3196 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 0, 2, 0)));
3197 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 5000, 0, 1, 0)));
3198 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 5000, 1, 0)));
3199 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3200 for (std::vector<cricket::AudioCodec>::const_iterator it =
3201 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3202 if (it->name == "CN" && it->clockrate == 16000) {
3203 EXPECT_EQ(105, it->id);
3204 } else if (it->name == "CN" && it->clockrate == 32000) {
3205 EXPECT_EQ(106, it->id);
3206 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3207 EXPECT_EQ(103, it->id);
3208 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3209 EXPECT_EQ(104, it->id);
3210 } else if (it->name == "G722" && it->clockrate == 8000) {
3211 EXPECT_EQ(9, it->id);
3212 } else if (it->name == "telephone-event") {
3213 EXPECT_EQ(126, it->id);
3214 } else if (it->name == "red") {
3215 EXPECT_EQ(127, it->id);
3216 } else if (it->name == "opus") {
3217 EXPECT_EQ(111, it->id);
3218 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3219 EXPECT_EQ("10", it->params.find("minptime")->second);
3220 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3221 EXPECT_EQ("60", it->params.find("maxptime")->second);
3222 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3223 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3224 }
3225 }
3226
3227 engine.Terminate();
3228}
3229
3230// Tests that VoE supports at least 32 channels
3231TEST(WebRtcVoiceEngineTest, Has32Channels) {
3232 cricket::WebRtcVoiceEngine engine;
3233 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003234 rtc::scoped_ptr<webrtc::Call> call(
3235 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003236
3237 cricket::VoiceMediaChannel* channels[32];
3238 int num_channels = 0;
stefan658910c2015-09-03 05:48:32 -07003239 while (num_channels < ARRAY_SIZE(channels)) {
3240 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003241 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003242 if (!channel)
3243 break;
stefan658910c2015-09-03 05:48:32 -07003244 channels[num_channels++] = channel;
3245 }
3246
3247 int expected = ARRAY_SIZE(channels);
3248 EXPECT_EQ(expected, num_channels);
3249
3250 while (num_channels > 0) {
3251 delete channels[--num_channels];
3252 }
stefan658910c2015-09-03 05:48:32 -07003253 engine.Terminate();
3254}
3255
3256// Test that we set our preferred codecs properly.
3257TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3258 cricket::WebRtcVoiceEngine engine;
3259 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003260 rtc::scoped_ptr<webrtc::Call> call(
3261 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003262 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3263 call.get());
3264 cricket::AudioRecvParameters parameters;
3265 parameters.codecs = engine.codecs();
3266 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003267}