blob: efa195d20487f38e2941538332d14147695e631c [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
2 * libjingle
3 * Copyright 2008 Google Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000027
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000028#include "webrtc/base/byteorder.h"
29#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020030#include "webrtc/call.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000031#include "talk/media/base/constants.h"
32#include "talk/media/base/fakemediaengine.h"
wu@webrtc.orgde305012013-10-31 15:40:38 +000033#include "talk/media/base/fakenetworkinterface.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034#include "talk/media/base/fakertp.h"
Fredrik Solenberg4b60c732015-05-07 14:07:48 +020035#include "talk/media/webrtc/fakewebrtccall.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000036#include "talk/media/webrtc/fakewebrtcvoiceengine.h"
37#include "talk/media/webrtc/webrtcvoiceengine.h"
deadbeefcbecd352015-09-23 11:50:27 -070038#include "webrtc/p2p/base/faketransportcontroller.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000039#include "talk/session/media/channel.h"
40
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000041using cricket::kRtpAudioLevelHeaderExtension;
42using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
43
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020044namespace {
45
46const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
47const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
48const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
49const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
50const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
51const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
52const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
53const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
54const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, 0,
55 1, 0);
56const cricket::AudioCodec* const kAudioCodecs[] = {
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +000057 &kPcmuCodec, &kIsacCodec, &kOpusCodec, &kG722CodecVoE, &kRedCodec,
58 &kCn8000Codec, &kCn16000Codec, &kTelephoneEventCodec,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000059};
solenberg85a04962015-10-27 03:35:21 -070060const uint32_t kSsrc1 = 0x99;
61const uint32_t kSsrc2 = 0x98;
62const 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
henrike@webrtc.org28e20752013-07-10 00:45:36 +000072 engine, // network
73 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000074 engine) { // volume
75 }
76};
77
wu@webrtc.org97077a32013-10-25 21:18:33 +000078class FakeVoETraceWrapper : public cricket::VoETraceWrapper {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000079 public:
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +020080 int SetTraceFilter(const unsigned int filter) override {
wu@webrtc.org97077a32013-10-25 21:18:33 +000081 filter_ = filter;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000082 return 0;
83 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +020084 int SetTraceFile(const char* fileNameUTF8) override { return 0; }
85 int SetTraceCallback(webrtc::TraceCallback* callback) override { return 0; }
wu@webrtc.org97077a32013-10-25 21:18:33 +000086 unsigned int filter_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000087};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020088} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089
90class WebRtcVoiceEngineTestFake : public testing::Test {
91 public:
henrike@webrtc.org28e20752013-07-10 00:45:36 +000092 WebRtcVoiceEngineTestFake()
Fredrik Solenberg709ed672015-09-15 12:26:33 +020093 : call_(webrtc::Call::Config()),
94 voe_(kAudioCodecs, ARRAY_SIZE(kAudioCodecs)),
wu@webrtc.org97077a32013-10-25 21:18:33 +000095 trace_wrapper_(new FakeVoETraceWrapper()),
Jelena Marusicc28a8962015-05-29 15:05:44 +020096 engine_(new FakeVoEWrapper(&voe_), trace_wrapper_),
97 channel_(nullptr) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +020098 send_parameters_.codecs.push_back(kPcmuCodec);
99 recv_parameters_.codecs.push_back(kPcmuCodec);
kwiberg102c6a62015-10-30 02:47:38 -0700100 options_adjust_agc_.adjust_agc_delta = rtc::Maybe<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000101 }
solenberg1ac56142015-10-13 03:58:19 -0700102 bool SetupEngine() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000103 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000104 return false;
105 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200106 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200107 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000108 }
solenberg1ac56142015-10-13 03:58:19 -0700109 bool SetupEngineWithRecvStream() {
110 if (!SetupEngine()) {
111 return false;
112 }
113 return channel_->AddRecvStream(
114 cricket::StreamParams::CreateLegacy(kSsrc1));
115 }
116 bool SetupEngineWithSendStream() {
117 if (!SetupEngine()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000118 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000119 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000120 return channel_->AddSendStream(
121 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000122 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000123 void SetupForMultiSendStream() {
solenberg1ac56142015-10-13 03:58:19 -0700124 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700125 // Remove stream added in Setup.
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000126 int default_channel_num = voe_.GetLastChannel();
solenberg85a04962015-10-27 03:35:21 -0700127 EXPECT_EQ(kSsrc1, voe_.GetLocalSSRC(default_channel_num));
128 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000129
solenberg0a617e22015-10-20 15:49:38 -0700130 // Verify the channel does not exist.
solenberg85a04962015-10-27 03:35:21 -0700131 EXPECT_EQ(-1, voe_.GetChannelFromLocalSsrc(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000132 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000133 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200134 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000135 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000136 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200137 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000138 delete channel_;
139 engine_.Terminate();
140 }
141
Peter Boström0c4e06b2015-10-07 12:23:21 +0200142 void TestInsertDtmf(uint32_t ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000143 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200144 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200145 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000146 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700147 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000148 // send stream.
149 EXPECT_TRUE(channel_->AddSendStream(
150 cricket::StreamParams::CreateLegacy(kSsrc1)));
151 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000152
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000153 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200154 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000155 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
156 EXPECT_FALSE(channel_->CanInsertDtmf());
157 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111, cricket::DF_SEND));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200158 send_parameters_.codecs.push_back(kTelephoneEventCodec);
159 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000160 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000161
162 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700163 // If this is callee, there's no active send channel yet.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000164 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
165 EXPECT_TRUE(channel_->AddSendStream(
166 cricket::StreamParams::CreateLegacy(kSsrc1)));
167 }
168
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000169 // Check we fail if the ssrc is invalid.
170 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111, cricket::DF_SEND));
171
172 // Test send
solenberg0a617e22015-10-20 15:49:38 -0700173 int channel_id = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000174 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
175 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
176 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
177
178 // Test play
179 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(3, 134));
180 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 3, 134, cricket::DF_PLAY));
181 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(3, 134));
182
183 // Test send and play
184 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
185 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(4, 145));
186 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 4, 145,
187 cricket::DF_PLAY | cricket::DF_SEND));
188 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
189 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(4, 145));
190 }
191
192 // Test that send bandwidth is set correctly.
193 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000194 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
195 // |expected_result| is the expected result from SetMaxSendBandwidth().
196 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000197 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000198 int max_bitrate,
199 bool expected_result,
200 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200201 cricket::AudioSendParameters parameters;
202 parameters.codecs.push_back(codec);
203 parameters.max_bandwidth_bps = max_bitrate;
204 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
205
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000206 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000207 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000208 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000209 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000210 }
211
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000212 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenberg0a617e22015-10-20 15:49:38 -0700213 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000214 int channel_num = voe_.GetLastChannel();
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000215
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000216 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000217 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000218
219 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200220 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000221 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200222 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000223 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000224
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000225 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200226 send_parameters_.extensions.clear();
227 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000228 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000229
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000230 // Ensure extension is set properly.
231 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200232 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
233 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000234 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000235
solenberg0a617e22015-10-20 15:49:38 -0700236 // Ensure extension is set properly on new channels.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000237 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700238 cricket::StreamParams::CreateLegacy(kSsrc2)));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000239 int new_channel_num = voe_.GetLastChannel();
240 EXPECT_NE(channel_num, new_channel_num);
241 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000242
243 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200244 send_parameters_.codecs.push_back(kPcmuCodec);
245 send_parameters_.extensions.clear();
246 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000247 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
248 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000249 }
250
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000251 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700252 EXPECT_TRUE(SetupEngineWithRecvStream());
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000253 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000254
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000255 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000256 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000257
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200258 cricket::AudioRecvParameters parameters;
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000259 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200260 parameters.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000261 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200262 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000263 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000264
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000265 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200266 parameters.extensions.clear();
267 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000268 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000269
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000270 // Ensure extension is set properly.
271 const int id = 2;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200272 parameters.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
273 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000274 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000275
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000276 // Ensure extension is set properly on new channel.
277 // The first stream to occupy the default channel.
278 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700279 cricket::StreamParams::CreateLegacy(kSsrc2)));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000280 int new_channel_num = voe_.GetLastChannel();
281 EXPECT_NE(channel_num, new_channel_num);
282 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
283
284 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200285 parameters.extensions.clear();
286 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000287 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
288 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000289 }
290
solenberg85a04962015-10-27 03:35:21 -0700291 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
292 webrtc::AudioSendStream::Stats stats;
293 stats.local_ssrc = 12;
294 stats.bytes_sent = 345;
295 stats.packets_sent = 678;
296 stats.packets_lost = 9012;
297 stats.fraction_lost = 34.56f;
298 stats.codec_name = "codec_name_send";
299 stats.ext_seqnum = 789;
300 stats.jitter_ms = 12;
301 stats.rtt_ms = 345;
302 stats.audio_level = 678;
303 stats.aec_quality_min = 9.01f;
304 stats.echo_delay_median_ms = 234;
305 stats.echo_delay_std_ms = 567;
306 stats.echo_return_loss = 890;
307 stats.echo_return_loss_enhancement = 1234;
308 stats.typing_noise_detected = true;
309 return stats;
310 }
311 void SetAudioSendStreamStats() {
312 for (auto* s : call_.GetAudioSendStreams()) {
313 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200314 }
solenberg85a04962015-10-27 03:35:21 -0700315 }
solenberg566ef242015-11-06 15:34:49 -0800316 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
317 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700318 const auto stats = GetAudioSendStreamStats();
319 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
320 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
321 EXPECT_EQ(info.packets_sent, stats.packets_sent);
322 EXPECT_EQ(info.packets_lost, stats.packets_lost);
323 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
324 EXPECT_EQ(info.codec_name, stats.codec_name);
325 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
326 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
327 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
328 EXPECT_EQ(info.audio_level, stats.audio_level);
329 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
330 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
331 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
332 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
333 EXPECT_EQ(info.echo_return_loss_enhancement,
334 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800335 EXPECT_EQ(info.typing_noise_detected,
336 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700337 }
338
339 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
340 webrtc::AudioReceiveStream::Stats stats;
341 stats.remote_ssrc = 123;
342 stats.bytes_rcvd = 456;
343 stats.packets_rcvd = 768;
344 stats.packets_lost = 101;
345 stats.fraction_lost = 23.45f;
346 stats.codec_name = "codec_name_recv";
347 stats.ext_seqnum = 678;
348 stats.jitter_ms = 901;
349 stats.jitter_buffer_ms = 234;
350 stats.jitter_buffer_preferred_ms = 567;
351 stats.delay_estimate_ms = 890;
352 stats.audio_level = 1234;
353 stats.expand_rate = 5.67f;
354 stats.speech_expand_rate = 8.90f;
355 stats.secondary_decoded_rate = 1.23f;
356 stats.accelerate_rate = 4.56f;
357 stats.preemptive_expand_rate = 7.89f;
358 stats.decoding_calls_to_silence_generator = 12;
359 stats.decoding_calls_to_neteq = 345;
360 stats.decoding_normal = 67890;
361 stats.decoding_plc = 1234;
362 stats.decoding_cng = 5678;
363 stats.decoding_plc_cng = 9012;
364 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200365 return stats;
366 }
367 void SetAudioReceiveStreamStats() {
368 for (auto* s : call_.GetAudioReceiveStreams()) {
369 s->SetStats(GetAudioReceiveStreamStats());
370 }
371 }
372 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700373 const auto stats = GetAudioReceiveStreamStats();
374 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
375 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
376 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
377 EXPECT_EQ(info.packets_lost, stats.packets_lost);
378 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
379 EXPECT_EQ(info.codec_name, stats.codec_name);
380 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
381 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
382 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200383 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700384 stats.jitter_buffer_preferred_ms);
385 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
386 EXPECT_EQ(info.audio_level, stats.audio_level);
387 EXPECT_EQ(info.expand_rate, stats.expand_rate);
388 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
389 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
390 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
391 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200392 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700393 stats.decoding_calls_to_silence_generator);
394 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
395 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
396 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
397 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
398 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
399 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200400 }
401
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000402 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200403 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000404 cricket::FakeWebRtcVoiceEngine voe_;
wu@webrtc.org97077a32013-10-25 21:18:33 +0000405 FakeVoETraceWrapper* trace_wrapper_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000406 cricket::WebRtcVoiceEngine engine_;
407 cricket::VoiceMediaChannel* channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000408
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200409 cricket::AudioSendParameters send_parameters_;
410 cricket::AudioRecvParameters recv_parameters_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000411 cricket::AudioOptions options_adjust_agc_;
412};
413
414// Tests that our stub library "works".
415TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
416 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000417 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000418 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000419 engine_.Terminate();
420 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000421}
422
423// Tests that we can create and destroy a channel.
424TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000425 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200426 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200427 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000428}
429
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000430// Tests that the list of supported codecs is created properly and ordered
431// correctly
432TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
433 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
434 ASSERT_FALSE(codecs.empty());
435 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
436 EXPECT_EQ(48000, codecs[0].clockrate);
437 EXPECT_EQ(2, codecs[0].channels);
438 EXPECT_EQ(64000, codecs[0].bitrate);
439 int pref = codecs[0].preference;
440 for (size_t i = 1; i < codecs.size(); ++i) {
441 EXPECT_GT(pref, codecs[i].preference);
442 pref = codecs[i].preference;
443 }
444}
445
446// Tests that we can find codecs by name or id, and that we interpret the
447// clockrate and bitrate fields properly.
448TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
449 cricket::AudioCodec codec;
450 webrtc::CodecInst codec_inst;
451 // Find PCMU with explicit clockrate and bitrate.
452 EXPECT_TRUE(engine_.FindWebRtcCodec(kPcmuCodec, &codec_inst));
453 // Find ISAC with explicit clockrate and 0 bitrate.
454 EXPECT_TRUE(engine_.FindWebRtcCodec(kIsacCodec, &codec_inst));
455 // Find telephone-event with explicit clockrate and 0 bitrate.
456 EXPECT_TRUE(engine_.FindWebRtcCodec(kTelephoneEventCodec, &codec_inst));
457 // Find ISAC with a different payload id.
458 codec = kIsacCodec;
459 codec.id = 127;
460 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
461 EXPECT_EQ(codec.id, codec_inst.pltype);
462 // Find PCMU with a 0 clockrate.
463 codec = kPcmuCodec;
464 codec.clockrate = 0;
465 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
466 EXPECT_EQ(codec.id, codec_inst.pltype);
467 EXPECT_EQ(8000, codec_inst.plfreq);
468 // Find PCMU with a 0 bitrate.
469 codec = kPcmuCodec;
470 codec.bitrate = 0;
471 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
472 EXPECT_EQ(codec.id, codec_inst.pltype);
473 EXPECT_EQ(64000, codec_inst.rate);
474 // Find ISAC with an explicit bitrate.
475 codec = kIsacCodec;
476 codec.bitrate = 32000;
477 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
478 EXPECT_EQ(codec.id, codec_inst.pltype);
479 EXPECT_EQ(32000, codec_inst.rate);
480}
481
482// Test that we set our inbound codecs properly, including changing PT.
483TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
484 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200485 cricket::AudioRecvParameters parameters;
486 parameters.codecs.push_back(kIsacCodec);
487 parameters.codecs.push_back(kPcmuCodec);
488 parameters.codecs.push_back(kTelephoneEventCodec);
489 parameters.codecs[0].id = 106; // collide with existing telephone-event
490 parameters.codecs[2].id = 126;
491 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700492 EXPECT_TRUE(channel_->AddRecvStream(
493 cricket::StreamParams::CreateLegacy(kSsrc1)));
494 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000495 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000496 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000497 gcodec.plfreq = 16000;
498 gcodec.channels = 1;
499 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
500 EXPECT_EQ(106, gcodec.pltype);
501 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000502 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000503 "telephone-event");
504 gcodec.plfreq = 8000;
505 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
506 EXPECT_EQ(126, gcodec.pltype);
507 EXPECT_STREQ("telephone-event", gcodec.plname);
508}
509
510// Test that we fail to set an unknown inbound codec.
511TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
512 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200513 cricket::AudioRecvParameters parameters;
514 parameters.codecs.push_back(kIsacCodec);
515 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
516 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000517}
518
519// Test that we fail if we have duplicate types in the inbound list.
520TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
521 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200522 cricket::AudioRecvParameters parameters;
523 parameters.codecs.push_back(kIsacCodec);
524 parameters.codecs.push_back(kCn16000Codec);
525 parameters.codecs[1].id = kIsacCodec.id;
526 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000527}
528
529// Test that we can decode OPUS without stereo parameters.
530TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
531 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200532 cricket::AudioRecvParameters parameters;
533 parameters.codecs.push_back(kIsacCodec);
534 parameters.codecs.push_back(kPcmuCodec);
535 parameters.codecs.push_back(kOpusCodec);
536 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000537 EXPECT_TRUE(channel_->AddRecvStream(
538 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700539 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000540 webrtc::CodecInst opus;
541 engine_.FindWebRtcCodec(kOpusCodec, &opus);
542 // Even without stereo parameters, recv codecs still specify channels = 2.
543 EXPECT_EQ(2, opus.channels);
544 EXPECT_EQ(111, opus.pltype);
545 EXPECT_STREQ("opus", opus.plname);
546 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700547 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000548 EXPECT_EQ(111, opus.pltype);
549}
550
551// Test that we can decode OPUS with stereo = 0.
552TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
553 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200554 cricket::AudioRecvParameters parameters;
555 parameters.codecs.push_back(kIsacCodec);
556 parameters.codecs.push_back(kPcmuCodec);
557 parameters.codecs.push_back(kOpusCodec);
558 parameters.codecs[2].params["stereo"] = "0";
559 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000560 EXPECT_TRUE(channel_->AddRecvStream(
561 cricket::StreamParams::CreateLegacy(kSsrc1)));
562 int channel_num2 = voe_.GetLastChannel();
563 webrtc::CodecInst opus;
564 engine_.FindWebRtcCodec(kOpusCodec, &opus);
565 // Even when stereo is off, recv codecs still specify channels = 2.
566 EXPECT_EQ(2, opus.channels);
567 EXPECT_EQ(111, opus.pltype);
568 EXPECT_STREQ("opus", opus.plname);
569 opus.pltype = 0;
570 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
571 EXPECT_EQ(111, opus.pltype);
572}
573
574// Test that we can decode OPUS with stereo = 1.
575TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
576 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200577 cricket::AudioRecvParameters parameters;
578 parameters.codecs.push_back(kIsacCodec);
579 parameters.codecs.push_back(kPcmuCodec);
580 parameters.codecs.push_back(kOpusCodec);
581 parameters.codecs[2].params["stereo"] = "1";
582 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000583 EXPECT_TRUE(channel_->AddRecvStream(
584 cricket::StreamParams::CreateLegacy(kSsrc1)));
585 int channel_num2 = voe_.GetLastChannel();
586 webrtc::CodecInst opus;
587 engine_.FindWebRtcCodec(kOpusCodec, &opus);
588 EXPECT_EQ(2, opus.channels);
589 EXPECT_EQ(111, opus.pltype);
590 EXPECT_STREQ("opus", opus.plname);
591 opus.pltype = 0;
592 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
593 EXPECT_EQ(111, opus.pltype);
594}
595
596// Test that changes to recv codecs are applied to all streams.
597TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
598 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200599 cricket::AudioRecvParameters parameters;
600 parameters.codecs.push_back(kIsacCodec);
601 parameters.codecs.push_back(kPcmuCodec);
602 parameters.codecs.push_back(kTelephoneEventCodec);
603 parameters.codecs[0].id = 106; // collide with existing telephone-event
604 parameters.codecs[2].id = 126;
605 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000606 EXPECT_TRUE(channel_->AddRecvStream(
607 cricket::StreamParams::CreateLegacy(kSsrc1)));
608 int channel_num2 = voe_.GetLastChannel();
609 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000610 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000611 gcodec.plfreq = 16000;
612 gcodec.channels = 1;
613 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
614 EXPECT_EQ(106, gcodec.pltype);
615 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000616 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617 "telephone-event");
618 gcodec.plfreq = 8000;
619 gcodec.channels = 1;
620 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
621 EXPECT_EQ(126, gcodec.pltype);
622 EXPECT_STREQ("telephone-event", gcodec.plname);
623}
624
625TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenberg1ac56142015-10-13 03:58:19 -0700626 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200627 cricket::AudioRecvParameters parameters;
628 parameters.codecs.push_back(kIsacCodec);
629 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200630 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631
632 int channel_num2 = voe_.GetLastChannel();
633 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000634 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000635 gcodec.plfreq = 16000;
636 gcodec.channels = 1;
637 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
638 EXPECT_EQ(106, gcodec.pltype);
639 EXPECT_STREQ("ISAC", gcodec.plname);
640}
641
642// Test that we can apply the same set of codecs again while playing.
643TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700644 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200645 cricket::AudioRecvParameters parameters;
646 parameters.codecs.push_back(kIsacCodec);
647 parameters.codecs.push_back(kCn16000Codec);
648 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000649 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200650 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000651
652 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200653 parameters.codecs[0].id = 127;
654 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
655 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000656 EXPECT_TRUE(voe_.GetPlayout(channel_num));
657}
658
659// Test that we can add a codec while playing.
660TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700661 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200662 cricket::AudioRecvParameters parameters;
663 parameters.codecs.push_back(kIsacCodec);
664 parameters.codecs.push_back(kCn16000Codec);
665 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000666 EXPECT_TRUE(channel_->SetPlayout(true));
667
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200668 parameters.codecs.push_back(kOpusCodec);
669 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
670 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000671 EXPECT_TRUE(voe_.GetPlayout(channel_num));
672 webrtc::CodecInst gcodec;
673 EXPECT_TRUE(engine_.FindWebRtcCodec(kOpusCodec, &gcodec));
674 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
675}
676
677TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenberg1ac56142015-10-13 03:58:19 -0700678 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000679
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000680 // Test that when autobw is enabled, bitrate is kept as the default
681 // value. autobw is enabled for the following tests because the target
682 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000683
684 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000685 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000686
687 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000688 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000689
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000690 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000691 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692}
693
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000694TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700695 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000696
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000697 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000698
699 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000700 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
701 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000702
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000703 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000704 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
705 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000706}
707
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000708TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700709 EXPECT_TRUE(SetupEngineWithSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000710
711 // Test that we can only set a maximum bitrate for a fixed-rate codec
712 // if it's bigger than the fixed rate.
713
714 // PCMU, fixed bitrate == 64000.
715 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
716 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
717 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
718 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
719 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
720 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
721 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
722}
723
724TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -0700725 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200726 const int kDesiredBitrate = 128000;
727 cricket::AudioSendParameters parameters;
728 parameters.codecs = engine_.codecs();
729 parameters.max_bandwidth_bps = kDesiredBitrate;
730 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000731
732 EXPECT_TRUE(channel_->AddSendStream(
733 cricket::StreamParams::CreateLegacy(kSsrc1)));
734
735 int channel_num = voe_.GetLastChannel();
736 webrtc::CodecInst codec;
737 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200738 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000739}
740
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000741// Test that bitrate cannot be set for CBR codecs.
742// Bitrate is ignored if it is higher than the fixed bitrate.
743// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000744TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenberg1ac56142015-10-13 03:58:19 -0700745 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000746
747 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200748 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
749 int channel_num = voe_.GetLastChannel();
750 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000751 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
752 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200753
754 send_parameters_.max_bandwidth_bps = 128000;
755 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000756 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
757 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200758
759 send_parameters_.max_bandwidth_bps = 128;
760 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000761 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
762 EXPECT_EQ(64000, codec.rate);
763}
764
765// Test that we apply codecs properly.
766TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
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(kIsacCodec);
770 parameters.codecs.push_back(kPcmuCodec);
771 parameters.codecs.push_back(kRedCodec);
772 parameters.codecs[0].id = 96;
773 parameters.codecs[0].bitrate = 48000;
774 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000775 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200776 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000777 webrtc::CodecInst gcodec;
778 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
779 EXPECT_EQ(96, gcodec.pltype);
780 EXPECT_EQ(48000, gcodec.rate);
781 EXPECT_STREQ("ISAC", gcodec.plname);
782 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000783 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000784 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
785 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
786 EXPECT_EQ(106, voe_.GetSendTelephoneEventPayloadType(channel_num));
787}
788
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000789// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
790// to apply.
791TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenberg1ac56142015-10-13 03:58:19 -0700792 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200793 cricket::AudioSendParameters parameters;
794 parameters.codecs.push_back(kIsacCodec);
795 parameters.codecs.push_back(kPcmuCodec);
796 parameters.codecs.push_back(kRedCodec);
797 parameters.codecs[0].id = 96;
798 parameters.codecs[0].bitrate = 48000;
799 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000800 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
801 // Calling SetSendCodec again with same codec which is already set.
802 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200803 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000804 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
805}
806
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000807// Verify that G722 is set with 16000 samples per second to WebRTC.
808TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenberg1ac56142015-10-13 03:58:19 -0700809 EXPECT_TRUE(SetupEngineWithSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000810 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200811 cricket::AudioSendParameters parameters;
812 parameters.codecs.push_back(kG722CodecSdp);
813 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000814 webrtc::CodecInst gcodec;
815 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
816 EXPECT_STREQ("G722", gcodec.plname);
817 EXPECT_EQ(1, gcodec.channels);
818 EXPECT_EQ(16000, gcodec.plfreq);
819}
820
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000821// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000822TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenberg1ac56142015-10-13 03:58:19 -0700823 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200824 cricket::AudioSendParameters parameters;
825 parameters.codecs.push_back(kOpusCodec);
826 parameters.codecs[0].bitrate = 0;
827 parameters.codecs[0].clockrate = 50000;
828 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000829}
830
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000831// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000832TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700833 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200834 cricket::AudioSendParameters parameters;
835 parameters.codecs.push_back(kOpusCodec);
836 parameters.codecs[0].bitrate = 0;
837 parameters.codecs[0].channels = 0;
838 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000839}
840
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000841// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000842TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700843 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200844 cricket::AudioSendParameters parameters;
845 parameters.codecs.push_back(kOpusCodec);
846 parameters.codecs[0].bitrate = 0;
847 parameters.codecs[0].channels = 0;
848 parameters.codecs[0].params["stereo"] = "1";
849 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000850}
851
852// Test that if channel is 1 for opus and there's no stereo, we fail.
853TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700854 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200855 cricket::AudioSendParameters parameters;
856 parameters.codecs.push_back(kOpusCodec);
857 parameters.codecs[0].bitrate = 0;
858 parameters.codecs[0].channels = 1;
859 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000860}
861
862// Test that if channel is 1 for opus and stereo=0, we fail.
863TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700864 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200865 cricket::AudioSendParameters parameters;
866 parameters.codecs.push_back(kOpusCodec);
867 parameters.codecs[0].bitrate = 0;
868 parameters.codecs[0].channels = 1;
869 parameters.codecs[0].params["stereo"] = "0";
870 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000871}
872
873// Test that if channel is 1 for opus and stereo=1, we fail.
874TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700875 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200876 cricket::AudioSendParameters parameters;
877 parameters.codecs.push_back(kOpusCodec);
878 parameters.codecs[0].bitrate = 0;
879 parameters.codecs[0].channels = 1;
880 parameters.codecs[0].params["stereo"] = "1";
881 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000882}
883
884// Test that with bitrate=0 and no stereo,
885// channels and bitrate are 1 and 32000.
886TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700887 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000888 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200889 cricket::AudioSendParameters parameters;
890 parameters.codecs.push_back(kOpusCodec);
891 parameters.codecs[0].bitrate = 0;
892 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000893 webrtc::CodecInst gcodec;
894 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
895 EXPECT_STREQ("opus", gcodec.plname);
896 EXPECT_EQ(1, gcodec.channels);
897 EXPECT_EQ(32000, gcodec.rate);
898}
899
900// Test that with bitrate=0 and stereo=0,
901// channels and bitrate are 1 and 32000.
902TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700903 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000904 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200905 cricket::AudioSendParameters parameters;
906 parameters.codecs.push_back(kOpusCodec);
907 parameters.codecs[0].bitrate = 0;
908 parameters.codecs[0].params["stereo"] = "0";
909 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000910 webrtc::CodecInst gcodec;
911 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
912 EXPECT_STREQ("opus", gcodec.plname);
913 EXPECT_EQ(1, gcodec.channels);
914 EXPECT_EQ(32000, gcodec.rate);
915}
916
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000917// Test that with bitrate=invalid and stereo=0,
918// channels and bitrate are 1 and 32000.
919TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700920 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000921 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200922 cricket::AudioSendParameters parameters;
923 parameters.codecs.push_back(kOpusCodec);
924 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000925 webrtc::CodecInst gcodec;
926
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000927 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200928 parameters.codecs[0].bitrate = 5999;
929 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000930 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
931 EXPECT_STREQ("opus", gcodec.plname);
932 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000933 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000934
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200935 parameters.codecs[0].bitrate = 510001;
936 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000937 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
938 EXPECT_STREQ("opus", gcodec.plname);
939 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000940 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000941}
942
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000943// Test that with bitrate=0 and stereo=1,
944// channels and bitrate are 2 and 64000.
945TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700946 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000947 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200948 cricket::AudioSendParameters parameters;
949 parameters.codecs.push_back(kOpusCodec);
950 parameters.codecs[0].bitrate = 0;
951 parameters.codecs[0].params["stereo"] = "1";
952 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000953 webrtc::CodecInst gcodec;
954 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
955 EXPECT_STREQ("opus", gcodec.plname);
956 EXPECT_EQ(2, gcodec.channels);
957 EXPECT_EQ(64000, gcodec.rate);
958}
959
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000960// Test that with bitrate=invalid and stereo=1,
961// channels and bitrate are 2 and 64000.
962TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700963 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000964 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200965 cricket::AudioSendParameters parameters;
966 parameters.codecs.push_back(kOpusCodec);
967 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000968 webrtc::CodecInst gcodec;
969
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000970 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200971 parameters.codecs[0].bitrate = 5999;
972 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000973 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
974 EXPECT_STREQ("opus", gcodec.plname);
975 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000976 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000977
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200978 parameters.codecs[0].bitrate = 510001;
979 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000980 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
981 EXPECT_STREQ("opus", gcodec.plname);
982 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000983 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000984}
985
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000986// Test that with bitrate=N and stereo unset,
987// channels and bitrate are 1 and N.
988TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700989 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000990 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200991 cricket::AudioSendParameters parameters;
992 parameters.codecs.push_back(kOpusCodec);
993 parameters.codecs[0].bitrate = 96000;
994 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000995 webrtc::CodecInst gcodec;
996 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
997 EXPECT_EQ(111, gcodec.pltype);
998 EXPECT_EQ(96000, gcodec.rate);
999 EXPECT_STREQ("opus", gcodec.plname);
1000 EXPECT_EQ(1, gcodec.channels);
1001 EXPECT_EQ(48000, gcodec.plfreq);
1002}
1003
1004// Test that with bitrate=N and stereo=0,
1005// channels and bitrate are 1 and N.
1006TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001007 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001008 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001009 cricket::AudioSendParameters parameters;
1010 parameters.codecs.push_back(kOpusCodec);
1011 parameters.codecs[0].bitrate = 30000;
1012 parameters.codecs[0].params["stereo"] = "0";
1013 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001014 webrtc::CodecInst gcodec;
1015 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1016 EXPECT_EQ(1, gcodec.channels);
1017 EXPECT_EQ(30000, gcodec.rate);
1018 EXPECT_STREQ("opus", gcodec.plname);
1019}
1020
1021// Test that with bitrate=N and without any parameters,
1022// channels and bitrate are 1 and N.
1023TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenberg1ac56142015-10-13 03:58:19 -07001024 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001025 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001026 cricket::AudioSendParameters parameters;
1027 parameters.codecs.push_back(kOpusCodec);
1028 parameters.codecs[0].bitrate = 30000;
1029 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001030 webrtc::CodecInst gcodec;
1031 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1032 EXPECT_EQ(1, gcodec.channels);
1033 EXPECT_EQ(30000, gcodec.rate);
1034 EXPECT_STREQ("opus", gcodec.plname);
1035}
1036
1037// Test that with bitrate=N and stereo=1,
1038// channels and bitrate are 2 and N.
1039TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001040 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001041 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001042 cricket::AudioSendParameters parameters;
1043 parameters.codecs.push_back(kOpusCodec);
1044 parameters.codecs[0].bitrate = 30000;
1045 parameters.codecs[0].params["stereo"] = "1";
1046 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001047 webrtc::CodecInst gcodec;
1048 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1049 EXPECT_EQ(2, gcodec.channels);
1050 EXPECT_EQ(30000, gcodec.rate);
1051 EXPECT_STREQ("opus", gcodec.plname);
1052}
1053
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001054// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1055// Also test that the "maxaveragebitrate" can't be set to values outside the
1056// range of 6000 and 510000
1057TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001058 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001059 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001060 cricket::AudioSendParameters parameters;
1061 parameters.codecs.push_back(kOpusCodec);
1062 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001063 webrtc::CodecInst gcodec;
1064
1065 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001066 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1067 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001068 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001069 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001070
1071 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001072 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1073 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001074 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001075 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001076
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001077 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1078 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001079 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1080 EXPECT_EQ(200000, gcodec.rate);
1081}
1082
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001083// Test that we can enable NACK with opus as caller.
1084TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001085 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001086 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001087 cricket::AudioSendParameters parameters;
1088 parameters.codecs.push_back(kOpusCodec);
1089 parameters.codecs[0].AddFeedbackParam(
1090 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1091 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001092 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001093 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001094 EXPECT_TRUE(voe_.GetNACK(channel_num));
1095}
1096
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001097// Test that we can enable NACK with opus as callee.
1098TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenberg0a617e22015-10-20 15:49:38 -07001099 EXPECT_TRUE(SetupEngineWithRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001100 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001101 cricket::AudioSendParameters parameters;
1102 parameters.codecs.push_back(kOpusCodec);
1103 parameters.codecs[0].AddFeedbackParam(
1104 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1105 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001106 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001107 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001108 EXPECT_FALSE(voe_.GetNACK(channel_num));
1109
1110 EXPECT_TRUE(channel_->AddSendStream(
1111 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001112 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001113}
1114
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001115// Test that we can enable NACK on receive streams.
1116TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001117 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001118 int channel_num1 = voe_.GetLastChannel();
1119 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1120 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001121 cricket::AudioSendParameters parameters;
1122 parameters.codecs.push_back(kOpusCodec);
1123 parameters.codecs[0].AddFeedbackParam(
1124 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1125 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001126 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1127 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001128 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001129 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1130 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1131}
1132
1133// Test that we can disable NACK.
1134TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001135 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001136 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001137 cricket::AudioSendParameters parameters;
1138 parameters.codecs.push_back(kOpusCodec);
1139 parameters.codecs[0].AddFeedbackParam(
1140 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1141 cricket::kParamValueEmpty));
1142 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001143 EXPECT_TRUE(voe_.GetNACK(channel_num));
1144
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001145 parameters.codecs.clear();
1146 parameters.codecs.push_back(kOpusCodec);
1147 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001148 EXPECT_FALSE(voe_.GetNACK(channel_num));
1149}
1150
1151// Test that we can disable NACK on receive streams.
1152TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001153 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001154 int channel_num1 = voe_.GetLastChannel();
1155 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1156 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001157 cricket::AudioSendParameters parameters;
1158 parameters.codecs.push_back(kOpusCodec);
1159 parameters.codecs[0].AddFeedbackParam(
1160 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1161 cricket::kParamValueEmpty));
1162 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001163 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1164 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1165
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001166 parameters.codecs.clear();
1167 parameters.codecs.push_back(kOpusCodec);
1168 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001169 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1170 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1171}
1172
1173// Test that NACK is enabled on a new receive stream.
1174TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001175 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001176 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001177 cricket::AudioSendParameters parameters;
1178 parameters.codecs.push_back(kIsacCodec);
1179 parameters.codecs.push_back(kCn16000Codec);
1180 parameters.codecs[0].AddFeedbackParam(
1181 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1182 cricket::kParamValueEmpty));
1183 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001184 EXPECT_TRUE(voe_.GetNACK(channel_num));
1185
1186 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1187 channel_num = voe_.GetLastChannel();
1188 EXPECT_TRUE(voe_.GetNACK(channel_num));
1189 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1190 channel_num = voe_.GetLastChannel();
1191 EXPECT_TRUE(voe_.GetNACK(channel_num));
1192}
1193
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001194// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001195TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenberg1ac56142015-10-13 03:58:19 -07001196 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001197 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001198 cricket::AudioSendParameters parameters;
1199 parameters.codecs.push_back(kOpusCodec);
1200 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001201 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1202}
1203
1204// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001205TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001206 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001207 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001208 cricket::AudioSendParameters parameters;
1209 parameters.codecs.push_back(kOpusCodec);
1210 parameters.codecs[0].bitrate = 0;
1211 parameters.codecs[0].params["useinbandfec"] = "0";
1212 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001213 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1214 webrtc::CodecInst gcodec;
1215 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1216 EXPECT_STREQ("opus", gcodec.plname);
1217 EXPECT_EQ(1, gcodec.channels);
1218 EXPECT_EQ(32000, gcodec.rate);
1219}
1220
1221// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001222TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001223 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001224 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001225 cricket::AudioSendParameters parameters;
1226 parameters.codecs.push_back(kOpusCodec);
1227 parameters.codecs[0].bitrate = 0;
1228 parameters.codecs[0].params["useinbandfec"] = "1";
1229 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001230 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1231 webrtc::CodecInst gcodec;
1232 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1233 EXPECT_STREQ("opus", gcodec.plname);
1234 EXPECT_EQ(1, gcodec.channels);
1235 EXPECT_EQ(32000, gcodec.rate);
1236}
1237
1238// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001239TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001240 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001241 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001242 cricket::AudioSendParameters parameters;
1243 parameters.codecs.push_back(kOpusCodec);
1244 parameters.codecs[0].bitrate = 0;
1245 parameters.codecs[0].params["stereo"] = "1";
1246 parameters.codecs[0].params["useinbandfec"] = "1";
1247 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001248 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1249 webrtc::CodecInst gcodec;
1250 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1251 EXPECT_STREQ("opus", gcodec.plname);
1252 EXPECT_EQ(2, gcodec.channels);
1253 EXPECT_EQ(64000, gcodec.rate);
1254}
1255
1256// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001257TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001258 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001259 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001260 cricket::AudioSendParameters parameters;
1261 parameters.codecs.push_back(kIsacCodec);
1262 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001263 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1264}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001265
1266// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1267TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001268 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001269 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001270 cricket::AudioSendParameters parameters;
1271 parameters.codecs.push_back(kIsacCodec);
1272 parameters.codecs[0].params["useinbandfec"] = "1";
1273 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001274 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1275}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001276
1277// Test that Opus FEC status can be changed.
1278TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenberg1ac56142015-10-13 03:58:19 -07001279 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001280 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001281 cricket::AudioSendParameters parameters;
1282 parameters.codecs.push_back(kOpusCodec);
1283 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001284 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001285 parameters.codecs[0].params["useinbandfec"] = "1";
1286 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001287 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1288}
1289
1290// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1291TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenberg1ac56142015-10-13 03:58:19 -07001292 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001293 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001294 cricket::AudioSendParameters parameters;
1295 parameters.codecs.push_back(kOpusCodec);
1296 parameters.codecs[0].bitrate = 0;
1297 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1298 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001299 EXPECT_EQ(cricket::kOpusBandwidthNb,
1300 voe_.GetMaxEncodingBandwidth(channel_num));
1301 webrtc::CodecInst gcodec;
1302 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1303 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001304
1305 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001306 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1307 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001308 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1309 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001310}
1311
1312// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1313TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenberg1ac56142015-10-13 03:58:19 -07001314 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001315 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001316 cricket::AudioSendParameters parameters;
1317 parameters.codecs.push_back(kOpusCodec);
1318 parameters.codecs[0].bitrate = 0;
1319 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1320 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001321 EXPECT_EQ(cricket::kOpusBandwidthMb,
1322 voe_.GetMaxEncodingBandwidth(channel_num));
1323 webrtc::CodecInst gcodec;
1324 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1325 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001326
1327 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001328 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1329 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001330 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1331 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001332}
1333
1334// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1335TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenberg1ac56142015-10-13 03:58:19 -07001336 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001337 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001338 cricket::AudioSendParameters parameters;
1339 parameters.codecs.push_back(kOpusCodec);
1340 parameters.codecs[0].bitrate = 0;
1341 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1342 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001343 EXPECT_EQ(cricket::kOpusBandwidthWb,
1344 voe_.GetMaxEncodingBandwidth(channel_num));
1345 webrtc::CodecInst gcodec;
1346 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1347 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001348
1349 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001350 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1351 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001352 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1353 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001354}
1355
1356// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1357TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenberg1ac56142015-10-13 03:58:19 -07001358 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001359 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001360 cricket::AudioSendParameters parameters;
1361 parameters.codecs.push_back(kOpusCodec);
1362 parameters.codecs[0].bitrate = 0;
1363 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1364 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001365 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1366 voe_.GetMaxEncodingBandwidth(channel_num));
1367 webrtc::CodecInst gcodec;
1368 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1369 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001370
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001371 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001372 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1373 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001374 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1375 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001376}
1377
1378// Test 24000 < maxplaybackrate triggers Opus full band mode.
1379TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenberg1ac56142015-10-13 03:58:19 -07001380 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001381 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001382 cricket::AudioSendParameters parameters;
1383 parameters.codecs.push_back(kOpusCodec);
1384 parameters.codecs[0].bitrate = 0;
1385 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1386 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001387 EXPECT_EQ(cricket::kOpusBandwidthFb,
1388 voe_.GetMaxEncodingBandwidth(channel_num));
1389 webrtc::CodecInst gcodec;
1390 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1391 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001392
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001393 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001394 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1395 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001396 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1397 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001398}
1399
1400// Test Opus that without maxplaybackrate, default playback rate is used.
1401TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001402 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001403 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001404 cricket::AudioSendParameters parameters;
1405 parameters.codecs.push_back(kOpusCodec);
1406 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001407 EXPECT_EQ(cricket::kOpusBandwidthFb,
1408 voe_.GetMaxEncodingBandwidth(channel_num));
1409}
1410
1411// Test the with non-Opus, maxplaybackrate has no effect.
1412TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001413 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001414 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001415 cricket::AudioSendParameters parameters;
1416 parameters.codecs.push_back(kIsacCodec);
1417 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1418 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001419 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1420}
1421
1422// Test maxplaybackrate can be set on two streams.
1423TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001424 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001425 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001426 cricket::AudioSendParameters parameters;
1427 parameters.codecs.push_back(kOpusCodec);
1428 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001429 // Default bandwidth is 24000.
1430 EXPECT_EQ(cricket::kOpusBandwidthFb,
1431 voe_.GetMaxEncodingBandwidth(channel_num));
1432
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001433 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001434
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001435 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001436 EXPECT_EQ(cricket::kOpusBandwidthNb,
1437 voe_.GetMaxEncodingBandwidth(channel_num));
1438
1439 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1440 channel_num = voe_.GetLastChannel();
1441 EXPECT_EQ(cricket::kOpusBandwidthNb,
1442 voe_.GetMaxEncodingBandwidth(channel_num));
1443}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001444
Minyue Li7100dcd2015-03-27 05:05:59 +01001445// Test that with usedtx=0, Opus DTX is off.
1446TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001447 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001448 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001449 cricket::AudioSendParameters parameters;
1450 parameters.codecs.push_back(kOpusCodec);
1451 parameters.codecs[0].params["usedtx"] = "0";
1452 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001453 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1454}
1455
1456// Test that with usedtx=1, Opus DTX is on.
1457TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001458 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001459 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001460 cricket::AudioSendParameters parameters;
1461 parameters.codecs.push_back(kOpusCodec);
1462 parameters.codecs[0].params["usedtx"] = "1";
1463 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001464 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1465 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1466}
1467
1468// Test that usedtx=1 works with stereo Opus.
1469TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001470 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001471 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001472 cricket::AudioSendParameters parameters;
1473 parameters.codecs.push_back(kOpusCodec);
1474 parameters.codecs[0].params["usedtx"] = "1";
1475 parameters.codecs[0].params["stereo"] = "1";
1476 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001477 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1478 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1479}
1480
1481// Test that usedtx=1 does not work with non Opus.
1482TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001483 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001484 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001485 cricket::AudioSendParameters parameters;
1486 parameters.codecs.push_back(kIsacCodec);
1487 parameters.codecs[0].params["usedtx"] = "1";
1488 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001489 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1490}
1491
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001492// Test that we can switch back and forth between Opus and ISAC with CN.
1493TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenberg1ac56142015-10-13 03:58:19 -07001494 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001495 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001496 cricket::AudioSendParameters opus_parameters;
1497 opus_parameters.codecs.push_back(kOpusCodec);
1498 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001499 webrtc::CodecInst gcodec;
1500 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001501 EXPECT_EQ(111, gcodec.pltype);
1502 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001503
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001504 cricket::AudioSendParameters isac_parameters;
1505 isac_parameters.codecs.push_back(kIsacCodec);
1506 isac_parameters.codecs.push_back(kCn16000Codec);
1507 isac_parameters.codecs.push_back(kOpusCodec);
1508 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001509 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1510 EXPECT_EQ(103, gcodec.pltype);
1511 EXPECT_STREQ("ISAC", gcodec.plname);
1512
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001513 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001514 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001515 EXPECT_EQ(111, gcodec.pltype);
1516 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001517}
1518
1519// Test that we handle various ways of specifying bitrate.
1520TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001521 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001522 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001523 cricket::AudioSendParameters parameters;
1524 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1525 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001526 webrtc::CodecInst gcodec;
1527 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1528 EXPECT_EQ(103, gcodec.pltype);
1529 EXPECT_STREQ("ISAC", gcodec.plname);
1530 EXPECT_EQ(32000, gcodec.rate);
1531
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001532 parameters.codecs[0].bitrate = 0; // bitrate == default
1533 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001534 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1535 EXPECT_EQ(103, gcodec.pltype);
1536 EXPECT_STREQ("ISAC", gcodec.plname);
1537 EXPECT_EQ(-1, gcodec.rate);
1538
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001539 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1540 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001541 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1542 EXPECT_EQ(103, gcodec.pltype);
1543 EXPECT_STREQ("ISAC", gcodec.plname);
1544 EXPECT_EQ(28000, gcodec.rate);
1545
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001546 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1547 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001548 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1549 EXPECT_EQ(0, gcodec.pltype);
1550 EXPECT_STREQ("PCMU", gcodec.plname);
1551 EXPECT_EQ(64000, gcodec.rate);
1552
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001553 parameters.codecs[0].bitrate = 0; // bitrate == default
1554 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001555 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1556 EXPECT_EQ(0, gcodec.pltype);
1557 EXPECT_STREQ("PCMU", gcodec.plname);
1558 EXPECT_EQ(64000, gcodec.rate);
1559
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001560 parameters.codecs[0] = kOpusCodec;
1561 parameters.codecs[0].bitrate = 0; // bitrate == default
1562 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001563 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1564 EXPECT_EQ(111, gcodec.pltype);
1565 EXPECT_STREQ("opus", gcodec.plname);
1566 EXPECT_EQ(32000, gcodec.rate);
1567}
1568
Brave Yao5225dd82015-03-26 07:39:19 +08001569// Test that we could set packet size specified in kCodecParamPTime.
1570TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenberg1ac56142015-10-13 03:58:19 -07001571 EXPECT_TRUE(SetupEngineWithSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001572 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001573 cricket::AudioSendParameters parameters;
1574 parameters.codecs.push_back(kOpusCodec);
1575 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1576 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001577 webrtc::CodecInst gcodec;
1578 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1579 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1580
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001581 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1582 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001583 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1584 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1585
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001586 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1587 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001588 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1589 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1590
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001591 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1592 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1593 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001594 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1595 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1596
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001597 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1598 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1599 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001600 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1601 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1602}
1603
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001604// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001605TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenberg1ac56142015-10-13 03:58:19 -07001606 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001607 cricket::AudioSendParameters parameters;
1608 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001609}
1610
1611// Test that we can set send codecs even with telephone-event codec as the first
1612// one on the list.
1613TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001614 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001615 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001616 cricket::AudioSendParameters parameters;
1617 parameters.codecs.push_back(kTelephoneEventCodec);
1618 parameters.codecs.push_back(kIsacCodec);
1619 parameters.codecs.push_back(kPcmuCodec);
1620 parameters.codecs[0].id = 98; // DTMF
1621 parameters.codecs[1].id = 96;
1622 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001623 webrtc::CodecInst gcodec;
1624 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001625 EXPECT_EQ(96, gcodec.pltype);
1626 EXPECT_STREQ("ISAC", gcodec.plname);
1627 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1628}
1629
1630// Test that we can set send codecs even with CN codec as the first
1631// one on the list.
1632TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001633 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001634 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001635 cricket::AudioSendParameters parameters;
1636 parameters.codecs.push_back(kCn16000Codec);
1637 parameters.codecs.push_back(kIsacCodec);
1638 parameters.codecs.push_back(kPcmuCodec);
1639 parameters.codecs[0].id = 98; // wideband CN
1640 parameters.codecs[1].id = 96;
1641 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001642 webrtc::CodecInst gcodec;
1643 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1644 EXPECT_EQ(96, gcodec.pltype);
1645 EXPECT_STREQ("ISAC", gcodec.plname);
1646 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001647}
1648
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001649// Test that we set VAD and DTMF types correctly as caller.
1650TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001651 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001652 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001653 cricket::AudioSendParameters parameters;
1654 parameters.codecs.push_back(kIsacCodec);
1655 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001656 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001657 parameters.codecs.push_back(kCn16000Codec);
1658 parameters.codecs.push_back(kCn8000Codec);
1659 parameters.codecs.push_back(kTelephoneEventCodec);
1660 parameters.codecs.push_back(kRedCodec);
1661 parameters.codecs[0].id = 96;
1662 parameters.codecs[2].id = 97; // wideband CN
1663 parameters.codecs[4].id = 98; // DTMF
1664 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001665 webrtc::CodecInst gcodec;
1666 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1667 EXPECT_EQ(96, gcodec.pltype);
1668 EXPECT_STREQ("ISAC", gcodec.plname);
1669 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001670 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001671 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1672 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1673 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1674}
1675
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001676// Test that we set VAD and DTMF types correctly as callee.
1677TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001678 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001679 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001680 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001681
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001682 cricket::AudioSendParameters parameters;
1683 parameters.codecs.push_back(kIsacCodec);
1684 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001685 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001686 parameters.codecs.push_back(kCn16000Codec);
1687 parameters.codecs.push_back(kCn8000Codec);
1688 parameters.codecs.push_back(kTelephoneEventCodec);
1689 parameters.codecs.push_back(kRedCodec);
1690 parameters.codecs[0].id = 96;
1691 parameters.codecs[2].id = 97; // wideband CN
1692 parameters.codecs[4].id = 98; // DTMF
1693 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001694 EXPECT_TRUE(channel_->AddSendStream(
1695 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001696 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001697
1698 webrtc::CodecInst gcodec;
1699 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1700 EXPECT_EQ(96, gcodec.pltype);
1701 EXPECT_STREQ("ISAC", gcodec.plname);
1702 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001703 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001704 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1705 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1706 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1707}
1708
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001709// Test that we only apply VAD if we have a CN codec that matches the
1710// send codec clockrate.
1711TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
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;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001715 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001716 parameters.codecs.push_back(kIsacCodec);
1717 parameters.codecs.push_back(kCn16000Codec);
1718 parameters.codecs[1].id = 97;
1719 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001720 webrtc::CodecInst gcodec;
1721 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1722 EXPECT_STREQ("ISAC", gcodec.plname);
1723 EXPECT_TRUE(voe_.GetVAD(channel_num));
1724 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1725 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001726 parameters.codecs[0] = kPcmuCodec;
1727 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001728 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1729 EXPECT_STREQ("PCMU", gcodec.plname);
1730 EXPECT_FALSE(voe_.GetVAD(channel_num));
1731 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001732 parameters.codecs[1] = kCn8000Codec;
1733 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001734 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1735 EXPECT_STREQ("PCMU", gcodec.plname);
1736 EXPECT_TRUE(voe_.GetVAD(channel_num));
1737 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001738 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001739 parameters.codecs[0] = kIsacCodec;
1740 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001741 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1742 EXPECT_STREQ("ISAC", gcodec.plname);
1743 EXPECT_FALSE(voe_.GetVAD(channel_num));
1744}
1745
1746// Test that we perform case-insensitive matching of codec names.
1747TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenberg1ac56142015-10-13 03:58:19 -07001748 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001749 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001750 cricket::AudioSendParameters parameters;
1751 parameters.codecs.push_back(kIsacCodec);
1752 parameters.codecs.push_back(kPcmuCodec);
1753 parameters.codecs.push_back(kCn16000Codec);
1754 parameters.codecs.push_back(kCn8000Codec);
1755 parameters.codecs.push_back(kTelephoneEventCodec);
1756 parameters.codecs.push_back(kRedCodec);
1757 parameters.codecs[0].name = "iSaC";
1758 parameters.codecs[0].id = 96;
1759 parameters.codecs[2].id = 97; // wideband CN
1760 parameters.codecs[4].id = 98; // DTMF
1761 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001762 webrtc::CodecInst gcodec;
1763 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1764 EXPECT_EQ(96, gcodec.pltype);
1765 EXPECT_STREQ("ISAC", gcodec.plname);
1766 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001767 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001768 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1769 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1770 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1771}
1772
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001773// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001774TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001775 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001776 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001777 cricket::AudioSendParameters parameters;
1778 parameters.codecs.push_back(kRedCodec);
1779 parameters.codecs.push_back(kIsacCodec);
1780 parameters.codecs.push_back(kPcmuCodec);
1781 parameters.codecs[0].id = 127;
1782 parameters.codecs[0].params[""] = "96/96";
1783 parameters.codecs[1].id = 96;
1784 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001785 webrtc::CodecInst gcodec;
1786 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1787 EXPECT_EQ(96, gcodec.pltype);
1788 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001789 EXPECT_TRUE(voe_.GetRED(channel_num));
1790 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001791}
1792
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001793// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001794TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001795 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001796 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001797 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001798
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001799 cricket::AudioSendParameters parameters;
1800 parameters.codecs.push_back(kRedCodec);
1801 parameters.codecs.push_back(kIsacCodec);
1802 parameters.codecs.push_back(kPcmuCodec);
1803 parameters.codecs[0].id = 127;
1804 parameters.codecs[0].params[""] = "96/96";
1805 parameters.codecs[1].id = 96;
1806 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001807 EXPECT_TRUE(channel_->AddSendStream(
1808 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001809 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001810 webrtc::CodecInst gcodec;
1811 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1812 EXPECT_EQ(96, gcodec.pltype);
1813 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001814 EXPECT_TRUE(voe_.GetRED(channel_num));
1815 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001816}
1817
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001818// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001819TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenberg1ac56142015-10-13 03:58:19 -07001820 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001821 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001822 cricket::AudioSendParameters parameters;
1823 parameters.codecs.push_back(kRedCodec);
1824 parameters.codecs.push_back(kIsacCodec);
1825 parameters.codecs.push_back(kPcmuCodec);
1826 parameters.codecs[0].id = 127;
1827 parameters.codecs[1].id = 96;
1828 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001829 webrtc::CodecInst gcodec;
1830 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1831 EXPECT_EQ(96, gcodec.pltype);
1832 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001833 EXPECT_TRUE(voe_.GetRED(channel_num));
1834 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001835}
1836
1837// Test that we ignore RED if the parameters aren't named the way we expect.
1838TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001839 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001840 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001841 cricket::AudioSendParameters parameters;
1842 parameters.codecs.push_back(kRedCodec);
1843 parameters.codecs.push_back(kIsacCodec);
1844 parameters.codecs.push_back(kPcmuCodec);
1845 parameters.codecs[0].id = 127;
1846 parameters.codecs[0].params["ABC"] = "96/96";
1847 parameters.codecs[1].id = 96;
1848 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001849 webrtc::CodecInst gcodec;
1850 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1851 EXPECT_EQ(96, gcodec.pltype);
1852 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001853 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001854}
1855
1856// Test that we ignore RED if it uses different primary/secondary encoding.
1857TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001858 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001859 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001860 cricket::AudioSendParameters parameters;
1861 parameters.codecs.push_back(kRedCodec);
1862 parameters.codecs.push_back(kIsacCodec);
1863 parameters.codecs.push_back(kPcmuCodec);
1864 parameters.codecs[0].id = 127;
1865 parameters.codecs[0].params[""] = "96/0";
1866 parameters.codecs[1].id = 96;
1867 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001868 webrtc::CodecInst gcodec;
1869 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1870 EXPECT_EQ(96, gcodec.pltype);
1871 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001872 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001873}
1874
1875// Test that we ignore RED if it uses more than 2 encodings.
1876TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001877 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001878 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001879 cricket::AudioSendParameters parameters;
1880 parameters.codecs.push_back(kRedCodec);
1881 parameters.codecs.push_back(kIsacCodec);
1882 parameters.codecs.push_back(kPcmuCodec);
1883 parameters.codecs[0].id = 127;
1884 parameters.codecs[0].params[""] = "96/96/96";
1885 parameters.codecs[1].id = 96;
1886 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001887 webrtc::CodecInst gcodec;
1888 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1889 EXPECT_EQ(96, gcodec.pltype);
1890 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001891 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001892}
1893
1894// Test that we ignore RED if it has bogus codec ids.
1895TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001896 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001897 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001898 cricket::AudioSendParameters parameters;
1899 parameters.codecs.push_back(kRedCodec);
1900 parameters.codecs.push_back(kIsacCodec);
1901 parameters.codecs.push_back(kPcmuCodec);
1902 parameters.codecs[0].id = 127;
1903 parameters.codecs[0].params[""] = "ABC/ABC";
1904 parameters.codecs[1].id = 96;
1905 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001906 webrtc::CodecInst gcodec;
1907 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1908 EXPECT_EQ(96, gcodec.pltype);
1909 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001910 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001911}
1912
1913// Test that we ignore RED if it refers to a codec that is not present.
1914TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001915 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001916 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001917 cricket::AudioSendParameters parameters;
1918 parameters.codecs.push_back(kRedCodec);
1919 parameters.codecs.push_back(kIsacCodec);
1920 parameters.codecs.push_back(kPcmuCodec);
1921 parameters.codecs[0].id = 127;
1922 parameters.codecs[0].params[""] = "97/97";
1923 parameters.codecs[1].id = 96;
1924 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001925 webrtc::CodecInst gcodec;
1926 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1927 EXPECT_EQ(96, gcodec.pltype);
1928 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001929 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001930}
1931
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001932// Test support for audio level header extension.
1933TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1934 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001935}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001936TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1937 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1938}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001939
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001940// Test support for absolute send time header extension.
1941TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1942 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1943}
1944TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1945 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001946}
1947
solenberg1ac56142015-10-13 03:58:19 -07001948// Test that we can create a channel and start sending on it.
1949TEST_F(WebRtcVoiceEngineTestFake, Send) {
1950 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001951 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001952 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001953 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1954 EXPECT_TRUE(voe_.GetSend(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001955 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1956 EXPECT_FALSE(voe_.GetSend(channel_num));
solenberg1ac56142015-10-13 03:58:19 -07001957}
1958
1959// Test that we can create a channel and start playing out on it.
1960TEST_F(WebRtcVoiceEngineTestFake, Playout) {
1961 EXPECT_TRUE(SetupEngineWithRecvStream());
1962 int channel_num = voe_.GetLastChannel();
1963 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
1964 EXPECT_TRUE(channel_->SetPlayout(true));
1965 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001966 EXPECT_TRUE(channel_->SetPlayout(false));
1967 EXPECT_FALSE(voe_.GetPlayout(channel_num));
1968}
1969
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001970// Test that we can add and remove send streams.
1971TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
1972 SetupForMultiSendStream();
1973
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001974 // Set the global state for sending.
1975 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1976
solenbergc96df772015-10-21 13:01:53 -07001977 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001978 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07001979 cricket::StreamParams::CreateLegacy(ssrc)));
1980 EXPECT_NE(nullptr, call_.GetAudioSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001981
1982 // Verify that we are in a sending state for all the created streams.
solenbergc96df772015-10-21 13:01:53 -07001983 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001984 EXPECT_TRUE(voe_.GetSend(channel_num));
1985 }
solenbergc96df772015-10-21 13:01:53 -07001986 EXPECT_EQ(ARRAY_SIZE(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001987
solenbergc96df772015-10-21 13:01:53 -07001988 // Delete the send streams.
1989 for (uint32_t ssrc : kSsrcs4) {
1990 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
1991 EXPECT_EQ(nullptr, call_.GetAudioSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001992 // Stream should already be deleted.
solenbergc96df772015-10-21 13:01:53 -07001993 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
1994 EXPECT_EQ(-1, voe_.GetChannelFromLocalSsrc(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001995 }
solenbergc96df772015-10-21 13:01:53 -07001996 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001997}
1998
1999// Test SetSendCodecs correctly configure the codecs in all send streams.
2000TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2001 SetupForMultiSendStream();
2002
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002003 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002004 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002005 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002006 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002007 }
2008
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002009 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002010 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002011 parameters.codecs.push_back(kIsacCodec);
2012 parameters.codecs.push_back(kCn16000Codec);
2013 parameters.codecs[1].id = 97;
2014 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002015
2016 // Verify ISAC and VAD are corrected configured on all send channels.
2017 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002018 for (uint32_t ssrc : kSsrcs4) {
2019 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002020 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2021 EXPECT_STREQ("ISAC", gcodec.plname);
2022 EXPECT_TRUE(voe_.GetVAD(channel_num));
2023 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2024 }
2025
2026 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002027 parameters.codecs[0] = kPcmuCodec;
2028 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002029 for (uint32_t ssrc : kSsrcs4) {
2030 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002031 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2032 EXPECT_STREQ("PCMU", gcodec.plname);
2033 EXPECT_FALSE(voe_.GetVAD(channel_num));
2034 }
2035}
2036
2037// Test we can SetSend on all send streams correctly.
2038TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2039 SetupForMultiSendStream();
2040
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002041 // Create the send channels and they should be a SEND_NOTHING date.
solenbergc96df772015-10-21 13:01:53 -07002042 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002043 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002044 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002045 int channel_num = voe_.GetLastChannel();
2046 EXPECT_FALSE(voe_.GetSend(channel_num));
2047 }
2048
2049 // Set the global state for starting sending.
2050 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
solenbergc96df772015-10-21 13:01:53 -07002051 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002052 // Verify that we are in a sending state for all the send streams.
solenbergc96df772015-10-21 13:01:53 -07002053 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002054 EXPECT_TRUE(voe_.GetSend(channel_num));
2055 }
2056
2057 // Set the global state for stopping sending.
2058 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
solenbergc96df772015-10-21 13:01:53 -07002059 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002060 // Verify that we are in a stop state for all the send streams.
solenbergc96df772015-10-21 13:01:53 -07002061 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002062 EXPECT_FALSE(voe_.GetSend(channel_num));
2063 }
2064}
2065
2066// Test we can set the correct statistics on all send streams.
2067TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2068 SetupForMultiSendStream();
2069
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002070 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002071 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002072 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002073 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002074 }
solenberg85a04962015-10-27 03:35:21 -07002075 SetAudioSendStreamStats();
2076
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002077 // Create a receive stream to check that none of the send streams end up in
2078 // the receive stream stats.
2079 EXPECT_TRUE(channel_->AddRecvStream(
2080 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002081 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002082 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2083 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002084
solenberg85a04962015-10-27 03:35:21 -07002085 // Check stats for the added streams.
2086 {
2087 cricket::VoiceMediaInfo info;
2088 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002089
solenberg85a04962015-10-27 03:35:21 -07002090 // We have added 4 send streams. We should see empty stats for all.
2091 EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size());
2092 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002093 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002094 }
2095
2096 // We have added one receive stream. We should see empty stats.
2097 EXPECT_EQ(info.receivers.size(), 1u);
2098 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002099 }
solenberg1ac56142015-10-13 03:58:19 -07002100
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002101 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002102 {
2103 cricket::VoiceMediaInfo info;
2104 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2105 EXPECT_EQ(true, channel_->GetStats(&info));
2106 EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size());
2107 EXPECT_EQ(0u, info.receivers.size());
2108 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002109
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002110 // Deliver a new packet - a default receive stream should be created and we
2111 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002112 {
2113 cricket::VoiceMediaInfo info;
2114 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2115 SetAudioReceiveStreamStats();
2116 EXPECT_EQ(true, channel_->GetStats(&info));
2117 EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size());
2118 EXPECT_EQ(1u, info.receivers.size());
2119 VerifyVoiceReceiverInfo(info.receivers[0]);
2120 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002121}
2122
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002123// Test that we can add and remove receive streams, and do proper send/playout.
2124// We can receive on multiple streams while sending one stream.
2125TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002126 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002127 int channel_num1 = voe_.GetLastChannel();
2128
solenberg1ac56142015-10-13 03:58:19 -07002129 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002130 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002131 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002132 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002133
solenberg1ac56142015-10-13 03:58:19 -07002134 // Adding another stream should enable playout on the new stream only.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002135 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2136 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002137 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2138 EXPECT_TRUE(voe_.GetSend(channel_num1));
2139 EXPECT_FALSE(voe_.GetSend(channel_num2));
2140
solenberg1ac56142015-10-13 03:58:19 -07002141 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002142 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2143 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2144
2145 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2146 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2147 int channel_num3 = voe_.GetLastChannel();
2148 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2149 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2150 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2151 EXPECT_FALSE(voe_.GetSend(channel_num3));
2152
2153 // Stop sending.
2154 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2155 EXPECT_FALSE(voe_.GetSend(channel_num1));
2156 EXPECT_FALSE(voe_.GetSend(channel_num2));
2157 EXPECT_FALSE(voe_.GetSend(channel_num3));
2158
2159 // Stop playout.
2160 EXPECT_TRUE(channel_->SetPlayout(false));
2161 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2162 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2163 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2164
solenberg1ac56142015-10-13 03:58:19 -07002165 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002166 EXPECT_TRUE(channel_->SetPlayout(true));
2167 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2168 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2169 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2170
solenberg1ac56142015-10-13 03:58:19 -07002171 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002172 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2173 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002174 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002175}
2176
2177// Test that we can set the devices to use.
2178TEST_F(WebRtcVoiceEngineTestFake, SetDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002179 EXPECT_TRUE(SetupEngineWithSendStream());
2180 int send_channel = voe_.GetLastChannel();
2181 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2182 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002183 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002184
2185 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2186 cricket::kFakeDefaultDeviceId);
2187 cricket::Device dev(cricket::kFakeDeviceName,
2188 cricket::kFakeDeviceId);
2189
2190 // Test SetDevices() while not sending or playing.
2191 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2192
2193 // Test SetDevices() while sending and playing.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002194 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2195 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002196 EXPECT_TRUE(voe_.GetSend(send_channel));
2197 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002198
2199 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2200
solenberg1ac56142015-10-13 03:58:19 -07002201 EXPECT_TRUE(voe_.GetSend(send_channel));
2202 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002203
2204 // Test that failure to open newly selected devices does not prevent opening
2205 // ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002206 voe_.set_playout_fail_channel(recv_channel);
2207 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002208
2209 EXPECT_FALSE(engine_.SetDevices(&default_dev, &default_dev));
2210
solenberg1ac56142015-10-13 03:58:19 -07002211 EXPECT_FALSE(voe_.GetSend(send_channel));
2212 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002213
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002214 voe_.set_playout_fail_channel(-1);
2215 voe_.set_send_fail_channel(-1);
2216
2217 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2218
solenberg1ac56142015-10-13 03:58:19 -07002219 EXPECT_TRUE(voe_.GetSend(send_channel));
2220 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002221}
2222
2223// Test that we can set the devices to use even if we failed to
2224// open the initial ones.
2225TEST_F(WebRtcVoiceEngineTestFake, SetDevicesWithInitiallyBadDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002226 EXPECT_TRUE(SetupEngineWithSendStream());
2227 int send_channel = voe_.GetLastChannel();
2228 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2229 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002230 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002231
2232 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2233 cricket::kFakeDefaultDeviceId);
2234 cricket::Device dev(cricket::kFakeDeviceName,
2235 cricket::kFakeDeviceId);
2236
2237 // Test that failure to open devices selected before starting
2238 // send/play does not prevent opening newly selected ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002239 voe_.set_playout_fail_channel(recv_channel);
2240 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002241
2242 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2243
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002244 EXPECT_FALSE(channel_->SetSend(cricket::SEND_MICROPHONE));
2245 EXPECT_FALSE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002246 EXPECT_FALSE(voe_.GetSend(send_channel));
2247 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002248
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002249 voe_.set_playout_fail_channel(-1);
2250 voe_.set_send_fail_channel(-1);
2251
2252 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2253
solenberg1ac56142015-10-13 03:58:19 -07002254 EXPECT_TRUE(voe_.GetSend(send_channel));
2255 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002256}
2257
2258// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002259// and start sending on it.
2260TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2261 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002262 int channel_num = voe_.GetLastChannel();
2263 webrtc::AgcConfig agc_config;
2264 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2265 EXPECT_EQ(0, agc_config.targetLeveldBOv);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002266 send_parameters_.options = options_adjust_agc_;
2267 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002268 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2269 EXPECT_TRUE(voe_.GetSend(channel_num));
2270 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2271 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002272 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2273 EXPECT_FALSE(voe_.GetSend(channel_num));
2274 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2275 EXPECT_EQ(0, agc_config.targetLeveldBOv); // level was restored
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002276}
2277
wu@webrtc.org97077a32013-10-25 21:18:33 +00002278TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002279 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002280 webrtc::AgcConfig agc_config;
2281 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2282 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2283
2284 cricket::AudioOptions options;
kwiberg102c6a62015-10-30 02:47:38 -07002285 options.tx_agc_target_dbov = rtc::Maybe<uint16_t>(3);
2286 options.tx_agc_digital_compression_gain = rtc::Maybe<uint16_t>(9);
2287 options.tx_agc_limiter = rtc::Maybe<bool>(true);
2288 options.auto_gain_control = rtc::Maybe<bool>(true);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002289 EXPECT_TRUE(engine_.SetOptions(options));
2290
2291 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2292 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2293 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2294 EXPECT_TRUE(agc_config.limiterEnable);
2295
2296 // Check interaction with adjust_agc_delta. Both should be respected, for
2297 // backwards compatibility.
kwiberg102c6a62015-10-30 02:47:38 -07002298 options.adjust_agc_delta = rtc::Maybe<int>(-10);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002299 EXPECT_TRUE(engine_.SetOptions(options));
2300
2301 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2302 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2303}
2304
wu@webrtc.org97077a32013-10-25 21:18:33 +00002305TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002306 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002307 cricket::AudioOptions options;
kwiberg102c6a62015-10-30 02:47:38 -07002308 options.recording_sample_rate = rtc::Maybe<uint32_t>(48000);
2309 options.playout_sample_rate = rtc::Maybe<uint32_t>(44100);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002310 EXPECT_TRUE(engine_.SetOptions(options));
2311
2312 unsigned int recording_sample_rate, playout_sample_rate;
2313 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2314 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2315 EXPECT_EQ(48000u, recording_sample_rate);
2316 EXPECT_EQ(44100u, playout_sample_rate);
2317}
2318
2319TEST_F(WebRtcVoiceEngineTestFake, TraceFilterViaTraceOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002320 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002321 engine_.SetLogging(rtc::LS_INFO, "");
wu@webrtc.org97077a32013-10-25 21:18:33 +00002322 EXPECT_EQ(
2323 // Info:
2324 webrtc::kTraceStateInfo | webrtc::kTraceInfo |
2325 // Warning:
2326 webrtc::kTraceTerseInfo | webrtc::kTraceWarning |
2327 // Error:
2328 webrtc::kTraceError | webrtc::kTraceCritical,
2329 static_cast<int>(trace_wrapper_->filter_));
2330 // Now set it explicitly
2331 std::string filter =
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002332 "tracefilter " + rtc::ToString(webrtc::kTraceDefault);
2333 engine_.SetLogging(rtc::LS_VERBOSE, filter.c_str());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002334 EXPECT_EQ(static_cast<unsigned int>(webrtc::kTraceDefault),
2335 trace_wrapper_->filter_);
2336}
2337
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002338// Test that we can set the outgoing SSRC properly.
2339// SSRC is set in SetupEngine by calling AddSendStream.
2340TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002341 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002342 EXPECT_EQ(kSsrc1, voe_.GetLocalSSRC(voe_.GetLastChannel()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002343}
2344
2345TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2346 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002347 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002348 SetAudioSendStreamStats();
solenberg1ac56142015-10-13 03:58:19 -07002349 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2350 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002351 EXPECT_TRUE(channel_->AddRecvStream(
2352 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002353 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2354 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002355
solenberg85a04962015-10-27 03:35:21 -07002356 // Check stats for the added streams.
2357 {
2358 cricket::VoiceMediaInfo info;
2359 EXPECT_EQ(true, channel_->GetStats(&info));
2360
2361 // We have added one send stream. We should see the stats we've set.
2362 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002363 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002364 // We have added one receive stream. We should see empty stats.
2365 EXPECT_EQ(info.receivers.size(), 1u);
2366 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2367 }
solenberg1ac56142015-10-13 03:58:19 -07002368
solenberg566ef242015-11-06 15:34:49 -08002369 // Start sending - this affects some reported stats.
2370 {
2371 cricket::VoiceMediaInfo info;
2372 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2373 EXPECT_EQ(true, channel_->GetStats(&info));
2374 VerifyVoiceSenderInfo(info.senders[0], true);
2375 }
2376
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002377 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002378 {
2379 cricket::VoiceMediaInfo info;
2380 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2381 EXPECT_EQ(true, channel_->GetStats(&info));
2382 EXPECT_EQ(1u, info.senders.size());
2383 EXPECT_EQ(0u, info.receivers.size());
2384 }
solenberg1ac56142015-10-13 03:58:19 -07002385
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002386 // Deliver a new packet - a default receive stream should be created and we
2387 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002388 {
2389 cricket::VoiceMediaInfo info;
2390 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2391 SetAudioReceiveStreamStats();
2392 EXPECT_EQ(true, channel_->GetStats(&info));
2393 EXPECT_EQ(1u, info.senders.size());
2394 EXPECT_EQ(1u, info.receivers.size());
2395 VerifyVoiceReceiverInfo(info.receivers[0]);
2396 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002397}
2398
2399// Test that we can set the outgoing SSRC properly with multiple streams.
2400// SSRC is set in SetupEngine by calling AddSendStream.
2401TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002402 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002403 EXPECT_EQ(kSsrc1, voe_.GetLocalSSRC(voe_.GetLastChannel()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002404 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
solenberg85a04962015-10-27 03:35:21 -07002405 EXPECT_EQ(kSsrc1, voe_.GetLocalSSRC(voe_.GetLastChannel()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002406}
2407
2408// Test that the local SSRC is the same on sending and receiving channels if the
2409// receive channel is created before the send channel.
2410TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002411 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002412 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002413
2414 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2415 int receive_channel_num = voe_.GetLastChannel();
2416 EXPECT_TRUE(channel_->AddSendStream(
2417 cricket::StreamParams::CreateLegacy(1234)));
2418 int send_channel_num = voe_.GetLastChannel();
2419
solenberg85a04962015-10-27 03:35:21 -07002420 EXPECT_EQ(1234U, voe_.GetLocalSSRC(send_channel_num));
2421 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002422}
2423
2424// Test that we can properly receive packets.
2425TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2426 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002427 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002428 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002429 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame,
2430 sizeof(kPcmuFrame)));
2431}
2432
2433// Test that we can properly receive packets on multiple streams.
2434TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002435 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002436 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002437 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2438 int channel_num1 = voe_.GetLastChannel();
2439 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2440 int channel_num2 = voe_.GetLastChannel();
2441 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2442 int channel_num3 = voe_.GetLastChannel();
2443 // Create packets with the right SSRCs.
2444 char packets[4][sizeof(kPcmuFrame)];
2445 for (size_t i = 0; i < ARRAY_SIZE(packets); ++i) {
2446 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002447 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002448 }
2449 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2450 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2451 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2452 DeliverPacket(packets[0], sizeof(packets[0]));
2453 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2454 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2455 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2456 DeliverPacket(packets[1], sizeof(packets[1]));
2457 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1],
2458 sizeof(packets[1])));
2459 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2460 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2461 DeliverPacket(packets[2], sizeof(packets[2]));
2462 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2463 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2],
2464 sizeof(packets[2])));
2465 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2466 DeliverPacket(packets[3], sizeof(packets[3]));
2467 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2468 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2469 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3],
2470 sizeof(packets[3])));
2471 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2472 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2473 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2474}
2475
solenberg0a617e22015-10-20 15:49:38 -07002476// Test that we properly handle failures to add a receive stream.
2477TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
2478 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002479 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002480 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002481}
2482
solenberg0a617e22015-10-20 15:49:38 -07002483// Test that we properly handle failures to add a send stream.
2484TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
2485 EXPECT_TRUE(SetupEngine());
2486 voe_.set_fail_create_channel(true);
2487 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2488}
2489
solenberg1ac56142015-10-13 03:58:19 -07002490// Test that AddRecvStream creates new stream.
2491TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2492 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002493 int channel_num = voe_.GetLastChannel();
2494 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002495 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002496}
2497
2498// Test that after adding a recv stream, we do not decode more codecs than
2499// those previously passed into SetRecvCodecs.
2500TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002501 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002502 cricket::AudioRecvParameters parameters;
2503 parameters.codecs.push_back(kIsacCodec);
2504 parameters.codecs.push_back(kPcmuCodec);
2505 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002506 EXPECT_TRUE(channel_->AddRecvStream(
2507 cricket::StreamParams::CreateLegacy(kSsrc1)));
2508 int channel_num2 = voe_.GetLastChannel();
2509 webrtc::CodecInst gcodec;
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002510 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "opus");
2511 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002512 gcodec.channels = 2;
2513 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2514}
2515
2516// Test that we properly clean up any streams that were added, even if
2517// not explicitly removed.
2518TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002519 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002520 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002521 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2522 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2523 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2524 delete channel_;
2525 channel_ = NULL;
2526 EXPECT_EQ(0, voe_.GetNumChannels());
2527}
2528
wu@webrtc.org78187522013-10-07 23:32:02 +00002529TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002530 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002531 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2532}
2533
2534TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2535 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002536 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002537 // Manually delete channel to simulate a failure.
2538 int channel = voe_.GetLastChannel();
2539 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2540 // Add recv stream 2 should work.
2541 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002542 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002543 EXPECT_NE(channel, new_channel);
2544 // The last created channel is deleted too.
2545 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002546}
2547
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002548// Test the InsertDtmf on default send stream as caller.
2549TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2550 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002551}
2552
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002553// Test the InsertDtmf on default send stream as callee
2554TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2555 TestInsertDtmf(0, false);
2556}
2557
2558// Test the InsertDtmf on specified send stream as caller.
2559TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2560 TestInsertDtmf(kSsrc1, true);
2561}
2562
2563// Test the InsertDtmf on specified send stream as callee.
2564TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2565 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002566}
2567
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002568TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002569 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002570 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002571 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2572 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2573 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2574 EXPECT_TRUE(channel_->SetPlayout(true));
2575 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2576 EXPECT_TRUE(channel_->SetPlayout(false));
2577 EXPECT_FALSE(channel_->SetPlayout(true));
2578}
2579
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002580TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002581 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002582
2583 bool ec_enabled;
2584 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002585 webrtc::AecmModes aecm_mode;
2586 bool cng_enabled;
2587 bool agc_enabled;
2588 webrtc::AgcModes agc_mode;
2589 webrtc::AgcConfig agc_config;
2590 bool ns_enabled;
2591 webrtc::NsModes ns_mode;
2592 bool highpass_filter_enabled;
2593 bool stereo_swapping_enabled;
2594 bool typing_detection_enabled;
2595 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002596 voe_.GetAecmMode(aecm_mode, cng_enabled);
2597 voe_.GetAgcStatus(agc_enabled, agc_mode);
2598 voe_.GetAgcConfig(agc_config);
2599 voe_.GetNsStatus(ns_enabled, ns_mode);
2600 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2601 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2602 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2603 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002604 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002605 EXPECT_FALSE(cng_enabled);
2606 EXPECT_TRUE(agc_enabled);
2607 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2608 EXPECT_TRUE(ns_enabled);
2609 EXPECT_TRUE(highpass_filter_enabled);
2610 EXPECT_FALSE(stereo_swapping_enabled);
2611 EXPECT_TRUE(typing_detection_enabled);
2612 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2613 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2614
2615 // Nothing set, so all ignored.
2616 cricket::AudioOptions options;
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002617 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002618 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002619 voe_.GetAecmMode(aecm_mode, cng_enabled);
2620 voe_.GetAgcStatus(agc_enabled, agc_mode);
2621 voe_.GetAgcConfig(agc_config);
2622 voe_.GetNsStatus(ns_enabled, ns_mode);
2623 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2624 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2625 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2626 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002627 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002628 EXPECT_FALSE(cng_enabled);
2629 EXPECT_TRUE(agc_enabled);
2630 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2631 EXPECT_TRUE(ns_enabled);
2632 EXPECT_TRUE(highpass_filter_enabled);
2633 EXPECT_FALSE(stereo_swapping_enabled);
2634 EXPECT_TRUE(typing_detection_enabled);
2635 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2636 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
Henrik Lundin64dad832015-05-11 12:44:23 +02002637 EXPECT_EQ(50, voe_.GetNetEqCapacity()); // From GetDefaultEngineOptions().
Henrik Lundin5263b3c2015-06-01 10:29:41 +02002638 EXPECT_FALSE(
2639 voe_.GetNetEqFastAccelerate()); // From GetDefaultEngineOptions().
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002640
2641 // Turn echo cancellation off
kwiberg102c6a62015-10-30 02:47:38 -07002642 options.echo_cancellation = rtc::Maybe<bool>(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002643 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002644 voe_.GetEcStatus(ec_enabled, ec_mode);
2645 EXPECT_FALSE(ec_enabled);
2646
2647 // Turn echo cancellation back on, with settings, and make sure
2648 // nothing else changed.
kwiberg102c6a62015-10-30 02:47:38 -07002649 options.echo_cancellation = rtc::Maybe<bool>(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002650 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002651 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002652 voe_.GetAecmMode(aecm_mode, cng_enabled);
2653 voe_.GetAgcStatus(agc_enabled, agc_mode);
2654 voe_.GetAgcConfig(agc_config);
2655 voe_.GetNsStatus(ns_enabled, ns_mode);
2656 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2657 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2658 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2659 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002660 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002661 EXPECT_TRUE(agc_enabled);
2662 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2663 EXPECT_TRUE(ns_enabled);
2664 EXPECT_TRUE(highpass_filter_enabled);
2665 EXPECT_FALSE(stereo_swapping_enabled);
2666 EXPECT_TRUE(typing_detection_enabled);
2667 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2668 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2669
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002670 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2671 // control.
kwiberg102c6a62015-10-30 02:47:38 -07002672 options.delay_agnostic_aec = rtc::Maybe<bool>(true);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002673 ASSERT_TRUE(engine_.SetOptions(options));
2674 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002675 voe_.GetAecmMode(aecm_mode, cng_enabled);
2676 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002677 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002678 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2679
2680 // Turn off echo cancellation and delay agnostic aec.
kwiberg102c6a62015-10-30 02:47:38 -07002681 options.delay_agnostic_aec = rtc::Maybe<bool>(false);
2682 options.extended_filter_aec = rtc::Maybe<bool>(false);
2683 options.echo_cancellation = rtc::Maybe<bool>(false);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002684 ASSERT_TRUE(engine_.SetOptions(options));
2685 voe_.GetEcStatus(ec_enabled, ec_mode);
2686 EXPECT_FALSE(ec_enabled);
2687 // Turning delay agnostic aec back on should also turn on echo cancellation.
kwiberg102c6a62015-10-30 02:47:38 -07002688 options.delay_agnostic_aec = rtc::Maybe<bool>(true);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002689 ASSERT_TRUE(engine_.SetOptions(options));
2690 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002691 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002692 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002693 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2694
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002695 // Turn off AGC
kwiberg102c6a62015-10-30 02:47:38 -07002696 options.auto_gain_control = rtc::Maybe<bool>(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002697 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002698 voe_.GetAgcStatus(agc_enabled, agc_mode);
2699 EXPECT_FALSE(agc_enabled);
2700
2701 // Turn AGC back on
kwiberg102c6a62015-10-30 02:47:38 -07002702 options.auto_gain_control = rtc::Maybe<bool>(true);
2703 options.adjust_agc_delta = rtc::Maybe<int>();
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002704 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002705 voe_.GetAgcStatus(agc_enabled, agc_mode);
2706 EXPECT_TRUE(agc_enabled);
2707 voe_.GetAgcConfig(agc_config);
2708 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2709
2710 // Turn off other options (and stereo swapping on).
kwiberg102c6a62015-10-30 02:47:38 -07002711 options.noise_suppression = rtc::Maybe<bool>(false);
2712 options.highpass_filter = rtc::Maybe<bool>(false);
2713 options.typing_detection = rtc::Maybe<bool>(false);
2714 options.stereo_swapping = rtc::Maybe<bool>(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002715 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002716 voe_.GetNsStatus(ns_enabled, ns_mode);
2717 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2718 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2719 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2720 EXPECT_FALSE(ns_enabled);
2721 EXPECT_FALSE(highpass_filter_enabled);
2722 EXPECT_FALSE(typing_detection_enabled);
2723 EXPECT_TRUE(stereo_swapping_enabled);
2724
solenberg1ac56142015-10-13 03:58:19 -07002725 // Set options again to ensure it has no impact.
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002726 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002727 voe_.GetEcStatus(ec_enabled, ec_mode);
2728 voe_.GetNsStatus(ns_enabled, ns_mode);
2729 EXPECT_TRUE(ec_enabled);
2730 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2731 EXPECT_FALSE(ns_enabled);
2732 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2733}
2734
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002735TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002736 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002737
2738 bool ec_enabled;
2739 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002740 bool agc_enabled;
2741 webrtc::AgcModes agc_mode;
2742 bool ns_enabled;
2743 webrtc::NsModes ns_mode;
2744 bool highpass_filter_enabled;
2745 bool stereo_swapping_enabled;
2746 bool typing_detection_enabled;
2747
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002748 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002749 voe_.GetAgcStatus(agc_enabled, agc_mode);
2750 voe_.GetNsStatus(ns_enabled, ns_mode);
2751 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2752 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2753 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2754 EXPECT_TRUE(ec_enabled);
2755 EXPECT_TRUE(agc_enabled);
2756 EXPECT_TRUE(ns_enabled);
2757 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002758 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002759 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002760}
2761
2762TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2763 webrtc::AgcConfig set_config = {0};
2764 set_config.targetLeveldBOv = 3;
2765 set_config.digitalCompressionGaindB = 9;
2766 set_config.limiterEnable = true;
2767 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002768 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002769
2770 webrtc::AgcConfig config = {0};
2771 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2772 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2773 EXPECT_EQ(set_config.digitalCompressionGaindB,
2774 config.digitalCompressionGaindB);
2775 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2776}
2777
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002778TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002779 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg66f43392015-09-09 01:36:22 -07002780 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2781 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002782 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002783 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2784 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002785 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002786
2787 // Have to add a stream to make SetSend work.
2788 cricket::StreamParams stream1;
2789 stream1.ssrcs.push_back(1);
2790 channel1->AddSendStream(stream1);
2791 cricket::StreamParams stream2;
2792 stream2.ssrcs.push_back(2);
2793 channel2->AddSendStream(stream2);
2794
2795 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002796 cricket::AudioSendParameters parameters_options_all = send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002797 parameters_options_all.options.echo_cancellation = rtc::Maybe<bool>(true);
2798 parameters_options_all.options.auto_gain_control = rtc::Maybe<bool>(true);
2799 parameters_options_all.options.noise_suppression = rtc::Maybe<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002800 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2801 EXPECT_EQ(parameters_options_all.options, channel1->options());
2802 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2803 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002804
2805 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002806 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002807 parameters_options_no_ns.options.noise_suppression = rtc::Maybe<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002808 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2809 cricket::AudioOptions expected_options = parameters_options_all.options;
kwiberg102c6a62015-10-30 02:47:38 -07002810 expected_options.echo_cancellation = rtc::Maybe<bool>(true);
2811 expected_options.auto_gain_control = rtc::Maybe<bool>(true);
2812 expected_options.noise_suppression = rtc::Maybe<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002813 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002814
2815 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002816 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002817 parameters_options_no_agc.options.auto_gain_control = rtc::Maybe<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002818 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
kwiberg102c6a62015-10-30 02:47:38 -07002819 expected_options.echo_cancellation = rtc::Maybe<bool>(true);
2820 expected_options.auto_gain_control = rtc::Maybe<bool>(false);
2821 expected_options.noise_suppression = rtc::Maybe<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002822 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002823
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002824 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002825 bool ec_enabled;
2826 webrtc::EcModes ec_mode;
2827 bool agc_enabled;
2828 webrtc::AgcModes agc_mode;
2829 bool ns_enabled;
2830 webrtc::NsModes ns_mode;
2831 voe_.GetEcStatus(ec_enabled, ec_mode);
2832 voe_.GetAgcStatus(agc_enabled, agc_mode);
2833 voe_.GetNsStatus(ns_enabled, ns_mode);
2834 EXPECT_TRUE(ec_enabled);
2835 EXPECT_TRUE(agc_enabled);
2836 EXPECT_TRUE(ns_enabled);
2837
2838 channel1->SetSend(cricket::SEND_MICROPHONE);
2839 voe_.GetEcStatus(ec_enabled, ec_mode);
2840 voe_.GetAgcStatus(agc_enabled, agc_mode);
2841 voe_.GetNsStatus(ns_enabled, ns_mode);
2842 EXPECT_TRUE(ec_enabled);
2843 EXPECT_TRUE(agc_enabled);
2844 EXPECT_FALSE(ns_enabled);
2845
2846 channel1->SetSend(cricket::SEND_NOTHING);
2847 voe_.GetEcStatus(ec_enabled, ec_mode);
2848 voe_.GetAgcStatus(agc_enabled, agc_mode);
2849 voe_.GetNsStatus(ns_enabled, ns_mode);
2850 EXPECT_TRUE(ec_enabled);
2851 EXPECT_TRUE(agc_enabled);
2852 EXPECT_TRUE(ns_enabled);
2853
2854 channel2->SetSend(cricket::SEND_MICROPHONE);
2855 voe_.GetEcStatus(ec_enabled, ec_mode);
2856 voe_.GetAgcStatus(agc_enabled, agc_mode);
2857 voe_.GetNsStatus(ns_enabled, ns_mode);
2858 EXPECT_TRUE(ec_enabled);
2859 EXPECT_FALSE(agc_enabled);
2860 EXPECT_TRUE(ns_enabled);
2861
2862 channel2->SetSend(cricket::SEND_NOTHING);
2863 voe_.GetEcStatus(ec_enabled, ec_mode);
2864 voe_.GetAgcStatus(agc_enabled, agc_mode);
2865 voe_.GetNsStatus(ns_enabled, ns_mode);
2866 EXPECT_TRUE(ec_enabled);
2867 EXPECT_TRUE(agc_enabled);
2868 EXPECT_TRUE(ns_enabled);
2869
2870 // Make sure settings take effect while we are sending.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002871 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
2872 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2873 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002874 parameters_options_no_agc_nor_ns.options.auto_gain_control =
2875 rtc::Maybe<bool>(false);
2876 parameters_options_no_agc_nor_ns.options.noise_suppression =
2877 rtc::Maybe<bool>(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002878 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002879 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
kwiberg102c6a62015-10-30 02:47:38 -07002880 expected_options.echo_cancellation = rtc::Maybe<bool>(true);
2881 expected_options.auto_gain_control = rtc::Maybe<bool>(false);
2882 expected_options.noise_suppression = rtc::Maybe<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002883 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002884 voe_.GetEcStatus(ec_enabled, ec_mode);
2885 voe_.GetAgcStatus(agc_enabled, agc_mode);
2886 voe_.GetNsStatus(ns_enabled, ns_mode);
2887 EXPECT_TRUE(ec_enabled);
2888 EXPECT_FALSE(agc_enabled);
2889 EXPECT_FALSE(ns_enabled);
2890}
2891
wu@webrtc.orgde305012013-10-31 15:40:38 +00002892// This test verifies DSCP settings are properly applied on voice media channel.
2893TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002894 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002895 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002896 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002897 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00002898 new cricket::FakeNetworkInterface);
2899 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002900 cricket::AudioSendParameters parameters = send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002901 parameters.options.dscp = rtc::Maybe<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002902 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002903 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00002904 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002905 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002906 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
kwiberg102c6a62015-10-30 02:47:38 -07002907 parameters.options.dscp = rtc::Maybe<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002908 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002909 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00002910}
2911
solenberg1ac56142015-10-13 03:58:19 -07002912TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002913 EXPECT_TRUE(SetupEngine());
2914 cricket::WebRtcVoiceMediaChannel* media_channel =
2915 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002916 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2917 EXPECT_TRUE(channel_->AddRecvStream(
2918 cricket::StreamParams::CreateLegacy(kSsrc1)));
2919 int channel_id = voe_.GetLastChannel();
2920 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2921 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2922 EXPECT_TRUE(channel_->AddRecvStream(
2923 cricket::StreamParams::CreateLegacy(kSsrc2)));
2924 int channel_id2 = voe_.GetLastChannel();
2925 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002926}
2927
solenberg1ac56142015-10-13 03:58:19 -07002928TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002929 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002930 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002931 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2932 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2933 EXPECT_TRUE(channel_->AddSendStream(
2934 cricket::StreamParams::CreateLegacy(kSsrc1)));
2935 int channel_id = voe_.GetLastChannel();
2936 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2937 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2938 EXPECT_TRUE(channel_->AddSendStream(
2939 cricket::StreamParams::CreateLegacy(kSsrc2)));
2940 int channel_id2 = voe_.GetLastChannel();
2941 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002942}
2943
solenberg4bac9c52015-10-09 02:32:53 -07002944TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002945 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002946 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002947 cricket::StreamParams stream;
2948 stream.ssrcs.push_back(kSsrc2);
2949 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002950 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002951 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002952 float scale = 0;
2953 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2954 EXPECT_DOUBLE_EQ(3, scale);
2955}
2956
2957TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
2958 EXPECT_TRUE(SetupEngine());
2959 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2960 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2961 int channel_id = voe_.GetLastChannel();
2962 float scale = 0;
2963 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2964 EXPECT_DOUBLE_EQ(2, scale);
2965 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07002966 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002967 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002968}
2969
pbos8fc7fa72015-07-15 08:02:58 -07002970TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02002971 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07002972 const std::string kSyncLabel = "AvSyncLabel";
2973
solenberg1ac56142015-10-13 03:58:19 -07002974 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07002975 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
2976 sp.sync_label = kSyncLabel;
2977 // Creating two channels to make sure that sync label is set properly for both
2978 // the default voice channel and following ones.
2979 EXPECT_TRUE(channel_->AddRecvStream(sp));
2980 sp.ssrcs[0] += 1;
2981 EXPECT_TRUE(channel_->AddRecvStream(sp));
2982
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002983 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07002984 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002985 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002986 << "SyncGroup should be set based on sync_label";
2987 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002988 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002989 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07002990}
2991
pbos6bb1b6e2015-07-24 07:10:18 -07002992TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002993 // Test that changing the combined_audio_video_bwe option results in the
2994 // expected state changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002995 std::vector<uint32_t> ssrcs;
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002996 ssrcs.push_back(223);
2997 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002998
solenberg1ac56142015-10-13 03:58:19 -07002999 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003000 cricket::WebRtcVoiceMediaChannel* media_channel =
3001 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02003002 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003003 EXPECT_TRUE(media_channel->AddRecvStream(
3004 cricket::StreamParams::CreateLegacy(ssrc)));
3005 }
3006 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003007
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003008 // Combined BWE should be disabled.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003009 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003010 const auto* s = call_.GetAudioReceiveStream(ssrc);
3011 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07003012 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003013 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003014
3015 // Enable combined BWE option - now it should be set up.
kwiberg102c6a62015-10-30 02:47:38 -07003016 send_parameters_.options.combined_audio_video_bwe = rtc::Maybe<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003017 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003018 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003019 const auto* s = call_.GetAudioReceiveStream(ssrc);
3020 EXPECT_NE(nullptr, s);
3021 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
3022 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003023
3024 // Disable combined BWE option - should be disabled again.
kwiberg102c6a62015-10-30 02:47:38 -07003025 send_parameters_.options.combined_audio_video_bwe = rtc::Maybe<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003026 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003027 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003028 const auto* s = call_.GetAudioReceiveStream(ssrc);
3029 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07003030 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003031 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003032
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003033 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003034}
3035
pbos6bb1b6e2015-07-24 07:10:18 -07003036TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003037 // Test that adding receive streams after enabling combined bandwidth
3038 // estimation will correctly configure each channel.
solenberg1ac56142015-10-13 03:58:19 -07003039 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003040 cricket::WebRtcVoiceMediaChannel* media_channel =
3041 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
kwiberg102c6a62015-10-30 02:47:38 -07003042 send_parameters_.options.combined_audio_video_bwe = rtc::Maybe<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003043 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003044
Peter Boström0c4e06b2015-10-07 12:23:21 +02003045 static const uint32_t kSsrcs[] = {1, 2, 3, 4};
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003046 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs); ++i) {
3047 EXPECT_TRUE(media_channel->AddRecvStream(
3048 cricket::StreamParams::CreateLegacy(kSsrcs[i])));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003049 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(kSsrcs[i]));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003050 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003051 EXPECT_EQ(ARRAY_SIZE(kSsrcs), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003052}
3053
pbos6bb1b6e2015-07-24 07:10:18 -07003054TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003055 // Test that setting the header extensions results in the expected state
3056 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003057 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003058 ssrcs.push_back(223);
3059 ssrcs.push_back(224);
3060
solenberg1ac56142015-10-13 03:58:19 -07003061 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003062 cricket::WebRtcVoiceMediaChannel* media_channel =
3063 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
kwiberg102c6a62015-10-30 02:47:38 -07003064 send_parameters_.options.combined_audio_video_bwe = rtc::Maybe<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003065 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003066 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003067 EXPECT_TRUE(media_channel->AddRecvStream(
3068 cricket::StreamParams::CreateLegacy(ssrc)));
3069 }
3070
3071 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003072 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003073 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003074 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003075 EXPECT_NE(nullptr, s);
3076 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3077 }
3078
3079 // Set up receive extensions.
3080 const auto& e_exts = engine_.rtp_header_extensions();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003081 cricket::AudioRecvParameters recv_parameters;
3082 recv_parameters.extensions = e_exts;
3083 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003084 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003085 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003086 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003087 EXPECT_NE(nullptr, s);
3088 const auto& s_exts = s->GetConfig().rtp.extensions;
3089 EXPECT_EQ(e_exts.size(), s_exts.size());
3090 for (const auto& e_ext : e_exts) {
3091 for (const auto& s_ext : s_exts) {
3092 if (e_ext.id == s_ext.id) {
3093 EXPECT_EQ(e_ext.uri, s_ext.name);
3094 }
3095 }
3096 }
3097 }
3098
3099 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003100 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003101 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003102 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003103 EXPECT_NE(nullptr, s);
3104 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3105 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003106}
3107
3108TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3109 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003110 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003111 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3112 static const unsigned char kRtcp[] = {
3113 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3114 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3117 };
3118 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3119
solenberg1ac56142015-10-13 03:58:19 -07003120 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003121 cricket::WebRtcVoiceMediaChannel* media_channel =
3122 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
kwiberg102c6a62015-10-30 02:47:38 -07003123 send_parameters_.options.combined_audio_video_bwe = rtc::Maybe<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003124 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003125 EXPECT_TRUE(media_channel->AddRecvStream(
3126 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3127
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003128 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003129 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003130 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003131 EXPECT_EQ(0, s->received_packets());
3132 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3133 EXPECT_EQ(1, s->received_packets());
3134 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3135 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003136}
Minyue2013aec2015-05-13 14:14:42 +02003137
solenberg0a617e22015-10-20 15:49:38 -07003138// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003139// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003140TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenberg1ac56142015-10-13 03:58:19 -07003141 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003142 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003143 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003144 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3145 int recv_ch = voe_.GetLastChannel();
3146 EXPECT_NE(recv_ch, default_channel);
3147 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3148 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3149 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003150 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3151 recv_ch = voe_.GetLastChannel();
3152 EXPECT_NE(recv_ch, default_channel);
3153 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003154}
3155
3156TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003157 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003158 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003159
3160 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3161 int recv_ch = voe_.GetLastChannel();
3162
3163 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3164 int send_ch = voe_.GetLastChannel();
3165
3166 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3167 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3168 // channel of |recv_ch|.This is not a common case, since, normally, only the
3169 // default channel can be associated. However, the default is not deletable.
3170 // So we force the |recv_ch| to associate with a non-default channel.
3171 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3172 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3173
3174 EXPECT_TRUE(channel_->RemoveSendStream(2));
3175 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3176}
stefan658910c2015-09-03 05:48:32 -07003177
3178// Tests for the actual WebRtc VoE library.
3179
3180TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
3181 cricket::WebRtcVoiceEngine engine;
3182 cricket::AudioOptions options = engine.GetOptions();
3183 // The default options should have at least a few things set. We purposefully
3184 // don't check the option values here, though.
kwiberg102c6a62015-10-30 02:47:38 -07003185 EXPECT_TRUE(options.echo_cancellation);
3186 EXPECT_TRUE(options.auto_gain_control);
3187 EXPECT_TRUE(options.noise_suppression);
stefan658910c2015-09-03 05:48:32 -07003188}
3189
3190// Tests that the library initializes and shuts down properly.
3191TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3192 cricket::WebRtcVoiceEngine engine;
3193 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003194 rtc::scoped_ptr<webrtc::Call> call(
3195 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003196 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003197 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003198 EXPECT_TRUE(channel != nullptr);
3199 delete channel;
3200 engine.Terminate();
3201
3202 // Reinit to catch regression where VoiceEngineObserver reference is lost
3203 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3204 engine.Terminate();
3205}
3206
3207// Tests that the library is configured with the codecs we want.
3208TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
3209 cricket::WebRtcVoiceEngine engine;
3210 // Check codecs by name.
3211 EXPECT_TRUE(engine.FindCodec(
3212 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0)));
3213 EXPECT_TRUE(engine.FindCodec(
3214 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0)));
3215 EXPECT_TRUE(engine.FindCodec(
3216 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0)));
3217 // Check that name matching is case-insensitive.
3218 EXPECT_TRUE(engine.FindCodec(
3219 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0)));
3220 EXPECT_TRUE(engine.FindCodec(
3221 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0)));
3222 EXPECT_TRUE(engine.FindCodec(
3223 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0)));
3224 EXPECT_TRUE(engine.FindCodec(
3225 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0)));
3226 EXPECT_TRUE(engine.FindCodec(
3227 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0)));
3228 EXPECT_TRUE(engine.FindCodec(
3229 cricket::AudioCodec(96, "red", 8000, 0, 1, 0)));
3230 EXPECT_TRUE(engine.FindCodec(
3231 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0)));
3232 EXPECT_TRUE(engine.FindCodec(
3233 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0)));
3234 EXPECT_TRUE(engine.FindCodec(
3235 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0)));
3236 EXPECT_TRUE(engine.FindCodec(
3237 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0)));
3238 // Check codecs with an id by id.
3239 EXPECT_TRUE(engine.FindCodec(
3240 cricket::AudioCodec(0, "", 8000, 0, 1, 0))); // PCMU
3241 EXPECT_TRUE(engine.FindCodec(
3242 cricket::AudioCodec(8, "", 8000, 0, 1, 0))); // PCMA
3243 EXPECT_TRUE(engine.FindCodec(
3244 cricket::AudioCodec(9, "", 8000, 0, 1, 0))); // G722
3245 EXPECT_TRUE(engine.FindCodec(
3246 cricket::AudioCodec(13, "", 8000, 0, 1, 0))); // CN
3247 // Check sample/bitrate matching.
3248 EXPECT_TRUE(engine.FindCodec(
3249 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0)));
3250 // Check that bad codecs fail.
3251 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0)));
3252 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(88, "", 0, 0, 1, 0)));
3253 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 0, 2, 0)));
3254 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 5000, 0, 1, 0)));
3255 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 5000, 1, 0)));
3256 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3257 for (std::vector<cricket::AudioCodec>::const_iterator it =
3258 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3259 if (it->name == "CN" && it->clockrate == 16000) {
3260 EXPECT_EQ(105, it->id);
3261 } else if (it->name == "CN" && it->clockrate == 32000) {
3262 EXPECT_EQ(106, it->id);
3263 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3264 EXPECT_EQ(103, it->id);
3265 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3266 EXPECT_EQ(104, it->id);
3267 } else if (it->name == "G722" && it->clockrate == 8000) {
3268 EXPECT_EQ(9, it->id);
3269 } else if (it->name == "telephone-event") {
3270 EXPECT_EQ(126, it->id);
3271 } else if (it->name == "red") {
3272 EXPECT_EQ(127, it->id);
3273 } else if (it->name == "opus") {
3274 EXPECT_EQ(111, it->id);
3275 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3276 EXPECT_EQ("10", it->params.find("minptime")->second);
3277 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3278 EXPECT_EQ("60", it->params.find("maxptime")->second);
3279 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3280 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3281 }
3282 }
3283
3284 engine.Terminate();
3285}
3286
3287// Tests that VoE supports at least 32 channels
3288TEST(WebRtcVoiceEngineTest, Has32Channels) {
3289 cricket::WebRtcVoiceEngine engine;
3290 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003291 rtc::scoped_ptr<webrtc::Call> call(
3292 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003293
3294 cricket::VoiceMediaChannel* channels[32];
3295 int num_channels = 0;
stefan658910c2015-09-03 05:48:32 -07003296 while (num_channels < ARRAY_SIZE(channels)) {
3297 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003298 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003299 if (!channel)
3300 break;
stefan658910c2015-09-03 05:48:32 -07003301 channels[num_channels++] = channel;
3302 }
3303
3304 int expected = ARRAY_SIZE(channels);
3305 EXPECT_EQ(expected, num_channels);
3306
3307 while (num_channels > 0) {
3308 delete channels[--num_channels];
3309 }
stefan658910c2015-09-03 05:48:32 -07003310 engine.Terminate();
3311}
3312
3313// Test that we set our preferred codecs properly.
3314TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3315 cricket::WebRtcVoiceEngine engine;
3316 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003317 rtc::scoped_ptr<webrtc::Call> call(
3318 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003319 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3320 call.get());
3321 cricket::AudioRecvParameters parameters;
3322 parameters.codecs = engine.codecs();
3323 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003324}