blob: f61641cb6d0c7e27955b404de6f6e4118cc22d5f [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 }
316 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info) {
317 const auto stats = GetAudioSendStreamStats();
318 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
319 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
320 EXPECT_EQ(info.packets_sent, stats.packets_sent);
321 EXPECT_EQ(info.packets_lost, stats.packets_lost);
322 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
323 EXPECT_EQ(info.codec_name, stats.codec_name);
324 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
325 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
326 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
327 EXPECT_EQ(info.audio_level, stats.audio_level);
328 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
329 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
330 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
331 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
332 EXPECT_EQ(info.echo_return_loss_enhancement,
333 stats.echo_return_loss_enhancement);
334 // TODO(solenberg): Move typing noise detection into AudioSendStream.
335 // EXPECT_EQ(info.typing_noise_detected, stats.typing_noise_detected);
336 }
337
338 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
339 webrtc::AudioReceiveStream::Stats stats;
340 stats.remote_ssrc = 123;
341 stats.bytes_rcvd = 456;
342 stats.packets_rcvd = 768;
343 stats.packets_lost = 101;
344 stats.fraction_lost = 23.45f;
345 stats.codec_name = "codec_name_recv";
346 stats.ext_seqnum = 678;
347 stats.jitter_ms = 901;
348 stats.jitter_buffer_ms = 234;
349 stats.jitter_buffer_preferred_ms = 567;
350 stats.delay_estimate_ms = 890;
351 stats.audio_level = 1234;
352 stats.expand_rate = 5.67f;
353 stats.speech_expand_rate = 8.90f;
354 stats.secondary_decoded_rate = 1.23f;
355 stats.accelerate_rate = 4.56f;
356 stats.preemptive_expand_rate = 7.89f;
357 stats.decoding_calls_to_silence_generator = 12;
358 stats.decoding_calls_to_neteq = 345;
359 stats.decoding_normal = 67890;
360 stats.decoding_plc = 1234;
361 stats.decoding_cng = 5678;
362 stats.decoding_plc_cng = 9012;
363 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200364 return stats;
365 }
366 void SetAudioReceiveStreamStats() {
367 for (auto* s : call_.GetAudioReceiveStreams()) {
368 s->SetStats(GetAudioReceiveStreamStats());
369 }
370 }
371 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700372 const auto stats = GetAudioReceiveStreamStats();
373 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
374 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
375 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
376 EXPECT_EQ(info.packets_lost, stats.packets_lost);
377 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
378 EXPECT_EQ(info.codec_name, stats.codec_name);
379 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
380 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
381 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200382 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700383 stats.jitter_buffer_preferred_ms);
384 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
385 EXPECT_EQ(info.audio_level, stats.audio_level);
386 EXPECT_EQ(info.expand_rate, stats.expand_rate);
387 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
388 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
389 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
390 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200391 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700392 stats.decoding_calls_to_silence_generator);
393 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
394 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
395 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
396 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
397 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
398 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200399 }
400
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000401 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200402 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000403 cricket::FakeWebRtcVoiceEngine voe_;
wu@webrtc.org97077a32013-10-25 21:18:33 +0000404 FakeVoETraceWrapper* trace_wrapper_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000405 cricket::WebRtcVoiceEngine engine_;
406 cricket::VoiceMediaChannel* channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000407
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200408 cricket::AudioSendParameters send_parameters_;
409 cricket::AudioRecvParameters recv_parameters_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000410 cricket::AudioOptions options_adjust_agc_;
411};
412
413// Tests that our stub library "works".
414TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
415 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000416 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000417 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000418 engine_.Terminate();
419 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000420}
421
422// Tests that we can create and destroy a channel.
423TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000424 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200425 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200426 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000427}
428
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000429// Tests that the list of supported codecs is created properly and ordered
430// correctly
431TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
432 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
433 ASSERT_FALSE(codecs.empty());
434 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
435 EXPECT_EQ(48000, codecs[0].clockrate);
436 EXPECT_EQ(2, codecs[0].channels);
437 EXPECT_EQ(64000, codecs[0].bitrate);
438 int pref = codecs[0].preference;
439 for (size_t i = 1; i < codecs.size(); ++i) {
440 EXPECT_GT(pref, codecs[i].preference);
441 pref = codecs[i].preference;
442 }
443}
444
445// Tests that we can find codecs by name or id, and that we interpret the
446// clockrate and bitrate fields properly.
447TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
448 cricket::AudioCodec codec;
449 webrtc::CodecInst codec_inst;
450 // Find PCMU with explicit clockrate and bitrate.
451 EXPECT_TRUE(engine_.FindWebRtcCodec(kPcmuCodec, &codec_inst));
452 // Find ISAC with explicit clockrate and 0 bitrate.
453 EXPECT_TRUE(engine_.FindWebRtcCodec(kIsacCodec, &codec_inst));
454 // Find telephone-event with explicit clockrate and 0 bitrate.
455 EXPECT_TRUE(engine_.FindWebRtcCodec(kTelephoneEventCodec, &codec_inst));
456 // Find ISAC with a different payload id.
457 codec = kIsacCodec;
458 codec.id = 127;
459 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
460 EXPECT_EQ(codec.id, codec_inst.pltype);
461 // Find PCMU with a 0 clockrate.
462 codec = kPcmuCodec;
463 codec.clockrate = 0;
464 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
465 EXPECT_EQ(codec.id, codec_inst.pltype);
466 EXPECT_EQ(8000, codec_inst.plfreq);
467 // Find PCMU with a 0 bitrate.
468 codec = kPcmuCodec;
469 codec.bitrate = 0;
470 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
471 EXPECT_EQ(codec.id, codec_inst.pltype);
472 EXPECT_EQ(64000, codec_inst.rate);
473 // Find ISAC with an explicit bitrate.
474 codec = kIsacCodec;
475 codec.bitrate = 32000;
476 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
477 EXPECT_EQ(codec.id, codec_inst.pltype);
478 EXPECT_EQ(32000, codec_inst.rate);
479}
480
481// Test that we set our inbound codecs properly, including changing PT.
482TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
483 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200484 cricket::AudioRecvParameters parameters;
485 parameters.codecs.push_back(kIsacCodec);
486 parameters.codecs.push_back(kPcmuCodec);
487 parameters.codecs.push_back(kTelephoneEventCodec);
488 parameters.codecs[0].id = 106; // collide with existing telephone-event
489 parameters.codecs[2].id = 126;
490 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700491 EXPECT_TRUE(channel_->AddRecvStream(
492 cricket::StreamParams::CreateLegacy(kSsrc1)));
493 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000494 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000495 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000496 gcodec.plfreq = 16000;
497 gcodec.channels = 1;
498 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
499 EXPECT_EQ(106, gcodec.pltype);
500 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000501 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000502 "telephone-event");
503 gcodec.plfreq = 8000;
504 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
505 EXPECT_EQ(126, gcodec.pltype);
506 EXPECT_STREQ("telephone-event", gcodec.plname);
507}
508
509// Test that we fail to set an unknown inbound codec.
510TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
511 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200512 cricket::AudioRecvParameters parameters;
513 parameters.codecs.push_back(kIsacCodec);
514 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
515 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000516}
517
518// Test that we fail if we have duplicate types in the inbound list.
519TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
520 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200521 cricket::AudioRecvParameters parameters;
522 parameters.codecs.push_back(kIsacCodec);
523 parameters.codecs.push_back(kCn16000Codec);
524 parameters.codecs[1].id = kIsacCodec.id;
525 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000526}
527
528// Test that we can decode OPUS without stereo parameters.
529TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
530 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200531 cricket::AudioRecvParameters parameters;
532 parameters.codecs.push_back(kIsacCodec);
533 parameters.codecs.push_back(kPcmuCodec);
534 parameters.codecs.push_back(kOpusCodec);
535 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000536 EXPECT_TRUE(channel_->AddRecvStream(
537 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700538 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000539 webrtc::CodecInst opus;
540 engine_.FindWebRtcCodec(kOpusCodec, &opus);
541 // Even without stereo parameters, recv codecs still specify channels = 2.
542 EXPECT_EQ(2, opus.channels);
543 EXPECT_EQ(111, opus.pltype);
544 EXPECT_STREQ("opus", opus.plname);
545 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700546 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000547 EXPECT_EQ(111, opus.pltype);
548}
549
550// Test that we can decode OPUS with stereo = 0.
551TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
552 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200553 cricket::AudioRecvParameters parameters;
554 parameters.codecs.push_back(kIsacCodec);
555 parameters.codecs.push_back(kPcmuCodec);
556 parameters.codecs.push_back(kOpusCodec);
557 parameters.codecs[2].params["stereo"] = "0";
558 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000559 EXPECT_TRUE(channel_->AddRecvStream(
560 cricket::StreamParams::CreateLegacy(kSsrc1)));
561 int channel_num2 = voe_.GetLastChannel();
562 webrtc::CodecInst opus;
563 engine_.FindWebRtcCodec(kOpusCodec, &opus);
564 // Even when stereo is off, recv codecs still specify channels = 2.
565 EXPECT_EQ(2, opus.channels);
566 EXPECT_EQ(111, opus.pltype);
567 EXPECT_STREQ("opus", opus.plname);
568 opus.pltype = 0;
569 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
570 EXPECT_EQ(111, opus.pltype);
571}
572
573// Test that we can decode OPUS with stereo = 1.
574TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
575 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200576 cricket::AudioRecvParameters parameters;
577 parameters.codecs.push_back(kIsacCodec);
578 parameters.codecs.push_back(kPcmuCodec);
579 parameters.codecs.push_back(kOpusCodec);
580 parameters.codecs[2].params["stereo"] = "1";
581 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000582 EXPECT_TRUE(channel_->AddRecvStream(
583 cricket::StreamParams::CreateLegacy(kSsrc1)));
584 int channel_num2 = voe_.GetLastChannel();
585 webrtc::CodecInst opus;
586 engine_.FindWebRtcCodec(kOpusCodec, &opus);
587 EXPECT_EQ(2, opus.channels);
588 EXPECT_EQ(111, opus.pltype);
589 EXPECT_STREQ("opus", opus.plname);
590 opus.pltype = 0;
591 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
592 EXPECT_EQ(111, opus.pltype);
593}
594
595// Test that changes to recv codecs are applied to all streams.
596TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
597 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200598 cricket::AudioRecvParameters parameters;
599 parameters.codecs.push_back(kIsacCodec);
600 parameters.codecs.push_back(kPcmuCodec);
601 parameters.codecs.push_back(kTelephoneEventCodec);
602 parameters.codecs[0].id = 106; // collide with existing telephone-event
603 parameters.codecs[2].id = 126;
604 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000605 EXPECT_TRUE(channel_->AddRecvStream(
606 cricket::StreamParams::CreateLegacy(kSsrc1)));
607 int channel_num2 = voe_.GetLastChannel();
608 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000609 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000610 gcodec.plfreq = 16000;
611 gcodec.channels = 1;
612 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
613 EXPECT_EQ(106, gcodec.pltype);
614 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000615 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000616 "telephone-event");
617 gcodec.plfreq = 8000;
618 gcodec.channels = 1;
619 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
620 EXPECT_EQ(126, gcodec.pltype);
621 EXPECT_STREQ("telephone-event", gcodec.plname);
622}
623
624TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenberg1ac56142015-10-13 03:58:19 -0700625 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200626 cricket::AudioRecvParameters parameters;
627 parameters.codecs.push_back(kIsacCodec);
628 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200629 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000630
631 int channel_num2 = voe_.GetLastChannel();
632 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000633 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000634 gcodec.plfreq = 16000;
635 gcodec.channels = 1;
636 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
637 EXPECT_EQ(106, gcodec.pltype);
638 EXPECT_STREQ("ISAC", gcodec.plname);
639}
640
641// Test that we can apply the same set of codecs again while playing.
642TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700643 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200644 cricket::AudioRecvParameters parameters;
645 parameters.codecs.push_back(kIsacCodec);
646 parameters.codecs.push_back(kCn16000Codec);
647 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200649 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000650
651 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200652 parameters.codecs[0].id = 127;
653 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
654 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000655 EXPECT_TRUE(voe_.GetPlayout(channel_num));
656}
657
658// Test that we can add a codec while playing.
659TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700660 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200661 cricket::AudioRecvParameters parameters;
662 parameters.codecs.push_back(kIsacCodec);
663 parameters.codecs.push_back(kCn16000Codec);
664 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000665 EXPECT_TRUE(channel_->SetPlayout(true));
666
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200667 parameters.codecs.push_back(kOpusCodec);
668 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
669 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000670 EXPECT_TRUE(voe_.GetPlayout(channel_num));
671 webrtc::CodecInst gcodec;
672 EXPECT_TRUE(engine_.FindWebRtcCodec(kOpusCodec, &gcodec));
673 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
674}
675
676TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenberg1ac56142015-10-13 03:58:19 -0700677 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000678
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000679 // Test that when autobw is enabled, bitrate is kept as the default
680 // value. autobw is enabled for the following tests because the target
681 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000682
683 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000684 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000685
686 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000687 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000688
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000689 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000690 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000691}
692
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000693TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700694 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000695
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000696 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000697
698 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000699 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
700 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000701
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000702 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000703 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
704 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000705}
706
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000707TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700708 EXPECT_TRUE(SetupEngineWithSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000709
710 // Test that we can only set a maximum bitrate for a fixed-rate codec
711 // if it's bigger than the fixed rate.
712
713 // PCMU, fixed bitrate == 64000.
714 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
715 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
716 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
717 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
718 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
719 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
720 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
721}
722
723TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -0700724 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200725 const int kDesiredBitrate = 128000;
726 cricket::AudioSendParameters parameters;
727 parameters.codecs = engine_.codecs();
728 parameters.max_bandwidth_bps = kDesiredBitrate;
729 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000730
731 EXPECT_TRUE(channel_->AddSendStream(
732 cricket::StreamParams::CreateLegacy(kSsrc1)));
733
734 int channel_num = voe_.GetLastChannel();
735 webrtc::CodecInst codec;
736 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200737 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000738}
739
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000740// Test that bitrate cannot be set for CBR codecs.
741// Bitrate is ignored if it is higher than the fixed bitrate.
742// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000743TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenberg1ac56142015-10-13 03:58:19 -0700744 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000745
746 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200747 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
748 int channel_num = voe_.GetLastChannel();
749 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000750 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
751 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200752
753 send_parameters_.max_bandwidth_bps = 128000;
754 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000755 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
756 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200757
758 send_parameters_.max_bandwidth_bps = 128;
759 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000760 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
761 EXPECT_EQ(64000, codec.rate);
762}
763
764// Test that we apply codecs properly.
765TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenberg1ac56142015-10-13 03:58:19 -0700766 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200767 cricket::AudioSendParameters parameters;
768 parameters.codecs.push_back(kIsacCodec);
769 parameters.codecs.push_back(kPcmuCodec);
770 parameters.codecs.push_back(kRedCodec);
771 parameters.codecs[0].id = 96;
772 parameters.codecs[0].bitrate = 48000;
773 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000774 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200775 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000776 webrtc::CodecInst gcodec;
777 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
778 EXPECT_EQ(96, gcodec.pltype);
779 EXPECT_EQ(48000, gcodec.rate);
780 EXPECT_STREQ("ISAC", gcodec.plname);
781 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000782 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000783 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
784 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
785 EXPECT_EQ(106, voe_.GetSendTelephoneEventPayloadType(channel_num));
786}
787
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000788// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
789// to apply.
790TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenberg1ac56142015-10-13 03:58:19 -0700791 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200792 cricket::AudioSendParameters parameters;
793 parameters.codecs.push_back(kIsacCodec);
794 parameters.codecs.push_back(kPcmuCodec);
795 parameters.codecs.push_back(kRedCodec);
796 parameters.codecs[0].id = 96;
797 parameters.codecs[0].bitrate = 48000;
798 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000799 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
800 // Calling SetSendCodec again with same codec which is already set.
801 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200802 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000803 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
804}
805
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000806// Verify that G722 is set with 16000 samples per second to WebRTC.
807TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenberg1ac56142015-10-13 03:58:19 -0700808 EXPECT_TRUE(SetupEngineWithSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000809 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200810 cricket::AudioSendParameters parameters;
811 parameters.codecs.push_back(kG722CodecSdp);
812 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000813 webrtc::CodecInst gcodec;
814 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
815 EXPECT_STREQ("G722", gcodec.plname);
816 EXPECT_EQ(1, gcodec.channels);
817 EXPECT_EQ(16000, gcodec.plfreq);
818}
819
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000820// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000821TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenberg1ac56142015-10-13 03:58:19 -0700822 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200823 cricket::AudioSendParameters parameters;
824 parameters.codecs.push_back(kOpusCodec);
825 parameters.codecs[0].bitrate = 0;
826 parameters.codecs[0].clockrate = 50000;
827 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000828}
829
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000830// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000831TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700832 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200833 cricket::AudioSendParameters parameters;
834 parameters.codecs.push_back(kOpusCodec);
835 parameters.codecs[0].bitrate = 0;
836 parameters.codecs[0].channels = 0;
837 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000838}
839
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000840// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000841TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700842 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200843 cricket::AudioSendParameters parameters;
844 parameters.codecs.push_back(kOpusCodec);
845 parameters.codecs[0].bitrate = 0;
846 parameters.codecs[0].channels = 0;
847 parameters.codecs[0].params["stereo"] = "1";
848 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000849}
850
851// Test that if channel is 1 for opus and there's no stereo, we fail.
852TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700853 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200854 cricket::AudioSendParameters parameters;
855 parameters.codecs.push_back(kOpusCodec);
856 parameters.codecs[0].bitrate = 0;
857 parameters.codecs[0].channels = 1;
858 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000859}
860
861// Test that if channel is 1 for opus and stereo=0, we fail.
862TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700863 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200864 cricket::AudioSendParameters parameters;
865 parameters.codecs.push_back(kOpusCodec);
866 parameters.codecs[0].bitrate = 0;
867 parameters.codecs[0].channels = 1;
868 parameters.codecs[0].params["stereo"] = "0";
869 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000870}
871
872// Test that if channel is 1 for opus and stereo=1, we fail.
873TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700874 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200875 cricket::AudioSendParameters parameters;
876 parameters.codecs.push_back(kOpusCodec);
877 parameters.codecs[0].bitrate = 0;
878 parameters.codecs[0].channels = 1;
879 parameters.codecs[0].params["stereo"] = "1";
880 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000881}
882
883// Test that with bitrate=0 and no stereo,
884// channels and bitrate are 1 and 32000.
885TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700886 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000887 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200888 cricket::AudioSendParameters parameters;
889 parameters.codecs.push_back(kOpusCodec);
890 parameters.codecs[0].bitrate = 0;
891 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000892 webrtc::CodecInst gcodec;
893 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
894 EXPECT_STREQ("opus", gcodec.plname);
895 EXPECT_EQ(1, gcodec.channels);
896 EXPECT_EQ(32000, gcodec.rate);
897}
898
899// Test that with bitrate=0 and stereo=0,
900// channels and bitrate are 1 and 32000.
901TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700902 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000903 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200904 cricket::AudioSendParameters parameters;
905 parameters.codecs.push_back(kOpusCodec);
906 parameters.codecs[0].bitrate = 0;
907 parameters.codecs[0].params["stereo"] = "0";
908 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000909 webrtc::CodecInst gcodec;
910 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
911 EXPECT_STREQ("opus", gcodec.plname);
912 EXPECT_EQ(1, gcodec.channels);
913 EXPECT_EQ(32000, gcodec.rate);
914}
915
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000916// Test that with bitrate=invalid and stereo=0,
917// channels and bitrate are 1 and 32000.
918TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700919 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000920 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200921 cricket::AudioSendParameters parameters;
922 parameters.codecs.push_back(kOpusCodec);
923 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000924 webrtc::CodecInst gcodec;
925
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000926 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200927 parameters.codecs[0].bitrate = 5999;
928 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000929 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
930 EXPECT_STREQ("opus", gcodec.plname);
931 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000932 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000933
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200934 parameters.codecs[0].bitrate = 510001;
935 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000936 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
937 EXPECT_STREQ("opus", gcodec.plname);
938 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000939 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000940}
941
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000942// Test that with bitrate=0 and stereo=1,
943// channels and bitrate are 2 and 64000.
944TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700945 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000946 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200947 cricket::AudioSendParameters parameters;
948 parameters.codecs.push_back(kOpusCodec);
949 parameters.codecs[0].bitrate = 0;
950 parameters.codecs[0].params["stereo"] = "1";
951 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000952 webrtc::CodecInst gcodec;
953 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
954 EXPECT_STREQ("opus", gcodec.plname);
955 EXPECT_EQ(2, gcodec.channels);
956 EXPECT_EQ(64000, gcodec.rate);
957}
958
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000959// Test that with bitrate=invalid and stereo=1,
960// channels and bitrate are 2 and 64000.
961TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700962 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000963 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200964 cricket::AudioSendParameters parameters;
965 parameters.codecs.push_back(kOpusCodec);
966 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000967 webrtc::CodecInst gcodec;
968
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000969 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200970 parameters.codecs[0].bitrate = 5999;
971 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000972 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
973 EXPECT_STREQ("opus", gcodec.plname);
974 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000975 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000976
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200977 parameters.codecs[0].bitrate = 510001;
978 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000979 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
980 EXPECT_STREQ("opus", gcodec.plname);
981 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000982 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000983}
984
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000985// Test that with bitrate=N and stereo unset,
986// channels and bitrate are 1 and N.
987TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700988 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000989 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200990 cricket::AudioSendParameters parameters;
991 parameters.codecs.push_back(kOpusCodec);
992 parameters.codecs[0].bitrate = 96000;
993 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000994 webrtc::CodecInst gcodec;
995 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
996 EXPECT_EQ(111, gcodec.pltype);
997 EXPECT_EQ(96000, gcodec.rate);
998 EXPECT_STREQ("opus", gcodec.plname);
999 EXPECT_EQ(1, gcodec.channels);
1000 EXPECT_EQ(48000, gcodec.plfreq);
1001}
1002
1003// Test that with bitrate=N and stereo=0,
1004// channels and bitrate are 1 and N.
1005TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001006 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001007 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001008 cricket::AudioSendParameters parameters;
1009 parameters.codecs.push_back(kOpusCodec);
1010 parameters.codecs[0].bitrate = 30000;
1011 parameters.codecs[0].params["stereo"] = "0";
1012 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001013 webrtc::CodecInst gcodec;
1014 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1015 EXPECT_EQ(1, gcodec.channels);
1016 EXPECT_EQ(30000, gcodec.rate);
1017 EXPECT_STREQ("opus", gcodec.plname);
1018}
1019
1020// Test that with bitrate=N and without any parameters,
1021// channels and bitrate are 1 and N.
1022TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenberg1ac56142015-10-13 03:58:19 -07001023 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001024 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001025 cricket::AudioSendParameters parameters;
1026 parameters.codecs.push_back(kOpusCodec);
1027 parameters.codecs[0].bitrate = 30000;
1028 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001029 webrtc::CodecInst gcodec;
1030 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1031 EXPECT_EQ(1, gcodec.channels);
1032 EXPECT_EQ(30000, gcodec.rate);
1033 EXPECT_STREQ("opus", gcodec.plname);
1034}
1035
1036// Test that with bitrate=N and stereo=1,
1037// channels and bitrate are 2 and N.
1038TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001039 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001040 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001041 cricket::AudioSendParameters parameters;
1042 parameters.codecs.push_back(kOpusCodec);
1043 parameters.codecs[0].bitrate = 30000;
1044 parameters.codecs[0].params["stereo"] = "1";
1045 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001046 webrtc::CodecInst gcodec;
1047 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1048 EXPECT_EQ(2, gcodec.channels);
1049 EXPECT_EQ(30000, gcodec.rate);
1050 EXPECT_STREQ("opus", gcodec.plname);
1051}
1052
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001053// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1054// Also test that the "maxaveragebitrate" can't be set to values outside the
1055// range of 6000 and 510000
1056TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001057 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001058 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001059 cricket::AudioSendParameters parameters;
1060 parameters.codecs.push_back(kOpusCodec);
1061 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001062 webrtc::CodecInst gcodec;
1063
1064 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001065 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1066 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001067 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001068 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001069
1070 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001071 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1072 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001073 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001074 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001075
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001076 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1077 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001078 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1079 EXPECT_EQ(200000, gcodec.rate);
1080}
1081
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001082// Test that we can enable NACK with opus as caller.
1083TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001084 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001085 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001086 cricket::AudioSendParameters parameters;
1087 parameters.codecs.push_back(kOpusCodec);
1088 parameters.codecs[0].AddFeedbackParam(
1089 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1090 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001091 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001092 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001093 EXPECT_TRUE(voe_.GetNACK(channel_num));
1094}
1095
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001096// Test that we can enable NACK with opus as callee.
1097TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenberg0a617e22015-10-20 15:49:38 -07001098 EXPECT_TRUE(SetupEngineWithRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001099 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001100 cricket::AudioSendParameters parameters;
1101 parameters.codecs.push_back(kOpusCodec);
1102 parameters.codecs[0].AddFeedbackParam(
1103 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1104 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001105 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001106 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001107 EXPECT_FALSE(voe_.GetNACK(channel_num));
1108
1109 EXPECT_TRUE(channel_->AddSendStream(
1110 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001111 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001112}
1113
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001114// Test that we can enable NACK on receive streams.
1115TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001116 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001117 int channel_num1 = voe_.GetLastChannel();
1118 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1119 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001120 cricket::AudioSendParameters parameters;
1121 parameters.codecs.push_back(kOpusCodec);
1122 parameters.codecs[0].AddFeedbackParam(
1123 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1124 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001125 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1126 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001127 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001128 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1129 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1130}
1131
1132// Test that we can disable NACK.
1133TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001134 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001135 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001136 cricket::AudioSendParameters parameters;
1137 parameters.codecs.push_back(kOpusCodec);
1138 parameters.codecs[0].AddFeedbackParam(
1139 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1140 cricket::kParamValueEmpty));
1141 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001142 EXPECT_TRUE(voe_.GetNACK(channel_num));
1143
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001144 parameters.codecs.clear();
1145 parameters.codecs.push_back(kOpusCodec);
1146 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001147 EXPECT_FALSE(voe_.GetNACK(channel_num));
1148}
1149
1150// Test that we can disable NACK on receive streams.
1151TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001152 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001153 int channel_num1 = voe_.GetLastChannel();
1154 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1155 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001156 cricket::AudioSendParameters parameters;
1157 parameters.codecs.push_back(kOpusCodec);
1158 parameters.codecs[0].AddFeedbackParam(
1159 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1160 cricket::kParamValueEmpty));
1161 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001162 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1163 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1164
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001165 parameters.codecs.clear();
1166 parameters.codecs.push_back(kOpusCodec);
1167 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001168 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1169 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1170}
1171
1172// Test that NACK is enabled on a new receive stream.
1173TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001174 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001175 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001176 cricket::AudioSendParameters parameters;
1177 parameters.codecs.push_back(kIsacCodec);
1178 parameters.codecs.push_back(kCn16000Codec);
1179 parameters.codecs[0].AddFeedbackParam(
1180 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1181 cricket::kParamValueEmpty));
1182 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001183 EXPECT_TRUE(voe_.GetNACK(channel_num));
1184
1185 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1186 channel_num = voe_.GetLastChannel();
1187 EXPECT_TRUE(voe_.GetNACK(channel_num));
1188 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1189 channel_num = voe_.GetLastChannel();
1190 EXPECT_TRUE(voe_.GetNACK(channel_num));
1191}
1192
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001193// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001194TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenberg1ac56142015-10-13 03:58:19 -07001195 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001196 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001197 cricket::AudioSendParameters parameters;
1198 parameters.codecs.push_back(kOpusCodec);
1199 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001200 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1201}
1202
1203// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001204TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001205 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001206 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001207 cricket::AudioSendParameters parameters;
1208 parameters.codecs.push_back(kOpusCodec);
1209 parameters.codecs[0].bitrate = 0;
1210 parameters.codecs[0].params["useinbandfec"] = "0";
1211 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001212 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1213 webrtc::CodecInst gcodec;
1214 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1215 EXPECT_STREQ("opus", gcodec.plname);
1216 EXPECT_EQ(1, gcodec.channels);
1217 EXPECT_EQ(32000, gcodec.rate);
1218}
1219
1220// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001221TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001222 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001223 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001224 cricket::AudioSendParameters parameters;
1225 parameters.codecs.push_back(kOpusCodec);
1226 parameters.codecs[0].bitrate = 0;
1227 parameters.codecs[0].params["useinbandfec"] = "1";
1228 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001229 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1230 webrtc::CodecInst gcodec;
1231 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1232 EXPECT_STREQ("opus", gcodec.plname);
1233 EXPECT_EQ(1, gcodec.channels);
1234 EXPECT_EQ(32000, gcodec.rate);
1235}
1236
1237// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001238TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001239 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001240 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001241 cricket::AudioSendParameters parameters;
1242 parameters.codecs.push_back(kOpusCodec);
1243 parameters.codecs[0].bitrate = 0;
1244 parameters.codecs[0].params["stereo"] = "1";
1245 parameters.codecs[0].params["useinbandfec"] = "1";
1246 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001247 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1248 webrtc::CodecInst gcodec;
1249 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1250 EXPECT_STREQ("opus", gcodec.plname);
1251 EXPECT_EQ(2, gcodec.channels);
1252 EXPECT_EQ(64000, gcodec.rate);
1253}
1254
1255// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001256TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001257 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001258 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001259 cricket::AudioSendParameters parameters;
1260 parameters.codecs.push_back(kIsacCodec);
1261 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001262 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1263}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001264
1265// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1266TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001267 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001268 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001269 cricket::AudioSendParameters parameters;
1270 parameters.codecs.push_back(kIsacCodec);
1271 parameters.codecs[0].params["useinbandfec"] = "1";
1272 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001273 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1274}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001275
1276// Test that Opus FEC status can be changed.
1277TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenberg1ac56142015-10-13 03:58:19 -07001278 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001279 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001280 cricket::AudioSendParameters parameters;
1281 parameters.codecs.push_back(kOpusCodec);
1282 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001283 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001284 parameters.codecs[0].params["useinbandfec"] = "1";
1285 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001286 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1287}
1288
1289// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1290TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenberg1ac56142015-10-13 03:58:19 -07001291 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001292 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001293 cricket::AudioSendParameters parameters;
1294 parameters.codecs.push_back(kOpusCodec);
1295 parameters.codecs[0].bitrate = 0;
1296 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1297 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001298 EXPECT_EQ(cricket::kOpusBandwidthNb,
1299 voe_.GetMaxEncodingBandwidth(channel_num));
1300 webrtc::CodecInst gcodec;
1301 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1302 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001303
1304 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001305 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1306 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001307 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1308 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001309}
1310
1311// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1312TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenberg1ac56142015-10-13 03:58:19 -07001313 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001314 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001315 cricket::AudioSendParameters parameters;
1316 parameters.codecs.push_back(kOpusCodec);
1317 parameters.codecs[0].bitrate = 0;
1318 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1319 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001320 EXPECT_EQ(cricket::kOpusBandwidthMb,
1321 voe_.GetMaxEncodingBandwidth(channel_num));
1322 webrtc::CodecInst gcodec;
1323 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1324 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001325
1326 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001327 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1328 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001329 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1330 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001331}
1332
1333// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1334TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenberg1ac56142015-10-13 03:58:19 -07001335 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001336 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001337 cricket::AudioSendParameters parameters;
1338 parameters.codecs.push_back(kOpusCodec);
1339 parameters.codecs[0].bitrate = 0;
1340 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1341 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001342 EXPECT_EQ(cricket::kOpusBandwidthWb,
1343 voe_.GetMaxEncodingBandwidth(channel_num));
1344 webrtc::CodecInst gcodec;
1345 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1346 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001347
1348 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001349 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1350 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001351 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1352 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001353}
1354
1355// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1356TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenberg1ac56142015-10-13 03:58:19 -07001357 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001358 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001359 cricket::AudioSendParameters parameters;
1360 parameters.codecs.push_back(kOpusCodec);
1361 parameters.codecs[0].bitrate = 0;
1362 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1363 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001364 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1365 voe_.GetMaxEncodingBandwidth(channel_num));
1366 webrtc::CodecInst gcodec;
1367 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1368 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001369
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001370 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001371 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1372 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001373 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1374 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001375}
1376
1377// Test 24000 < maxplaybackrate triggers Opus full band mode.
1378TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenberg1ac56142015-10-13 03:58:19 -07001379 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001380 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001381 cricket::AudioSendParameters parameters;
1382 parameters.codecs.push_back(kOpusCodec);
1383 parameters.codecs[0].bitrate = 0;
1384 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1385 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001386 EXPECT_EQ(cricket::kOpusBandwidthFb,
1387 voe_.GetMaxEncodingBandwidth(channel_num));
1388 webrtc::CodecInst gcodec;
1389 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1390 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001391
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001392 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001393 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1394 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001395 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1396 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001397}
1398
1399// Test Opus that without maxplaybackrate, default playback rate is used.
1400TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001401 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001402 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001403 cricket::AudioSendParameters parameters;
1404 parameters.codecs.push_back(kOpusCodec);
1405 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001406 EXPECT_EQ(cricket::kOpusBandwidthFb,
1407 voe_.GetMaxEncodingBandwidth(channel_num));
1408}
1409
1410// Test the with non-Opus, maxplaybackrate has no effect.
1411TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001412 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001413 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001414 cricket::AudioSendParameters parameters;
1415 parameters.codecs.push_back(kIsacCodec);
1416 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1417 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001418 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1419}
1420
1421// Test maxplaybackrate can be set on two streams.
1422TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001423 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001424 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001425 cricket::AudioSendParameters parameters;
1426 parameters.codecs.push_back(kOpusCodec);
1427 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001428 // Default bandwidth is 24000.
1429 EXPECT_EQ(cricket::kOpusBandwidthFb,
1430 voe_.GetMaxEncodingBandwidth(channel_num));
1431
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001432 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001433
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001434 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001435 EXPECT_EQ(cricket::kOpusBandwidthNb,
1436 voe_.GetMaxEncodingBandwidth(channel_num));
1437
1438 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1439 channel_num = voe_.GetLastChannel();
1440 EXPECT_EQ(cricket::kOpusBandwidthNb,
1441 voe_.GetMaxEncodingBandwidth(channel_num));
1442}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001443
Minyue Li7100dcd2015-03-27 05:05:59 +01001444// Test that with usedtx=0, Opus DTX is off.
1445TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001446 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001447 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001448 cricket::AudioSendParameters parameters;
1449 parameters.codecs.push_back(kOpusCodec);
1450 parameters.codecs[0].params["usedtx"] = "0";
1451 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001452 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1453}
1454
1455// Test that with usedtx=1, Opus DTX is on.
1456TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001457 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001458 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001459 cricket::AudioSendParameters parameters;
1460 parameters.codecs.push_back(kOpusCodec);
1461 parameters.codecs[0].params["usedtx"] = "1";
1462 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001463 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1464 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1465}
1466
1467// Test that usedtx=1 works with stereo Opus.
1468TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001469 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001470 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001471 cricket::AudioSendParameters parameters;
1472 parameters.codecs.push_back(kOpusCodec);
1473 parameters.codecs[0].params["usedtx"] = "1";
1474 parameters.codecs[0].params["stereo"] = "1";
1475 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001476 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1477 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1478}
1479
1480// Test that usedtx=1 does not work with non Opus.
1481TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001482 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001483 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001484 cricket::AudioSendParameters parameters;
1485 parameters.codecs.push_back(kIsacCodec);
1486 parameters.codecs[0].params["usedtx"] = "1";
1487 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001488 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1489}
1490
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001491// Test that we can switch back and forth between Opus and ISAC with CN.
1492TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenberg1ac56142015-10-13 03:58:19 -07001493 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001494 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001495 cricket::AudioSendParameters opus_parameters;
1496 opus_parameters.codecs.push_back(kOpusCodec);
1497 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001498 webrtc::CodecInst gcodec;
1499 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001500 EXPECT_EQ(111, gcodec.pltype);
1501 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001502
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001503 cricket::AudioSendParameters isac_parameters;
1504 isac_parameters.codecs.push_back(kIsacCodec);
1505 isac_parameters.codecs.push_back(kCn16000Codec);
1506 isac_parameters.codecs.push_back(kOpusCodec);
1507 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001508 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1509 EXPECT_EQ(103, gcodec.pltype);
1510 EXPECT_STREQ("ISAC", gcodec.plname);
1511
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001512 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001513 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001514 EXPECT_EQ(111, gcodec.pltype);
1515 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001516}
1517
1518// Test that we handle various ways of specifying bitrate.
1519TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001520 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001521 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001522 cricket::AudioSendParameters parameters;
1523 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1524 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001525 webrtc::CodecInst gcodec;
1526 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1527 EXPECT_EQ(103, gcodec.pltype);
1528 EXPECT_STREQ("ISAC", gcodec.plname);
1529 EXPECT_EQ(32000, gcodec.rate);
1530
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001531 parameters.codecs[0].bitrate = 0; // bitrate == default
1532 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001533 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1534 EXPECT_EQ(103, gcodec.pltype);
1535 EXPECT_STREQ("ISAC", gcodec.plname);
1536 EXPECT_EQ(-1, gcodec.rate);
1537
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001538 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1539 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001540 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1541 EXPECT_EQ(103, gcodec.pltype);
1542 EXPECT_STREQ("ISAC", gcodec.plname);
1543 EXPECT_EQ(28000, gcodec.rate);
1544
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001545 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1546 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001547 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1548 EXPECT_EQ(0, gcodec.pltype);
1549 EXPECT_STREQ("PCMU", gcodec.plname);
1550 EXPECT_EQ(64000, gcodec.rate);
1551
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001552 parameters.codecs[0].bitrate = 0; // bitrate == default
1553 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001554 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1555 EXPECT_EQ(0, gcodec.pltype);
1556 EXPECT_STREQ("PCMU", gcodec.plname);
1557 EXPECT_EQ(64000, gcodec.rate);
1558
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001559 parameters.codecs[0] = kOpusCodec;
1560 parameters.codecs[0].bitrate = 0; // bitrate == default
1561 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001562 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1563 EXPECT_EQ(111, gcodec.pltype);
1564 EXPECT_STREQ("opus", gcodec.plname);
1565 EXPECT_EQ(32000, gcodec.rate);
1566}
1567
Brave Yao5225dd82015-03-26 07:39:19 +08001568// Test that we could set packet size specified in kCodecParamPTime.
1569TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenberg1ac56142015-10-13 03:58:19 -07001570 EXPECT_TRUE(SetupEngineWithSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001571 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001572 cricket::AudioSendParameters parameters;
1573 parameters.codecs.push_back(kOpusCodec);
1574 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1575 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001576 webrtc::CodecInst gcodec;
1577 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1578 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1579
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001580 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1581 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001582 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1583 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1584
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001585 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1586 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001587 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1588 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1589
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001590 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1591 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1592 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001593 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1594 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1595
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001596 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1597 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1598 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001599 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1600 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1601}
1602
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001603// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001604TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenberg1ac56142015-10-13 03:58:19 -07001605 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001606 cricket::AudioSendParameters parameters;
1607 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001608}
1609
1610// Test that we can set send codecs even with telephone-event codec as the first
1611// one on the list.
1612TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001613 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001614 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001615 cricket::AudioSendParameters parameters;
1616 parameters.codecs.push_back(kTelephoneEventCodec);
1617 parameters.codecs.push_back(kIsacCodec);
1618 parameters.codecs.push_back(kPcmuCodec);
1619 parameters.codecs[0].id = 98; // DTMF
1620 parameters.codecs[1].id = 96;
1621 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001622 webrtc::CodecInst gcodec;
1623 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001624 EXPECT_EQ(96, gcodec.pltype);
1625 EXPECT_STREQ("ISAC", gcodec.plname);
1626 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1627}
1628
1629// Test that we can set send codecs even with CN codec as the first
1630// one on the list.
1631TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001632 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001633 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001634 cricket::AudioSendParameters parameters;
1635 parameters.codecs.push_back(kCn16000Codec);
1636 parameters.codecs.push_back(kIsacCodec);
1637 parameters.codecs.push_back(kPcmuCodec);
1638 parameters.codecs[0].id = 98; // wideband CN
1639 parameters.codecs[1].id = 96;
1640 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001641 webrtc::CodecInst gcodec;
1642 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1643 EXPECT_EQ(96, gcodec.pltype);
1644 EXPECT_STREQ("ISAC", gcodec.plname);
1645 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001646}
1647
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001648// Test that we set VAD and DTMF types correctly as caller.
1649TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001650 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001651 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001652 cricket::AudioSendParameters parameters;
1653 parameters.codecs.push_back(kIsacCodec);
1654 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001655 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001656 parameters.codecs.push_back(kCn16000Codec);
1657 parameters.codecs.push_back(kCn8000Codec);
1658 parameters.codecs.push_back(kTelephoneEventCodec);
1659 parameters.codecs.push_back(kRedCodec);
1660 parameters.codecs[0].id = 96;
1661 parameters.codecs[2].id = 97; // wideband CN
1662 parameters.codecs[4].id = 98; // DTMF
1663 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001664 webrtc::CodecInst gcodec;
1665 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1666 EXPECT_EQ(96, gcodec.pltype);
1667 EXPECT_STREQ("ISAC", gcodec.plname);
1668 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001669 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001670 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1671 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1672 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1673}
1674
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001675// Test that we set VAD and DTMF types correctly as callee.
1676TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001677 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001678 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001679 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001680
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001681 cricket::AudioSendParameters parameters;
1682 parameters.codecs.push_back(kIsacCodec);
1683 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001684 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001685 parameters.codecs.push_back(kCn16000Codec);
1686 parameters.codecs.push_back(kCn8000Codec);
1687 parameters.codecs.push_back(kTelephoneEventCodec);
1688 parameters.codecs.push_back(kRedCodec);
1689 parameters.codecs[0].id = 96;
1690 parameters.codecs[2].id = 97; // wideband CN
1691 parameters.codecs[4].id = 98; // DTMF
1692 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001693 EXPECT_TRUE(channel_->AddSendStream(
1694 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001695 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001696
1697 webrtc::CodecInst gcodec;
1698 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1699 EXPECT_EQ(96, gcodec.pltype);
1700 EXPECT_STREQ("ISAC", gcodec.plname);
1701 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001702 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001703 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1704 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1705 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1706}
1707
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001708// Test that we only apply VAD if we have a CN codec that matches the
1709// send codec clockrate.
1710TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenberg1ac56142015-10-13 03:58:19 -07001711 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001712 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001713 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001714 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001715 parameters.codecs.push_back(kIsacCodec);
1716 parameters.codecs.push_back(kCn16000Codec);
1717 parameters.codecs[1].id = 97;
1718 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001719 webrtc::CodecInst gcodec;
1720 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1721 EXPECT_STREQ("ISAC", gcodec.plname);
1722 EXPECT_TRUE(voe_.GetVAD(channel_num));
1723 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1724 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001725 parameters.codecs[0] = kPcmuCodec;
1726 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001727 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1728 EXPECT_STREQ("PCMU", gcodec.plname);
1729 EXPECT_FALSE(voe_.GetVAD(channel_num));
1730 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001731 parameters.codecs[1] = kCn8000Codec;
1732 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001733 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1734 EXPECT_STREQ("PCMU", gcodec.plname);
1735 EXPECT_TRUE(voe_.GetVAD(channel_num));
1736 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001737 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001738 parameters.codecs[0] = kIsacCodec;
1739 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001740 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1741 EXPECT_STREQ("ISAC", gcodec.plname);
1742 EXPECT_FALSE(voe_.GetVAD(channel_num));
1743}
1744
1745// Test that we perform case-insensitive matching of codec names.
1746TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenberg1ac56142015-10-13 03:58:19 -07001747 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001748 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001749 cricket::AudioSendParameters parameters;
1750 parameters.codecs.push_back(kIsacCodec);
1751 parameters.codecs.push_back(kPcmuCodec);
1752 parameters.codecs.push_back(kCn16000Codec);
1753 parameters.codecs.push_back(kCn8000Codec);
1754 parameters.codecs.push_back(kTelephoneEventCodec);
1755 parameters.codecs.push_back(kRedCodec);
1756 parameters.codecs[0].name = "iSaC";
1757 parameters.codecs[0].id = 96;
1758 parameters.codecs[2].id = 97; // wideband CN
1759 parameters.codecs[4].id = 98; // DTMF
1760 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001761 webrtc::CodecInst gcodec;
1762 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1763 EXPECT_EQ(96, gcodec.pltype);
1764 EXPECT_STREQ("ISAC", gcodec.plname);
1765 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001766 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001767 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1768 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1769 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1770}
1771
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001772// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001773TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001774 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001775 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001776 cricket::AudioSendParameters parameters;
1777 parameters.codecs.push_back(kRedCodec);
1778 parameters.codecs.push_back(kIsacCodec);
1779 parameters.codecs.push_back(kPcmuCodec);
1780 parameters.codecs[0].id = 127;
1781 parameters.codecs[0].params[""] = "96/96";
1782 parameters.codecs[1].id = 96;
1783 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001784 webrtc::CodecInst gcodec;
1785 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1786 EXPECT_EQ(96, gcodec.pltype);
1787 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001788 EXPECT_TRUE(voe_.GetRED(channel_num));
1789 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001790}
1791
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001792// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001793TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001794 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001795 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001796 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001797
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001798 cricket::AudioSendParameters parameters;
1799 parameters.codecs.push_back(kRedCodec);
1800 parameters.codecs.push_back(kIsacCodec);
1801 parameters.codecs.push_back(kPcmuCodec);
1802 parameters.codecs[0].id = 127;
1803 parameters.codecs[0].params[""] = "96/96";
1804 parameters.codecs[1].id = 96;
1805 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001806 EXPECT_TRUE(channel_->AddSendStream(
1807 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001808 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001809 webrtc::CodecInst gcodec;
1810 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1811 EXPECT_EQ(96, gcodec.pltype);
1812 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001813 EXPECT_TRUE(voe_.GetRED(channel_num));
1814 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001815}
1816
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001817// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001818TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenberg1ac56142015-10-13 03:58:19 -07001819 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001820 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001821 cricket::AudioSendParameters parameters;
1822 parameters.codecs.push_back(kRedCodec);
1823 parameters.codecs.push_back(kIsacCodec);
1824 parameters.codecs.push_back(kPcmuCodec);
1825 parameters.codecs[0].id = 127;
1826 parameters.codecs[1].id = 96;
1827 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001828 webrtc::CodecInst gcodec;
1829 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1830 EXPECT_EQ(96, gcodec.pltype);
1831 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001832 EXPECT_TRUE(voe_.GetRED(channel_num));
1833 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001834}
1835
1836// Test that we ignore RED if the parameters aren't named the way we expect.
1837TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001838 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001839 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001840 cricket::AudioSendParameters parameters;
1841 parameters.codecs.push_back(kRedCodec);
1842 parameters.codecs.push_back(kIsacCodec);
1843 parameters.codecs.push_back(kPcmuCodec);
1844 parameters.codecs[0].id = 127;
1845 parameters.codecs[0].params["ABC"] = "96/96";
1846 parameters.codecs[1].id = 96;
1847 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001848 webrtc::CodecInst gcodec;
1849 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1850 EXPECT_EQ(96, gcodec.pltype);
1851 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001852 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001853}
1854
1855// Test that we ignore RED if it uses different primary/secondary encoding.
1856TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001857 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001858 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001859 cricket::AudioSendParameters parameters;
1860 parameters.codecs.push_back(kRedCodec);
1861 parameters.codecs.push_back(kIsacCodec);
1862 parameters.codecs.push_back(kPcmuCodec);
1863 parameters.codecs[0].id = 127;
1864 parameters.codecs[0].params[""] = "96/0";
1865 parameters.codecs[1].id = 96;
1866 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001867 webrtc::CodecInst gcodec;
1868 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1869 EXPECT_EQ(96, gcodec.pltype);
1870 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001871 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001872}
1873
1874// Test that we ignore RED if it uses more than 2 encodings.
1875TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001876 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001877 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001878 cricket::AudioSendParameters parameters;
1879 parameters.codecs.push_back(kRedCodec);
1880 parameters.codecs.push_back(kIsacCodec);
1881 parameters.codecs.push_back(kPcmuCodec);
1882 parameters.codecs[0].id = 127;
1883 parameters.codecs[0].params[""] = "96/96/96";
1884 parameters.codecs[1].id = 96;
1885 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001886 webrtc::CodecInst gcodec;
1887 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1888 EXPECT_EQ(96, gcodec.pltype);
1889 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001890 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001891}
1892
1893// Test that we ignore RED if it has bogus codec ids.
1894TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001895 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001896 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001897 cricket::AudioSendParameters parameters;
1898 parameters.codecs.push_back(kRedCodec);
1899 parameters.codecs.push_back(kIsacCodec);
1900 parameters.codecs.push_back(kPcmuCodec);
1901 parameters.codecs[0].id = 127;
1902 parameters.codecs[0].params[""] = "ABC/ABC";
1903 parameters.codecs[1].id = 96;
1904 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001905 webrtc::CodecInst gcodec;
1906 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1907 EXPECT_EQ(96, gcodec.pltype);
1908 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001909 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001910}
1911
1912// Test that we ignore RED if it refers to a codec that is not present.
1913TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001914 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001915 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001916 cricket::AudioSendParameters parameters;
1917 parameters.codecs.push_back(kRedCodec);
1918 parameters.codecs.push_back(kIsacCodec);
1919 parameters.codecs.push_back(kPcmuCodec);
1920 parameters.codecs[0].id = 127;
1921 parameters.codecs[0].params[""] = "97/97";
1922 parameters.codecs[1].id = 96;
1923 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001924 webrtc::CodecInst gcodec;
1925 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1926 EXPECT_EQ(96, gcodec.pltype);
1927 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001928 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001929}
1930
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001931// Test support for audio level header extension.
1932TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1933 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001934}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001935TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1936 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1937}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001938
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001939// Test support for absolute send time header extension.
1940TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1941 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1942}
1943TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1944 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001945}
1946
solenberg1ac56142015-10-13 03:58:19 -07001947// Test that we can create a channel and start sending on it.
1948TEST_F(WebRtcVoiceEngineTestFake, Send) {
1949 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001950 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001951 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001952 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1953 EXPECT_TRUE(voe_.GetSend(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001954 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1955 EXPECT_FALSE(voe_.GetSend(channel_num));
solenberg1ac56142015-10-13 03:58:19 -07001956}
1957
1958// Test that we can create a channel and start playing out on it.
1959TEST_F(WebRtcVoiceEngineTestFake, Playout) {
1960 EXPECT_TRUE(SetupEngineWithRecvStream());
1961 int channel_num = voe_.GetLastChannel();
1962 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
1963 EXPECT_TRUE(channel_->SetPlayout(true));
1964 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001965 EXPECT_TRUE(channel_->SetPlayout(false));
1966 EXPECT_FALSE(voe_.GetPlayout(channel_num));
1967}
1968
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001969// Test that we can add and remove send streams.
1970TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
1971 SetupForMultiSendStream();
1972
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001973 // Set the global state for sending.
1974 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1975
solenbergc96df772015-10-21 13:01:53 -07001976 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001977 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07001978 cricket::StreamParams::CreateLegacy(ssrc)));
1979 EXPECT_NE(nullptr, call_.GetAudioSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001980
1981 // Verify that we are in a sending state for all the created streams.
solenbergc96df772015-10-21 13:01:53 -07001982 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001983 EXPECT_TRUE(voe_.GetSend(channel_num));
1984 }
solenbergc96df772015-10-21 13:01:53 -07001985 EXPECT_EQ(ARRAY_SIZE(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001986
solenbergc96df772015-10-21 13:01:53 -07001987 // Delete the send streams.
1988 for (uint32_t ssrc : kSsrcs4) {
1989 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
1990 EXPECT_EQ(nullptr, call_.GetAudioSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001991 // Stream should already be deleted.
solenbergc96df772015-10-21 13:01:53 -07001992 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
1993 EXPECT_EQ(-1, voe_.GetChannelFromLocalSsrc(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001994 }
solenbergc96df772015-10-21 13:01:53 -07001995 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001996}
1997
1998// Test SetSendCodecs correctly configure the codecs in all send streams.
1999TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2000 SetupForMultiSendStream();
2001
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002002 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002003 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002004 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002005 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002006 }
2007
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002008 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002009 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002010 parameters.codecs.push_back(kIsacCodec);
2011 parameters.codecs.push_back(kCn16000Codec);
2012 parameters.codecs[1].id = 97;
2013 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002014
2015 // Verify ISAC and VAD are corrected configured on all send channels.
2016 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002017 for (uint32_t ssrc : kSsrcs4) {
2018 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002019 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2020 EXPECT_STREQ("ISAC", gcodec.plname);
2021 EXPECT_TRUE(voe_.GetVAD(channel_num));
2022 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2023 }
2024
2025 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002026 parameters.codecs[0] = kPcmuCodec;
2027 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002028 for (uint32_t ssrc : kSsrcs4) {
2029 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002030 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2031 EXPECT_STREQ("PCMU", gcodec.plname);
2032 EXPECT_FALSE(voe_.GetVAD(channel_num));
2033 }
2034}
2035
2036// Test we can SetSend on all send streams correctly.
2037TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2038 SetupForMultiSendStream();
2039
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002040 // Create the send channels and they should be a SEND_NOTHING date.
solenbergc96df772015-10-21 13:01:53 -07002041 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002042 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002043 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002044 int channel_num = voe_.GetLastChannel();
2045 EXPECT_FALSE(voe_.GetSend(channel_num));
2046 }
2047
2048 // Set the global state for starting sending.
2049 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
solenbergc96df772015-10-21 13:01:53 -07002050 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002051 // Verify that we are in a sending state for all the send streams.
solenbergc96df772015-10-21 13:01:53 -07002052 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002053 EXPECT_TRUE(voe_.GetSend(channel_num));
2054 }
2055
2056 // Set the global state for stopping sending.
2057 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
solenbergc96df772015-10-21 13:01:53 -07002058 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002059 // Verify that we are in a stop state for all the send streams.
solenbergc96df772015-10-21 13:01:53 -07002060 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002061 EXPECT_FALSE(voe_.GetSend(channel_num));
2062 }
2063}
2064
2065// Test we can set the correct statistics on all send streams.
2066TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2067 SetupForMultiSendStream();
2068
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002069 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002070 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002071 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002072 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002073 }
solenberg85a04962015-10-27 03:35:21 -07002074 SetAudioSendStreamStats();
2075
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002076 // Create a receive stream to check that none of the send streams end up in
2077 // the receive stream stats.
2078 EXPECT_TRUE(channel_->AddRecvStream(
2079 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002080 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002081 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2082 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002083
solenberg85a04962015-10-27 03:35:21 -07002084 // Check stats for the added streams.
2085 {
2086 cricket::VoiceMediaInfo info;
2087 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002088
solenberg85a04962015-10-27 03:35:21 -07002089 // We have added 4 send streams. We should see empty stats for all.
2090 EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size());
2091 for (const auto& sender : info.senders) {
2092 VerifyVoiceSenderInfo(sender);
2093 }
2094
2095 // We have added one receive stream. We should see empty stats.
2096 EXPECT_EQ(info.receivers.size(), 1u);
2097 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002098 }
solenberg1ac56142015-10-13 03:58:19 -07002099
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002100 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002101 {
2102 cricket::VoiceMediaInfo info;
2103 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2104 EXPECT_EQ(true, channel_->GetStats(&info));
2105 EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size());
2106 EXPECT_EQ(0u, info.receivers.size());
2107 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002108
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002109 // Deliver a new packet - a default receive stream should be created and we
2110 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002111 {
2112 cricket::VoiceMediaInfo info;
2113 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2114 SetAudioReceiveStreamStats();
2115 EXPECT_EQ(true, channel_->GetStats(&info));
2116 EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size());
2117 EXPECT_EQ(1u, info.receivers.size());
2118 VerifyVoiceReceiverInfo(info.receivers[0]);
2119 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002120}
2121
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002122// Test that we can add and remove receive streams, and do proper send/playout.
2123// We can receive on multiple streams while sending one stream.
2124TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002125 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002126 int channel_num1 = voe_.GetLastChannel();
2127
solenberg1ac56142015-10-13 03:58:19 -07002128 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002129 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002130 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002131 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002132
solenberg1ac56142015-10-13 03:58:19 -07002133 // Adding another stream should enable playout on the new stream only.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002134 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2135 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002136 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2137 EXPECT_TRUE(voe_.GetSend(channel_num1));
2138 EXPECT_FALSE(voe_.GetSend(channel_num2));
2139
solenberg1ac56142015-10-13 03:58:19 -07002140 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002141 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2142 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2143
2144 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2145 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2146 int channel_num3 = voe_.GetLastChannel();
2147 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2148 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2149 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2150 EXPECT_FALSE(voe_.GetSend(channel_num3));
2151
2152 // Stop sending.
2153 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2154 EXPECT_FALSE(voe_.GetSend(channel_num1));
2155 EXPECT_FALSE(voe_.GetSend(channel_num2));
2156 EXPECT_FALSE(voe_.GetSend(channel_num3));
2157
2158 // Stop playout.
2159 EXPECT_TRUE(channel_->SetPlayout(false));
2160 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2161 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2162 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2163
solenberg1ac56142015-10-13 03:58:19 -07002164 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002165 EXPECT_TRUE(channel_->SetPlayout(true));
2166 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2167 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2168 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2169
solenberg1ac56142015-10-13 03:58:19 -07002170 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002171 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2172 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002173 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002174}
2175
2176// Test that we can set the devices to use.
2177TEST_F(WebRtcVoiceEngineTestFake, SetDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002178 EXPECT_TRUE(SetupEngineWithSendStream());
2179 int send_channel = voe_.GetLastChannel();
2180 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2181 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002182 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002183
2184 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2185 cricket::kFakeDefaultDeviceId);
2186 cricket::Device dev(cricket::kFakeDeviceName,
2187 cricket::kFakeDeviceId);
2188
2189 // Test SetDevices() while not sending or playing.
2190 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2191
2192 // Test SetDevices() while sending and playing.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002193 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2194 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002195 EXPECT_TRUE(voe_.GetSend(send_channel));
2196 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002197
2198 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2199
solenberg1ac56142015-10-13 03:58:19 -07002200 EXPECT_TRUE(voe_.GetSend(send_channel));
2201 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002202
2203 // Test that failure to open newly selected devices does not prevent opening
2204 // ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002205 voe_.set_playout_fail_channel(recv_channel);
2206 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002207
2208 EXPECT_FALSE(engine_.SetDevices(&default_dev, &default_dev));
2209
solenberg1ac56142015-10-13 03:58:19 -07002210 EXPECT_FALSE(voe_.GetSend(send_channel));
2211 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002212
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002213 voe_.set_playout_fail_channel(-1);
2214 voe_.set_send_fail_channel(-1);
2215
2216 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2217
solenberg1ac56142015-10-13 03:58:19 -07002218 EXPECT_TRUE(voe_.GetSend(send_channel));
2219 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002220}
2221
2222// Test that we can set the devices to use even if we failed to
2223// open the initial ones.
2224TEST_F(WebRtcVoiceEngineTestFake, SetDevicesWithInitiallyBadDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002225 EXPECT_TRUE(SetupEngineWithSendStream());
2226 int send_channel = voe_.GetLastChannel();
2227 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2228 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002229 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002230
2231 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2232 cricket::kFakeDefaultDeviceId);
2233 cricket::Device dev(cricket::kFakeDeviceName,
2234 cricket::kFakeDeviceId);
2235
2236 // Test that failure to open devices selected before starting
2237 // send/play does not prevent opening newly selected ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002238 voe_.set_playout_fail_channel(recv_channel);
2239 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002240
2241 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2242
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002243 EXPECT_FALSE(channel_->SetSend(cricket::SEND_MICROPHONE));
2244 EXPECT_FALSE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002245 EXPECT_FALSE(voe_.GetSend(send_channel));
2246 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002247
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002248 voe_.set_playout_fail_channel(-1);
2249 voe_.set_send_fail_channel(-1);
2250
2251 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2252
solenberg1ac56142015-10-13 03:58:19 -07002253 EXPECT_TRUE(voe_.GetSend(send_channel));
2254 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002255}
2256
2257// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002258// and start sending on it.
2259TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2260 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002261 int channel_num = voe_.GetLastChannel();
2262 webrtc::AgcConfig agc_config;
2263 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2264 EXPECT_EQ(0, agc_config.targetLeveldBOv);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002265 send_parameters_.options = options_adjust_agc_;
2266 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002267 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2268 EXPECT_TRUE(voe_.GetSend(channel_num));
2269 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2270 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002271 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2272 EXPECT_FALSE(voe_.GetSend(channel_num));
2273 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2274 EXPECT_EQ(0, agc_config.targetLeveldBOv); // level was restored
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002275}
2276
wu@webrtc.org97077a32013-10-25 21:18:33 +00002277TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002278 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002279 webrtc::AgcConfig agc_config;
2280 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2281 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2282
2283 cricket::AudioOptions options;
kwiberg102c6a62015-10-30 02:47:38 -07002284 options.tx_agc_target_dbov = rtc::Maybe<uint16_t>(3);
2285 options.tx_agc_digital_compression_gain = rtc::Maybe<uint16_t>(9);
2286 options.tx_agc_limiter = rtc::Maybe<bool>(true);
2287 options.auto_gain_control = rtc::Maybe<bool>(true);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002288 EXPECT_TRUE(engine_.SetOptions(options));
2289
2290 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2291 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2292 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2293 EXPECT_TRUE(agc_config.limiterEnable);
2294
2295 // Check interaction with adjust_agc_delta. Both should be respected, for
2296 // backwards compatibility.
kwiberg102c6a62015-10-30 02:47:38 -07002297 options.adjust_agc_delta = rtc::Maybe<int>(-10);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002298 EXPECT_TRUE(engine_.SetOptions(options));
2299
2300 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2301 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2302}
2303
wu@webrtc.org97077a32013-10-25 21:18:33 +00002304TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002305 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002306 cricket::AudioOptions options;
kwiberg102c6a62015-10-30 02:47:38 -07002307 options.recording_sample_rate = rtc::Maybe<uint32_t>(48000);
2308 options.playout_sample_rate = rtc::Maybe<uint32_t>(44100);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002309 EXPECT_TRUE(engine_.SetOptions(options));
2310
2311 unsigned int recording_sample_rate, playout_sample_rate;
2312 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2313 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2314 EXPECT_EQ(48000u, recording_sample_rate);
2315 EXPECT_EQ(44100u, playout_sample_rate);
2316}
2317
2318TEST_F(WebRtcVoiceEngineTestFake, TraceFilterViaTraceOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002319 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002320 engine_.SetLogging(rtc::LS_INFO, "");
wu@webrtc.org97077a32013-10-25 21:18:33 +00002321 EXPECT_EQ(
2322 // Info:
2323 webrtc::kTraceStateInfo | webrtc::kTraceInfo |
2324 // Warning:
2325 webrtc::kTraceTerseInfo | webrtc::kTraceWarning |
2326 // Error:
2327 webrtc::kTraceError | webrtc::kTraceCritical,
2328 static_cast<int>(trace_wrapper_->filter_));
2329 // Now set it explicitly
2330 std::string filter =
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002331 "tracefilter " + rtc::ToString(webrtc::kTraceDefault);
2332 engine_.SetLogging(rtc::LS_VERBOSE, filter.c_str());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002333 EXPECT_EQ(static_cast<unsigned int>(webrtc::kTraceDefault),
2334 trace_wrapper_->filter_);
2335}
2336
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002337// Test that we can set the outgoing SSRC properly.
2338// SSRC is set in SetupEngine by calling AddSendStream.
2339TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002340 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002341 EXPECT_EQ(kSsrc1, voe_.GetLocalSSRC(voe_.GetLastChannel()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002342}
2343
2344TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2345 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002346 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002347 SetAudioSendStreamStats();
solenberg1ac56142015-10-13 03:58:19 -07002348 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2349 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002350 EXPECT_TRUE(channel_->AddRecvStream(
2351 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002352 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2353 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002354
solenberg85a04962015-10-27 03:35:21 -07002355 // Check stats for the added streams.
2356 {
2357 cricket::VoiceMediaInfo info;
2358 EXPECT_EQ(true, channel_->GetStats(&info));
2359
2360 // We have added one send stream. We should see the stats we've set.
2361 EXPECT_EQ(1u, info.senders.size());
2362 VerifyVoiceSenderInfo(info.senders[0]);
2363 // We have added one receive stream. We should see empty stats.
2364 EXPECT_EQ(info.receivers.size(), 1u);
2365 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2366 }
solenberg1ac56142015-10-13 03:58:19 -07002367
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002368 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002369 {
2370 cricket::VoiceMediaInfo info;
2371 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2372 EXPECT_EQ(true, channel_->GetStats(&info));
2373 EXPECT_EQ(1u, info.senders.size());
2374 EXPECT_EQ(0u, info.receivers.size());
2375 }
solenberg1ac56142015-10-13 03:58:19 -07002376
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002377 // Deliver a new packet - a default receive stream should be created and we
2378 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002379 {
2380 cricket::VoiceMediaInfo info;
2381 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2382 SetAudioReceiveStreamStats();
2383 EXPECT_EQ(true, channel_->GetStats(&info));
2384 EXPECT_EQ(1u, info.senders.size());
2385 EXPECT_EQ(1u, info.receivers.size());
2386 VerifyVoiceReceiverInfo(info.receivers[0]);
2387 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002388}
2389
2390// Test that we can set the outgoing SSRC properly with multiple streams.
2391// SSRC is set in SetupEngine by calling AddSendStream.
2392TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002393 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002394 EXPECT_EQ(kSsrc1, voe_.GetLocalSSRC(voe_.GetLastChannel()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002395 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
solenberg85a04962015-10-27 03:35:21 -07002396 EXPECT_EQ(kSsrc1, voe_.GetLocalSSRC(voe_.GetLastChannel()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002397}
2398
2399// Test that the local SSRC is the same on sending and receiving channels if the
2400// receive channel is created before the send channel.
2401TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002402 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002403 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002404
2405 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2406 int receive_channel_num = voe_.GetLastChannel();
2407 EXPECT_TRUE(channel_->AddSendStream(
2408 cricket::StreamParams::CreateLegacy(1234)));
2409 int send_channel_num = voe_.GetLastChannel();
2410
solenberg85a04962015-10-27 03:35:21 -07002411 EXPECT_EQ(1234U, voe_.GetLocalSSRC(send_channel_num));
2412 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002413}
2414
2415// Test that we can properly receive packets.
2416TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2417 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002418 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002419 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002420 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame,
2421 sizeof(kPcmuFrame)));
2422}
2423
2424// Test that we can properly receive packets on multiple streams.
2425TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002426 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002427 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002428 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2429 int channel_num1 = voe_.GetLastChannel();
2430 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2431 int channel_num2 = voe_.GetLastChannel();
2432 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2433 int channel_num3 = voe_.GetLastChannel();
2434 // Create packets with the right SSRCs.
2435 char packets[4][sizeof(kPcmuFrame)];
2436 for (size_t i = 0; i < ARRAY_SIZE(packets); ++i) {
2437 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002438 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002439 }
2440 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2441 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2442 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2443 DeliverPacket(packets[0], sizeof(packets[0]));
2444 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2445 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2446 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2447 DeliverPacket(packets[1], sizeof(packets[1]));
2448 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1],
2449 sizeof(packets[1])));
2450 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2451 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2452 DeliverPacket(packets[2], sizeof(packets[2]));
2453 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2454 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2],
2455 sizeof(packets[2])));
2456 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2457 DeliverPacket(packets[3], sizeof(packets[3]));
2458 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2459 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2460 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3],
2461 sizeof(packets[3])));
2462 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2463 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2464 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2465}
2466
solenberg0a617e22015-10-20 15:49:38 -07002467// Test that we properly handle failures to add a receive stream.
2468TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
2469 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002470 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002471 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002472}
2473
solenberg0a617e22015-10-20 15:49:38 -07002474// Test that we properly handle failures to add a send stream.
2475TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
2476 EXPECT_TRUE(SetupEngine());
2477 voe_.set_fail_create_channel(true);
2478 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2479}
2480
solenberg1ac56142015-10-13 03:58:19 -07002481// Test that AddRecvStream creates new stream.
2482TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2483 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002484 int channel_num = voe_.GetLastChannel();
2485 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002486 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002487}
2488
2489// Test that after adding a recv stream, we do not decode more codecs than
2490// those previously passed into SetRecvCodecs.
2491TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002492 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002493 cricket::AudioRecvParameters parameters;
2494 parameters.codecs.push_back(kIsacCodec);
2495 parameters.codecs.push_back(kPcmuCodec);
2496 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002497 EXPECT_TRUE(channel_->AddRecvStream(
2498 cricket::StreamParams::CreateLegacy(kSsrc1)));
2499 int channel_num2 = voe_.GetLastChannel();
2500 webrtc::CodecInst gcodec;
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002501 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "opus");
2502 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002503 gcodec.channels = 2;
2504 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2505}
2506
2507// Test that we properly clean up any streams that were added, even if
2508// not explicitly removed.
2509TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002510 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002511 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002512 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2513 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2514 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2515 delete channel_;
2516 channel_ = NULL;
2517 EXPECT_EQ(0, voe_.GetNumChannels());
2518}
2519
wu@webrtc.org78187522013-10-07 23:32:02 +00002520TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002521 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002522 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2523}
2524
2525TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2526 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002527 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002528 // Manually delete channel to simulate a failure.
2529 int channel = voe_.GetLastChannel();
2530 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2531 // Add recv stream 2 should work.
2532 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002533 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002534 EXPECT_NE(channel, new_channel);
2535 // The last created channel is deleted too.
2536 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002537}
2538
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002539// Test the InsertDtmf on default send stream as caller.
2540TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2541 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002542}
2543
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002544// Test the InsertDtmf on default send stream as callee
2545TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2546 TestInsertDtmf(0, false);
2547}
2548
2549// Test the InsertDtmf on specified send stream as caller.
2550TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2551 TestInsertDtmf(kSsrc1, true);
2552}
2553
2554// Test the InsertDtmf on specified send stream as callee.
2555TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2556 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002557}
2558
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002559TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002560 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002561 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002562 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2563 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2564 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2565 EXPECT_TRUE(channel_->SetPlayout(true));
2566 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2567 EXPECT_TRUE(channel_->SetPlayout(false));
2568 EXPECT_FALSE(channel_->SetPlayout(true));
2569}
2570
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002571TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002572 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002573
2574 bool ec_enabled;
2575 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002576 webrtc::AecmModes aecm_mode;
2577 bool cng_enabled;
2578 bool agc_enabled;
2579 webrtc::AgcModes agc_mode;
2580 webrtc::AgcConfig agc_config;
2581 bool ns_enabled;
2582 webrtc::NsModes ns_mode;
2583 bool highpass_filter_enabled;
2584 bool stereo_swapping_enabled;
2585 bool typing_detection_enabled;
2586 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002587 voe_.GetAecmMode(aecm_mode, cng_enabled);
2588 voe_.GetAgcStatus(agc_enabled, agc_mode);
2589 voe_.GetAgcConfig(agc_config);
2590 voe_.GetNsStatus(ns_enabled, ns_mode);
2591 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2592 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2593 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2594 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002595 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002596 EXPECT_FALSE(cng_enabled);
2597 EXPECT_TRUE(agc_enabled);
2598 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2599 EXPECT_TRUE(ns_enabled);
2600 EXPECT_TRUE(highpass_filter_enabled);
2601 EXPECT_FALSE(stereo_swapping_enabled);
2602 EXPECT_TRUE(typing_detection_enabled);
2603 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2604 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2605
2606 // Nothing set, so all ignored.
2607 cricket::AudioOptions options;
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002608 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002609 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002610 voe_.GetAecmMode(aecm_mode, cng_enabled);
2611 voe_.GetAgcStatus(agc_enabled, agc_mode);
2612 voe_.GetAgcConfig(agc_config);
2613 voe_.GetNsStatus(ns_enabled, ns_mode);
2614 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2615 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2616 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2617 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002618 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002619 EXPECT_FALSE(cng_enabled);
2620 EXPECT_TRUE(agc_enabled);
2621 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2622 EXPECT_TRUE(ns_enabled);
2623 EXPECT_TRUE(highpass_filter_enabled);
2624 EXPECT_FALSE(stereo_swapping_enabled);
2625 EXPECT_TRUE(typing_detection_enabled);
2626 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2627 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
Henrik Lundin64dad832015-05-11 12:44:23 +02002628 EXPECT_EQ(50, voe_.GetNetEqCapacity()); // From GetDefaultEngineOptions().
Henrik Lundin5263b3c2015-06-01 10:29:41 +02002629 EXPECT_FALSE(
2630 voe_.GetNetEqFastAccelerate()); // From GetDefaultEngineOptions().
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002631
2632 // Turn echo cancellation off
kwiberg102c6a62015-10-30 02:47:38 -07002633 options.echo_cancellation = rtc::Maybe<bool>(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002634 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002635 voe_.GetEcStatus(ec_enabled, ec_mode);
2636 EXPECT_FALSE(ec_enabled);
2637
2638 // Turn echo cancellation back on, with settings, and make sure
2639 // nothing else changed.
kwiberg102c6a62015-10-30 02:47:38 -07002640 options.echo_cancellation = rtc::Maybe<bool>(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002641 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002642 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002643 voe_.GetAecmMode(aecm_mode, cng_enabled);
2644 voe_.GetAgcStatus(agc_enabled, agc_mode);
2645 voe_.GetAgcConfig(agc_config);
2646 voe_.GetNsStatus(ns_enabled, ns_mode);
2647 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2648 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2649 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2650 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002651 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002652 EXPECT_TRUE(agc_enabled);
2653 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2654 EXPECT_TRUE(ns_enabled);
2655 EXPECT_TRUE(highpass_filter_enabled);
2656 EXPECT_FALSE(stereo_swapping_enabled);
2657 EXPECT_TRUE(typing_detection_enabled);
2658 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2659 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2660
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002661 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2662 // control.
kwiberg102c6a62015-10-30 02:47:38 -07002663 options.delay_agnostic_aec = rtc::Maybe<bool>(true);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002664 ASSERT_TRUE(engine_.SetOptions(options));
2665 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002666 voe_.GetAecmMode(aecm_mode, cng_enabled);
2667 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002668 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002669 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2670
2671 // Turn off echo cancellation and delay agnostic aec.
kwiberg102c6a62015-10-30 02:47:38 -07002672 options.delay_agnostic_aec = rtc::Maybe<bool>(false);
2673 options.extended_filter_aec = rtc::Maybe<bool>(false);
2674 options.echo_cancellation = rtc::Maybe<bool>(false);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002675 ASSERT_TRUE(engine_.SetOptions(options));
2676 voe_.GetEcStatus(ec_enabled, ec_mode);
2677 EXPECT_FALSE(ec_enabled);
2678 // Turning delay agnostic aec back on should also turn on echo cancellation.
kwiberg102c6a62015-10-30 02:47:38 -07002679 options.delay_agnostic_aec = rtc::Maybe<bool>(true);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002680 ASSERT_TRUE(engine_.SetOptions(options));
2681 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002682 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002683 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002684 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2685
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002686 // Turn off AGC
kwiberg102c6a62015-10-30 02:47:38 -07002687 options.auto_gain_control = rtc::Maybe<bool>(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002688 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002689 voe_.GetAgcStatus(agc_enabled, agc_mode);
2690 EXPECT_FALSE(agc_enabled);
2691
2692 // Turn AGC back on
kwiberg102c6a62015-10-30 02:47:38 -07002693 options.auto_gain_control = rtc::Maybe<bool>(true);
2694 options.adjust_agc_delta = rtc::Maybe<int>();
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002695 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002696 voe_.GetAgcStatus(agc_enabled, agc_mode);
2697 EXPECT_TRUE(agc_enabled);
2698 voe_.GetAgcConfig(agc_config);
2699 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2700
2701 // Turn off other options (and stereo swapping on).
kwiberg102c6a62015-10-30 02:47:38 -07002702 options.noise_suppression = rtc::Maybe<bool>(false);
2703 options.highpass_filter = rtc::Maybe<bool>(false);
2704 options.typing_detection = rtc::Maybe<bool>(false);
2705 options.stereo_swapping = rtc::Maybe<bool>(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002706 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002707 voe_.GetNsStatus(ns_enabled, ns_mode);
2708 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2709 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2710 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2711 EXPECT_FALSE(ns_enabled);
2712 EXPECT_FALSE(highpass_filter_enabled);
2713 EXPECT_FALSE(typing_detection_enabled);
2714 EXPECT_TRUE(stereo_swapping_enabled);
2715
solenberg1ac56142015-10-13 03:58:19 -07002716 // Set options again to ensure it has no impact.
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002717 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002718 voe_.GetEcStatus(ec_enabled, ec_mode);
2719 voe_.GetNsStatus(ns_enabled, ns_mode);
2720 EXPECT_TRUE(ec_enabled);
2721 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2722 EXPECT_FALSE(ns_enabled);
2723 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2724}
2725
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002726TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002727 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002728
2729 bool ec_enabled;
2730 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002731 bool agc_enabled;
2732 webrtc::AgcModes agc_mode;
2733 bool ns_enabled;
2734 webrtc::NsModes ns_mode;
2735 bool highpass_filter_enabled;
2736 bool stereo_swapping_enabled;
2737 bool typing_detection_enabled;
2738
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002739 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002740 voe_.GetAgcStatus(agc_enabled, agc_mode);
2741 voe_.GetNsStatus(ns_enabled, ns_mode);
2742 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2743 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2744 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2745 EXPECT_TRUE(ec_enabled);
2746 EXPECT_TRUE(agc_enabled);
2747 EXPECT_TRUE(ns_enabled);
2748 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002749 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002750 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002751}
2752
2753TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2754 webrtc::AgcConfig set_config = {0};
2755 set_config.targetLeveldBOv = 3;
2756 set_config.digitalCompressionGaindB = 9;
2757 set_config.limiterEnable = true;
2758 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002759 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002760
2761 webrtc::AgcConfig config = {0};
2762 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2763 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2764 EXPECT_EQ(set_config.digitalCompressionGaindB,
2765 config.digitalCompressionGaindB);
2766 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2767}
2768
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002769TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002770 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg66f43392015-09-09 01:36:22 -07002771 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2772 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002773 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002774 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2775 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002776 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002777
2778 // Have to add a stream to make SetSend work.
2779 cricket::StreamParams stream1;
2780 stream1.ssrcs.push_back(1);
2781 channel1->AddSendStream(stream1);
2782 cricket::StreamParams stream2;
2783 stream2.ssrcs.push_back(2);
2784 channel2->AddSendStream(stream2);
2785
2786 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002787 cricket::AudioSendParameters parameters_options_all = send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002788 parameters_options_all.options.echo_cancellation = rtc::Maybe<bool>(true);
2789 parameters_options_all.options.auto_gain_control = rtc::Maybe<bool>(true);
2790 parameters_options_all.options.noise_suppression = rtc::Maybe<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002791 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2792 EXPECT_EQ(parameters_options_all.options, channel1->options());
2793 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2794 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002795
2796 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002797 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002798 parameters_options_no_ns.options.noise_suppression = rtc::Maybe<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002799 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2800 cricket::AudioOptions expected_options = parameters_options_all.options;
kwiberg102c6a62015-10-30 02:47:38 -07002801 expected_options.echo_cancellation = rtc::Maybe<bool>(true);
2802 expected_options.auto_gain_control = rtc::Maybe<bool>(true);
2803 expected_options.noise_suppression = rtc::Maybe<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002804 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002805
2806 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002807 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002808 parameters_options_no_agc.options.auto_gain_control = rtc::Maybe<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002809 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
kwiberg102c6a62015-10-30 02:47:38 -07002810 expected_options.echo_cancellation = rtc::Maybe<bool>(true);
2811 expected_options.auto_gain_control = rtc::Maybe<bool>(false);
2812 expected_options.noise_suppression = rtc::Maybe<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002813 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002814
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002815 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002816 bool ec_enabled;
2817 webrtc::EcModes ec_mode;
2818 bool agc_enabled;
2819 webrtc::AgcModes agc_mode;
2820 bool ns_enabled;
2821 webrtc::NsModes ns_mode;
2822 voe_.GetEcStatus(ec_enabled, ec_mode);
2823 voe_.GetAgcStatus(agc_enabled, agc_mode);
2824 voe_.GetNsStatus(ns_enabled, ns_mode);
2825 EXPECT_TRUE(ec_enabled);
2826 EXPECT_TRUE(agc_enabled);
2827 EXPECT_TRUE(ns_enabled);
2828
2829 channel1->SetSend(cricket::SEND_MICROPHONE);
2830 voe_.GetEcStatus(ec_enabled, ec_mode);
2831 voe_.GetAgcStatus(agc_enabled, agc_mode);
2832 voe_.GetNsStatus(ns_enabled, ns_mode);
2833 EXPECT_TRUE(ec_enabled);
2834 EXPECT_TRUE(agc_enabled);
2835 EXPECT_FALSE(ns_enabled);
2836
2837 channel1->SetSend(cricket::SEND_NOTHING);
2838 voe_.GetEcStatus(ec_enabled, ec_mode);
2839 voe_.GetAgcStatus(agc_enabled, agc_mode);
2840 voe_.GetNsStatus(ns_enabled, ns_mode);
2841 EXPECT_TRUE(ec_enabled);
2842 EXPECT_TRUE(agc_enabled);
2843 EXPECT_TRUE(ns_enabled);
2844
2845 channel2->SetSend(cricket::SEND_MICROPHONE);
2846 voe_.GetEcStatus(ec_enabled, ec_mode);
2847 voe_.GetAgcStatus(agc_enabled, agc_mode);
2848 voe_.GetNsStatus(ns_enabled, ns_mode);
2849 EXPECT_TRUE(ec_enabled);
2850 EXPECT_FALSE(agc_enabled);
2851 EXPECT_TRUE(ns_enabled);
2852
2853 channel2->SetSend(cricket::SEND_NOTHING);
2854 voe_.GetEcStatus(ec_enabled, ec_mode);
2855 voe_.GetAgcStatus(agc_enabled, agc_mode);
2856 voe_.GetNsStatus(ns_enabled, ns_mode);
2857 EXPECT_TRUE(ec_enabled);
2858 EXPECT_TRUE(agc_enabled);
2859 EXPECT_TRUE(ns_enabled);
2860
2861 // Make sure settings take effect while we are sending.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002862 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
2863 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2864 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002865 parameters_options_no_agc_nor_ns.options.auto_gain_control =
2866 rtc::Maybe<bool>(false);
2867 parameters_options_no_agc_nor_ns.options.noise_suppression =
2868 rtc::Maybe<bool>(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002869 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002870 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
kwiberg102c6a62015-10-30 02:47:38 -07002871 expected_options.echo_cancellation = rtc::Maybe<bool>(true);
2872 expected_options.auto_gain_control = rtc::Maybe<bool>(false);
2873 expected_options.noise_suppression = rtc::Maybe<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002874 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002875 voe_.GetEcStatus(ec_enabled, ec_mode);
2876 voe_.GetAgcStatus(agc_enabled, agc_mode);
2877 voe_.GetNsStatus(ns_enabled, ns_mode);
2878 EXPECT_TRUE(ec_enabled);
2879 EXPECT_FALSE(agc_enabled);
2880 EXPECT_FALSE(ns_enabled);
2881}
2882
wu@webrtc.orgde305012013-10-31 15:40:38 +00002883// This test verifies DSCP settings are properly applied on voice media channel.
2884TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002885 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002886 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002887 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002888 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00002889 new cricket::FakeNetworkInterface);
2890 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002891 cricket::AudioSendParameters parameters = send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002892 parameters.options.dscp = rtc::Maybe<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002893 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002894 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00002895 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002896 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002897 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
kwiberg102c6a62015-10-30 02:47:38 -07002898 parameters.options.dscp = rtc::Maybe<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002899 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002900 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00002901}
2902
solenberg1ac56142015-10-13 03:58:19 -07002903TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002904 EXPECT_TRUE(SetupEngine());
2905 cricket::WebRtcVoiceMediaChannel* media_channel =
2906 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002907 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2908 EXPECT_TRUE(channel_->AddRecvStream(
2909 cricket::StreamParams::CreateLegacy(kSsrc1)));
2910 int channel_id = voe_.GetLastChannel();
2911 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2912 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2913 EXPECT_TRUE(channel_->AddRecvStream(
2914 cricket::StreamParams::CreateLegacy(kSsrc2)));
2915 int channel_id2 = voe_.GetLastChannel();
2916 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002917}
2918
solenberg1ac56142015-10-13 03:58:19 -07002919TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002920 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002921 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002922 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2923 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2924 EXPECT_TRUE(channel_->AddSendStream(
2925 cricket::StreamParams::CreateLegacy(kSsrc1)));
2926 int channel_id = voe_.GetLastChannel();
2927 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2928 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2929 EXPECT_TRUE(channel_->AddSendStream(
2930 cricket::StreamParams::CreateLegacy(kSsrc2)));
2931 int channel_id2 = voe_.GetLastChannel();
2932 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002933}
2934
solenberg4bac9c52015-10-09 02:32:53 -07002935TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002936 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002937 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002938 cricket::StreamParams stream;
2939 stream.ssrcs.push_back(kSsrc2);
2940 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002941 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002942 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002943 float scale = 0;
2944 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2945 EXPECT_DOUBLE_EQ(3, scale);
2946}
2947
2948TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
2949 EXPECT_TRUE(SetupEngine());
2950 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2951 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2952 int channel_id = voe_.GetLastChannel();
2953 float scale = 0;
2954 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2955 EXPECT_DOUBLE_EQ(2, scale);
2956 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07002957 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002958 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002959}
2960
pbos8fc7fa72015-07-15 08:02:58 -07002961TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02002962 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07002963 const std::string kSyncLabel = "AvSyncLabel";
2964
solenberg1ac56142015-10-13 03:58:19 -07002965 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07002966 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
2967 sp.sync_label = kSyncLabel;
2968 // Creating two channels to make sure that sync label is set properly for both
2969 // the default voice channel and following ones.
2970 EXPECT_TRUE(channel_->AddRecvStream(sp));
2971 sp.ssrcs[0] += 1;
2972 EXPECT_TRUE(channel_->AddRecvStream(sp));
2973
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002974 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07002975 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002976 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002977 << "SyncGroup should be set based on sync_label";
2978 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002979 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002980 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07002981}
2982
pbos6bb1b6e2015-07-24 07:10:18 -07002983TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002984 // Test that changing the combined_audio_video_bwe option results in the
2985 // expected state changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002986 std::vector<uint32_t> ssrcs;
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002987 ssrcs.push_back(223);
2988 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002989
solenberg1ac56142015-10-13 03:58:19 -07002990 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002991 cricket::WebRtcVoiceMediaChannel* media_channel =
2992 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02002993 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002994 EXPECT_TRUE(media_channel->AddRecvStream(
2995 cricket::StreamParams::CreateLegacy(ssrc)));
2996 }
2997 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002998
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002999 // Combined BWE should be disabled.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003000 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003001 const auto* s = call_.GetAudioReceiveStream(ssrc);
3002 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07003003 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003004 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003005
3006 // Enable combined BWE option - now it should be set up.
kwiberg102c6a62015-10-30 02:47:38 -07003007 send_parameters_.options.combined_audio_video_bwe = rtc::Maybe<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003008 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
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);
3012 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
3013 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003014
3015 // Disable combined BWE option - should be disabled again.
kwiberg102c6a62015-10-30 02:47:38 -07003016 send_parameters_.options.combined_audio_video_bwe = rtc::Maybe<bool>(false);
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);
solenberg85a04962015-10-27 03:35:21 -07003021 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003022 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003023
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003024 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003025}
3026
pbos6bb1b6e2015-07-24 07:10:18 -07003027TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003028 // Test that adding receive streams after enabling combined bandwidth
3029 // estimation will correctly configure each channel.
solenberg1ac56142015-10-13 03:58:19 -07003030 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003031 cricket::WebRtcVoiceMediaChannel* media_channel =
3032 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
kwiberg102c6a62015-10-30 02:47:38 -07003033 send_parameters_.options.combined_audio_video_bwe = rtc::Maybe<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003034 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003035
Peter Boström0c4e06b2015-10-07 12:23:21 +02003036 static const uint32_t kSsrcs[] = {1, 2, 3, 4};
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003037 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs); ++i) {
3038 EXPECT_TRUE(media_channel->AddRecvStream(
3039 cricket::StreamParams::CreateLegacy(kSsrcs[i])));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003040 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(kSsrcs[i]));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003041 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003042 EXPECT_EQ(ARRAY_SIZE(kSsrcs), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003043}
3044
pbos6bb1b6e2015-07-24 07:10:18 -07003045TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003046 // Test that setting the header extensions results in the expected state
3047 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003048 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003049 ssrcs.push_back(223);
3050 ssrcs.push_back(224);
3051
solenberg1ac56142015-10-13 03:58:19 -07003052 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003053 cricket::WebRtcVoiceMediaChannel* media_channel =
3054 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
kwiberg102c6a62015-10-30 02:47:38 -07003055 send_parameters_.options.combined_audio_video_bwe = rtc::Maybe<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003056 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003057 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003058 EXPECT_TRUE(media_channel->AddRecvStream(
3059 cricket::StreamParams::CreateLegacy(ssrc)));
3060 }
3061
3062 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003063 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003064 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003065 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003066 EXPECT_NE(nullptr, s);
3067 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3068 }
3069
3070 // Set up receive extensions.
3071 const auto& e_exts = engine_.rtp_header_extensions();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003072 cricket::AudioRecvParameters recv_parameters;
3073 recv_parameters.extensions = e_exts;
3074 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003075 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003076 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003077 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003078 EXPECT_NE(nullptr, s);
3079 const auto& s_exts = s->GetConfig().rtp.extensions;
3080 EXPECT_EQ(e_exts.size(), s_exts.size());
3081 for (const auto& e_ext : e_exts) {
3082 for (const auto& s_ext : s_exts) {
3083 if (e_ext.id == s_ext.id) {
3084 EXPECT_EQ(e_ext.uri, s_ext.name);
3085 }
3086 }
3087 }
3088 }
3089
3090 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003091 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003092 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003093 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003094 EXPECT_NE(nullptr, s);
3095 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3096 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003097}
3098
3099TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3100 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003101 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003102 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3103 static const unsigned char kRtcp[] = {
3104 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3105 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3108 };
3109 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3110
solenberg1ac56142015-10-13 03:58:19 -07003111 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003112 cricket::WebRtcVoiceMediaChannel* media_channel =
3113 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
kwiberg102c6a62015-10-30 02:47:38 -07003114 send_parameters_.options.combined_audio_video_bwe = rtc::Maybe<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003115 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003116 EXPECT_TRUE(media_channel->AddRecvStream(
3117 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3118
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003119 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003120 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003121 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003122 EXPECT_EQ(0, s->received_packets());
3123 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3124 EXPECT_EQ(1, s->received_packets());
3125 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3126 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003127}
Minyue2013aec2015-05-13 14:14:42 +02003128
solenberg0a617e22015-10-20 15:49:38 -07003129// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003130// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003131TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenberg1ac56142015-10-13 03:58:19 -07003132 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003133 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003134 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003135 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3136 int recv_ch = voe_.GetLastChannel();
3137 EXPECT_NE(recv_ch, default_channel);
3138 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3139 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3140 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003141 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3142 recv_ch = voe_.GetLastChannel();
3143 EXPECT_NE(recv_ch, default_channel);
3144 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003145}
3146
3147TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003148 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003149 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003150
3151 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3152 int recv_ch = voe_.GetLastChannel();
3153
3154 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3155 int send_ch = voe_.GetLastChannel();
3156
3157 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3158 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3159 // channel of |recv_ch|.This is not a common case, since, normally, only the
3160 // default channel can be associated. However, the default is not deletable.
3161 // So we force the |recv_ch| to associate with a non-default channel.
3162 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3163 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3164
3165 EXPECT_TRUE(channel_->RemoveSendStream(2));
3166 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3167}
stefan658910c2015-09-03 05:48:32 -07003168
3169// Tests for the actual WebRtc VoE library.
3170
3171TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
3172 cricket::WebRtcVoiceEngine engine;
3173 cricket::AudioOptions options = engine.GetOptions();
3174 // The default options should have at least a few things set. We purposefully
3175 // don't check the option values here, though.
kwiberg102c6a62015-10-30 02:47:38 -07003176 EXPECT_TRUE(options.echo_cancellation);
3177 EXPECT_TRUE(options.auto_gain_control);
3178 EXPECT_TRUE(options.noise_suppression);
stefan658910c2015-09-03 05:48:32 -07003179}
3180
3181// Tests that the library initializes and shuts down properly.
3182TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3183 cricket::WebRtcVoiceEngine engine;
3184 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003185 rtc::scoped_ptr<webrtc::Call> call(
3186 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003187 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003188 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003189 EXPECT_TRUE(channel != nullptr);
3190 delete channel;
3191 engine.Terminate();
3192
3193 // Reinit to catch regression where VoiceEngineObserver reference is lost
3194 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3195 engine.Terminate();
3196}
3197
3198// Tests that the library is configured with the codecs we want.
3199TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
3200 cricket::WebRtcVoiceEngine engine;
3201 // Check codecs by name.
3202 EXPECT_TRUE(engine.FindCodec(
3203 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0)));
3204 EXPECT_TRUE(engine.FindCodec(
3205 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0)));
3206 EXPECT_TRUE(engine.FindCodec(
3207 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0)));
3208 // Check that name matching is case-insensitive.
3209 EXPECT_TRUE(engine.FindCodec(
3210 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0)));
3211 EXPECT_TRUE(engine.FindCodec(
3212 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0)));
3213 EXPECT_TRUE(engine.FindCodec(
3214 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0)));
3215 EXPECT_TRUE(engine.FindCodec(
3216 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0)));
3217 EXPECT_TRUE(engine.FindCodec(
3218 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0)));
3219 EXPECT_TRUE(engine.FindCodec(
3220 cricket::AudioCodec(96, "red", 8000, 0, 1, 0)));
3221 EXPECT_TRUE(engine.FindCodec(
3222 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0)));
3223 EXPECT_TRUE(engine.FindCodec(
3224 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0)));
3225 EXPECT_TRUE(engine.FindCodec(
3226 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0)));
3227 EXPECT_TRUE(engine.FindCodec(
3228 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0)));
3229 // Check codecs with an id by id.
3230 EXPECT_TRUE(engine.FindCodec(
3231 cricket::AudioCodec(0, "", 8000, 0, 1, 0))); // PCMU
3232 EXPECT_TRUE(engine.FindCodec(
3233 cricket::AudioCodec(8, "", 8000, 0, 1, 0))); // PCMA
3234 EXPECT_TRUE(engine.FindCodec(
3235 cricket::AudioCodec(9, "", 8000, 0, 1, 0))); // G722
3236 EXPECT_TRUE(engine.FindCodec(
3237 cricket::AudioCodec(13, "", 8000, 0, 1, 0))); // CN
3238 // Check sample/bitrate matching.
3239 EXPECT_TRUE(engine.FindCodec(
3240 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0)));
3241 // Check that bad codecs fail.
3242 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0)));
3243 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(88, "", 0, 0, 1, 0)));
3244 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 0, 2, 0)));
3245 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 5000, 0, 1, 0)));
3246 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 5000, 1, 0)));
3247 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3248 for (std::vector<cricket::AudioCodec>::const_iterator it =
3249 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3250 if (it->name == "CN" && it->clockrate == 16000) {
3251 EXPECT_EQ(105, it->id);
3252 } else if (it->name == "CN" && it->clockrate == 32000) {
3253 EXPECT_EQ(106, it->id);
3254 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3255 EXPECT_EQ(103, it->id);
3256 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3257 EXPECT_EQ(104, it->id);
3258 } else if (it->name == "G722" && it->clockrate == 8000) {
3259 EXPECT_EQ(9, it->id);
3260 } else if (it->name == "telephone-event") {
3261 EXPECT_EQ(126, it->id);
3262 } else if (it->name == "red") {
3263 EXPECT_EQ(127, it->id);
3264 } else if (it->name == "opus") {
3265 EXPECT_EQ(111, it->id);
3266 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3267 EXPECT_EQ("10", it->params.find("minptime")->second);
3268 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3269 EXPECT_EQ("60", it->params.find("maxptime")->second);
3270 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3271 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3272 }
3273 }
3274
3275 engine.Terminate();
3276}
3277
3278// Tests that VoE supports at least 32 channels
3279TEST(WebRtcVoiceEngineTest, Has32Channels) {
3280 cricket::WebRtcVoiceEngine engine;
3281 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003282 rtc::scoped_ptr<webrtc::Call> call(
3283 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003284
3285 cricket::VoiceMediaChannel* channels[32];
3286 int num_channels = 0;
stefan658910c2015-09-03 05:48:32 -07003287 while (num_channels < ARRAY_SIZE(channels)) {
3288 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003289 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003290 if (!channel)
3291 break;
stefan658910c2015-09-03 05:48:32 -07003292 channels[num_channels++] = channel;
3293 }
3294
3295 int expected = ARRAY_SIZE(channels);
3296 EXPECT_EQ(expected, num_channels);
3297
3298 while (num_channels > 0) {
3299 delete channels[--num_channels];
3300 }
stefan658910c2015-09-03 05:48:32 -07003301 engine.Terminate();
3302}
3303
3304// Test that we set our preferred codecs properly.
3305TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3306 cricket::WebRtcVoiceEngine engine;
3307 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003308 rtc::scoped_ptr<webrtc::Call> call(
3309 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003310 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3311 call.get());
3312 cricket::AudioRecvParameters parameters;
3313 parameters.codecs = engine.codecs();
3314 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003315}