blob: 4491929784528347b4f0f3a1b52f36492b52027e [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};
solenberg43e83d42015-10-20 06:41:01 -070060static uint32_t kSsrc1 = 0x99;
61static uint32_t kSsrc2 = 0x98;
solenbergc96df772015-10-21 13:01:53 -070062static const uint32_t kSsrcs4[] = {1, 2, 3, 4};
henrike@webrtc.org28e20752013-07-10 00:45:36 +000063
64class FakeVoEWrapper : public cricket::VoEWrapper {
65 public:
66 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
67 : cricket::VoEWrapper(engine, // processing
68 engine, // base
69 engine, // codec
70 engine, // dtmf
henrike@webrtc.org28e20752013-07-10 00:45:36 +000071 engine, // hw
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);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000100 options_adjust_agc_.adjust_agc_delta.Set(-10);
101 }
solenberg1ac56142015-10-13 03:58:19 -0700102 bool SetupEngine() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000103 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000104 return false;
105 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200106 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200107 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000108 }
solenberg1ac56142015-10-13 03:58:19 -0700109 bool SetupEngineWithRecvStream() {
110 if (!SetupEngine()) {
111 return false;
112 }
113 return channel_->AddRecvStream(
114 cricket::StreamParams::CreateLegacy(kSsrc1));
115 }
116 bool SetupEngineWithSendStream() {
117 if (!SetupEngine()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000118 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000119 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000120 return channel_->AddSendStream(
121 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000122 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000123 void SetupForMultiSendStream() {
solenberg1ac56142015-10-13 03:58:19 -0700124 EXPECT_TRUE(SetupEngineWithSendStream());
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();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200127 uint32_t default_send_ssrc = 0u;
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000128 EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
129 EXPECT_EQ(kSsrc1, default_send_ssrc);
130 EXPECT_TRUE(channel_->RemoveSendStream(default_send_ssrc));
131
solenberg0a617e22015-10-20 15:49:38 -0700132 // Verify the channel does not exist.
133 EXPECT_EQ(-1, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000134 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000135 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200136 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000137 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000138 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200139 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000140 delete channel_;
141 engine_.Terminate();
142 }
143
Peter Boström0c4e06b2015-10-07 12:23:21 +0200144 void TestInsertDtmf(uint32_t ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000145 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200146 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200147 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000148 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700149 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000150 // send stream.
151 EXPECT_TRUE(channel_->AddSendStream(
152 cricket::StreamParams::CreateLegacy(kSsrc1)));
153 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000154
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000155 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200156 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000157 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
158 EXPECT_FALSE(channel_->CanInsertDtmf());
159 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111, cricket::DF_SEND));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200160 send_parameters_.codecs.push_back(kTelephoneEventCodec);
161 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000162 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000163
164 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700165 // If this is callee, there's no active send channel yet.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000166 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
167 EXPECT_TRUE(channel_->AddSendStream(
168 cricket::StreamParams::CreateLegacy(kSsrc1)));
169 }
170
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000171 // Check we fail if the ssrc is invalid.
172 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111, cricket::DF_SEND));
173
174 // Test send
solenberg0a617e22015-10-20 15:49:38 -0700175 int channel_id = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000176 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
177 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
178 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
179
180 // Test play
181 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(3, 134));
182 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 3, 134, cricket::DF_PLAY));
183 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(3, 134));
184
185 // Test send and play
186 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
187 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(4, 145));
188 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 4, 145,
189 cricket::DF_PLAY | cricket::DF_SEND));
190 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
191 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(4, 145));
192 }
193
194 // Test that send bandwidth is set correctly.
195 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000196 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
197 // |expected_result| is the expected result from SetMaxSendBandwidth().
198 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000199 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000200 int max_bitrate,
201 bool expected_result,
202 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200203 cricket::AudioSendParameters parameters;
204 parameters.codecs.push_back(codec);
205 parameters.max_bandwidth_bps = max_bitrate;
206 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
207
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000208 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000209 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000210 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000211 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000212 }
213
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000214 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenberg0a617e22015-10-20 15:49:38 -0700215 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000216 int channel_num = voe_.GetLastChannel();
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000217
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000218 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000219 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000220
221 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200222 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000223 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200224 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000225 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000226
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000227 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200228 send_parameters_.extensions.clear();
229 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000230 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000231
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000232 // Ensure extension is set properly.
233 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200234 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
235 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000236 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000237
solenberg0a617e22015-10-20 15:49:38 -0700238 // Ensure extension is set properly on new channels.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000239 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700240 cricket::StreamParams::CreateLegacy(kSsrc2)));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000241 int new_channel_num = voe_.GetLastChannel();
242 EXPECT_NE(channel_num, new_channel_num);
243 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000244
245 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200246 send_parameters_.codecs.push_back(kPcmuCodec);
247 send_parameters_.extensions.clear();
248 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000249 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
250 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000251 }
252
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000253 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700254 EXPECT_TRUE(SetupEngineWithRecvStream());
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000255 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000256
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000257 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000258 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000259
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200260 cricket::AudioRecvParameters parameters;
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000261 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200262 parameters.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000263 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200264 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000265 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000266
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000267 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200268 parameters.extensions.clear();
269 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000270 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000271
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000272 // Ensure extension is set properly.
273 const int id = 2;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200274 parameters.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
275 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000276 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000277
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000278 // Ensure extension is set properly on new channel.
279 // The first stream to occupy the default channel.
280 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700281 cricket::StreamParams::CreateLegacy(kSsrc2)));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000282 int new_channel_num = voe_.GetLastChannel();
283 EXPECT_NE(channel_num, new_channel_num);
284 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
285
286 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200287 parameters.extensions.clear();
288 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000289 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
290 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000291 }
292
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200293 const webrtc::AudioReceiveStream::Stats& GetAudioReceiveStreamStats() const {
294 static webrtc::AudioReceiveStream::Stats stats;
295 if (stats.remote_ssrc == 0) {
296 stats.remote_ssrc = 123;
297 stats.bytes_rcvd = 456;
298 stats.packets_rcvd = 768;
299 stats.packets_lost = 101;
300 stats.fraction_lost = 23.45f;
301 stats.codec_name = "codec_name";
302 stats.ext_seqnum = 678;
303 stats.jitter_ms = 901;
304 stats.jitter_buffer_ms = 234;
305 stats.jitter_buffer_preferred_ms = 567;
306 stats.delay_estimate_ms = 890;
307 stats.audio_level = 1234;
308 stats.expand_rate = 5.67f;
309 stats.speech_expand_rate = 8.90f;
310 stats.secondary_decoded_rate = 1.23f;
311 stats.accelerate_rate = 4.56f;
312 stats.preemptive_expand_rate = 7.89f;
313 stats.decoding_calls_to_silence_generator = 012;
314 stats.decoding_calls_to_neteq = 345;
315 stats.decoding_normal = 67890;
316 stats.decoding_plc = 1234;
317 stats.decoding_cng = 5678;
318 stats.decoding_plc_cng = 9012;
319 stats.capture_start_ntp_time_ms = 3456;
320 }
321 return stats;
322 }
323 void SetAudioReceiveStreamStats() {
324 for (auto* s : call_.GetAudioReceiveStreams()) {
325 s->SetStats(GetAudioReceiveStreamStats());
326 }
327 }
328 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
329 const auto& kStats = GetAudioReceiveStreamStats();
330 EXPECT_EQ(info.local_stats.front().ssrc, kStats.remote_ssrc);
331 EXPECT_EQ(info.bytes_rcvd, kStats.bytes_rcvd);
332 EXPECT_EQ(info.packets_rcvd, kStats.packets_rcvd);
333 EXPECT_EQ(info.packets_lost, kStats.packets_lost);
334 EXPECT_EQ(info.fraction_lost, kStats.fraction_lost);
335 EXPECT_EQ(info.codec_name, kStats.codec_name);
336 EXPECT_EQ(info.ext_seqnum, kStats.ext_seqnum);
337 EXPECT_EQ(info.jitter_ms, kStats.jitter_ms);
338 EXPECT_EQ(info.jitter_buffer_ms, kStats.jitter_buffer_ms);
339 EXPECT_EQ(info.jitter_buffer_preferred_ms,
340 kStats.jitter_buffer_preferred_ms);
341 EXPECT_EQ(info.delay_estimate_ms, kStats.delay_estimate_ms);
342 EXPECT_EQ(info.audio_level, kStats.audio_level);
343 EXPECT_EQ(info.expand_rate, kStats.expand_rate);
344 EXPECT_EQ(info.speech_expand_rate, kStats.speech_expand_rate);
345 EXPECT_EQ(info.secondary_decoded_rate, kStats.secondary_decoded_rate);
346 EXPECT_EQ(info.accelerate_rate, kStats.accelerate_rate);
347 EXPECT_EQ(info.preemptive_expand_rate, kStats.preemptive_expand_rate);
348 EXPECT_EQ(info.decoding_calls_to_silence_generator,
349 kStats.decoding_calls_to_silence_generator);
350 EXPECT_EQ(info.decoding_calls_to_neteq, kStats.decoding_calls_to_neteq);
351 EXPECT_EQ(info.decoding_normal, kStats.decoding_normal);
352 EXPECT_EQ(info.decoding_plc, kStats.decoding_plc);
353 EXPECT_EQ(info.decoding_cng, kStats.decoding_cng);
354 EXPECT_EQ(info.decoding_plc_cng, kStats.decoding_plc_cng);
355 EXPECT_EQ(info.capture_start_ntp_time_ms, kStats.capture_start_ntp_time_ms);
356 }
357
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000358 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200359 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000360 cricket::FakeWebRtcVoiceEngine voe_;
wu@webrtc.org97077a32013-10-25 21:18:33 +0000361 FakeVoETraceWrapper* trace_wrapper_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000362 cricket::WebRtcVoiceEngine engine_;
363 cricket::VoiceMediaChannel* channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000364
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200365 cricket::AudioSendParameters send_parameters_;
366 cricket::AudioRecvParameters recv_parameters_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000367 cricket::AudioOptions options_adjust_agc_;
368};
369
370// Tests that our stub library "works".
371TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
372 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000373 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000374 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000375 engine_.Terminate();
376 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000377}
378
379// Tests that we can create and destroy a channel.
380TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000381 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200382 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200383 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000384}
385
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000386// Tests that the list of supported codecs is created properly and ordered
387// correctly
388TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
389 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
390 ASSERT_FALSE(codecs.empty());
391 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
392 EXPECT_EQ(48000, codecs[0].clockrate);
393 EXPECT_EQ(2, codecs[0].channels);
394 EXPECT_EQ(64000, codecs[0].bitrate);
395 int pref = codecs[0].preference;
396 for (size_t i = 1; i < codecs.size(); ++i) {
397 EXPECT_GT(pref, codecs[i].preference);
398 pref = codecs[i].preference;
399 }
400}
401
402// Tests that we can find codecs by name or id, and that we interpret the
403// clockrate and bitrate fields properly.
404TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
405 cricket::AudioCodec codec;
406 webrtc::CodecInst codec_inst;
407 // Find PCMU with explicit clockrate and bitrate.
408 EXPECT_TRUE(engine_.FindWebRtcCodec(kPcmuCodec, &codec_inst));
409 // Find ISAC with explicit clockrate and 0 bitrate.
410 EXPECT_TRUE(engine_.FindWebRtcCodec(kIsacCodec, &codec_inst));
411 // Find telephone-event with explicit clockrate and 0 bitrate.
412 EXPECT_TRUE(engine_.FindWebRtcCodec(kTelephoneEventCodec, &codec_inst));
413 // Find ISAC with a different payload id.
414 codec = kIsacCodec;
415 codec.id = 127;
416 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
417 EXPECT_EQ(codec.id, codec_inst.pltype);
418 // Find PCMU with a 0 clockrate.
419 codec = kPcmuCodec;
420 codec.clockrate = 0;
421 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
422 EXPECT_EQ(codec.id, codec_inst.pltype);
423 EXPECT_EQ(8000, codec_inst.plfreq);
424 // Find PCMU with a 0 bitrate.
425 codec = kPcmuCodec;
426 codec.bitrate = 0;
427 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
428 EXPECT_EQ(codec.id, codec_inst.pltype);
429 EXPECT_EQ(64000, codec_inst.rate);
430 // Find ISAC with an explicit bitrate.
431 codec = kIsacCodec;
432 codec.bitrate = 32000;
433 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
434 EXPECT_EQ(codec.id, codec_inst.pltype);
435 EXPECT_EQ(32000, codec_inst.rate);
436}
437
438// Test that we set our inbound codecs properly, including changing PT.
439TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
440 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200441 cricket::AudioRecvParameters parameters;
442 parameters.codecs.push_back(kIsacCodec);
443 parameters.codecs.push_back(kPcmuCodec);
444 parameters.codecs.push_back(kTelephoneEventCodec);
445 parameters.codecs[0].id = 106; // collide with existing telephone-event
446 parameters.codecs[2].id = 126;
447 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700448 EXPECT_TRUE(channel_->AddRecvStream(
449 cricket::StreamParams::CreateLegacy(kSsrc1)));
450 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000451 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000452 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000453 gcodec.plfreq = 16000;
454 gcodec.channels = 1;
455 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
456 EXPECT_EQ(106, gcodec.pltype);
457 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000458 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000459 "telephone-event");
460 gcodec.plfreq = 8000;
461 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
462 EXPECT_EQ(126, gcodec.pltype);
463 EXPECT_STREQ("telephone-event", gcodec.plname);
464}
465
466// Test that we fail to set an unknown inbound codec.
467TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
468 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200469 cricket::AudioRecvParameters parameters;
470 parameters.codecs.push_back(kIsacCodec);
471 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
472 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000473}
474
475// Test that we fail if we have duplicate types in the inbound list.
476TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
477 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200478 cricket::AudioRecvParameters parameters;
479 parameters.codecs.push_back(kIsacCodec);
480 parameters.codecs.push_back(kCn16000Codec);
481 parameters.codecs[1].id = kIsacCodec.id;
482 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000483}
484
485// Test that we can decode OPUS without stereo parameters.
486TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
487 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200488 cricket::AudioRecvParameters parameters;
489 parameters.codecs.push_back(kIsacCodec);
490 parameters.codecs.push_back(kPcmuCodec);
491 parameters.codecs.push_back(kOpusCodec);
492 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000493 EXPECT_TRUE(channel_->AddRecvStream(
494 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700495 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000496 webrtc::CodecInst opus;
497 engine_.FindWebRtcCodec(kOpusCodec, &opus);
498 // Even without stereo parameters, recv codecs still specify channels = 2.
499 EXPECT_EQ(2, opus.channels);
500 EXPECT_EQ(111, opus.pltype);
501 EXPECT_STREQ("opus", opus.plname);
502 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700503 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000504 EXPECT_EQ(111, opus.pltype);
505}
506
507// Test that we can decode OPUS with stereo = 0.
508TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
509 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200510 cricket::AudioRecvParameters parameters;
511 parameters.codecs.push_back(kIsacCodec);
512 parameters.codecs.push_back(kPcmuCodec);
513 parameters.codecs.push_back(kOpusCodec);
514 parameters.codecs[2].params["stereo"] = "0";
515 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000516 EXPECT_TRUE(channel_->AddRecvStream(
517 cricket::StreamParams::CreateLegacy(kSsrc1)));
518 int channel_num2 = voe_.GetLastChannel();
519 webrtc::CodecInst opus;
520 engine_.FindWebRtcCodec(kOpusCodec, &opus);
521 // Even when stereo is off, recv codecs still specify channels = 2.
522 EXPECT_EQ(2, opus.channels);
523 EXPECT_EQ(111, opus.pltype);
524 EXPECT_STREQ("opus", opus.plname);
525 opus.pltype = 0;
526 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
527 EXPECT_EQ(111, opus.pltype);
528}
529
530// Test that we can decode OPUS with stereo = 1.
531TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
532 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200533 cricket::AudioRecvParameters parameters;
534 parameters.codecs.push_back(kIsacCodec);
535 parameters.codecs.push_back(kPcmuCodec);
536 parameters.codecs.push_back(kOpusCodec);
537 parameters.codecs[2].params["stereo"] = "1";
538 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000539 EXPECT_TRUE(channel_->AddRecvStream(
540 cricket::StreamParams::CreateLegacy(kSsrc1)));
541 int channel_num2 = voe_.GetLastChannel();
542 webrtc::CodecInst opus;
543 engine_.FindWebRtcCodec(kOpusCodec, &opus);
544 EXPECT_EQ(2, opus.channels);
545 EXPECT_EQ(111, opus.pltype);
546 EXPECT_STREQ("opus", opus.plname);
547 opus.pltype = 0;
548 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
549 EXPECT_EQ(111, opus.pltype);
550}
551
552// Test that changes to recv codecs are applied to all streams.
553TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
554 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200555 cricket::AudioRecvParameters parameters;
556 parameters.codecs.push_back(kIsacCodec);
557 parameters.codecs.push_back(kPcmuCodec);
558 parameters.codecs.push_back(kTelephoneEventCodec);
559 parameters.codecs[0].id = 106; // collide with existing telephone-event
560 parameters.codecs[2].id = 126;
561 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000562 EXPECT_TRUE(channel_->AddRecvStream(
563 cricket::StreamParams::CreateLegacy(kSsrc1)));
564 int channel_num2 = voe_.GetLastChannel();
565 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000566 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000567 gcodec.plfreq = 16000;
568 gcodec.channels = 1;
569 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
570 EXPECT_EQ(106, gcodec.pltype);
571 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000572 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000573 "telephone-event");
574 gcodec.plfreq = 8000;
575 gcodec.channels = 1;
576 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
577 EXPECT_EQ(126, gcodec.pltype);
578 EXPECT_STREQ("telephone-event", gcodec.plname);
579}
580
581TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenberg1ac56142015-10-13 03:58:19 -0700582 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200583 cricket::AudioRecvParameters parameters;
584 parameters.codecs.push_back(kIsacCodec);
585 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200586 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000587
588 int channel_num2 = voe_.GetLastChannel();
589 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000590 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000591 gcodec.plfreq = 16000;
592 gcodec.channels = 1;
593 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
594 EXPECT_EQ(106, gcodec.pltype);
595 EXPECT_STREQ("ISAC", gcodec.plname);
596}
597
598// Test that we can apply the same set of codecs again while playing.
599TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700600 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200601 cricket::AudioRecvParameters parameters;
602 parameters.codecs.push_back(kIsacCodec);
603 parameters.codecs.push_back(kCn16000Codec);
604 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000605 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200606 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000607
608 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200609 parameters.codecs[0].id = 127;
610 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
611 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000612 EXPECT_TRUE(voe_.GetPlayout(channel_num));
613}
614
615// Test that we can add a codec while playing.
616TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700617 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200618 cricket::AudioRecvParameters parameters;
619 parameters.codecs.push_back(kIsacCodec);
620 parameters.codecs.push_back(kCn16000Codec);
621 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000622 EXPECT_TRUE(channel_->SetPlayout(true));
623
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200624 parameters.codecs.push_back(kOpusCodec);
625 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
626 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000627 EXPECT_TRUE(voe_.GetPlayout(channel_num));
628 webrtc::CodecInst gcodec;
629 EXPECT_TRUE(engine_.FindWebRtcCodec(kOpusCodec, &gcodec));
630 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
631}
632
633TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenberg1ac56142015-10-13 03:58:19 -0700634 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000635
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000636 // Test that when autobw is enabled, bitrate is kept as the default
637 // value. autobw is enabled for the following tests because the target
638 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000639
640 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000641 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000642
643 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000644 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000645
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000646 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000647 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648}
649
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000650TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700651 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000652
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000653 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654
655 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000656 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
657 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000658
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000659 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000660 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
661 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662}
663
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000664TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700665 EXPECT_TRUE(SetupEngineWithSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000666
667 // Test that we can only set a maximum bitrate for a fixed-rate codec
668 // if it's bigger than the fixed rate.
669
670 // PCMU, fixed bitrate == 64000.
671 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
672 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
673 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
674 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
675 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
676 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
677 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
678}
679
680TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -0700681 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200682 const int kDesiredBitrate = 128000;
683 cricket::AudioSendParameters parameters;
684 parameters.codecs = engine_.codecs();
685 parameters.max_bandwidth_bps = kDesiredBitrate;
686 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000687
688 EXPECT_TRUE(channel_->AddSendStream(
689 cricket::StreamParams::CreateLegacy(kSsrc1)));
690
691 int channel_num = voe_.GetLastChannel();
692 webrtc::CodecInst codec;
693 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200694 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000695}
696
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000697// Test that bitrate cannot be set for CBR codecs.
698// Bitrate is ignored if it is higher than the fixed bitrate.
699// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000700TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenberg1ac56142015-10-13 03:58:19 -0700701 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000702
703 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200704 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
705 int channel_num = voe_.GetLastChannel();
706 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000707 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
708 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200709
710 send_parameters_.max_bandwidth_bps = 128000;
711 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000712 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
713 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200714
715 send_parameters_.max_bandwidth_bps = 128;
716 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000717 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
718 EXPECT_EQ(64000, codec.rate);
719}
720
721// Test that we apply codecs properly.
722TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenberg1ac56142015-10-13 03:58:19 -0700723 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200724 cricket::AudioSendParameters parameters;
725 parameters.codecs.push_back(kIsacCodec);
726 parameters.codecs.push_back(kPcmuCodec);
727 parameters.codecs.push_back(kRedCodec);
728 parameters.codecs[0].id = 96;
729 parameters.codecs[0].bitrate = 48000;
730 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000731 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200732 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000733 webrtc::CodecInst gcodec;
734 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
735 EXPECT_EQ(96, gcodec.pltype);
736 EXPECT_EQ(48000, gcodec.rate);
737 EXPECT_STREQ("ISAC", gcodec.plname);
738 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000739 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000740 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
741 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
742 EXPECT_EQ(106, voe_.GetSendTelephoneEventPayloadType(channel_num));
743}
744
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000745// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
746// to apply.
747TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenberg1ac56142015-10-13 03:58:19 -0700748 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200749 cricket::AudioSendParameters parameters;
750 parameters.codecs.push_back(kIsacCodec);
751 parameters.codecs.push_back(kPcmuCodec);
752 parameters.codecs.push_back(kRedCodec);
753 parameters.codecs[0].id = 96;
754 parameters.codecs[0].bitrate = 48000;
755 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000756 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
757 // Calling SetSendCodec again with same codec which is already set.
758 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200759 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000760 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
761}
762
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000763// Verify that G722 is set with 16000 samples per second to WebRTC.
764TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenberg1ac56142015-10-13 03:58:19 -0700765 EXPECT_TRUE(SetupEngineWithSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000766 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200767 cricket::AudioSendParameters parameters;
768 parameters.codecs.push_back(kG722CodecSdp);
769 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000770 webrtc::CodecInst gcodec;
771 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
772 EXPECT_STREQ("G722", gcodec.plname);
773 EXPECT_EQ(1, gcodec.channels);
774 EXPECT_EQ(16000, gcodec.plfreq);
775}
776
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000777// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000778TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenberg1ac56142015-10-13 03:58:19 -0700779 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200780 cricket::AudioSendParameters parameters;
781 parameters.codecs.push_back(kOpusCodec);
782 parameters.codecs[0].bitrate = 0;
783 parameters.codecs[0].clockrate = 50000;
784 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000785}
786
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000787// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000788TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700789 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200790 cricket::AudioSendParameters parameters;
791 parameters.codecs.push_back(kOpusCodec);
792 parameters.codecs[0].bitrate = 0;
793 parameters.codecs[0].channels = 0;
794 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000795}
796
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000797// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000798TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700799 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200800 cricket::AudioSendParameters parameters;
801 parameters.codecs.push_back(kOpusCodec);
802 parameters.codecs[0].bitrate = 0;
803 parameters.codecs[0].channels = 0;
804 parameters.codecs[0].params["stereo"] = "1";
805 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000806}
807
808// Test that if channel is 1 for opus and there's no stereo, we fail.
809TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700810 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200811 cricket::AudioSendParameters parameters;
812 parameters.codecs.push_back(kOpusCodec);
813 parameters.codecs[0].bitrate = 0;
814 parameters.codecs[0].channels = 1;
815 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000816}
817
818// Test that if channel is 1 for opus and stereo=0, we fail.
819TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700820 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200821 cricket::AudioSendParameters parameters;
822 parameters.codecs.push_back(kOpusCodec);
823 parameters.codecs[0].bitrate = 0;
824 parameters.codecs[0].channels = 1;
825 parameters.codecs[0].params["stereo"] = "0";
826 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000827}
828
829// Test that if channel is 1 for opus and stereo=1, we fail.
830TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700831 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200832 cricket::AudioSendParameters parameters;
833 parameters.codecs.push_back(kOpusCodec);
834 parameters.codecs[0].bitrate = 0;
835 parameters.codecs[0].channels = 1;
836 parameters.codecs[0].params["stereo"] = "1";
837 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000838}
839
840// Test that with bitrate=0 and no stereo,
841// channels and bitrate are 1 and 32000.
842TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700843 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000844 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200845 cricket::AudioSendParameters parameters;
846 parameters.codecs.push_back(kOpusCodec);
847 parameters.codecs[0].bitrate = 0;
848 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000849 webrtc::CodecInst gcodec;
850 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
851 EXPECT_STREQ("opus", gcodec.plname);
852 EXPECT_EQ(1, gcodec.channels);
853 EXPECT_EQ(32000, gcodec.rate);
854}
855
856// Test that with bitrate=0 and stereo=0,
857// channels and bitrate are 1 and 32000.
858TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700859 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000860 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200861 cricket::AudioSendParameters parameters;
862 parameters.codecs.push_back(kOpusCodec);
863 parameters.codecs[0].bitrate = 0;
864 parameters.codecs[0].params["stereo"] = "0";
865 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000866 webrtc::CodecInst gcodec;
867 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
868 EXPECT_STREQ("opus", gcodec.plname);
869 EXPECT_EQ(1, gcodec.channels);
870 EXPECT_EQ(32000, gcodec.rate);
871}
872
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000873// Test that with bitrate=invalid and stereo=0,
874// channels and bitrate are 1 and 32000.
875TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700876 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000877 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200878 cricket::AudioSendParameters parameters;
879 parameters.codecs.push_back(kOpusCodec);
880 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000881 webrtc::CodecInst gcodec;
882
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000883 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200884 parameters.codecs[0].bitrate = 5999;
885 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000886 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
887 EXPECT_STREQ("opus", gcodec.plname);
888 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000889 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000890
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200891 parameters.codecs[0].bitrate = 510001;
892 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000893 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
894 EXPECT_STREQ("opus", gcodec.plname);
895 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000896 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000897}
898
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000899// Test that with bitrate=0 and stereo=1,
900// channels and bitrate are 2 and 64000.
901TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
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"] = "1";
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(2, gcodec.channels);
913 EXPECT_EQ(64000, gcodec.rate);
914}
915
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000916// Test that with bitrate=invalid and stereo=1,
917// channels and bitrate are 2 and 64000.
918TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
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"] = "1";
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(2, 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(2, 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=N and stereo unset,
943// channels and bitrate are 1 and N.
944TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
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 = 96000;
950 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000951 webrtc::CodecInst gcodec;
952 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
953 EXPECT_EQ(111, gcodec.pltype);
954 EXPECT_EQ(96000, gcodec.rate);
955 EXPECT_STREQ("opus", gcodec.plname);
956 EXPECT_EQ(1, gcodec.channels);
957 EXPECT_EQ(48000, gcodec.plfreq);
958}
959
960// Test that with bitrate=N and stereo=0,
961// channels and bitrate are 1 and N.
962TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700963 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000964 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200965 cricket::AudioSendParameters parameters;
966 parameters.codecs.push_back(kOpusCodec);
967 parameters.codecs[0].bitrate = 30000;
968 parameters.codecs[0].params["stereo"] = "0";
969 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000970 webrtc::CodecInst gcodec;
971 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
972 EXPECT_EQ(1, gcodec.channels);
973 EXPECT_EQ(30000, gcodec.rate);
974 EXPECT_STREQ("opus", gcodec.plname);
975}
976
977// Test that with bitrate=N and without any parameters,
978// channels and bitrate are 1 and N.
979TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenberg1ac56142015-10-13 03:58:19 -0700980 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000981 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200982 cricket::AudioSendParameters parameters;
983 parameters.codecs.push_back(kOpusCodec);
984 parameters.codecs[0].bitrate = 30000;
985 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000986 webrtc::CodecInst gcodec;
987 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
988 EXPECT_EQ(1, gcodec.channels);
989 EXPECT_EQ(30000, gcodec.rate);
990 EXPECT_STREQ("opus", gcodec.plname);
991}
992
993// Test that with bitrate=N and stereo=1,
994// channels and bitrate are 2 and N.
995TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700996 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000997 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200998 cricket::AudioSendParameters parameters;
999 parameters.codecs.push_back(kOpusCodec);
1000 parameters.codecs[0].bitrate = 30000;
1001 parameters.codecs[0].params["stereo"] = "1";
1002 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001003 webrtc::CodecInst gcodec;
1004 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1005 EXPECT_EQ(2, gcodec.channels);
1006 EXPECT_EQ(30000, gcodec.rate);
1007 EXPECT_STREQ("opus", gcodec.plname);
1008}
1009
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001010// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1011// Also test that the "maxaveragebitrate" can't be set to values outside the
1012// range of 6000 and 510000
1013TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001014 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001015 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001016 cricket::AudioSendParameters parameters;
1017 parameters.codecs.push_back(kOpusCodec);
1018 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001019 webrtc::CodecInst gcodec;
1020
1021 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001022 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1023 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001024 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001025 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001026
1027 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001028 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1029 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001030 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001031 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001032
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001033 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1034 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001035 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1036 EXPECT_EQ(200000, gcodec.rate);
1037}
1038
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001039// Test that we can enable NACK with opus as caller.
1040TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001041 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001042 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001043 cricket::AudioSendParameters parameters;
1044 parameters.codecs.push_back(kOpusCodec);
1045 parameters.codecs[0].AddFeedbackParam(
1046 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1047 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001048 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001049 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001050 EXPECT_TRUE(voe_.GetNACK(channel_num));
1051}
1052
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001053// Test that we can enable NACK with opus as callee.
1054TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenberg0a617e22015-10-20 15:49:38 -07001055 EXPECT_TRUE(SetupEngineWithRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001056 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001057 cricket::AudioSendParameters parameters;
1058 parameters.codecs.push_back(kOpusCodec);
1059 parameters.codecs[0].AddFeedbackParam(
1060 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1061 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001062 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001063 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001064 EXPECT_FALSE(voe_.GetNACK(channel_num));
1065
1066 EXPECT_TRUE(channel_->AddSendStream(
1067 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001068 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001069}
1070
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001071// Test that we can enable NACK on receive streams.
1072TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001073 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001074 int channel_num1 = voe_.GetLastChannel();
1075 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1076 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001077 cricket::AudioSendParameters parameters;
1078 parameters.codecs.push_back(kOpusCodec);
1079 parameters.codecs[0].AddFeedbackParam(
1080 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1081 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001082 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1083 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001084 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001085 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1086 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1087}
1088
1089// Test that we can disable NACK.
1090TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001091 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001092 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001093 cricket::AudioSendParameters parameters;
1094 parameters.codecs.push_back(kOpusCodec);
1095 parameters.codecs[0].AddFeedbackParam(
1096 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1097 cricket::kParamValueEmpty));
1098 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001099 EXPECT_TRUE(voe_.GetNACK(channel_num));
1100
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001101 parameters.codecs.clear();
1102 parameters.codecs.push_back(kOpusCodec);
1103 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001104 EXPECT_FALSE(voe_.GetNACK(channel_num));
1105}
1106
1107// Test that we can disable NACK on receive streams.
1108TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001109 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001110 int channel_num1 = voe_.GetLastChannel();
1111 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1112 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001113 cricket::AudioSendParameters parameters;
1114 parameters.codecs.push_back(kOpusCodec);
1115 parameters.codecs[0].AddFeedbackParam(
1116 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1117 cricket::kParamValueEmpty));
1118 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001119 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1120 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1121
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001122 parameters.codecs.clear();
1123 parameters.codecs.push_back(kOpusCodec);
1124 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001125 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1126 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1127}
1128
1129// Test that NACK is enabled on a new receive stream.
1130TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001131 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001132 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001133 cricket::AudioSendParameters parameters;
1134 parameters.codecs.push_back(kIsacCodec);
1135 parameters.codecs.push_back(kCn16000Codec);
1136 parameters.codecs[0].AddFeedbackParam(
1137 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1138 cricket::kParamValueEmpty));
1139 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001140 EXPECT_TRUE(voe_.GetNACK(channel_num));
1141
1142 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1143 channel_num = voe_.GetLastChannel();
1144 EXPECT_TRUE(voe_.GetNACK(channel_num));
1145 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1146 channel_num = voe_.GetLastChannel();
1147 EXPECT_TRUE(voe_.GetNACK(channel_num));
1148}
1149
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001150// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001151TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenberg1ac56142015-10-13 03:58:19 -07001152 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001153 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001154 cricket::AudioSendParameters parameters;
1155 parameters.codecs.push_back(kOpusCodec);
1156 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001157 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1158}
1159
1160// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001161TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001162 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001163 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001164 cricket::AudioSendParameters parameters;
1165 parameters.codecs.push_back(kOpusCodec);
1166 parameters.codecs[0].bitrate = 0;
1167 parameters.codecs[0].params["useinbandfec"] = "0";
1168 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001169 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1170 webrtc::CodecInst gcodec;
1171 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1172 EXPECT_STREQ("opus", gcodec.plname);
1173 EXPECT_EQ(1, gcodec.channels);
1174 EXPECT_EQ(32000, gcodec.rate);
1175}
1176
1177// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001178TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001179 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001180 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001181 cricket::AudioSendParameters parameters;
1182 parameters.codecs.push_back(kOpusCodec);
1183 parameters.codecs[0].bitrate = 0;
1184 parameters.codecs[0].params["useinbandfec"] = "1";
1185 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001186 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1187 webrtc::CodecInst gcodec;
1188 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1189 EXPECT_STREQ("opus", gcodec.plname);
1190 EXPECT_EQ(1, gcodec.channels);
1191 EXPECT_EQ(32000, gcodec.rate);
1192}
1193
1194// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001195TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001196 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001197 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001198 cricket::AudioSendParameters parameters;
1199 parameters.codecs.push_back(kOpusCodec);
1200 parameters.codecs[0].bitrate = 0;
1201 parameters.codecs[0].params["stereo"] = "1";
1202 parameters.codecs[0].params["useinbandfec"] = "1";
1203 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001204 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1205 webrtc::CodecInst gcodec;
1206 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1207 EXPECT_STREQ("opus", gcodec.plname);
1208 EXPECT_EQ(2, gcodec.channels);
1209 EXPECT_EQ(64000, gcodec.rate);
1210}
1211
1212// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001213TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001214 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001215 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001216 cricket::AudioSendParameters parameters;
1217 parameters.codecs.push_back(kIsacCodec);
1218 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001219 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1220}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001221
1222// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1223TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001224 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001225 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001226 cricket::AudioSendParameters parameters;
1227 parameters.codecs.push_back(kIsacCodec);
1228 parameters.codecs[0].params["useinbandfec"] = "1";
1229 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001230 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1231}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001232
1233// Test that Opus FEC status can be changed.
1234TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenberg1ac56142015-10-13 03:58:19 -07001235 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001236 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001237 cricket::AudioSendParameters parameters;
1238 parameters.codecs.push_back(kOpusCodec);
1239 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001240 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001241 parameters.codecs[0].params["useinbandfec"] = "1";
1242 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001243 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1244}
1245
1246// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1247TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenberg1ac56142015-10-13 03:58:19 -07001248 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001249 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001250 cricket::AudioSendParameters parameters;
1251 parameters.codecs.push_back(kOpusCodec);
1252 parameters.codecs[0].bitrate = 0;
1253 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1254 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001255 EXPECT_EQ(cricket::kOpusBandwidthNb,
1256 voe_.GetMaxEncodingBandwidth(channel_num));
1257 webrtc::CodecInst gcodec;
1258 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1259 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001260
1261 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001262 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1263 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001264 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1265 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001266}
1267
1268// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1269TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenberg1ac56142015-10-13 03:58:19 -07001270 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001271 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001272 cricket::AudioSendParameters parameters;
1273 parameters.codecs.push_back(kOpusCodec);
1274 parameters.codecs[0].bitrate = 0;
1275 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1276 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001277 EXPECT_EQ(cricket::kOpusBandwidthMb,
1278 voe_.GetMaxEncodingBandwidth(channel_num));
1279 webrtc::CodecInst gcodec;
1280 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1281 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001282
1283 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001284 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1285 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001286 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1287 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001288}
1289
1290// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1291TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenberg1ac56142015-10-13 03:58:19 -07001292 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001293 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001294 cricket::AudioSendParameters parameters;
1295 parameters.codecs.push_back(kOpusCodec);
1296 parameters.codecs[0].bitrate = 0;
1297 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1298 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001299 EXPECT_EQ(cricket::kOpusBandwidthWb,
1300 voe_.GetMaxEncodingBandwidth(channel_num));
1301 webrtc::CodecInst gcodec;
1302 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1303 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001304
1305 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001306 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1307 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001308 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1309 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001310}
1311
1312// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1313TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenberg1ac56142015-10-13 03:58:19 -07001314 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001315 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001316 cricket::AudioSendParameters parameters;
1317 parameters.codecs.push_back(kOpusCodec);
1318 parameters.codecs[0].bitrate = 0;
1319 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1320 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001321 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1322 voe_.GetMaxEncodingBandwidth(channel_num));
1323 webrtc::CodecInst gcodec;
1324 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1325 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001326
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001327 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001328 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1329 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001330 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1331 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001332}
1333
1334// Test 24000 < maxplaybackrate triggers Opus full band mode.
1335TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenberg1ac56142015-10-13 03:58:19 -07001336 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001337 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001338 cricket::AudioSendParameters parameters;
1339 parameters.codecs.push_back(kOpusCodec);
1340 parameters.codecs[0].bitrate = 0;
1341 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1342 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001343 EXPECT_EQ(cricket::kOpusBandwidthFb,
1344 voe_.GetMaxEncodingBandwidth(channel_num));
1345 webrtc::CodecInst gcodec;
1346 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1347 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001348
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001349 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001350 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1351 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001352 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1353 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001354}
1355
1356// Test Opus that without maxplaybackrate, default playback rate is used.
1357TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001358 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001359 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001360 cricket::AudioSendParameters parameters;
1361 parameters.codecs.push_back(kOpusCodec);
1362 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001363 EXPECT_EQ(cricket::kOpusBandwidthFb,
1364 voe_.GetMaxEncodingBandwidth(channel_num));
1365}
1366
1367// Test the with non-Opus, maxplaybackrate has no effect.
1368TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001369 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001370 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001371 cricket::AudioSendParameters parameters;
1372 parameters.codecs.push_back(kIsacCodec);
1373 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1374 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001375 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1376}
1377
1378// Test maxplaybackrate can be set on two streams.
1379TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001380 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001381 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001382 cricket::AudioSendParameters parameters;
1383 parameters.codecs.push_back(kOpusCodec);
1384 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001385 // Default bandwidth is 24000.
1386 EXPECT_EQ(cricket::kOpusBandwidthFb,
1387 voe_.GetMaxEncodingBandwidth(channel_num));
1388
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001389 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001390
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001391 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001392 EXPECT_EQ(cricket::kOpusBandwidthNb,
1393 voe_.GetMaxEncodingBandwidth(channel_num));
1394
1395 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1396 channel_num = voe_.GetLastChannel();
1397 EXPECT_EQ(cricket::kOpusBandwidthNb,
1398 voe_.GetMaxEncodingBandwidth(channel_num));
1399}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001400
Minyue Li7100dcd2015-03-27 05:05:59 +01001401// Test that with usedtx=0, Opus DTX is off.
1402TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001403 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001404 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001405 cricket::AudioSendParameters parameters;
1406 parameters.codecs.push_back(kOpusCodec);
1407 parameters.codecs[0].params["usedtx"] = "0";
1408 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001409 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1410}
1411
1412// Test that with usedtx=1, Opus DTX is on.
1413TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001414 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001415 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001416 cricket::AudioSendParameters parameters;
1417 parameters.codecs.push_back(kOpusCodec);
1418 parameters.codecs[0].params["usedtx"] = "1";
1419 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001420 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1421 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1422}
1423
1424// Test that usedtx=1 works with stereo Opus.
1425TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001426 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001427 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001428 cricket::AudioSendParameters parameters;
1429 parameters.codecs.push_back(kOpusCodec);
1430 parameters.codecs[0].params["usedtx"] = "1";
1431 parameters.codecs[0].params["stereo"] = "1";
1432 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001433 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1434 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1435}
1436
1437// Test that usedtx=1 does not work with non Opus.
1438TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001439 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001440 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001441 cricket::AudioSendParameters parameters;
1442 parameters.codecs.push_back(kIsacCodec);
1443 parameters.codecs[0].params["usedtx"] = "1";
1444 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001445 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1446}
1447
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001448// Test that we can switch back and forth between Opus and ISAC with CN.
1449TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenberg1ac56142015-10-13 03:58:19 -07001450 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001451 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001452 cricket::AudioSendParameters opus_parameters;
1453 opus_parameters.codecs.push_back(kOpusCodec);
1454 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001455 webrtc::CodecInst gcodec;
1456 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001457 EXPECT_EQ(111, gcodec.pltype);
1458 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001459
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001460 cricket::AudioSendParameters isac_parameters;
1461 isac_parameters.codecs.push_back(kIsacCodec);
1462 isac_parameters.codecs.push_back(kCn16000Codec);
1463 isac_parameters.codecs.push_back(kOpusCodec);
1464 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001465 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1466 EXPECT_EQ(103, gcodec.pltype);
1467 EXPECT_STREQ("ISAC", gcodec.plname);
1468
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001469 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001470 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001471 EXPECT_EQ(111, gcodec.pltype);
1472 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001473}
1474
1475// Test that we handle various ways of specifying bitrate.
1476TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001477 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001478 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001479 cricket::AudioSendParameters parameters;
1480 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1481 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001482 webrtc::CodecInst gcodec;
1483 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1484 EXPECT_EQ(103, gcodec.pltype);
1485 EXPECT_STREQ("ISAC", gcodec.plname);
1486 EXPECT_EQ(32000, gcodec.rate);
1487
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001488 parameters.codecs[0].bitrate = 0; // bitrate == default
1489 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001490 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1491 EXPECT_EQ(103, gcodec.pltype);
1492 EXPECT_STREQ("ISAC", gcodec.plname);
1493 EXPECT_EQ(-1, gcodec.rate);
1494
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001495 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1496 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001497 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1498 EXPECT_EQ(103, gcodec.pltype);
1499 EXPECT_STREQ("ISAC", gcodec.plname);
1500 EXPECT_EQ(28000, gcodec.rate);
1501
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001502 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1503 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001504 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1505 EXPECT_EQ(0, gcodec.pltype);
1506 EXPECT_STREQ("PCMU", gcodec.plname);
1507 EXPECT_EQ(64000, gcodec.rate);
1508
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001509 parameters.codecs[0].bitrate = 0; // bitrate == default
1510 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001511 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1512 EXPECT_EQ(0, gcodec.pltype);
1513 EXPECT_STREQ("PCMU", gcodec.plname);
1514 EXPECT_EQ(64000, gcodec.rate);
1515
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001516 parameters.codecs[0] = kOpusCodec;
1517 parameters.codecs[0].bitrate = 0; // bitrate == default
1518 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001519 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1520 EXPECT_EQ(111, gcodec.pltype);
1521 EXPECT_STREQ("opus", gcodec.plname);
1522 EXPECT_EQ(32000, gcodec.rate);
1523}
1524
Brave Yao5225dd82015-03-26 07:39:19 +08001525// Test that we could set packet size specified in kCodecParamPTime.
1526TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenberg1ac56142015-10-13 03:58:19 -07001527 EXPECT_TRUE(SetupEngineWithSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001528 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001529 cricket::AudioSendParameters parameters;
1530 parameters.codecs.push_back(kOpusCodec);
1531 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1532 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001533 webrtc::CodecInst gcodec;
1534 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1535 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1536
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001537 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1538 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001539 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1540 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1541
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001542 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1543 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001544 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1545 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1546
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001547 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1548 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1549 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001550 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1551 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1552
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001553 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1554 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1555 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001556 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1557 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1558}
1559
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001560// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001561TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenberg1ac56142015-10-13 03:58:19 -07001562 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001563 cricket::AudioSendParameters parameters;
1564 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001565}
1566
1567// Test that we can set send codecs even with telephone-event codec as the first
1568// one on the list.
1569TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001570 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001571 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001572 cricket::AudioSendParameters parameters;
1573 parameters.codecs.push_back(kTelephoneEventCodec);
1574 parameters.codecs.push_back(kIsacCodec);
1575 parameters.codecs.push_back(kPcmuCodec);
1576 parameters.codecs[0].id = 98; // DTMF
1577 parameters.codecs[1].id = 96;
1578 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001579 webrtc::CodecInst gcodec;
1580 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001581 EXPECT_EQ(96, gcodec.pltype);
1582 EXPECT_STREQ("ISAC", gcodec.plname);
1583 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1584}
1585
1586// Test that we can set send codecs even with CN codec as the first
1587// one on the list.
1588TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001589 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001590 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001591 cricket::AudioSendParameters parameters;
1592 parameters.codecs.push_back(kCn16000Codec);
1593 parameters.codecs.push_back(kIsacCodec);
1594 parameters.codecs.push_back(kPcmuCodec);
1595 parameters.codecs[0].id = 98; // wideband CN
1596 parameters.codecs[1].id = 96;
1597 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001598 webrtc::CodecInst gcodec;
1599 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1600 EXPECT_EQ(96, gcodec.pltype);
1601 EXPECT_STREQ("ISAC", gcodec.plname);
1602 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001603}
1604
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001605// Test that we set VAD and DTMF types correctly as caller.
1606TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001607 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001608 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001609 cricket::AudioSendParameters parameters;
1610 parameters.codecs.push_back(kIsacCodec);
1611 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001612 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001613 parameters.codecs.push_back(kCn16000Codec);
1614 parameters.codecs.push_back(kCn8000Codec);
1615 parameters.codecs.push_back(kTelephoneEventCodec);
1616 parameters.codecs.push_back(kRedCodec);
1617 parameters.codecs[0].id = 96;
1618 parameters.codecs[2].id = 97; // wideband CN
1619 parameters.codecs[4].id = 98; // DTMF
1620 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001621 webrtc::CodecInst gcodec;
1622 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1623 EXPECT_EQ(96, gcodec.pltype);
1624 EXPECT_STREQ("ISAC", gcodec.plname);
1625 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001626 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001627 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1628 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1629 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1630}
1631
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001632// Test that we set VAD and DTMF types correctly as callee.
1633TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001634 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001635 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001636 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001637
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001638 cricket::AudioSendParameters parameters;
1639 parameters.codecs.push_back(kIsacCodec);
1640 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001641 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001642 parameters.codecs.push_back(kCn16000Codec);
1643 parameters.codecs.push_back(kCn8000Codec);
1644 parameters.codecs.push_back(kTelephoneEventCodec);
1645 parameters.codecs.push_back(kRedCodec);
1646 parameters.codecs[0].id = 96;
1647 parameters.codecs[2].id = 97; // wideband CN
1648 parameters.codecs[4].id = 98; // DTMF
1649 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001650 EXPECT_TRUE(channel_->AddSendStream(
1651 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001652 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001653
1654 webrtc::CodecInst gcodec;
1655 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1656 EXPECT_EQ(96, gcodec.pltype);
1657 EXPECT_STREQ("ISAC", gcodec.plname);
1658 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001659 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001660 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1661 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1662 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1663}
1664
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001665// Test that we only apply VAD if we have a CN codec that matches the
1666// send codec clockrate.
1667TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenberg1ac56142015-10-13 03:58:19 -07001668 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001669 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001670 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001671 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001672 parameters.codecs.push_back(kIsacCodec);
1673 parameters.codecs.push_back(kCn16000Codec);
1674 parameters.codecs[1].id = 97;
1675 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001676 webrtc::CodecInst gcodec;
1677 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1678 EXPECT_STREQ("ISAC", gcodec.plname);
1679 EXPECT_TRUE(voe_.GetVAD(channel_num));
1680 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1681 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001682 parameters.codecs[0] = kPcmuCodec;
1683 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001684 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1685 EXPECT_STREQ("PCMU", gcodec.plname);
1686 EXPECT_FALSE(voe_.GetVAD(channel_num));
1687 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001688 parameters.codecs[1] = kCn8000Codec;
1689 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001690 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1691 EXPECT_STREQ("PCMU", gcodec.plname);
1692 EXPECT_TRUE(voe_.GetVAD(channel_num));
1693 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001694 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001695 parameters.codecs[0] = kIsacCodec;
1696 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001697 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1698 EXPECT_STREQ("ISAC", gcodec.plname);
1699 EXPECT_FALSE(voe_.GetVAD(channel_num));
1700}
1701
1702// Test that we perform case-insensitive matching of codec names.
1703TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenberg1ac56142015-10-13 03:58:19 -07001704 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001705 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001706 cricket::AudioSendParameters parameters;
1707 parameters.codecs.push_back(kIsacCodec);
1708 parameters.codecs.push_back(kPcmuCodec);
1709 parameters.codecs.push_back(kCn16000Codec);
1710 parameters.codecs.push_back(kCn8000Codec);
1711 parameters.codecs.push_back(kTelephoneEventCodec);
1712 parameters.codecs.push_back(kRedCodec);
1713 parameters.codecs[0].name = "iSaC";
1714 parameters.codecs[0].id = 96;
1715 parameters.codecs[2].id = 97; // wideband CN
1716 parameters.codecs[4].id = 98; // DTMF
1717 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001718 webrtc::CodecInst gcodec;
1719 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1720 EXPECT_EQ(96, gcodec.pltype);
1721 EXPECT_STREQ("ISAC", gcodec.plname);
1722 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001723 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001724 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1725 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1726 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1727}
1728
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001729// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001730TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001731 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001732 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001733 cricket::AudioSendParameters parameters;
1734 parameters.codecs.push_back(kRedCodec);
1735 parameters.codecs.push_back(kIsacCodec);
1736 parameters.codecs.push_back(kPcmuCodec);
1737 parameters.codecs[0].id = 127;
1738 parameters.codecs[0].params[""] = "96/96";
1739 parameters.codecs[1].id = 96;
1740 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001741 webrtc::CodecInst gcodec;
1742 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1743 EXPECT_EQ(96, gcodec.pltype);
1744 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001745 EXPECT_TRUE(voe_.GetRED(channel_num));
1746 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001747}
1748
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001749// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001750TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001751 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001752 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001753 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001754
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001755 cricket::AudioSendParameters parameters;
1756 parameters.codecs.push_back(kRedCodec);
1757 parameters.codecs.push_back(kIsacCodec);
1758 parameters.codecs.push_back(kPcmuCodec);
1759 parameters.codecs[0].id = 127;
1760 parameters.codecs[0].params[""] = "96/96";
1761 parameters.codecs[1].id = 96;
1762 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001763 EXPECT_TRUE(channel_->AddSendStream(
1764 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001765 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001766 webrtc::CodecInst gcodec;
1767 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1768 EXPECT_EQ(96, gcodec.pltype);
1769 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001770 EXPECT_TRUE(voe_.GetRED(channel_num));
1771 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001772}
1773
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001774// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001775TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenberg1ac56142015-10-13 03:58:19 -07001776 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001777 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001778 cricket::AudioSendParameters parameters;
1779 parameters.codecs.push_back(kRedCodec);
1780 parameters.codecs.push_back(kIsacCodec);
1781 parameters.codecs.push_back(kPcmuCodec);
1782 parameters.codecs[0].id = 127;
1783 parameters.codecs[1].id = 96;
1784 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001785 webrtc::CodecInst gcodec;
1786 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1787 EXPECT_EQ(96, gcodec.pltype);
1788 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001789 EXPECT_TRUE(voe_.GetRED(channel_num));
1790 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001791}
1792
1793// Test that we ignore RED if the parameters aren't named the way we expect.
1794TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001795 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001796 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001797 cricket::AudioSendParameters parameters;
1798 parameters.codecs.push_back(kRedCodec);
1799 parameters.codecs.push_back(kIsacCodec);
1800 parameters.codecs.push_back(kPcmuCodec);
1801 parameters.codecs[0].id = 127;
1802 parameters.codecs[0].params["ABC"] = "96/96";
1803 parameters.codecs[1].id = 96;
1804 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001805 webrtc::CodecInst gcodec;
1806 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1807 EXPECT_EQ(96, gcodec.pltype);
1808 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001809 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001810}
1811
1812// Test that we ignore RED if it uses different primary/secondary encoding.
1813TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001814 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001815 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001816 cricket::AudioSendParameters parameters;
1817 parameters.codecs.push_back(kRedCodec);
1818 parameters.codecs.push_back(kIsacCodec);
1819 parameters.codecs.push_back(kPcmuCodec);
1820 parameters.codecs[0].id = 127;
1821 parameters.codecs[0].params[""] = "96/0";
1822 parameters.codecs[1].id = 96;
1823 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001824 webrtc::CodecInst gcodec;
1825 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1826 EXPECT_EQ(96, gcodec.pltype);
1827 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001828 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001829}
1830
1831// Test that we ignore RED if it uses more than 2 encodings.
1832TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001833 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001834 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001835 cricket::AudioSendParameters parameters;
1836 parameters.codecs.push_back(kRedCodec);
1837 parameters.codecs.push_back(kIsacCodec);
1838 parameters.codecs.push_back(kPcmuCodec);
1839 parameters.codecs[0].id = 127;
1840 parameters.codecs[0].params[""] = "96/96/96";
1841 parameters.codecs[1].id = 96;
1842 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001843 webrtc::CodecInst gcodec;
1844 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1845 EXPECT_EQ(96, gcodec.pltype);
1846 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001847 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001848}
1849
1850// Test that we ignore RED if it has bogus codec ids.
1851TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001852 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001853 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001854 cricket::AudioSendParameters parameters;
1855 parameters.codecs.push_back(kRedCodec);
1856 parameters.codecs.push_back(kIsacCodec);
1857 parameters.codecs.push_back(kPcmuCodec);
1858 parameters.codecs[0].id = 127;
1859 parameters.codecs[0].params[""] = "ABC/ABC";
1860 parameters.codecs[1].id = 96;
1861 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001862 webrtc::CodecInst gcodec;
1863 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1864 EXPECT_EQ(96, gcodec.pltype);
1865 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001866 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001867}
1868
1869// Test that we ignore RED if it refers to a codec that is not present.
1870TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001871 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001872 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001873 cricket::AudioSendParameters parameters;
1874 parameters.codecs.push_back(kRedCodec);
1875 parameters.codecs.push_back(kIsacCodec);
1876 parameters.codecs.push_back(kPcmuCodec);
1877 parameters.codecs[0].id = 127;
1878 parameters.codecs[0].params[""] = "97/97";
1879 parameters.codecs[1].id = 96;
1880 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001881 webrtc::CodecInst gcodec;
1882 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1883 EXPECT_EQ(96, gcodec.pltype);
1884 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001885 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001886}
1887
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001888// Test support for audio level header extension.
1889TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1890 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001891}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001892TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1893 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1894}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001895
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001896// Test support for absolute send time header extension.
1897TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1898 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1899}
1900TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1901 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001902}
1903
solenberg1ac56142015-10-13 03:58:19 -07001904// Test that we can create a channel and start sending on it.
1905TEST_F(WebRtcVoiceEngineTestFake, Send) {
1906 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001907 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001908 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001909 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1910 EXPECT_TRUE(voe_.GetSend(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001911 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1912 EXPECT_FALSE(voe_.GetSend(channel_num));
solenberg1ac56142015-10-13 03:58:19 -07001913}
1914
1915// Test that we can create a channel and start playing out on it.
1916TEST_F(WebRtcVoiceEngineTestFake, Playout) {
1917 EXPECT_TRUE(SetupEngineWithRecvStream());
1918 int channel_num = voe_.GetLastChannel();
1919 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
1920 EXPECT_TRUE(channel_->SetPlayout(true));
1921 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001922 EXPECT_TRUE(channel_->SetPlayout(false));
1923 EXPECT_FALSE(voe_.GetPlayout(channel_num));
1924}
1925
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001926// Test that we can add and remove send streams.
1927TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
1928 SetupForMultiSendStream();
1929
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001930 // Set the global state for sending.
1931 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1932
solenbergc96df772015-10-21 13:01:53 -07001933 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001934 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07001935 cricket::StreamParams::CreateLegacy(ssrc)));
1936 EXPECT_NE(nullptr, call_.GetAudioSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001937
1938 // Verify that we are in a sending state for all the created streams.
solenbergc96df772015-10-21 13:01:53 -07001939 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001940 EXPECT_TRUE(voe_.GetSend(channel_num));
1941 }
solenbergc96df772015-10-21 13:01:53 -07001942 EXPECT_EQ(ARRAY_SIZE(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001943
solenbergc96df772015-10-21 13:01:53 -07001944 // Delete the send streams.
1945 for (uint32_t ssrc : kSsrcs4) {
1946 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
1947 EXPECT_EQ(nullptr, call_.GetAudioSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001948 // Stream should already be deleted.
solenbergc96df772015-10-21 13:01:53 -07001949 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
1950 EXPECT_EQ(-1, voe_.GetChannelFromLocalSsrc(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001951 }
solenbergc96df772015-10-21 13:01:53 -07001952 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001953}
1954
1955// Test SetSendCodecs correctly configure the codecs in all send streams.
1956TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
1957 SetupForMultiSendStream();
1958
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001959 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07001960 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001961 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07001962 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001963 }
1964
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001965 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001966 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001967 parameters.codecs.push_back(kIsacCodec);
1968 parameters.codecs.push_back(kCn16000Codec);
1969 parameters.codecs[1].id = 97;
1970 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001971
1972 // Verify ISAC and VAD are corrected configured on all send channels.
1973 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07001974 for (uint32_t ssrc : kSsrcs4) {
1975 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001976 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1977 EXPECT_STREQ("ISAC", gcodec.plname);
1978 EXPECT_TRUE(voe_.GetVAD(channel_num));
1979 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1980 }
1981
1982 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001983 parameters.codecs[0] = kPcmuCodec;
1984 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07001985 for (uint32_t ssrc : kSsrcs4) {
1986 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001987 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1988 EXPECT_STREQ("PCMU", gcodec.plname);
1989 EXPECT_FALSE(voe_.GetVAD(channel_num));
1990 }
1991}
1992
1993// Test we can SetSend on all send streams correctly.
1994TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
1995 SetupForMultiSendStream();
1996
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001997 // Create the send channels and they should be a SEND_NOTHING date.
solenbergc96df772015-10-21 13:01:53 -07001998 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001999 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002000 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002001 int channel_num = voe_.GetLastChannel();
2002 EXPECT_FALSE(voe_.GetSend(channel_num));
2003 }
2004
2005 // Set the global state for starting sending.
2006 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
solenbergc96df772015-10-21 13:01:53 -07002007 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002008 // Verify that we are in a sending state for all the send streams.
solenbergc96df772015-10-21 13:01:53 -07002009 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002010 EXPECT_TRUE(voe_.GetSend(channel_num));
2011 }
2012
2013 // Set the global state for stopping sending.
2014 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
solenbergc96df772015-10-21 13:01:53 -07002015 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002016 // Verify that we are in a stop state for all the send streams.
solenbergc96df772015-10-21 13:01:53 -07002017 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002018 EXPECT_FALSE(voe_.GetSend(channel_num));
2019 }
2020}
2021
2022// Test we can set the correct statistics on all send streams.
2023TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2024 SetupForMultiSendStream();
2025
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002026 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002027 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002028 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002029 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002030 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002031 // Create a receive stream to check that none of the send streams end up in
2032 // the receive stream stats.
2033 EXPECT_TRUE(channel_->AddRecvStream(
2034 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002035 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002036 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2037 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002038
2039 cricket::VoiceMediaInfo info;
2040 EXPECT_EQ(true, channel_->GetStats(&info));
2041 EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size());
2042
2043 // Verify the statistic information is correct.
solenbergc96df772015-10-21 13:01:53 -07002044 // TODO(solenberg): Make this loop ordering independent.
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002045 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +00002046 EXPECT_EQ(kSsrcs4[i], info.senders[i].ssrc());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002047 EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
2048 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].bytes_sent);
2049 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_sent);
2050 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_lost);
2051 EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[i].fraction_lost);
2052 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].ext_seqnum);
2053 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].rtt_ms);
2054 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].jitter_ms);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002055 EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002056 }
solenberg1ac56142015-10-13 03:58:19 -07002057
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002058 // We have added one receive stream. We should see empty stats.
2059 EXPECT_EQ(info.receivers.size(), 1u);
2060 EXPECT_EQ(info.receivers[0].local_stats.front().ssrc, 0);
2061
2062 // Remove the kSsrc2 stream. No receiver stats.
2063 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002064 EXPECT_EQ(true, channel_->GetStats(&info));
solenberg1ac56142015-10-13 03:58:19 -07002065 EXPECT_EQ(0u, info.receivers.size());
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002066
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002067 // Deliver a new packet - a default receive stream should be created and we
2068 // should see stats again.
solenberg1ac56142015-10-13 03:58:19 -07002069 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002070 SetAudioReceiveStreamStats();
solenberg1ac56142015-10-13 03:58:19 -07002071 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002072 EXPECT_EQ(1u, info.receivers.size());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002073 VerifyVoiceReceiverInfo(info.receivers[0]);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002074}
2075
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002076// Test that we can add and remove receive streams, and do proper send/playout.
2077// We can receive on multiple streams while sending one stream.
2078TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002079 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002080 int channel_num1 = voe_.GetLastChannel();
2081
solenberg1ac56142015-10-13 03:58:19 -07002082 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002083 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002084 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002085 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002086
solenberg1ac56142015-10-13 03:58:19 -07002087 // Adding another stream should enable playout on the new stream only.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002088 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2089 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002090 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2091 EXPECT_TRUE(voe_.GetSend(channel_num1));
2092 EXPECT_FALSE(voe_.GetSend(channel_num2));
2093
solenberg1ac56142015-10-13 03:58:19 -07002094 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002095 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2096 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2097
2098 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2099 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2100 int channel_num3 = voe_.GetLastChannel();
2101 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2102 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2103 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2104 EXPECT_FALSE(voe_.GetSend(channel_num3));
2105
2106 // Stop sending.
2107 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2108 EXPECT_FALSE(voe_.GetSend(channel_num1));
2109 EXPECT_FALSE(voe_.GetSend(channel_num2));
2110 EXPECT_FALSE(voe_.GetSend(channel_num3));
2111
2112 // Stop playout.
2113 EXPECT_TRUE(channel_->SetPlayout(false));
2114 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2115 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2116 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2117
solenberg1ac56142015-10-13 03:58:19 -07002118 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002119 EXPECT_TRUE(channel_->SetPlayout(true));
2120 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2121 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2122 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2123
solenberg1ac56142015-10-13 03:58:19 -07002124 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002125 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2126 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002127 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002128}
2129
2130// Test that we can set the devices to use.
2131TEST_F(WebRtcVoiceEngineTestFake, SetDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002132 EXPECT_TRUE(SetupEngineWithSendStream());
2133 int send_channel = voe_.GetLastChannel();
2134 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2135 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002136 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002137
2138 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2139 cricket::kFakeDefaultDeviceId);
2140 cricket::Device dev(cricket::kFakeDeviceName,
2141 cricket::kFakeDeviceId);
2142
2143 // Test SetDevices() while not sending or playing.
2144 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2145
2146 // Test SetDevices() while sending and playing.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002147 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2148 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002149 EXPECT_TRUE(voe_.GetSend(send_channel));
2150 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002151
2152 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2153
solenberg1ac56142015-10-13 03:58:19 -07002154 EXPECT_TRUE(voe_.GetSend(send_channel));
2155 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002156
2157 // Test that failure to open newly selected devices does not prevent opening
2158 // ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002159 voe_.set_playout_fail_channel(recv_channel);
2160 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002161
2162 EXPECT_FALSE(engine_.SetDevices(&default_dev, &default_dev));
2163
solenberg1ac56142015-10-13 03:58:19 -07002164 EXPECT_FALSE(voe_.GetSend(send_channel));
2165 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002166
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002167 voe_.set_playout_fail_channel(-1);
2168 voe_.set_send_fail_channel(-1);
2169
2170 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2171
solenberg1ac56142015-10-13 03:58:19 -07002172 EXPECT_TRUE(voe_.GetSend(send_channel));
2173 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002174}
2175
2176// Test that we can set the devices to use even if we failed to
2177// open the initial ones.
2178TEST_F(WebRtcVoiceEngineTestFake, SetDevicesWithInitiallyBadDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002179 EXPECT_TRUE(SetupEngineWithSendStream());
2180 int send_channel = voe_.GetLastChannel();
2181 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2182 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002183 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002184
2185 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2186 cricket::kFakeDefaultDeviceId);
2187 cricket::Device dev(cricket::kFakeDeviceName,
2188 cricket::kFakeDeviceId);
2189
2190 // Test that failure to open devices selected before starting
2191 // send/play does not prevent opening newly selected ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002192 voe_.set_playout_fail_channel(recv_channel);
2193 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002194
2195 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2196
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002197 EXPECT_FALSE(channel_->SetSend(cricket::SEND_MICROPHONE));
2198 EXPECT_FALSE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002199 EXPECT_FALSE(voe_.GetSend(send_channel));
2200 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002201
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002202 voe_.set_playout_fail_channel(-1);
2203 voe_.set_send_fail_channel(-1);
2204
2205 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2206
solenberg1ac56142015-10-13 03:58:19 -07002207 EXPECT_TRUE(voe_.GetSend(send_channel));
2208 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002209}
2210
2211// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002212// and start sending on it.
2213TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2214 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002215 int channel_num = voe_.GetLastChannel();
2216 webrtc::AgcConfig agc_config;
2217 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2218 EXPECT_EQ(0, agc_config.targetLeveldBOv);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002219 send_parameters_.options = options_adjust_agc_;
2220 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002221 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2222 EXPECT_TRUE(voe_.GetSend(channel_num));
2223 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2224 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002225 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2226 EXPECT_FALSE(voe_.GetSend(channel_num));
2227 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2228 EXPECT_EQ(0, agc_config.targetLeveldBOv); // level was restored
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002229}
2230
wu@webrtc.org97077a32013-10-25 21:18:33 +00002231TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002232 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002233 webrtc::AgcConfig agc_config;
2234 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2235 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2236
2237 cricket::AudioOptions options;
2238 options.tx_agc_target_dbov.Set(3);
2239 options.tx_agc_digital_compression_gain.Set(9);
2240 options.tx_agc_limiter.Set(true);
2241 options.auto_gain_control.Set(true);
2242 EXPECT_TRUE(engine_.SetOptions(options));
2243
2244 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2245 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2246 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2247 EXPECT_TRUE(agc_config.limiterEnable);
2248
2249 // Check interaction with adjust_agc_delta. Both should be respected, for
2250 // backwards compatibility.
2251 options.adjust_agc_delta.Set(-10);
2252 EXPECT_TRUE(engine_.SetOptions(options));
2253
2254 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2255 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2256}
2257
wu@webrtc.org97077a32013-10-25 21:18:33 +00002258TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002259 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002260 cricket::AudioOptions options;
2261 options.recording_sample_rate.Set(48000u);
2262 options.playout_sample_rate.Set(44100u);
2263 EXPECT_TRUE(engine_.SetOptions(options));
2264
2265 unsigned int recording_sample_rate, playout_sample_rate;
2266 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2267 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2268 EXPECT_EQ(48000u, recording_sample_rate);
2269 EXPECT_EQ(44100u, playout_sample_rate);
2270}
2271
2272TEST_F(WebRtcVoiceEngineTestFake, TraceFilterViaTraceOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002273 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002274 engine_.SetLogging(rtc::LS_INFO, "");
wu@webrtc.org97077a32013-10-25 21:18:33 +00002275 EXPECT_EQ(
2276 // Info:
2277 webrtc::kTraceStateInfo | webrtc::kTraceInfo |
2278 // Warning:
2279 webrtc::kTraceTerseInfo | webrtc::kTraceWarning |
2280 // Error:
2281 webrtc::kTraceError | webrtc::kTraceCritical,
2282 static_cast<int>(trace_wrapper_->filter_));
2283 // Now set it explicitly
2284 std::string filter =
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002285 "tracefilter " + rtc::ToString(webrtc::kTraceDefault);
2286 engine_.SetLogging(rtc::LS_VERBOSE, filter.c_str());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002287 EXPECT_EQ(static_cast<unsigned int>(webrtc::kTraceDefault),
2288 trace_wrapper_->filter_);
2289}
2290
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002291// Test that we can set the outgoing SSRC properly.
2292// SSRC is set in SetupEngine by calling AddSendStream.
2293TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002294 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002295 int channel_num = voe_.GetLastChannel();
2296 unsigned int send_ssrc;
2297 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
2298 EXPECT_NE(0U, send_ssrc);
2299 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
2300 EXPECT_EQ(kSsrc1, send_ssrc);
2301}
2302
2303TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2304 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002305 EXPECT_TRUE(SetupEngineWithSendStream());
2306 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2307 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002308 EXPECT_TRUE(channel_->AddRecvStream(
2309 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002310 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2311 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002312
2313 cricket::VoiceMediaInfo info;
2314 EXPECT_EQ(true, channel_->GetStats(&info));
2315 EXPECT_EQ(1u, info.senders.size());
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +00002316 EXPECT_EQ(kSsrc1, info.senders[0].ssrc());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002317 EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
2318 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].bytes_sent);
2319 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_sent);
2320 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_lost);
2321 EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[0].fraction_lost);
2322 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].ext_seqnum);
2323 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].rtt_ms);
2324 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].jitter_ms);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002325 EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002326 // TODO(sriniv): Add testing for more fields. These are not populated
2327 // in FakeWebrtcVoiceEngine yet.
2328 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].audio_level);
2329 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_median_ms);
2330 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_std_ms);
2331 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_return_loss);
2332 // EXPECT_EQ(cricket::kIntStatValue,
2333 // info.senders[0].echo_return_loss_enhancement);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002334 // We have added one receive stream. We should see empty stats.
2335 EXPECT_EQ(info.receivers.size(), 1u);
2336 EXPECT_EQ(info.receivers[0].local_stats.front().ssrc, 0);
solenberg1ac56142015-10-13 03:58:19 -07002337
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002338 // Remove the kSsrc2 stream. No receiver stats.
2339 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07002340 EXPECT_EQ(true, channel_->GetStats(&info));
2341 EXPECT_EQ(0u, info.receivers.size());
2342
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002343 // Deliver a new packet - a default receive stream should be created and we
2344 // should see stats again.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002345 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002346 SetAudioReceiveStreamStats();
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002347 EXPECT_EQ(true, channel_->GetStats(&info));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002348 EXPECT_EQ(1u, info.receivers.size());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002349 VerifyVoiceReceiverInfo(info.receivers[0]);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002350}
2351
2352// Test that we can set the outgoing SSRC properly with multiple streams.
2353// SSRC is set in SetupEngine by calling AddSendStream.
2354TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002355 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002356 int channel_num1 = voe_.GetLastChannel();
2357 unsigned int send_ssrc;
2358 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num1, send_ssrc));
2359 EXPECT_EQ(kSsrc1, send_ssrc);
2360
2361 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2362 int channel_num2 = voe_.GetLastChannel();
2363 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num2, send_ssrc));
2364 EXPECT_EQ(kSsrc1, send_ssrc);
2365}
2366
2367// Test that the local SSRC is the same on sending and receiving channels if the
2368// receive channel is created before the send channel.
2369TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002370 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002371 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002372
2373 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2374 int receive_channel_num = voe_.GetLastChannel();
2375 EXPECT_TRUE(channel_->AddSendStream(
2376 cricket::StreamParams::CreateLegacy(1234)));
2377 int send_channel_num = voe_.GetLastChannel();
2378
2379 unsigned int ssrc = 0;
2380 EXPECT_EQ(0, voe_.GetLocalSSRC(send_channel_num, ssrc));
2381 EXPECT_EQ(1234U, ssrc);
2382 ssrc = 0;
2383 EXPECT_EQ(0, voe_.GetLocalSSRC(receive_channel_num, ssrc));
2384 EXPECT_EQ(1234U, ssrc);
2385}
2386
2387// Test that we can properly receive packets.
2388TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2389 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002390 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002391 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002392 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame,
2393 sizeof(kPcmuFrame)));
2394}
2395
2396// Test that we can properly receive packets on multiple streams.
2397TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002398 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002399 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002400 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2401 int channel_num1 = voe_.GetLastChannel();
2402 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2403 int channel_num2 = voe_.GetLastChannel();
2404 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2405 int channel_num3 = voe_.GetLastChannel();
2406 // Create packets with the right SSRCs.
2407 char packets[4][sizeof(kPcmuFrame)];
2408 for (size_t i = 0; i < ARRAY_SIZE(packets); ++i) {
2409 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002410 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002411 }
2412 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2413 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2414 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2415 DeliverPacket(packets[0], sizeof(packets[0]));
2416 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2417 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2418 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2419 DeliverPacket(packets[1], sizeof(packets[1]));
2420 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1],
2421 sizeof(packets[1])));
2422 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2423 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2424 DeliverPacket(packets[2], sizeof(packets[2]));
2425 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2426 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2],
2427 sizeof(packets[2])));
2428 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2429 DeliverPacket(packets[3], sizeof(packets[3]));
2430 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2431 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2432 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3],
2433 sizeof(packets[3])));
2434 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2435 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2436 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2437}
2438
solenberg0a617e22015-10-20 15:49:38 -07002439// Test that we properly handle failures to add a receive stream.
2440TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
2441 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002442 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002443 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002444}
2445
solenberg0a617e22015-10-20 15:49:38 -07002446// Test that we properly handle failures to add a send stream.
2447TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
2448 EXPECT_TRUE(SetupEngine());
2449 voe_.set_fail_create_channel(true);
2450 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2451}
2452
solenberg1ac56142015-10-13 03:58:19 -07002453// Test that AddRecvStream creates new stream.
2454TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2455 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002456 int channel_num = voe_.GetLastChannel();
2457 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002458 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002459}
2460
2461// Test that after adding a recv stream, we do not decode more codecs than
2462// those previously passed into SetRecvCodecs.
2463TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002464 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002465 cricket::AudioRecvParameters parameters;
2466 parameters.codecs.push_back(kIsacCodec);
2467 parameters.codecs.push_back(kPcmuCodec);
2468 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002469 EXPECT_TRUE(channel_->AddRecvStream(
2470 cricket::StreamParams::CreateLegacy(kSsrc1)));
2471 int channel_num2 = voe_.GetLastChannel();
2472 webrtc::CodecInst gcodec;
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002473 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "opus");
2474 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002475 gcodec.channels = 2;
2476 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2477}
2478
2479// Test that we properly clean up any streams that were added, even if
2480// not explicitly removed.
2481TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002482 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002483 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002484 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2485 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2486 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2487 delete channel_;
2488 channel_ = NULL;
2489 EXPECT_EQ(0, voe_.GetNumChannels());
2490}
2491
wu@webrtc.org78187522013-10-07 23:32:02 +00002492TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002493 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002494 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2495}
2496
2497TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2498 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002499 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002500 // Manually delete channel to simulate a failure.
2501 int channel = voe_.GetLastChannel();
2502 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2503 // Add recv stream 2 should work.
2504 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002505 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002506 EXPECT_NE(channel, new_channel);
2507 // The last created channel is deleted too.
2508 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002509}
2510
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002511// Test the InsertDtmf on default send stream as caller.
2512TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2513 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002514}
2515
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002516// Test the InsertDtmf on default send stream as callee
2517TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2518 TestInsertDtmf(0, false);
2519}
2520
2521// Test the InsertDtmf on specified send stream as caller.
2522TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2523 TestInsertDtmf(kSsrc1, true);
2524}
2525
2526// Test the InsertDtmf on specified send stream as callee.
2527TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2528 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002529}
2530
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002531TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002532 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002533 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002534 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2535 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2536 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2537 EXPECT_TRUE(channel_->SetPlayout(true));
2538 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2539 EXPECT_TRUE(channel_->SetPlayout(false));
2540 EXPECT_FALSE(channel_->SetPlayout(true));
2541}
2542
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002543TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002544 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002545
2546 bool ec_enabled;
2547 webrtc::EcModes ec_mode;
2548 bool ec_metrics_enabled;
2549 webrtc::AecmModes aecm_mode;
2550 bool cng_enabled;
2551 bool agc_enabled;
2552 webrtc::AgcModes agc_mode;
2553 webrtc::AgcConfig agc_config;
2554 bool ns_enabled;
2555 webrtc::NsModes ns_mode;
2556 bool highpass_filter_enabled;
2557 bool stereo_swapping_enabled;
2558 bool typing_detection_enabled;
2559 voe_.GetEcStatus(ec_enabled, ec_mode);
2560 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2561 voe_.GetAecmMode(aecm_mode, cng_enabled);
2562 voe_.GetAgcStatus(agc_enabled, agc_mode);
2563 voe_.GetAgcConfig(agc_config);
2564 voe_.GetNsStatus(ns_enabled, ns_mode);
2565 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2566 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2567 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2568 EXPECT_TRUE(ec_enabled);
2569 EXPECT_TRUE(ec_metrics_enabled);
2570 EXPECT_FALSE(cng_enabled);
2571 EXPECT_TRUE(agc_enabled);
2572 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2573 EXPECT_TRUE(ns_enabled);
2574 EXPECT_TRUE(highpass_filter_enabled);
2575 EXPECT_FALSE(stereo_swapping_enabled);
2576 EXPECT_TRUE(typing_detection_enabled);
2577 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2578 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2579
2580 // Nothing set, so all ignored.
2581 cricket::AudioOptions options;
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002582 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002583 voe_.GetEcStatus(ec_enabled, ec_mode);
2584 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2585 voe_.GetAecmMode(aecm_mode, cng_enabled);
2586 voe_.GetAgcStatus(agc_enabled, agc_mode);
2587 voe_.GetAgcConfig(agc_config);
2588 voe_.GetNsStatus(ns_enabled, ns_mode);
2589 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2590 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2591 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2592 EXPECT_TRUE(ec_enabled);
2593 EXPECT_TRUE(ec_metrics_enabled);
2594 EXPECT_FALSE(cng_enabled);
2595 EXPECT_TRUE(agc_enabled);
2596 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2597 EXPECT_TRUE(ns_enabled);
2598 EXPECT_TRUE(highpass_filter_enabled);
2599 EXPECT_FALSE(stereo_swapping_enabled);
2600 EXPECT_TRUE(typing_detection_enabled);
2601 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2602 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
Henrik Lundin64dad832015-05-11 12:44:23 +02002603 EXPECT_EQ(50, voe_.GetNetEqCapacity()); // From GetDefaultEngineOptions().
Henrik Lundin5263b3c2015-06-01 10:29:41 +02002604 EXPECT_FALSE(
2605 voe_.GetNetEqFastAccelerate()); // From GetDefaultEngineOptions().
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002606
2607 // Turn echo cancellation off
2608 options.echo_cancellation.Set(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002609 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002610 voe_.GetEcStatus(ec_enabled, ec_mode);
2611 EXPECT_FALSE(ec_enabled);
2612
2613 // Turn echo cancellation back on, with settings, and make sure
2614 // nothing else changed.
2615 options.echo_cancellation.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002616 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002617 voe_.GetEcStatus(ec_enabled, ec_mode);
2618 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2619 voe_.GetAecmMode(aecm_mode, cng_enabled);
2620 voe_.GetAgcStatus(agc_enabled, agc_mode);
2621 voe_.GetAgcConfig(agc_config);
2622 voe_.GetNsStatus(ns_enabled, ns_mode);
2623 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2624 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2625 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2626 EXPECT_TRUE(ec_enabled);
2627 EXPECT_TRUE(ec_metrics_enabled);
2628 EXPECT_TRUE(agc_enabled);
2629 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2630 EXPECT_TRUE(ns_enabled);
2631 EXPECT_TRUE(highpass_filter_enabled);
2632 EXPECT_FALSE(stereo_swapping_enabled);
2633 EXPECT_TRUE(typing_detection_enabled);
2634 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2635 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2636
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002637 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2638 // control.
2639 options.delay_agnostic_aec.Set(true);
2640 ASSERT_TRUE(engine_.SetOptions(options));
2641 voe_.GetEcStatus(ec_enabled, ec_mode);
2642 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2643 voe_.GetAecmMode(aecm_mode, cng_enabled);
2644 EXPECT_TRUE(ec_enabled);
2645 EXPECT_TRUE(ec_metrics_enabled);
2646 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2647
2648 // Turn off echo cancellation and delay agnostic aec.
2649 options.delay_agnostic_aec.Set(false);
Henrik Lundin441f6342015-06-09 16:03:13 +02002650 options.extended_filter_aec.Set(false);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002651 options.echo_cancellation.Set(false);
2652 ASSERT_TRUE(engine_.SetOptions(options));
2653 voe_.GetEcStatus(ec_enabled, ec_mode);
2654 EXPECT_FALSE(ec_enabled);
2655 // Turning delay agnostic aec back on should also turn on echo cancellation.
2656 options.delay_agnostic_aec.Set(true);
2657 ASSERT_TRUE(engine_.SetOptions(options));
2658 voe_.GetEcStatus(ec_enabled, ec_mode);
2659 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2660 EXPECT_TRUE(ec_enabled);
2661 EXPECT_TRUE(ec_metrics_enabled);
2662 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2663
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002664 // Turn off AGC
2665 options.auto_gain_control.Set(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002666 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002667 voe_.GetAgcStatus(agc_enabled, agc_mode);
2668 EXPECT_FALSE(agc_enabled);
2669
2670 // Turn AGC back on
2671 options.auto_gain_control.Set(true);
2672 options.adjust_agc_delta.Clear();
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002673 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002674 voe_.GetAgcStatus(agc_enabled, agc_mode);
2675 EXPECT_TRUE(agc_enabled);
2676 voe_.GetAgcConfig(agc_config);
2677 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2678
2679 // Turn off other options (and stereo swapping on).
2680 options.noise_suppression.Set(false);
2681 options.highpass_filter.Set(false);
2682 options.typing_detection.Set(false);
2683 options.stereo_swapping.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002684 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002685 voe_.GetNsStatus(ns_enabled, ns_mode);
2686 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2687 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2688 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2689 EXPECT_FALSE(ns_enabled);
2690 EXPECT_FALSE(highpass_filter_enabled);
2691 EXPECT_FALSE(typing_detection_enabled);
2692 EXPECT_TRUE(stereo_swapping_enabled);
2693
solenberg1ac56142015-10-13 03:58:19 -07002694 // Set options again to ensure it has no impact.
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002695 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002696 voe_.GetEcStatus(ec_enabled, ec_mode);
2697 voe_.GetNsStatus(ns_enabled, ns_mode);
2698 EXPECT_TRUE(ec_enabled);
2699 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2700 EXPECT_FALSE(ns_enabled);
2701 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2702}
2703
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002704TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002705 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002706
2707 bool ec_enabled;
2708 webrtc::EcModes ec_mode;
2709 bool ec_metrics_enabled;
2710 bool agc_enabled;
2711 webrtc::AgcModes agc_mode;
2712 bool ns_enabled;
2713 webrtc::NsModes ns_mode;
2714 bool highpass_filter_enabled;
2715 bool stereo_swapping_enabled;
2716 bool typing_detection_enabled;
2717
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002718 voe_.GetEcStatus(ec_enabled, ec_mode);
2719 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2720 voe_.GetAgcStatus(agc_enabled, agc_mode);
2721 voe_.GetNsStatus(ns_enabled, ns_mode);
2722 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2723 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2724 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2725 EXPECT_TRUE(ec_enabled);
2726 EXPECT_TRUE(agc_enabled);
2727 EXPECT_TRUE(ns_enabled);
2728 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002729 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002730 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002731}
2732
2733TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2734 webrtc::AgcConfig set_config = {0};
2735 set_config.targetLeveldBOv = 3;
2736 set_config.digitalCompressionGaindB = 9;
2737 set_config.limiterEnable = true;
2738 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002739 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002740
2741 webrtc::AgcConfig config = {0};
2742 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2743 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2744 EXPECT_EQ(set_config.digitalCompressionGaindB,
2745 config.digitalCompressionGaindB);
2746 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2747}
2748
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002749TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002750 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg66f43392015-09-09 01:36:22 -07002751 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2752 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002753 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002754 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2755 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002756 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002757
2758 // Have to add a stream to make SetSend work.
2759 cricket::StreamParams stream1;
2760 stream1.ssrcs.push_back(1);
2761 channel1->AddSendStream(stream1);
2762 cricket::StreamParams stream2;
2763 stream2.ssrcs.push_back(2);
2764 channel2->AddSendStream(stream2);
2765
2766 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002767 cricket::AudioSendParameters parameters_options_all = send_parameters_;
2768 parameters_options_all.options.echo_cancellation.Set(true);
2769 parameters_options_all.options.auto_gain_control.Set(true);
2770 parameters_options_all.options.noise_suppression.Set(true);
2771 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2772 EXPECT_EQ(parameters_options_all.options, channel1->options());
2773 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2774 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002775
2776 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002777 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
2778 parameters_options_no_ns.options.noise_suppression.Set(false);
2779 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2780 cricket::AudioOptions expected_options = parameters_options_all.options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002781 expected_options.echo_cancellation.Set(true);
2782 expected_options.auto_gain_control.Set(true);
2783 expected_options.noise_suppression.Set(false);
solenberg66f43392015-09-09 01:36:22 -07002784 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002785
2786 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002787 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
2788 parameters_options_no_agc.options.auto_gain_control.Set(false);
2789 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002790 expected_options.echo_cancellation.Set(true);
2791 expected_options.auto_gain_control.Set(false);
2792 expected_options.noise_suppression.Set(true);
solenberg66f43392015-09-09 01:36:22 -07002793 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002794
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002795 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002796 bool ec_enabled;
2797 webrtc::EcModes ec_mode;
2798 bool agc_enabled;
2799 webrtc::AgcModes agc_mode;
2800 bool ns_enabled;
2801 webrtc::NsModes ns_mode;
2802 voe_.GetEcStatus(ec_enabled, ec_mode);
2803 voe_.GetAgcStatus(agc_enabled, agc_mode);
2804 voe_.GetNsStatus(ns_enabled, ns_mode);
2805 EXPECT_TRUE(ec_enabled);
2806 EXPECT_TRUE(agc_enabled);
2807 EXPECT_TRUE(ns_enabled);
2808
2809 channel1->SetSend(cricket::SEND_MICROPHONE);
2810 voe_.GetEcStatus(ec_enabled, ec_mode);
2811 voe_.GetAgcStatus(agc_enabled, agc_mode);
2812 voe_.GetNsStatus(ns_enabled, ns_mode);
2813 EXPECT_TRUE(ec_enabled);
2814 EXPECT_TRUE(agc_enabled);
2815 EXPECT_FALSE(ns_enabled);
2816
2817 channel1->SetSend(cricket::SEND_NOTHING);
2818 voe_.GetEcStatus(ec_enabled, ec_mode);
2819 voe_.GetAgcStatus(agc_enabled, agc_mode);
2820 voe_.GetNsStatus(ns_enabled, ns_mode);
2821 EXPECT_TRUE(ec_enabled);
2822 EXPECT_TRUE(agc_enabled);
2823 EXPECT_TRUE(ns_enabled);
2824
2825 channel2->SetSend(cricket::SEND_MICROPHONE);
2826 voe_.GetEcStatus(ec_enabled, ec_mode);
2827 voe_.GetAgcStatus(agc_enabled, agc_mode);
2828 voe_.GetNsStatus(ns_enabled, ns_mode);
2829 EXPECT_TRUE(ec_enabled);
2830 EXPECT_FALSE(agc_enabled);
2831 EXPECT_TRUE(ns_enabled);
2832
2833 channel2->SetSend(cricket::SEND_NOTHING);
2834 voe_.GetEcStatus(ec_enabled, ec_mode);
2835 voe_.GetAgcStatus(agc_enabled, agc_mode);
2836 voe_.GetNsStatus(ns_enabled, ns_mode);
2837 EXPECT_TRUE(ec_enabled);
2838 EXPECT_TRUE(agc_enabled);
2839 EXPECT_TRUE(ns_enabled);
2840
2841 // Make sure settings take effect while we are sending.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002842 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
2843 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2844 send_parameters_;
2845 parameters_options_no_agc_nor_ns.options.auto_gain_control.Set(false);
2846 parameters_options_no_agc_nor_ns.options.noise_suppression.Set(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002847 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002848 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002849 expected_options.echo_cancellation.Set(true);
2850 expected_options.auto_gain_control.Set(false);
2851 expected_options.noise_suppression.Set(false);
solenberg66f43392015-09-09 01:36:22 -07002852 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002853 voe_.GetEcStatus(ec_enabled, ec_mode);
2854 voe_.GetAgcStatus(agc_enabled, agc_mode);
2855 voe_.GetNsStatus(ns_enabled, ns_mode);
2856 EXPECT_TRUE(ec_enabled);
2857 EXPECT_FALSE(agc_enabled);
2858 EXPECT_FALSE(ns_enabled);
2859}
2860
wu@webrtc.orgde305012013-10-31 15:40:38 +00002861// This test verifies DSCP settings are properly applied on voice media channel.
2862TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002863 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002864 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002865 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002866 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00002867 new cricket::FakeNetworkInterface);
2868 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002869 cricket::AudioSendParameters parameters = send_parameters_;
2870 parameters.options.dscp.Set(true);
2871 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002872 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00002873 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002874 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002875 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002876 parameters.options.dscp.Set(false);
2877 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002878 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00002879}
2880
solenberg1ac56142015-10-13 03:58:19 -07002881TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002882 EXPECT_TRUE(SetupEngine());
2883 cricket::WebRtcVoiceMediaChannel* media_channel =
2884 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002885 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2886 EXPECT_TRUE(channel_->AddRecvStream(
2887 cricket::StreamParams::CreateLegacy(kSsrc1)));
2888 int channel_id = voe_.GetLastChannel();
2889 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2890 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2891 EXPECT_TRUE(channel_->AddRecvStream(
2892 cricket::StreamParams::CreateLegacy(kSsrc2)));
2893 int channel_id2 = voe_.GetLastChannel();
2894 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002895}
2896
solenberg1ac56142015-10-13 03:58:19 -07002897TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002898 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002899 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002900 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2901 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2902 EXPECT_TRUE(channel_->AddSendStream(
2903 cricket::StreamParams::CreateLegacy(kSsrc1)));
2904 int channel_id = voe_.GetLastChannel();
2905 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2906 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2907 EXPECT_TRUE(channel_->AddSendStream(
2908 cricket::StreamParams::CreateLegacy(kSsrc2)));
2909 int channel_id2 = voe_.GetLastChannel();
2910 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002911}
2912
solenberg4bac9c52015-10-09 02:32:53 -07002913TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002914 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002915 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002916 cricket::StreamParams stream;
2917 stream.ssrcs.push_back(kSsrc2);
2918 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002919 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002920 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002921 float scale = 0;
2922 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2923 EXPECT_DOUBLE_EQ(3, scale);
2924}
2925
2926TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
2927 EXPECT_TRUE(SetupEngine());
2928 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2929 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2930 int channel_id = voe_.GetLastChannel();
2931 float scale = 0;
2932 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2933 EXPECT_DOUBLE_EQ(2, scale);
2934 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07002935 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002936 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002937}
2938
pbos8fc7fa72015-07-15 08:02:58 -07002939TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02002940 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07002941 const std::string kSyncLabel = "AvSyncLabel";
2942
solenberg1ac56142015-10-13 03:58:19 -07002943 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07002944 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
2945 sp.sync_label = kSyncLabel;
2946 // Creating two channels to make sure that sync label is set properly for both
2947 // the default voice channel and following ones.
2948 EXPECT_TRUE(channel_->AddRecvStream(sp));
2949 sp.ssrcs[0] += 1;
2950 EXPECT_TRUE(channel_->AddRecvStream(sp));
2951
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002952 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07002953 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002954 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002955 << "SyncGroup should be set based on sync_label";
2956 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002957 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002958 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07002959}
2960
pbos6bb1b6e2015-07-24 07:10:18 -07002961TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002962 // Test that changing the combined_audio_video_bwe option results in the
2963 // expected state changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002964 std::vector<uint32_t> ssrcs;
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002965 ssrcs.push_back(223);
2966 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002967
solenberg1ac56142015-10-13 03:58:19 -07002968 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002969 cricket::WebRtcVoiceMediaChannel* media_channel =
2970 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02002971 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002972 EXPECT_TRUE(media_channel->AddRecvStream(
2973 cricket::StreamParams::CreateLegacy(ssrc)));
2974 }
2975 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002976
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002977 // Combined BWE should be disabled.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002978 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002979 const auto* s = call_.GetAudioReceiveStream(ssrc);
2980 EXPECT_NE(nullptr, s);
2981 EXPECT_EQ(false, s->GetConfig().combined_audio_video_bwe);
2982 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002983
2984 // Enable combined BWE option - now it should be set up.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002985 send_parameters_.options.combined_audio_video_bwe.Set(true);
2986 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002987 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002988 const auto* s = call_.GetAudioReceiveStream(ssrc);
2989 EXPECT_NE(nullptr, s);
2990 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
2991 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002992
2993 // Disable combined BWE option - should be disabled again.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002994 send_parameters_.options.combined_audio_video_bwe.Set(false);
2995 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002996 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002997 const auto* s = call_.GetAudioReceiveStream(ssrc);
2998 EXPECT_NE(nullptr, s);
2999 EXPECT_EQ(false, s->GetConfig().combined_audio_video_bwe);
3000 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003001
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003002 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003003}
3004
pbos6bb1b6e2015-07-24 07:10:18 -07003005TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003006 // Test that adding receive streams after enabling combined bandwidth
3007 // estimation will correctly configure each channel.
solenberg1ac56142015-10-13 03:58:19 -07003008 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003009 cricket::WebRtcVoiceMediaChannel* media_channel =
3010 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003011 send_parameters_.options.combined_audio_video_bwe.Set(true);
3012 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003013
Peter Boström0c4e06b2015-10-07 12:23:21 +02003014 static const uint32_t kSsrcs[] = {1, 2, 3, 4};
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003015 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs); ++i) {
3016 EXPECT_TRUE(media_channel->AddRecvStream(
3017 cricket::StreamParams::CreateLegacy(kSsrcs[i])));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003018 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(kSsrcs[i]));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003019 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003020 EXPECT_EQ(ARRAY_SIZE(kSsrcs), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003021}
3022
pbos6bb1b6e2015-07-24 07:10:18 -07003023TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003024 // Test that setting the header extensions results in the expected state
3025 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003026 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003027 ssrcs.push_back(223);
3028 ssrcs.push_back(224);
3029
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_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003033 send_parameters_.options.combined_audio_video_bwe.Set(true);
3034 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003035 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003036 EXPECT_TRUE(media_channel->AddRecvStream(
3037 cricket::StreamParams::CreateLegacy(ssrc)));
3038 }
3039
3040 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003041 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003042 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003043 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003044 EXPECT_NE(nullptr, s);
3045 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3046 }
3047
3048 // Set up receive extensions.
3049 const auto& e_exts = engine_.rtp_header_extensions();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003050 cricket::AudioRecvParameters recv_parameters;
3051 recv_parameters.extensions = e_exts;
3052 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003053 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003054 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003055 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003056 EXPECT_NE(nullptr, s);
3057 const auto& s_exts = s->GetConfig().rtp.extensions;
3058 EXPECT_EQ(e_exts.size(), s_exts.size());
3059 for (const auto& e_ext : e_exts) {
3060 for (const auto& s_ext : s_exts) {
3061 if (e_ext.id == s_ext.id) {
3062 EXPECT_EQ(e_ext.uri, s_ext.name);
3063 }
3064 }
3065 }
3066 }
3067
3068 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003069 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003070 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003071 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003072 EXPECT_NE(nullptr, s);
3073 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3074 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003075}
3076
3077TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3078 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003079 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003080 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3081 static const unsigned char kRtcp[] = {
3082 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3083 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3084 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3085 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3086 };
3087 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3088
solenberg1ac56142015-10-13 03:58:19 -07003089 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003090 cricket::WebRtcVoiceMediaChannel* media_channel =
3091 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003092 send_parameters_.options.combined_audio_video_bwe.Set(true);
3093 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003094 EXPECT_TRUE(media_channel->AddRecvStream(
3095 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3096
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003097 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003098 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003099 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003100 EXPECT_EQ(0, s->received_packets());
3101 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3102 EXPECT_EQ(1, s->received_packets());
3103 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3104 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003105}
Minyue2013aec2015-05-13 14:14:42 +02003106
solenberg0a617e22015-10-20 15:49:38 -07003107// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003108// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003109TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenberg1ac56142015-10-13 03:58:19 -07003110 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003111 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003112 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003113 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3114 int recv_ch = voe_.GetLastChannel();
3115 EXPECT_NE(recv_ch, default_channel);
3116 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3117 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3118 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003119 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3120 recv_ch = voe_.GetLastChannel();
3121 EXPECT_NE(recv_ch, default_channel);
3122 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003123}
3124
3125TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003126 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003127 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003128
3129 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3130 int recv_ch = voe_.GetLastChannel();
3131
3132 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3133 int send_ch = voe_.GetLastChannel();
3134
3135 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3136 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3137 // channel of |recv_ch|.This is not a common case, since, normally, only the
3138 // default channel can be associated. However, the default is not deletable.
3139 // So we force the |recv_ch| to associate with a non-default channel.
3140 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3141 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3142
3143 EXPECT_TRUE(channel_->RemoveSendStream(2));
3144 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3145}
stefan658910c2015-09-03 05:48:32 -07003146
3147// Tests for the actual WebRtc VoE library.
3148
3149TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
3150 cricket::WebRtcVoiceEngine engine;
3151 cricket::AudioOptions options = engine.GetOptions();
3152 // The default options should have at least a few things set. We purposefully
3153 // don't check the option values here, though.
3154 EXPECT_TRUE(options.echo_cancellation.IsSet());
3155 EXPECT_TRUE(options.auto_gain_control.IsSet());
3156 EXPECT_TRUE(options.noise_suppression.IsSet());
3157}
3158
3159// Tests that the library initializes and shuts down properly.
3160TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3161 cricket::WebRtcVoiceEngine engine;
3162 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003163 rtc::scoped_ptr<webrtc::Call> call(
3164 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003165 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003166 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003167 EXPECT_TRUE(channel != nullptr);
3168 delete channel;
3169 engine.Terminate();
3170
3171 // Reinit to catch regression where VoiceEngineObserver reference is lost
3172 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3173 engine.Terminate();
3174}
3175
3176// Tests that the library is configured with the codecs we want.
3177TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
3178 cricket::WebRtcVoiceEngine engine;
3179 // Check codecs by name.
3180 EXPECT_TRUE(engine.FindCodec(
3181 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0)));
3182 EXPECT_TRUE(engine.FindCodec(
3183 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0)));
3184 EXPECT_TRUE(engine.FindCodec(
3185 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0)));
3186 // Check that name matching is case-insensitive.
3187 EXPECT_TRUE(engine.FindCodec(
3188 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0)));
3189 EXPECT_TRUE(engine.FindCodec(
3190 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0)));
3191 EXPECT_TRUE(engine.FindCodec(
3192 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0)));
3193 EXPECT_TRUE(engine.FindCodec(
3194 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0)));
3195 EXPECT_TRUE(engine.FindCodec(
3196 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0)));
3197 EXPECT_TRUE(engine.FindCodec(
3198 cricket::AudioCodec(96, "red", 8000, 0, 1, 0)));
3199 EXPECT_TRUE(engine.FindCodec(
3200 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0)));
3201 EXPECT_TRUE(engine.FindCodec(
3202 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0)));
3203 EXPECT_TRUE(engine.FindCodec(
3204 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0)));
3205 EXPECT_TRUE(engine.FindCodec(
3206 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0)));
3207 // Check codecs with an id by id.
3208 EXPECT_TRUE(engine.FindCodec(
3209 cricket::AudioCodec(0, "", 8000, 0, 1, 0))); // PCMU
3210 EXPECT_TRUE(engine.FindCodec(
3211 cricket::AudioCodec(8, "", 8000, 0, 1, 0))); // PCMA
3212 EXPECT_TRUE(engine.FindCodec(
3213 cricket::AudioCodec(9, "", 8000, 0, 1, 0))); // G722
3214 EXPECT_TRUE(engine.FindCodec(
3215 cricket::AudioCodec(13, "", 8000, 0, 1, 0))); // CN
3216 // Check sample/bitrate matching.
3217 EXPECT_TRUE(engine.FindCodec(
3218 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0)));
3219 // Check that bad codecs fail.
3220 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0)));
3221 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(88, "", 0, 0, 1, 0)));
3222 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 0, 2, 0)));
3223 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 5000, 0, 1, 0)));
3224 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 5000, 1, 0)));
3225 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3226 for (std::vector<cricket::AudioCodec>::const_iterator it =
3227 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3228 if (it->name == "CN" && it->clockrate == 16000) {
3229 EXPECT_EQ(105, it->id);
3230 } else if (it->name == "CN" && it->clockrate == 32000) {
3231 EXPECT_EQ(106, it->id);
3232 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3233 EXPECT_EQ(103, it->id);
3234 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3235 EXPECT_EQ(104, it->id);
3236 } else if (it->name == "G722" && it->clockrate == 8000) {
3237 EXPECT_EQ(9, it->id);
3238 } else if (it->name == "telephone-event") {
3239 EXPECT_EQ(126, it->id);
3240 } else if (it->name == "red") {
3241 EXPECT_EQ(127, it->id);
3242 } else if (it->name == "opus") {
3243 EXPECT_EQ(111, it->id);
3244 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3245 EXPECT_EQ("10", it->params.find("minptime")->second);
3246 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3247 EXPECT_EQ("60", it->params.find("maxptime")->second);
3248 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3249 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3250 }
3251 }
3252
3253 engine.Terminate();
3254}
3255
3256// Tests that VoE supports at least 32 channels
3257TEST(WebRtcVoiceEngineTest, Has32Channels) {
3258 cricket::WebRtcVoiceEngine engine;
3259 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003260 rtc::scoped_ptr<webrtc::Call> call(
3261 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003262
3263 cricket::VoiceMediaChannel* channels[32];
3264 int num_channels = 0;
stefan658910c2015-09-03 05:48:32 -07003265 while (num_channels < ARRAY_SIZE(channels)) {
3266 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003267 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003268 if (!channel)
3269 break;
stefan658910c2015-09-03 05:48:32 -07003270 channels[num_channels++] = channel;
3271 }
3272
3273 int expected = ARRAY_SIZE(channels);
3274 EXPECT_EQ(expected, num_channels);
3275
3276 while (num_channels > 0) {
3277 delete channels[--num_channels];
3278 }
stefan658910c2015-09-03 05:48:32 -07003279 engine.Terminate();
3280}
3281
3282// Test that we set our preferred codecs properly.
3283TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3284 cricket::WebRtcVoiceEngine engine;
3285 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003286 rtc::scoped_ptr<webrtc::Call> call(
3287 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003288 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3289 call.get());
3290 cricket::AudioRecvParameters parameters;
3291 parameters.codecs = engine.codecs();
3292 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003293}