blob: 477369e1825185798dac37d2eb5caa39e24cc816 [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
2 * libjingle
3 * Copyright 2008 Google Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000027
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000028#include "webrtc/base/byteorder.h"
29#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020030#include "webrtc/call.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000031#include "talk/media/base/constants.h"
32#include "talk/media/base/fakemediaengine.h"
wu@webrtc.orgde305012013-10-31 15:40:38 +000033#include "talk/media/base/fakenetworkinterface.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034#include "talk/media/base/fakertp.h"
Fredrik Solenberg4b60c732015-05-07 14:07:48 +020035#include "talk/media/webrtc/fakewebrtccall.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000036#include "talk/media/webrtc/fakewebrtcvoiceengine.h"
37#include "talk/media/webrtc/webrtcvoiceengine.h"
deadbeefcbecd352015-09-23 11:50:27 -070038#include "webrtc/p2p/base/faketransportcontroller.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000039#include "talk/session/media/channel.h"
40
solenberg43e83d42015-10-20 06:41:01 -070041// Tests for the WebRtcVoiceEngine/VoiceChannel code.
42
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000043using cricket::kRtpAudioLevelHeaderExtension;
44using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
45
solenberg43e83d42015-10-20 06:41:01 -070046static const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
47static const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
48static const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
49static const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
50static const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
51static const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
52static const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
53static const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
54static const cricket::AudioCodec
55 kTelephoneEventCodec(106, "telephone-event", 8000, 0, 1, 0);
56static const cricket::AudioCodec* const kAudioCodecs[] = {
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +000057 &kPcmuCodec, &kIsacCodec, &kOpusCodec, &kG722CodecVoE, &kRedCodec,
58 &kCn8000Codec, &kCn16000Codec, &kTelephoneEventCodec,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000059};
solenberg43e83d42015-10-20 06:41:01 -070060static uint32_t kSsrc1 = 0x99;
61static uint32_t kSsrc2 = 0x98;
solenbergc96df772015-10-21 13:01:53 -070062static const uint32_t kSsrcs4[] = {1, 2, 3, 4};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000063
64class FakeVoEWrapper : public cricket::VoEWrapper {
65 public:
66 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
67 : cricket::VoEWrapper(engine, // processing
68 engine, // base
69 engine, // codec
70 engine, // dtmf
henrike@webrtc.org28e20752013-07-10 00:45:36 +000071 engine, // hw
solenberg43e83d42015-10-20 06:41:01 -070072 engine, // neteq
henrike@webrtc.org28e20752013-07-10 00:45:36 +000073 engine, // network
74 engine, // rtp
solenberg43e83d42015-10-20 06:41:01 -070075 engine, // sync
henrike@webrtc.org28e20752013-07-10 00:45:36 +000076 engine) { // volume
77 }
78};
79
wu@webrtc.org97077a32013-10-25 21:18:33 +000080class FakeVoETraceWrapper : public cricket::VoETraceWrapper {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000081 public:
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +020082 int SetTraceFilter(const unsigned int filter) override {
wu@webrtc.org97077a32013-10-25 21:18:33 +000083 filter_ = filter;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000084 return 0;
85 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +020086 int SetTraceFile(const char* fileNameUTF8) override { return 0; }
87 int SetTraceCallback(webrtc::TraceCallback* callback) override { return 0; }
wu@webrtc.org97077a32013-10-25 21:18:33 +000088 unsigned int filter_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089};
90
91class WebRtcVoiceEngineTestFake : public testing::Test {
92 public:
henrike@webrtc.org28e20752013-07-10 00:45:36 +000093 WebRtcVoiceEngineTestFake()
Fredrik Solenberg709ed672015-09-15 12:26:33 +020094 : call_(webrtc::Call::Config()),
95 voe_(kAudioCodecs, ARRAY_SIZE(kAudioCodecs)),
wu@webrtc.org97077a32013-10-25 21:18:33 +000096 trace_wrapper_(new FakeVoETraceWrapper()),
Jelena Marusicc28a8962015-05-29 15:05:44 +020097 engine_(new FakeVoEWrapper(&voe_), trace_wrapper_),
98 channel_(nullptr) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +020099 send_parameters_.codecs.push_back(kPcmuCodec);
100 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000101 options_adjust_agc_.adjust_agc_delta.Set(-10);
102 }
solenberg1ac56142015-10-13 03:58:19 -0700103 bool SetupEngine() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000104 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000105 return false;
106 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200107 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200108 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000109 }
solenberg1ac56142015-10-13 03:58:19 -0700110 bool SetupEngineWithRecvStream() {
111 if (!SetupEngine()) {
112 return false;
113 }
114 return channel_->AddRecvStream(
115 cricket::StreamParams::CreateLegacy(kSsrc1));
116 }
117 bool SetupEngineWithSendStream() {
118 if (!SetupEngine()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000119 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000120 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000121 return channel_->AddSendStream(
122 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000123 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000124 void SetupForMultiSendStream() {
solenberg1ac56142015-10-13 03:58:19 -0700125 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700126 // Remove stream added in Setup.
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000127 int default_channel_num = voe_.GetLastChannel();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200128 uint32_t default_send_ssrc = 0u;
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000129 EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
130 EXPECT_EQ(kSsrc1, default_send_ssrc);
131 EXPECT_TRUE(channel_->RemoveSendStream(default_send_ssrc));
132
solenberg0a617e22015-10-20 15:49:38 -0700133 // Verify the channel does not exist.
134 EXPECT_EQ(-1, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000135 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000136 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200137 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000138 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000139 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200140 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000141 delete channel_;
142 engine_.Terminate();
143 }
144
Peter Boström0c4e06b2015-10-07 12:23:21 +0200145 void TestInsertDtmf(uint32_t ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000146 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200147 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200148 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000149 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700150 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000151 // send stream.
152 EXPECT_TRUE(channel_->AddSendStream(
153 cricket::StreamParams::CreateLegacy(kSsrc1)));
154 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000155
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000156 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200157 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000158 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
159 EXPECT_FALSE(channel_->CanInsertDtmf());
160 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111, cricket::DF_SEND));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200161 send_parameters_.codecs.push_back(kTelephoneEventCodec);
162 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000163 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000164
165 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700166 // If this is callee, there's no active send channel yet.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000167 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
168 EXPECT_TRUE(channel_->AddSendStream(
169 cricket::StreamParams::CreateLegacy(kSsrc1)));
170 }
171
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000172 // Check we fail if the ssrc is invalid.
173 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111, cricket::DF_SEND));
174
175 // Test send
solenberg0a617e22015-10-20 15:49:38 -0700176 int channel_id = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000177 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
178 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
179 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
180
181 // Test play
182 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(3, 134));
183 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 3, 134, cricket::DF_PLAY));
184 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(3, 134));
185
186 // Test send and play
187 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
188 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(4, 145));
189 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 4, 145,
190 cricket::DF_PLAY | cricket::DF_SEND));
191 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
192 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(4, 145));
193 }
194
195 // Test that send bandwidth is set correctly.
196 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000197 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
198 // |expected_result| is the expected result from SetMaxSendBandwidth().
199 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000200 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000201 int max_bitrate,
202 bool expected_result,
203 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200204 cricket::AudioSendParameters parameters;
205 parameters.codecs.push_back(codec);
206 parameters.max_bandwidth_bps = max_bitrate;
207 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
208
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000209 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000210 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000211 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000212 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000213 }
214
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000215 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenberg0a617e22015-10-20 15:49:38 -0700216 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000217 int channel_num = voe_.GetLastChannel();
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000218
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000219 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000220 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000221
222 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200223 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000224 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200225 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000226 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000227
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000228 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200229 send_parameters_.extensions.clear();
230 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000231 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000232
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000233 // Ensure extension is set properly.
234 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200235 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
236 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000237 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000238
solenberg0a617e22015-10-20 15:49:38 -0700239 // Ensure extension is set properly on new channels.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000240 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700241 cricket::StreamParams::CreateLegacy(kSsrc2)));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000242 int new_channel_num = voe_.GetLastChannel();
243 EXPECT_NE(channel_num, new_channel_num);
244 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000245
246 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200247 send_parameters_.codecs.push_back(kPcmuCodec);
248 send_parameters_.extensions.clear();
249 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000250 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
251 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000252 }
253
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000254 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700255 EXPECT_TRUE(SetupEngineWithRecvStream());
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000256 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000257
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000258 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000259 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000260
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200261 cricket::AudioRecvParameters parameters;
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000262 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200263 parameters.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000264 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200265 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000266 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000267
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000268 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200269 parameters.extensions.clear();
270 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000271 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000272
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000273 // Ensure extension is set properly.
274 const int id = 2;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200275 parameters.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
276 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000277 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000278
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000279 // Ensure extension is set properly on new channel.
280 // The first stream to occupy the default channel.
281 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700282 cricket::StreamParams::CreateLegacy(kSsrc2)));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000283 int new_channel_num = voe_.GetLastChannel();
284 EXPECT_NE(channel_num, new_channel_num);
285 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
286
287 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200288 parameters.extensions.clear();
289 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000290 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
291 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000292 }
293
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000294 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200295 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000296 cricket::FakeWebRtcVoiceEngine voe_;
wu@webrtc.org97077a32013-10-25 21:18:33 +0000297 FakeVoETraceWrapper* trace_wrapper_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000298 cricket::WebRtcVoiceEngine engine_;
299 cricket::VoiceMediaChannel* channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000300
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200301 cricket::AudioSendParameters send_parameters_;
302 cricket::AudioRecvParameters recv_parameters_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000303 cricket::AudioOptions options_adjust_agc_;
304};
305
306// Tests that our stub library "works".
307TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
308 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000309 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000310 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000311 engine_.Terminate();
312 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000313}
314
315// Tests that we can create and destroy a channel.
316TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000317 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200318 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200319 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000320}
321
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000322// Tests that the list of supported codecs is created properly and ordered
323// correctly
324TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
325 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
326 ASSERT_FALSE(codecs.empty());
327 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
328 EXPECT_EQ(48000, codecs[0].clockrate);
329 EXPECT_EQ(2, codecs[0].channels);
330 EXPECT_EQ(64000, codecs[0].bitrate);
331 int pref = codecs[0].preference;
332 for (size_t i = 1; i < codecs.size(); ++i) {
333 EXPECT_GT(pref, codecs[i].preference);
334 pref = codecs[i].preference;
335 }
336}
337
338// Tests that we can find codecs by name or id, and that we interpret the
339// clockrate and bitrate fields properly.
340TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
341 cricket::AudioCodec codec;
342 webrtc::CodecInst codec_inst;
343 // Find PCMU with explicit clockrate and bitrate.
344 EXPECT_TRUE(engine_.FindWebRtcCodec(kPcmuCodec, &codec_inst));
345 // Find ISAC with explicit clockrate and 0 bitrate.
346 EXPECT_TRUE(engine_.FindWebRtcCodec(kIsacCodec, &codec_inst));
347 // Find telephone-event with explicit clockrate and 0 bitrate.
348 EXPECT_TRUE(engine_.FindWebRtcCodec(kTelephoneEventCodec, &codec_inst));
349 // Find ISAC with a different payload id.
350 codec = kIsacCodec;
351 codec.id = 127;
352 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
353 EXPECT_EQ(codec.id, codec_inst.pltype);
354 // Find PCMU with a 0 clockrate.
355 codec = kPcmuCodec;
356 codec.clockrate = 0;
357 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
358 EXPECT_EQ(codec.id, codec_inst.pltype);
359 EXPECT_EQ(8000, codec_inst.plfreq);
360 // Find PCMU with a 0 bitrate.
361 codec = kPcmuCodec;
362 codec.bitrate = 0;
363 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
364 EXPECT_EQ(codec.id, codec_inst.pltype);
365 EXPECT_EQ(64000, codec_inst.rate);
366 // Find ISAC with an explicit bitrate.
367 codec = kIsacCodec;
368 codec.bitrate = 32000;
369 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
370 EXPECT_EQ(codec.id, codec_inst.pltype);
371 EXPECT_EQ(32000, codec_inst.rate);
372}
373
374// Test that we set our inbound codecs properly, including changing PT.
375TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
376 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200377 cricket::AudioRecvParameters parameters;
378 parameters.codecs.push_back(kIsacCodec);
379 parameters.codecs.push_back(kPcmuCodec);
380 parameters.codecs.push_back(kTelephoneEventCodec);
381 parameters.codecs[0].id = 106; // collide with existing telephone-event
382 parameters.codecs[2].id = 126;
383 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700384 EXPECT_TRUE(channel_->AddRecvStream(
385 cricket::StreamParams::CreateLegacy(kSsrc1)));
386 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000387 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000388 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000389 gcodec.plfreq = 16000;
390 gcodec.channels = 1;
391 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
392 EXPECT_EQ(106, gcodec.pltype);
393 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000394 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000395 "telephone-event");
396 gcodec.plfreq = 8000;
397 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
398 EXPECT_EQ(126, gcodec.pltype);
399 EXPECT_STREQ("telephone-event", gcodec.plname);
400}
401
402// Test that we fail to set an unknown inbound codec.
403TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
404 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200405 cricket::AudioRecvParameters parameters;
406 parameters.codecs.push_back(kIsacCodec);
407 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
408 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000409}
410
411// Test that we fail if we have duplicate types in the inbound list.
412TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
413 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200414 cricket::AudioRecvParameters parameters;
415 parameters.codecs.push_back(kIsacCodec);
416 parameters.codecs.push_back(kCn16000Codec);
417 parameters.codecs[1].id = kIsacCodec.id;
418 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000419}
420
421// Test that we can decode OPUS without stereo parameters.
422TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
423 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200424 cricket::AudioRecvParameters parameters;
425 parameters.codecs.push_back(kIsacCodec);
426 parameters.codecs.push_back(kPcmuCodec);
427 parameters.codecs.push_back(kOpusCodec);
428 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000429 EXPECT_TRUE(channel_->AddRecvStream(
430 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700431 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000432 webrtc::CodecInst opus;
433 engine_.FindWebRtcCodec(kOpusCodec, &opus);
434 // Even without stereo parameters, recv codecs still specify channels = 2.
435 EXPECT_EQ(2, opus.channels);
436 EXPECT_EQ(111, opus.pltype);
437 EXPECT_STREQ("opus", opus.plname);
438 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700439 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000440 EXPECT_EQ(111, opus.pltype);
441}
442
443// Test that we can decode OPUS with stereo = 0.
444TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
445 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200446 cricket::AudioRecvParameters parameters;
447 parameters.codecs.push_back(kIsacCodec);
448 parameters.codecs.push_back(kPcmuCodec);
449 parameters.codecs.push_back(kOpusCodec);
450 parameters.codecs[2].params["stereo"] = "0";
451 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000452 EXPECT_TRUE(channel_->AddRecvStream(
453 cricket::StreamParams::CreateLegacy(kSsrc1)));
454 int channel_num2 = voe_.GetLastChannel();
455 webrtc::CodecInst opus;
456 engine_.FindWebRtcCodec(kOpusCodec, &opus);
457 // Even when stereo is off, recv codecs still specify channels = 2.
458 EXPECT_EQ(2, opus.channels);
459 EXPECT_EQ(111, opus.pltype);
460 EXPECT_STREQ("opus", opus.plname);
461 opus.pltype = 0;
462 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
463 EXPECT_EQ(111, opus.pltype);
464}
465
466// Test that we can decode OPUS with stereo = 1.
467TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
468 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200469 cricket::AudioRecvParameters parameters;
470 parameters.codecs.push_back(kIsacCodec);
471 parameters.codecs.push_back(kPcmuCodec);
472 parameters.codecs.push_back(kOpusCodec);
473 parameters.codecs[2].params["stereo"] = "1";
474 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000475 EXPECT_TRUE(channel_->AddRecvStream(
476 cricket::StreamParams::CreateLegacy(kSsrc1)));
477 int channel_num2 = voe_.GetLastChannel();
478 webrtc::CodecInst opus;
479 engine_.FindWebRtcCodec(kOpusCodec, &opus);
480 EXPECT_EQ(2, opus.channels);
481 EXPECT_EQ(111, opus.pltype);
482 EXPECT_STREQ("opus", opus.plname);
483 opus.pltype = 0;
484 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
485 EXPECT_EQ(111, opus.pltype);
486}
487
488// Test that changes to recv codecs are applied to all streams.
489TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
490 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200491 cricket::AudioRecvParameters parameters;
492 parameters.codecs.push_back(kIsacCodec);
493 parameters.codecs.push_back(kPcmuCodec);
494 parameters.codecs.push_back(kTelephoneEventCodec);
495 parameters.codecs[0].id = 106; // collide with existing telephone-event
496 parameters.codecs[2].id = 126;
497 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000498 EXPECT_TRUE(channel_->AddRecvStream(
499 cricket::StreamParams::CreateLegacy(kSsrc1)));
500 int channel_num2 = voe_.GetLastChannel();
501 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000502 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000503 gcodec.plfreq = 16000;
504 gcodec.channels = 1;
505 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
506 EXPECT_EQ(106, gcodec.pltype);
507 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000508 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000509 "telephone-event");
510 gcodec.plfreq = 8000;
511 gcodec.channels = 1;
512 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
513 EXPECT_EQ(126, gcodec.pltype);
514 EXPECT_STREQ("telephone-event", gcodec.plname);
515}
516
517TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenberg1ac56142015-10-13 03:58:19 -0700518 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200519 cricket::AudioRecvParameters parameters;
520 parameters.codecs.push_back(kIsacCodec);
521 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200522 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000523
524 int channel_num2 = voe_.GetLastChannel();
525 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000526 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000527 gcodec.plfreq = 16000;
528 gcodec.channels = 1;
529 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
530 EXPECT_EQ(106, gcodec.pltype);
531 EXPECT_STREQ("ISAC", gcodec.plname);
532}
533
534// Test that we can apply the same set of codecs again while playing.
535TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700536 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200537 cricket::AudioRecvParameters parameters;
538 parameters.codecs.push_back(kIsacCodec);
539 parameters.codecs.push_back(kCn16000Codec);
540 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000541 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200542 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000543
544 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200545 parameters.codecs[0].id = 127;
546 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
547 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000548 EXPECT_TRUE(voe_.GetPlayout(channel_num));
549}
550
551// Test that we can add a codec while playing.
552TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700553 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200554 cricket::AudioRecvParameters parameters;
555 parameters.codecs.push_back(kIsacCodec);
556 parameters.codecs.push_back(kCn16000Codec);
557 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000558 EXPECT_TRUE(channel_->SetPlayout(true));
559
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200560 parameters.codecs.push_back(kOpusCodec);
561 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
562 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000563 EXPECT_TRUE(voe_.GetPlayout(channel_num));
564 webrtc::CodecInst gcodec;
565 EXPECT_TRUE(engine_.FindWebRtcCodec(kOpusCodec, &gcodec));
566 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
567}
568
569TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenberg1ac56142015-10-13 03:58:19 -0700570 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000571
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000572 // Test that when autobw is enabled, bitrate is kept as the default
573 // value. autobw is enabled for the following tests because the target
574 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000575
576 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000577 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000578
579 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000580 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000581
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000582 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000583 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000584}
585
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000586TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700587 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000588
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000589 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000590
591 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000592 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
593 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000594
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000595 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000596 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
597 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000598}
599
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000600TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700601 EXPECT_TRUE(SetupEngineWithSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000602
603 // Test that we can only set a maximum bitrate for a fixed-rate codec
604 // if it's bigger than the fixed rate.
605
606 // PCMU, fixed bitrate == 64000.
607 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
608 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
609 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
610 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
611 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
612 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
613 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
614}
615
616TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -0700617 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200618 const int kDesiredBitrate = 128000;
619 cricket::AudioSendParameters parameters;
620 parameters.codecs = engine_.codecs();
621 parameters.max_bandwidth_bps = kDesiredBitrate;
622 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000623
624 EXPECT_TRUE(channel_->AddSendStream(
625 cricket::StreamParams::CreateLegacy(kSsrc1)));
626
627 int channel_num = voe_.GetLastChannel();
628 webrtc::CodecInst codec;
629 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200630 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000631}
632
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000633// Test that bitrate cannot be set for CBR codecs.
634// Bitrate is ignored if it is higher than the fixed bitrate.
635// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000636TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenberg1ac56142015-10-13 03:58:19 -0700637 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000638
639 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200640 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
641 int channel_num = voe_.GetLastChannel();
642 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000643 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
644 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200645
646 send_parameters_.max_bandwidth_bps = 128000;
647 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
649 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200650
651 send_parameters_.max_bandwidth_bps = 128;
652 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000653 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
654 EXPECT_EQ(64000, codec.rate);
655}
656
657// Test that we apply codecs properly.
658TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenberg1ac56142015-10-13 03:58:19 -0700659 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200660 cricket::AudioSendParameters parameters;
661 parameters.codecs.push_back(kIsacCodec);
662 parameters.codecs.push_back(kPcmuCodec);
663 parameters.codecs.push_back(kRedCodec);
664 parameters.codecs[0].id = 96;
665 parameters.codecs[0].bitrate = 48000;
666 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000667 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200668 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000669 webrtc::CodecInst gcodec;
670 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
671 EXPECT_EQ(96, gcodec.pltype);
672 EXPECT_EQ(48000, gcodec.rate);
673 EXPECT_STREQ("ISAC", gcodec.plname);
674 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000675 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000676 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
677 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
678 EXPECT_EQ(106, voe_.GetSendTelephoneEventPayloadType(channel_num));
679}
680
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000681// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
682// to apply.
683TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenberg1ac56142015-10-13 03:58:19 -0700684 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200685 cricket::AudioSendParameters parameters;
686 parameters.codecs.push_back(kIsacCodec);
687 parameters.codecs.push_back(kPcmuCodec);
688 parameters.codecs.push_back(kRedCodec);
689 parameters.codecs[0].id = 96;
690 parameters.codecs[0].bitrate = 48000;
691 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000692 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
693 // Calling SetSendCodec again with same codec which is already set.
694 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200695 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000696 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
697}
698
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000699// Verify that G722 is set with 16000 samples per second to WebRTC.
700TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenberg1ac56142015-10-13 03:58:19 -0700701 EXPECT_TRUE(SetupEngineWithSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000702 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200703 cricket::AudioSendParameters parameters;
704 parameters.codecs.push_back(kG722CodecSdp);
705 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000706 webrtc::CodecInst gcodec;
707 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
708 EXPECT_STREQ("G722", gcodec.plname);
709 EXPECT_EQ(1, gcodec.channels);
710 EXPECT_EQ(16000, gcodec.plfreq);
711}
712
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000713// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000714TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenberg1ac56142015-10-13 03:58:19 -0700715 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200716 cricket::AudioSendParameters parameters;
717 parameters.codecs.push_back(kOpusCodec);
718 parameters.codecs[0].bitrate = 0;
719 parameters.codecs[0].clockrate = 50000;
720 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000721}
722
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000723// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000724TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700725 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200726 cricket::AudioSendParameters parameters;
727 parameters.codecs.push_back(kOpusCodec);
728 parameters.codecs[0].bitrate = 0;
729 parameters.codecs[0].channels = 0;
730 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000731}
732
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000733// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000734TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700735 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200736 cricket::AudioSendParameters parameters;
737 parameters.codecs.push_back(kOpusCodec);
738 parameters.codecs[0].bitrate = 0;
739 parameters.codecs[0].channels = 0;
740 parameters.codecs[0].params["stereo"] = "1";
741 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000742}
743
744// Test that if channel is 1 for opus and there's no stereo, we fail.
745TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700746 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200747 cricket::AudioSendParameters parameters;
748 parameters.codecs.push_back(kOpusCodec);
749 parameters.codecs[0].bitrate = 0;
750 parameters.codecs[0].channels = 1;
751 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000752}
753
754// Test that if channel is 1 for opus and stereo=0, we fail.
755TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700756 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200757 cricket::AudioSendParameters parameters;
758 parameters.codecs.push_back(kOpusCodec);
759 parameters.codecs[0].bitrate = 0;
760 parameters.codecs[0].channels = 1;
761 parameters.codecs[0].params["stereo"] = "0";
762 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000763}
764
765// Test that if channel is 1 for opus and stereo=1, we fail.
766TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700767 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200768 cricket::AudioSendParameters parameters;
769 parameters.codecs.push_back(kOpusCodec);
770 parameters.codecs[0].bitrate = 0;
771 parameters.codecs[0].channels = 1;
772 parameters.codecs[0].params["stereo"] = "1";
773 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000774}
775
776// Test that with bitrate=0 and no stereo,
777// channels and bitrate are 1 and 32000.
778TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700779 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000780 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200781 cricket::AudioSendParameters parameters;
782 parameters.codecs.push_back(kOpusCodec);
783 parameters.codecs[0].bitrate = 0;
784 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000785 webrtc::CodecInst gcodec;
786 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
787 EXPECT_STREQ("opus", gcodec.plname);
788 EXPECT_EQ(1, gcodec.channels);
789 EXPECT_EQ(32000, gcodec.rate);
790}
791
792// Test that with bitrate=0 and stereo=0,
793// channels and bitrate are 1 and 32000.
794TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700795 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000796 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200797 cricket::AudioSendParameters parameters;
798 parameters.codecs.push_back(kOpusCodec);
799 parameters.codecs[0].bitrate = 0;
800 parameters.codecs[0].params["stereo"] = "0";
801 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000802 webrtc::CodecInst gcodec;
803 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
804 EXPECT_STREQ("opus", gcodec.plname);
805 EXPECT_EQ(1, gcodec.channels);
806 EXPECT_EQ(32000, gcodec.rate);
807}
808
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000809// Test that with bitrate=invalid and stereo=0,
810// channels and bitrate are 1 and 32000.
811TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700812 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000813 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200814 cricket::AudioSendParameters parameters;
815 parameters.codecs.push_back(kOpusCodec);
816 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000817 webrtc::CodecInst gcodec;
818
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000819 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200820 parameters.codecs[0].bitrate = 5999;
821 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000822 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
823 EXPECT_STREQ("opus", gcodec.plname);
824 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000825 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000826
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200827 parameters.codecs[0].bitrate = 510001;
828 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000829 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
830 EXPECT_STREQ("opus", gcodec.plname);
831 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000832 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000833}
834
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000835// Test that with bitrate=0 and stereo=1,
836// channels and bitrate are 2 and 64000.
837TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700838 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000839 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200840 cricket::AudioSendParameters parameters;
841 parameters.codecs.push_back(kOpusCodec);
842 parameters.codecs[0].bitrate = 0;
843 parameters.codecs[0].params["stereo"] = "1";
844 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000845 webrtc::CodecInst gcodec;
846 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
847 EXPECT_STREQ("opus", gcodec.plname);
848 EXPECT_EQ(2, gcodec.channels);
849 EXPECT_EQ(64000, gcodec.rate);
850}
851
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000852// Test that with bitrate=invalid and stereo=1,
853// channels and bitrate are 2 and 64000.
854TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700855 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000856 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200857 cricket::AudioSendParameters parameters;
858 parameters.codecs.push_back(kOpusCodec);
859 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000860 webrtc::CodecInst gcodec;
861
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000862 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200863 parameters.codecs[0].bitrate = 5999;
864 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000865 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
866 EXPECT_STREQ("opus", gcodec.plname);
867 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000868 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000869
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200870 parameters.codecs[0].bitrate = 510001;
871 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000872 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
873 EXPECT_STREQ("opus", gcodec.plname);
874 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000875 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000876}
877
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000878// Test that with bitrate=N and stereo unset,
879// channels and bitrate are 1 and N.
880TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700881 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000882 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200883 cricket::AudioSendParameters parameters;
884 parameters.codecs.push_back(kOpusCodec);
885 parameters.codecs[0].bitrate = 96000;
886 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000887 webrtc::CodecInst gcodec;
888 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
889 EXPECT_EQ(111, gcodec.pltype);
890 EXPECT_EQ(96000, gcodec.rate);
891 EXPECT_STREQ("opus", gcodec.plname);
892 EXPECT_EQ(1, gcodec.channels);
893 EXPECT_EQ(48000, gcodec.plfreq);
894}
895
896// Test that with bitrate=N and stereo=0,
897// channels and bitrate are 1 and N.
898TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700899 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000900 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200901 cricket::AudioSendParameters parameters;
902 parameters.codecs.push_back(kOpusCodec);
903 parameters.codecs[0].bitrate = 30000;
904 parameters.codecs[0].params["stereo"] = "0";
905 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000906 webrtc::CodecInst gcodec;
907 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
908 EXPECT_EQ(1, gcodec.channels);
909 EXPECT_EQ(30000, gcodec.rate);
910 EXPECT_STREQ("opus", gcodec.plname);
911}
912
913// Test that with bitrate=N and without any parameters,
914// channels and bitrate are 1 and N.
915TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenberg1ac56142015-10-13 03:58:19 -0700916 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000917 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200918 cricket::AudioSendParameters parameters;
919 parameters.codecs.push_back(kOpusCodec);
920 parameters.codecs[0].bitrate = 30000;
921 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000922 webrtc::CodecInst gcodec;
923 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
924 EXPECT_EQ(1, gcodec.channels);
925 EXPECT_EQ(30000, gcodec.rate);
926 EXPECT_STREQ("opus", gcodec.plname);
927}
928
929// Test that with bitrate=N and stereo=1,
930// channels and bitrate are 2 and N.
931TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700932 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000933 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200934 cricket::AudioSendParameters parameters;
935 parameters.codecs.push_back(kOpusCodec);
936 parameters.codecs[0].bitrate = 30000;
937 parameters.codecs[0].params["stereo"] = "1";
938 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000939 webrtc::CodecInst gcodec;
940 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
941 EXPECT_EQ(2, gcodec.channels);
942 EXPECT_EQ(30000, gcodec.rate);
943 EXPECT_STREQ("opus", gcodec.plname);
944}
945
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000946// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
947// Also test that the "maxaveragebitrate" can't be set to values outside the
948// range of 6000 and 510000
949TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenberg1ac56142015-10-13 03:58:19 -0700950 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000951 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200952 cricket::AudioSendParameters parameters;
953 parameters.codecs.push_back(kOpusCodec);
954 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000955 webrtc::CodecInst gcodec;
956
957 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200958 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
959 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000960 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000961 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000962
963 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200964 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
965 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000966 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000967 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000968
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200969 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
970 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000971 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
972 EXPECT_EQ(200000, gcodec.rate);
973}
974
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000975// Test that we can enable NACK with opus as caller.
976TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700977 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000978 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200979 cricket::AudioSendParameters parameters;
980 parameters.codecs.push_back(kOpusCodec);
981 parameters.codecs[0].AddFeedbackParam(
982 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
983 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000984 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200985 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000986 EXPECT_TRUE(voe_.GetNACK(channel_num));
987}
988
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000989// Test that we can enable NACK with opus as callee.
990TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenberg0a617e22015-10-20 15:49:38 -0700991 EXPECT_TRUE(SetupEngineWithRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000992 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200993 cricket::AudioSendParameters parameters;
994 parameters.codecs.push_back(kOpusCodec);
995 parameters.codecs[0].AddFeedbackParam(
996 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
997 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000998 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200999 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001000 EXPECT_FALSE(voe_.GetNACK(channel_num));
1001
1002 EXPECT_TRUE(channel_->AddSendStream(
1003 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001004 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001005}
1006
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001007// Test that we can enable NACK on receive streams.
1008TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001009 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001010 int channel_num1 = voe_.GetLastChannel();
1011 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1012 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001013 cricket::AudioSendParameters parameters;
1014 parameters.codecs.push_back(kOpusCodec);
1015 parameters.codecs[0].AddFeedbackParam(
1016 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1017 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001018 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1019 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001020 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001021 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1022 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1023}
1024
1025// Test that we can disable NACK.
1026TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001027 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001028 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001029 cricket::AudioSendParameters parameters;
1030 parameters.codecs.push_back(kOpusCodec);
1031 parameters.codecs[0].AddFeedbackParam(
1032 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1033 cricket::kParamValueEmpty));
1034 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001035 EXPECT_TRUE(voe_.GetNACK(channel_num));
1036
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001037 parameters.codecs.clear();
1038 parameters.codecs.push_back(kOpusCodec);
1039 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001040 EXPECT_FALSE(voe_.GetNACK(channel_num));
1041}
1042
1043// Test that we can disable NACK on receive streams.
1044TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001045 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001046 int channel_num1 = voe_.GetLastChannel();
1047 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1048 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001049 cricket::AudioSendParameters parameters;
1050 parameters.codecs.push_back(kOpusCodec);
1051 parameters.codecs[0].AddFeedbackParam(
1052 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1053 cricket::kParamValueEmpty));
1054 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001055 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1056 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1057
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001058 parameters.codecs.clear();
1059 parameters.codecs.push_back(kOpusCodec);
1060 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001061 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1062 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1063}
1064
1065// Test that NACK is enabled on a new receive stream.
1066TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001067 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001068 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001069 cricket::AudioSendParameters parameters;
1070 parameters.codecs.push_back(kIsacCodec);
1071 parameters.codecs.push_back(kCn16000Codec);
1072 parameters.codecs[0].AddFeedbackParam(
1073 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1074 cricket::kParamValueEmpty));
1075 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001076 EXPECT_TRUE(voe_.GetNACK(channel_num));
1077
1078 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1079 channel_num = voe_.GetLastChannel();
1080 EXPECT_TRUE(voe_.GetNACK(channel_num));
1081 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1082 channel_num = voe_.GetLastChannel();
1083 EXPECT_TRUE(voe_.GetNACK(channel_num));
1084}
1085
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001086// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001087TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenberg1ac56142015-10-13 03:58:19 -07001088 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001089 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001090 cricket::AudioSendParameters parameters;
1091 parameters.codecs.push_back(kOpusCodec);
1092 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001093 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1094}
1095
1096// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001097TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001098 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001099 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001100 cricket::AudioSendParameters parameters;
1101 parameters.codecs.push_back(kOpusCodec);
1102 parameters.codecs[0].bitrate = 0;
1103 parameters.codecs[0].params["useinbandfec"] = "0";
1104 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001105 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1106 webrtc::CodecInst gcodec;
1107 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1108 EXPECT_STREQ("opus", gcodec.plname);
1109 EXPECT_EQ(1, gcodec.channels);
1110 EXPECT_EQ(32000, gcodec.rate);
1111}
1112
1113// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001114TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001115 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001116 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001117 cricket::AudioSendParameters parameters;
1118 parameters.codecs.push_back(kOpusCodec);
1119 parameters.codecs[0].bitrate = 0;
1120 parameters.codecs[0].params["useinbandfec"] = "1";
1121 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001122 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1123 webrtc::CodecInst gcodec;
1124 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1125 EXPECT_STREQ("opus", gcodec.plname);
1126 EXPECT_EQ(1, gcodec.channels);
1127 EXPECT_EQ(32000, gcodec.rate);
1128}
1129
1130// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001131TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001132 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001133 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001134 cricket::AudioSendParameters parameters;
1135 parameters.codecs.push_back(kOpusCodec);
1136 parameters.codecs[0].bitrate = 0;
1137 parameters.codecs[0].params["stereo"] = "1";
1138 parameters.codecs[0].params["useinbandfec"] = "1";
1139 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001140 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1141 webrtc::CodecInst gcodec;
1142 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1143 EXPECT_STREQ("opus", gcodec.plname);
1144 EXPECT_EQ(2, gcodec.channels);
1145 EXPECT_EQ(64000, gcodec.rate);
1146}
1147
1148// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001149TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001150 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001151 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001152 cricket::AudioSendParameters parameters;
1153 parameters.codecs.push_back(kIsacCodec);
1154 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001155 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1156}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001157
1158// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1159TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001160 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001161 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001162 cricket::AudioSendParameters parameters;
1163 parameters.codecs.push_back(kIsacCodec);
1164 parameters.codecs[0].params["useinbandfec"] = "1";
1165 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001166 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1167}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001168
1169// Test that Opus FEC status can be changed.
1170TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenberg1ac56142015-10-13 03:58:19 -07001171 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001172 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001173 cricket::AudioSendParameters parameters;
1174 parameters.codecs.push_back(kOpusCodec);
1175 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001176 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001177 parameters.codecs[0].params["useinbandfec"] = "1";
1178 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001179 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1180}
1181
1182// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1183TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenberg1ac56142015-10-13 03:58:19 -07001184 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001185 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001186 cricket::AudioSendParameters parameters;
1187 parameters.codecs.push_back(kOpusCodec);
1188 parameters.codecs[0].bitrate = 0;
1189 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1190 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001191 EXPECT_EQ(cricket::kOpusBandwidthNb,
1192 voe_.GetMaxEncodingBandwidth(channel_num));
1193 webrtc::CodecInst gcodec;
1194 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1195 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001196
1197 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001198 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1199 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001200 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1201 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001202}
1203
1204// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1205TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenberg1ac56142015-10-13 03:58:19 -07001206 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +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].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1212 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001213 EXPECT_EQ(cricket::kOpusBandwidthMb,
1214 voe_.GetMaxEncodingBandwidth(channel_num));
1215 webrtc::CodecInst gcodec;
1216 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1217 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001218
1219 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001220 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1221 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001222 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1223 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001224}
1225
1226// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1227TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenberg1ac56142015-10-13 03:58:19 -07001228 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001229 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001230 cricket::AudioSendParameters parameters;
1231 parameters.codecs.push_back(kOpusCodec);
1232 parameters.codecs[0].bitrate = 0;
1233 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1234 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001235 EXPECT_EQ(cricket::kOpusBandwidthWb,
1236 voe_.GetMaxEncodingBandwidth(channel_num));
1237 webrtc::CodecInst gcodec;
1238 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1239 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001240
1241 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001242 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1243 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001244 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1245 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001246}
1247
1248// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1249TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenberg1ac56142015-10-13 03:58:19 -07001250 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001251 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001252 cricket::AudioSendParameters parameters;
1253 parameters.codecs.push_back(kOpusCodec);
1254 parameters.codecs[0].bitrate = 0;
1255 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1256 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001257 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1258 voe_.GetMaxEncodingBandwidth(channel_num));
1259 webrtc::CodecInst gcodec;
1260 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1261 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001262
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001263 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001264 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1265 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001266 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1267 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001268}
1269
1270// Test 24000 < maxplaybackrate triggers Opus full band mode.
1271TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenberg1ac56142015-10-13 03:58:19 -07001272 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001273 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001274 cricket::AudioSendParameters parameters;
1275 parameters.codecs.push_back(kOpusCodec);
1276 parameters.codecs[0].bitrate = 0;
1277 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1278 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001279 EXPECT_EQ(cricket::kOpusBandwidthFb,
1280 voe_.GetMaxEncodingBandwidth(channel_num));
1281 webrtc::CodecInst gcodec;
1282 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1283 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001284
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001285 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001286 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1287 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001288 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1289 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001290}
1291
1292// Test Opus that without maxplaybackrate, default playback rate is used.
1293TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001294 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001295 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001296 cricket::AudioSendParameters parameters;
1297 parameters.codecs.push_back(kOpusCodec);
1298 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001299 EXPECT_EQ(cricket::kOpusBandwidthFb,
1300 voe_.GetMaxEncodingBandwidth(channel_num));
1301}
1302
1303// Test the with non-Opus, maxplaybackrate has no effect.
1304TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001305 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001306 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001307 cricket::AudioSendParameters parameters;
1308 parameters.codecs.push_back(kIsacCodec);
1309 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1310 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001311 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1312}
1313
1314// Test maxplaybackrate can be set on two streams.
1315TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001316 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001317 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001318 cricket::AudioSendParameters parameters;
1319 parameters.codecs.push_back(kOpusCodec);
1320 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001321 // Default bandwidth is 24000.
1322 EXPECT_EQ(cricket::kOpusBandwidthFb,
1323 voe_.GetMaxEncodingBandwidth(channel_num));
1324
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001325 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001326
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001327 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001328 EXPECT_EQ(cricket::kOpusBandwidthNb,
1329 voe_.GetMaxEncodingBandwidth(channel_num));
1330
1331 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1332 channel_num = voe_.GetLastChannel();
1333 EXPECT_EQ(cricket::kOpusBandwidthNb,
1334 voe_.GetMaxEncodingBandwidth(channel_num));
1335}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001336
Minyue Li7100dcd2015-03-27 05:05:59 +01001337// Test that with usedtx=0, Opus DTX is off.
1338TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001339 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001340 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001341 cricket::AudioSendParameters parameters;
1342 parameters.codecs.push_back(kOpusCodec);
1343 parameters.codecs[0].params["usedtx"] = "0";
1344 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001345 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1346}
1347
1348// Test that with usedtx=1, Opus DTX is on.
1349TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001350 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001351 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001352 cricket::AudioSendParameters parameters;
1353 parameters.codecs.push_back(kOpusCodec);
1354 parameters.codecs[0].params["usedtx"] = "1";
1355 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001356 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1357 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1358}
1359
1360// Test that usedtx=1 works with stereo Opus.
1361TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001362 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001363 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001364 cricket::AudioSendParameters parameters;
1365 parameters.codecs.push_back(kOpusCodec);
1366 parameters.codecs[0].params["usedtx"] = "1";
1367 parameters.codecs[0].params["stereo"] = "1";
1368 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001369 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1370 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1371}
1372
1373// Test that usedtx=1 does not work with non Opus.
1374TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001375 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001376 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001377 cricket::AudioSendParameters parameters;
1378 parameters.codecs.push_back(kIsacCodec);
1379 parameters.codecs[0].params["usedtx"] = "1";
1380 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001381 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1382}
1383
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001384// Test that we can switch back and forth between Opus and ISAC with CN.
1385TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenberg1ac56142015-10-13 03:58:19 -07001386 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001387 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001388 cricket::AudioSendParameters opus_parameters;
1389 opus_parameters.codecs.push_back(kOpusCodec);
1390 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001391 webrtc::CodecInst gcodec;
1392 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001393 EXPECT_EQ(111, gcodec.pltype);
1394 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001395
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001396 cricket::AudioSendParameters isac_parameters;
1397 isac_parameters.codecs.push_back(kIsacCodec);
1398 isac_parameters.codecs.push_back(kCn16000Codec);
1399 isac_parameters.codecs.push_back(kOpusCodec);
1400 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001401 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1402 EXPECT_EQ(103, gcodec.pltype);
1403 EXPECT_STREQ("ISAC", gcodec.plname);
1404
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001405 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001406 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001407 EXPECT_EQ(111, gcodec.pltype);
1408 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001409}
1410
1411// Test that we handle various ways of specifying bitrate.
1412TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001413 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001414 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001415 cricket::AudioSendParameters parameters;
1416 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1417 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001418 webrtc::CodecInst gcodec;
1419 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1420 EXPECT_EQ(103, gcodec.pltype);
1421 EXPECT_STREQ("ISAC", gcodec.plname);
1422 EXPECT_EQ(32000, gcodec.rate);
1423
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001424 parameters.codecs[0].bitrate = 0; // bitrate == default
1425 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001426 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1427 EXPECT_EQ(103, gcodec.pltype);
1428 EXPECT_STREQ("ISAC", gcodec.plname);
1429 EXPECT_EQ(-1, gcodec.rate);
1430
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001431 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1432 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001433 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1434 EXPECT_EQ(103, gcodec.pltype);
1435 EXPECT_STREQ("ISAC", gcodec.plname);
1436 EXPECT_EQ(28000, gcodec.rate);
1437
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001438 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1439 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001440 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1441 EXPECT_EQ(0, gcodec.pltype);
1442 EXPECT_STREQ("PCMU", gcodec.plname);
1443 EXPECT_EQ(64000, gcodec.rate);
1444
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001445 parameters.codecs[0].bitrate = 0; // bitrate == default
1446 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001447 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1448 EXPECT_EQ(0, gcodec.pltype);
1449 EXPECT_STREQ("PCMU", gcodec.plname);
1450 EXPECT_EQ(64000, gcodec.rate);
1451
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001452 parameters.codecs[0] = kOpusCodec;
1453 parameters.codecs[0].bitrate = 0; // bitrate == default
1454 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001455 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1456 EXPECT_EQ(111, gcodec.pltype);
1457 EXPECT_STREQ("opus", gcodec.plname);
1458 EXPECT_EQ(32000, gcodec.rate);
1459}
1460
Brave Yao5225dd82015-03-26 07:39:19 +08001461// Test that we could set packet size specified in kCodecParamPTime.
1462TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenberg1ac56142015-10-13 03:58:19 -07001463 EXPECT_TRUE(SetupEngineWithSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001464 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001465 cricket::AudioSendParameters parameters;
1466 parameters.codecs.push_back(kOpusCodec);
1467 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1468 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001469 webrtc::CodecInst gcodec;
1470 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1471 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1472
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001473 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1474 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001475 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1476 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1477
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001478 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1479 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001480 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1481 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1482
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001483 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1484 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1485 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001486 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1487 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1488
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001489 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1490 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1491 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001492 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1493 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1494}
1495
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001496// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001497TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenberg1ac56142015-10-13 03:58:19 -07001498 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001499 cricket::AudioSendParameters parameters;
1500 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001501}
1502
1503// Test that we can set send codecs even with telephone-event codec as the first
1504// one on the list.
1505TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001506 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001507 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001508 cricket::AudioSendParameters parameters;
1509 parameters.codecs.push_back(kTelephoneEventCodec);
1510 parameters.codecs.push_back(kIsacCodec);
1511 parameters.codecs.push_back(kPcmuCodec);
1512 parameters.codecs[0].id = 98; // DTMF
1513 parameters.codecs[1].id = 96;
1514 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001515 webrtc::CodecInst gcodec;
1516 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001517 EXPECT_EQ(96, gcodec.pltype);
1518 EXPECT_STREQ("ISAC", gcodec.plname);
1519 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1520}
1521
1522// Test that we can set send codecs even with CN codec as the first
1523// one on the list.
1524TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001525 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001526 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001527 cricket::AudioSendParameters parameters;
1528 parameters.codecs.push_back(kCn16000Codec);
1529 parameters.codecs.push_back(kIsacCodec);
1530 parameters.codecs.push_back(kPcmuCodec);
1531 parameters.codecs[0].id = 98; // wideband CN
1532 parameters.codecs[1].id = 96;
1533 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001534 webrtc::CodecInst gcodec;
1535 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1536 EXPECT_EQ(96, gcodec.pltype);
1537 EXPECT_STREQ("ISAC", gcodec.plname);
1538 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001539}
1540
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001541// Test that we set VAD and DTMF types correctly as caller.
1542TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001543 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001544 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001545 cricket::AudioSendParameters parameters;
1546 parameters.codecs.push_back(kIsacCodec);
1547 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001548 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001549 parameters.codecs.push_back(kCn16000Codec);
1550 parameters.codecs.push_back(kCn8000Codec);
1551 parameters.codecs.push_back(kTelephoneEventCodec);
1552 parameters.codecs.push_back(kRedCodec);
1553 parameters.codecs[0].id = 96;
1554 parameters.codecs[2].id = 97; // wideband CN
1555 parameters.codecs[4].id = 98; // DTMF
1556 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001557 webrtc::CodecInst gcodec;
1558 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1559 EXPECT_EQ(96, gcodec.pltype);
1560 EXPECT_STREQ("ISAC", gcodec.plname);
1561 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001562 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001563 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1564 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1565 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1566}
1567
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001568// Test that we set VAD and DTMF types correctly as callee.
1569TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001570 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001571 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001572 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001573
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001574 cricket::AudioSendParameters parameters;
1575 parameters.codecs.push_back(kIsacCodec);
1576 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001577 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001578 parameters.codecs.push_back(kCn16000Codec);
1579 parameters.codecs.push_back(kCn8000Codec);
1580 parameters.codecs.push_back(kTelephoneEventCodec);
1581 parameters.codecs.push_back(kRedCodec);
1582 parameters.codecs[0].id = 96;
1583 parameters.codecs[2].id = 97; // wideband CN
1584 parameters.codecs[4].id = 98; // DTMF
1585 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001586 EXPECT_TRUE(channel_->AddSendStream(
1587 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001588 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001589
1590 webrtc::CodecInst gcodec;
1591 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1592 EXPECT_EQ(96, gcodec.pltype);
1593 EXPECT_STREQ("ISAC", gcodec.plname);
1594 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001595 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001596 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1597 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1598 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1599}
1600
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001601// Test that we only apply VAD if we have a CN codec that matches the
1602// send codec clockrate.
1603TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenberg1ac56142015-10-13 03:58:19 -07001604 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001605 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001606 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001607 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001608 parameters.codecs.push_back(kIsacCodec);
1609 parameters.codecs.push_back(kCn16000Codec);
1610 parameters.codecs[1].id = 97;
1611 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001612 webrtc::CodecInst gcodec;
1613 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1614 EXPECT_STREQ("ISAC", gcodec.plname);
1615 EXPECT_TRUE(voe_.GetVAD(channel_num));
1616 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1617 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001618 parameters.codecs[0] = kPcmuCodec;
1619 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001620 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1621 EXPECT_STREQ("PCMU", gcodec.plname);
1622 EXPECT_FALSE(voe_.GetVAD(channel_num));
1623 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001624 parameters.codecs[1] = kCn8000Codec;
1625 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001626 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1627 EXPECT_STREQ("PCMU", gcodec.plname);
1628 EXPECT_TRUE(voe_.GetVAD(channel_num));
1629 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001630 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001631 parameters.codecs[0] = kIsacCodec;
1632 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001633 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1634 EXPECT_STREQ("ISAC", gcodec.plname);
1635 EXPECT_FALSE(voe_.GetVAD(channel_num));
1636}
1637
1638// Test that we perform case-insensitive matching of codec names.
1639TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenberg1ac56142015-10-13 03:58:19 -07001640 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001641 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001642 cricket::AudioSendParameters parameters;
1643 parameters.codecs.push_back(kIsacCodec);
1644 parameters.codecs.push_back(kPcmuCodec);
1645 parameters.codecs.push_back(kCn16000Codec);
1646 parameters.codecs.push_back(kCn8000Codec);
1647 parameters.codecs.push_back(kTelephoneEventCodec);
1648 parameters.codecs.push_back(kRedCodec);
1649 parameters.codecs[0].name = "iSaC";
1650 parameters.codecs[0].id = 96;
1651 parameters.codecs[2].id = 97; // wideband CN
1652 parameters.codecs[4].id = 98; // DTMF
1653 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001654 webrtc::CodecInst gcodec;
1655 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1656 EXPECT_EQ(96, gcodec.pltype);
1657 EXPECT_STREQ("ISAC", gcodec.plname);
1658 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001659 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001660 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1661 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1662 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1663}
1664
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001665// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001666TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001667 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001668 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001669 cricket::AudioSendParameters parameters;
1670 parameters.codecs.push_back(kRedCodec);
1671 parameters.codecs.push_back(kIsacCodec);
1672 parameters.codecs.push_back(kPcmuCodec);
1673 parameters.codecs[0].id = 127;
1674 parameters.codecs[0].params[""] = "96/96";
1675 parameters.codecs[1].id = 96;
1676 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001677 webrtc::CodecInst gcodec;
1678 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1679 EXPECT_EQ(96, gcodec.pltype);
1680 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001681 EXPECT_TRUE(voe_.GetRED(channel_num));
1682 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001683}
1684
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001685// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001686TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001687 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001688 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001689 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001690
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001691 cricket::AudioSendParameters parameters;
1692 parameters.codecs.push_back(kRedCodec);
1693 parameters.codecs.push_back(kIsacCodec);
1694 parameters.codecs.push_back(kPcmuCodec);
1695 parameters.codecs[0].id = 127;
1696 parameters.codecs[0].params[""] = "96/96";
1697 parameters.codecs[1].id = 96;
1698 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001699 EXPECT_TRUE(channel_->AddSendStream(
1700 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001701 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001702 webrtc::CodecInst gcodec;
1703 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1704 EXPECT_EQ(96, gcodec.pltype);
1705 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001706 EXPECT_TRUE(voe_.GetRED(channel_num));
1707 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001708}
1709
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001710// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001711TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenberg1ac56142015-10-13 03:58:19 -07001712 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001713 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001714 cricket::AudioSendParameters parameters;
1715 parameters.codecs.push_back(kRedCodec);
1716 parameters.codecs.push_back(kIsacCodec);
1717 parameters.codecs.push_back(kPcmuCodec);
1718 parameters.codecs[0].id = 127;
1719 parameters.codecs[1].id = 96;
1720 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001721 webrtc::CodecInst gcodec;
1722 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1723 EXPECT_EQ(96, gcodec.pltype);
1724 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001725 EXPECT_TRUE(voe_.GetRED(channel_num));
1726 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001727}
1728
1729// Test that we ignore RED if the parameters aren't named the way we expect.
1730TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001731 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001732 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001733 cricket::AudioSendParameters parameters;
1734 parameters.codecs.push_back(kRedCodec);
1735 parameters.codecs.push_back(kIsacCodec);
1736 parameters.codecs.push_back(kPcmuCodec);
1737 parameters.codecs[0].id = 127;
1738 parameters.codecs[0].params["ABC"] = "96/96";
1739 parameters.codecs[1].id = 96;
1740 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001741 webrtc::CodecInst gcodec;
1742 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1743 EXPECT_EQ(96, gcodec.pltype);
1744 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001745 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001746}
1747
1748// Test that we ignore RED if it uses different primary/secondary encoding.
1749TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001750 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001751 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001752 cricket::AudioSendParameters parameters;
1753 parameters.codecs.push_back(kRedCodec);
1754 parameters.codecs.push_back(kIsacCodec);
1755 parameters.codecs.push_back(kPcmuCodec);
1756 parameters.codecs[0].id = 127;
1757 parameters.codecs[0].params[""] = "96/0";
1758 parameters.codecs[1].id = 96;
1759 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001760 webrtc::CodecInst gcodec;
1761 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1762 EXPECT_EQ(96, gcodec.pltype);
1763 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001764 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001765}
1766
1767// Test that we ignore RED if it uses more than 2 encodings.
1768TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001769 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001770 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001771 cricket::AudioSendParameters parameters;
1772 parameters.codecs.push_back(kRedCodec);
1773 parameters.codecs.push_back(kIsacCodec);
1774 parameters.codecs.push_back(kPcmuCodec);
1775 parameters.codecs[0].id = 127;
1776 parameters.codecs[0].params[""] = "96/96/96";
1777 parameters.codecs[1].id = 96;
1778 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001779 webrtc::CodecInst gcodec;
1780 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1781 EXPECT_EQ(96, gcodec.pltype);
1782 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001783 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001784}
1785
1786// Test that we ignore RED if it has bogus codec ids.
1787TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001788 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001789 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001790 cricket::AudioSendParameters parameters;
1791 parameters.codecs.push_back(kRedCodec);
1792 parameters.codecs.push_back(kIsacCodec);
1793 parameters.codecs.push_back(kPcmuCodec);
1794 parameters.codecs[0].id = 127;
1795 parameters.codecs[0].params[""] = "ABC/ABC";
1796 parameters.codecs[1].id = 96;
1797 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001798 webrtc::CodecInst gcodec;
1799 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1800 EXPECT_EQ(96, gcodec.pltype);
1801 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001802 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001803}
1804
1805// Test that we ignore RED if it refers to a codec that is not present.
1806TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001807 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001808 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001809 cricket::AudioSendParameters parameters;
1810 parameters.codecs.push_back(kRedCodec);
1811 parameters.codecs.push_back(kIsacCodec);
1812 parameters.codecs.push_back(kPcmuCodec);
1813 parameters.codecs[0].id = 127;
1814 parameters.codecs[0].params[""] = "97/97";
1815 parameters.codecs[1].id = 96;
1816 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001817 webrtc::CodecInst gcodec;
1818 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1819 EXPECT_EQ(96, gcodec.pltype);
1820 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001821 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001822}
1823
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001824// Test support for audio level header extension.
1825TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1826 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001827}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001828TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1829 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1830}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001831
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001832// Test support for absolute send time header extension.
1833TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1834 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1835}
1836TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1837 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001838}
1839
solenberg1ac56142015-10-13 03:58:19 -07001840// Test that we can create a channel and start sending on it.
1841TEST_F(WebRtcVoiceEngineTestFake, Send) {
1842 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001843 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001844 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001845 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1846 EXPECT_TRUE(voe_.GetSend(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001847 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1848 EXPECT_FALSE(voe_.GetSend(channel_num));
solenberg1ac56142015-10-13 03:58:19 -07001849}
1850
1851// Test that we can create a channel and start playing out on it.
1852TEST_F(WebRtcVoiceEngineTestFake, Playout) {
1853 EXPECT_TRUE(SetupEngineWithRecvStream());
1854 int channel_num = voe_.GetLastChannel();
1855 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
1856 EXPECT_TRUE(channel_->SetPlayout(true));
1857 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001858 EXPECT_TRUE(channel_->SetPlayout(false));
1859 EXPECT_FALSE(voe_.GetPlayout(channel_num));
1860}
1861
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001862// Test that we can add and remove send streams.
1863TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
1864 SetupForMultiSendStream();
1865
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001866 // Set the global state for sending.
1867 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1868
solenbergc96df772015-10-21 13:01:53 -07001869 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001870 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07001871 cricket::StreamParams::CreateLegacy(ssrc)));
1872 EXPECT_NE(nullptr, call_.GetAudioSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001873
1874 // Verify that we are in a sending state for all the created streams.
solenbergc96df772015-10-21 13:01:53 -07001875 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001876 EXPECT_TRUE(voe_.GetSend(channel_num));
1877 }
solenbergc96df772015-10-21 13:01:53 -07001878 EXPECT_EQ(ARRAY_SIZE(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001879
solenbergc96df772015-10-21 13:01:53 -07001880 // Delete the send streams.
1881 for (uint32_t ssrc : kSsrcs4) {
1882 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
1883 EXPECT_EQ(nullptr, call_.GetAudioSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001884 // Stream should already be deleted.
solenbergc96df772015-10-21 13:01:53 -07001885 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
1886 EXPECT_EQ(-1, voe_.GetChannelFromLocalSsrc(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001887 }
solenbergc96df772015-10-21 13:01:53 -07001888 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001889}
1890
1891// Test SetSendCodecs correctly configure the codecs in all send streams.
1892TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
1893 SetupForMultiSendStream();
1894
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001895 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07001896 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001897 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07001898 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001899 }
1900
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001901 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001902 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001903 parameters.codecs.push_back(kIsacCodec);
1904 parameters.codecs.push_back(kCn16000Codec);
1905 parameters.codecs[1].id = 97;
1906 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001907
1908 // Verify ISAC and VAD are corrected configured on all send channels.
1909 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07001910 for (uint32_t ssrc : kSsrcs4) {
1911 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001912 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1913 EXPECT_STREQ("ISAC", gcodec.plname);
1914 EXPECT_TRUE(voe_.GetVAD(channel_num));
1915 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1916 }
1917
1918 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001919 parameters.codecs[0] = kPcmuCodec;
1920 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07001921 for (uint32_t ssrc : kSsrcs4) {
1922 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001923 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1924 EXPECT_STREQ("PCMU", gcodec.plname);
1925 EXPECT_FALSE(voe_.GetVAD(channel_num));
1926 }
1927}
1928
1929// Test we can SetSend on all send streams correctly.
1930TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
1931 SetupForMultiSendStream();
1932
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001933 // Create the send channels and they should be a SEND_NOTHING date.
solenbergc96df772015-10-21 13:01:53 -07001934 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001935 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07001936 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001937 int channel_num = voe_.GetLastChannel();
1938 EXPECT_FALSE(voe_.GetSend(channel_num));
1939 }
1940
1941 // Set the global state for starting sending.
1942 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
solenbergc96df772015-10-21 13:01:53 -07001943 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001944 // Verify that we are in a sending state for all the send streams.
solenbergc96df772015-10-21 13:01:53 -07001945 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001946 EXPECT_TRUE(voe_.GetSend(channel_num));
1947 }
1948
1949 // Set the global state for stopping sending.
1950 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
solenbergc96df772015-10-21 13:01:53 -07001951 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001952 // Verify that we are in a stop state for all the send streams.
solenbergc96df772015-10-21 13:01:53 -07001953 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001954 EXPECT_FALSE(voe_.GetSend(channel_num));
1955 }
1956}
1957
1958// Test we can set the correct statistics on all send streams.
1959TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
1960 SetupForMultiSendStream();
1961
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001962 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07001963 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001964 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07001965 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001966 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00001967 // Create a receive stream to check that none of the send streams end up in
1968 // the receive stream stats.
1969 EXPECT_TRUE(channel_->AddRecvStream(
1970 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001971 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001972 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
1973 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001974
1975 cricket::VoiceMediaInfo info;
1976 EXPECT_EQ(true, channel_->GetStats(&info));
1977 EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size());
1978
1979 // Verify the statistic information is correct.
solenbergc96df772015-10-21 13:01:53 -07001980 // TODO(solenberg): Make this loop ordering independent.
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001981 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +00001982 EXPECT_EQ(kSsrcs4[i], info.senders[i].ssrc());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001983 EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
1984 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].bytes_sent);
1985 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_sent);
1986 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_lost);
1987 EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[i].fraction_lost);
1988 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].ext_seqnum);
1989 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].rtt_ms);
1990 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].jitter_ms);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00001991 EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001992 }
solenberg43e83d42015-10-20 06:41:01 -07001993 EXPECT_EQ(0u, info.receivers.size());
solenberg1ac56142015-10-13 03:58:19 -07001994
solenberg43e83d42015-10-20 06:41:01 -07001995 // Registered stream's remote SSRC is kSsrc2. Send a packet with SSRC=1.
1996 // We should drop the packet and no stats should be available.
1997 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00001998 EXPECT_EQ(true, channel_->GetStats(&info));
solenberg1ac56142015-10-13 03:58:19 -07001999 EXPECT_EQ(0u, info.receivers.size());
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002000
solenberg43e83d42015-10-20 06:41:01 -07002001 // Remove the kSsrc2 stream and deliver a new packet - a default receive
2002 // stream should be created and we should see stats.
2003 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07002004 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2005 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002006 EXPECT_EQ(1u, info.receivers.size());
solenberg43e83d42015-10-20 06:41:01 -07002007
2008 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd);
2009 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd);
2010 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost);
2011 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum);
2012 EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name);
2013 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentExpandRate) /
2014 (1 << 14), info.receivers[0].expand_rate);
2015 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSpeechExpandRate) /
2016 (1 << 14), info.receivers[0].speech_expand_rate);
2017 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSecondaryDecodedRate) /
2018 (1 << 14), info.receivers[0].secondary_decoded_rate);
2019 EXPECT_EQ(
2020 static_cast<float>(cricket::kNetStats.currentAccelerateRate) / (1 << 14),
2021 info.receivers[0].accelerate_rate);
2022 EXPECT_EQ(
2023 static_cast<float>(cricket::kNetStats.currentPreemptiveRate) / (1 << 14),
2024 info.receivers[0].preemptive_expand_rate);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002025}
2026
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002027// Test that we can add and remove receive streams, and do proper send/playout.
2028// We can receive on multiple streams while sending one stream.
2029TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002030 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002031 int channel_num1 = voe_.GetLastChannel();
2032
solenberg1ac56142015-10-13 03:58:19 -07002033 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002034 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002035 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002036 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002037
solenberg1ac56142015-10-13 03:58:19 -07002038 // Adding another stream should enable playout on the new stream only.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002039 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2040 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002041 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2042 EXPECT_TRUE(voe_.GetSend(channel_num1));
2043 EXPECT_FALSE(voe_.GetSend(channel_num2));
2044
solenberg1ac56142015-10-13 03:58:19 -07002045 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002046 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2047 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2048
2049 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2050 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2051 int channel_num3 = voe_.GetLastChannel();
2052 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2053 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2054 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2055 EXPECT_FALSE(voe_.GetSend(channel_num3));
2056
2057 // Stop sending.
2058 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2059 EXPECT_FALSE(voe_.GetSend(channel_num1));
2060 EXPECT_FALSE(voe_.GetSend(channel_num2));
2061 EXPECT_FALSE(voe_.GetSend(channel_num3));
2062
2063 // Stop playout.
2064 EXPECT_TRUE(channel_->SetPlayout(false));
2065 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2066 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2067 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2068
solenberg1ac56142015-10-13 03:58:19 -07002069 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002070 EXPECT_TRUE(channel_->SetPlayout(true));
2071 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2072 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2073 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2074
solenberg1ac56142015-10-13 03:58:19 -07002075 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002076 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2077 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002078 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002079}
2080
2081// Test that we can set the devices to use.
2082TEST_F(WebRtcVoiceEngineTestFake, SetDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002083 EXPECT_TRUE(SetupEngineWithSendStream());
2084 int send_channel = voe_.GetLastChannel();
2085 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2086 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002087 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002088
2089 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2090 cricket::kFakeDefaultDeviceId);
2091 cricket::Device dev(cricket::kFakeDeviceName,
2092 cricket::kFakeDeviceId);
2093
2094 // Test SetDevices() while not sending or playing.
2095 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2096
2097 // Test SetDevices() while sending and playing.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002098 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2099 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002100 EXPECT_TRUE(voe_.GetSend(send_channel));
2101 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002102
2103 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2104
solenberg1ac56142015-10-13 03:58:19 -07002105 EXPECT_TRUE(voe_.GetSend(send_channel));
2106 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002107
2108 // Test that failure to open newly selected devices does not prevent opening
2109 // ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002110 voe_.set_playout_fail_channel(recv_channel);
2111 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002112
2113 EXPECT_FALSE(engine_.SetDevices(&default_dev, &default_dev));
2114
solenberg1ac56142015-10-13 03:58:19 -07002115 EXPECT_FALSE(voe_.GetSend(send_channel));
2116 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002117
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002118 voe_.set_playout_fail_channel(-1);
2119 voe_.set_send_fail_channel(-1);
2120
2121 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2122
solenberg1ac56142015-10-13 03:58:19 -07002123 EXPECT_TRUE(voe_.GetSend(send_channel));
2124 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002125}
2126
2127// Test that we can set the devices to use even if we failed to
2128// open the initial ones.
2129TEST_F(WebRtcVoiceEngineTestFake, SetDevicesWithInitiallyBadDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002130 EXPECT_TRUE(SetupEngineWithSendStream());
2131 int send_channel = voe_.GetLastChannel();
2132 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2133 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002134 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002135
2136 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2137 cricket::kFakeDefaultDeviceId);
2138 cricket::Device dev(cricket::kFakeDeviceName,
2139 cricket::kFakeDeviceId);
2140
2141 // Test that failure to open devices selected before starting
2142 // send/play does not prevent opening newly selected ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002143 voe_.set_playout_fail_channel(recv_channel);
2144 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002145
2146 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2147
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002148 EXPECT_FALSE(channel_->SetSend(cricket::SEND_MICROPHONE));
2149 EXPECT_FALSE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002150 EXPECT_FALSE(voe_.GetSend(send_channel));
2151 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002152
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002153 voe_.set_playout_fail_channel(-1);
2154 voe_.set_send_fail_channel(-1);
2155
2156 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2157
solenberg1ac56142015-10-13 03:58:19 -07002158 EXPECT_TRUE(voe_.GetSend(send_channel));
2159 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002160}
2161
2162// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002163// and start sending on it.
2164TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2165 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002166 int channel_num = voe_.GetLastChannel();
2167 webrtc::AgcConfig agc_config;
2168 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2169 EXPECT_EQ(0, agc_config.targetLeveldBOv);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002170 send_parameters_.options = options_adjust_agc_;
2171 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002172 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2173 EXPECT_TRUE(voe_.GetSend(channel_num));
2174 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2175 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002176 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2177 EXPECT_FALSE(voe_.GetSend(channel_num));
2178 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2179 EXPECT_EQ(0, agc_config.targetLeveldBOv); // level was restored
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002180}
2181
wu@webrtc.org97077a32013-10-25 21:18:33 +00002182TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002183 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002184 webrtc::AgcConfig agc_config;
2185 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2186 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2187
2188 cricket::AudioOptions options;
2189 options.tx_agc_target_dbov.Set(3);
2190 options.tx_agc_digital_compression_gain.Set(9);
2191 options.tx_agc_limiter.Set(true);
2192 options.auto_gain_control.Set(true);
2193 EXPECT_TRUE(engine_.SetOptions(options));
2194
2195 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2196 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2197 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2198 EXPECT_TRUE(agc_config.limiterEnable);
2199
2200 // Check interaction with adjust_agc_delta. Both should be respected, for
2201 // backwards compatibility.
2202 options.adjust_agc_delta.Set(-10);
2203 EXPECT_TRUE(engine_.SetOptions(options));
2204
2205 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2206 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2207}
2208
wu@webrtc.org97077a32013-10-25 21:18:33 +00002209TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002210 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002211 cricket::AudioOptions options;
2212 options.recording_sample_rate.Set(48000u);
2213 options.playout_sample_rate.Set(44100u);
2214 EXPECT_TRUE(engine_.SetOptions(options));
2215
2216 unsigned int recording_sample_rate, playout_sample_rate;
2217 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2218 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2219 EXPECT_EQ(48000u, recording_sample_rate);
2220 EXPECT_EQ(44100u, playout_sample_rate);
2221}
2222
2223TEST_F(WebRtcVoiceEngineTestFake, TraceFilterViaTraceOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002224 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002225 engine_.SetLogging(rtc::LS_INFO, "");
wu@webrtc.org97077a32013-10-25 21:18:33 +00002226 EXPECT_EQ(
2227 // Info:
2228 webrtc::kTraceStateInfo | webrtc::kTraceInfo |
2229 // Warning:
2230 webrtc::kTraceTerseInfo | webrtc::kTraceWarning |
2231 // Error:
2232 webrtc::kTraceError | webrtc::kTraceCritical,
2233 static_cast<int>(trace_wrapper_->filter_));
2234 // Now set it explicitly
2235 std::string filter =
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002236 "tracefilter " + rtc::ToString(webrtc::kTraceDefault);
2237 engine_.SetLogging(rtc::LS_VERBOSE, filter.c_str());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002238 EXPECT_EQ(static_cast<unsigned int>(webrtc::kTraceDefault),
2239 trace_wrapper_->filter_);
2240}
2241
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002242// Test that we can set the outgoing SSRC properly.
2243// SSRC is set in SetupEngine by calling AddSendStream.
2244TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002245 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002246 int channel_num = voe_.GetLastChannel();
2247 unsigned int send_ssrc;
2248 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
2249 EXPECT_NE(0U, send_ssrc);
2250 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
2251 EXPECT_EQ(kSsrc1, send_ssrc);
2252}
2253
2254TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2255 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002256 EXPECT_TRUE(SetupEngineWithSendStream());
2257 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2258 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002259 EXPECT_TRUE(channel_->AddRecvStream(
2260 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002261 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2262 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002263
2264 cricket::VoiceMediaInfo info;
2265 EXPECT_EQ(true, channel_->GetStats(&info));
2266 EXPECT_EQ(1u, info.senders.size());
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +00002267 EXPECT_EQ(kSsrc1, info.senders[0].ssrc());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002268 EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
2269 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].bytes_sent);
2270 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_sent);
2271 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_lost);
2272 EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[0].fraction_lost);
2273 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].ext_seqnum);
2274 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].rtt_ms);
2275 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].jitter_ms);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002276 EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002277 // TODO(sriniv): Add testing for more fields. These are not populated
2278 // in FakeWebrtcVoiceEngine yet.
2279 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].audio_level);
2280 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_median_ms);
2281 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_std_ms);
2282 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_return_loss);
2283 // EXPECT_EQ(cricket::kIntStatValue,
2284 // info.senders[0].echo_return_loss_enhancement);
solenberg43e83d42015-10-20 06:41:01 -07002285 EXPECT_EQ(0u, info.receivers.size());
solenberg1ac56142015-10-13 03:58:19 -07002286
solenberg43e83d42015-10-20 06:41:01 -07002287 // Registered stream's remote SSRC is kSsrc2. Send a packet with SSRC=1.
2288 // We should drop the packet and no stats should be available.
2289 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002290 EXPECT_EQ(true, channel_->GetStats(&info));
2291 EXPECT_EQ(0u, info.receivers.size());
2292
solenberg43e83d42015-10-20 06:41:01 -07002293 // Remove the kSsrc2 stream and deliver a new packet - a default receive
2294 // stream should be created and we should see stats.
2295 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002296 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2297 EXPECT_EQ(true, channel_->GetStats(&info));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002298 EXPECT_EQ(1u, info.receivers.size());
solenberg43e83d42015-10-20 06:41:01 -07002299
2300 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd);
2301 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd);
2302 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost);
2303 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum);
2304 EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name);
2305 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentExpandRate) /
2306 (1 << 14), info.receivers[0].expand_rate);
2307 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSpeechExpandRate) /
2308 (1 << 14), info.receivers[0].speech_expand_rate);
2309 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSecondaryDecodedRate) /
2310 (1 << 14), info.receivers[0].secondary_decoded_rate);
2311 // TODO(sriniv): Add testing for more receiver fields.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002312}
2313
2314// Test that we can set the outgoing SSRC properly with multiple streams.
2315// SSRC is set in SetupEngine by calling AddSendStream.
2316TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002317 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002318 int channel_num1 = voe_.GetLastChannel();
2319 unsigned int send_ssrc;
2320 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num1, send_ssrc));
2321 EXPECT_EQ(kSsrc1, send_ssrc);
2322
2323 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2324 int channel_num2 = voe_.GetLastChannel();
2325 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num2, send_ssrc));
2326 EXPECT_EQ(kSsrc1, send_ssrc);
2327}
2328
2329// Test that the local SSRC is the same on sending and receiving channels if the
2330// receive channel is created before the send channel.
2331TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002332 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002333 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002334
2335 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2336 int receive_channel_num = voe_.GetLastChannel();
2337 EXPECT_TRUE(channel_->AddSendStream(
2338 cricket::StreamParams::CreateLegacy(1234)));
2339 int send_channel_num = voe_.GetLastChannel();
2340
2341 unsigned int ssrc = 0;
2342 EXPECT_EQ(0, voe_.GetLocalSSRC(send_channel_num, ssrc));
2343 EXPECT_EQ(1234U, ssrc);
2344 ssrc = 0;
2345 EXPECT_EQ(0, voe_.GetLocalSSRC(receive_channel_num, ssrc));
2346 EXPECT_EQ(1234U, ssrc);
2347}
2348
2349// Test that we can properly receive packets.
2350TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2351 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002352 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002353 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002354 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame,
2355 sizeof(kPcmuFrame)));
2356}
2357
2358// Test that we can properly receive packets on multiple streams.
2359TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002360 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002361 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002362 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2363 int channel_num1 = voe_.GetLastChannel();
2364 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2365 int channel_num2 = voe_.GetLastChannel();
2366 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2367 int channel_num3 = voe_.GetLastChannel();
2368 // Create packets with the right SSRCs.
2369 char packets[4][sizeof(kPcmuFrame)];
2370 for (size_t i = 0; i < ARRAY_SIZE(packets); ++i) {
2371 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002372 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002373 }
2374 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2375 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2376 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2377 DeliverPacket(packets[0], sizeof(packets[0]));
2378 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2379 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2380 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2381 DeliverPacket(packets[1], sizeof(packets[1]));
2382 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1],
2383 sizeof(packets[1])));
2384 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2385 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2386 DeliverPacket(packets[2], sizeof(packets[2]));
2387 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2388 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2],
2389 sizeof(packets[2])));
2390 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2391 DeliverPacket(packets[3], sizeof(packets[3]));
2392 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2393 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2394 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3],
2395 sizeof(packets[3])));
2396 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2397 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2398 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2399}
2400
solenberg0a617e22015-10-20 15:49:38 -07002401// Test that we properly handle failures to add a receive stream.
2402TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
2403 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002404 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002405 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002406}
2407
solenberg0a617e22015-10-20 15:49:38 -07002408// Test that we properly handle failures to add a send stream.
2409TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
2410 EXPECT_TRUE(SetupEngine());
2411 voe_.set_fail_create_channel(true);
2412 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2413}
2414
solenberg1ac56142015-10-13 03:58:19 -07002415// Test that AddRecvStream creates new stream.
2416TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2417 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002418 int channel_num = voe_.GetLastChannel();
2419 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002420 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002421}
2422
2423// Test that after adding a recv stream, we do not decode more codecs than
2424// those previously passed into SetRecvCodecs.
2425TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002426 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002427 cricket::AudioRecvParameters parameters;
2428 parameters.codecs.push_back(kIsacCodec);
2429 parameters.codecs.push_back(kPcmuCodec);
2430 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002431 EXPECT_TRUE(channel_->AddRecvStream(
2432 cricket::StreamParams::CreateLegacy(kSsrc1)));
2433 int channel_num2 = voe_.GetLastChannel();
2434 webrtc::CodecInst gcodec;
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002435 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "opus");
2436 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002437 gcodec.channels = 2;
2438 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2439}
2440
2441// Test that we properly clean up any streams that were added, even if
2442// not explicitly removed.
2443TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002444 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002445 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002446 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2447 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2448 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2449 delete channel_;
2450 channel_ = NULL;
2451 EXPECT_EQ(0, voe_.GetNumChannels());
2452}
2453
wu@webrtc.org78187522013-10-07 23:32:02 +00002454TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002455 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002456 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2457}
2458
2459TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2460 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002461 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002462 // Manually delete channel to simulate a failure.
2463 int channel = voe_.GetLastChannel();
2464 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2465 // Add recv stream 2 should work.
2466 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002467 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002468 EXPECT_NE(channel, new_channel);
2469 // The last created channel is deleted too.
2470 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002471}
2472
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002473// Test the InsertDtmf on default send stream as caller.
2474TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2475 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002476}
2477
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002478// Test the InsertDtmf on default send stream as callee
2479TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2480 TestInsertDtmf(0, false);
2481}
2482
2483// Test the InsertDtmf on specified send stream as caller.
2484TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2485 TestInsertDtmf(kSsrc1, true);
2486}
2487
2488// Test the InsertDtmf on specified send stream as callee.
2489TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2490 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002491}
2492
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002493TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
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_->SetSend(cricket::SEND_MICROPHONE));
2497 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2498 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2499 EXPECT_TRUE(channel_->SetPlayout(true));
2500 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2501 EXPECT_TRUE(channel_->SetPlayout(false));
2502 EXPECT_FALSE(channel_->SetPlayout(true));
2503}
2504
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002505TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002506 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002507
2508 bool ec_enabled;
2509 webrtc::EcModes ec_mode;
2510 bool ec_metrics_enabled;
2511 webrtc::AecmModes aecm_mode;
2512 bool cng_enabled;
2513 bool agc_enabled;
2514 webrtc::AgcModes agc_mode;
2515 webrtc::AgcConfig agc_config;
2516 bool ns_enabled;
2517 webrtc::NsModes ns_mode;
2518 bool highpass_filter_enabled;
2519 bool stereo_swapping_enabled;
2520 bool typing_detection_enabled;
2521 voe_.GetEcStatus(ec_enabled, ec_mode);
2522 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2523 voe_.GetAecmMode(aecm_mode, cng_enabled);
2524 voe_.GetAgcStatus(agc_enabled, agc_mode);
2525 voe_.GetAgcConfig(agc_config);
2526 voe_.GetNsStatus(ns_enabled, ns_mode);
2527 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2528 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2529 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2530 EXPECT_TRUE(ec_enabled);
2531 EXPECT_TRUE(ec_metrics_enabled);
2532 EXPECT_FALSE(cng_enabled);
2533 EXPECT_TRUE(agc_enabled);
2534 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2535 EXPECT_TRUE(ns_enabled);
2536 EXPECT_TRUE(highpass_filter_enabled);
2537 EXPECT_FALSE(stereo_swapping_enabled);
2538 EXPECT_TRUE(typing_detection_enabled);
2539 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2540 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2541
2542 // Nothing set, so all ignored.
2543 cricket::AudioOptions options;
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002544 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002545 voe_.GetEcStatus(ec_enabled, ec_mode);
2546 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2547 voe_.GetAecmMode(aecm_mode, cng_enabled);
2548 voe_.GetAgcStatus(agc_enabled, agc_mode);
2549 voe_.GetAgcConfig(agc_config);
2550 voe_.GetNsStatus(ns_enabled, ns_mode);
2551 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2552 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2553 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2554 EXPECT_TRUE(ec_enabled);
2555 EXPECT_TRUE(ec_metrics_enabled);
2556 EXPECT_FALSE(cng_enabled);
2557 EXPECT_TRUE(agc_enabled);
2558 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2559 EXPECT_TRUE(ns_enabled);
2560 EXPECT_TRUE(highpass_filter_enabled);
2561 EXPECT_FALSE(stereo_swapping_enabled);
2562 EXPECT_TRUE(typing_detection_enabled);
2563 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2564 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
Henrik Lundin64dad832015-05-11 12:44:23 +02002565 EXPECT_EQ(50, voe_.GetNetEqCapacity()); // From GetDefaultEngineOptions().
Henrik Lundin5263b3c2015-06-01 10:29:41 +02002566 EXPECT_FALSE(
2567 voe_.GetNetEqFastAccelerate()); // From GetDefaultEngineOptions().
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002568
2569 // Turn echo cancellation off
2570 options.echo_cancellation.Set(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002571 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002572 voe_.GetEcStatus(ec_enabled, ec_mode);
2573 EXPECT_FALSE(ec_enabled);
2574
2575 // Turn echo cancellation back on, with settings, and make sure
2576 // nothing else changed.
2577 options.echo_cancellation.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002578 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002579 voe_.GetEcStatus(ec_enabled, ec_mode);
2580 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2581 voe_.GetAecmMode(aecm_mode, cng_enabled);
2582 voe_.GetAgcStatus(agc_enabled, agc_mode);
2583 voe_.GetAgcConfig(agc_config);
2584 voe_.GetNsStatus(ns_enabled, ns_mode);
2585 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2586 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2587 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2588 EXPECT_TRUE(ec_enabled);
2589 EXPECT_TRUE(ec_metrics_enabled);
2590 EXPECT_TRUE(agc_enabled);
2591 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2592 EXPECT_TRUE(ns_enabled);
2593 EXPECT_TRUE(highpass_filter_enabled);
2594 EXPECT_FALSE(stereo_swapping_enabled);
2595 EXPECT_TRUE(typing_detection_enabled);
2596 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2597 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2598
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002599 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2600 // control.
2601 options.delay_agnostic_aec.Set(true);
2602 ASSERT_TRUE(engine_.SetOptions(options));
2603 voe_.GetEcStatus(ec_enabled, ec_mode);
2604 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2605 voe_.GetAecmMode(aecm_mode, cng_enabled);
2606 EXPECT_TRUE(ec_enabled);
2607 EXPECT_TRUE(ec_metrics_enabled);
2608 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2609
2610 // Turn off echo cancellation and delay agnostic aec.
2611 options.delay_agnostic_aec.Set(false);
Henrik Lundin441f6342015-06-09 16:03:13 +02002612 options.extended_filter_aec.Set(false);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002613 options.echo_cancellation.Set(false);
2614 ASSERT_TRUE(engine_.SetOptions(options));
2615 voe_.GetEcStatus(ec_enabled, ec_mode);
2616 EXPECT_FALSE(ec_enabled);
2617 // Turning delay agnostic aec back on should also turn on echo cancellation.
2618 options.delay_agnostic_aec.Set(true);
2619 ASSERT_TRUE(engine_.SetOptions(options));
2620 voe_.GetEcStatus(ec_enabled, ec_mode);
2621 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2622 EXPECT_TRUE(ec_enabled);
2623 EXPECT_TRUE(ec_metrics_enabled);
2624 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2625
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002626 // Turn off AGC
2627 options.auto_gain_control.Set(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002628 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002629 voe_.GetAgcStatus(agc_enabled, agc_mode);
2630 EXPECT_FALSE(agc_enabled);
2631
2632 // Turn AGC back on
2633 options.auto_gain_control.Set(true);
2634 options.adjust_agc_delta.Clear();
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002635 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002636 voe_.GetAgcStatus(agc_enabled, agc_mode);
2637 EXPECT_TRUE(agc_enabled);
2638 voe_.GetAgcConfig(agc_config);
2639 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2640
2641 // Turn off other options (and stereo swapping on).
2642 options.noise_suppression.Set(false);
2643 options.highpass_filter.Set(false);
2644 options.typing_detection.Set(false);
2645 options.stereo_swapping.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002646 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002647 voe_.GetNsStatus(ns_enabled, ns_mode);
2648 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2649 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2650 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2651 EXPECT_FALSE(ns_enabled);
2652 EXPECT_FALSE(highpass_filter_enabled);
2653 EXPECT_FALSE(typing_detection_enabled);
2654 EXPECT_TRUE(stereo_swapping_enabled);
2655
solenberg1ac56142015-10-13 03:58:19 -07002656 // Set options again to ensure it has no impact.
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002657 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002658 voe_.GetEcStatus(ec_enabled, ec_mode);
2659 voe_.GetNsStatus(ns_enabled, ns_mode);
2660 EXPECT_TRUE(ec_enabled);
2661 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2662 EXPECT_FALSE(ns_enabled);
2663 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2664}
2665
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002666TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002667 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002668
2669 bool ec_enabled;
2670 webrtc::EcModes ec_mode;
2671 bool ec_metrics_enabled;
2672 bool agc_enabled;
2673 webrtc::AgcModes agc_mode;
2674 bool ns_enabled;
2675 webrtc::NsModes ns_mode;
2676 bool highpass_filter_enabled;
2677 bool stereo_swapping_enabled;
2678 bool typing_detection_enabled;
2679
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002680 voe_.GetEcStatus(ec_enabled, ec_mode);
2681 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2682 voe_.GetAgcStatus(agc_enabled, agc_mode);
2683 voe_.GetNsStatus(ns_enabled, ns_mode);
2684 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2685 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2686 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2687 EXPECT_TRUE(ec_enabled);
2688 EXPECT_TRUE(agc_enabled);
2689 EXPECT_TRUE(ns_enabled);
2690 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002691 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002692 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002693}
2694
2695TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2696 webrtc::AgcConfig set_config = {0};
2697 set_config.targetLeveldBOv = 3;
2698 set_config.digitalCompressionGaindB = 9;
2699 set_config.limiterEnable = true;
2700 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002701 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002702
2703 webrtc::AgcConfig config = {0};
2704 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2705 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2706 EXPECT_EQ(set_config.digitalCompressionGaindB,
2707 config.digitalCompressionGaindB);
2708 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2709}
2710
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002711TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002712 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg66f43392015-09-09 01:36:22 -07002713 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2714 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002715 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002716 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2717 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002718 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002719
2720 // Have to add a stream to make SetSend work.
2721 cricket::StreamParams stream1;
2722 stream1.ssrcs.push_back(1);
2723 channel1->AddSendStream(stream1);
2724 cricket::StreamParams stream2;
2725 stream2.ssrcs.push_back(2);
2726 channel2->AddSendStream(stream2);
2727
2728 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002729 cricket::AudioSendParameters parameters_options_all = send_parameters_;
2730 parameters_options_all.options.echo_cancellation.Set(true);
2731 parameters_options_all.options.auto_gain_control.Set(true);
2732 parameters_options_all.options.noise_suppression.Set(true);
2733 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2734 EXPECT_EQ(parameters_options_all.options, channel1->options());
2735 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2736 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002737
2738 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002739 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
2740 parameters_options_no_ns.options.noise_suppression.Set(false);
2741 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2742 cricket::AudioOptions expected_options = parameters_options_all.options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002743 expected_options.echo_cancellation.Set(true);
2744 expected_options.auto_gain_control.Set(true);
2745 expected_options.noise_suppression.Set(false);
solenberg66f43392015-09-09 01:36:22 -07002746 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002747
2748 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002749 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
2750 parameters_options_no_agc.options.auto_gain_control.Set(false);
2751 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002752 expected_options.echo_cancellation.Set(true);
2753 expected_options.auto_gain_control.Set(false);
2754 expected_options.noise_suppression.Set(true);
solenberg66f43392015-09-09 01:36:22 -07002755 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002756
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002757 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002758 bool ec_enabled;
2759 webrtc::EcModes ec_mode;
2760 bool agc_enabled;
2761 webrtc::AgcModes agc_mode;
2762 bool ns_enabled;
2763 webrtc::NsModes ns_mode;
2764 voe_.GetEcStatus(ec_enabled, ec_mode);
2765 voe_.GetAgcStatus(agc_enabled, agc_mode);
2766 voe_.GetNsStatus(ns_enabled, ns_mode);
2767 EXPECT_TRUE(ec_enabled);
2768 EXPECT_TRUE(agc_enabled);
2769 EXPECT_TRUE(ns_enabled);
2770
2771 channel1->SetSend(cricket::SEND_MICROPHONE);
2772 voe_.GetEcStatus(ec_enabled, ec_mode);
2773 voe_.GetAgcStatus(agc_enabled, agc_mode);
2774 voe_.GetNsStatus(ns_enabled, ns_mode);
2775 EXPECT_TRUE(ec_enabled);
2776 EXPECT_TRUE(agc_enabled);
2777 EXPECT_FALSE(ns_enabled);
2778
2779 channel1->SetSend(cricket::SEND_NOTHING);
2780 voe_.GetEcStatus(ec_enabled, ec_mode);
2781 voe_.GetAgcStatus(agc_enabled, agc_mode);
2782 voe_.GetNsStatus(ns_enabled, ns_mode);
2783 EXPECT_TRUE(ec_enabled);
2784 EXPECT_TRUE(agc_enabled);
2785 EXPECT_TRUE(ns_enabled);
2786
2787 channel2->SetSend(cricket::SEND_MICROPHONE);
2788 voe_.GetEcStatus(ec_enabled, ec_mode);
2789 voe_.GetAgcStatus(agc_enabled, agc_mode);
2790 voe_.GetNsStatus(ns_enabled, ns_mode);
2791 EXPECT_TRUE(ec_enabled);
2792 EXPECT_FALSE(agc_enabled);
2793 EXPECT_TRUE(ns_enabled);
2794
2795 channel2->SetSend(cricket::SEND_NOTHING);
2796 voe_.GetEcStatus(ec_enabled, ec_mode);
2797 voe_.GetAgcStatus(agc_enabled, agc_mode);
2798 voe_.GetNsStatus(ns_enabled, ns_mode);
2799 EXPECT_TRUE(ec_enabled);
2800 EXPECT_TRUE(agc_enabled);
2801 EXPECT_TRUE(ns_enabled);
2802
2803 // Make sure settings take effect while we are sending.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002804 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
2805 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2806 send_parameters_;
2807 parameters_options_no_agc_nor_ns.options.auto_gain_control.Set(false);
2808 parameters_options_no_agc_nor_ns.options.noise_suppression.Set(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002809 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002810 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002811 expected_options.echo_cancellation.Set(true);
2812 expected_options.auto_gain_control.Set(false);
2813 expected_options.noise_suppression.Set(false);
solenberg66f43392015-09-09 01:36:22 -07002814 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002815 voe_.GetEcStatus(ec_enabled, ec_mode);
2816 voe_.GetAgcStatus(agc_enabled, agc_mode);
2817 voe_.GetNsStatus(ns_enabled, ns_mode);
2818 EXPECT_TRUE(ec_enabled);
2819 EXPECT_FALSE(agc_enabled);
2820 EXPECT_FALSE(ns_enabled);
2821}
2822
wu@webrtc.orgde305012013-10-31 15:40:38 +00002823// This test verifies DSCP settings are properly applied on voice media channel.
2824TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002825 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002826 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002827 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002828 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00002829 new cricket::FakeNetworkInterface);
2830 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002831 cricket::AudioSendParameters parameters = send_parameters_;
2832 parameters.options.dscp.Set(true);
2833 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002834 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00002835 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002836 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002837 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002838 parameters.options.dscp.Set(false);
2839 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002840 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00002841}
2842
solenberg1ac56142015-10-13 03:58:19 -07002843TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002844 EXPECT_TRUE(SetupEngine());
2845 cricket::WebRtcVoiceMediaChannel* media_channel =
2846 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002847 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2848 EXPECT_TRUE(channel_->AddRecvStream(
2849 cricket::StreamParams::CreateLegacy(kSsrc1)));
2850 int channel_id = voe_.GetLastChannel();
2851 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2852 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2853 EXPECT_TRUE(channel_->AddRecvStream(
2854 cricket::StreamParams::CreateLegacy(kSsrc2)));
2855 int channel_id2 = voe_.GetLastChannel();
2856 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002857}
2858
solenberg1ac56142015-10-13 03:58:19 -07002859TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002860 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002861 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002862 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2863 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2864 EXPECT_TRUE(channel_->AddSendStream(
2865 cricket::StreamParams::CreateLegacy(kSsrc1)));
2866 int channel_id = voe_.GetLastChannel();
2867 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2868 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2869 EXPECT_TRUE(channel_->AddSendStream(
2870 cricket::StreamParams::CreateLegacy(kSsrc2)));
2871 int channel_id2 = voe_.GetLastChannel();
2872 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002873}
2874
solenberg4bac9c52015-10-09 02:32:53 -07002875TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002876 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002877 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002878 cricket::StreamParams stream;
2879 stream.ssrcs.push_back(kSsrc2);
2880 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002881 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002882 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002883 float scale = 0;
2884 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2885 EXPECT_DOUBLE_EQ(3, scale);
2886}
2887
2888TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
2889 EXPECT_TRUE(SetupEngine());
2890 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2891 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2892 int channel_id = voe_.GetLastChannel();
2893 float scale = 0;
2894 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2895 EXPECT_DOUBLE_EQ(2, scale);
2896 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07002897 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002898 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002899}
2900
pbos8fc7fa72015-07-15 08:02:58 -07002901TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02002902 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07002903 const std::string kSyncLabel = "AvSyncLabel";
2904
solenberg1ac56142015-10-13 03:58:19 -07002905 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07002906 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
2907 sp.sync_label = kSyncLabel;
2908 // Creating two channels to make sure that sync label is set properly for both
2909 // the default voice channel and following ones.
2910 EXPECT_TRUE(channel_->AddRecvStream(sp));
2911 sp.ssrcs[0] += 1;
2912 EXPECT_TRUE(channel_->AddRecvStream(sp));
2913
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002914 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07002915 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002916 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002917 << "SyncGroup should be set based on sync_label";
2918 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002919 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002920 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07002921}
2922
pbos6bb1b6e2015-07-24 07:10:18 -07002923TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002924 // Test that changing the combined_audio_video_bwe option results in the
2925 // expected state changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002926 std::vector<uint32_t> ssrcs;
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002927 ssrcs.push_back(223);
2928 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002929
solenberg1ac56142015-10-13 03:58:19 -07002930 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002931 cricket::WebRtcVoiceMediaChannel* media_channel =
2932 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02002933 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002934 EXPECT_TRUE(media_channel->AddRecvStream(
2935 cricket::StreamParams::CreateLegacy(ssrc)));
2936 }
2937 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002938
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002939 // Combined BWE should be disabled.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002940 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002941 const auto* s = call_.GetAudioReceiveStream(ssrc);
2942 EXPECT_NE(nullptr, s);
2943 EXPECT_EQ(false, s->GetConfig().combined_audio_video_bwe);
2944 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002945
2946 // Enable combined BWE option - now it should be set up.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002947 send_parameters_.options.combined_audio_video_bwe.Set(true);
2948 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002949 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002950 const auto* s = call_.GetAudioReceiveStream(ssrc);
2951 EXPECT_NE(nullptr, s);
2952 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
2953 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002954
2955 // Disable combined BWE option - should be disabled again.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002956 send_parameters_.options.combined_audio_video_bwe.Set(false);
2957 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002958 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002959 const auto* s = call_.GetAudioReceiveStream(ssrc);
2960 EXPECT_NE(nullptr, s);
2961 EXPECT_EQ(false, s->GetConfig().combined_audio_video_bwe);
2962 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002963
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002964 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002965}
2966
pbos6bb1b6e2015-07-24 07:10:18 -07002967TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002968 // Test that adding receive streams after enabling combined bandwidth
2969 // estimation will correctly configure each channel.
solenberg1ac56142015-10-13 03:58:19 -07002970 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002971 cricket::WebRtcVoiceMediaChannel* media_channel =
2972 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002973 send_parameters_.options.combined_audio_video_bwe.Set(true);
2974 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002975
Peter Boström0c4e06b2015-10-07 12:23:21 +02002976 static const uint32_t kSsrcs[] = {1, 2, 3, 4};
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002977 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs); ++i) {
2978 EXPECT_TRUE(media_channel->AddRecvStream(
2979 cricket::StreamParams::CreateLegacy(kSsrcs[i])));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002980 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(kSsrcs[i]));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002981 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002982 EXPECT_EQ(ARRAY_SIZE(kSsrcs), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002983}
2984
pbos6bb1b6e2015-07-24 07:10:18 -07002985TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002986 // Test that setting the header extensions results in the expected state
2987 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002988 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002989 ssrcs.push_back(223);
2990 ssrcs.push_back(224);
2991
solenberg1ac56142015-10-13 03:58:19 -07002992 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002993 cricket::WebRtcVoiceMediaChannel* media_channel =
2994 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002995 send_parameters_.options.combined_audio_video_bwe.Set(true);
2996 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002997 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002998 EXPECT_TRUE(media_channel->AddRecvStream(
2999 cricket::StreamParams::CreateLegacy(ssrc)));
3000 }
3001
3002 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003003 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003004 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003005 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003006 EXPECT_NE(nullptr, s);
3007 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3008 }
3009
3010 // Set up receive extensions.
3011 const auto& e_exts = engine_.rtp_header_extensions();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003012 cricket::AudioRecvParameters recv_parameters;
3013 recv_parameters.extensions = e_exts;
3014 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003015 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003016 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003017 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003018 EXPECT_NE(nullptr, s);
3019 const auto& s_exts = s->GetConfig().rtp.extensions;
3020 EXPECT_EQ(e_exts.size(), s_exts.size());
3021 for (const auto& e_ext : e_exts) {
3022 for (const auto& s_ext : s_exts) {
3023 if (e_ext.id == s_ext.id) {
3024 EXPECT_EQ(e_ext.uri, s_ext.name);
3025 }
3026 }
3027 }
3028 }
3029
3030 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003031 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003032 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003033 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003034 EXPECT_NE(nullptr, s);
3035 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3036 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003037}
3038
3039TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3040 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003041 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003042 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3043 static const unsigned char kRtcp[] = {
3044 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3045 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3046 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3047 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3048 };
3049 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3050
solenberg1ac56142015-10-13 03:58:19 -07003051 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003052 cricket::WebRtcVoiceMediaChannel* media_channel =
3053 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003054 send_parameters_.options.combined_audio_video_bwe.Set(true);
3055 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003056 EXPECT_TRUE(media_channel->AddRecvStream(
3057 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3058
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003059 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003060 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003061 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003062 EXPECT_EQ(0, s->received_packets());
3063 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3064 EXPECT_EQ(1, s->received_packets());
3065 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3066 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003067}
Minyue2013aec2015-05-13 14:14:42 +02003068
solenberg0a617e22015-10-20 15:49:38 -07003069// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003070// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003071TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenberg1ac56142015-10-13 03:58:19 -07003072 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003073 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003074 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003075 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3076 int recv_ch = voe_.GetLastChannel();
3077 EXPECT_NE(recv_ch, default_channel);
3078 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3079 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3080 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003081 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3082 recv_ch = voe_.GetLastChannel();
3083 EXPECT_NE(recv_ch, default_channel);
3084 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003085}
3086
3087TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003088 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003089 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003090
3091 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3092 int recv_ch = voe_.GetLastChannel();
3093
3094 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3095 int send_ch = voe_.GetLastChannel();
3096
3097 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3098 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3099 // channel of |recv_ch|.This is not a common case, since, normally, only the
3100 // default channel can be associated. However, the default is not deletable.
3101 // So we force the |recv_ch| to associate with a non-default channel.
3102 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3103 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3104
3105 EXPECT_TRUE(channel_->RemoveSendStream(2));
3106 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3107}
stefan658910c2015-09-03 05:48:32 -07003108
3109// Tests for the actual WebRtc VoE library.
3110
3111TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
3112 cricket::WebRtcVoiceEngine engine;
3113 cricket::AudioOptions options = engine.GetOptions();
3114 // The default options should have at least a few things set. We purposefully
3115 // don't check the option values here, though.
3116 EXPECT_TRUE(options.echo_cancellation.IsSet());
3117 EXPECT_TRUE(options.auto_gain_control.IsSet());
3118 EXPECT_TRUE(options.noise_suppression.IsSet());
3119}
3120
3121// Tests that the library initializes and shuts down properly.
3122TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3123 cricket::WebRtcVoiceEngine engine;
3124 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003125 rtc::scoped_ptr<webrtc::Call> call(
3126 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003127 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003128 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003129 EXPECT_TRUE(channel != nullptr);
3130 delete channel;
3131 engine.Terminate();
3132
3133 // Reinit to catch regression where VoiceEngineObserver reference is lost
3134 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3135 engine.Terminate();
3136}
3137
3138// Tests that the library is configured with the codecs we want.
3139TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
3140 cricket::WebRtcVoiceEngine engine;
3141 // Check codecs by name.
3142 EXPECT_TRUE(engine.FindCodec(
3143 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0)));
3144 EXPECT_TRUE(engine.FindCodec(
3145 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0)));
3146 EXPECT_TRUE(engine.FindCodec(
3147 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0)));
3148 // Check that name matching is case-insensitive.
3149 EXPECT_TRUE(engine.FindCodec(
3150 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0)));
3151 EXPECT_TRUE(engine.FindCodec(
3152 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0)));
3153 EXPECT_TRUE(engine.FindCodec(
3154 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0)));
3155 EXPECT_TRUE(engine.FindCodec(
3156 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0)));
3157 EXPECT_TRUE(engine.FindCodec(
3158 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0)));
3159 EXPECT_TRUE(engine.FindCodec(
3160 cricket::AudioCodec(96, "red", 8000, 0, 1, 0)));
3161 EXPECT_TRUE(engine.FindCodec(
3162 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0)));
3163 EXPECT_TRUE(engine.FindCodec(
3164 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0)));
3165 EXPECT_TRUE(engine.FindCodec(
3166 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0)));
3167 EXPECT_TRUE(engine.FindCodec(
3168 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0)));
3169 // Check codecs with an id by id.
3170 EXPECT_TRUE(engine.FindCodec(
3171 cricket::AudioCodec(0, "", 8000, 0, 1, 0))); // PCMU
3172 EXPECT_TRUE(engine.FindCodec(
3173 cricket::AudioCodec(8, "", 8000, 0, 1, 0))); // PCMA
3174 EXPECT_TRUE(engine.FindCodec(
3175 cricket::AudioCodec(9, "", 8000, 0, 1, 0))); // G722
3176 EXPECT_TRUE(engine.FindCodec(
3177 cricket::AudioCodec(13, "", 8000, 0, 1, 0))); // CN
3178 // Check sample/bitrate matching.
3179 EXPECT_TRUE(engine.FindCodec(
3180 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0)));
3181 // Check that bad codecs fail.
3182 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0)));
3183 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(88, "", 0, 0, 1, 0)));
3184 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 0, 2, 0)));
3185 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 5000, 0, 1, 0)));
3186 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 5000, 1, 0)));
3187 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3188 for (std::vector<cricket::AudioCodec>::const_iterator it =
3189 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3190 if (it->name == "CN" && it->clockrate == 16000) {
3191 EXPECT_EQ(105, it->id);
3192 } else if (it->name == "CN" && it->clockrate == 32000) {
3193 EXPECT_EQ(106, it->id);
3194 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3195 EXPECT_EQ(103, it->id);
3196 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3197 EXPECT_EQ(104, it->id);
3198 } else if (it->name == "G722" && it->clockrate == 8000) {
3199 EXPECT_EQ(9, it->id);
3200 } else if (it->name == "telephone-event") {
3201 EXPECT_EQ(126, it->id);
3202 } else if (it->name == "red") {
3203 EXPECT_EQ(127, it->id);
3204 } else if (it->name == "opus") {
3205 EXPECT_EQ(111, it->id);
3206 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3207 EXPECT_EQ("10", it->params.find("minptime")->second);
3208 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3209 EXPECT_EQ("60", it->params.find("maxptime")->second);
3210 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3211 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3212 }
3213 }
3214
3215 engine.Terminate();
3216}
3217
3218// Tests that VoE supports at least 32 channels
3219TEST(WebRtcVoiceEngineTest, Has32Channels) {
3220 cricket::WebRtcVoiceEngine engine;
3221 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003222 rtc::scoped_ptr<webrtc::Call> call(
3223 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003224
3225 cricket::VoiceMediaChannel* channels[32];
3226 int num_channels = 0;
stefan658910c2015-09-03 05:48:32 -07003227 while (num_channels < ARRAY_SIZE(channels)) {
3228 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003229 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003230 if (!channel)
3231 break;
stefan658910c2015-09-03 05:48:32 -07003232 channels[num_channels++] = channel;
3233 }
3234
3235 int expected = ARRAY_SIZE(channels);
3236 EXPECT_EQ(expected, num_channels);
3237
3238 while (num_channels > 0) {
3239 delete channels[--num_channels];
3240 }
stefan658910c2015-09-03 05:48:32 -07003241 engine.Terminate();
3242}
3243
3244// Test that we set our preferred codecs properly.
3245TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3246 cricket::WebRtcVoiceEngine engine;
3247 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003248 rtc::scoped_ptr<webrtc::Call> call(
3249 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003250 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3251 call.get());
3252 cricket::AudioRecvParameters parameters;
3253 parameters.codecs = engine.codecs();
3254 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003255}