blob: 0e2781b94719e5f2a5e11cb973889b51e0671f33 [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
tfarina5237aaf2015-11-10 23:44:30 -080028#include "webrtc/base/arraysize.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000029#include "webrtc/base/byteorder.h"
30#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020031#include "webrtc/call.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032#include "talk/media/base/constants.h"
33#include "talk/media/base/fakemediaengine.h"
wu@webrtc.orgde305012013-10-31 15:40:38 +000034#include "talk/media/base/fakenetworkinterface.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035#include "talk/media/base/fakertp.h"
Fredrik Solenberg4b60c732015-05-07 14:07:48 +020036#include "talk/media/webrtc/fakewebrtccall.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000037#include "talk/media/webrtc/fakewebrtcvoiceengine.h"
38#include "talk/media/webrtc/webrtcvoiceengine.h"
deadbeefcbecd352015-09-23 11:50:27 -070039#include "webrtc/p2p/base/faketransportcontroller.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000040#include "talk/session/media/channel.h"
41
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000042using cricket::kRtpAudioLevelHeaderExtension;
43using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
44
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020045namespace {
46
47const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
48const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
49const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
50const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
51const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
52const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
53const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
54const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
55const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, 0,
56 1, 0);
57const cricket::AudioCodec* const kAudioCodecs[] = {
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +000058 &kPcmuCodec, &kIsacCodec, &kOpusCodec, &kG722CodecVoE, &kRedCodec,
59 &kCn8000Codec, &kCn16000Codec, &kTelephoneEventCodec,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060};
solenberg85a04962015-10-27 03:35:21 -070061const uint32_t kSsrc1 = 0x99;
62const uint32_t kSsrc2 = 0x98;
63const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064
65class FakeVoEWrapper : public cricket::VoEWrapper {
66 public:
67 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
68 : cricket::VoEWrapper(engine, // processing
69 engine, // base
70 engine, // codec
71 engine, // dtmf
henrike@webrtc.org28e20752013-07-10 00:45:36 +000072 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000073 engine, // network
74 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000075 engine) { // volume
76 }
77};
78
wu@webrtc.org97077a32013-10-25 21:18:33 +000079class FakeVoETraceWrapper : public cricket::VoETraceWrapper {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080 public:
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +020081 int SetTraceFilter(const unsigned int filter) override {
wu@webrtc.org97077a32013-10-25 21:18:33 +000082 filter_ = filter;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083 return 0;
84 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +020085 int SetTraceFile(const char* fileNameUTF8) override { return 0; }
86 int SetTraceCallback(webrtc::TraceCallback* callback) override { return 0; }
wu@webrtc.org97077a32013-10-25 21:18:33 +000087 unsigned int filter_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020089} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000090
91class WebRtcVoiceEngineTestFake : public testing::Test {
92 public:
henrike@webrtc.org28e20752013-07-10 00:45:36 +000093 WebRtcVoiceEngineTestFake()
Fredrik Solenberg709ed672015-09-15 12:26:33 +020094 : call_(webrtc::Call::Config()),
tfarina5237aaf2015-11-10 23:44:30 -080095 voe_(kAudioCodecs, arraysize(kAudioCodecs)),
wu@webrtc.org97077a32013-10-25 21:18:33 +000096 trace_wrapper_(new FakeVoETraceWrapper()),
Jelena Marusicc28a8962015-05-29 15:05:44 +020097 engine_(new FakeVoEWrapper(&voe_), trace_wrapper_),
98 channel_(nullptr) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +020099 send_parameters_.codecs.push_back(kPcmuCodec);
100 recv_parameters_.codecs.push_back(kPcmuCodec);
Karl Wibergbe579832015-11-10 22:34:18 +0100101 options_adjust_agc_.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000102 }
solenberg1ac56142015-10-13 03:58:19 -0700103 bool SetupEngine() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000104 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000105 return false;
106 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200107 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200108 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000109 }
solenberg1ac56142015-10-13 03:58:19 -0700110 bool SetupEngineWithRecvStream() {
111 if (!SetupEngine()) {
112 return false;
113 }
114 return channel_->AddRecvStream(
115 cricket::StreamParams::CreateLegacy(kSsrc1));
116 }
117 bool SetupEngineWithSendStream() {
118 if (!SetupEngine()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000119 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000120 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000121 return channel_->AddSendStream(
122 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000123 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000124 void SetupForMultiSendStream() {
solenberg1ac56142015-10-13 03:58:19 -0700125 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700126 // Remove stream added in Setup.
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000127 int default_channel_num = voe_.GetLastChannel();
solenberg85a04962015-10-27 03:35:21 -0700128 EXPECT_EQ(kSsrc1, voe_.GetLocalSSRC(default_channel_num));
129 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000130
solenberg0a617e22015-10-20 15:49:38 -0700131 // Verify the channel does not exist.
solenberg85a04962015-10-27 03:35:21 -0700132 EXPECT_EQ(-1, voe_.GetChannelFromLocalSsrc(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000133 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000134 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200135 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000136 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000137 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200138 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000139 delete channel_;
140 engine_.Terminate();
141 }
142
Peter Boström0c4e06b2015-10-07 12:23:21 +0200143 void TestInsertDtmf(uint32_t ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000144 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200145 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200146 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000147 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700148 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000149 // send stream.
150 EXPECT_TRUE(channel_->AddSendStream(
151 cricket::StreamParams::CreateLegacy(kSsrc1)));
152 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000153
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000154 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200155 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000156 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
157 EXPECT_FALSE(channel_->CanInsertDtmf());
158 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111, cricket::DF_SEND));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200159 send_parameters_.codecs.push_back(kTelephoneEventCodec);
160 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000161 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000162
163 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700164 // If this is callee, there's no active send channel yet.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000165 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
166 EXPECT_TRUE(channel_->AddSendStream(
167 cricket::StreamParams::CreateLegacy(kSsrc1)));
168 }
169
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000170 // Check we fail if the ssrc is invalid.
171 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111, cricket::DF_SEND));
172
173 // Test send
solenberg0a617e22015-10-20 15:49:38 -0700174 int channel_id = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000175 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
176 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
177 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
178
179 // Test play
180 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(3, 134));
181 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 3, 134, cricket::DF_PLAY));
182 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(3, 134));
183
184 // Test send and play
185 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
186 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(4, 145));
187 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 4, 145,
188 cricket::DF_PLAY | cricket::DF_SEND));
189 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
190 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(4, 145));
191 }
192
193 // Test that send bandwidth is set correctly.
194 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000195 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
196 // |expected_result| is the expected result from SetMaxSendBandwidth().
197 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000198 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000199 int max_bitrate,
200 bool expected_result,
201 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200202 cricket::AudioSendParameters parameters;
203 parameters.codecs.push_back(codec);
204 parameters.max_bandwidth_bps = max_bitrate;
205 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
206
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000207 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000208 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000209 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000210 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000211 }
212
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000213 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenberg0a617e22015-10-20 15:49:38 -0700214 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000215 int channel_num = voe_.GetLastChannel();
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000216
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000217 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000218 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000219
220 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200221 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000222 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200223 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000224 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000225
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000226 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200227 send_parameters_.extensions.clear();
228 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000229 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000230
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000231 // Ensure extension is set properly.
232 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200233 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
234 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000235 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000236
solenberg0a617e22015-10-20 15:49:38 -0700237 // Ensure extension is set properly on new channels.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000238 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700239 cricket::StreamParams::CreateLegacy(kSsrc2)));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000240 int new_channel_num = voe_.GetLastChannel();
241 EXPECT_NE(channel_num, new_channel_num);
242 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000243
244 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200245 send_parameters_.codecs.push_back(kPcmuCodec);
246 send_parameters_.extensions.clear();
247 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000248 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
249 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000250 }
251
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000252 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700253 EXPECT_TRUE(SetupEngineWithRecvStream());
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000254 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000255
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000256 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000257 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000258
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200259 cricket::AudioRecvParameters parameters;
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000260 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200261 parameters.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000262 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200263 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000264 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000265
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000266 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200267 parameters.extensions.clear();
268 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000269 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000270
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000271 // Ensure extension is set properly.
272 const int id = 2;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200273 parameters.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
274 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000275 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000276
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000277 // Ensure extension is set properly on new channel.
278 // The first stream to occupy the default channel.
279 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700280 cricket::StreamParams::CreateLegacy(kSsrc2)));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000281 int new_channel_num = voe_.GetLastChannel();
282 EXPECT_NE(channel_num, new_channel_num);
283 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
284
285 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200286 parameters.extensions.clear();
287 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000288 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
289 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000290 }
291
solenberg85a04962015-10-27 03:35:21 -0700292 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
293 webrtc::AudioSendStream::Stats stats;
294 stats.local_ssrc = 12;
295 stats.bytes_sent = 345;
296 stats.packets_sent = 678;
297 stats.packets_lost = 9012;
298 stats.fraction_lost = 34.56f;
299 stats.codec_name = "codec_name_send";
300 stats.ext_seqnum = 789;
301 stats.jitter_ms = 12;
302 stats.rtt_ms = 345;
303 stats.audio_level = 678;
304 stats.aec_quality_min = 9.01f;
305 stats.echo_delay_median_ms = 234;
306 stats.echo_delay_std_ms = 567;
307 stats.echo_return_loss = 890;
308 stats.echo_return_loss_enhancement = 1234;
309 stats.typing_noise_detected = true;
310 return stats;
311 }
312 void SetAudioSendStreamStats() {
313 for (auto* s : call_.GetAudioSendStreams()) {
314 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200315 }
solenberg85a04962015-10-27 03:35:21 -0700316 }
solenberg566ef242015-11-06 15:34:49 -0800317 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
318 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700319 const auto stats = GetAudioSendStreamStats();
320 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
321 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
322 EXPECT_EQ(info.packets_sent, stats.packets_sent);
323 EXPECT_EQ(info.packets_lost, stats.packets_lost);
324 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
325 EXPECT_EQ(info.codec_name, stats.codec_name);
326 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
327 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
328 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
329 EXPECT_EQ(info.audio_level, stats.audio_level);
330 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
331 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
332 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
333 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
334 EXPECT_EQ(info.echo_return_loss_enhancement,
335 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800336 EXPECT_EQ(info.typing_noise_detected,
337 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700338 }
339
340 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
341 webrtc::AudioReceiveStream::Stats stats;
342 stats.remote_ssrc = 123;
343 stats.bytes_rcvd = 456;
344 stats.packets_rcvd = 768;
345 stats.packets_lost = 101;
346 stats.fraction_lost = 23.45f;
347 stats.codec_name = "codec_name_recv";
348 stats.ext_seqnum = 678;
349 stats.jitter_ms = 901;
350 stats.jitter_buffer_ms = 234;
351 stats.jitter_buffer_preferred_ms = 567;
352 stats.delay_estimate_ms = 890;
353 stats.audio_level = 1234;
354 stats.expand_rate = 5.67f;
355 stats.speech_expand_rate = 8.90f;
356 stats.secondary_decoded_rate = 1.23f;
357 stats.accelerate_rate = 4.56f;
358 stats.preemptive_expand_rate = 7.89f;
359 stats.decoding_calls_to_silence_generator = 12;
360 stats.decoding_calls_to_neteq = 345;
361 stats.decoding_normal = 67890;
362 stats.decoding_plc = 1234;
363 stats.decoding_cng = 5678;
364 stats.decoding_plc_cng = 9012;
365 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200366 return stats;
367 }
368 void SetAudioReceiveStreamStats() {
369 for (auto* s : call_.GetAudioReceiveStreams()) {
370 s->SetStats(GetAudioReceiveStreamStats());
371 }
372 }
373 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700374 const auto stats = GetAudioReceiveStreamStats();
375 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
376 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
377 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
378 EXPECT_EQ(info.packets_lost, stats.packets_lost);
379 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
380 EXPECT_EQ(info.codec_name, stats.codec_name);
381 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
382 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
383 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200384 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700385 stats.jitter_buffer_preferred_ms);
386 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
387 EXPECT_EQ(info.audio_level, stats.audio_level);
388 EXPECT_EQ(info.expand_rate, stats.expand_rate);
389 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
390 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
391 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
392 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200393 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700394 stats.decoding_calls_to_silence_generator);
395 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
396 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
397 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
398 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
399 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
400 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200401 }
402
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000403 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200404 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000405 cricket::FakeWebRtcVoiceEngine voe_;
wu@webrtc.org97077a32013-10-25 21:18:33 +0000406 FakeVoETraceWrapper* trace_wrapper_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000407 cricket::WebRtcVoiceEngine engine_;
408 cricket::VoiceMediaChannel* channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000409
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200410 cricket::AudioSendParameters send_parameters_;
411 cricket::AudioRecvParameters recv_parameters_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000412 cricket::AudioOptions options_adjust_agc_;
413};
414
415// Tests that our stub library "works".
416TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
417 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000418 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000419 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000420 engine_.Terminate();
421 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000422}
423
424// Tests that we can create and destroy a channel.
425TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000426 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200427 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200428 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000429}
430
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000431// Tests that the list of supported codecs is created properly and ordered
432// correctly
433TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
434 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
435 ASSERT_FALSE(codecs.empty());
436 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
437 EXPECT_EQ(48000, codecs[0].clockrate);
438 EXPECT_EQ(2, codecs[0].channels);
439 EXPECT_EQ(64000, codecs[0].bitrate);
440 int pref = codecs[0].preference;
441 for (size_t i = 1; i < codecs.size(); ++i) {
442 EXPECT_GT(pref, codecs[i].preference);
443 pref = codecs[i].preference;
444 }
445}
446
447// Tests that we can find codecs by name or id, and that we interpret the
448// clockrate and bitrate fields properly.
449TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
450 cricket::AudioCodec codec;
451 webrtc::CodecInst codec_inst;
452 // Find PCMU with explicit clockrate and bitrate.
453 EXPECT_TRUE(engine_.FindWebRtcCodec(kPcmuCodec, &codec_inst));
454 // Find ISAC with explicit clockrate and 0 bitrate.
455 EXPECT_TRUE(engine_.FindWebRtcCodec(kIsacCodec, &codec_inst));
456 // Find telephone-event with explicit clockrate and 0 bitrate.
457 EXPECT_TRUE(engine_.FindWebRtcCodec(kTelephoneEventCodec, &codec_inst));
458 // Find ISAC with a different payload id.
459 codec = kIsacCodec;
460 codec.id = 127;
461 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
462 EXPECT_EQ(codec.id, codec_inst.pltype);
463 // Find PCMU with a 0 clockrate.
464 codec = kPcmuCodec;
465 codec.clockrate = 0;
466 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
467 EXPECT_EQ(codec.id, codec_inst.pltype);
468 EXPECT_EQ(8000, codec_inst.plfreq);
469 // Find PCMU with a 0 bitrate.
470 codec = kPcmuCodec;
471 codec.bitrate = 0;
472 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
473 EXPECT_EQ(codec.id, codec_inst.pltype);
474 EXPECT_EQ(64000, codec_inst.rate);
475 // Find ISAC with an explicit bitrate.
476 codec = kIsacCodec;
477 codec.bitrate = 32000;
478 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
479 EXPECT_EQ(codec.id, codec_inst.pltype);
480 EXPECT_EQ(32000, codec_inst.rate);
481}
482
483// Test that we set our inbound codecs properly, including changing PT.
484TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
485 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200486 cricket::AudioRecvParameters parameters;
487 parameters.codecs.push_back(kIsacCodec);
488 parameters.codecs.push_back(kPcmuCodec);
489 parameters.codecs.push_back(kTelephoneEventCodec);
490 parameters.codecs[0].id = 106; // collide with existing telephone-event
491 parameters.codecs[2].id = 126;
492 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700493 EXPECT_TRUE(channel_->AddRecvStream(
494 cricket::StreamParams::CreateLegacy(kSsrc1)));
495 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000496 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800497 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000498 gcodec.plfreq = 16000;
499 gcodec.channels = 1;
500 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
501 EXPECT_EQ(106, gcodec.pltype);
502 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800503 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000504 gcodec.plfreq = 8000;
505 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
506 EXPECT_EQ(126, gcodec.pltype);
507 EXPECT_STREQ("telephone-event", gcodec.plname);
508}
509
510// Test that we fail to set an unknown inbound codec.
511TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
512 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200513 cricket::AudioRecvParameters parameters;
514 parameters.codecs.push_back(kIsacCodec);
515 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
516 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000517}
518
519// Test that we fail if we have duplicate types in the inbound list.
520TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
521 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200522 cricket::AudioRecvParameters parameters;
523 parameters.codecs.push_back(kIsacCodec);
524 parameters.codecs.push_back(kCn16000Codec);
525 parameters.codecs[1].id = kIsacCodec.id;
526 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000527}
528
529// Test that we can decode OPUS without stereo parameters.
530TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
531 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200532 cricket::AudioRecvParameters parameters;
533 parameters.codecs.push_back(kIsacCodec);
534 parameters.codecs.push_back(kPcmuCodec);
535 parameters.codecs.push_back(kOpusCodec);
536 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000537 EXPECT_TRUE(channel_->AddRecvStream(
538 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700539 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000540 webrtc::CodecInst opus;
541 engine_.FindWebRtcCodec(kOpusCodec, &opus);
542 // Even without stereo parameters, recv codecs still specify channels = 2.
543 EXPECT_EQ(2, opus.channels);
544 EXPECT_EQ(111, opus.pltype);
545 EXPECT_STREQ("opus", opus.plname);
546 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700547 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000548 EXPECT_EQ(111, opus.pltype);
549}
550
551// Test that we can decode OPUS with stereo = 0.
552TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
553 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200554 cricket::AudioRecvParameters parameters;
555 parameters.codecs.push_back(kIsacCodec);
556 parameters.codecs.push_back(kPcmuCodec);
557 parameters.codecs.push_back(kOpusCodec);
558 parameters.codecs[2].params["stereo"] = "0";
559 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000560 EXPECT_TRUE(channel_->AddRecvStream(
561 cricket::StreamParams::CreateLegacy(kSsrc1)));
562 int channel_num2 = voe_.GetLastChannel();
563 webrtc::CodecInst opus;
564 engine_.FindWebRtcCodec(kOpusCodec, &opus);
565 // Even when stereo is off, recv codecs still specify channels = 2.
566 EXPECT_EQ(2, opus.channels);
567 EXPECT_EQ(111, opus.pltype);
568 EXPECT_STREQ("opus", opus.plname);
569 opus.pltype = 0;
570 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
571 EXPECT_EQ(111, opus.pltype);
572}
573
574// Test that we can decode OPUS with stereo = 1.
575TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
576 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200577 cricket::AudioRecvParameters parameters;
578 parameters.codecs.push_back(kIsacCodec);
579 parameters.codecs.push_back(kPcmuCodec);
580 parameters.codecs.push_back(kOpusCodec);
581 parameters.codecs[2].params["stereo"] = "1";
582 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000583 EXPECT_TRUE(channel_->AddRecvStream(
584 cricket::StreamParams::CreateLegacy(kSsrc1)));
585 int channel_num2 = voe_.GetLastChannel();
586 webrtc::CodecInst opus;
587 engine_.FindWebRtcCodec(kOpusCodec, &opus);
588 EXPECT_EQ(2, opus.channels);
589 EXPECT_EQ(111, opus.pltype);
590 EXPECT_STREQ("opus", opus.plname);
591 opus.pltype = 0;
592 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
593 EXPECT_EQ(111, opus.pltype);
594}
595
596// Test that changes to recv codecs are applied to all streams.
597TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
598 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200599 cricket::AudioRecvParameters parameters;
600 parameters.codecs.push_back(kIsacCodec);
601 parameters.codecs.push_back(kPcmuCodec);
602 parameters.codecs.push_back(kTelephoneEventCodec);
603 parameters.codecs[0].id = 106; // collide with existing telephone-event
604 parameters.codecs[2].id = 126;
605 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000606 EXPECT_TRUE(channel_->AddRecvStream(
607 cricket::StreamParams::CreateLegacy(kSsrc1)));
608 int channel_num2 = voe_.GetLastChannel();
609 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800610 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000611 gcodec.plfreq = 16000;
612 gcodec.channels = 1;
613 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
614 EXPECT_EQ(106, gcodec.pltype);
615 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800616 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617 gcodec.plfreq = 8000;
618 gcodec.channels = 1;
619 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
620 EXPECT_EQ(126, gcodec.pltype);
621 EXPECT_STREQ("telephone-event", gcodec.plname);
622}
623
624TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenberg1ac56142015-10-13 03:58:19 -0700625 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200626 cricket::AudioRecvParameters parameters;
627 parameters.codecs.push_back(kIsacCodec);
628 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200629 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000630
631 int channel_num2 = voe_.GetLastChannel();
632 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800633 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000634 gcodec.plfreq = 16000;
635 gcodec.channels = 1;
636 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
637 EXPECT_EQ(106, gcodec.pltype);
638 EXPECT_STREQ("ISAC", gcodec.plname);
639}
640
641// Test that we can apply the same set of codecs again while playing.
642TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700643 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200644 cricket::AudioRecvParameters parameters;
645 parameters.codecs.push_back(kIsacCodec);
646 parameters.codecs.push_back(kCn16000Codec);
647 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200649 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000650
651 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200652 parameters.codecs[0].id = 127;
653 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
654 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000655 EXPECT_TRUE(voe_.GetPlayout(channel_num));
656}
657
658// Test that we can add a codec while playing.
659TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700660 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200661 cricket::AudioRecvParameters parameters;
662 parameters.codecs.push_back(kIsacCodec);
663 parameters.codecs.push_back(kCn16000Codec);
664 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000665 EXPECT_TRUE(channel_->SetPlayout(true));
666
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200667 parameters.codecs.push_back(kOpusCodec);
668 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
669 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000670 EXPECT_TRUE(voe_.GetPlayout(channel_num));
671 webrtc::CodecInst gcodec;
672 EXPECT_TRUE(engine_.FindWebRtcCodec(kOpusCodec, &gcodec));
673 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
674}
675
676TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenberg1ac56142015-10-13 03:58:19 -0700677 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000678
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000679 // Test that when autobw is enabled, bitrate is kept as the default
680 // value. autobw is enabled for the following tests because the target
681 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000682
683 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000684 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000685
686 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000687 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000688
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000689 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000690 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000691}
692
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000693TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700694 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000695
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000696 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000697
698 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000699 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
700 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000701
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000702 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000703 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
704 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000705}
706
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000707TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700708 EXPECT_TRUE(SetupEngineWithSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000709
710 // Test that we can only set a maximum bitrate for a fixed-rate codec
711 // if it's bigger than the fixed rate.
712
713 // PCMU, fixed bitrate == 64000.
714 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
715 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
716 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
717 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
718 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
719 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
720 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
721}
722
723TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -0700724 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200725 const int kDesiredBitrate = 128000;
726 cricket::AudioSendParameters parameters;
727 parameters.codecs = engine_.codecs();
728 parameters.max_bandwidth_bps = kDesiredBitrate;
729 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000730
731 EXPECT_TRUE(channel_->AddSendStream(
732 cricket::StreamParams::CreateLegacy(kSsrc1)));
733
734 int channel_num = voe_.GetLastChannel();
735 webrtc::CodecInst codec;
736 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200737 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000738}
739
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000740// Test that bitrate cannot be set for CBR codecs.
741// Bitrate is ignored if it is higher than the fixed bitrate.
742// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000743TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenberg1ac56142015-10-13 03:58:19 -0700744 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000745
746 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200747 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
748 int channel_num = voe_.GetLastChannel();
749 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000750 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
751 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200752
753 send_parameters_.max_bandwidth_bps = 128000;
754 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000755 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
756 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200757
758 send_parameters_.max_bandwidth_bps = 128;
759 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000760 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
761 EXPECT_EQ(64000, codec.rate);
762}
763
764// Test that we apply codecs properly.
765TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenberg1ac56142015-10-13 03:58:19 -0700766 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200767 cricket::AudioSendParameters parameters;
768 parameters.codecs.push_back(kIsacCodec);
769 parameters.codecs.push_back(kPcmuCodec);
770 parameters.codecs.push_back(kRedCodec);
771 parameters.codecs[0].id = 96;
772 parameters.codecs[0].bitrate = 48000;
773 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000774 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200775 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000776 webrtc::CodecInst gcodec;
777 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
778 EXPECT_EQ(96, gcodec.pltype);
779 EXPECT_EQ(48000, gcodec.rate);
780 EXPECT_STREQ("ISAC", gcodec.plname);
781 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000782 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000783 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
784 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
785 EXPECT_EQ(106, voe_.GetSendTelephoneEventPayloadType(channel_num));
786}
787
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000788// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
789// to apply.
790TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenberg1ac56142015-10-13 03:58:19 -0700791 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200792 cricket::AudioSendParameters parameters;
793 parameters.codecs.push_back(kIsacCodec);
794 parameters.codecs.push_back(kPcmuCodec);
795 parameters.codecs.push_back(kRedCodec);
796 parameters.codecs[0].id = 96;
797 parameters.codecs[0].bitrate = 48000;
798 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000799 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
800 // Calling SetSendCodec again with same codec which is already set.
801 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200802 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000803 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
804}
805
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000806// Verify that G722 is set with 16000 samples per second to WebRTC.
807TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenberg1ac56142015-10-13 03:58:19 -0700808 EXPECT_TRUE(SetupEngineWithSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000809 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200810 cricket::AudioSendParameters parameters;
811 parameters.codecs.push_back(kG722CodecSdp);
812 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000813 webrtc::CodecInst gcodec;
814 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
815 EXPECT_STREQ("G722", gcodec.plname);
816 EXPECT_EQ(1, gcodec.channels);
817 EXPECT_EQ(16000, gcodec.plfreq);
818}
819
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000820// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000821TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenberg1ac56142015-10-13 03:58:19 -0700822 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200823 cricket::AudioSendParameters parameters;
824 parameters.codecs.push_back(kOpusCodec);
825 parameters.codecs[0].bitrate = 0;
826 parameters.codecs[0].clockrate = 50000;
827 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000828}
829
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000830// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000831TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700832 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200833 cricket::AudioSendParameters parameters;
834 parameters.codecs.push_back(kOpusCodec);
835 parameters.codecs[0].bitrate = 0;
836 parameters.codecs[0].channels = 0;
837 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000838}
839
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000840// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000841TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700842 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200843 cricket::AudioSendParameters parameters;
844 parameters.codecs.push_back(kOpusCodec);
845 parameters.codecs[0].bitrate = 0;
846 parameters.codecs[0].channels = 0;
847 parameters.codecs[0].params["stereo"] = "1";
848 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000849}
850
851// Test that if channel is 1 for opus and there's no stereo, we fail.
852TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700853 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200854 cricket::AudioSendParameters parameters;
855 parameters.codecs.push_back(kOpusCodec);
856 parameters.codecs[0].bitrate = 0;
857 parameters.codecs[0].channels = 1;
858 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000859}
860
861// Test that if channel is 1 for opus and stereo=0, we fail.
862TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700863 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200864 cricket::AudioSendParameters parameters;
865 parameters.codecs.push_back(kOpusCodec);
866 parameters.codecs[0].bitrate = 0;
867 parameters.codecs[0].channels = 1;
868 parameters.codecs[0].params["stereo"] = "0";
869 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000870}
871
872// Test that if channel is 1 for opus and stereo=1, we fail.
873TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700874 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200875 cricket::AudioSendParameters parameters;
876 parameters.codecs.push_back(kOpusCodec);
877 parameters.codecs[0].bitrate = 0;
878 parameters.codecs[0].channels = 1;
879 parameters.codecs[0].params["stereo"] = "1";
880 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000881}
882
883// Test that with bitrate=0 and no stereo,
884// channels and bitrate are 1 and 32000.
885TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700886 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000887 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200888 cricket::AudioSendParameters parameters;
889 parameters.codecs.push_back(kOpusCodec);
890 parameters.codecs[0].bitrate = 0;
891 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000892 webrtc::CodecInst gcodec;
893 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
894 EXPECT_STREQ("opus", gcodec.plname);
895 EXPECT_EQ(1, gcodec.channels);
896 EXPECT_EQ(32000, gcodec.rate);
897}
898
899// Test that with bitrate=0 and stereo=0,
900// channels and bitrate are 1 and 32000.
901TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700902 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000903 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200904 cricket::AudioSendParameters parameters;
905 parameters.codecs.push_back(kOpusCodec);
906 parameters.codecs[0].bitrate = 0;
907 parameters.codecs[0].params["stereo"] = "0";
908 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000909 webrtc::CodecInst gcodec;
910 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
911 EXPECT_STREQ("opus", gcodec.plname);
912 EXPECT_EQ(1, gcodec.channels);
913 EXPECT_EQ(32000, gcodec.rate);
914}
915
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000916// Test that with bitrate=invalid and stereo=0,
917// channels and bitrate are 1 and 32000.
918TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700919 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000920 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200921 cricket::AudioSendParameters parameters;
922 parameters.codecs.push_back(kOpusCodec);
923 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000924 webrtc::CodecInst gcodec;
925
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000926 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200927 parameters.codecs[0].bitrate = 5999;
928 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000929 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
930 EXPECT_STREQ("opus", gcodec.plname);
931 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000932 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000933
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200934 parameters.codecs[0].bitrate = 510001;
935 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000936 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
937 EXPECT_STREQ("opus", gcodec.plname);
938 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000939 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000940}
941
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000942// Test that with bitrate=0 and stereo=1,
943// channels and bitrate are 2 and 64000.
944TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700945 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000946 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200947 cricket::AudioSendParameters parameters;
948 parameters.codecs.push_back(kOpusCodec);
949 parameters.codecs[0].bitrate = 0;
950 parameters.codecs[0].params["stereo"] = "1";
951 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000952 webrtc::CodecInst gcodec;
953 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
954 EXPECT_STREQ("opus", gcodec.plname);
955 EXPECT_EQ(2, gcodec.channels);
956 EXPECT_EQ(64000, gcodec.rate);
957}
958
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000959// Test that with bitrate=invalid and stereo=1,
960// channels and bitrate are 2 and 64000.
961TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700962 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000963 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200964 cricket::AudioSendParameters parameters;
965 parameters.codecs.push_back(kOpusCodec);
966 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000967 webrtc::CodecInst gcodec;
968
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000969 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200970 parameters.codecs[0].bitrate = 5999;
971 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000972 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
973 EXPECT_STREQ("opus", gcodec.plname);
974 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000975 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000976
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200977 parameters.codecs[0].bitrate = 510001;
978 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000979 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
980 EXPECT_STREQ("opus", gcodec.plname);
981 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000982 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000983}
984
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000985// Test that with bitrate=N and stereo unset,
986// channels and bitrate are 1 and N.
987TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700988 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000989 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200990 cricket::AudioSendParameters parameters;
991 parameters.codecs.push_back(kOpusCodec);
992 parameters.codecs[0].bitrate = 96000;
993 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000994 webrtc::CodecInst gcodec;
995 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
996 EXPECT_EQ(111, gcodec.pltype);
997 EXPECT_EQ(96000, gcodec.rate);
998 EXPECT_STREQ("opus", gcodec.plname);
999 EXPECT_EQ(1, gcodec.channels);
1000 EXPECT_EQ(48000, gcodec.plfreq);
1001}
1002
1003// Test that with bitrate=N and stereo=0,
1004// channels and bitrate are 1 and N.
1005TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001006 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001007 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001008 cricket::AudioSendParameters parameters;
1009 parameters.codecs.push_back(kOpusCodec);
1010 parameters.codecs[0].bitrate = 30000;
1011 parameters.codecs[0].params["stereo"] = "0";
1012 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001013 webrtc::CodecInst gcodec;
1014 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1015 EXPECT_EQ(1, gcodec.channels);
1016 EXPECT_EQ(30000, gcodec.rate);
1017 EXPECT_STREQ("opus", gcodec.plname);
1018}
1019
1020// Test that with bitrate=N and without any parameters,
1021// channels and bitrate are 1 and N.
1022TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenberg1ac56142015-10-13 03:58:19 -07001023 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001024 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001025 cricket::AudioSendParameters parameters;
1026 parameters.codecs.push_back(kOpusCodec);
1027 parameters.codecs[0].bitrate = 30000;
1028 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001029 webrtc::CodecInst gcodec;
1030 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1031 EXPECT_EQ(1, gcodec.channels);
1032 EXPECT_EQ(30000, gcodec.rate);
1033 EXPECT_STREQ("opus", gcodec.plname);
1034}
1035
1036// Test that with bitrate=N and stereo=1,
1037// channels and bitrate are 2 and N.
1038TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001039 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001040 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001041 cricket::AudioSendParameters parameters;
1042 parameters.codecs.push_back(kOpusCodec);
1043 parameters.codecs[0].bitrate = 30000;
1044 parameters.codecs[0].params["stereo"] = "1";
1045 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001046 webrtc::CodecInst gcodec;
1047 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1048 EXPECT_EQ(2, gcodec.channels);
1049 EXPECT_EQ(30000, gcodec.rate);
1050 EXPECT_STREQ("opus", gcodec.plname);
1051}
1052
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001053// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1054// Also test that the "maxaveragebitrate" can't be set to values outside the
1055// range of 6000 and 510000
1056TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001057 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001058 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001059 cricket::AudioSendParameters parameters;
1060 parameters.codecs.push_back(kOpusCodec);
1061 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001062 webrtc::CodecInst gcodec;
1063
1064 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001065 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1066 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001067 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001068 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001069
1070 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001071 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1072 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001073 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001074 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001075
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001076 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1077 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001078 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1079 EXPECT_EQ(200000, gcodec.rate);
1080}
1081
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001082// Test that we can enable NACK with opus as caller.
1083TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001084 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001085 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001086 cricket::AudioSendParameters parameters;
1087 parameters.codecs.push_back(kOpusCodec);
1088 parameters.codecs[0].AddFeedbackParam(
1089 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1090 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001091 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001092 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001093 EXPECT_TRUE(voe_.GetNACK(channel_num));
1094}
1095
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001096// Test that we can enable NACK with opus as callee.
1097TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenberg0a617e22015-10-20 15:49:38 -07001098 EXPECT_TRUE(SetupEngineWithRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001099 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001100 cricket::AudioSendParameters parameters;
1101 parameters.codecs.push_back(kOpusCodec);
1102 parameters.codecs[0].AddFeedbackParam(
1103 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1104 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001105 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001106 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001107 EXPECT_FALSE(voe_.GetNACK(channel_num));
1108
1109 EXPECT_TRUE(channel_->AddSendStream(
1110 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001111 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001112}
1113
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001114// Test that we can enable NACK on receive streams.
1115TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001116 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001117 int channel_num1 = voe_.GetLastChannel();
1118 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1119 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001120 cricket::AudioSendParameters parameters;
1121 parameters.codecs.push_back(kOpusCodec);
1122 parameters.codecs[0].AddFeedbackParam(
1123 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1124 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001125 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1126 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001127 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001128 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1129 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1130}
1131
1132// Test that we can disable NACK.
1133TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001134 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001135 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001136 cricket::AudioSendParameters parameters;
1137 parameters.codecs.push_back(kOpusCodec);
1138 parameters.codecs[0].AddFeedbackParam(
1139 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1140 cricket::kParamValueEmpty));
1141 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001142 EXPECT_TRUE(voe_.GetNACK(channel_num));
1143
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001144 parameters.codecs.clear();
1145 parameters.codecs.push_back(kOpusCodec);
1146 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001147 EXPECT_FALSE(voe_.GetNACK(channel_num));
1148}
1149
1150// Test that we can disable NACK on receive streams.
1151TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001152 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001153 int channel_num1 = voe_.GetLastChannel();
1154 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1155 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001156 cricket::AudioSendParameters parameters;
1157 parameters.codecs.push_back(kOpusCodec);
1158 parameters.codecs[0].AddFeedbackParam(
1159 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1160 cricket::kParamValueEmpty));
1161 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001162 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1163 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1164
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001165 parameters.codecs.clear();
1166 parameters.codecs.push_back(kOpusCodec);
1167 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001168 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1169 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1170}
1171
1172// Test that NACK is enabled on a new receive stream.
1173TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001174 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001175 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001176 cricket::AudioSendParameters parameters;
1177 parameters.codecs.push_back(kIsacCodec);
1178 parameters.codecs.push_back(kCn16000Codec);
1179 parameters.codecs[0].AddFeedbackParam(
1180 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1181 cricket::kParamValueEmpty));
1182 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001183 EXPECT_TRUE(voe_.GetNACK(channel_num));
1184
1185 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1186 channel_num = voe_.GetLastChannel();
1187 EXPECT_TRUE(voe_.GetNACK(channel_num));
1188 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1189 channel_num = voe_.GetLastChannel();
1190 EXPECT_TRUE(voe_.GetNACK(channel_num));
1191}
1192
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001193// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001194TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenberg1ac56142015-10-13 03:58:19 -07001195 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001196 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001197 cricket::AudioSendParameters parameters;
1198 parameters.codecs.push_back(kOpusCodec);
1199 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001200 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1201}
1202
1203// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001204TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001205 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001206 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001207 cricket::AudioSendParameters parameters;
1208 parameters.codecs.push_back(kOpusCodec);
1209 parameters.codecs[0].bitrate = 0;
1210 parameters.codecs[0].params["useinbandfec"] = "0";
1211 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001212 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1213 webrtc::CodecInst gcodec;
1214 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1215 EXPECT_STREQ("opus", gcodec.plname);
1216 EXPECT_EQ(1, gcodec.channels);
1217 EXPECT_EQ(32000, gcodec.rate);
1218}
1219
1220// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001221TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001222 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001223 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001224 cricket::AudioSendParameters parameters;
1225 parameters.codecs.push_back(kOpusCodec);
1226 parameters.codecs[0].bitrate = 0;
1227 parameters.codecs[0].params["useinbandfec"] = "1";
1228 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001229 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1230 webrtc::CodecInst gcodec;
1231 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1232 EXPECT_STREQ("opus", gcodec.plname);
1233 EXPECT_EQ(1, gcodec.channels);
1234 EXPECT_EQ(32000, gcodec.rate);
1235}
1236
1237// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001238TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001239 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001240 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001241 cricket::AudioSendParameters parameters;
1242 parameters.codecs.push_back(kOpusCodec);
1243 parameters.codecs[0].bitrate = 0;
1244 parameters.codecs[0].params["stereo"] = "1";
1245 parameters.codecs[0].params["useinbandfec"] = "1";
1246 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001247 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1248 webrtc::CodecInst gcodec;
1249 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1250 EXPECT_STREQ("opus", gcodec.plname);
1251 EXPECT_EQ(2, gcodec.channels);
1252 EXPECT_EQ(64000, gcodec.rate);
1253}
1254
1255// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001256TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001257 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001258 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001259 cricket::AudioSendParameters parameters;
1260 parameters.codecs.push_back(kIsacCodec);
1261 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001262 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1263}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001264
1265// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1266TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001267 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001268 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001269 cricket::AudioSendParameters parameters;
1270 parameters.codecs.push_back(kIsacCodec);
1271 parameters.codecs[0].params["useinbandfec"] = "1";
1272 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001273 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1274}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001275
1276// Test that Opus FEC status can be changed.
1277TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenberg1ac56142015-10-13 03:58:19 -07001278 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001279 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001280 cricket::AudioSendParameters parameters;
1281 parameters.codecs.push_back(kOpusCodec);
1282 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001283 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001284 parameters.codecs[0].params["useinbandfec"] = "1";
1285 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001286 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1287}
1288
1289// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1290TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenberg1ac56142015-10-13 03:58:19 -07001291 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001292 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001293 cricket::AudioSendParameters parameters;
1294 parameters.codecs.push_back(kOpusCodec);
1295 parameters.codecs[0].bitrate = 0;
1296 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1297 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001298 EXPECT_EQ(cricket::kOpusBandwidthNb,
1299 voe_.GetMaxEncodingBandwidth(channel_num));
1300 webrtc::CodecInst gcodec;
1301 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1302 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001303
1304 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001305 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1306 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001307 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1308 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001309}
1310
1311// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1312TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenberg1ac56142015-10-13 03:58:19 -07001313 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001314 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001315 cricket::AudioSendParameters parameters;
1316 parameters.codecs.push_back(kOpusCodec);
1317 parameters.codecs[0].bitrate = 0;
1318 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1319 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001320 EXPECT_EQ(cricket::kOpusBandwidthMb,
1321 voe_.GetMaxEncodingBandwidth(channel_num));
1322 webrtc::CodecInst gcodec;
1323 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1324 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001325
1326 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001327 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1328 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001329 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1330 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001331}
1332
1333// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1334TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenberg1ac56142015-10-13 03:58:19 -07001335 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001336 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001337 cricket::AudioSendParameters parameters;
1338 parameters.codecs.push_back(kOpusCodec);
1339 parameters.codecs[0].bitrate = 0;
1340 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1341 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001342 EXPECT_EQ(cricket::kOpusBandwidthWb,
1343 voe_.GetMaxEncodingBandwidth(channel_num));
1344 webrtc::CodecInst gcodec;
1345 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1346 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001347
1348 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001349 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1350 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001351 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1352 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001353}
1354
1355// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1356TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenberg1ac56142015-10-13 03:58:19 -07001357 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001358 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001359 cricket::AudioSendParameters parameters;
1360 parameters.codecs.push_back(kOpusCodec);
1361 parameters.codecs[0].bitrate = 0;
1362 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1363 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001364 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1365 voe_.GetMaxEncodingBandwidth(channel_num));
1366 webrtc::CodecInst gcodec;
1367 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1368 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001369
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001370 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001371 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1372 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001373 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1374 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001375}
1376
1377// Test 24000 < maxplaybackrate triggers Opus full band mode.
1378TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenberg1ac56142015-10-13 03:58:19 -07001379 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001380 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001381 cricket::AudioSendParameters parameters;
1382 parameters.codecs.push_back(kOpusCodec);
1383 parameters.codecs[0].bitrate = 0;
1384 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1385 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001386 EXPECT_EQ(cricket::kOpusBandwidthFb,
1387 voe_.GetMaxEncodingBandwidth(channel_num));
1388 webrtc::CodecInst gcodec;
1389 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1390 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001391
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001392 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001393 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1394 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001395 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1396 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001397}
1398
1399// Test Opus that without maxplaybackrate, default playback rate is used.
1400TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001401 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001402 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001403 cricket::AudioSendParameters parameters;
1404 parameters.codecs.push_back(kOpusCodec);
1405 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001406 EXPECT_EQ(cricket::kOpusBandwidthFb,
1407 voe_.GetMaxEncodingBandwidth(channel_num));
1408}
1409
1410// Test the with non-Opus, maxplaybackrate has no effect.
1411TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001412 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001413 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001414 cricket::AudioSendParameters parameters;
1415 parameters.codecs.push_back(kIsacCodec);
1416 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1417 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001418 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1419}
1420
1421// Test maxplaybackrate can be set on two streams.
1422TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001423 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001424 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001425 cricket::AudioSendParameters parameters;
1426 parameters.codecs.push_back(kOpusCodec);
1427 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001428 // Default bandwidth is 24000.
1429 EXPECT_EQ(cricket::kOpusBandwidthFb,
1430 voe_.GetMaxEncodingBandwidth(channel_num));
1431
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001432 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001433
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001434 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001435 EXPECT_EQ(cricket::kOpusBandwidthNb,
1436 voe_.GetMaxEncodingBandwidth(channel_num));
1437
1438 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1439 channel_num = voe_.GetLastChannel();
1440 EXPECT_EQ(cricket::kOpusBandwidthNb,
1441 voe_.GetMaxEncodingBandwidth(channel_num));
1442}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001443
Minyue Li7100dcd2015-03-27 05:05:59 +01001444// Test that with usedtx=0, Opus DTX is off.
1445TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001446 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001447 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001448 cricket::AudioSendParameters parameters;
1449 parameters.codecs.push_back(kOpusCodec);
1450 parameters.codecs[0].params["usedtx"] = "0";
1451 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001452 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1453}
1454
1455// Test that with usedtx=1, Opus DTX is on.
1456TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001457 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001458 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001459 cricket::AudioSendParameters parameters;
1460 parameters.codecs.push_back(kOpusCodec);
1461 parameters.codecs[0].params["usedtx"] = "1";
1462 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001463 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1464 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1465}
1466
1467// Test that usedtx=1 works with stereo Opus.
1468TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001469 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001470 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001471 cricket::AudioSendParameters parameters;
1472 parameters.codecs.push_back(kOpusCodec);
1473 parameters.codecs[0].params["usedtx"] = "1";
1474 parameters.codecs[0].params["stereo"] = "1";
1475 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001476 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1477 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1478}
1479
1480// Test that usedtx=1 does not work with non Opus.
1481TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001482 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001483 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001484 cricket::AudioSendParameters parameters;
1485 parameters.codecs.push_back(kIsacCodec);
1486 parameters.codecs[0].params["usedtx"] = "1";
1487 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001488 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1489}
1490
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001491// Test that we can switch back and forth between Opus and ISAC with CN.
1492TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenberg1ac56142015-10-13 03:58:19 -07001493 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001494 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001495 cricket::AudioSendParameters opus_parameters;
1496 opus_parameters.codecs.push_back(kOpusCodec);
1497 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001498 webrtc::CodecInst gcodec;
1499 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001500 EXPECT_EQ(111, gcodec.pltype);
1501 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001502
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001503 cricket::AudioSendParameters isac_parameters;
1504 isac_parameters.codecs.push_back(kIsacCodec);
1505 isac_parameters.codecs.push_back(kCn16000Codec);
1506 isac_parameters.codecs.push_back(kOpusCodec);
1507 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001508 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1509 EXPECT_EQ(103, gcodec.pltype);
1510 EXPECT_STREQ("ISAC", gcodec.plname);
1511
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001512 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001513 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001514 EXPECT_EQ(111, gcodec.pltype);
1515 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001516}
1517
1518// Test that we handle various ways of specifying bitrate.
1519TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001520 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001521 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001522 cricket::AudioSendParameters parameters;
1523 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1524 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001525 webrtc::CodecInst gcodec;
1526 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1527 EXPECT_EQ(103, gcodec.pltype);
1528 EXPECT_STREQ("ISAC", gcodec.plname);
1529 EXPECT_EQ(32000, gcodec.rate);
1530
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001531 parameters.codecs[0].bitrate = 0; // bitrate == default
1532 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001533 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1534 EXPECT_EQ(103, gcodec.pltype);
1535 EXPECT_STREQ("ISAC", gcodec.plname);
1536 EXPECT_EQ(-1, gcodec.rate);
1537
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001538 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1539 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001540 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1541 EXPECT_EQ(103, gcodec.pltype);
1542 EXPECT_STREQ("ISAC", gcodec.plname);
1543 EXPECT_EQ(28000, gcodec.rate);
1544
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001545 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1546 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001547 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1548 EXPECT_EQ(0, gcodec.pltype);
1549 EXPECT_STREQ("PCMU", gcodec.plname);
1550 EXPECT_EQ(64000, gcodec.rate);
1551
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001552 parameters.codecs[0].bitrate = 0; // bitrate == default
1553 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001554 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1555 EXPECT_EQ(0, gcodec.pltype);
1556 EXPECT_STREQ("PCMU", gcodec.plname);
1557 EXPECT_EQ(64000, gcodec.rate);
1558
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001559 parameters.codecs[0] = kOpusCodec;
1560 parameters.codecs[0].bitrate = 0; // bitrate == default
1561 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001562 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1563 EXPECT_EQ(111, gcodec.pltype);
1564 EXPECT_STREQ("opus", gcodec.plname);
1565 EXPECT_EQ(32000, gcodec.rate);
1566}
1567
Brave Yao5225dd82015-03-26 07:39:19 +08001568// Test that we could set packet size specified in kCodecParamPTime.
1569TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenberg1ac56142015-10-13 03:58:19 -07001570 EXPECT_TRUE(SetupEngineWithSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001571 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001572 cricket::AudioSendParameters parameters;
1573 parameters.codecs.push_back(kOpusCodec);
1574 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1575 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001576 webrtc::CodecInst gcodec;
1577 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1578 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1579
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001580 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1581 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001582 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1583 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1584
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001585 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1586 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001587 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1588 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1589
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001590 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1591 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1592 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001593 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1594 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1595
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001596 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1597 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1598 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001599 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1600 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1601}
1602
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001603// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001604TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenberg1ac56142015-10-13 03:58:19 -07001605 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001606 cricket::AudioSendParameters parameters;
1607 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001608}
1609
1610// Test that we can set send codecs even with telephone-event codec as the first
1611// one on the list.
1612TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001613 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001614 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001615 cricket::AudioSendParameters parameters;
1616 parameters.codecs.push_back(kTelephoneEventCodec);
1617 parameters.codecs.push_back(kIsacCodec);
1618 parameters.codecs.push_back(kPcmuCodec);
1619 parameters.codecs[0].id = 98; // DTMF
1620 parameters.codecs[1].id = 96;
1621 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001622 webrtc::CodecInst gcodec;
1623 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001624 EXPECT_EQ(96, gcodec.pltype);
1625 EXPECT_STREQ("ISAC", gcodec.plname);
1626 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1627}
1628
1629// Test that we can set send codecs even with CN codec as the first
1630// one on the list.
1631TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001632 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001633 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001634 cricket::AudioSendParameters parameters;
1635 parameters.codecs.push_back(kCn16000Codec);
1636 parameters.codecs.push_back(kIsacCodec);
1637 parameters.codecs.push_back(kPcmuCodec);
1638 parameters.codecs[0].id = 98; // wideband CN
1639 parameters.codecs[1].id = 96;
1640 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001641 webrtc::CodecInst gcodec;
1642 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1643 EXPECT_EQ(96, gcodec.pltype);
1644 EXPECT_STREQ("ISAC", gcodec.plname);
1645 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001646}
1647
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001648// Test that we set VAD and DTMF types correctly as caller.
1649TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001650 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001651 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001652 cricket::AudioSendParameters parameters;
1653 parameters.codecs.push_back(kIsacCodec);
1654 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001655 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001656 parameters.codecs.push_back(kCn16000Codec);
1657 parameters.codecs.push_back(kCn8000Codec);
1658 parameters.codecs.push_back(kTelephoneEventCodec);
1659 parameters.codecs.push_back(kRedCodec);
1660 parameters.codecs[0].id = 96;
1661 parameters.codecs[2].id = 97; // wideband CN
1662 parameters.codecs[4].id = 98; // DTMF
1663 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001664 webrtc::CodecInst gcodec;
1665 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1666 EXPECT_EQ(96, gcodec.pltype);
1667 EXPECT_STREQ("ISAC", gcodec.plname);
1668 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001669 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001670 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1671 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1672 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1673}
1674
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001675// Test that we set VAD and DTMF types correctly as callee.
1676TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001677 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001678 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001679 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001680
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001681 cricket::AudioSendParameters parameters;
1682 parameters.codecs.push_back(kIsacCodec);
1683 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001684 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001685 parameters.codecs.push_back(kCn16000Codec);
1686 parameters.codecs.push_back(kCn8000Codec);
1687 parameters.codecs.push_back(kTelephoneEventCodec);
1688 parameters.codecs.push_back(kRedCodec);
1689 parameters.codecs[0].id = 96;
1690 parameters.codecs[2].id = 97; // wideband CN
1691 parameters.codecs[4].id = 98; // DTMF
1692 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001693 EXPECT_TRUE(channel_->AddSendStream(
1694 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001695 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001696
1697 webrtc::CodecInst gcodec;
1698 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1699 EXPECT_EQ(96, gcodec.pltype);
1700 EXPECT_STREQ("ISAC", gcodec.plname);
1701 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001702 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001703 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1704 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1705 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1706}
1707
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001708// Test that we only apply VAD if we have a CN codec that matches the
1709// send codec clockrate.
1710TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenberg1ac56142015-10-13 03:58:19 -07001711 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001712 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001713 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001714 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001715 parameters.codecs.push_back(kIsacCodec);
1716 parameters.codecs.push_back(kCn16000Codec);
1717 parameters.codecs[1].id = 97;
1718 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001719 webrtc::CodecInst gcodec;
1720 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1721 EXPECT_STREQ("ISAC", gcodec.plname);
1722 EXPECT_TRUE(voe_.GetVAD(channel_num));
1723 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1724 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001725 parameters.codecs[0] = kPcmuCodec;
1726 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001727 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1728 EXPECT_STREQ("PCMU", gcodec.plname);
1729 EXPECT_FALSE(voe_.GetVAD(channel_num));
1730 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001731 parameters.codecs[1] = kCn8000Codec;
1732 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001733 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1734 EXPECT_STREQ("PCMU", gcodec.plname);
1735 EXPECT_TRUE(voe_.GetVAD(channel_num));
1736 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001737 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001738 parameters.codecs[0] = kIsacCodec;
1739 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001740 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1741 EXPECT_STREQ("ISAC", gcodec.plname);
1742 EXPECT_FALSE(voe_.GetVAD(channel_num));
1743}
1744
1745// Test that we perform case-insensitive matching of codec names.
1746TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenberg1ac56142015-10-13 03:58:19 -07001747 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001748 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001749 cricket::AudioSendParameters parameters;
1750 parameters.codecs.push_back(kIsacCodec);
1751 parameters.codecs.push_back(kPcmuCodec);
1752 parameters.codecs.push_back(kCn16000Codec);
1753 parameters.codecs.push_back(kCn8000Codec);
1754 parameters.codecs.push_back(kTelephoneEventCodec);
1755 parameters.codecs.push_back(kRedCodec);
1756 parameters.codecs[0].name = "iSaC";
1757 parameters.codecs[0].id = 96;
1758 parameters.codecs[2].id = 97; // wideband CN
1759 parameters.codecs[4].id = 98; // DTMF
1760 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001761 webrtc::CodecInst gcodec;
1762 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1763 EXPECT_EQ(96, gcodec.pltype);
1764 EXPECT_STREQ("ISAC", gcodec.plname);
1765 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001766 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001767 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1768 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1769 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1770}
1771
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001772// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001773TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001774 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001775 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001776 cricket::AudioSendParameters parameters;
1777 parameters.codecs.push_back(kRedCodec);
1778 parameters.codecs.push_back(kIsacCodec);
1779 parameters.codecs.push_back(kPcmuCodec);
1780 parameters.codecs[0].id = 127;
1781 parameters.codecs[0].params[""] = "96/96";
1782 parameters.codecs[1].id = 96;
1783 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001784 webrtc::CodecInst gcodec;
1785 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1786 EXPECT_EQ(96, gcodec.pltype);
1787 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001788 EXPECT_TRUE(voe_.GetRED(channel_num));
1789 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001790}
1791
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001792// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001793TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001794 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001795 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001796 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001797
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001798 cricket::AudioSendParameters parameters;
1799 parameters.codecs.push_back(kRedCodec);
1800 parameters.codecs.push_back(kIsacCodec);
1801 parameters.codecs.push_back(kPcmuCodec);
1802 parameters.codecs[0].id = 127;
1803 parameters.codecs[0].params[""] = "96/96";
1804 parameters.codecs[1].id = 96;
1805 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001806 EXPECT_TRUE(channel_->AddSendStream(
1807 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001808 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001809 webrtc::CodecInst gcodec;
1810 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1811 EXPECT_EQ(96, gcodec.pltype);
1812 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001813 EXPECT_TRUE(voe_.GetRED(channel_num));
1814 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001815}
1816
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001817// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001818TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenberg1ac56142015-10-13 03:58:19 -07001819 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001820 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001821 cricket::AudioSendParameters parameters;
1822 parameters.codecs.push_back(kRedCodec);
1823 parameters.codecs.push_back(kIsacCodec);
1824 parameters.codecs.push_back(kPcmuCodec);
1825 parameters.codecs[0].id = 127;
1826 parameters.codecs[1].id = 96;
1827 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001828 webrtc::CodecInst gcodec;
1829 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1830 EXPECT_EQ(96, gcodec.pltype);
1831 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001832 EXPECT_TRUE(voe_.GetRED(channel_num));
1833 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001834}
1835
1836// Test that we ignore RED if the parameters aren't named the way we expect.
1837TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001838 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001839 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001840 cricket::AudioSendParameters parameters;
1841 parameters.codecs.push_back(kRedCodec);
1842 parameters.codecs.push_back(kIsacCodec);
1843 parameters.codecs.push_back(kPcmuCodec);
1844 parameters.codecs[0].id = 127;
1845 parameters.codecs[0].params["ABC"] = "96/96";
1846 parameters.codecs[1].id = 96;
1847 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001848 webrtc::CodecInst gcodec;
1849 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1850 EXPECT_EQ(96, gcodec.pltype);
1851 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001852 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001853}
1854
1855// Test that we ignore RED if it uses different primary/secondary encoding.
1856TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001857 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001858 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001859 cricket::AudioSendParameters parameters;
1860 parameters.codecs.push_back(kRedCodec);
1861 parameters.codecs.push_back(kIsacCodec);
1862 parameters.codecs.push_back(kPcmuCodec);
1863 parameters.codecs[0].id = 127;
1864 parameters.codecs[0].params[""] = "96/0";
1865 parameters.codecs[1].id = 96;
1866 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001867 webrtc::CodecInst gcodec;
1868 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1869 EXPECT_EQ(96, gcodec.pltype);
1870 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001871 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001872}
1873
1874// Test that we ignore RED if it uses more than 2 encodings.
1875TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001876 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001877 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001878 cricket::AudioSendParameters parameters;
1879 parameters.codecs.push_back(kRedCodec);
1880 parameters.codecs.push_back(kIsacCodec);
1881 parameters.codecs.push_back(kPcmuCodec);
1882 parameters.codecs[0].id = 127;
1883 parameters.codecs[0].params[""] = "96/96/96";
1884 parameters.codecs[1].id = 96;
1885 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001886 webrtc::CodecInst gcodec;
1887 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1888 EXPECT_EQ(96, gcodec.pltype);
1889 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001890 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001891}
1892
1893// Test that we ignore RED if it has bogus codec ids.
1894TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001895 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001896 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001897 cricket::AudioSendParameters parameters;
1898 parameters.codecs.push_back(kRedCodec);
1899 parameters.codecs.push_back(kIsacCodec);
1900 parameters.codecs.push_back(kPcmuCodec);
1901 parameters.codecs[0].id = 127;
1902 parameters.codecs[0].params[""] = "ABC/ABC";
1903 parameters.codecs[1].id = 96;
1904 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001905 webrtc::CodecInst gcodec;
1906 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1907 EXPECT_EQ(96, gcodec.pltype);
1908 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001909 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001910}
1911
1912// Test that we ignore RED if it refers to a codec that is not present.
1913TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001914 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001915 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001916 cricket::AudioSendParameters parameters;
1917 parameters.codecs.push_back(kRedCodec);
1918 parameters.codecs.push_back(kIsacCodec);
1919 parameters.codecs.push_back(kPcmuCodec);
1920 parameters.codecs[0].id = 127;
1921 parameters.codecs[0].params[""] = "97/97";
1922 parameters.codecs[1].id = 96;
1923 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001924 webrtc::CodecInst gcodec;
1925 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1926 EXPECT_EQ(96, gcodec.pltype);
1927 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001928 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001929}
1930
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001931// Test support for audio level header extension.
1932TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1933 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001934}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001935TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1936 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1937}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001938
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001939// Test support for absolute send time header extension.
1940TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1941 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1942}
1943TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1944 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001945}
1946
solenberg1ac56142015-10-13 03:58:19 -07001947// Test that we can create a channel and start sending on it.
1948TEST_F(WebRtcVoiceEngineTestFake, Send) {
1949 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001950 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001951 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001952 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1953 EXPECT_TRUE(voe_.GetSend(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001954 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1955 EXPECT_FALSE(voe_.GetSend(channel_num));
solenberg1ac56142015-10-13 03:58:19 -07001956}
1957
1958// Test that we can create a channel and start playing out on it.
1959TEST_F(WebRtcVoiceEngineTestFake, Playout) {
1960 EXPECT_TRUE(SetupEngineWithRecvStream());
1961 int channel_num = voe_.GetLastChannel();
1962 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
1963 EXPECT_TRUE(channel_->SetPlayout(true));
1964 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001965 EXPECT_TRUE(channel_->SetPlayout(false));
1966 EXPECT_FALSE(voe_.GetPlayout(channel_num));
1967}
1968
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001969// Test that we can add and remove send streams.
1970TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
1971 SetupForMultiSendStream();
1972
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001973 // Set the global state for sending.
1974 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1975
solenbergc96df772015-10-21 13:01:53 -07001976 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001977 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07001978 cricket::StreamParams::CreateLegacy(ssrc)));
1979 EXPECT_NE(nullptr, call_.GetAudioSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001980
1981 // Verify that we are in a sending state for all the created streams.
solenbergc96df772015-10-21 13:01:53 -07001982 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001983 EXPECT_TRUE(voe_.GetSend(channel_num));
1984 }
tfarina5237aaf2015-11-10 23:44:30 -08001985 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001986
solenbergc96df772015-10-21 13:01:53 -07001987 // Delete the send streams.
1988 for (uint32_t ssrc : kSsrcs4) {
1989 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
1990 EXPECT_EQ(nullptr, call_.GetAudioSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001991 // Stream should already be deleted.
solenbergc96df772015-10-21 13:01:53 -07001992 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
1993 EXPECT_EQ(-1, voe_.GetChannelFromLocalSsrc(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001994 }
solenbergc96df772015-10-21 13:01:53 -07001995 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001996}
1997
1998// Test SetSendCodecs correctly configure the codecs in all send streams.
1999TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2000 SetupForMultiSendStream();
2001
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002002 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002003 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002004 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002005 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002006 }
2007
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002008 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002009 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002010 parameters.codecs.push_back(kIsacCodec);
2011 parameters.codecs.push_back(kCn16000Codec);
2012 parameters.codecs[1].id = 97;
2013 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002014
2015 // Verify ISAC and VAD are corrected configured on all send channels.
2016 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002017 for (uint32_t ssrc : kSsrcs4) {
2018 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002019 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2020 EXPECT_STREQ("ISAC", gcodec.plname);
2021 EXPECT_TRUE(voe_.GetVAD(channel_num));
2022 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2023 }
2024
2025 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002026 parameters.codecs[0] = kPcmuCodec;
2027 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002028 for (uint32_t ssrc : kSsrcs4) {
2029 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002030 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2031 EXPECT_STREQ("PCMU", gcodec.plname);
2032 EXPECT_FALSE(voe_.GetVAD(channel_num));
2033 }
2034}
2035
2036// Test we can SetSend on all send streams correctly.
2037TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2038 SetupForMultiSendStream();
2039
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002040 // Create the send channels and they should be a SEND_NOTHING date.
solenbergc96df772015-10-21 13:01:53 -07002041 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002042 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002043 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002044 int channel_num = voe_.GetLastChannel();
2045 EXPECT_FALSE(voe_.GetSend(channel_num));
2046 }
2047
2048 // Set the global state for starting sending.
2049 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
solenbergc96df772015-10-21 13:01:53 -07002050 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002051 // Verify that we are in a sending state for all the send streams.
solenbergc96df772015-10-21 13:01:53 -07002052 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002053 EXPECT_TRUE(voe_.GetSend(channel_num));
2054 }
2055
2056 // Set the global state for stopping sending.
2057 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
solenbergc96df772015-10-21 13:01:53 -07002058 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002059 // Verify that we are in a stop state for all the send streams.
solenbergc96df772015-10-21 13:01:53 -07002060 int channel_num = voe_.GetChannelFromLocalSsrc(ssrc);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002061 EXPECT_FALSE(voe_.GetSend(channel_num));
2062 }
2063}
2064
2065// Test we can set the correct statistics on all send streams.
2066TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2067 SetupForMultiSendStream();
2068
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002069 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002070 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002071 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002072 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002073 }
solenberg85a04962015-10-27 03:35:21 -07002074 SetAudioSendStreamStats();
2075
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002076 // Create a receive stream to check that none of the send streams end up in
2077 // the receive stream stats.
2078 EXPECT_TRUE(channel_->AddRecvStream(
2079 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002080 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002081 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2082 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002083
solenberg85a04962015-10-27 03:35:21 -07002084 // Check stats for the added streams.
2085 {
2086 cricket::VoiceMediaInfo info;
2087 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002088
solenberg85a04962015-10-27 03:35:21 -07002089 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002090 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002091 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002092 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002093 }
2094
2095 // We have added one receive stream. We should see empty stats.
2096 EXPECT_EQ(info.receivers.size(), 1u);
2097 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002098 }
solenberg1ac56142015-10-13 03:58:19 -07002099
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002100 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002101 {
2102 cricket::VoiceMediaInfo info;
2103 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2104 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002105 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002106 EXPECT_EQ(0u, info.receivers.size());
2107 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002108
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002109 // Deliver a new packet - a default receive stream should be created and we
2110 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002111 {
2112 cricket::VoiceMediaInfo info;
2113 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2114 SetAudioReceiveStreamStats();
2115 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002116 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002117 EXPECT_EQ(1u, info.receivers.size());
2118 VerifyVoiceReceiverInfo(info.receivers[0]);
2119 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002120}
2121
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002122// Test that we can add and remove receive streams, and do proper send/playout.
2123// We can receive on multiple streams while sending one stream.
2124TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002125 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002126 int channel_num1 = voe_.GetLastChannel();
2127
solenberg1ac56142015-10-13 03:58:19 -07002128 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002129 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002130 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002131 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002132
solenberg1ac56142015-10-13 03:58:19 -07002133 // Adding another stream should enable playout on the new stream only.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002134 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2135 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002136 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2137 EXPECT_TRUE(voe_.GetSend(channel_num1));
2138 EXPECT_FALSE(voe_.GetSend(channel_num2));
2139
solenberg1ac56142015-10-13 03:58:19 -07002140 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002141 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2142 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2143
2144 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2145 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2146 int channel_num3 = voe_.GetLastChannel();
2147 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2148 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2149 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2150 EXPECT_FALSE(voe_.GetSend(channel_num3));
2151
2152 // Stop sending.
2153 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2154 EXPECT_FALSE(voe_.GetSend(channel_num1));
2155 EXPECT_FALSE(voe_.GetSend(channel_num2));
2156 EXPECT_FALSE(voe_.GetSend(channel_num3));
2157
2158 // Stop playout.
2159 EXPECT_TRUE(channel_->SetPlayout(false));
2160 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2161 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2162 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2163
solenberg1ac56142015-10-13 03:58:19 -07002164 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002165 EXPECT_TRUE(channel_->SetPlayout(true));
2166 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2167 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2168 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2169
solenberg1ac56142015-10-13 03:58:19 -07002170 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002171 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2172 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002173 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002174}
2175
2176// Test that we can set the devices to use.
2177TEST_F(WebRtcVoiceEngineTestFake, SetDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002178 EXPECT_TRUE(SetupEngineWithSendStream());
2179 int send_channel = voe_.GetLastChannel();
2180 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2181 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002182 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002183
2184 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2185 cricket::kFakeDefaultDeviceId);
2186 cricket::Device dev(cricket::kFakeDeviceName,
2187 cricket::kFakeDeviceId);
2188
2189 // Test SetDevices() while not sending or playing.
2190 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2191
2192 // Test SetDevices() while sending and playing.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002193 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2194 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002195 EXPECT_TRUE(voe_.GetSend(send_channel));
2196 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002197
2198 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2199
solenberg1ac56142015-10-13 03:58:19 -07002200 EXPECT_TRUE(voe_.GetSend(send_channel));
2201 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002202
2203 // Test that failure to open newly selected devices does not prevent opening
2204 // ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002205 voe_.set_playout_fail_channel(recv_channel);
2206 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002207
2208 EXPECT_FALSE(engine_.SetDevices(&default_dev, &default_dev));
2209
solenberg1ac56142015-10-13 03:58:19 -07002210 EXPECT_FALSE(voe_.GetSend(send_channel));
2211 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002212
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002213 voe_.set_playout_fail_channel(-1);
2214 voe_.set_send_fail_channel(-1);
2215
2216 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2217
solenberg1ac56142015-10-13 03:58:19 -07002218 EXPECT_TRUE(voe_.GetSend(send_channel));
2219 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002220}
2221
2222// Test that we can set the devices to use even if we failed to
2223// open the initial ones.
2224TEST_F(WebRtcVoiceEngineTestFake, SetDevicesWithInitiallyBadDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002225 EXPECT_TRUE(SetupEngineWithSendStream());
2226 int send_channel = voe_.GetLastChannel();
2227 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2228 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002229 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002230
2231 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2232 cricket::kFakeDefaultDeviceId);
2233 cricket::Device dev(cricket::kFakeDeviceName,
2234 cricket::kFakeDeviceId);
2235
2236 // Test that failure to open devices selected before starting
2237 // send/play does not prevent opening newly selected ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002238 voe_.set_playout_fail_channel(recv_channel);
2239 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002240
2241 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2242
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002243 EXPECT_FALSE(channel_->SetSend(cricket::SEND_MICROPHONE));
2244 EXPECT_FALSE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002245 EXPECT_FALSE(voe_.GetSend(send_channel));
2246 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002247
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002248 voe_.set_playout_fail_channel(-1);
2249 voe_.set_send_fail_channel(-1);
2250
2251 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2252
solenberg1ac56142015-10-13 03:58:19 -07002253 EXPECT_TRUE(voe_.GetSend(send_channel));
2254 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002255}
2256
2257// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002258// and start sending on it.
2259TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2260 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002261 int channel_num = voe_.GetLastChannel();
2262 webrtc::AgcConfig agc_config;
2263 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2264 EXPECT_EQ(0, agc_config.targetLeveldBOv);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002265 send_parameters_.options = options_adjust_agc_;
2266 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002267 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2268 EXPECT_TRUE(voe_.GetSend(channel_num));
2269 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2270 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002271 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2272 EXPECT_FALSE(voe_.GetSend(channel_num));
2273 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2274 EXPECT_EQ(0, agc_config.targetLeveldBOv); // level was restored
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002275}
2276
wu@webrtc.org97077a32013-10-25 21:18:33 +00002277TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002278 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002279 webrtc::AgcConfig agc_config;
2280 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2281 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2282
2283 cricket::AudioOptions options;
Karl Wibergbe579832015-11-10 22:34:18 +01002284 options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2285 options.tx_agc_digital_compression_gain = rtc::Optional<uint16_t>(9);
2286 options.tx_agc_limiter = rtc::Optional<bool>(true);
2287 options.auto_gain_control = rtc::Optional<bool>(true);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002288 EXPECT_TRUE(engine_.SetOptions(options));
2289
2290 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2291 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2292 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2293 EXPECT_TRUE(agc_config.limiterEnable);
2294
2295 // Check interaction with adjust_agc_delta. Both should be respected, for
2296 // backwards compatibility.
Karl Wibergbe579832015-11-10 22:34:18 +01002297 options.adjust_agc_delta = rtc::Optional<int>(-10);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002298 EXPECT_TRUE(engine_.SetOptions(options));
2299
2300 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2301 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2302}
2303
wu@webrtc.org97077a32013-10-25 21:18:33 +00002304TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002305 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002306 cricket::AudioOptions options;
Karl Wibergbe579832015-11-10 22:34:18 +01002307 options.recording_sample_rate = rtc::Optional<uint32_t>(48000);
2308 options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002309 EXPECT_TRUE(engine_.SetOptions(options));
2310
2311 unsigned int recording_sample_rate, playout_sample_rate;
2312 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2313 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2314 EXPECT_EQ(48000u, recording_sample_rate);
2315 EXPECT_EQ(44100u, playout_sample_rate);
2316}
2317
2318TEST_F(WebRtcVoiceEngineTestFake, TraceFilterViaTraceOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002319 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002320 engine_.SetLogging(rtc::LS_INFO, "");
wu@webrtc.org97077a32013-10-25 21:18:33 +00002321 EXPECT_EQ(
2322 // Info:
2323 webrtc::kTraceStateInfo | webrtc::kTraceInfo |
2324 // Warning:
2325 webrtc::kTraceTerseInfo | webrtc::kTraceWarning |
2326 // Error:
2327 webrtc::kTraceError | webrtc::kTraceCritical,
2328 static_cast<int>(trace_wrapper_->filter_));
2329 // Now set it explicitly
2330 std::string filter =
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002331 "tracefilter " + rtc::ToString(webrtc::kTraceDefault);
2332 engine_.SetLogging(rtc::LS_VERBOSE, filter.c_str());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002333 EXPECT_EQ(static_cast<unsigned int>(webrtc::kTraceDefault),
2334 trace_wrapper_->filter_);
2335}
2336
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002337// Test that we can set the outgoing SSRC properly.
2338// SSRC is set in SetupEngine by calling AddSendStream.
2339TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002340 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002341 EXPECT_EQ(kSsrc1, voe_.GetLocalSSRC(voe_.GetLastChannel()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002342}
2343
2344TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2345 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002346 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002347 SetAudioSendStreamStats();
solenberg1ac56142015-10-13 03:58:19 -07002348 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2349 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002350 EXPECT_TRUE(channel_->AddRecvStream(
2351 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002352 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2353 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002354
solenberg85a04962015-10-27 03:35:21 -07002355 // Check stats for the added streams.
2356 {
2357 cricket::VoiceMediaInfo info;
2358 EXPECT_EQ(true, channel_->GetStats(&info));
2359
2360 // We have added one send stream. We should see the stats we've set.
2361 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002362 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002363 // We have added one receive stream. We should see empty stats.
2364 EXPECT_EQ(info.receivers.size(), 1u);
2365 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2366 }
solenberg1ac56142015-10-13 03:58:19 -07002367
solenberg566ef242015-11-06 15:34:49 -08002368 // Start sending - this affects some reported stats.
2369 {
2370 cricket::VoiceMediaInfo info;
2371 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2372 EXPECT_EQ(true, channel_->GetStats(&info));
2373 VerifyVoiceSenderInfo(info.senders[0], true);
2374 }
2375
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002376 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002377 {
2378 cricket::VoiceMediaInfo info;
2379 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2380 EXPECT_EQ(true, channel_->GetStats(&info));
2381 EXPECT_EQ(1u, info.senders.size());
2382 EXPECT_EQ(0u, info.receivers.size());
2383 }
solenberg1ac56142015-10-13 03:58:19 -07002384
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002385 // Deliver a new packet - a default receive stream should be created and we
2386 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002387 {
2388 cricket::VoiceMediaInfo info;
2389 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2390 SetAudioReceiveStreamStats();
2391 EXPECT_EQ(true, channel_->GetStats(&info));
2392 EXPECT_EQ(1u, info.senders.size());
2393 EXPECT_EQ(1u, info.receivers.size());
2394 VerifyVoiceReceiverInfo(info.receivers[0]);
2395 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002396}
2397
2398// Test that we can set the outgoing SSRC properly with multiple streams.
2399// SSRC is set in SetupEngine by calling AddSendStream.
2400TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002401 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002402 EXPECT_EQ(kSsrc1, voe_.GetLocalSSRC(voe_.GetLastChannel()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002403 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
solenberg85a04962015-10-27 03:35:21 -07002404 EXPECT_EQ(kSsrc1, voe_.GetLocalSSRC(voe_.GetLastChannel()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002405}
2406
2407// Test that the local SSRC is the same on sending and receiving channels if the
2408// receive channel is created before the send channel.
2409TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002410 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002411 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002412
2413 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2414 int receive_channel_num = voe_.GetLastChannel();
2415 EXPECT_TRUE(channel_->AddSendStream(
2416 cricket::StreamParams::CreateLegacy(1234)));
2417 int send_channel_num = voe_.GetLastChannel();
2418
solenberg85a04962015-10-27 03:35:21 -07002419 EXPECT_EQ(1234U, voe_.GetLocalSSRC(send_channel_num));
2420 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002421}
2422
2423// Test that we can properly receive packets.
2424TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2425 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002426 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002427 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002428 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame,
2429 sizeof(kPcmuFrame)));
2430}
2431
2432// Test that we can properly receive packets on multiple streams.
2433TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002434 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002435 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002436 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2437 int channel_num1 = voe_.GetLastChannel();
2438 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2439 int channel_num2 = voe_.GetLastChannel();
2440 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2441 int channel_num3 = voe_.GetLastChannel();
2442 // Create packets with the right SSRCs.
2443 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002444 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002445 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002446 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002447 }
2448 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2449 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2450 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2451 DeliverPacket(packets[0], sizeof(packets[0]));
2452 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2453 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2454 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2455 DeliverPacket(packets[1], sizeof(packets[1]));
2456 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1],
2457 sizeof(packets[1])));
2458 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2459 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2460 DeliverPacket(packets[2], sizeof(packets[2]));
2461 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2462 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2],
2463 sizeof(packets[2])));
2464 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2465 DeliverPacket(packets[3], sizeof(packets[3]));
2466 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2467 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2468 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3],
2469 sizeof(packets[3])));
2470 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2471 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2472 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2473}
2474
solenberg0a617e22015-10-20 15:49:38 -07002475// Test that we properly handle failures to add a receive stream.
2476TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
2477 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002478 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002479 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002480}
2481
solenberg0a617e22015-10-20 15:49:38 -07002482// Test that we properly handle failures to add a send stream.
2483TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
2484 EXPECT_TRUE(SetupEngine());
2485 voe_.set_fail_create_channel(true);
2486 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2487}
2488
solenberg1ac56142015-10-13 03:58:19 -07002489// Test that AddRecvStream creates new stream.
2490TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2491 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002492 int channel_num = voe_.GetLastChannel();
2493 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002494 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002495}
2496
2497// Test that after adding a recv stream, we do not decode more codecs than
2498// those previously passed into SetRecvCodecs.
2499TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002500 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002501 cricket::AudioRecvParameters parameters;
2502 parameters.codecs.push_back(kIsacCodec);
2503 parameters.codecs.push_back(kPcmuCodec);
2504 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002505 EXPECT_TRUE(channel_->AddRecvStream(
2506 cricket::StreamParams::CreateLegacy(kSsrc1)));
2507 int channel_num2 = voe_.GetLastChannel();
2508 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002509 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002510 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002511 gcodec.channels = 2;
2512 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2513}
2514
2515// Test that we properly clean up any streams that were added, even if
2516// not explicitly removed.
2517TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002518 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002519 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002520 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2521 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2522 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2523 delete channel_;
2524 channel_ = NULL;
2525 EXPECT_EQ(0, voe_.GetNumChannels());
2526}
2527
wu@webrtc.org78187522013-10-07 23:32:02 +00002528TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002529 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002530 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2531}
2532
2533TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2534 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002535 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002536 // Manually delete channel to simulate a failure.
2537 int channel = voe_.GetLastChannel();
2538 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2539 // Add recv stream 2 should work.
2540 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002541 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002542 EXPECT_NE(channel, new_channel);
2543 // The last created channel is deleted too.
2544 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002545}
2546
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002547// Test the InsertDtmf on default send stream as caller.
2548TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2549 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002550}
2551
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002552// Test the InsertDtmf on default send stream as callee
2553TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2554 TestInsertDtmf(0, false);
2555}
2556
2557// Test the InsertDtmf on specified send stream as caller.
2558TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2559 TestInsertDtmf(kSsrc1, true);
2560}
2561
2562// Test the InsertDtmf on specified send stream as callee.
2563TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2564 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002565}
2566
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002567TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002568 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002569 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002570 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2571 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2572 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2573 EXPECT_TRUE(channel_->SetPlayout(true));
2574 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2575 EXPECT_TRUE(channel_->SetPlayout(false));
2576 EXPECT_FALSE(channel_->SetPlayout(true));
2577}
2578
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002579TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002580 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002581
2582 bool ec_enabled;
2583 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002584 webrtc::AecmModes aecm_mode;
2585 bool cng_enabled;
2586 bool agc_enabled;
2587 webrtc::AgcModes agc_mode;
2588 webrtc::AgcConfig agc_config;
2589 bool ns_enabled;
2590 webrtc::NsModes ns_mode;
2591 bool highpass_filter_enabled;
2592 bool stereo_swapping_enabled;
2593 bool typing_detection_enabled;
2594 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002595 voe_.GetAecmMode(aecm_mode, cng_enabled);
2596 voe_.GetAgcStatus(agc_enabled, agc_mode);
2597 voe_.GetAgcConfig(agc_config);
2598 voe_.GetNsStatus(ns_enabled, ns_mode);
2599 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2600 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2601 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2602 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002603 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002604 EXPECT_FALSE(cng_enabled);
2605 EXPECT_TRUE(agc_enabled);
2606 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2607 EXPECT_TRUE(ns_enabled);
2608 EXPECT_TRUE(highpass_filter_enabled);
2609 EXPECT_FALSE(stereo_swapping_enabled);
2610 EXPECT_TRUE(typing_detection_enabled);
2611 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2612 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2613
2614 // Nothing set, so all ignored.
2615 cricket::AudioOptions options;
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);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002618 voe_.GetAecmMode(aecm_mode, cng_enabled);
2619 voe_.GetAgcStatus(agc_enabled, agc_mode);
2620 voe_.GetAgcConfig(agc_config);
2621 voe_.GetNsStatus(ns_enabled, ns_mode);
2622 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2623 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2624 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2625 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002626 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002627 EXPECT_FALSE(cng_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);
Henrik Lundin64dad832015-05-11 12:44:23 +02002636 EXPECT_EQ(50, voe_.GetNetEqCapacity()); // From GetDefaultEngineOptions().
Henrik Lundin5263b3c2015-06-01 10:29:41 +02002637 EXPECT_FALSE(
2638 voe_.GetNetEqFastAccelerate()); // From GetDefaultEngineOptions().
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002639
2640 // Turn echo cancellation off
Karl Wibergbe579832015-11-10 22:34:18 +01002641 options.echo_cancellation = rtc::Optional<bool>(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002642 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002643 voe_.GetEcStatus(ec_enabled, ec_mode);
2644 EXPECT_FALSE(ec_enabled);
2645
2646 // Turn echo cancellation back on, with settings, and make sure
2647 // nothing else changed.
Karl Wibergbe579832015-11-10 22:34:18 +01002648 options.echo_cancellation = rtc::Optional<bool>(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002649 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002650 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002651 voe_.GetAecmMode(aecm_mode, cng_enabled);
2652 voe_.GetAgcStatus(agc_enabled, agc_mode);
2653 voe_.GetAgcConfig(agc_config);
2654 voe_.GetNsStatus(ns_enabled, ns_mode);
2655 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2656 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2657 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2658 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002659 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002660 EXPECT_TRUE(agc_enabled);
2661 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2662 EXPECT_TRUE(ns_enabled);
2663 EXPECT_TRUE(highpass_filter_enabled);
2664 EXPECT_FALSE(stereo_swapping_enabled);
2665 EXPECT_TRUE(typing_detection_enabled);
2666 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2667 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2668
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002669 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2670 // control.
Karl Wibergbe579832015-11-10 22:34:18 +01002671 options.delay_agnostic_aec = rtc::Optional<bool>(true);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002672 ASSERT_TRUE(engine_.SetOptions(options));
2673 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002674 voe_.GetAecmMode(aecm_mode, cng_enabled);
2675 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002676 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002677 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2678
2679 // Turn off echo cancellation and delay agnostic aec.
Karl Wibergbe579832015-11-10 22:34:18 +01002680 options.delay_agnostic_aec = rtc::Optional<bool>(false);
2681 options.extended_filter_aec = rtc::Optional<bool>(false);
2682 options.echo_cancellation = rtc::Optional<bool>(false);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002683 ASSERT_TRUE(engine_.SetOptions(options));
2684 voe_.GetEcStatus(ec_enabled, ec_mode);
2685 EXPECT_FALSE(ec_enabled);
2686 // Turning delay agnostic aec back on should also turn on echo cancellation.
Karl Wibergbe579832015-11-10 22:34:18 +01002687 options.delay_agnostic_aec = rtc::Optional<bool>(true);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002688 ASSERT_TRUE(engine_.SetOptions(options));
2689 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002690 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002691 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002692 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2693
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002694 // Turn off AGC
Karl Wibergbe579832015-11-10 22:34:18 +01002695 options.auto_gain_control = rtc::Optional<bool>(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002696 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002697 voe_.GetAgcStatus(agc_enabled, agc_mode);
2698 EXPECT_FALSE(agc_enabled);
2699
2700 // Turn AGC back on
Karl Wibergbe579832015-11-10 22:34:18 +01002701 options.auto_gain_control = rtc::Optional<bool>(true);
2702 options.adjust_agc_delta = rtc::Optional<int>();
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002703 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002704 voe_.GetAgcStatus(agc_enabled, agc_mode);
2705 EXPECT_TRUE(agc_enabled);
2706 voe_.GetAgcConfig(agc_config);
2707 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2708
2709 // Turn off other options (and stereo swapping on).
Karl Wibergbe579832015-11-10 22:34:18 +01002710 options.noise_suppression = rtc::Optional<bool>(false);
2711 options.highpass_filter = rtc::Optional<bool>(false);
2712 options.typing_detection = rtc::Optional<bool>(false);
2713 options.stereo_swapping = rtc::Optional<bool>(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002714 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002715 voe_.GetNsStatus(ns_enabled, ns_mode);
2716 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2717 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2718 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2719 EXPECT_FALSE(ns_enabled);
2720 EXPECT_FALSE(highpass_filter_enabled);
2721 EXPECT_FALSE(typing_detection_enabled);
2722 EXPECT_TRUE(stereo_swapping_enabled);
2723
solenberg1ac56142015-10-13 03:58:19 -07002724 // Set options again to ensure it has no impact.
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002725 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002726 voe_.GetEcStatus(ec_enabled, ec_mode);
2727 voe_.GetNsStatus(ns_enabled, ns_mode);
2728 EXPECT_TRUE(ec_enabled);
2729 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2730 EXPECT_FALSE(ns_enabled);
2731 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2732}
2733
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002734TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002735 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002736
2737 bool ec_enabled;
2738 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002739 bool agc_enabled;
2740 webrtc::AgcModes agc_mode;
2741 bool ns_enabled;
2742 webrtc::NsModes ns_mode;
2743 bool highpass_filter_enabled;
2744 bool stereo_swapping_enabled;
2745 bool typing_detection_enabled;
2746
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002747 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002748 voe_.GetAgcStatus(agc_enabled, agc_mode);
2749 voe_.GetNsStatus(ns_enabled, ns_mode);
2750 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2751 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2752 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2753 EXPECT_TRUE(ec_enabled);
2754 EXPECT_TRUE(agc_enabled);
2755 EXPECT_TRUE(ns_enabled);
2756 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002757 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002758 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002759}
2760
2761TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2762 webrtc::AgcConfig set_config = {0};
2763 set_config.targetLeveldBOv = 3;
2764 set_config.digitalCompressionGaindB = 9;
2765 set_config.limiterEnable = true;
2766 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002767 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002768
2769 webrtc::AgcConfig config = {0};
2770 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2771 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2772 EXPECT_EQ(set_config.digitalCompressionGaindB,
2773 config.digitalCompressionGaindB);
2774 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2775}
2776
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002777TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002778 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg66f43392015-09-09 01:36:22 -07002779 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2780 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002781 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002782 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2783 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002784 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002785
2786 // Have to add a stream to make SetSend work.
2787 cricket::StreamParams stream1;
2788 stream1.ssrcs.push_back(1);
2789 channel1->AddSendStream(stream1);
2790 cricket::StreamParams stream2;
2791 stream2.ssrcs.push_back(2);
2792 channel2->AddSendStream(stream2);
2793
2794 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002795 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002796 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2797 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2798 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002799 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2800 EXPECT_EQ(parameters_options_all.options, channel1->options());
2801 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2802 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002803
2804 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002805 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002806 parameters_options_no_ns.options.noise_suppression =
2807 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002808 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2809 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002810 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2811 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2812 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002813 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002814
2815 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002816 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002817 parameters_options_no_agc.options.auto_gain_control =
2818 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002819 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002820 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2821 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2822 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002823 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002824
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002825 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002826 bool ec_enabled;
2827 webrtc::EcModes ec_mode;
2828 bool agc_enabled;
2829 webrtc::AgcModes agc_mode;
2830 bool ns_enabled;
2831 webrtc::NsModes ns_mode;
2832 voe_.GetEcStatus(ec_enabled, ec_mode);
2833 voe_.GetAgcStatus(agc_enabled, agc_mode);
2834 voe_.GetNsStatus(ns_enabled, ns_mode);
2835 EXPECT_TRUE(ec_enabled);
2836 EXPECT_TRUE(agc_enabled);
2837 EXPECT_TRUE(ns_enabled);
2838
2839 channel1->SetSend(cricket::SEND_MICROPHONE);
2840 voe_.GetEcStatus(ec_enabled, ec_mode);
2841 voe_.GetAgcStatus(agc_enabled, agc_mode);
2842 voe_.GetNsStatus(ns_enabled, ns_mode);
2843 EXPECT_TRUE(ec_enabled);
2844 EXPECT_TRUE(agc_enabled);
2845 EXPECT_FALSE(ns_enabled);
2846
2847 channel1->SetSend(cricket::SEND_NOTHING);
2848 voe_.GetEcStatus(ec_enabled, ec_mode);
2849 voe_.GetAgcStatus(agc_enabled, agc_mode);
2850 voe_.GetNsStatus(ns_enabled, ns_mode);
2851 EXPECT_TRUE(ec_enabled);
2852 EXPECT_TRUE(agc_enabled);
2853 EXPECT_TRUE(ns_enabled);
2854
2855 channel2->SetSend(cricket::SEND_MICROPHONE);
2856 voe_.GetEcStatus(ec_enabled, ec_mode);
2857 voe_.GetAgcStatus(agc_enabled, agc_mode);
2858 voe_.GetNsStatus(ns_enabled, ns_mode);
2859 EXPECT_TRUE(ec_enabled);
2860 EXPECT_FALSE(agc_enabled);
2861 EXPECT_TRUE(ns_enabled);
2862
2863 channel2->SetSend(cricket::SEND_NOTHING);
2864 voe_.GetEcStatus(ec_enabled, ec_mode);
2865 voe_.GetAgcStatus(agc_enabled, agc_mode);
2866 voe_.GetNsStatus(ns_enabled, ns_mode);
2867 EXPECT_TRUE(ec_enabled);
2868 EXPECT_TRUE(agc_enabled);
2869 EXPECT_TRUE(ns_enabled);
2870
2871 // Make sure settings take effect while we are sending.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002872 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
2873 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2874 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002875 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01002876 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07002877 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01002878 rtc::Optional<bool>(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002879 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002880 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01002881 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2882 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2883 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002884 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002885 voe_.GetEcStatus(ec_enabled, ec_mode);
2886 voe_.GetAgcStatus(agc_enabled, agc_mode);
2887 voe_.GetNsStatus(ns_enabled, ns_mode);
2888 EXPECT_TRUE(ec_enabled);
2889 EXPECT_FALSE(agc_enabled);
2890 EXPECT_FALSE(ns_enabled);
2891}
2892
wu@webrtc.orgde305012013-10-31 15:40:38 +00002893// This test verifies DSCP settings are properly applied on voice media channel.
2894TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002895 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002896 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002897 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002898 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00002899 new cricket::FakeNetworkInterface);
2900 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002901 cricket::AudioSendParameters parameters = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002902 parameters.options.dscp = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002903 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002904 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00002905 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002906 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002907 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
Karl Wibergbe579832015-11-10 22:34:18 +01002908 parameters.options.dscp = rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002909 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002910 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00002911}
2912
solenberg1ac56142015-10-13 03:58:19 -07002913TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002914 EXPECT_TRUE(SetupEngine());
2915 cricket::WebRtcVoiceMediaChannel* media_channel =
2916 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002917 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2918 EXPECT_TRUE(channel_->AddRecvStream(
2919 cricket::StreamParams::CreateLegacy(kSsrc1)));
2920 int channel_id = voe_.GetLastChannel();
2921 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2922 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2923 EXPECT_TRUE(channel_->AddRecvStream(
2924 cricket::StreamParams::CreateLegacy(kSsrc2)));
2925 int channel_id2 = voe_.GetLastChannel();
2926 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002927}
2928
solenberg1ac56142015-10-13 03:58:19 -07002929TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002930 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002931 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002932 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2933 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2934 EXPECT_TRUE(channel_->AddSendStream(
2935 cricket::StreamParams::CreateLegacy(kSsrc1)));
2936 int channel_id = voe_.GetLastChannel();
2937 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2938 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2939 EXPECT_TRUE(channel_->AddSendStream(
2940 cricket::StreamParams::CreateLegacy(kSsrc2)));
2941 int channel_id2 = voe_.GetLastChannel();
2942 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002943}
2944
solenberg4bac9c52015-10-09 02:32:53 -07002945TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002946 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002947 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002948 cricket::StreamParams stream;
2949 stream.ssrcs.push_back(kSsrc2);
2950 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002951 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002952 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002953 float scale = 0;
2954 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2955 EXPECT_DOUBLE_EQ(3, scale);
2956}
2957
2958TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
2959 EXPECT_TRUE(SetupEngine());
2960 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2961 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2962 int channel_id = voe_.GetLastChannel();
2963 float scale = 0;
2964 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2965 EXPECT_DOUBLE_EQ(2, scale);
2966 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07002967 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002968 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002969}
2970
pbos8fc7fa72015-07-15 08:02:58 -07002971TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02002972 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07002973 const std::string kSyncLabel = "AvSyncLabel";
2974
solenberg1ac56142015-10-13 03:58:19 -07002975 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07002976 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
2977 sp.sync_label = kSyncLabel;
2978 // Creating two channels to make sure that sync label is set properly for both
2979 // the default voice channel and following ones.
2980 EXPECT_TRUE(channel_->AddRecvStream(sp));
2981 sp.ssrcs[0] += 1;
2982 EXPECT_TRUE(channel_->AddRecvStream(sp));
2983
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002984 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07002985 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002986 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002987 << "SyncGroup should be set based on sync_label";
2988 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002989 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002990 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07002991}
2992
pbos6bb1b6e2015-07-24 07:10:18 -07002993TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002994 // Test that changing the combined_audio_video_bwe option results in the
2995 // expected state changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002996 std::vector<uint32_t> ssrcs;
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002997 ssrcs.push_back(223);
2998 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002999
solenberg1ac56142015-10-13 03:58:19 -07003000 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003001 cricket::WebRtcVoiceMediaChannel* media_channel =
3002 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02003003 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003004 EXPECT_TRUE(media_channel->AddRecvStream(
3005 cricket::StreamParams::CreateLegacy(ssrc)));
3006 }
3007 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003008
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003009 // Combined BWE should be disabled.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003010 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003011 const auto* s = call_.GetAudioReceiveStream(ssrc);
3012 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07003013 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003014 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003015
3016 // Enable combined BWE option - now it should be set up.
Karl Wibergbe579832015-11-10 22:34:18 +01003017 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003018 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003019 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003020 const auto* s = call_.GetAudioReceiveStream(ssrc);
3021 EXPECT_NE(nullptr, s);
3022 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
3023 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003024
3025 // Disable combined BWE option - should be disabled again.
Karl Wibergbe579832015-11-10 22:34:18 +01003026 send_parameters_.options.combined_audio_video_bwe =
3027 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003028 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003029 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003030 const auto* s = call_.GetAudioReceiveStream(ssrc);
3031 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07003032 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003033 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003034
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003035 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003036}
3037
pbos6bb1b6e2015-07-24 07:10:18 -07003038TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003039 // Test that adding receive streams after enabling combined bandwidth
3040 // estimation will correctly configure each channel.
solenberg1ac56142015-10-13 03:58:19 -07003041 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003042 cricket::WebRtcVoiceMediaChannel* media_channel =
3043 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003044 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003045 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003046
Peter Boström0c4e06b2015-10-07 12:23:21 +02003047 static const uint32_t kSsrcs[] = {1, 2, 3, 4};
tfarina5237aaf2015-11-10 23:44:30 -08003048 for (unsigned int i = 0; i < arraysize(kSsrcs); ++i) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003049 EXPECT_TRUE(media_channel->AddRecvStream(
3050 cricket::StreamParams::CreateLegacy(kSsrcs[i])));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003051 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(kSsrcs[i]));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003052 }
tfarina5237aaf2015-11-10 23:44:30 -08003053 EXPECT_EQ(arraysize(kSsrcs), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003054}
3055
pbos6bb1b6e2015-07-24 07:10:18 -07003056TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003057 // Test that setting the header extensions results in the expected state
3058 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003059 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003060 ssrcs.push_back(223);
3061 ssrcs.push_back(224);
3062
solenberg1ac56142015-10-13 03:58:19 -07003063 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003064 cricket::WebRtcVoiceMediaChannel* media_channel =
3065 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003066 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003067 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003068 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003069 EXPECT_TRUE(media_channel->AddRecvStream(
3070 cricket::StreamParams::CreateLegacy(ssrc)));
3071 }
3072
3073 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003074 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003075 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003076 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003077 EXPECT_NE(nullptr, s);
3078 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3079 }
3080
3081 // Set up receive extensions.
3082 const auto& e_exts = engine_.rtp_header_extensions();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003083 cricket::AudioRecvParameters recv_parameters;
3084 recv_parameters.extensions = e_exts;
3085 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003086 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003087 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003088 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003089 EXPECT_NE(nullptr, s);
3090 const auto& s_exts = s->GetConfig().rtp.extensions;
3091 EXPECT_EQ(e_exts.size(), s_exts.size());
3092 for (const auto& e_ext : e_exts) {
3093 for (const auto& s_ext : s_exts) {
3094 if (e_ext.id == s_ext.id) {
3095 EXPECT_EQ(e_ext.uri, s_ext.name);
3096 }
3097 }
3098 }
3099 }
3100
3101 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003102 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003103 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003104 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003105 EXPECT_NE(nullptr, s);
3106 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3107 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003108}
3109
3110TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3111 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003112 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003113 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3114 static const unsigned char kRtcp[] = {
3115 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3116 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3119 };
3120 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3121
solenberg1ac56142015-10-13 03:58:19 -07003122 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003123 cricket::WebRtcVoiceMediaChannel* media_channel =
3124 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003125 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003126 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003127 EXPECT_TRUE(media_channel->AddRecvStream(
3128 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3129
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003130 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003131 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003132 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003133 EXPECT_EQ(0, s->received_packets());
3134 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3135 EXPECT_EQ(1, s->received_packets());
3136 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3137 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003138}
Minyue2013aec2015-05-13 14:14:42 +02003139
solenberg0a617e22015-10-20 15:49:38 -07003140// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003141// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003142TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenberg1ac56142015-10-13 03:58:19 -07003143 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003144 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003145 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003146 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3147 int recv_ch = voe_.GetLastChannel();
3148 EXPECT_NE(recv_ch, default_channel);
3149 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3150 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3151 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003152 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3153 recv_ch = voe_.GetLastChannel();
3154 EXPECT_NE(recv_ch, default_channel);
3155 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003156}
3157
3158TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003159 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003160 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003161
3162 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3163 int recv_ch = voe_.GetLastChannel();
3164
3165 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3166 int send_ch = voe_.GetLastChannel();
3167
3168 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3169 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3170 // channel of |recv_ch|.This is not a common case, since, normally, only the
3171 // default channel can be associated. However, the default is not deletable.
3172 // So we force the |recv_ch| to associate with a non-default channel.
3173 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3174 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3175
3176 EXPECT_TRUE(channel_->RemoveSendStream(2));
3177 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3178}
stefan658910c2015-09-03 05:48:32 -07003179
3180// Tests for the actual WebRtc VoE library.
3181
3182TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
3183 cricket::WebRtcVoiceEngine engine;
3184 cricket::AudioOptions options = engine.GetOptions();
3185 // The default options should have at least a few things set. We purposefully
3186 // don't check the option values here, though.
kwiberg102c6a62015-10-30 02:47:38 -07003187 EXPECT_TRUE(options.echo_cancellation);
3188 EXPECT_TRUE(options.auto_gain_control);
3189 EXPECT_TRUE(options.noise_suppression);
stefan658910c2015-09-03 05:48:32 -07003190}
3191
3192// Tests that the library initializes and shuts down properly.
3193TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3194 cricket::WebRtcVoiceEngine engine;
3195 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003196 rtc::scoped_ptr<webrtc::Call> call(
3197 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003198 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003199 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003200 EXPECT_TRUE(channel != nullptr);
3201 delete channel;
3202 engine.Terminate();
3203
3204 // Reinit to catch regression where VoiceEngineObserver reference is lost
3205 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3206 engine.Terminate();
3207}
3208
3209// Tests that the library is configured with the codecs we want.
3210TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
3211 cricket::WebRtcVoiceEngine engine;
3212 // Check codecs by name.
3213 EXPECT_TRUE(engine.FindCodec(
3214 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0)));
3215 EXPECT_TRUE(engine.FindCodec(
3216 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0)));
3217 EXPECT_TRUE(engine.FindCodec(
3218 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0)));
3219 // Check that name matching is case-insensitive.
3220 EXPECT_TRUE(engine.FindCodec(
3221 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0)));
3222 EXPECT_TRUE(engine.FindCodec(
3223 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0)));
3224 EXPECT_TRUE(engine.FindCodec(
3225 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0)));
3226 EXPECT_TRUE(engine.FindCodec(
3227 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0)));
3228 EXPECT_TRUE(engine.FindCodec(
3229 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0)));
3230 EXPECT_TRUE(engine.FindCodec(
3231 cricket::AudioCodec(96, "red", 8000, 0, 1, 0)));
3232 EXPECT_TRUE(engine.FindCodec(
3233 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0)));
3234 EXPECT_TRUE(engine.FindCodec(
3235 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0)));
3236 EXPECT_TRUE(engine.FindCodec(
3237 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0)));
3238 EXPECT_TRUE(engine.FindCodec(
3239 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0)));
3240 // Check codecs with an id by id.
3241 EXPECT_TRUE(engine.FindCodec(
3242 cricket::AudioCodec(0, "", 8000, 0, 1, 0))); // PCMU
3243 EXPECT_TRUE(engine.FindCodec(
3244 cricket::AudioCodec(8, "", 8000, 0, 1, 0))); // PCMA
3245 EXPECT_TRUE(engine.FindCodec(
3246 cricket::AudioCodec(9, "", 8000, 0, 1, 0))); // G722
3247 EXPECT_TRUE(engine.FindCodec(
3248 cricket::AudioCodec(13, "", 8000, 0, 1, 0))); // CN
3249 // Check sample/bitrate matching.
3250 EXPECT_TRUE(engine.FindCodec(
3251 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0)));
3252 // Check that bad codecs fail.
3253 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0)));
3254 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(88, "", 0, 0, 1, 0)));
3255 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 0, 2, 0)));
3256 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 5000, 0, 1, 0)));
3257 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 5000, 1, 0)));
3258 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3259 for (std::vector<cricket::AudioCodec>::const_iterator it =
3260 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3261 if (it->name == "CN" && it->clockrate == 16000) {
3262 EXPECT_EQ(105, it->id);
3263 } else if (it->name == "CN" && it->clockrate == 32000) {
3264 EXPECT_EQ(106, it->id);
3265 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3266 EXPECT_EQ(103, it->id);
3267 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3268 EXPECT_EQ(104, it->id);
3269 } else if (it->name == "G722" && it->clockrate == 8000) {
3270 EXPECT_EQ(9, it->id);
3271 } else if (it->name == "telephone-event") {
3272 EXPECT_EQ(126, it->id);
3273 } else if (it->name == "red") {
3274 EXPECT_EQ(127, it->id);
3275 } else if (it->name == "opus") {
3276 EXPECT_EQ(111, it->id);
3277 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3278 EXPECT_EQ("10", it->params.find("minptime")->second);
3279 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3280 EXPECT_EQ("60", it->params.find("maxptime")->second);
3281 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3282 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3283 }
3284 }
3285
3286 engine.Terminate();
3287}
3288
3289// Tests that VoE supports at least 32 channels
3290TEST(WebRtcVoiceEngineTest, Has32Channels) {
3291 cricket::WebRtcVoiceEngine engine;
3292 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003293 rtc::scoped_ptr<webrtc::Call> call(
3294 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003295
3296 cricket::VoiceMediaChannel* channels[32];
3297 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003298 while (num_channels < arraysize(channels)) {
stefan658910c2015-09-03 05:48:32 -07003299 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003300 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003301 if (!channel)
3302 break;
stefan658910c2015-09-03 05:48:32 -07003303 channels[num_channels++] = channel;
3304 }
3305
tfarina5237aaf2015-11-10 23:44:30 -08003306 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003307 EXPECT_EQ(expected, num_channels);
3308
3309 while (num_channels > 0) {
3310 delete channels[--num_channels];
3311 }
stefan658910c2015-09-03 05:48:32 -07003312 engine.Terminate();
3313}
3314
3315// Test that we set our preferred codecs properly.
3316TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3317 cricket::WebRtcVoiceEngine engine;
3318 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003319 rtc::scoped_ptr<webrtc::Call> call(
3320 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003321 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3322 call.get());
3323 cricket::AudioRecvParameters parameters;
3324 parameters.codecs = engine.codecs();
3325 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003326}