blob: 491af192be5db3c3ae07fd0cd672b5fd61fae8b8 [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
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000041using cricket::kRtpAudioLevelHeaderExtension;
42using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
43
Fredrik Solenberga4577522015-10-20 15:01:35 +020044namespace {
45
46const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
47const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
48const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
49const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
50const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
51const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
52const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
53const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
54const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, 0,
55 1, 0);
56const 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};
Fredrik Solenberga4577522015-10-20 15:01:35 +020060const uint32_t kSsrc1 = 0x99;
61const uint32_t kSsrc2 = 0x98;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000062
63class FakeVoEWrapper : public cricket::VoEWrapper {
64 public:
65 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
66 : cricket::VoEWrapper(engine, // processing
67 engine, // base
68 engine, // codec
69 engine, // dtmf
henrike@webrtc.org28e20752013-07-10 00:45:36 +000070 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000071 engine, // network
72 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000073 engine) { // volume
74 }
75};
76
wu@webrtc.org97077a32013-10-25 21:18:33 +000077class FakeVoETraceWrapper : public cricket::VoETraceWrapper {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000078 public:
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +020079 int SetTraceFilter(const unsigned int filter) override {
wu@webrtc.org97077a32013-10-25 21:18:33 +000080 filter_ = filter;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000081 return 0;
82 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +020083 int SetTraceFile(const char* fileNameUTF8) override { return 0; }
84 int SetTraceCallback(webrtc::TraceCallback* callback) override { return 0; }
wu@webrtc.org97077a32013-10-25 21:18:33 +000085 unsigned int filter_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000086};
Fredrik Solenberga4577522015-10-20 15:01:35 +020087} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088
89class WebRtcVoiceEngineTestFake : public testing::Test {
90 public:
henrike@webrtc.org28e20752013-07-10 00:45:36 +000091 WebRtcVoiceEngineTestFake()
Fredrik Solenberg709ed672015-09-15 12:26:33 +020092 : call_(webrtc::Call::Config()),
93 voe_(kAudioCodecs, ARRAY_SIZE(kAudioCodecs)),
wu@webrtc.org97077a32013-10-25 21:18:33 +000094 trace_wrapper_(new FakeVoETraceWrapper()),
Jelena Marusicc28a8962015-05-29 15:05:44 +020095 engine_(new FakeVoEWrapper(&voe_), trace_wrapper_),
96 channel_(nullptr) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +020097 send_parameters_.codecs.push_back(kPcmuCodec);
98 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000099 options_adjust_agc_.adjust_agc_delta.Set(-10);
100 }
solenberg1ac56142015-10-13 03:58:19 -0700101 bool SetupEngine() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000102 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000103 return false;
104 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200105 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200106 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000107 }
solenberg1ac56142015-10-13 03:58:19 -0700108 bool SetupEngineWithRecvStream() {
109 if (!SetupEngine()) {
110 return false;
111 }
112 return channel_->AddRecvStream(
113 cricket::StreamParams::CreateLegacy(kSsrc1));
114 }
115 bool SetupEngineWithSendStream() {
116 if (!SetupEngine()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000117 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000118 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000119 return channel_->AddSendStream(
120 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000121 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000122 void SetupForMultiSendStream() {
solenberg1ac56142015-10-13 03:58:19 -0700123 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000124 // Remove stream added in Setup, which is corresponding to default channel.
125 int default_channel_num = voe_.GetLastChannel();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200126 uint32_t default_send_ssrc = 0u;
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000127 EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
128 EXPECT_EQ(kSsrc1, default_send_ssrc);
129 EXPECT_TRUE(channel_->RemoveSendStream(default_send_ssrc));
130
131 // Verify the default channel still exists.
132 EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
133 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000134 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200135 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000136 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000137 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200138 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000139 delete channel_;
140 engine_.Terminate();
141 }
142
Peter Boström0c4e06b2015-10-07 12:23:21 +0200143 void TestInsertDtmf(uint32_t ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000144 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200145 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200146 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000147 if (caller) {
148 // if this is a caller, local description will be applied and add the
149 // send stream.
150 EXPECT_TRUE(channel_->AddSendStream(
151 cricket::StreamParams::CreateLegacy(kSsrc1)));
152 }
153 int channel_id = voe_.GetLastChannel();
154
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000155 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200156 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000157 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
158 EXPECT_FALSE(channel_->CanInsertDtmf());
159 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111, cricket::DF_SEND));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200160 send_parameters_.codecs.push_back(kTelephoneEventCodec);
161 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000162 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000163
164 if (!caller) {
165 // There's no active send channel yet.
166 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
167 EXPECT_TRUE(channel_->AddSendStream(
168 cricket::StreamParams::CreateLegacy(kSsrc1)));
169 }
170
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000171 // Check we fail if the ssrc is invalid.
172 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111, cricket::DF_SEND));
173
174 // Test send
175 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
176 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
177 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
178
179 // Test play
180 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(3, 134));
181 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 3, 134, cricket::DF_PLAY));
182 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(3, 134));
183
184 // Test send and play
185 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
186 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(4, 145));
187 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 4, 145,
188 cricket::DF_PLAY | cricket::DF_SEND));
189 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
190 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(4, 145));
191 }
192
193 // Test that send bandwidth is set correctly.
194 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000195 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
196 // |expected_result| is the expected result from SetMaxSendBandwidth().
197 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000198 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000199 int max_bitrate,
200 bool expected_result,
201 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200202 cricket::AudioSendParameters parameters;
203 parameters.codecs.push_back(codec);
204 parameters.max_bandwidth_bps = max_bitrate;
205 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
206
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000207 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000208 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000209 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000210 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000211 }
212
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000213 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700214 EXPECT_TRUE(SetupEngine());
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000215 int channel_num = voe_.GetLastChannel();
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000216
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000217 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000218 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000219
220 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200221 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000222 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200223 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000224 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000225
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000226 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200227 send_parameters_.extensions.clear();
228 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000229 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000230
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000231 // Ensure extension is set properly.
232 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200233 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
234 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000235 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000236
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000237 // Ensure extension is set properly on new channel.
238 // The first stream to occupy the default channel.
239 EXPECT_TRUE(channel_->AddSendStream(
240 cricket::StreamParams::CreateLegacy(123)));
241 EXPECT_TRUE(channel_->AddSendStream(
242 cricket::StreamParams::CreateLegacy(234)));
243 int new_channel_num = voe_.GetLastChannel();
244 EXPECT_NE(channel_num, new_channel_num);
245 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000246
247 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200248 send_parameters_.codecs.push_back(kPcmuCodec);
249 send_parameters_.extensions.clear();
250 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000251 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
252 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000253 }
254
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000255 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700256 EXPECT_TRUE(SetupEngineWithRecvStream());
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000257 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000258
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000259 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000260 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000261
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200262 cricket::AudioRecvParameters parameters;
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000263 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200264 parameters.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000265 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200266 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000267 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000268
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000269 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200270 parameters.extensions.clear();
271 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000272 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000273
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000274 // Ensure extension is set properly.
275 const int id = 2;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200276 parameters.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
277 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000278 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000279
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000280 // Ensure extension is set properly on new channel.
281 // The first stream to occupy the default channel.
282 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700283 cricket::StreamParams::CreateLegacy(kSsrc2)));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000284 int new_channel_num = voe_.GetLastChannel();
285 EXPECT_NE(channel_num, new_channel_num);
286 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
287
288 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200289 parameters.extensions.clear();
290 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000291 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
292 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000293 }
294
Fredrik Solenberga4577522015-10-20 15:01:35 +0200295 const webrtc::AudioReceiveStream::Stats& GetAudioReceiveStreamStats() const {
296 static webrtc::AudioReceiveStream::Stats stats;
297 if (stats.remote_ssrc == 0) {
298 stats.remote_ssrc = 123;
299 stats.bytes_rcvd = 456;
300 stats.packets_rcvd = 768;
301 stats.packets_lost = 101;
302 stats.fraction_lost = 23.45f;
303 stats.codec_name = "codec_name";
304 stats.ext_seqnum = 678;
305 stats.jitter_ms = 901;
306 stats.jitter_buffer_ms = 234;
307 stats.jitter_buffer_preferred_ms = 567;
308 stats.delay_estimate_ms = 890;
309 stats.audio_level = 1234;
310 stats.expand_rate = 5.67f;
311 stats.speech_expand_rate = 8.90f;
312 stats.secondary_decoded_rate = 1.23f;
313 stats.accelerate_rate = 4.56f;
314 stats.preemptive_expand_rate = 7.89f;
315 stats.decoding_calls_to_silence_generator = 012;
316 stats.decoding_calls_to_neteq = 345;
317 stats.decoding_normal = 67890;
318 stats.decoding_plc = 1234;
319 stats.decoding_cng = 5678;
320 stats.decoding_plc_cng = 9012;
321 stats.capture_start_ntp_time_ms = 3456;
322 }
323 return stats;
324 }
325 void SetAudioReceiveStreamStats() {
326 for (auto* s : call_.GetAudioReceiveStreams()) {
327 s->SetStats(GetAudioReceiveStreamStats());
328 }
329 }
330 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
331 const auto& kStats = GetAudioReceiveStreamStats();
332 EXPECT_EQ(info.local_stats.front().ssrc, kStats.remote_ssrc);
333 EXPECT_EQ(info.bytes_rcvd, kStats.bytes_rcvd);
334 EXPECT_EQ(info.packets_rcvd, kStats.packets_rcvd);
335 EXPECT_EQ(info.packets_lost, kStats.packets_lost);
336 EXPECT_EQ(info.fraction_lost, kStats.fraction_lost);
337 EXPECT_EQ(info.codec_name, kStats.codec_name);
338 EXPECT_EQ(info.ext_seqnum, kStats.ext_seqnum);
339 EXPECT_EQ(info.jitter_ms, kStats.jitter_ms);
340 EXPECT_EQ(info.jitter_buffer_ms, kStats.jitter_buffer_ms);
341 EXPECT_EQ(info.jitter_buffer_preferred_ms,
342 kStats.jitter_buffer_preferred_ms);
343 EXPECT_EQ(info.delay_estimate_ms, kStats.delay_estimate_ms);
344 EXPECT_EQ(info.audio_level, kStats.audio_level);
345 EXPECT_EQ(info.expand_rate, kStats.expand_rate);
346 EXPECT_EQ(info.speech_expand_rate, kStats.speech_expand_rate);
347 EXPECT_EQ(info.secondary_decoded_rate, kStats.secondary_decoded_rate);
348 EXPECT_EQ(info.accelerate_rate, kStats.accelerate_rate);
349 EXPECT_EQ(info.preemptive_expand_rate, kStats.preemptive_expand_rate);
350 EXPECT_EQ(info.decoding_calls_to_silence_generator,
351 kStats.decoding_calls_to_silence_generator);
352 EXPECT_EQ(info.decoding_calls_to_neteq, kStats.decoding_calls_to_neteq);
353 EXPECT_EQ(info.decoding_normal, kStats.decoding_normal);
354 EXPECT_EQ(info.decoding_plc, kStats.decoding_plc);
355 EXPECT_EQ(info.decoding_cng, kStats.decoding_cng);
356 EXPECT_EQ(info.decoding_plc_cng, kStats.decoding_plc_cng);
357 EXPECT_EQ(info.capture_start_ntp_time_ms, kStats.capture_start_ntp_time_ms);
358 }
359
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000360 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200361 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000362 cricket::FakeWebRtcVoiceEngine voe_;
wu@webrtc.org97077a32013-10-25 21:18:33 +0000363 FakeVoETraceWrapper* trace_wrapper_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000364 cricket::WebRtcVoiceEngine engine_;
365 cricket::VoiceMediaChannel* channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000366
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200367 cricket::AudioSendParameters send_parameters_;
368 cricket::AudioRecvParameters recv_parameters_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000369 cricket::AudioOptions options_adjust_agc_;
370};
371
372// Tests that our stub library "works".
373TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
374 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000375 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000376 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000377 engine_.Terminate();
378 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000379}
380
381// Tests that we can create and destroy a channel.
382TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000383 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200384 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200385 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000386}
387
388// Tests that we properly handle failures in CreateChannel.
389TEST_F(WebRtcVoiceEngineTestFake, CreateChannelFail) {
390 voe_.set_fail_create_channel(true);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000391 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200392 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200393 EXPECT_TRUE(channel_ == nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000394}
395
396// Tests that the list of supported codecs is created properly and ordered
397// correctly
398TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
399 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
400 ASSERT_FALSE(codecs.empty());
401 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
402 EXPECT_EQ(48000, codecs[0].clockrate);
403 EXPECT_EQ(2, codecs[0].channels);
404 EXPECT_EQ(64000, codecs[0].bitrate);
405 int pref = codecs[0].preference;
406 for (size_t i = 1; i < codecs.size(); ++i) {
407 EXPECT_GT(pref, codecs[i].preference);
408 pref = codecs[i].preference;
409 }
410}
411
412// Tests that we can find codecs by name or id, and that we interpret the
413// clockrate and bitrate fields properly.
414TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
415 cricket::AudioCodec codec;
416 webrtc::CodecInst codec_inst;
417 // Find PCMU with explicit clockrate and bitrate.
418 EXPECT_TRUE(engine_.FindWebRtcCodec(kPcmuCodec, &codec_inst));
419 // Find ISAC with explicit clockrate and 0 bitrate.
420 EXPECT_TRUE(engine_.FindWebRtcCodec(kIsacCodec, &codec_inst));
421 // Find telephone-event with explicit clockrate and 0 bitrate.
422 EXPECT_TRUE(engine_.FindWebRtcCodec(kTelephoneEventCodec, &codec_inst));
423 // Find ISAC with a different payload id.
424 codec = kIsacCodec;
425 codec.id = 127;
426 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
427 EXPECT_EQ(codec.id, codec_inst.pltype);
428 // Find PCMU with a 0 clockrate.
429 codec = kPcmuCodec;
430 codec.clockrate = 0;
431 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
432 EXPECT_EQ(codec.id, codec_inst.pltype);
433 EXPECT_EQ(8000, codec_inst.plfreq);
434 // Find PCMU with a 0 bitrate.
435 codec = kPcmuCodec;
436 codec.bitrate = 0;
437 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
438 EXPECT_EQ(codec.id, codec_inst.pltype);
439 EXPECT_EQ(64000, codec_inst.rate);
440 // Find ISAC with an explicit bitrate.
441 codec = kIsacCodec;
442 codec.bitrate = 32000;
443 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
444 EXPECT_EQ(codec.id, codec_inst.pltype);
445 EXPECT_EQ(32000, codec_inst.rate);
446}
447
448// Test that we set our inbound codecs properly, including changing PT.
449TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
450 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200451 cricket::AudioRecvParameters parameters;
452 parameters.codecs.push_back(kIsacCodec);
453 parameters.codecs.push_back(kPcmuCodec);
454 parameters.codecs.push_back(kTelephoneEventCodec);
455 parameters.codecs[0].id = 106; // collide with existing telephone-event
456 parameters.codecs[2].id = 126;
457 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700458 EXPECT_TRUE(channel_->AddRecvStream(
459 cricket::StreamParams::CreateLegacy(kSsrc1)));
460 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000461 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000462 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000463 gcodec.plfreq = 16000;
464 gcodec.channels = 1;
465 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
466 EXPECT_EQ(106, gcodec.pltype);
467 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000468 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000469 "telephone-event");
470 gcodec.plfreq = 8000;
471 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
472 EXPECT_EQ(126, gcodec.pltype);
473 EXPECT_STREQ("telephone-event", gcodec.plname);
474}
475
476// Test that we fail to set an unknown inbound codec.
477TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
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(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
482 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000483}
484
485// Test that we fail if we have duplicate types in the inbound list.
486TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
487 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200488 cricket::AudioRecvParameters parameters;
489 parameters.codecs.push_back(kIsacCodec);
490 parameters.codecs.push_back(kCn16000Codec);
491 parameters.codecs[1].id = kIsacCodec.id;
492 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000493}
494
495// Test that we can decode OPUS without stereo parameters.
496TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
497 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200498 cricket::AudioRecvParameters parameters;
499 parameters.codecs.push_back(kIsacCodec);
500 parameters.codecs.push_back(kPcmuCodec);
501 parameters.codecs.push_back(kOpusCodec);
502 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000503 EXPECT_TRUE(channel_->AddRecvStream(
504 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700505 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000506 webrtc::CodecInst opus;
507 engine_.FindWebRtcCodec(kOpusCodec, &opus);
508 // Even without stereo parameters, recv codecs still specify channels = 2.
509 EXPECT_EQ(2, opus.channels);
510 EXPECT_EQ(111, opus.pltype);
511 EXPECT_STREQ("opus", opus.plname);
512 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700513 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000514 EXPECT_EQ(111, opus.pltype);
515}
516
517// Test that we can decode OPUS with stereo = 0.
518TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
519 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200520 cricket::AudioRecvParameters parameters;
521 parameters.codecs.push_back(kIsacCodec);
522 parameters.codecs.push_back(kPcmuCodec);
523 parameters.codecs.push_back(kOpusCodec);
524 parameters.codecs[2].params["stereo"] = "0";
525 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000526 EXPECT_TRUE(channel_->AddRecvStream(
527 cricket::StreamParams::CreateLegacy(kSsrc1)));
528 int channel_num2 = voe_.GetLastChannel();
529 webrtc::CodecInst opus;
530 engine_.FindWebRtcCodec(kOpusCodec, &opus);
531 // Even when stereo is off, recv codecs still specify channels = 2.
532 EXPECT_EQ(2, opus.channels);
533 EXPECT_EQ(111, opus.pltype);
534 EXPECT_STREQ("opus", opus.plname);
535 opus.pltype = 0;
536 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
537 EXPECT_EQ(111, opus.pltype);
538}
539
540// Test that we can decode OPUS with stereo = 1.
541TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
542 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200543 cricket::AudioRecvParameters parameters;
544 parameters.codecs.push_back(kIsacCodec);
545 parameters.codecs.push_back(kPcmuCodec);
546 parameters.codecs.push_back(kOpusCodec);
547 parameters.codecs[2].params["stereo"] = "1";
548 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000549 EXPECT_TRUE(channel_->AddRecvStream(
550 cricket::StreamParams::CreateLegacy(kSsrc1)));
551 int channel_num2 = voe_.GetLastChannel();
552 webrtc::CodecInst opus;
553 engine_.FindWebRtcCodec(kOpusCodec, &opus);
554 EXPECT_EQ(2, opus.channels);
555 EXPECT_EQ(111, opus.pltype);
556 EXPECT_STREQ("opus", opus.plname);
557 opus.pltype = 0;
558 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
559 EXPECT_EQ(111, opus.pltype);
560}
561
562// Test that changes to recv codecs are applied to all streams.
563TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
564 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200565 cricket::AudioRecvParameters parameters;
566 parameters.codecs.push_back(kIsacCodec);
567 parameters.codecs.push_back(kPcmuCodec);
568 parameters.codecs.push_back(kTelephoneEventCodec);
569 parameters.codecs[0].id = 106; // collide with existing telephone-event
570 parameters.codecs[2].id = 126;
571 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000572 EXPECT_TRUE(channel_->AddRecvStream(
573 cricket::StreamParams::CreateLegacy(kSsrc1)));
574 int channel_num2 = voe_.GetLastChannel();
575 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000576 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000577 gcodec.plfreq = 16000;
578 gcodec.channels = 1;
579 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
580 EXPECT_EQ(106, gcodec.pltype);
581 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000582 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000583 "telephone-event");
584 gcodec.plfreq = 8000;
585 gcodec.channels = 1;
586 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
587 EXPECT_EQ(126, gcodec.pltype);
588 EXPECT_STREQ("telephone-event", gcodec.plname);
589}
590
591TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenberg1ac56142015-10-13 03:58:19 -0700592 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200593 cricket::AudioRecvParameters parameters;
594 parameters.codecs.push_back(kIsacCodec);
595 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200596 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000597
598 int channel_num2 = voe_.GetLastChannel();
599 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000600 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000601 gcodec.plfreq = 16000;
602 gcodec.channels = 1;
603 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
604 EXPECT_EQ(106, gcodec.pltype);
605 EXPECT_STREQ("ISAC", gcodec.plname);
606}
607
608// Test that we can apply the same set of codecs again while playing.
609TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700610 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200611 cricket::AudioRecvParameters parameters;
612 parameters.codecs.push_back(kIsacCodec);
613 parameters.codecs.push_back(kCn16000Codec);
614 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000615 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200616 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617
618 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200619 parameters.codecs[0].id = 127;
620 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
621 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000622 EXPECT_TRUE(voe_.GetPlayout(channel_num));
623}
624
625// Test that we can add a codec while playing.
626TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700627 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200628 cricket::AudioRecvParameters parameters;
629 parameters.codecs.push_back(kIsacCodec);
630 parameters.codecs.push_back(kCn16000Codec);
631 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000632 EXPECT_TRUE(channel_->SetPlayout(true));
633
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200634 parameters.codecs.push_back(kOpusCodec);
635 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
636 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000637 EXPECT_TRUE(voe_.GetPlayout(channel_num));
638 webrtc::CodecInst gcodec;
639 EXPECT_TRUE(engine_.FindWebRtcCodec(kOpusCodec, &gcodec));
640 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
641}
642
643TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenberg1ac56142015-10-13 03:58:19 -0700644 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000646 // Test that when autobw is enabled, bitrate is kept as the default
647 // value. autobw is enabled for the following tests because the target
648 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000649
650 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000651 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000652
653 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000654 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000655
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000656 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000657 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000658}
659
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000660TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700661 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000663 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000664
665 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000666 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
667 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000668
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000669 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000670 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
671 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000672}
673
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000674TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700675 EXPECT_TRUE(SetupEngineWithSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000676
677 // Test that we can only set a maximum bitrate for a fixed-rate codec
678 // if it's bigger than the fixed rate.
679
680 // PCMU, fixed bitrate == 64000.
681 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
682 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
683 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
684 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
685 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
686 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
687 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
688}
689
690TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -0700691 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200692 const int kDesiredBitrate = 128000;
693 cricket::AudioSendParameters parameters;
694 parameters.codecs = engine_.codecs();
695 parameters.max_bandwidth_bps = kDesiredBitrate;
696 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000697
698 EXPECT_TRUE(channel_->AddSendStream(
699 cricket::StreamParams::CreateLegacy(kSsrc1)));
700
701 int channel_num = voe_.GetLastChannel();
702 webrtc::CodecInst codec;
703 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200704 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000705}
706
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000707// Test that bitrate cannot be set for CBR codecs.
708// Bitrate is ignored if it is higher than the fixed bitrate.
709// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000710TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenberg1ac56142015-10-13 03:58:19 -0700711 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000712
713 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200714 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
715 int channel_num = voe_.GetLastChannel();
716 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000717 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
718 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200719
720 send_parameters_.max_bandwidth_bps = 128000;
721 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000722 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
723 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200724
725 send_parameters_.max_bandwidth_bps = 128;
726 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000727 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
728 EXPECT_EQ(64000, codec.rate);
729}
730
731// Test that we apply codecs properly.
732TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenberg1ac56142015-10-13 03:58:19 -0700733 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200734 cricket::AudioSendParameters parameters;
735 parameters.codecs.push_back(kIsacCodec);
736 parameters.codecs.push_back(kPcmuCodec);
737 parameters.codecs.push_back(kRedCodec);
738 parameters.codecs[0].id = 96;
739 parameters.codecs[0].bitrate = 48000;
740 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000741 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200742 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000743 webrtc::CodecInst gcodec;
744 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
745 EXPECT_EQ(96, gcodec.pltype);
746 EXPECT_EQ(48000, gcodec.rate);
747 EXPECT_STREQ("ISAC", gcodec.plname);
748 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000749 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000750 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
751 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
752 EXPECT_EQ(106, voe_.GetSendTelephoneEventPayloadType(channel_num));
753}
754
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000755// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
756// to apply.
757TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenberg1ac56142015-10-13 03:58:19 -0700758 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200759 cricket::AudioSendParameters parameters;
760 parameters.codecs.push_back(kIsacCodec);
761 parameters.codecs.push_back(kPcmuCodec);
762 parameters.codecs.push_back(kRedCodec);
763 parameters.codecs[0].id = 96;
764 parameters.codecs[0].bitrate = 48000;
765 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000766 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
767 // Calling SetSendCodec again with same codec which is already set.
768 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200769 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000770 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
771}
772
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000773// Verify that G722 is set with 16000 samples per second to WebRTC.
774TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenberg1ac56142015-10-13 03:58:19 -0700775 EXPECT_TRUE(SetupEngineWithSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000776 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200777 cricket::AudioSendParameters parameters;
778 parameters.codecs.push_back(kG722CodecSdp);
779 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000780 webrtc::CodecInst gcodec;
781 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
782 EXPECT_STREQ("G722", gcodec.plname);
783 EXPECT_EQ(1, gcodec.channels);
784 EXPECT_EQ(16000, gcodec.plfreq);
785}
786
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000787// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000788TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenberg1ac56142015-10-13 03:58:19 -0700789 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200790 cricket::AudioSendParameters parameters;
791 parameters.codecs.push_back(kOpusCodec);
792 parameters.codecs[0].bitrate = 0;
793 parameters.codecs[0].clockrate = 50000;
794 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000795}
796
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000797// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000798TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700799 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200800 cricket::AudioSendParameters parameters;
801 parameters.codecs.push_back(kOpusCodec);
802 parameters.codecs[0].bitrate = 0;
803 parameters.codecs[0].channels = 0;
804 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000805}
806
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000807// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000808TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700809 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200810 cricket::AudioSendParameters parameters;
811 parameters.codecs.push_back(kOpusCodec);
812 parameters.codecs[0].bitrate = 0;
813 parameters.codecs[0].channels = 0;
814 parameters.codecs[0].params["stereo"] = "1";
815 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000816}
817
818// Test that if channel is 1 for opus and there's no stereo, we fail.
819TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700820 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200821 cricket::AudioSendParameters parameters;
822 parameters.codecs.push_back(kOpusCodec);
823 parameters.codecs[0].bitrate = 0;
824 parameters.codecs[0].channels = 1;
825 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000826}
827
828// Test that if channel is 1 for opus and stereo=0, we fail.
829TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700830 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200831 cricket::AudioSendParameters parameters;
832 parameters.codecs.push_back(kOpusCodec);
833 parameters.codecs[0].bitrate = 0;
834 parameters.codecs[0].channels = 1;
835 parameters.codecs[0].params["stereo"] = "0";
836 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000837}
838
839// Test that if channel is 1 for opus and stereo=1, we fail.
840TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700841 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200842 cricket::AudioSendParameters parameters;
843 parameters.codecs.push_back(kOpusCodec);
844 parameters.codecs[0].bitrate = 0;
845 parameters.codecs[0].channels = 1;
846 parameters.codecs[0].params["stereo"] = "1";
847 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000848}
849
850// Test that with bitrate=0 and no stereo,
851// channels and bitrate are 1 and 32000.
852TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700853 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000854 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200855 cricket::AudioSendParameters parameters;
856 parameters.codecs.push_back(kOpusCodec);
857 parameters.codecs[0].bitrate = 0;
858 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000859 webrtc::CodecInst gcodec;
860 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
861 EXPECT_STREQ("opus", gcodec.plname);
862 EXPECT_EQ(1, gcodec.channels);
863 EXPECT_EQ(32000, gcodec.rate);
864}
865
866// Test that with bitrate=0 and stereo=0,
867// channels and bitrate are 1 and 32000.
868TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700869 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000870 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200871 cricket::AudioSendParameters parameters;
872 parameters.codecs.push_back(kOpusCodec);
873 parameters.codecs[0].bitrate = 0;
874 parameters.codecs[0].params["stereo"] = "0";
875 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000876 webrtc::CodecInst gcodec;
877 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
878 EXPECT_STREQ("opus", gcodec.plname);
879 EXPECT_EQ(1, gcodec.channels);
880 EXPECT_EQ(32000, gcodec.rate);
881}
882
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000883// Test that with bitrate=invalid and stereo=0,
884// channels and bitrate are 1 and 32000.
885TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700886 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000887 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200888 cricket::AudioSendParameters parameters;
889 parameters.codecs.push_back(kOpusCodec);
890 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000891 webrtc::CodecInst gcodec;
892
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000893 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200894 parameters.codecs[0].bitrate = 5999;
895 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000896 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
897 EXPECT_STREQ("opus", gcodec.plname);
898 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000899 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000900
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200901 parameters.codecs[0].bitrate = 510001;
902 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000903 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
904 EXPECT_STREQ("opus", gcodec.plname);
905 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000906 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000907}
908
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000909// Test that with bitrate=0 and stereo=1,
910// channels and bitrate are 2 and 64000.
911TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700912 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000913 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200914 cricket::AudioSendParameters parameters;
915 parameters.codecs.push_back(kOpusCodec);
916 parameters.codecs[0].bitrate = 0;
917 parameters.codecs[0].params["stereo"] = "1";
918 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000919 webrtc::CodecInst gcodec;
920 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
921 EXPECT_STREQ("opus", gcodec.plname);
922 EXPECT_EQ(2, gcodec.channels);
923 EXPECT_EQ(64000, gcodec.rate);
924}
925
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000926// Test that with bitrate=invalid and stereo=1,
927// channels and bitrate are 2 and 64000.
928TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700929 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000930 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200931 cricket::AudioSendParameters parameters;
932 parameters.codecs.push_back(kOpusCodec);
933 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000934 webrtc::CodecInst gcodec;
935
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000936 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200937 parameters.codecs[0].bitrate = 5999;
938 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000939 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
940 EXPECT_STREQ("opus", gcodec.plname);
941 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000942 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000943
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200944 parameters.codecs[0].bitrate = 510001;
945 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000946 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
947 EXPECT_STREQ("opus", gcodec.plname);
948 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000949 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000950}
951
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000952// Test that with bitrate=N and stereo unset,
953// channels and bitrate are 1 and N.
954TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700955 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000956 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200957 cricket::AudioSendParameters parameters;
958 parameters.codecs.push_back(kOpusCodec);
959 parameters.codecs[0].bitrate = 96000;
960 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000961 webrtc::CodecInst gcodec;
962 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
963 EXPECT_EQ(111, gcodec.pltype);
964 EXPECT_EQ(96000, gcodec.rate);
965 EXPECT_STREQ("opus", gcodec.plname);
966 EXPECT_EQ(1, gcodec.channels);
967 EXPECT_EQ(48000, gcodec.plfreq);
968}
969
970// Test that with bitrate=N and stereo=0,
971// channels and bitrate are 1 and N.
972TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700973 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000974 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200975 cricket::AudioSendParameters parameters;
976 parameters.codecs.push_back(kOpusCodec);
977 parameters.codecs[0].bitrate = 30000;
978 parameters.codecs[0].params["stereo"] = "0";
979 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000980 webrtc::CodecInst gcodec;
981 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
982 EXPECT_EQ(1, gcodec.channels);
983 EXPECT_EQ(30000, gcodec.rate);
984 EXPECT_STREQ("opus", gcodec.plname);
985}
986
987// Test that with bitrate=N and without any parameters,
988// channels and bitrate are 1 and N.
989TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenberg1ac56142015-10-13 03:58:19 -0700990 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000991 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200992 cricket::AudioSendParameters parameters;
993 parameters.codecs.push_back(kOpusCodec);
994 parameters.codecs[0].bitrate = 30000;
995 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000996 webrtc::CodecInst gcodec;
997 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
998 EXPECT_EQ(1, gcodec.channels);
999 EXPECT_EQ(30000, gcodec.rate);
1000 EXPECT_STREQ("opus", gcodec.plname);
1001}
1002
1003// Test that with bitrate=N and stereo=1,
1004// channels and bitrate are 2 and N.
1005TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001006 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001007 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001008 cricket::AudioSendParameters parameters;
1009 parameters.codecs.push_back(kOpusCodec);
1010 parameters.codecs[0].bitrate = 30000;
1011 parameters.codecs[0].params["stereo"] = "1";
1012 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001013 webrtc::CodecInst gcodec;
1014 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1015 EXPECT_EQ(2, gcodec.channels);
1016 EXPECT_EQ(30000, gcodec.rate);
1017 EXPECT_STREQ("opus", gcodec.plname);
1018}
1019
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001020// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1021// Also test that the "maxaveragebitrate" can't be set to values outside the
1022// range of 6000 and 510000
1023TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001024 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001025 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001026 cricket::AudioSendParameters parameters;
1027 parameters.codecs.push_back(kOpusCodec);
1028 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001029 webrtc::CodecInst gcodec;
1030
1031 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001032 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1033 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001034 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001035 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001036
1037 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001038 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1039 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001040 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001041 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001042
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001043 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1044 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001045 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1046 EXPECT_EQ(200000, gcodec.rate);
1047}
1048
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001049// Test that we can enable NACK with opus as caller.
1050TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001051 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001052 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001053 cricket::AudioSendParameters parameters;
1054 parameters.codecs.push_back(kOpusCodec);
1055 parameters.codecs[0].AddFeedbackParam(
1056 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1057 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001058 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001059 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001060 EXPECT_TRUE(voe_.GetNACK(channel_num));
1061}
1062
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001063// Test that we can enable NACK with opus as callee.
1064TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -07001065 EXPECT_TRUE(SetupEngine());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001066 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001067 cricket::AudioSendParameters parameters;
1068 parameters.codecs.push_back(kOpusCodec);
1069 parameters.codecs[0].AddFeedbackParam(
1070 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1071 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001072 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001073 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001074 EXPECT_FALSE(voe_.GetNACK(channel_num));
1075
1076 EXPECT_TRUE(channel_->AddSendStream(
1077 cricket::StreamParams::CreateLegacy(kSsrc1)));
1078 EXPECT_TRUE(voe_.GetNACK(channel_num));
1079}
1080
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001081// Test that we can enable NACK on receive streams.
1082TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001083 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001084 int channel_num1 = voe_.GetLastChannel();
1085 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1086 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001087 cricket::AudioSendParameters parameters;
1088 parameters.codecs.push_back(kOpusCodec);
1089 parameters.codecs[0].AddFeedbackParam(
1090 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1091 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001092 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1093 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001094 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001095 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1096 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1097}
1098
1099// Test that we can disable NACK.
1100TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001101 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001102 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001103 cricket::AudioSendParameters parameters;
1104 parameters.codecs.push_back(kOpusCodec);
1105 parameters.codecs[0].AddFeedbackParam(
1106 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1107 cricket::kParamValueEmpty));
1108 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001109 EXPECT_TRUE(voe_.GetNACK(channel_num));
1110
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001111 parameters.codecs.clear();
1112 parameters.codecs.push_back(kOpusCodec);
1113 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001114 EXPECT_FALSE(voe_.GetNACK(channel_num));
1115}
1116
1117// Test that we can disable NACK on receive streams.
1118TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001119 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001120 int channel_num1 = voe_.GetLastChannel();
1121 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1122 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001123 cricket::AudioSendParameters parameters;
1124 parameters.codecs.push_back(kOpusCodec);
1125 parameters.codecs[0].AddFeedbackParam(
1126 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1127 cricket::kParamValueEmpty));
1128 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001129 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1130 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1131
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001132 parameters.codecs.clear();
1133 parameters.codecs.push_back(kOpusCodec);
1134 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001135 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1136 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1137}
1138
1139// Test that NACK is enabled on a new receive stream.
1140TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001141 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001142 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001143 cricket::AudioSendParameters parameters;
1144 parameters.codecs.push_back(kIsacCodec);
1145 parameters.codecs.push_back(kCn16000Codec);
1146 parameters.codecs[0].AddFeedbackParam(
1147 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1148 cricket::kParamValueEmpty));
1149 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001150 EXPECT_TRUE(voe_.GetNACK(channel_num));
1151
1152 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1153 channel_num = voe_.GetLastChannel();
1154 EXPECT_TRUE(voe_.GetNACK(channel_num));
1155 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1156 channel_num = voe_.GetLastChannel();
1157 EXPECT_TRUE(voe_.GetNACK(channel_num));
1158}
1159
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001160// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001161TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenberg1ac56142015-10-13 03:58:19 -07001162 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001163 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001164 cricket::AudioSendParameters parameters;
1165 parameters.codecs.push_back(kOpusCodec);
1166 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001167 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1168}
1169
1170// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001171TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001172 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001173 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001174 cricket::AudioSendParameters parameters;
1175 parameters.codecs.push_back(kOpusCodec);
1176 parameters.codecs[0].bitrate = 0;
1177 parameters.codecs[0].params["useinbandfec"] = "0";
1178 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001179 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1180 webrtc::CodecInst gcodec;
1181 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1182 EXPECT_STREQ("opus", gcodec.plname);
1183 EXPECT_EQ(1, gcodec.channels);
1184 EXPECT_EQ(32000, gcodec.rate);
1185}
1186
1187// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001188TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001189 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001190 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001191 cricket::AudioSendParameters parameters;
1192 parameters.codecs.push_back(kOpusCodec);
1193 parameters.codecs[0].bitrate = 0;
1194 parameters.codecs[0].params["useinbandfec"] = "1";
1195 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001196 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1197 webrtc::CodecInst gcodec;
1198 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1199 EXPECT_STREQ("opus", gcodec.plname);
1200 EXPECT_EQ(1, gcodec.channels);
1201 EXPECT_EQ(32000, gcodec.rate);
1202}
1203
1204// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001205TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001206 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001207 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001208 cricket::AudioSendParameters parameters;
1209 parameters.codecs.push_back(kOpusCodec);
1210 parameters.codecs[0].bitrate = 0;
1211 parameters.codecs[0].params["stereo"] = "1";
1212 parameters.codecs[0].params["useinbandfec"] = "1";
1213 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001214 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1215 webrtc::CodecInst gcodec;
1216 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1217 EXPECT_STREQ("opus", gcodec.plname);
1218 EXPECT_EQ(2, gcodec.channels);
1219 EXPECT_EQ(64000, gcodec.rate);
1220}
1221
1222// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001223TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001224 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001225 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001226 cricket::AudioSendParameters parameters;
1227 parameters.codecs.push_back(kIsacCodec);
1228 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001229 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1230}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001231
1232// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1233TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001234 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001235 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001236 cricket::AudioSendParameters parameters;
1237 parameters.codecs.push_back(kIsacCodec);
1238 parameters.codecs[0].params["useinbandfec"] = "1";
1239 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001240 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1241}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001242
1243// Test that Opus FEC status can be changed.
1244TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenberg1ac56142015-10-13 03:58:19 -07001245 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001246 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001247 cricket::AudioSendParameters parameters;
1248 parameters.codecs.push_back(kOpusCodec);
1249 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001250 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001251 parameters.codecs[0].params["useinbandfec"] = "1";
1252 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001253 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1254}
1255
1256// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1257TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenberg1ac56142015-10-13 03:58:19 -07001258 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001259 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001260 cricket::AudioSendParameters parameters;
1261 parameters.codecs.push_back(kOpusCodec);
1262 parameters.codecs[0].bitrate = 0;
1263 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1264 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001265 EXPECT_EQ(cricket::kOpusBandwidthNb,
1266 voe_.GetMaxEncodingBandwidth(channel_num));
1267 webrtc::CodecInst gcodec;
1268 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1269 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001270
1271 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001272 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1273 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001274 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1275 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001276}
1277
1278// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1279TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenberg1ac56142015-10-13 03:58:19 -07001280 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001281 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001282 cricket::AudioSendParameters parameters;
1283 parameters.codecs.push_back(kOpusCodec);
1284 parameters.codecs[0].bitrate = 0;
1285 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1286 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001287 EXPECT_EQ(cricket::kOpusBandwidthMb,
1288 voe_.GetMaxEncodingBandwidth(channel_num));
1289 webrtc::CodecInst gcodec;
1290 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1291 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001292
1293 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001294 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1295 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001296 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1297 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001298}
1299
1300// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1301TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenberg1ac56142015-10-13 03:58:19 -07001302 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001303 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001304 cricket::AudioSendParameters parameters;
1305 parameters.codecs.push_back(kOpusCodec);
1306 parameters.codecs[0].bitrate = 0;
1307 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1308 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001309 EXPECT_EQ(cricket::kOpusBandwidthWb,
1310 voe_.GetMaxEncodingBandwidth(channel_num));
1311 webrtc::CodecInst gcodec;
1312 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1313 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001314
1315 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001316 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1317 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001318 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1319 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001320}
1321
1322// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1323TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenberg1ac56142015-10-13 03:58:19 -07001324 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001325 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001326 cricket::AudioSendParameters parameters;
1327 parameters.codecs.push_back(kOpusCodec);
1328 parameters.codecs[0].bitrate = 0;
1329 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1330 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001331 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1332 voe_.GetMaxEncodingBandwidth(channel_num));
1333 webrtc::CodecInst gcodec;
1334 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1335 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001336
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001337 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001338 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1339 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001340 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1341 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001342}
1343
1344// Test 24000 < maxplaybackrate triggers Opus full band mode.
1345TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenberg1ac56142015-10-13 03:58:19 -07001346 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001347 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001348 cricket::AudioSendParameters parameters;
1349 parameters.codecs.push_back(kOpusCodec);
1350 parameters.codecs[0].bitrate = 0;
1351 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1352 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001353 EXPECT_EQ(cricket::kOpusBandwidthFb,
1354 voe_.GetMaxEncodingBandwidth(channel_num));
1355 webrtc::CodecInst gcodec;
1356 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1357 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001358
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001359 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001360 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1361 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001362 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1363 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001364}
1365
1366// Test Opus that without maxplaybackrate, default playback rate is used.
1367TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001368 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001369 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001370 cricket::AudioSendParameters parameters;
1371 parameters.codecs.push_back(kOpusCodec);
1372 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001373 EXPECT_EQ(cricket::kOpusBandwidthFb,
1374 voe_.GetMaxEncodingBandwidth(channel_num));
1375}
1376
1377// Test the with non-Opus, maxplaybackrate has no effect.
1378TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001379 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001380 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001381 cricket::AudioSendParameters parameters;
1382 parameters.codecs.push_back(kIsacCodec);
1383 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1384 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001385 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1386}
1387
1388// Test maxplaybackrate can be set on two streams.
1389TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001390 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001391 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001392 cricket::AudioSendParameters parameters;
1393 parameters.codecs.push_back(kOpusCodec);
1394 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001395 // Default bandwidth is 24000.
1396 EXPECT_EQ(cricket::kOpusBandwidthFb,
1397 voe_.GetMaxEncodingBandwidth(channel_num));
1398
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001399 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001400
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001401 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001402 EXPECT_EQ(cricket::kOpusBandwidthNb,
1403 voe_.GetMaxEncodingBandwidth(channel_num));
1404
1405 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1406 channel_num = voe_.GetLastChannel();
1407 EXPECT_EQ(cricket::kOpusBandwidthNb,
1408 voe_.GetMaxEncodingBandwidth(channel_num));
1409}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001410
Minyue Li7100dcd2015-03-27 05:05:59 +01001411// Test that with usedtx=0, Opus DTX is off.
1412TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001413 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001414 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001415 cricket::AudioSendParameters parameters;
1416 parameters.codecs.push_back(kOpusCodec);
1417 parameters.codecs[0].params["usedtx"] = "0";
1418 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001419 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1420}
1421
1422// Test that with usedtx=1, Opus DTX is on.
1423TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001424 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001425 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001426 cricket::AudioSendParameters parameters;
1427 parameters.codecs.push_back(kOpusCodec);
1428 parameters.codecs[0].params["usedtx"] = "1";
1429 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001430 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1431 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1432}
1433
1434// Test that usedtx=1 works with stereo Opus.
1435TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001436 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001437 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001438 cricket::AudioSendParameters parameters;
1439 parameters.codecs.push_back(kOpusCodec);
1440 parameters.codecs[0].params["usedtx"] = "1";
1441 parameters.codecs[0].params["stereo"] = "1";
1442 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001443 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1444 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1445}
1446
1447// Test that usedtx=1 does not work with non Opus.
1448TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001449 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001450 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001451 cricket::AudioSendParameters parameters;
1452 parameters.codecs.push_back(kIsacCodec);
1453 parameters.codecs[0].params["usedtx"] = "1";
1454 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001455 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1456}
1457
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001458// Test that we can switch back and forth between Opus and ISAC with CN.
1459TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenberg1ac56142015-10-13 03:58:19 -07001460 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001461 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001462 cricket::AudioSendParameters opus_parameters;
1463 opus_parameters.codecs.push_back(kOpusCodec);
1464 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001465 webrtc::CodecInst gcodec;
1466 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001467 EXPECT_EQ(111, gcodec.pltype);
1468 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001469
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001470 cricket::AudioSendParameters isac_parameters;
1471 isac_parameters.codecs.push_back(kIsacCodec);
1472 isac_parameters.codecs.push_back(kCn16000Codec);
1473 isac_parameters.codecs.push_back(kOpusCodec);
1474 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001475 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1476 EXPECT_EQ(103, gcodec.pltype);
1477 EXPECT_STREQ("ISAC", gcodec.plname);
1478
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001479 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001480 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001481 EXPECT_EQ(111, gcodec.pltype);
1482 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001483}
1484
1485// Test that we handle various ways of specifying bitrate.
1486TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001487 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001488 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001489 cricket::AudioSendParameters parameters;
1490 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1491 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001492 webrtc::CodecInst gcodec;
1493 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1494 EXPECT_EQ(103, gcodec.pltype);
1495 EXPECT_STREQ("ISAC", gcodec.plname);
1496 EXPECT_EQ(32000, gcodec.rate);
1497
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001498 parameters.codecs[0].bitrate = 0; // bitrate == default
1499 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001500 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1501 EXPECT_EQ(103, gcodec.pltype);
1502 EXPECT_STREQ("ISAC", gcodec.plname);
1503 EXPECT_EQ(-1, gcodec.rate);
1504
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001505 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1506 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001507 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1508 EXPECT_EQ(103, gcodec.pltype);
1509 EXPECT_STREQ("ISAC", gcodec.plname);
1510 EXPECT_EQ(28000, gcodec.rate);
1511
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001512 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1513 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001514 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1515 EXPECT_EQ(0, gcodec.pltype);
1516 EXPECT_STREQ("PCMU", gcodec.plname);
1517 EXPECT_EQ(64000, gcodec.rate);
1518
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001519 parameters.codecs[0].bitrate = 0; // bitrate == default
1520 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001521 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1522 EXPECT_EQ(0, gcodec.pltype);
1523 EXPECT_STREQ("PCMU", gcodec.plname);
1524 EXPECT_EQ(64000, gcodec.rate);
1525
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001526 parameters.codecs[0] = kOpusCodec;
1527 parameters.codecs[0].bitrate = 0; // bitrate == default
1528 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001529 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1530 EXPECT_EQ(111, gcodec.pltype);
1531 EXPECT_STREQ("opus", gcodec.plname);
1532 EXPECT_EQ(32000, gcodec.rate);
1533}
1534
Brave Yao5225dd82015-03-26 07:39:19 +08001535// Test that we could set packet size specified in kCodecParamPTime.
1536TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenberg1ac56142015-10-13 03:58:19 -07001537 EXPECT_TRUE(SetupEngineWithSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001538 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001539 cricket::AudioSendParameters parameters;
1540 parameters.codecs.push_back(kOpusCodec);
1541 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1542 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001543 webrtc::CodecInst gcodec;
1544 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1545 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1546
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001547 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1548 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001549 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1550 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1551
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001552 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1553 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001554 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1555 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1556
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001557 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1558 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1559 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001560 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1561 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1562
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001563 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1564 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1565 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001566 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1567 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1568}
1569
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001570// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001571TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenberg1ac56142015-10-13 03:58:19 -07001572 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001573 cricket::AudioSendParameters parameters;
1574 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001575}
1576
1577// Test that we can set send codecs even with telephone-event codec as the first
1578// one on the list.
1579TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001580 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001581 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001582 cricket::AudioSendParameters parameters;
1583 parameters.codecs.push_back(kTelephoneEventCodec);
1584 parameters.codecs.push_back(kIsacCodec);
1585 parameters.codecs.push_back(kPcmuCodec);
1586 parameters.codecs[0].id = 98; // DTMF
1587 parameters.codecs[1].id = 96;
1588 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001589 webrtc::CodecInst gcodec;
1590 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001591 EXPECT_EQ(96, gcodec.pltype);
1592 EXPECT_STREQ("ISAC", gcodec.plname);
1593 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1594}
1595
1596// Test that we can set send codecs even with CN codec as the first
1597// one on the list.
1598TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001599 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001600 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001601 cricket::AudioSendParameters parameters;
1602 parameters.codecs.push_back(kCn16000Codec);
1603 parameters.codecs.push_back(kIsacCodec);
1604 parameters.codecs.push_back(kPcmuCodec);
1605 parameters.codecs[0].id = 98; // wideband CN
1606 parameters.codecs[1].id = 96;
1607 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001608 webrtc::CodecInst gcodec;
1609 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1610 EXPECT_EQ(96, gcodec.pltype);
1611 EXPECT_STREQ("ISAC", gcodec.plname);
1612 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001613}
1614
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001615// Test that we set VAD and DTMF types correctly as caller.
1616TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001617 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001618 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001619 cricket::AudioSendParameters parameters;
1620 parameters.codecs.push_back(kIsacCodec);
1621 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001622 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001623 parameters.codecs.push_back(kCn16000Codec);
1624 parameters.codecs.push_back(kCn8000Codec);
1625 parameters.codecs.push_back(kTelephoneEventCodec);
1626 parameters.codecs.push_back(kRedCodec);
1627 parameters.codecs[0].id = 96;
1628 parameters.codecs[2].id = 97; // wideband CN
1629 parameters.codecs[4].id = 98; // DTMF
1630 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001631 webrtc::CodecInst gcodec;
1632 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1633 EXPECT_EQ(96, gcodec.pltype);
1634 EXPECT_STREQ("ISAC", gcodec.plname);
1635 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001636 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001637 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1638 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1639 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1640}
1641
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001642// Test that we set VAD and DTMF types correctly as callee.
1643TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001644 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001645 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001646 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001647
1648 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001649 cricket::AudioSendParameters parameters;
1650 parameters.codecs.push_back(kIsacCodec);
1651 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001652 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001653 parameters.codecs.push_back(kCn16000Codec);
1654 parameters.codecs.push_back(kCn8000Codec);
1655 parameters.codecs.push_back(kTelephoneEventCodec);
1656 parameters.codecs.push_back(kRedCodec);
1657 parameters.codecs[0].id = 96;
1658 parameters.codecs[2].id = 97; // wideband CN
1659 parameters.codecs[4].id = 98; // DTMF
1660 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001661 EXPECT_TRUE(channel_->AddSendStream(
1662 cricket::StreamParams::CreateLegacy(kSsrc1)));
1663
1664 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));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +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
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001675// Test that we only apply VAD if we have a CN codec that matches the
1676// send codec clockrate.
1677TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenberg1ac56142015-10-13 03:58:19 -07001678 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001679 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001680 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001681 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001682 parameters.codecs.push_back(kIsacCodec);
1683 parameters.codecs.push_back(kCn16000Codec);
1684 parameters.codecs[1].id = 97;
1685 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001686 webrtc::CodecInst gcodec;
1687 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1688 EXPECT_STREQ("ISAC", gcodec.plname);
1689 EXPECT_TRUE(voe_.GetVAD(channel_num));
1690 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1691 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001692 parameters.codecs[0] = kPcmuCodec;
1693 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001694 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1695 EXPECT_STREQ("PCMU", gcodec.plname);
1696 EXPECT_FALSE(voe_.GetVAD(channel_num));
1697 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001698 parameters.codecs[1] = kCn8000Codec;
1699 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001700 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1701 EXPECT_STREQ("PCMU", gcodec.plname);
1702 EXPECT_TRUE(voe_.GetVAD(channel_num));
1703 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001704 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001705 parameters.codecs[0] = kIsacCodec;
1706 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001707 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1708 EXPECT_STREQ("ISAC", gcodec.plname);
1709 EXPECT_FALSE(voe_.GetVAD(channel_num));
1710}
1711
1712// Test that we perform case-insensitive matching of codec names.
1713TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenberg1ac56142015-10-13 03:58:19 -07001714 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001715 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001716 cricket::AudioSendParameters parameters;
1717 parameters.codecs.push_back(kIsacCodec);
1718 parameters.codecs.push_back(kPcmuCodec);
1719 parameters.codecs.push_back(kCn16000Codec);
1720 parameters.codecs.push_back(kCn8000Codec);
1721 parameters.codecs.push_back(kTelephoneEventCodec);
1722 parameters.codecs.push_back(kRedCodec);
1723 parameters.codecs[0].name = "iSaC";
1724 parameters.codecs[0].id = 96;
1725 parameters.codecs[2].id = 97; // wideband CN
1726 parameters.codecs[4].id = 98; // DTMF
1727 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001728 webrtc::CodecInst gcodec;
1729 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1730 EXPECT_EQ(96, gcodec.pltype);
1731 EXPECT_STREQ("ISAC", gcodec.plname);
1732 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001733 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001734 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1735 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1736 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1737}
1738
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001739// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001740TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
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[""] = "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_TRUE(voe_.GetRED(channel_num));
1756 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001757}
1758
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001759// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001760TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001761 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001762 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001763 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001764
1765 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001766 cricket::AudioSendParameters parameters;
1767 parameters.codecs.push_back(kRedCodec);
1768 parameters.codecs.push_back(kIsacCodec);
1769 parameters.codecs.push_back(kPcmuCodec);
1770 parameters.codecs[0].id = 127;
1771 parameters.codecs[0].params[""] = "96/96";
1772 parameters.codecs[1].id = 96;
1773 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001774 EXPECT_TRUE(channel_->AddSendStream(
1775 cricket::StreamParams::CreateLegacy(kSsrc1)));
1776 webrtc::CodecInst gcodec;
1777 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1778 EXPECT_EQ(96, gcodec.pltype);
1779 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001780 EXPECT_TRUE(voe_.GetRED(channel_num));
1781 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001782}
1783
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001784// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001785TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenberg1ac56142015-10-13 03:58:19 -07001786 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001787 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001788 cricket::AudioSendParameters parameters;
1789 parameters.codecs.push_back(kRedCodec);
1790 parameters.codecs.push_back(kIsacCodec);
1791 parameters.codecs.push_back(kPcmuCodec);
1792 parameters.codecs[0].id = 127;
1793 parameters.codecs[1].id = 96;
1794 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001795 webrtc::CodecInst gcodec;
1796 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1797 EXPECT_EQ(96, gcodec.pltype);
1798 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001799 EXPECT_TRUE(voe_.GetRED(channel_num));
1800 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001801}
1802
1803// Test that we ignore RED if the parameters aren't named the way we expect.
1804TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001805 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001806 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001807 cricket::AudioSendParameters parameters;
1808 parameters.codecs.push_back(kRedCodec);
1809 parameters.codecs.push_back(kIsacCodec);
1810 parameters.codecs.push_back(kPcmuCodec);
1811 parameters.codecs[0].id = 127;
1812 parameters.codecs[0].params["ABC"] = "96/96";
1813 parameters.codecs[1].id = 96;
1814 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001815 webrtc::CodecInst gcodec;
1816 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1817 EXPECT_EQ(96, gcodec.pltype);
1818 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001819 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001820}
1821
1822// Test that we ignore RED if it uses different primary/secondary encoding.
1823TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001824 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001825 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001826 cricket::AudioSendParameters parameters;
1827 parameters.codecs.push_back(kRedCodec);
1828 parameters.codecs.push_back(kIsacCodec);
1829 parameters.codecs.push_back(kPcmuCodec);
1830 parameters.codecs[0].id = 127;
1831 parameters.codecs[0].params[""] = "96/0";
1832 parameters.codecs[1].id = 96;
1833 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001834 webrtc::CodecInst gcodec;
1835 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1836 EXPECT_EQ(96, gcodec.pltype);
1837 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001838 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001839}
1840
1841// Test that we ignore RED if it uses more than 2 encodings.
1842TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001843 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001844 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001845 cricket::AudioSendParameters parameters;
1846 parameters.codecs.push_back(kRedCodec);
1847 parameters.codecs.push_back(kIsacCodec);
1848 parameters.codecs.push_back(kPcmuCodec);
1849 parameters.codecs[0].id = 127;
1850 parameters.codecs[0].params[""] = "96/96/96";
1851 parameters.codecs[1].id = 96;
1852 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001853 webrtc::CodecInst gcodec;
1854 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1855 EXPECT_EQ(96, gcodec.pltype);
1856 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001857 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001858}
1859
1860// Test that we ignore RED if it has bogus codec ids.
1861TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001862 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001863 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001864 cricket::AudioSendParameters parameters;
1865 parameters.codecs.push_back(kRedCodec);
1866 parameters.codecs.push_back(kIsacCodec);
1867 parameters.codecs.push_back(kPcmuCodec);
1868 parameters.codecs[0].id = 127;
1869 parameters.codecs[0].params[""] = "ABC/ABC";
1870 parameters.codecs[1].id = 96;
1871 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001872 webrtc::CodecInst gcodec;
1873 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1874 EXPECT_EQ(96, gcodec.pltype);
1875 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001876 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001877}
1878
1879// Test that we ignore RED if it refers to a codec that is not present.
1880TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001881 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001882 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001883 cricket::AudioSendParameters parameters;
1884 parameters.codecs.push_back(kRedCodec);
1885 parameters.codecs.push_back(kIsacCodec);
1886 parameters.codecs.push_back(kPcmuCodec);
1887 parameters.codecs[0].id = 127;
1888 parameters.codecs[0].params[""] = "97/97";
1889 parameters.codecs[1].id = 96;
1890 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001891 webrtc::CodecInst gcodec;
1892 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1893 EXPECT_EQ(96, gcodec.pltype);
1894 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001895 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001896}
1897
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001898// Test support for audio level header extension.
1899TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1900 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001901}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001902TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1903 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1904}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001905
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001906// Test support for absolute send time header extension.
1907TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1908 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1909}
1910TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1911 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001912}
1913
solenberg1ac56142015-10-13 03:58:19 -07001914// Test that we can create a channel and start sending on it.
1915TEST_F(WebRtcVoiceEngineTestFake, Send) {
1916 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001917 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001918 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001919 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1920 EXPECT_TRUE(voe_.GetSend(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001921 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1922 EXPECT_FALSE(voe_.GetSend(channel_num));
solenberg1ac56142015-10-13 03:58:19 -07001923}
1924
1925// Test that we can create a channel and start playing out on it.
1926TEST_F(WebRtcVoiceEngineTestFake, Playout) {
1927 EXPECT_TRUE(SetupEngineWithRecvStream());
1928 int channel_num = voe_.GetLastChannel();
1929 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
1930 EXPECT_TRUE(channel_->SetPlayout(true));
1931 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001932 EXPECT_TRUE(channel_->SetPlayout(false));
1933 EXPECT_FALSE(voe_.GetPlayout(channel_num));
1934}
1935
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001936// Test that we can add and remove send streams.
1937TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
1938 SetupForMultiSendStream();
1939
Peter Boström0c4e06b2015-10-07 12:23:21 +02001940 static const uint32_t kSsrcs4[] = {1, 2, 3, 4};
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001941
1942 // Set the global state for sending.
1943 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1944
1945 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1946 EXPECT_TRUE(channel_->AddSendStream(
1947 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1948
1949 // Verify that we are in a sending state for all the created streams.
1950 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1951 EXPECT_TRUE(voe_.GetSend(channel_num));
1952 }
1953
1954 // Remove the first send channel, which is the default channel. It will only
1955 // recycle the default channel but not delete it.
1956 EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[0]));
1957 // Stream should already be Removed from the send stream list.
1958 EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[0]));
1959 // But the default still exists.
1960 EXPECT_EQ(0, voe_.GetChannelFromLocalSsrc(kSsrcs4[0]));
1961
1962 // Delete the rest of send channel streams.
1963 for (unsigned int i = 1; i < ARRAY_SIZE(kSsrcs4); ++i) {
1964 EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[i]));
1965 // Stream should already be deleted.
1966 EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[i]));
1967 EXPECT_EQ(-1, voe_.GetChannelFromLocalSsrc(kSsrcs4[i]));
1968 }
1969}
1970
1971// Test SetSendCodecs correctly configure the codecs in all send streams.
1972TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
1973 SetupForMultiSendStream();
1974
Peter Boström0c4e06b2015-10-07 12:23:21 +02001975 static const uint32_t kSsrcs4[] = {1, 2, 3, 4};
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001976 // Create send streams.
1977 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1978 EXPECT_TRUE(channel_->AddSendStream(
1979 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1980 }
1981
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001982 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001983 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001984 parameters.codecs.push_back(kIsacCodec);
1985 parameters.codecs.push_back(kCn16000Codec);
1986 parameters.codecs[1].id = 97;
1987 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001988
1989 // Verify ISAC and VAD are corrected configured on all send channels.
1990 webrtc::CodecInst gcodec;
1991 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1992 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1993 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1994 EXPECT_STREQ("ISAC", gcodec.plname);
1995 EXPECT_TRUE(voe_.GetVAD(channel_num));
1996 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1997 }
1998
1999 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002000 parameters.codecs[0] = kPcmuCodec;
2001 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002002 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
2003 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
2004 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2005 EXPECT_STREQ("PCMU", gcodec.plname);
2006 EXPECT_FALSE(voe_.GetVAD(channel_num));
2007 }
2008}
2009
2010// Test we can SetSend on all send streams correctly.
2011TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2012 SetupForMultiSendStream();
2013
Peter Boström0c4e06b2015-10-07 12:23:21 +02002014 static const uint32_t kSsrcs4[] = {1, 2, 3, 4};
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002015 // Create the send channels and they should be a SEND_NOTHING date.
2016 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
2017 EXPECT_TRUE(channel_->AddSendStream(
2018 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
2019 int channel_num = voe_.GetLastChannel();
2020 EXPECT_FALSE(voe_.GetSend(channel_num));
2021 }
2022
2023 // Set the global state for starting sending.
2024 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2025 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
2026 // Verify that we are in a sending state for all the send streams.
2027 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
2028 EXPECT_TRUE(voe_.GetSend(channel_num));
2029 }
2030
2031 // Set the global state for stopping sending.
2032 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2033 for (unsigned int i = 1; i < ARRAY_SIZE(kSsrcs4); ++i) {
2034 // Verify that we are in a stop state for all the send streams.
2035 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
2036 EXPECT_FALSE(voe_.GetSend(channel_num));
2037 }
2038}
2039
2040// Test we can set the correct statistics on all send streams.
2041TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2042 SetupForMultiSendStream();
2043
Peter Boström0c4e06b2015-10-07 12:23:21 +02002044 static const uint32_t kSsrcs4[] = {1, 2, 3, 4};
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002045 // Create send streams.
2046 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
2047 EXPECT_TRUE(channel_->AddSendStream(
2048 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
2049 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002050 // Create a receive stream to check that none of the send streams end up in
2051 // the receive stream stats.
2052 EXPECT_TRUE(channel_->AddRecvStream(
2053 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002054 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002055 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2056 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002057
2058 cricket::VoiceMediaInfo info;
2059 EXPECT_EQ(true, channel_->GetStats(&info));
2060 EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size());
2061
2062 // Verify the statistic information is correct.
2063 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +00002064 EXPECT_EQ(kSsrcs4[i], info.senders[i].ssrc());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002065 EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
2066 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].bytes_sent);
2067 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_sent);
2068 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_lost);
2069 EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[i].fraction_lost);
2070 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].ext_seqnum);
2071 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].rtt_ms);
2072 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].jitter_ms);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002073 EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002074 }
solenberg1ac56142015-10-13 03:58:19 -07002075
Fredrik Solenberga4577522015-10-20 15:01:35 +02002076 // We have added one receive stream. We should see empty stats.
2077 EXPECT_EQ(info.receivers.size(), 1u);
2078 EXPECT_EQ(info.receivers[0].local_stats.front().ssrc, 0);
2079
2080 // Remove the kSsrc2 stream. No receiver stats.
2081 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002082 EXPECT_EQ(true, channel_->GetStats(&info));
solenberg1ac56142015-10-13 03:58:19 -07002083 EXPECT_EQ(0u, info.receivers.size());
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002084
Fredrik Solenberga4577522015-10-20 15:01:35 +02002085 // Deliver a new packet - a default receive stream should be created and we
2086 // should see stats again.
solenberg1ac56142015-10-13 03:58:19 -07002087 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberga4577522015-10-20 15:01:35 +02002088 SetAudioReceiveStreamStats();
solenberg1ac56142015-10-13 03:58:19 -07002089 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002090 EXPECT_EQ(1u, info.receivers.size());
Fredrik Solenberga4577522015-10-20 15:01:35 +02002091 VerifyVoiceReceiverInfo(info.receivers[0]);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002092}
2093
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002094// Test that we can add and remove receive streams, and do proper send/playout.
2095// We can receive on multiple streams while sending one stream.
2096TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002097 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002098 int channel_num1 = voe_.GetLastChannel();
2099
solenberg1ac56142015-10-13 03:58:19 -07002100 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002101 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002102 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002103 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002104
solenberg1ac56142015-10-13 03:58:19 -07002105 // Adding another stream should enable playout on the new stream only.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002106 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2107 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002108 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2109 EXPECT_TRUE(voe_.GetSend(channel_num1));
2110 EXPECT_FALSE(voe_.GetSend(channel_num2));
2111
solenberg1ac56142015-10-13 03:58:19 -07002112 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002113 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2114 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2115
2116 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2117 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2118 int channel_num3 = voe_.GetLastChannel();
2119 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2120 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2121 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2122 EXPECT_FALSE(voe_.GetSend(channel_num3));
2123
2124 // Stop sending.
2125 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2126 EXPECT_FALSE(voe_.GetSend(channel_num1));
2127 EXPECT_FALSE(voe_.GetSend(channel_num2));
2128 EXPECT_FALSE(voe_.GetSend(channel_num3));
2129
2130 // Stop playout.
2131 EXPECT_TRUE(channel_->SetPlayout(false));
2132 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2133 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2134 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2135
solenberg1ac56142015-10-13 03:58:19 -07002136 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002137 EXPECT_TRUE(channel_->SetPlayout(true));
2138 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2139 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2140 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2141
solenberg1ac56142015-10-13 03:58:19 -07002142 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002143 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2144 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002145 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002146}
2147
2148// Test that we can set the devices to use.
2149TEST_F(WebRtcVoiceEngineTestFake, SetDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002150 EXPECT_TRUE(SetupEngineWithSendStream());
2151 int send_channel = voe_.GetLastChannel();
2152 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2153 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002154 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002155
2156 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2157 cricket::kFakeDefaultDeviceId);
2158 cricket::Device dev(cricket::kFakeDeviceName,
2159 cricket::kFakeDeviceId);
2160
2161 // Test SetDevices() while not sending or playing.
2162 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2163
2164 // Test SetDevices() while sending and playing.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002165 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2166 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002167 EXPECT_TRUE(voe_.GetSend(send_channel));
2168 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002169
2170 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2171
solenberg1ac56142015-10-13 03:58:19 -07002172 EXPECT_TRUE(voe_.GetSend(send_channel));
2173 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002174
2175 // Test that failure to open newly selected devices does not prevent opening
2176 // ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002177 voe_.set_playout_fail_channel(recv_channel);
2178 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002179
2180 EXPECT_FALSE(engine_.SetDevices(&default_dev, &default_dev));
2181
solenberg1ac56142015-10-13 03:58:19 -07002182 EXPECT_FALSE(voe_.GetSend(send_channel));
2183 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002184
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002185 voe_.set_playout_fail_channel(-1);
2186 voe_.set_send_fail_channel(-1);
2187
2188 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2189
solenberg1ac56142015-10-13 03:58:19 -07002190 EXPECT_TRUE(voe_.GetSend(send_channel));
2191 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002192}
2193
2194// Test that we can set the devices to use even if we failed to
2195// open the initial ones.
2196TEST_F(WebRtcVoiceEngineTestFake, SetDevicesWithInitiallyBadDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002197 EXPECT_TRUE(SetupEngineWithSendStream());
2198 int send_channel = voe_.GetLastChannel();
2199 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2200 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002201 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002202
2203 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2204 cricket::kFakeDefaultDeviceId);
2205 cricket::Device dev(cricket::kFakeDeviceName,
2206 cricket::kFakeDeviceId);
2207
2208 // Test that failure to open devices selected before starting
2209 // send/play does not prevent opening newly selected ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002210 voe_.set_playout_fail_channel(recv_channel);
2211 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002212
2213 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2214
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002215 EXPECT_FALSE(channel_->SetSend(cricket::SEND_MICROPHONE));
2216 EXPECT_FALSE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002217 EXPECT_FALSE(voe_.GetSend(send_channel));
2218 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002219
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002220 voe_.set_playout_fail_channel(-1);
2221 voe_.set_send_fail_channel(-1);
2222
2223 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2224
solenberg1ac56142015-10-13 03:58:19 -07002225 EXPECT_TRUE(voe_.GetSend(send_channel));
2226 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002227}
2228
2229// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002230// and start sending on it.
2231TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2232 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002233 int channel_num = voe_.GetLastChannel();
2234 webrtc::AgcConfig agc_config;
2235 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2236 EXPECT_EQ(0, agc_config.targetLeveldBOv);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002237 send_parameters_.options = options_adjust_agc_;
2238 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002239 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2240 EXPECT_TRUE(voe_.GetSend(channel_num));
2241 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2242 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002243 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2244 EXPECT_FALSE(voe_.GetSend(channel_num));
2245 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2246 EXPECT_EQ(0, agc_config.targetLeveldBOv); // level was restored
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002247}
2248
wu@webrtc.org97077a32013-10-25 21:18:33 +00002249TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002250 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002251 webrtc::AgcConfig agc_config;
2252 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2253 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2254
2255 cricket::AudioOptions options;
2256 options.tx_agc_target_dbov.Set(3);
2257 options.tx_agc_digital_compression_gain.Set(9);
2258 options.tx_agc_limiter.Set(true);
2259 options.auto_gain_control.Set(true);
2260 EXPECT_TRUE(engine_.SetOptions(options));
2261
2262 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2263 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2264 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2265 EXPECT_TRUE(agc_config.limiterEnable);
2266
2267 // Check interaction with adjust_agc_delta. Both should be respected, for
2268 // backwards compatibility.
2269 options.adjust_agc_delta.Set(-10);
2270 EXPECT_TRUE(engine_.SetOptions(options));
2271
2272 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2273 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2274}
2275
wu@webrtc.org97077a32013-10-25 21:18:33 +00002276TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002277 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002278 cricket::AudioOptions options;
2279 options.recording_sample_rate.Set(48000u);
2280 options.playout_sample_rate.Set(44100u);
2281 EXPECT_TRUE(engine_.SetOptions(options));
2282
2283 unsigned int recording_sample_rate, playout_sample_rate;
2284 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2285 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2286 EXPECT_EQ(48000u, recording_sample_rate);
2287 EXPECT_EQ(44100u, playout_sample_rate);
2288}
2289
2290TEST_F(WebRtcVoiceEngineTestFake, TraceFilterViaTraceOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002291 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002292 engine_.SetLogging(rtc::LS_INFO, "");
wu@webrtc.org97077a32013-10-25 21:18:33 +00002293 EXPECT_EQ(
2294 // Info:
2295 webrtc::kTraceStateInfo | webrtc::kTraceInfo |
2296 // Warning:
2297 webrtc::kTraceTerseInfo | webrtc::kTraceWarning |
2298 // Error:
2299 webrtc::kTraceError | webrtc::kTraceCritical,
2300 static_cast<int>(trace_wrapper_->filter_));
2301 // Now set it explicitly
2302 std::string filter =
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002303 "tracefilter " + rtc::ToString(webrtc::kTraceDefault);
2304 engine_.SetLogging(rtc::LS_VERBOSE, filter.c_str());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002305 EXPECT_EQ(static_cast<unsigned int>(webrtc::kTraceDefault),
2306 trace_wrapper_->filter_);
2307}
2308
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002309// Test that we can set the outgoing SSRC properly.
2310// SSRC is set in SetupEngine by calling AddSendStream.
2311TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002312 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002313 int channel_num = voe_.GetLastChannel();
2314 unsigned int send_ssrc;
2315 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
2316 EXPECT_NE(0U, send_ssrc);
2317 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
2318 EXPECT_EQ(kSsrc1, send_ssrc);
2319}
2320
2321TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2322 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002323 EXPECT_TRUE(SetupEngineWithSendStream());
2324 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2325 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002326 EXPECT_TRUE(channel_->AddRecvStream(
2327 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002328 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2329 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002330
2331 cricket::VoiceMediaInfo info;
2332 EXPECT_EQ(true, channel_->GetStats(&info));
2333 EXPECT_EQ(1u, info.senders.size());
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +00002334 EXPECT_EQ(kSsrc1, info.senders[0].ssrc());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002335 EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
2336 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].bytes_sent);
2337 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_sent);
2338 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_lost);
2339 EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[0].fraction_lost);
2340 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].ext_seqnum);
2341 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].rtt_ms);
2342 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].jitter_ms);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002343 EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002344 // TODO(sriniv): Add testing for more fields. These are not populated
2345 // in FakeWebrtcVoiceEngine yet.
2346 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].audio_level);
2347 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_median_ms);
2348 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_std_ms);
2349 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_return_loss);
2350 // EXPECT_EQ(cricket::kIntStatValue,
2351 // info.senders[0].echo_return_loss_enhancement);
Fredrik Solenberga4577522015-10-20 15:01:35 +02002352 // We have added one receive stream. We should see empty stats.
2353 EXPECT_EQ(info.receivers.size(), 1u);
2354 EXPECT_EQ(info.receivers[0].local_stats.front().ssrc, 0);
solenberg1ac56142015-10-13 03:58:19 -07002355
Fredrik Solenberga4577522015-10-20 15:01:35 +02002356 // Remove the kSsrc2 stream. No receiver stats.
2357 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07002358 EXPECT_EQ(true, channel_->GetStats(&info));
2359 EXPECT_EQ(0u, info.receivers.size());
2360
Fredrik Solenberga4577522015-10-20 15:01:35 +02002361 // Deliver a new packet - a default receive stream should be created and we
2362 // should see stats again.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002363 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberga4577522015-10-20 15:01:35 +02002364 SetAudioReceiveStreamStats();
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002365 EXPECT_EQ(true, channel_->GetStats(&info));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002366 EXPECT_EQ(1u, info.receivers.size());
Fredrik Solenberga4577522015-10-20 15:01:35 +02002367 VerifyVoiceReceiverInfo(info.receivers[0]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002368}
2369
2370// Test that we can set the outgoing SSRC properly with multiple streams.
2371// SSRC is set in SetupEngine by calling AddSendStream.
2372TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002373 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002374 int channel_num1 = voe_.GetLastChannel();
2375 unsigned int send_ssrc;
2376 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num1, send_ssrc));
2377 EXPECT_EQ(kSsrc1, send_ssrc);
2378
2379 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2380 int channel_num2 = voe_.GetLastChannel();
2381 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num2, send_ssrc));
2382 EXPECT_EQ(kSsrc1, send_ssrc);
2383}
2384
2385// Test that the local SSRC is the same on sending and receiving channels if the
2386// receive channel is created before the send channel.
2387TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002388 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002389 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002390
2391 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2392 int receive_channel_num = voe_.GetLastChannel();
2393 EXPECT_TRUE(channel_->AddSendStream(
2394 cricket::StreamParams::CreateLegacy(1234)));
2395 int send_channel_num = voe_.GetLastChannel();
2396
2397 unsigned int ssrc = 0;
2398 EXPECT_EQ(0, voe_.GetLocalSSRC(send_channel_num, ssrc));
2399 EXPECT_EQ(1234U, ssrc);
2400 ssrc = 0;
2401 EXPECT_EQ(0, voe_.GetLocalSSRC(receive_channel_num, ssrc));
2402 EXPECT_EQ(1234U, ssrc);
2403}
2404
2405// Test that we can properly receive packets.
2406TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2407 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002408 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002409 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002410 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame,
2411 sizeof(kPcmuFrame)));
2412}
2413
2414// Test that we can properly receive packets on multiple streams.
2415TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002416 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002417 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002418 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2419 int channel_num1 = voe_.GetLastChannel();
2420 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2421 int channel_num2 = voe_.GetLastChannel();
2422 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2423 int channel_num3 = voe_.GetLastChannel();
2424 // Create packets with the right SSRCs.
2425 char packets[4][sizeof(kPcmuFrame)];
2426 for (size_t i = 0; i < ARRAY_SIZE(packets); ++i) {
2427 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002428 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002429 }
2430 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2431 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2432 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2433 DeliverPacket(packets[0], sizeof(packets[0]));
2434 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2435 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2436 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2437 DeliverPacket(packets[1], sizeof(packets[1]));
2438 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1],
2439 sizeof(packets[1])));
2440 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2441 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2442 DeliverPacket(packets[2], sizeof(packets[2]));
2443 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2444 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2],
2445 sizeof(packets[2])));
2446 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2447 DeliverPacket(packets[3], sizeof(packets[3]));
2448 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2449 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2450 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3],
2451 sizeof(packets[3])));
2452 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2453 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2454 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2455}
2456
2457// Test that we properly handle failures to add a stream.
2458TEST_F(WebRtcVoiceEngineTestFake, AddStreamFail) {
solenberg1ac56142015-10-13 03:58:19 -07002459 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002460 voe_.set_fail_create_channel(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002461 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002462 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002463}
2464
solenberg1ac56142015-10-13 03:58:19 -07002465// Test that AddRecvStream creates new stream.
2466TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2467 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002468 int channel_num = voe_.GetLastChannel();
2469 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002470 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002471}
2472
2473// Test that after adding a recv stream, we do not decode more codecs than
2474// those previously passed into SetRecvCodecs.
2475TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002476 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002477 cricket::AudioRecvParameters parameters;
2478 parameters.codecs.push_back(kIsacCodec);
2479 parameters.codecs.push_back(kPcmuCodec);
2480 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002481 EXPECT_TRUE(channel_->AddRecvStream(
2482 cricket::StreamParams::CreateLegacy(kSsrc1)));
2483 int channel_num2 = voe_.GetLastChannel();
2484 webrtc::CodecInst gcodec;
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002485 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "opus");
2486 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002487 gcodec.channels = 2;
2488 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2489}
2490
2491// Test that we properly clean up any streams that were added, even if
2492// not explicitly removed.
2493TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002494 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002495 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002496 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2497 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2498 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2499 delete channel_;
2500 channel_ = NULL;
2501 EXPECT_EQ(0, voe_.GetNumChannels());
2502}
2503
wu@webrtc.org78187522013-10-07 23:32:02 +00002504TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002505 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002506 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2507}
2508
2509TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2510 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002511 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002512 // Manually delete channel to simulate a failure.
2513 int channel = voe_.GetLastChannel();
2514 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2515 // Add recv stream 2 should work.
2516 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002517 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002518 EXPECT_NE(channel, new_channel);
2519 // The last created channel is deleted too.
2520 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002521}
2522
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002523// Test the InsertDtmf on default send stream as caller.
2524TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2525 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002526}
2527
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002528// Test the InsertDtmf on default send stream as callee
2529TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2530 TestInsertDtmf(0, false);
2531}
2532
2533// Test the InsertDtmf on specified send stream as caller.
2534TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2535 TestInsertDtmf(kSsrc1, true);
2536}
2537
2538// Test the InsertDtmf on specified send stream as callee.
2539TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2540 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002541}
2542
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002543TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002544 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002545 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002546 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2547 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2548 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2549 EXPECT_TRUE(channel_->SetPlayout(true));
2550 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2551 EXPECT_TRUE(channel_->SetPlayout(false));
2552 EXPECT_FALSE(channel_->SetPlayout(true));
2553}
2554
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002555TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002556 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002557
2558 bool ec_enabled;
2559 webrtc::EcModes ec_mode;
2560 bool ec_metrics_enabled;
2561 webrtc::AecmModes aecm_mode;
2562 bool cng_enabled;
2563 bool agc_enabled;
2564 webrtc::AgcModes agc_mode;
2565 webrtc::AgcConfig agc_config;
2566 bool ns_enabled;
2567 webrtc::NsModes ns_mode;
2568 bool highpass_filter_enabled;
2569 bool stereo_swapping_enabled;
2570 bool typing_detection_enabled;
2571 voe_.GetEcStatus(ec_enabled, ec_mode);
2572 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2573 voe_.GetAecmMode(aecm_mode, cng_enabled);
2574 voe_.GetAgcStatus(agc_enabled, agc_mode);
2575 voe_.GetAgcConfig(agc_config);
2576 voe_.GetNsStatus(ns_enabled, ns_mode);
2577 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2578 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2579 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2580 EXPECT_TRUE(ec_enabled);
2581 EXPECT_TRUE(ec_metrics_enabled);
2582 EXPECT_FALSE(cng_enabled);
2583 EXPECT_TRUE(agc_enabled);
2584 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2585 EXPECT_TRUE(ns_enabled);
2586 EXPECT_TRUE(highpass_filter_enabled);
2587 EXPECT_FALSE(stereo_swapping_enabled);
2588 EXPECT_TRUE(typing_detection_enabled);
2589 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2590 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2591
2592 // Nothing set, so all ignored.
2593 cricket::AudioOptions options;
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002594 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002595 voe_.GetEcStatus(ec_enabled, ec_mode);
2596 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2597 voe_.GetAecmMode(aecm_mode, cng_enabled);
2598 voe_.GetAgcStatus(agc_enabled, agc_mode);
2599 voe_.GetAgcConfig(agc_config);
2600 voe_.GetNsStatus(ns_enabled, ns_mode);
2601 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2602 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2603 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2604 EXPECT_TRUE(ec_enabled);
2605 EXPECT_TRUE(ec_metrics_enabled);
2606 EXPECT_FALSE(cng_enabled);
2607 EXPECT_TRUE(agc_enabled);
2608 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2609 EXPECT_TRUE(ns_enabled);
2610 EXPECT_TRUE(highpass_filter_enabled);
2611 EXPECT_FALSE(stereo_swapping_enabled);
2612 EXPECT_TRUE(typing_detection_enabled);
2613 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2614 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
Henrik Lundin64dad832015-05-11 12:44:23 +02002615 EXPECT_EQ(50, voe_.GetNetEqCapacity()); // From GetDefaultEngineOptions().
Henrik Lundin5263b3c2015-06-01 10:29:41 +02002616 EXPECT_FALSE(
2617 voe_.GetNetEqFastAccelerate()); // From GetDefaultEngineOptions().
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002618
2619 // Turn echo cancellation off
2620 options.echo_cancellation.Set(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002621 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002622 voe_.GetEcStatus(ec_enabled, ec_mode);
2623 EXPECT_FALSE(ec_enabled);
2624
2625 // Turn echo cancellation back on, with settings, and make sure
2626 // nothing else changed.
2627 options.echo_cancellation.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002628 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002629 voe_.GetEcStatus(ec_enabled, ec_mode);
2630 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2631 voe_.GetAecmMode(aecm_mode, cng_enabled);
2632 voe_.GetAgcStatus(agc_enabled, agc_mode);
2633 voe_.GetAgcConfig(agc_config);
2634 voe_.GetNsStatus(ns_enabled, ns_mode);
2635 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2636 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2637 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2638 EXPECT_TRUE(ec_enabled);
2639 EXPECT_TRUE(ec_metrics_enabled);
2640 EXPECT_TRUE(agc_enabled);
2641 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2642 EXPECT_TRUE(ns_enabled);
2643 EXPECT_TRUE(highpass_filter_enabled);
2644 EXPECT_FALSE(stereo_swapping_enabled);
2645 EXPECT_TRUE(typing_detection_enabled);
2646 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2647 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2648
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002649 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2650 // control.
2651 options.delay_agnostic_aec.Set(true);
2652 ASSERT_TRUE(engine_.SetOptions(options));
2653 voe_.GetEcStatus(ec_enabled, ec_mode);
2654 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2655 voe_.GetAecmMode(aecm_mode, cng_enabled);
2656 EXPECT_TRUE(ec_enabled);
2657 EXPECT_TRUE(ec_metrics_enabled);
2658 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2659
2660 // Turn off echo cancellation and delay agnostic aec.
2661 options.delay_agnostic_aec.Set(false);
Henrik Lundin441f6342015-06-09 16:03:13 +02002662 options.extended_filter_aec.Set(false);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002663 options.echo_cancellation.Set(false);
2664 ASSERT_TRUE(engine_.SetOptions(options));
2665 voe_.GetEcStatus(ec_enabled, ec_mode);
2666 EXPECT_FALSE(ec_enabled);
2667 // Turning delay agnostic aec back on should also turn on echo cancellation.
2668 options.delay_agnostic_aec.Set(true);
2669 ASSERT_TRUE(engine_.SetOptions(options));
2670 voe_.GetEcStatus(ec_enabled, ec_mode);
2671 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2672 EXPECT_TRUE(ec_enabled);
2673 EXPECT_TRUE(ec_metrics_enabled);
2674 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2675
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002676 // Turn off AGC
2677 options.auto_gain_control.Set(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002678 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002679 voe_.GetAgcStatus(agc_enabled, agc_mode);
2680 EXPECT_FALSE(agc_enabled);
2681
2682 // Turn AGC back on
2683 options.auto_gain_control.Set(true);
2684 options.adjust_agc_delta.Clear();
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002685 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002686 voe_.GetAgcStatus(agc_enabled, agc_mode);
2687 EXPECT_TRUE(agc_enabled);
2688 voe_.GetAgcConfig(agc_config);
2689 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2690
2691 // Turn off other options (and stereo swapping on).
2692 options.noise_suppression.Set(false);
2693 options.highpass_filter.Set(false);
2694 options.typing_detection.Set(false);
2695 options.stereo_swapping.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002696 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002697 voe_.GetNsStatus(ns_enabled, ns_mode);
2698 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2699 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2700 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2701 EXPECT_FALSE(ns_enabled);
2702 EXPECT_FALSE(highpass_filter_enabled);
2703 EXPECT_FALSE(typing_detection_enabled);
2704 EXPECT_TRUE(stereo_swapping_enabled);
2705
solenberg1ac56142015-10-13 03:58:19 -07002706 // Set options again to ensure it has no impact.
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002707 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002708 voe_.GetEcStatus(ec_enabled, ec_mode);
2709 voe_.GetNsStatus(ns_enabled, ns_mode);
2710 EXPECT_TRUE(ec_enabled);
2711 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2712 EXPECT_FALSE(ns_enabled);
2713 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2714}
2715
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002716TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002717 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002718
2719 bool ec_enabled;
2720 webrtc::EcModes ec_mode;
2721 bool ec_metrics_enabled;
2722 bool agc_enabled;
2723 webrtc::AgcModes agc_mode;
2724 bool ns_enabled;
2725 webrtc::NsModes ns_mode;
2726 bool highpass_filter_enabled;
2727 bool stereo_swapping_enabled;
2728 bool typing_detection_enabled;
2729
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002730 voe_.GetEcStatus(ec_enabled, ec_mode);
2731 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2732 voe_.GetAgcStatus(agc_enabled, agc_mode);
2733 voe_.GetNsStatus(ns_enabled, ns_mode);
2734 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2735 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2736 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2737 EXPECT_TRUE(ec_enabled);
2738 EXPECT_TRUE(agc_enabled);
2739 EXPECT_TRUE(ns_enabled);
2740 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002741 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002742 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002743}
2744
2745TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2746 webrtc::AgcConfig set_config = {0};
2747 set_config.targetLeveldBOv = 3;
2748 set_config.digitalCompressionGaindB = 9;
2749 set_config.limiterEnable = true;
2750 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002751 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002752
2753 webrtc::AgcConfig config = {0};
2754 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2755 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2756 EXPECT_EQ(set_config.digitalCompressionGaindB,
2757 config.digitalCompressionGaindB);
2758 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2759}
2760
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002761TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002762 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg66f43392015-09-09 01:36:22 -07002763 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2764 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002765 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002766 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2767 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002768 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002769
2770 // Have to add a stream to make SetSend work.
2771 cricket::StreamParams stream1;
2772 stream1.ssrcs.push_back(1);
2773 channel1->AddSendStream(stream1);
2774 cricket::StreamParams stream2;
2775 stream2.ssrcs.push_back(2);
2776 channel2->AddSendStream(stream2);
2777
2778 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002779 cricket::AudioSendParameters parameters_options_all = send_parameters_;
2780 parameters_options_all.options.echo_cancellation.Set(true);
2781 parameters_options_all.options.auto_gain_control.Set(true);
2782 parameters_options_all.options.noise_suppression.Set(true);
2783 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2784 EXPECT_EQ(parameters_options_all.options, channel1->options());
2785 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2786 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002787
2788 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002789 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
2790 parameters_options_no_ns.options.noise_suppression.Set(false);
2791 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2792 cricket::AudioOptions expected_options = parameters_options_all.options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002793 expected_options.echo_cancellation.Set(true);
2794 expected_options.auto_gain_control.Set(true);
2795 expected_options.noise_suppression.Set(false);
solenberg66f43392015-09-09 01:36:22 -07002796 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002797
2798 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002799 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
2800 parameters_options_no_agc.options.auto_gain_control.Set(false);
2801 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002802 expected_options.echo_cancellation.Set(true);
2803 expected_options.auto_gain_control.Set(false);
2804 expected_options.noise_suppression.Set(true);
solenberg66f43392015-09-09 01:36:22 -07002805 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002806
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002807 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002808 bool ec_enabled;
2809 webrtc::EcModes ec_mode;
2810 bool agc_enabled;
2811 webrtc::AgcModes agc_mode;
2812 bool ns_enabled;
2813 webrtc::NsModes ns_mode;
2814 voe_.GetEcStatus(ec_enabled, ec_mode);
2815 voe_.GetAgcStatus(agc_enabled, agc_mode);
2816 voe_.GetNsStatus(ns_enabled, ns_mode);
2817 EXPECT_TRUE(ec_enabled);
2818 EXPECT_TRUE(agc_enabled);
2819 EXPECT_TRUE(ns_enabled);
2820
2821 channel1->SetSend(cricket::SEND_MICROPHONE);
2822 voe_.GetEcStatus(ec_enabled, ec_mode);
2823 voe_.GetAgcStatus(agc_enabled, agc_mode);
2824 voe_.GetNsStatus(ns_enabled, ns_mode);
2825 EXPECT_TRUE(ec_enabled);
2826 EXPECT_TRUE(agc_enabled);
2827 EXPECT_FALSE(ns_enabled);
2828
2829 channel1->SetSend(cricket::SEND_NOTHING);
2830 voe_.GetEcStatus(ec_enabled, ec_mode);
2831 voe_.GetAgcStatus(agc_enabled, agc_mode);
2832 voe_.GetNsStatus(ns_enabled, ns_mode);
2833 EXPECT_TRUE(ec_enabled);
2834 EXPECT_TRUE(agc_enabled);
2835 EXPECT_TRUE(ns_enabled);
2836
2837 channel2->SetSend(cricket::SEND_MICROPHONE);
2838 voe_.GetEcStatus(ec_enabled, ec_mode);
2839 voe_.GetAgcStatus(agc_enabled, agc_mode);
2840 voe_.GetNsStatus(ns_enabled, ns_mode);
2841 EXPECT_TRUE(ec_enabled);
2842 EXPECT_FALSE(agc_enabled);
2843 EXPECT_TRUE(ns_enabled);
2844
2845 channel2->SetSend(cricket::SEND_NOTHING);
2846 voe_.GetEcStatus(ec_enabled, ec_mode);
2847 voe_.GetAgcStatus(agc_enabled, agc_mode);
2848 voe_.GetNsStatus(ns_enabled, ns_mode);
2849 EXPECT_TRUE(ec_enabled);
2850 EXPECT_TRUE(agc_enabled);
2851 EXPECT_TRUE(ns_enabled);
2852
2853 // Make sure settings take effect while we are sending.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002854 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
2855 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2856 send_parameters_;
2857 parameters_options_no_agc_nor_ns.options.auto_gain_control.Set(false);
2858 parameters_options_no_agc_nor_ns.options.noise_suppression.Set(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002859 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002860 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002861 expected_options.echo_cancellation.Set(true);
2862 expected_options.auto_gain_control.Set(false);
2863 expected_options.noise_suppression.Set(false);
solenberg66f43392015-09-09 01:36:22 -07002864 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002865 voe_.GetEcStatus(ec_enabled, ec_mode);
2866 voe_.GetAgcStatus(agc_enabled, agc_mode);
2867 voe_.GetNsStatus(ns_enabled, ns_mode);
2868 EXPECT_TRUE(ec_enabled);
2869 EXPECT_FALSE(agc_enabled);
2870 EXPECT_FALSE(ns_enabled);
2871}
2872
wu@webrtc.orgde305012013-10-31 15:40:38 +00002873// This test verifies DSCP settings are properly applied on voice media channel.
2874TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002875 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002876 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002877 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002878 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00002879 new cricket::FakeNetworkInterface);
2880 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002881 cricket::AudioSendParameters parameters = send_parameters_;
2882 parameters.options.dscp.Set(true);
2883 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002884 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00002885 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002886 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002887 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002888 parameters.options.dscp.Set(false);
2889 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002890 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00002891}
2892
solenberg1ac56142015-10-13 03:58:19 -07002893TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002894 EXPECT_TRUE(SetupEngine());
2895 cricket::WebRtcVoiceMediaChannel* media_channel =
2896 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002897 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2898 EXPECT_TRUE(channel_->AddRecvStream(
2899 cricket::StreamParams::CreateLegacy(kSsrc1)));
2900 int channel_id = voe_.GetLastChannel();
2901 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2902 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2903 EXPECT_TRUE(channel_->AddRecvStream(
2904 cricket::StreamParams::CreateLegacy(kSsrc2)));
2905 int channel_id2 = voe_.GetLastChannel();
2906 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002907}
2908
solenberg1ac56142015-10-13 03:58:19 -07002909TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002910 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002911 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002912 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2913 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2914 EXPECT_TRUE(channel_->AddSendStream(
2915 cricket::StreamParams::CreateLegacy(kSsrc1)));
2916 int channel_id = voe_.GetLastChannel();
2917 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2918 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2919 EXPECT_TRUE(channel_->AddSendStream(
2920 cricket::StreamParams::CreateLegacy(kSsrc2)));
2921 int channel_id2 = voe_.GetLastChannel();
2922 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002923}
2924
solenberg4bac9c52015-10-09 02:32:53 -07002925TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002926 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002927 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002928 cricket::StreamParams stream;
2929 stream.ssrcs.push_back(kSsrc2);
2930 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002931 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002932 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002933 float scale = 0;
2934 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2935 EXPECT_DOUBLE_EQ(3, scale);
2936}
2937
2938TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
2939 EXPECT_TRUE(SetupEngine());
2940 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2941 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2942 int channel_id = voe_.GetLastChannel();
2943 float scale = 0;
2944 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2945 EXPECT_DOUBLE_EQ(2, scale);
2946 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07002947 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002948 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002949}
2950
pbos8fc7fa72015-07-15 08:02:58 -07002951TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02002952 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07002953 const std::string kSyncLabel = "AvSyncLabel";
2954
solenberg1ac56142015-10-13 03:58:19 -07002955 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07002956 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
2957 sp.sync_label = kSyncLabel;
2958 // Creating two channels to make sure that sync label is set properly for both
2959 // the default voice channel and following ones.
2960 EXPECT_TRUE(channel_->AddRecvStream(sp));
2961 sp.ssrcs[0] += 1;
2962 EXPECT_TRUE(channel_->AddRecvStream(sp));
2963
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002964 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07002965 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002966 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002967 << "SyncGroup should be set based on sync_label";
2968 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002969 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002970 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07002971}
2972
pbos6bb1b6e2015-07-24 07:10:18 -07002973TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002974 // Test that changing the combined_audio_video_bwe option results in the
2975 // expected state changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002976 std::vector<uint32_t> ssrcs;
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002977 ssrcs.push_back(223);
2978 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002979
solenberg1ac56142015-10-13 03:58:19 -07002980 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002981 cricket::WebRtcVoiceMediaChannel* media_channel =
2982 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02002983 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002984 EXPECT_TRUE(media_channel->AddRecvStream(
2985 cricket::StreamParams::CreateLegacy(ssrc)));
2986 }
2987 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002988
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002989 // Combined BWE should be disabled.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002990 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002991 const auto* s = call_.GetAudioReceiveStream(ssrc);
2992 EXPECT_NE(nullptr, s);
2993 EXPECT_EQ(false, s->GetConfig().combined_audio_video_bwe);
2994 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002995
2996 // Enable combined BWE option - now it should be set up.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002997 send_parameters_.options.combined_audio_video_bwe.Set(true);
2998 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002999 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003000 const auto* s = call_.GetAudioReceiveStream(ssrc);
3001 EXPECT_NE(nullptr, s);
3002 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
3003 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003004
3005 // Disable combined BWE option - should be disabled again.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003006 send_parameters_.options.combined_audio_video_bwe.Set(false);
3007 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003008 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003009 const auto* s = call_.GetAudioReceiveStream(ssrc);
3010 EXPECT_NE(nullptr, s);
3011 EXPECT_EQ(false, s->GetConfig().combined_audio_video_bwe);
3012 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003013
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003014 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003015}
3016
pbos6bb1b6e2015-07-24 07:10:18 -07003017TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003018 // Test that adding receive streams after enabling combined bandwidth
3019 // estimation will correctly configure each channel.
solenberg1ac56142015-10-13 03:58:19 -07003020 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003021 cricket::WebRtcVoiceMediaChannel* media_channel =
3022 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003023 send_parameters_.options.combined_audio_video_bwe.Set(true);
3024 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003025
Peter Boström0c4e06b2015-10-07 12:23:21 +02003026 static const uint32_t kSsrcs[] = {1, 2, 3, 4};
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003027 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs); ++i) {
3028 EXPECT_TRUE(media_channel->AddRecvStream(
3029 cricket::StreamParams::CreateLegacy(kSsrcs[i])));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003030 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(kSsrcs[i]));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003031 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003032 EXPECT_EQ(ARRAY_SIZE(kSsrcs), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003033}
3034
pbos6bb1b6e2015-07-24 07:10:18 -07003035TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003036 // Test that setting the header extensions results in the expected state
3037 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003038 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003039 ssrcs.push_back(223);
3040 ssrcs.push_back(224);
3041
solenberg1ac56142015-10-13 03:58:19 -07003042 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003043 cricket::WebRtcVoiceMediaChannel* media_channel =
3044 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003045 send_parameters_.options.combined_audio_video_bwe.Set(true);
3046 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003047 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003048 EXPECT_TRUE(media_channel->AddRecvStream(
3049 cricket::StreamParams::CreateLegacy(ssrc)));
3050 }
3051
3052 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003053 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003054 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003055 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003056 EXPECT_NE(nullptr, s);
3057 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3058 }
3059
3060 // Set up receive extensions.
3061 const auto& e_exts = engine_.rtp_header_extensions();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003062 cricket::AudioRecvParameters recv_parameters;
3063 recv_parameters.extensions = e_exts;
3064 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003065 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003066 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003067 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003068 EXPECT_NE(nullptr, s);
3069 const auto& s_exts = s->GetConfig().rtp.extensions;
3070 EXPECT_EQ(e_exts.size(), s_exts.size());
3071 for (const auto& e_ext : e_exts) {
3072 for (const auto& s_ext : s_exts) {
3073 if (e_ext.id == s_ext.id) {
3074 EXPECT_EQ(e_ext.uri, s_ext.name);
3075 }
3076 }
3077 }
3078 }
3079
3080 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003081 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003082 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003083 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003084 EXPECT_NE(nullptr, s);
3085 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3086 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003087}
3088
3089TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3090 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003091 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003092 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3093 static const unsigned char kRtcp[] = {
3094 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3095 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3096 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3097 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3098 };
3099 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3100
solenberg1ac56142015-10-13 03:58:19 -07003101 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003102 cricket::WebRtcVoiceMediaChannel* media_channel =
3103 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003104 send_parameters_.options.combined_audio_video_bwe.Set(true);
3105 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003106 EXPECT_TRUE(media_channel->AddRecvStream(
3107 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3108
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003109 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003110 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003111 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003112 EXPECT_EQ(0, s->received_packets());
3113 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3114 EXPECT_EQ(1, s->received_packets());
3115 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3116 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003117}
Minyue2013aec2015-05-13 14:14:42 +02003118
solenberg1ac56142015-10-13 03:58:19 -07003119// All receive channels should be associated with the default send channel,
3120// since they do not send RTCP SR.
Minyue2013aec2015-05-13 14:14:42 +02003121TEST_F(WebRtcVoiceEngineTestFake, AssociateDefaultChannelOnConference) {
solenberg1ac56142015-10-13 03:58:19 -07003122 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003123 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003124 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003125 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3126 int recv_ch = voe_.GetLastChannel();
3127 EXPECT_NE(recv_ch, default_channel);
3128 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3129 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3130 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003131 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3132 recv_ch = voe_.GetLastChannel();
3133 EXPECT_NE(recv_ch, default_channel);
3134 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003135}
3136
3137TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003138 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003139 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003140
3141 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3142 int recv_ch = voe_.GetLastChannel();
3143
3144 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3145 int send_ch = voe_.GetLastChannel();
3146
3147 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3148 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3149 // channel of |recv_ch|.This is not a common case, since, normally, only the
3150 // default channel can be associated. However, the default is not deletable.
3151 // So we force the |recv_ch| to associate with a non-default channel.
3152 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3153 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3154
3155 EXPECT_TRUE(channel_->RemoveSendStream(2));
3156 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3157}
stefan658910c2015-09-03 05:48:32 -07003158
3159// Tests for the actual WebRtc VoE library.
3160
3161TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
3162 cricket::WebRtcVoiceEngine engine;
3163 cricket::AudioOptions options = engine.GetOptions();
3164 // The default options should have at least a few things set. We purposefully
3165 // don't check the option values here, though.
3166 EXPECT_TRUE(options.echo_cancellation.IsSet());
3167 EXPECT_TRUE(options.auto_gain_control.IsSet());
3168 EXPECT_TRUE(options.noise_suppression.IsSet());
3169}
3170
3171// Tests that the library initializes and shuts down properly.
3172TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3173 cricket::WebRtcVoiceEngine engine;
3174 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003175 rtc::scoped_ptr<webrtc::Call> call(
3176 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003177 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003178 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003179 EXPECT_TRUE(channel != nullptr);
3180 delete channel;
3181 engine.Terminate();
3182
3183 // Reinit to catch regression where VoiceEngineObserver reference is lost
3184 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3185 engine.Terminate();
3186}
3187
3188// Tests that the library is configured with the codecs we want.
3189TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
3190 cricket::WebRtcVoiceEngine engine;
3191 // Check codecs by name.
3192 EXPECT_TRUE(engine.FindCodec(
3193 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0)));
3194 EXPECT_TRUE(engine.FindCodec(
3195 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0)));
3196 EXPECT_TRUE(engine.FindCodec(
3197 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0)));
3198 // Check that name matching is case-insensitive.
3199 EXPECT_TRUE(engine.FindCodec(
3200 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0)));
3201 EXPECT_TRUE(engine.FindCodec(
3202 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0)));
3203 EXPECT_TRUE(engine.FindCodec(
3204 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0)));
3205 EXPECT_TRUE(engine.FindCodec(
3206 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0)));
3207 EXPECT_TRUE(engine.FindCodec(
3208 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0)));
3209 EXPECT_TRUE(engine.FindCodec(
3210 cricket::AudioCodec(96, "red", 8000, 0, 1, 0)));
3211 EXPECT_TRUE(engine.FindCodec(
3212 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0)));
3213 EXPECT_TRUE(engine.FindCodec(
3214 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0)));
3215 EXPECT_TRUE(engine.FindCodec(
3216 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0)));
3217 EXPECT_TRUE(engine.FindCodec(
3218 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0)));
3219 // Check codecs with an id by id.
3220 EXPECT_TRUE(engine.FindCodec(
3221 cricket::AudioCodec(0, "", 8000, 0, 1, 0))); // PCMU
3222 EXPECT_TRUE(engine.FindCodec(
3223 cricket::AudioCodec(8, "", 8000, 0, 1, 0))); // PCMA
3224 EXPECT_TRUE(engine.FindCodec(
3225 cricket::AudioCodec(9, "", 8000, 0, 1, 0))); // G722
3226 EXPECT_TRUE(engine.FindCodec(
3227 cricket::AudioCodec(13, "", 8000, 0, 1, 0))); // CN
3228 // Check sample/bitrate matching.
3229 EXPECT_TRUE(engine.FindCodec(
3230 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0)));
3231 // Check that bad codecs fail.
3232 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0)));
3233 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(88, "", 0, 0, 1, 0)));
3234 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 0, 2, 0)));
3235 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 5000, 0, 1, 0)));
3236 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 5000, 1, 0)));
3237 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3238 for (std::vector<cricket::AudioCodec>::const_iterator it =
3239 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3240 if (it->name == "CN" && it->clockrate == 16000) {
3241 EXPECT_EQ(105, it->id);
3242 } else if (it->name == "CN" && it->clockrate == 32000) {
3243 EXPECT_EQ(106, it->id);
3244 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3245 EXPECT_EQ(103, it->id);
3246 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3247 EXPECT_EQ(104, it->id);
3248 } else if (it->name == "G722" && it->clockrate == 8000) {
3249 EXPECT_EQ(9, it->id);
3250 } else if (it->name == "telephone-event") {
3251 EXPECT_EQ(126, it->id);
3252 } else if (it->name == "red") {
3253 EXPECT_EQ(127, it->id);
3254 } else if (it->name == "opus") {
3255 EXPECT_EQ(111, it->id);
3256 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3257 EXPECT_EQ("10", it->params.find("minptime")->second);
3258 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3259 EXPECT_EQ("60", it->params.find("maxptime")->second);
3260 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3261 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3262 }
3263 }
3264
3265 engine.Terminate();
3266}
3267
3268// Tests that VoE supports at least 32 channels
3269TEST(WebRtcVoiceEngineTest, Has32Channels) {
3270 cricket::WebRtcVoiceEngine engine;
3271 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003272 rtc::scoped_ptr<webrtc::Call> call(
3273 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003274
3275 cricket::VoiceMediaChannel* channels[32];
3276 int num_channels = 0;
stefan658910c2015-09-03 05:48:32 -07003277 while (num_channels < ARRAY_SIZE(channels)) {
3278 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003279 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003280 if (!channel)
3281 break;
stefan658910c2015-09-03 05:48:32 -07003282 channels[num_channels++] = channel;
3283 }
3284
3285 int expected = ARRAY_SIZE(channels);
3286 EXPECT_EQ(expected, num_channels);
3287
3288 while (num_channels > 0) {
3289 delete channels[--num_channels];
3290 }
stefan658910c2015-09-03 05:48:32 -07003291 engine.Terminate();
3292}
3293
3294// Test that we set our preferred codecs properly.
3295TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3296 cricket::WebRtcVoiceEngine engine;
3297 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003298 rtc::scoped_ptr<webrtc::Call> call(
3299 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003300 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3301 call.get());
3302 cricket::AudioRecvParameters parameters;
3303 parameters.codecs = engine.codecs();
3304 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003305}