blob: 85094f8de823063dfd2055ba31549ad108b2d43b [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
2 * libjingle
3 * Copyright 2008 Google Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000027
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000028#include "webrtc/base/byteorder.h"
29#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020030#include "webrtc/call.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000031#include "talk/media/base/constants.h"
32#include "talk/media/base/fakemediaengine.h"
wu@webrtc.orgde305012013-10-31 15:40:38 +000033#include "talk/media/base/fakenetworkinterface.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034#include "talk/media/base/fakertp.h"
Fredrik Solenberg4b60c732015-05-07 14:07:48 +020035#include "talk/media/webrtc/fakewebrtccall.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000036#include "talk/media/webrtc/fakewebrtcvoiceengine.h"
37#include "talk/media/webrtc/webrtcvoiceengine.h"
deadbeefcbecd352015-09-23 11:50:27 -070038#include "webrtc/p2p/base/faketransportcontroller.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000039#include "talk/session/media/channel.h"
40
solenberg43e83d42015-10-20 06:41:01 -070041// Tests for the WebRtcVoiceEngine/VoiceChannel code.
42
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000043using cricket::kRtpAudioLevelHeaderExtension;
44using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
45
solenberg43e83d42015-10-20 06:41:01 -070046static const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
47static const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
48static const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
49static const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
50static const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
51static const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
52static const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
53static const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
54static const cricket::AudioCodec
55 kTelephoneEventCodec(106, "telephone-event", 8000, 0, 1, 0);
56static const cricket::AudioCodec* const kAudioCodecs[] = {
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +000057 &kPcmuCodec, &kIsacCodec, &kOpusCodec, &kG722CodecVoE, &kRedCodec,
58 &kCn8000Codec, &kCn16000Codec, &kTelephoneEventCodec,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000059};
solenberg43e83d42015-10-20 06:41:01 -070060static uint32_t kSsrc1 = 0x99;
61static uint32_t kSsrc2 = 0x98;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000062
63class FakeVoEWrapper : public cricket::VoEWrapper {
64 public:
65 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
66 : cricket::VoEWrapper(engine, // processing
67 engine, // base
68 engine, // codec
69 engine, // dtmf
henrike@webrtc.org28e20752013-07-10 00:45:36 +000070 engine, // hw
solenberg43e83d42015-10-20 06:41:01 -070071 engine, // neteq
henrike@webrtc.org28e20752013-07-10 00:45:36 +000072 engine, // network
73 engine, // rtp
solenberg43e83d42015-10-20 06:41:01 -070074 engine, // sync
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};
89
90class WebRtcVoiceEngineTestFake : public testing::Test {
91 public:
henrike@webrtc.org28e20752013-07-10 00:45:36 +000092 WebRtcVoiceEngineTestFake()
Fredrik Solenberg709ed672015-09-15 12:26:33 +020093 : call_(webrtc::Call::Config()),
94 voe_(kAudioCodecs, ARRAY_SIZE(kAudioCodecs)),
wu@webrtc.org97077a32013-10-25 21:18:33 +000095 trace_wrapper_(new FakeVoETraceWrapper()),
Jelena Marusicc28a8962015-05-29 15:05:44 +020096 engine_(new FakeVoEWrapper(&voe_), trace_wrapper_),
97 channel_(nullptr) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +020098 send_parameters_.codecs.push_back(kPcmuCodec);
99 recv_parameters_.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000100 options_adjust_agc_.adjust_agc_delta.Set(-10);
101 }
solenberg1ac56142015-10-13 03:58:19 -0700102 bool SetupEngine() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000103 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000104 return false;
105 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200106 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200107 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000108 }
solenberg1ac56142015-10-13 03:58:19 -0700109 bool SetupEngineWithRecvStream() {
110 if (!SetupEngine()) {
111 return false;
112 }
113 return channel_->AddRecvStream(
114 cricket::StreamParams::CreateLegacy(kSsrc1));
115 }
116 bool SetupEngineWithSendStream() {
117 if (!SetupEngine()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000118 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000119 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000120 return channel_->AddSendStream(
121 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000122 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000123 void SetupForMultiSendStream() {
solenberg1ac56142015-10-13 03:58:19 -0700124 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700125 // Remove stream added in Setup.
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000126 int default_channel_num = voe_.GetLastChannel();
Peter Boström0c4e06b2015-10-07 12:23:21 +0200127 uint32_t default_send_ssrc = 0u;
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000128 EXPECT_EQ(0, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
129 EXPECT_EQ(kSsrc1, default_send_ssrc);
130 EXPECT_TRUE(channel_->RemoveSendStream(default_send_ssrc));
131
solenberg0a617e22015-10-20 15:49:38 -0700132 // Verify the channel does not exist.
133 EXPECT_EQ(-1, voe_.GetLocalSSRC(default_channel_num, default_send_ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000134 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000135 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200136 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000137 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000138 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200139 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000140 delete channel_;
141 engine_.Terminate();
142 }
143
Peter Boström0c4e06b2015-10-07 12:23:21 +0200144 void TestInsertDtmf(uint32_t ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000145 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200146 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200147 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000148 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700149 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000150 // send stream.
151 EXPECT_TRUE(channel_->AddSendStream(
152 cricket::StreamParams::CreateLegacy(kSsrc1)));
153 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000154
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000155 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200156 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000157 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
158 EXPECT_FALSE(channel_->CanInsertDtmf());
159 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111, cricket::DF_SEND));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200160 send_parameters_.codecs.push_back(kTelephoneEventCodec);
161 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000162 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000163
164 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700165 // If this is callee, there's no active send channel yet.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000166 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
167 EXPECT_TRUE(channel_->AddSendStream(
168 cricket::StreamParams::CreateLegacy(kSsrc1)));
169 }
170
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000171 // Check we fail if the ssrc is invalid.
172 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111, cricket::DF_SEND));
173
174 // Test send
solenberg0a617e22015-10-20 15:49:38 -0700175 int channel_id = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000176 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
177 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
178 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
179
180 // Test play
181 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(3, 134));
182 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 3, 134, cricket::DF_PLAY));
183 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(3, 134));
184
185 // Test send and play
186 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
187 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(4, 145));
188 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 4, 145,
189 cricket::DF_PLAY | cricket::DF_SEND));
190 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
191 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(4, 145));
192 }
193
194 // Test that send bandwidth is set correctly.
195 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000196 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
197 // |expected_result| is the expected result from SetMaxSendBandwidth().
198 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000199 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000200 int max_bitrate,
201 bool expected_result,
202 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200203 cricket::AudioSendParameters parameters;
204 parameters.codecs.push_back(codec);
205 parameters.max_bandwidth_bps = max_bitrate;
206 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
207
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000208 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000209 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000210 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000211 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000212 }
213
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000214 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenberg0a617e22015-10-20 15:49:38 -0700215 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000216 int channel_num = voe_.GetLastChannel();
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000217
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000218 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000219 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000220
221 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200222 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000223 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200224 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000225 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000226
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000227 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200228 send_parameters_.extensions.clear();
229 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000230 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000231
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000232 // Ensure extension is set properly.
233 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200234 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
235 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000236 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000237
solenberg0a617e22015-10-20 15:49:38 -0700238 // Ensure extension is set properly on new channels.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000239 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700240 cricket::StreamParams::CreateLegacy(kSsrc2)));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000241 int new_channel_num = voe_.GetLastChannel();
242 EXPECT_NE(channel_num, new_channel_num);
243 EXPECT_EQ(id, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000244
245 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200246 send_parameters_.codecs.push_back(kPcmuCodec);
247 send_parameters_.extensions.clear();
248 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000249 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(channel_num, ext));
250 EXPECT_EQ(-1, voe_.GetSendRtpExtensionId(new_channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000251 }
252
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000253 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700254 EXPECT_TRUE(SetupEngineWithRecvStream());
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000255 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000256
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000257 // Ensure extensions are off by default.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000258 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000259
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200260 cricket::AudioRecvParameters parameters;
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000261 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200262 parameters.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000263 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200264 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000265 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000266
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000267 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200268 parameters.extensions.clear();
269 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000270 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000271
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000272 // Ensure extension is set properly.
273 const int id = 2;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200274 parameters.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
275 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000276 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(channel_num, ext));
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000277
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000278 // Ensure extension is set properly on new channel.
279 // The first stream to occupy the default channel.
280 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700281 cricket::StreamParams::CreateLegacy(kSsrc2)));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000282 int new_channel_num = voe_.GetLastChannel();
283 EXPECT_NE(channel_num, new_channel_num);
284 EXPECT_EQ(id, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
285
286 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200287 parameters.extensions.clear();
288 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000289 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(channel_num, ext));
290 EXPECT_EQ(-1, voe_.GetReceiveRtpExtensionId(new_channel_num, ext));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000291 }
292
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000293 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200294 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000295 cricket::FakeWebRtcVoiceEngine voe_;
wu@webrtc.org97077a32013-10-25 21:18:33 +0000296 FakeVoETraceWrapper* trace_wrapper_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000297 cricket::WebRtcVoiceEngine engine_;
298 cricket::VoiceMediaChannel* channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000299
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200300 cricket::AudioSendParameters send_parameters_;
301 cricket::AudioRecvParameters recv_parameters_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000302 cricket::AudioOptions options_adjust_agc_;
303};
304
305// Tests that our stub library "works".
306TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
307 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000308 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000309 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000310 engine_.Terminate();
311 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000312}
313
314// Tests that we can create and destroy a channel.
315TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000316 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200317 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200318 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000319}
320
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000321// Tests that the list of supported codecs is created properly and ordered
322// correctly
323TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
324 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
325 ASSERT_FALSE(codecs.empty());
326 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
327 EXPECT_EQ(48000, codecs[0].clockrate);
328 EXPECT_EQ(2, codecs[0].channels);
329 EXPECT_EQ(64000, codecs[0].bitrate);
330 int pref = codecs[0].preference;
331 for (size_t i = 1; i < codecs.size(); ++i) {
332 EXPECT_GT(pref, codecs[i].preference);
333 pref = codecs[i].preference;
334 }
335}
336
337// Tests that we can find codecs by name or id, and that we interpret the
338// clockrate and bitrate fields properly.
339TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
340 cricket::AudioCodec codec;
341 webrtc::CodecInst codec_inst;
342 // Find PCMU with explicit clockrate and bitrate.
343 EXPECT_TRUE(engine_.FindWebRtcCodec(kPcmuCodec, &codec_inst));
344 // Find ISAC with explicit clockrate and 0 bitrate.
345 EXPECT_TRUE(engine_.FindWebRtcCodec(kIsacCodec, &codec_inst));
346 // Find telephone-event with explicit clockrate and 0 bitrate.
347 EXPECT_TRUE(engine_.FindWebRtcCodec(kTelephoneEventCodec, &codec_inst));
348 // Find ISAC with a different payload id.
349 codec = kIsacCodec;
350 codec.id = 127;
351 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
352 EXPECT_EQ(codec.id, codec_inst.pltype);
353 // Find PCMU with a 0 clockrate.
354 codec = kPcmuCodec;
355 codec.clockrate = 0;
356 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
357 EXPECT_EQ(codec.id, codec_inst.pltype);
358 EXPECT_EQ(8000, codec_inst.plfreq);
359 // Find PCMU with a 0 bitrate.
360 codec = kPcmuCodec;
361 codec.bitrate = 0;
362 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
363 EXPECT_EQ(codec.id, codec_inst.pltype);
364 EXPECT_EQ(64000, codec_inst.rate);
365 // Find ISAC with an explicit bitrate.
366 codec = kIsacCodec;
367 codec.bitrate = 32000;
368 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
369 EXPECT_EQ(codec.id, codec_inst.pltype);
370 EXPECT_EQ(32000, codec_inst.rate);
371}
372
373// Test that we set our inbound codecs properly, including changing PT.
374TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
375 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200376 cricket::AudioRecvParameters parameters;
377 parameters.codecs.push_back(kIsacCodec);
378 parameters.codecs.push_back(kPcmuCodec);
379 parameters.codecs.push_back(kTelephoneEventCodec);
380 parameters.codecs[0].id = 106; // collide with existing telephone-event
381 parameters.codecs[2].id = 126;
382 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700383 EXPECT_TRUE(channel_->AddRecvStream(
384 cricket::StreamParams::CreateLegacy(kSsrc1)));
385 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000386 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000387 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000388 gcodec.plfreq = 16000;
389 gcodec.channels = 1;
390 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
391 EXPECT_EQ(106, gcodec.pltype);
392 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000393 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000394 "telephone-event");
395 gcodec.plfreq = 8000;
396 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
397 EXPECT_EQ(126, gcodec.pltype);
398 EXPECT_STREQ("telephone-event", gcodec.plname);
399}
400
401// Test that we fail to set an unknown inbound codec.
402TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
403 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200404 cricket::AudioRecvParameters parameters;
405 parameters.codecs.push_back(kIsacCodec);
406 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
407 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000408}
409
410// Test that we fail if we have duplicate types in the inbound list.
411TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
412 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200413 cricket::AudioRecvParameters parameters;
414 parameters.codecs.push_back(kIsacCodec);
415 parameters.codecs.push_back(kCn16000Codec);
416 parameters.codecs[1].id = kIsacCodec.id;
417 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000418}
419
420// Test that we can decode OPUS without stereo parameters.
421TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
422 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200423 cricket::AudioRecvParameters parameters;
424 parameters.codecs.push_back(kIsacCodec);
425 parameters.codecs.push_back(kPcmuCodec);
426 parameters.codecs.push_back(kOpusCodec);
427 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000428 EXPECT_TRUE(channel_->AddRecvStream(
429 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700430 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000431 webrtc::CodecInst opus;
432 engine_.FindWebRtcCodec(kOpusCodec, &opus);
433 // Even without stereo parameters, recv codecs still specify channels = 2.
434 EXPECT_EQ(2, opus.channels);
435 EXPECT_EQ(111, opus.pltype);
436 EXPECT_STREQ("opus", opus.plname);
437 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700438 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000439 EXPECT_EQ(111, opus.pltype);
440}
441
442// Test that we can decode OPUS with stereo = 0.
443TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
444 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200445 cricket::AudioRecvParameters parameters;
446 parameters.codecs.push_back(kIsacCodec);
447 parameters.codecs.push_back(kPcmuCodec);
448 parameters.codecs.push_back(kOpusCodec);
449 parameters.codecs[2].params["stereo"] = "0";
450 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000451 EXPECT_TRUE(channel_->AddRecvStream(
452 cricket::StreamParams::CreateLegacy(kSsrc1)));
453 int channel_num2 = voe_.GetLastChannel();
454 webrtc::CodecInst opus;
455 engine_.FindWebRtcCodec(kOpusCodec, &opus);
456 // Even when stereo is off, recv codecs still specify channels = 2.
457 EXPECT_EQ(2, opus.channels);
458 EXPECT_EQ(111, opus.pltype);
459 EXPECT_STREQ("opus", opus.plname);
460 opus.pltype = 0;
461 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
462 EXPECT_EQ(111, opus.pltype);
463}
464
465// Test that we can decode OPUS with stereo = 1.
466TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
467 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200468 cricket::AudioRecvParameters parameters;
469 parameters.codecs.push_back(kIsacCodec);
470 parameters.codecs.push_back(kPcmuCodec);
471 parameters.codecs.push_back(kOpusCodec);
472 parameters.codecs[2].params["stereo"] = "1";
473 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000474 EXPECT_TRUE(channel_->AddRecvStream(
475 cricket::StreamParams::CreateLegacy(kSsrc1)));
476 int channel_num2 = voe_.GetLastChannel();
477 webrtc::CodecInst opus;
478 engine_.FindWebRtcCodec(kOpusCodec, &opus);
479 EXPECT_EQ(2, opus.channels);
480 EXPECT_EQ(111, opus.pltype);
481 EXPECT_STREQ("opus", opus.plname);
482 opus.pltype = 0;
483 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
484 EXPECT_EQ(111, opus.pltype);
485}
486
487// Test that changes to recv codecs are applied to all streams.
488TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
489 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200490 cricket::AudioRecvParameters parameters;
491 parameters.codecs.push_back(kIsacCodec);
492 parameters.codecs.push_back(kPcmuCodec);
493 parameters.codecs.push_back(kTelephoneEventCodec);
494 parameters.codecs[0].id = 106; // collide with existing telephone-event
495 parameters.codecs[2].id = 126;
496 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000497 EXPECT_TRUE(channel_->AddRecvStream(
498 cricket::StreamParams::CreateLegacy(kSsrc1)));
499 int channel_num2 = voe_.GetLastChannel();
500 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000501 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000502 gcodec.plfreq = 16000;
503 gcodec.channels = 1;
504 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
505 EXPECT_EQ(106, gcodec.pltype);
506 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000507 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname),
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000508 "telephone-event");
509 gcodec.plfreq = 8000;
510 gcodec.channels = 1;
511 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
512 EXPECT_EQ(126, gcodec.pltype);
513 EXPECT_STREQ("telephone-event", gcodec.plname);
514}
515
516TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenberg1ac56142015-10-13 03:58:19 -0700517 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200518 cricket::AudioRecvParameters parameters;
519 parameters.codecs.push_back(kIsacCodec);
520 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200521 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000522
523 int channel_num2 = voe_.GetLastChannel();
524 webrtc::CodecInst gcodec;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000525 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000526 gcodec.plfreq = 16000;
527 gcodec.channels = 1;
528 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
529 EXPECT_EQ(106, gcodec.pltype);
530 EXPECT_STREQ("ISAC", gcodec.plname);
531}
532
533// Test that we can apply the same set of codecs again while playing.
534TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700535 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200536 cricket::AudioRecvParameters parameters;
537 parameters.codecs.push_back(kIsacCodec);
538 parameters.codecs.push_back(kCn16000Codec);
539 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000540 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200541 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000542
543 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200544 parameters.codecs[0].id = 127;
545 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
546 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000547 EXPECT_TRUE(voe_.GetPlayout(channel_num));
548}
549
550// Test that we can add a codec while playing.
551TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700552 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200553 cricket::AudioRecvParameters parameters;
554 parameters.codecs.push_back(kIsacCodec);
555 parameters.codecs.push_back(kCn16000Codec);
556 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000557 EXPECT_TRUE(channel_->SetPlayout(true));
558
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200559 parameters.codecs.push_back(kOpusCodec);
560 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
561 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000562 EXPECT_TRUE(voe_.GetPlayout(channel_num));
563 webrtc::CodecInst gcodec;
564 EXPECT_TRUE(engine_.FindWebRtcCodec(kOpusCodec, &gcodec));
565 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
566}
567
568TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenberg1ac56142015-10-13 03:58:19 -0700569 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000570
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000571 // Test that when autobw is enabled, bitrate is kept as the default
572 // value. autobw is enabled for the following tests because the target
573 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000574
575 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000576 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000577
578 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000579 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000580
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000581 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000582 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000583}
584
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000585TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700586 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000587
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000588 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000589
590 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000591 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
592 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000593
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000594 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000595 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
596 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000597}
598
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000599TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700600 EXPECT_TRUE(SetupEngineWithSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000601
602 // Test that we can only set a maximum bitrate for a fixed-rate codec
603 // if it's bigger than the fixed rate.
604
605 // PCMU, fixed bitrate == 64000.
606 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
607 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
608 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
609 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
610 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
611 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
612 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
613}
614
615TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -0700616 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200617 const int kDesiredBitrate = 128000;
618 cricket::AudioSendParameters parameters;
619 parameters.codecs = engine_.codecs();
620 parameters.max_bandwidth_bps = kDesiredBitrate;
621 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000622
623 EXPECT_TRUE(channel_->AddSendStream(
624 cricket::StreamParams::CreateLegacy(kSsrc1)));
625
626 int channel_num = voe_.GetLastChannel();
627 webrtc::CodecInst codec;
628 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200629 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000630}
631
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000632// Test that bitrate cannot be set for CBR codecs.
633// Bitrate is ignored if it is higher than the fixed bitrate.
634// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000635TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenberg1ac56142015-10-13 03:58:19 -0700636 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000637
638 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200639 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
640 int channel_num = voe_.GetLastChannel();
641 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000642 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
643 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200644
645 send_parameters_.max_bandwidth_bps = 128000;
646 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000647 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
648 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200649
650 send_parameters_.max_bandwidth_bps = 128;
651 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000652 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
653 EXPECT_EQ(64000, codec.rate);
654}
655
656// Test that we apply codecs properly.
657TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenberg1ac56142015-10-13 03:58:19 -0700658 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200659 cricket::AudioSendParameters parameters;
660 parameters.codecs.push_back(kIsacCodec);
661 parameters.codecs.push_back(kPcmuCodec);
662 parameters.codecs.push_back(kRedCodec);
663 parameters.codecs[0].id = 96;
664 parameters.codecs[0].bitrate = 48000;
665 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000666 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200667 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000668 webrtc::CodecInst gcodec;
669 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
670 EXPECT_EQ(96, gcodec.pltype);
671 EXPECT_EQ(48000, gcodec.rate);
672 EXPECT_STREQ("ISAC", gcodec.plname);
673 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000674 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000675 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
676 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
677 EXPECT_EQ(106, voe_.GetSendTelephoneEventPayloadType(channel_num));
678}
679
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000680// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
681// to apply.
682TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenberg1ac56142015-10-13 03:58:19 -0700683 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200684 cricket::AudioSendParameters parameters;
685 parameters.codecs.push_back(kIsacCodec);
686 parameters.codecs.push_back(kPcmuCodec);
687 parameters.codecs.push_back(kRedCodec);
688 parameters.codecs[0].id = 96;
689 parameters.codecs[0].bitrate = 48000;
690 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000691 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
692 // Calling SetSendCodec again with same codec which is already set.
693 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200694 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000695 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
696}
697
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000698// Verify that G722 is set with 16000 samples per second to WebRTC.
699TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenberg1ac56142015-10-13 03:58:19 -0700700 EXPECT_TRUE(SetupEngineWithSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000701 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200702 cricket::AudioSendParameters parameters;
703 parameters.codecs.push_back(kG722CodecSdp);
704 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000705 webrtc::CodecInst gcodec;
706 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
707 EXPECT_STREQ("G722", gcodec.plname);
708 EXPECT_EQ(1, gcodec.channels);
709 EXPECT_EQ(16000, gcodec.plfreq);
710}
711
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000712// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000713TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenberg1ac56142015-10-13 03:58:19 -0700714 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200715 cricket::AudioSendParameters parameters;
716 parameters.codecs.push_back(kOpusCodec);
717 parameters.codecs[0].bitrate = 0;
718 parameters.codecs[0].clockrate = 50000;
719 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000720}
721
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000722// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000723TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700724 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200725 cricket::AudioSendParameters parameters;
726 parameters.codecs.push_back(kOpusCodec);
727 parameters.codecs[0].bitrate = 0;
728 parameters.codecs[0].channels = 0;
729 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000730}
731
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000732// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000733TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700734 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200735 cricket::AudioSendParameters parameters;
736 parameters.codecs.push_back(kOpusCodec);
737 parameters.codecs[0].bitrate = 0;
738 parameters.codecs[0].channels = 0;
739 parameters.codecs[0].params["stereo"] = "1";
740 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000741}
742
743// Test that if channel is 1 for opus and there's no stereo, we fail.
744TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700745 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200746 cricket::AudioSendParameters parameters;
747 parameters.codecs.push_back(kOpusCodec);
748 parameters.codecs[0].bitrate = 0;
749 parameters.codecs[0].channels = 1;
750 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000751}
752
753// Test that if channel is 1 for opus and stereo=0, we fail.
754TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700755 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200756 cricket::AudioSendParameters parameters;
757 parameters.codecs.push_back(kOpusCodec);
758 parameters.codecs[0].bitrate = 0;
759 parameters.codecs[0].channels = 1;
760 parameters.codecs[0].params["stereo"] = "0";
761 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000762}
763
764// Test that if channel is 1 for opus and stereo=1, we fail.
765TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
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(kOpusCodec);
769 parameters.codecs[0].bitrate = 0;
770 parameters.codecs[0].channels = 1;
771 parameters.codecs[0].params["stereo"] = "1";
772 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000773}
774
775// Test that with bitrate=0 and no stereo,
776// channels and bitrate are 1 and 32000.
777TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700778 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000779 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200780 cricket::AudioSendParameters parameters;
781 parameters.codecs.push_back(kOpusCodec);
782 parameters.codecs[0].bitrate = 0;
783 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000784 webrtc::CodecInst gcodec;
785 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
786 EXPECT_STREQ("opus", gcodec.plname);
787 EXPECT_EQ(1, gcodec.channels);
788 EXPECT_EQ(32000, gcodec.rate);
789}
790
791// Test that with bitrate=0 and stereo=0,
792// channels and bitrate are 1 and 32000.
793TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700794 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000795 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200796 cricket::AudioSendParameters parameters;
797 parameters.codecs.push_back(kOpusCodec);
798 parameters.codecs[0].bitrate = 0;
799 parameters.codecs[0].params["stereo"] = "0";
800 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000801 webrtc::CodecInst gcodec;
802 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
803 EXPECT_STREQ("opus", gcodec.plname);
804 EXPECT_EQ(1, gcodec.channels);
805 EXPECT_EQ(32000, gcodec.rate);
806}
807
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000808// Test that with bitrate=invalid and stereo=0,
809// channels and bitrate are 1 and 32000.
810TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700811 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000812 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200813 cricket::AudioSendParameters parameters;
814 parameters.codecs.push_back(kOpusCodec);
815 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000816 webrtc::CodecInst gcodec;
817
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000818 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200819 parameters.codecs[0].bitrate = 5999;
820 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000821 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
822 EXPECT_STREQ("opus", gcodec.plname);
823 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000824 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000825
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200826 parameters.codecs[0].bitrate = 510001;
827 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000828 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
829 EXPECT_STREQ("opus", gcodec.plname);
830 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000831 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000832}
833
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000834// Test that with bitrate=0 and stereo=1,
835// channels and bitrate are 2 and 64000.
836TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700837 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000838 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200839 cricket::AudioSendParameters parameters;
840 parameters.codecs.push_back(kOpusCodec);
841 parameters.codecs[0].bitrate = 0;
842 parameters.codecs[0].params["stereo"] = "1";
843 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000844 webrtc::CodecInst gcodec;
845 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
846 EXPECT_STREQ("opus", gcodec.plname);
847 EXPECT_EQ(2, gcodec.channels);
848 EXPECT_EQ(64000, gcodec.rate);
849}
850
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000851// Test that with bitrate=invalid and stereo=1,
852// channels and bitrate are 2 and 64000.
853TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700854 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000855 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200856 cricket::AudioSendParameters parameters;
857 parameters.codecs.push_back(kOpusCodec);
858 parameters.codecs[0].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000859 webrtc::CodecInst gcodec;
860
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000861 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200862 parameters.codecs[0].bitrate = 5999;
863 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000864 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
865 EXPECT_STREQ("opus", gcodec.plname);
866 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000867 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000868
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200869 parameters.codecs[0].bitrate = 510001;
870 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000871 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
872 EXPECT_STREQ("opus", gcodec.plname);
873 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000874 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000875}
876
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000877// Test that with bitrate=N and stereo unset,
878// channels and bitrate are 1 and N.
879TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700880 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000881 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200882 cricket::AudioSendParameters parameters;
883 parameters.codecs.push_back(kOpusCodec);
884 parameters.codecs[0].bitrate = 96000;
885 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000886 webrtc::CodecInst gcodec;
887 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
888 EXPECT_EQ(111, gcodec.pltype);
889 EXPECT_EQ(96000, gcodec.rate);
890 EXPECT_STREQ("opus", gcodec.plname);
891 EXPECT_EQ(1, gcodec.channels);
892 EXPECT_EQ(48000, gcodec.plfreq);
893}
894
895// Test that with bitrate=N and stereo=0,
896// channels and bitrate are 1 and N.
897TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700898 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000899 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200900 cricket::AudioSendParameters parameters;
901 parameters.codecs.push_back(kOpusCodec);
902 parameters.codecs[0].bitrate = 30000;
903 parameters.codecs[0].params["stereo"] = "0";
904 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000905 webrtc::CodecInst gcodec;
906 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
907 EXPECT_EQ(1, gcodec.channels);
908 EXPECT_EQ(30000, gcodec.rate);
909 EXPECT_STREQ("opus", gcodec.plname);
910}
911
912// Test that with bitrate=N and without any parameters,
913// channels and bitrate are 1 and N.
914TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenberg1ac56142015-10-13 03:58:19 -0700915 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000916 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200917 cricket::AudioSendParameters parameters;
918 parameters.codecs.push_back(kOpusCodec);
919 parameters.codecs[0].bitrate = 30000;
920 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000921 webrtc::CodecInst gcodec;
922 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
923 EXPECT_EQ(1, gcodec.channels);
924 EXPECT_EQ(30000, gcodec.rate);
925 EXPECT_STREQ("opus", gcodec.plname);
926}
927
928// Test that with bitrate=N and stereo=1,
929// channels and bitrate are 2 and N.
930TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700931 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000932 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200933 cricket::AudioSendParameters parameters;
934 parameters.codecs.push_back(kOpusCodec);
935 parameters.codecs[0].bitrate = 30000;
936 parameters.codecs[0].params["stereo"] = "1";
937 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000938 webrtc::CodecInst gcodec;
939 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
940 EXPECT_EQ(2, gcodec.channels);
941 EXPECT_EQ(30000, gcodec.rate);
942 EXPECT_STREQ("opus", gcodec.plname);
943}
944
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000945// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
946// Also test that the "maxaveragebitrate" can't be set to values outside the
947// range of 6000 and 510000
948TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenberg1ac56142015-10-13 03:58:19 -0700949 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000950 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200951 cricket::AudioSendParameters parameters;
952 parameters.codecs.push_back(kOpusCodec);
953 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000954 webrtc::CodecInst gcodec;
955
956 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200957 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
958 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000959 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000960 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000961
962 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200963 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
964 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000965 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000966 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000967
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200968 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
969 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000970 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
971 EXPECT_EQ(200000, gcodec.rate);
972}
973
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000974// Test that we can enable NACK with opus as caller.
975TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700976 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000977 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200978 cricket::AudioSendParameters parameters;
979 parameters.codecs.push_back(kOpusCodec);
980 parameters.codecs[0].AddFeedbackParam(
981 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
982 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000983 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200984 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000985 EXPECT_TRUE(voe_.GetNACK(channel_num));
986}
987
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000988// Test that we can enable NACK with opus as callee.
989TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenberg0a617e22015-10-20 15:49:38 -0700990 EXPECT_TRUE(SetupEngineWithRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000991 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200992 cricket::AudioSendParameters parameters;
993 parameters.codecs.push_back(kOpusCodec);
994 parameters.codecs[0].AddFeedbackParam(
995 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
996 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000997 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200998 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000999 EXPECT_FALSE(voe_.GetNACK(channel_num));
1000
1001 EXPECT_TRUE(channel_->AddSendStream(
1002 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001003 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001004}
1005
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001006// Test that we can enable NACK on receive streams.
1007TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001008 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001009 int channel_num1 = voe_.GetLastChannel();
1010 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1011 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001012 cricket::AudioSendParameters parameters;
1013 parameters.codecs.push_back(kOpusCodec);
1014 parameters.codecs[0].AddFeedbackParam(
1015 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1016 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001017 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1018 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001019 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001020 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1021 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1022}
1023
1024// Test that we can disable NACK.
1025TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001026 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001027 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001028 cricket::AudioSendParameters parameters;
1029 parameters.codecs.push_back(kOpusCodec);
1030 parameters.codecs[0].AddFeedbackParam(
1031 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1032 cricket::kParamValueEmpty));
1033 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001034 EXPECT_TRUE(voe_.GetNACK(channel_num));
1035
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001036 parameters.codecs.clear();
1037 parameters.codecs.push_back(kOpusCodec);
1038 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001039 EXPECT_FALSE(voe_.GetNACK(channel_num));
1040}
1041
1042// Test that we can disable NACK on receive streams.
1043TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001044 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001045 int channel_num1 = voe_.GetLastChannel();
1046 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1047 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001048 cricket::AudioSendParameters parameters;
1049 parameters.codecs.push_back(kOpusCodec);
1050 parameters.codecs[0].AddFeedbackParam(
1051 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1052 cricket::kParamValueEmpty));
1053 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001054 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1055 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1056
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001057 parameters.codecs.clear();
1058 parameters.codecs.push_back(kOpusCodec);
1059 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001060 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1061 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1062}
1063
1064// Test that NACK is enabled on a new receive stream.
1065TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001066 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001067 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001068 cricket::AudioSendParameters parameters;
1069 parameters.codecs.push_back(kIsacCodec);
1070 parameters.codecs.push_back(kCn16000Codec);
1071 parameters.codecs[0].AddFeedbackParam(
1072 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1073 cricket::kParamValueEmpty));
1074 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001075 EXPECT_TRUE(voe_.GetNACK(channel_num));
1076
1077 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1078 channel_num = voe_.GetLastChannel();
1079 EXPECT_TRUE(voe_.GetNACK(channel_num));
1080 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1081 channel_num = voe_.GetLastChannel();
1082 EXPECT_TRUE(voe_.GetNACK(channel_num));
1083}
1084
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001085// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001086TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenberg1ac56142015-10-13 03:58:19 -07001087 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001088 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001089 cricket::AudioSendParameters parameters;
1090 parameters.codecs.push_back(kOpusCodec);
1091 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001092 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1093}
1094
1095// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001096TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001097 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001098 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001099 cricket::AudioSendParameters parameters;
1100 parameters.codecs.push_back(kOpusCodec);
1101 parameters.codecs[0].bitrate = 0;
1102 parameters.codecs[0].params["useinbandfec"] = "0";
1103 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001104 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1105 webrtc::CodecInst gcodec;
1106 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1107 EXPECT_STREQ("opus", gcodec.plname);
1108 EXPECT_EQ(1, gcodec.channels);
1109 EXPECT_EQ(32000, gcodec.rate);
1110}
1111
1112// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001113TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001114 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001115 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001116 cricket::AudioSendParameters parameters;
1117 parameters.codecs.push_back(kOpusCodec);
1118 parameters.codecs[0].bitrate = 0;
1119 parameters.codecs[0].params["useinbandfec"] = "1";
1120 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001121 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1122 webrtc::CodecInst gcodec;
1123 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1124 EXPECT_STREQ("opus", gcodec.plname);
1125 EXPECT_EQ(1, gcodec.channels);
1126 EXPECT_EQ(32000, gcodec.rate);
1127}
1128
1129// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001130TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001131 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001132 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001133 cricket::AudioSendParameters parameters;
1134 parameters.codecs.push_back(kOpusCodec);
1135 parameters.codecs[0].bitrate = 0;
1136 parameters.codecs[0].params["stereo"] = "1";
1137 parameters.codecs[0].params["useinbandfec"] = "1";
1138 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001139 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1140 webrtc::CodecInst gcodec;
1141 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1142 EXPECT_STREQ("opus", gcodec.plname);
1143 EXPECT_EQ(2, gcodec.channels);
1144 EXPECT_EQ(64000, gcodec.rate);
1145}
1146
1147// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001148TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001149 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001150 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001151 cricket::AudioSendParameters parameters;
1152 parameters.codecs.push_back(kIsacCodec);
1153 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001154 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1155}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001156
1157// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1158TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001159 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001160 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001161 cricket::AudioSendParameters parameters;
1162 parameters.codecs.push_back(kIsacCodec);
1163 parameters.codecs[0].params["useinbandfec"] = "1";
1164 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001165 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1166}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001167
1168// Test that Opus FEC status can be changed.
1169TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenberg1ac56142015-10-13 03:58:19 -07001170 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001171 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001172 cricket::AudioSendParameters parameters;
1173 parameters.codecs.push_back(kOpusCodec);
1174 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001175 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001176 parameters.codecs[0].params["useinbandfec"] = "1";
1177 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001178 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1179}
1180
1181// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1182TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenberg1ac56142015-10-13 03:58:19 -07001183 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001184 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001185 cricket::AudioSendParameters parameters;
1186 parameters.codecs.push_back(kOpusCodec);
1187 parameters.codecs[0].bitrate = 0;
1188 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1189 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001190 EXPECT_EQ(cricket::kOpusBandwidthNb,
1191 voe_.GetMaxEncodingBandwidth(channel_num));
1192 webrtc::CodecInst gcodec;
1193 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1194 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001195
1196 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001197 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1198 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001199 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1200 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001201}
1202
1203// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1204TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenberg1ac56142015-10-13 03:58:19 -07001205 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +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].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1211 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001212 EXPECT_EQ(cricket::kOpusBandwidthMb,
1213 voe_.GetMaxEncodingBandwidth(channel_num));
1214 webrtc::CodecInst gcodec;
1215 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1216 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001217
1218 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001219 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1220 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001221 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1222 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001223}
1224
1225// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1226TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenberg1ac56142015-10-13 03:58:19 -07001227 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001228 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001229 cricket::AudioSendParameters parameters;
1230 parameters.codecs.push_back(kOpusCodec);
1231 parameters.codecs[0].bitrate = 0;
1232 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1233 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001234 EXPECT_EQ(cricket::kOpusBandwidthWb,
1235 voe_.GetMaxEncodingBandwidth(channel_num));
1236 webrtc::CodecInst gcodec;
1237 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1238 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001239
1240 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001241 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1242 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001243 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1244 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001245}
1246
1247// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1248TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenberg1ac56142015-10-13 03:58:19 -07001249 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001250 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001251 cricket::AudioSendParameters parameters;
1252 parameters.codecs.push_back(kOpusCodec);
1253 parameters.codecs[0].bitrate = 0;
1254 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1255 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001256 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1257 voe_.GetMaxEncodingBandwidth(channel_num));
1258 webrtc::CodecInst gcodec;
1259 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1260 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001261
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001262 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001263 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1264 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001265 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1266 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001267}
1268
1269// Test 24000 < maxplaybackrate triggers Opus full band mode.
1270TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenberg1ac56142015-10-13 03:58:19 -07001271 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001272 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001273 cricket::AudioSendParameters parameters;
1274 parameters.codecs.push_back(kOpusCodec);
1275 parameters.codecs[0].bitrate = 0;
1276 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1277 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001278 EXPECT_EQ(cricket::kOpusBandwidthFb,
1279 voe_.GetMaxEncodingBandwidth(channel_num));
1280 webrtc::CodecInst gcodec;
1281 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1282 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001283
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001284 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001285 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1286 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001287 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1288 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001289}
1290
1291// Test Opus that without maxplaybackrate, default playback rate is used.
1292TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001293 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001294 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001295 cricket::AudioSendParameters parameters;
1296 parameters.codecs.push_back(kOpusCodec);
1297 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001298 EXPECT_EQ(cricket::kOpusBandwidthFb,
1299 voe_.GetMaxEncodingBandwidth(channel_num));
1300}
1301
1302// Test the with non-Opus, maxplaybackrate has no effect.
1303TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001304 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001305 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001306 cricket::AudioSendParameters parameters;
1307 parameters.codecs.push_back(kIsacCodec);
1308 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1309 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001310 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1311}
1312
1313// Test maxplaybackrate can be set on two streams.
1314TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001315 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001316 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001317 cricket::AudioSendParameters parameters;
1318 parameters.codecs.push_back(kOpusCodec);
1319 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001320 // Default bandwidth is 24000.
1321 EXPECT_EQ(cricket::kOpusBandwidthFb,
1322 voe_.GetMaxEncodingBandwidth(channel_num));
1323
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001324 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001325
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001326 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001327 EXPECT_EQ(cricket::kOpusBandwidthNb,
1328 voe_.GetMaxEncodingBandwidth(channel_num));
1329
1330 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1331 channel_num = voe_.GetLastChannel();
1332 EXPECT_EQ(cricket::kOpusBandwidthNb,
1333 voe_.GetMaxEncodingBandwidth(channel_num));
1334}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001335
Minyue Li7100dcd2015-03-27 05:05:59 +01001336// Test that with usedtx=0, Opus DTX is off.
1337TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001338 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001339 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001340 cricket::AudioSendParameters parameters;
1341 parameters.codecs.push_back(kOpusCodec);
1342 parameters.codecs[0].params["usedtx"] = "0";
1343 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001344 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1345}
1346
1347// Test that with usedtx=1, Opus DTX is on.
1348TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001349 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001350 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001351 cricket::AudioSendParameters parameters;
1352 parameters.codecs.push_back(kOpusCodec);
1353 parameters.codecs[0].params["usedtx"] = "1";
1354 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001355 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1356 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1357}
1358
1359// Test that usedtx=1 works with stereo Opus.
1360TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001361 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001362 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001363 cricket::AudioSendParameters parameters;
1364 parameters.codecs.push_back(kOpusCodec);
1365 parameters.codecs[0].params["usedtx"] = "1";
1366 parameters.codecs[0].params["stereo"] = "1";
1367 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001368 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1369 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1370}
1371
1372// Test that usedtx=1 does not work with non Opus.
1373TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001374 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001375 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001376 cricket::AudioSendParameters parameters;
1377 parameters.codecs.push_back(kIsacCodec);
1378 parameters.codecs[0].params["usedtx"] = "1";
1379 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001380 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1381}
1382
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001383// Test that we can switch back and forth between Opus and ISAC with CN.
1384TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenberg1ac56142015-10-13 03:58:19 -07001385 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001386 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001387 cricket::AudioSendParameters opus_parameters;
1388 opus_parameters.codecs.push_back(kOpusCodec);
1389 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001390 webrtc::CodecInst gcodec;
1391 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001392 EXPECT_EQ(111, gcodec.pltype);
1393 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001394
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001395 cricket::AudioSendParameters isac_parameters;
1396 isac_parameters.codecs.push_back(kIsacCodec);
1397 isac_parameters.codecs.push_back(kCn16000Codec);
1398 isac_parameters.codecs.push_back(kOpusCodec);
1399 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001400 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1401 EXPECT_EQ(103, gcodec.pltype);
1402 EXPECT_STREQ("ISAC", gcodec.plname);
1403
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001404 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001405 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001406 EXPECT_EQ(111, gcodec.pltype);
1407 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001408}
1409
1410// Test that we handle various ways of specifying bitrate.
1411TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001412 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001413 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001414 cricket::AudioSendParameters parameters;
1415 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1416 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001417 webrtc::CodecInst gcodec;
1418 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1419 EXPECT_EQ(103, gcodec.pltype);
1420 EXPECT_STREQ("ISAC", gcodec.plname);
1421 EXPECT_EQ(32000, gcodec.rate);
1422
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001423 parameters.codecs[0].bitrate = 0; // bitrate == default
1424 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001425 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1426 EXPECT_EQ(103, gcodec.pltype);
1427 EXPECT_STREQ("ISAC", gcodec.plname);
1428 EXPECT_EQ(-1, gcodec.rate);
1429
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001430 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1431 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001432 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1433 EXPECT_EQ(103, gcodec.pltype);
1434 EXPECT_STREQ("ISAC", gcodec.plname);
1435 EXPECT_EQ(28000, gcodec.rate);
1436
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001437 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1438 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001439 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1440 EXPECT_EQ(0, gcodec.pltype);
1441 EXPECT_STREQ("PCMU", gcodec.plname);
1442 EXPECT_EQ(64000, gcodec.rate);
1443
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001444 parameters.codecs[0].bitrate = 0; // bitrate == default
1445 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001446 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1447 EXPECT_EQ(0, gcodec.pltype);
1448 EXPECT_STREQ("PCMU", gcodec.plname);
1449 EXPECT_EQ(64000, gcodec.rate);
1450
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001451 parameters.codecs[0] = kOpusCodec;
1452 parameters.codecs[0].bitrate = 0; // bitrate == default
1453 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001454 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1455 EXPECT_EQ(111, gcodec.pltype);
1456 EXPECT_STREQ("opus", gcodec.plname);
1457 EXPECT_EQ(32000, gcodec.rate);
1458}
1459
Brave Yao5225dd82015-03-26 07:39:19 +08001460// Test that we could set packet size specified in kCodecParamPTime.
1461TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenberg1ac56142015-10-13 03:58:19 -07001462 EXPECT_TRUE(SetupEngineWithSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001463 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001464 cricket::AudioSendParameters parameters;
1465 parameters.codecs.push_back(kOpusCodec);
1466 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1467 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001468 webrtc::CodecInst gcodec;
1469 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1470 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1471
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001472 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1473 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001474 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1475 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1476
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001477 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1478 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001479 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1480 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1481
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001482 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1483 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1484 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001485 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1486 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1487
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001488 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1489 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1490 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001491 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1492 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1493}
1494
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001495// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001496TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenberg1ac56142015-10-13 03:58:19 -07001497 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001498 cricket::AudioSendParameters parameters;
1499 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001500}
1501
1502// Test that we can set send codecs even with telephone-event codec as the first
1503// one on the list.
1504TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001505 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001506 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001507 cricket::AudioSendParameters parameters;
1508 parameters.codecs.push_back(kTelephoneEventCodec);
1509 parameters.codecs.push_back(kIsacCodec);
1510 parameters.codecs.push_back(kPcmuCodec);
1511 parameters.codecs[0].id = 98; // DTMF
1512 parameters.codecs[1].id = 96;
1513 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001514 webrtc::CodecInst gcodec;
1515 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001516 EXPECT_EQ(96, gcodec.pltype);
1517 EXPECT_STREQ("ISAC", gcodec.plname);
1518 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1519}
1520
1521// Test that we can set send codecs even with CN codec as the first
1522// one on the list.
1523TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001524 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001525 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001526 cricket::AudioSendParameters parameters;
1527 parameters.codecs.push_back(kCn16000Codec);
1528 parameters.codecs.push_back(kIsacCodec);
1529 parameters.codecs.push_back(kPcmuCodec);
1530 parameters.codecs[0].id = 98; // wideband CN
1531 parameters.codecs[1].id = 96;
1532 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001533 webrtc::CodecInst gcodec;
1534 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1535 EXPECT_EQ(96, gcodec.pltype);
1536 EXPECT_STREQ("ISAC", gcodec.plname);
1537 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001538}
1539
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001540// Test that we set VAD and DTMF types correctly as caller.
1541TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001542 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001543 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001544 cricket::AudioSendParameters parameters;
1545 parameters.codecs.push_back(kIsacCodec);
1546 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001547 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001548 parameters.codecs.push_back(kCn16000Codec);
1549 parameters.codecs.push_back(kCn8000Codec);
1550 parameters.codecs.push_back(kTelephoneEventCodec);
1551 parameters.codecs.push_back(kRedCodec);
1552 parameters.codecs[0].id = 96;
1553 parameters.codecs[2].id = 97; // wideband CN
1554 parameters.codecs[4].id = 98; // DTMF
1555 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001556 webrtc::CodecInst gcodec;
1557 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1558 EXPECT_EQ(96, gcodec.pltype);
1559 EXPECT_STREQ("ISAC", gcodec.plname);
1560 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001561 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001562 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1563 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1564 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1565}
1566
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001567// Test that we set VAD and DTMF types correctly as callee.
1568TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001569 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001570 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001571 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001572
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001573 cricket::AudioSendParameters parameters;
1574 parameters.codecs.push_back(kIsacCodec);
1575 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001576 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001577 parameters.codecs.push_back(kCn16000Codec);
1578 parameters.codecs.push_back(kCn8000Codec);
1579 parameters.codecs.push_back(kTelephoneEventCodec);
1580 parameters.codecs.push_back(kRedCodec);
1581 parameters.codecs[0].id = 96;
1582 parameters.codecs[2].id = 97; // wideband CN
1583 parameters.codecs[4].id = 98; // DTMF
1584 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001585 EXPECT_TRUE(channel_->AddSendStream(
1586 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001587 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001588
1589 webrtc::CodecInst gcodec;
1590 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1591 EXPECT_EQ(96, gcodec.pltype);
1592 EXPECT_STREQ("ISAC", gcodec.plname);
1593 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001594 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001595 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1596 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1597 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1598}
1599
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001600// Test that we only apply VAD if we have a CN codec that matches the
1601// send codec clockrate.
1602TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenberg1ac56142015-10-13 03:58:19 -07001603 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001604 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001605 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001606 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001607 parameters.codecs.push_back(kIsacCodec);
1608 parameters.codecs.push_back(kCn16000Codec);
1609 parameters.codecs[1].id = 97;
1610 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001611 webrtc::CodecInst gcodec;
1612 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1613 EXPECT_STREQ("ISAC", gcodec.plname);
1614 EXPECT_TRUE(voe_.GetVAD(channel_num));
1615 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1616 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001617 parameters.codecs[0] = kPcmuCodec;
1618 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001619 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1620 EXPECT_STREQ("PCMU", gcodec.plname);
1621 EXPECT_FALSE(voe_.GetVAD(channel_num));
1622 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001623 parameters.codecs[1] = kCn8000Codec;
1624 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001625 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1626 EXPECT_STREQ("PCMU", gcodec.plname);
1627 EXPECT_TRUE(voe_.GetVAD(channel_num));
1628 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001629 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001630 parameters.codecs[0] = kIsacCodec;
1631 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001632 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1633 EXPECT_STREQ("ISAC", gcodec.plname);
1634 EXPECT_FALSE(voe_.GetVAD(channel_num));
1635}
1636
1637// Test that we perform case-insensitive matching of codec names.
1638TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenberg1ac56142015-10-13 03:58:19 -07001639 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001640 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001641 cricket::AudioSendParameters parameters;
1642 parameters.codecs.push_back(kIsacCodec);
1643 parameters.codecs.push_back(kPcmuCodec);
1644 parameters.codecs.push_back(kCn16000Codec);
1645 parameters.codecs.push_back(kCn8000Codec);
1646 parameters.codecs.push_back(kTelephoneEventCodec);
1647 parameters.codecs.push_back(kRedCodec);
1648 parameters.codecs[0].name = "iSaC";
1649 parameters.codecs[0].id = 96;
1650 parameters.codecs[2].id = 97; // wideband CN
1651 parameters.codecs[4].id = 98; // DTMF
1652 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001653 webrtc::CodecInst gcodec;
1654 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1655 EXPECT_EQ(96, gcodec.pltype);
1656 EXPECT_STREQ("ISAC", gcodec.plname);
1657 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001658 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001659 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1660 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1661 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1662}
1663
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001664// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001665TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001666 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001667 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001668 cricket::AudioSendParameters parameters;
1669 parameters.codecs.push_back(kRedCodec);
1670 parameters.codecs.push_back(kIsacCodec);
1671 parameters.codecs.push_back(kPcmuCodec);
1672 parameters.codecs[0].id = 127;
1673 parameters.codecs[0].params[""] = "96/96";
1674 parameters.codecs[1].id = 96;
1675 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001676 webrtc::CodecInst gcodec;
1677 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1678 EXPECT_EQ(96, gcodec.pltype);
1679 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001680 EXPECT_TRUE(voe_.GetRED(channel_num));
1681 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001682}
1683
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001684// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001685TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001686 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001687 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001688 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001689
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001690 cricket::AudioSendParameters parameters;
1691 parameters.codecs.push_back(kRedCodec);
1692 parameters.codecs.push_back(kIsacCodec);
1693 parameters.codecs.push_back(kPcmuCodec);
1694 parameters.codecs[0].id = 127;
1695 parameters.codecs[0].params[""] = "96/96";
1696 parameters.codecs[1].id = 96;
1697 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001698 EXPECT_TRUE(channel_->AddSendStream(
1699 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001700 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001701 webrtc::CodecInst gcodec;
1702 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1703 EXPECT_EQ(96, gcodec.pltype);
1704 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001705 EXPECT_TRUE(voe_.GetRED(channel_num));
1706 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001707}
1708
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001709// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001710TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
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;
1714 parameters.codecs.push_back(kRedCodec);
1715 parameters.codecs.push_back(kIsacCodec);
1716 parameters.codecs.push_back(kPcmuCodec);
1717 parameters.codecs[0].id = 127;
1718 parameters.codecs[1].id = 96;
1719 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001720 webrtc::CodecInst gcodec;
1721 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1722 EXPECT_EQ(96, gcodec.pltype);
1723 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001724 EXPECT_TRUE(voe_.GetRED(channel_num));
1725 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001726}
1727
1728// Test that we ignore RED if the parameters aren't named the way we expect.
1729TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001730 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001731 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001732 cricket::AudioSendParameters parameters;
1733 parameters.codecs.push_back(kRedCodec);
1734 parameters.codecs.push_back(kIsacCodec);
1735 parameters.codecs.push_back(kPcmuCodec);
1736 parameters.codecs[0].id = 127;
1737 parameters.codecs[0].params["ABC"] = "96/96";
1738 parameters.codecs[1].id = 96;
1739 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001740 webrtc::CodecInst gcodec;
1741 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1742 EXPECT_EQ(96, gcodec.pltype);
1743 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001744 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001745}
1746
1747// Test that we ignore RED if it uses different primary/secondary encoding.
1748TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001749 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001750 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001751 cricket::AudioSendParameters parameters;
1752 parameters.codecs.push_back(kRedCodec);
1753 parameters.codecs.push_back(kIsacCodec);
1754 parameters.codecs.push_back(kPcmuCodec);
1755 parameters.codecs[0].id = 127;
1756 parameters.codecs[0].params[""] = "96/0";
1757 parameters.codecs[1].id = 96;
1758 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001759 webrtc::CodecInst gcodec;
1760 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1761 EXPECT_EQ(96, gcodec.pltype);
1762 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001763 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001764}
1765
1766// Test that we ignore RED if it uses more than 2 encodings.
1767TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001768 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001769 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001770 cricket::AudioSendParameters parameters;
1771 parameters.codecs.push_back(kRedCodec);
1772 parameters.codecs.push_back(kIsacCodec);
1773 parameters.codecs.push_back(kPcmuCodec);
1774 parameters.codecs[0].id = 127;
1775 parameters.codecs[0].params[""] = "96/96/96";
1776 parameters.codecs[1].id = 96;
1777 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001778 webrtc::CodecInst gcodec;
1779 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1780 EXPECT_EQ(96, gcodec.pltype);
1781 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001782 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001783}
1784
1785// Test that we ignore RED if it has bogus codec ids.
1786TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001787 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001788 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001789 cricket::AudioSendParameters parameters;
1790 parameters.codecs.push_back(kRedCodec);
1791 parameters.codecs.push_back(kIsacCodec);
1792 parameters.codecs.push_back(kPcmuCodec);
1793 parameters.codecs[0].id = 127;
1794 parameters.codecs[0].params[""] = "ABC/ABC";
1795 parameters.codecs[1].id = 96;
1796 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001797 webrtc::CodecInst gcodec;
1798 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1799 EXPECT_EQ(96, gcodec.pltype);
1800 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001801 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001802}
1803
1804// Test that we ignore RED if it refers to a codec that is not present.
1805TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001806 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001807 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001808 cricket::AudioSendParameters parameters;
1809 parameters.codecs.push_back(kRedCodec);
1810 parameters.codecs.push_back(kIsacCodec);
1811 parameters.codecs.push_back(kPcmuCodec);
1812 parameters.codecs[0].id = 127;
1813 parameters.codecs[0].params[""] = "97/97";
1814 parameters.codecs[1].id = 96;
1815 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001816 webrtc::CodecInst gcodec;
1817 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1818 EXPECT_EQ(96, gcodec.pltype);
1819 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001820 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001821}
1822
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001823// Test support for audio level header extension.
1824TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1825 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001826}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001827TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1828 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1829}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001830
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001831// Test support for absolute send time header extension.
1832TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1833 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1834}
1835TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1836 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001837}
1838
solenberg1ac56142015-10-13 03:58:19 -07001839// Test that we can create a channel and start sending on it.
1840TEST_F(WebRtcVoiceEngineTestFake, Send) {
1841 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001842 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001843 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001844 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1845 EXPECT_TRUE(voe_.GetSend(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001846 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1847 EXPECT_FALSE(voe_.GetSend(channel_num));
solenberg1ac56142015-10-13 03:58:19 -07001848}
1849
1850// Test that we can create a channel and start playing out on it.
1851TEST_F(WebRtcVoiceEngineTestFake, Playout) {
1852 EXPECT_TRUE(SetupEngineWithRecvStream());
1853 int channel_num = voe_.GetLastChannel();
1854 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
1855 EXPECT_TRUE(channel_->SetPlayout(true));
1856 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001857 EXPECT_TRUE(channel_->SetPlayout(false));
1858 EXPECT_FALSE(voe_.GetPlayout(channel_num));
1859}
1860
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001861// Test that we can add and remove send streams.
1862TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
1863 SetupForMultiSendStream();
1864
Peter Boström0c4e06b2015-10-07 12:23:21 +02001865 static const uint32_t kSsrcs4[] = {1, 2, 3, 4};
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001866
1867 // Set the global state for sending.
1868 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1869
1870 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1871 EXPECT_TRUE(channel_->AddSendStream(
1872 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1873
1874 // Verify that we are in a sending state for all the created streams.
1875 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1876 EXPECT_TRUE(voe_.GetSend(channel_num));
1877 }
1878
1879 // Remove the first send channel, which is the default channel. It will only
1880 // recycle the default channel but not delete it.
1881 EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[0]));
1882 // Stream should already be Removed from the send stream list.
1883 EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[0]));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001884
1885 // Delete the rest of send channel streams.
1886 for (unsigned int i = 1; i < ARRAY_SIZE(kSsrcs4); ++i) {
1887 EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[i]));
1888 // Stream should already be deleted.
1889 EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[i]));
1890 EXPECT_EQ(-1, voe_.GetChannelFromLocalSsrc(kSsrcs4[i]));
1891 }
1892}
1893
1894// Test SetSendCodecs correctly configure the codecs in all send streams.
1895TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
1896 SetupForMultiSendStream();
1897
Peter Boström0c4e06b2015-10-07 12:23:21 +02001898 static const uint32_t kSsrcs4[] = {1, 2, 3, 4};
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001899 // Create send streams.
1900 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1901 EXPECT_TRUE(channel_->AddSendStream(
1902 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1903 }
1904
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001905 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001906 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001907 parameters.codecs.push_back(kIsacCodec);
1908 parameters.codecs.push_back(kCn16000Codec);
1909 parameters.codecs[1].id = 97;
1910 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001911
1912 // Verify ISAC and VAD are corrected configured on all send channels.
1913 webrtc::CodecInst gcodec;
1914 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1915 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1916 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1917 EXPECT_STREQ("ISAC", gcodec.plname);
1918 EXPECT_TRUE(voe_.GetVAD(channel_num));
1919 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1920 }
1921
1922 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001923 parameters.codecs[0] = kPcmuCodec;
1924 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001925 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1926 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1927 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1928 EXPECT_STREQ("PCMU", gcodec.plname);
1929 EXPECT_FALSE(voe_.GetVAD(channel_num));
1930 }
1931}
1932
1933// Test we can SetSend on all send streams correctly.
1934TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
1935 SetupForMultiSendStream();
1936
Peter Boström0c4e06b2015-10-07 12:23:21 +02001937 static const uint32_t kSsrcs4[] = {1, 2, 3, 4};
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001938 // Create the send channels and they should be a SEND_NOTHING date.
1939 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1940 EXPECT_TRUE(channel_->AddSendStream(
1941 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1942 int channel_num = voe_.GetLastChannel();
1943 EXPECT_FALSE(voe_.GetSend(channel_num));
1944 }
1945
1946 // Set the global state for starting sending.
1947 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1948 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1949 // Verify that we are in a sending state for all the send streams.
1950 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1951 EXPECT_TRUE(voe_.GetSend(channel_num));
1952 }
1953
1954 // Set the global state for stopping sending.
1955 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1956 for (unsigned int i = 1; i < ARRAY_SIZE(kSsrcs4); ++i) {
1957 // Verify that we are in a stop state for all the send streams.
1958 int channel_num = voe_.GetChannelFromLocalSsrc(kSsrcs4[i]);
1959 EXPECT_FALSE(voe_.GetSend(channel_num));
1960 }
1961}
1962
1963// Test we can set the correct statistics on all send streams.
1964TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
1965 SetupForMultiSendStream();
1966
Peter Boström0c4e06b2015-10-07 12:23:21 +02001967 static const uint32_t kSsrcs4[] = {1, 2, 3, 4};
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001968 // Create send streams.
1969 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
1970 EXPECT_TRUE(channel_->AddSendStream(
1971 cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
1972 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00001973 // Create a receive stream to check that none of the send streams end up in
1974 // the receive stream stats.
1975 EXPECT_TRUE(channel_->AddRecvStream(
1976 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001977 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001978 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
1979 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001980
1981 cricket::VoiceMediaInfo info;
1982 EXPECT_EQ(true, channel_->GetStats(&info));
1983 EXPECT_EQ(static_cast<size_t>(ARRAY_SIZE(kSsrcs4)), info.senders.size());
1984
1985 // Verify the statistic information is correct.
1986 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs4); ++i) {
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +00001987 EXPECT_EQ(kSsrcs4[i], info.senders[i].ssrc());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001988 EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
1989 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].bytes_sent);
1990 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_sent);
1991 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].packets_lost);
1992 EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[i].fraction_lost);
1993 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].ext_seqnum);
1994 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].rtt_ms);
1995 EXPECT_EQ(cricket::kIntStatValue, info.senders[i].jitter_ms);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00001996 EXPECT_EQ(kPcmuCodec.name, info.senders[i].codec_name);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001997 }
solenberg43e83d42015-10-20 06:41:01 -07001998 EXPECT_EQ(0u, info.receivers.size());
solenberg1ac56142015-10-13 03:58:19 -07001999
solenberg43e83d42015-10-20 06:41:01 -07002000 // Registered stream's remote SSRC is kSsrc2. Send a packet with SSRC=1.
2001 // We should drop the packet and no stats should be available.
2002 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002003 EXPECT_EQ(true, channel_->GetStats(&info));
solenberg1ac56142015-10-13 03:58:19 -07002004 EXPECT_EQ(0u, info.receivers.size());
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002005
solenberg43e83d42015-10-20 06:41:01 -07002006 // Remove the kSsrc2 stream and deliver a new packet - a default receive
2007 // stream should be created and we should see stats.
2008 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
solenberg1ac56142015-10-13 03:58:19 -07002009 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2010 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002011 EXPECT_EQ(1u, info.receivers.size());
solenberg43e83d42015-10-20 06:41:01 -07002012
2013 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd);
2014 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd);
2015 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost);
2016 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum);
2017 EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name);
2018 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentExpandRate) /
2019 (1 << 14), info.receivers[0].expand_rate);
2020 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSpeechExpandRate) /
2021 (1 << 14), info.receivers[0].speech_expand_rate);
2022 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSecondaryDecodedRate) /
2023 (1 << 14), info.receivers[0].secondary_decoded_rate);
2024 EXPECT_EQ(
2025 static_cast<float>(cricket::kNetStats.currentAccelerateRate) / (1 << 14),
2026 info.receivers[0].accelerate_rate);
2027 EXPECT_EQ(
2028 static_cast<float>(cricket::kNetStats.currentPreemptiveRate) / (1 << 14),
2029 info.receivers[0].preemptive_expand_rate);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002030}
2031
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002032// Test that we can add and remove receive streams, and do proper send/playout.
2033// We can receive on multiple streams while sending one stream.
2034TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002035 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002036 int channel_num1 = voe_.GetLastChannel();
2037
solenberg1ac56142015-10-13 03:58:19 -07002038 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002039 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002040 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002041 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002042
solenberg1ac56142015-10-13 03:58:19 -07002043 // Adding another stream should enable playout on the new stream only.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002044 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2045 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002046 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2047 EXPECT_TRUE(voe_.GetSend(channel_num1));
2048 EXPECT_FALSE(voe_.GetSend(channel_num2));
2049
solenberg1ac56142015-10-13 03:58:19 -07002050 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002051 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2052 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2053
2054 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2055 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2056 int channel_num3 = voe_.GetLastChannel();
2057 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2058 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2059 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2060 EXPECT_FALSE(voe_.GetSend(channel_num3));
2061
2062 // Stop sending.
2063 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2064 EXPECT_FALSE(voe_.GetSend(channel_num1));
2065 EXPECT_FALSE(voe_.GetSend(channel_num2));
2066 EXPECT_FALSE(voe_.GetSend(channel_num3));
2067
2068 // Stop playout.
2069 EXPECT_TRUE(channel_->SetPlayout(false));
2070 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2071 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2072 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2073
solenberg1ac56142015-10-13 03:58:19 -07002074 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002075 EXPECT_TRUE(channel_->SetPlayout(true));
2076 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2077 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2078 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2079
solenberg1ac56142015-10-13 03:58:19 -07002080 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002081 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2082 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002083 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002084}
2085
2086// Test that we can set the devices to use.
2087TEST_F(WebRtcVoiceEngineTestFake, SetDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002088 EXPECT_TRUE(SetupEngineWithSendStream());
2089 int send_channel = voe_.GetLastChannel();
2090 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2091 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002092 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002093
2094 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2095 cricket::kFakeDefaultDeviceId);
2096 cricket::Device dev(cricket::kFakeDeviceName,
2097 cricket::kFakeDeviceId);
2098
2099 // Test SetDevices() while not sending or playing.
2100 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2101
2102 // Test SetDevices() while sending and playing.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002103 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2104 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002105 EXPECT_TRUE(voe_.GetSend(send_channel));
2106 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002107
2108 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2109
solenberg1ac56142015-10-13 03:58:19 -07002110 EXPECT_TRUE(voe_.GetSend(send_channel));
2111 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002112
2113 // Test that failure to open newly selected devices does not prevent opening
2114 // ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002115 voe_.set_playout_fail_channel(recv_channel);
2116 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002117
2118 EXPECT_FALSE(engine_.SetDevices(&default_dev, &default_dev));
2119
solenberg1ac56142015-10-13 03:58:19 -07002120 EXPECT_FALSE(voe_.GetSend(send_channel));
2121 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002122
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002123 voe_.set_playout_fail_channel(-1);
2124 voe_.set_send_fail_channel(-1);
2125
2126 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2127
solenberg1ac56142015-10-13 03:58:19 -07002128 EXPECT_TRUE(voe_.GetSend(send_channel));
2129 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002130}
2131
2132// Test that we can set the devices to use even if we failed to
2133// open the initial ones.
2134TEST_F(WebRtcVoiceEngineTestFake, SetDevicesWithInitiallyBadDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002135 EXPECT_TRUE(SetupEngineWithSendStream());
2136 int send_channel = voe_.GetLastChannel();
2137 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2138 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002139 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002140
2141 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2142 cricket::kFakeDefaultDeviceId);
2143 cricket::Device dev(cricket::kFakeDeviceName,
2144 cricket::kFakeDeviceId);
2145
2146 // Test that failure to open devices selected before starting
2147 // send/play does not prevent opening newly selected ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002148 voe_.set_playout_fail_channel(recv_channel);
2149 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002150
2151 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2152
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002153 EXPECT_FALSE(channel_->SetSend(cricket::SEND_MICROPHONE));
2154 EXPECT_FALSE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002155 EXPECT_FALSE(voe_.GetSend(send_channel));
2156 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002157
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002158 voe_.set_playout_fail_channel(-1);
2159 voe_.set_send_fail_channel(-1);
2160
2161 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2162
solenberg1ac56142015-10-13 03:58:19 -07002163 EXPECT_TRUE(voe_.GetSend(send_channel));
2164 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002165}
2166
2167// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002168// and start sending on it.
2169TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2170 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002171 int channel_num = voe_.GetLastChannel();
2172 webrtc::AgcConfig agc_config;
2173 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2174 EXPECT_EQ(0, agc_config.targetLeveldBOv);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002175 send_parameters_.options = options_adjust_agc_;
2176 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002177 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2178 EXPECT_TRUE(voe_.GetSend(channel_num));
2179 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2180 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002181 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2182 EXPECT_FALSE(voe_.GetSend(channel_num));
2183 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2184 EXPECT_EQ(0, agc_config.targetLeveldBOv); // level was restored
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002185}
2186
wu@webrtc.org97077a32013-10-25 21:18:33 +00002187TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002188 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002189 webrtc::AgcConfig agc_config;
2190 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2191 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2192
2193 cricket::AudioOptions options;
2194 options.tx_agc_target_dbov.Set(3);
2195 options.tx_agc_digital_compression_gain.Set(9);
2196 options.tx_agc_limiter.Set(true);
2197 options.auto_gain_control.Set(true);
2198 EXPECT_TRUE(engine_.SetOptions(options));
2199
2200 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2201 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2202 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2203 EXPECT_TRUE(agc_config.limiterEnable);
2204
2205 // Check interaction with adjust_agc_delta. Both should be respected, for
2206 // backwards compatibility.
2207 options.adjust_agc_delta.Set(-10);
2208 EXPECT_TRUE(engine_.SetOptions(options));
2209
2210 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2211 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2212}
2213
wu@webrtc.org97077a32013-10-25 21:18:33 +00002214TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002215 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002216 cricket::AudioOptions options;
2217 options.recording_sample_rate.Set(48000u);
2218 options.playout_sample_rate.Set(44100u);
2219 EXPECT_TRUE(engine_.SetOptions(options));
2220
2221 unsigned int recording_sample_rate, playout_sample_rate;
2222 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2223 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2224 EXPECT_EQ(48000u, recording_sample_rate);
2225 EXPECT_EQ(44100u, playout_sample_rate);
2226}
2227
2228TEST_F(WebRtcVoiceEngineTestFake, TraceFilterViaTraceOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002229 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002230 engine_.SetLogging(rtc::LS_INFO, "");
wu@webrtc.org97077a32013-10-25 21:18:33 +00002231 EXPECT_EQ(
2232 // Info:
2233 webrtc::kTraceStateInfo | webrtc::kTraceInfo |
2234 // Warning:
2235 webrtc::kTraceTerseInfo | webrtc::kTraceWarning |
2236 // Error:
2237 webrtc::kTraceError | webrtc::kTraceCritical,
2238 static_cast<int>(trace_wrapper_->filter_));
2239 // Now set it explicitly
2240 std::string filter =
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002241 "tracefilter " + rtc::ToString(webrtc::kTraceDefault);
2242 engine_.SetLogging(rtc::LS_VERBOSE, filter.c_str());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002243 EXPECT_EQ(static_cast<unsigned int>(webrtc::kTraceDefault),
2244 trace_wrapper_->filter_);
2245}
2246
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002247// Test that we can set the outgoing SSRC properly.
2248// SSRC is set in SetupEngine by calling AddSendStream.
2249TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002250 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002251 int channel_num = voe_.GetLastChannel();
2252 unsigned int send_ssrc;
2253 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
2254 EXPECT_NE(0U, send_ssrc);
2255 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num, send_ssrc));
2256 EXPECT_EQ(kSsrc1, send_ssrc);
2257}
2258
2259TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2260 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002261 EXPECT_TRUE(SetupEngineWithSendStream());
2262 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2263 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002264 EXPECT_TRUE(channel_->AddRecvStream(
2265 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002266 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2267 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002268
2269 cricket::VoiceMediaInfo info;
2270 EXPECT_EQ(true, channel_->GetStats(&info));
2271 EXPECT_EQ(1u, info.senders.size());
sergeyu@chromium.org5bc25c42013-12-05 00:24:06 +00002272 EXPECT_EQ(kSsrc1, info.senders[0].ssrc());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002273 EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
2274 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].bytes_sent);
2275 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_sent);
2276 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].packets_lost);
2277 EXPECT_EQ(cricket::kFractionLostStatValue, info.senders[0].fraction_lost);
2278 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].ext_seqnum);
2279 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].rtt_ms);
2280 EXPECT_EQ(cricket::kIntStatValue, info.senders[0].jitter_ms);
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002281 EXPECT_EQ(kPcmuCodec.name, info.senders[0].codec_name);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002282 // TODO(sriniv): Add testing for more fields. These are not populated
2283 // in FakeWebrtcVoiceEngine yet.
2284 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].audio_level);
2285 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_median_ms);
2286 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_delay_std_ms);
2287 // EXPECT_EQ(cricket::kIntStatValue, info.senders[0].echo_return_loss);
2288 // EXPECT_EQ(cricket::kIntStatValue,
2289 // info.senders[0].echo_return_loss_enhancement);
solenberg43e83d42015-10-20 06:41:01 -07002290 EXPECT_EQ(0u, info.receivers.size());
solenberg1ac56142015-10-13 03:58:19 -07002291
solenberg43e83d42015-10-20 06:41:01 -07002292 // Registered stream's remote SSRC is kSsrc2. Send a packet with SSRC=1.
2293 // We should drop the packet and no stats should be available.
2294 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002295 EXPECT_EQ(true, channel_->GetStats(&info));
2296 EXPECT_EQ(0u, info.receivers.size());
2297
solenberg43e83d42015-10-20 06:41:01 -07002298 // Remove the kSsrc2 stream and deliver a new packet - a default receive
2299 // stream should be created and we should see stats.
2300 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002301 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2302 EXPECT_EQ(true, channel_->GetStats(&info));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002303 EXPECT_EQ(1u, info.receivers.size());
solenberg43e83d42015-10-20 06:41:01 -07002304
2305 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].bytes_rcvd);
2306 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_rcvd);
2307 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].packets_lost);
2308 EXPECT_EQ(cricket::kIntStatValue, info.receivers[0].ext_seqnum);
2309 EXPECT_EQ(kPcmuCodec.name, info.receivers[0].codec_name);
2310 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentExpandRate) /
2311 (1 << 14), info.receivers[0].expand_rate);
2312 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSpeechExpandRate) /
2313 (1 << 14), info.receivers[0].speech_expand_rate);
2314 EXPECT_EQ(static_cast<float>(cricket::kNetStats.currentSecondaryDecodedRate) /
2315 (1 << 14), info.receivers[0].secondary_decoded_rate);
2316 // TODO(sriniv): Add testing for more receiver fields.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002317}
2318
2319// Test that we can set the outgoing SSRC properly with multiple streams.
2320// SSRC is set in SetupEngine by calling AddSendStream.
2321TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002322 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002323 int channel_num1 = voe_.GetLastChannel();
2324 unsigned int send_ssrc;
2325 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num1, send_ssrc));
2326 EXPECT_EQ(kSsrc1, send_ssrc);
2327
2328 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2329 int channel_num2 = voe_.GetLastChannel();
2330 EXPECT_EQ(0, voe_.GetLocalSSRC(channel_num2, send_ssrc));
2331 EXPECT_EQ(kSsrc1, send_ssrc);
2332}
2333
2334// Test that the local SSRC is the same on sending and receiving channels if the
2335// receive channel is created before the send channel.
2336TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002337 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002338 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002339
2340 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2341 int receive_channel_num = voe_.GetLastChannel();
2342 EXPECT_TRUE(channel_->AddSendStream(
2343 cricket::StreamParams::CreateLegacy(1234)));
2344 int send_channel_num = voe_.GetLastChannel();
2345
2346 unsigned int ssrc = 0;
2347 EXPECT_EQ(0, voe_.GetLocalSSRC(send_channel_num, ssrc));
2348 EXPECT_EQ(1234U, ssrc);
2349 ssrc = 0;
2350 EXPECT_EQ(0, voe_.GetLocalSSRC(receive_channel_num, ssrc));
2351 EXPECT_EQ(1234U, ssrc);
2352}
2353
2354// Test that we can properly receive packets.
2355TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2356 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002357 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002358 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002359 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame,
2360 sizeof(kPcmuFrame)));
2361}
2362
2363// Test that we can properly receive packets on multiple streams.
2364TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002365 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002366 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002367 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2368 int channel_num1 = voe_.GetLastChannel();
2369 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2370 int channel_num2 = voe_.GetLastChannel();
2371 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2372 int channel_num3 = voe_.GetLastChannel();
2373 // Create packets with the right SSRCs.
2374 char packets[4][sizeof(kPcmuFrame)];
2375 for (size_t i = 0; i < ARRAY_SIZE(packets); ++i) {
2376 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002377 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002378 }
2379 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2380 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2381 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2382 DeliverPacket(packets[0], sizeof(packets[0]));
2383 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2384 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2385 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2386 DeliverPacket(packets[1], sizeof(packets[1]));
2387 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1],
2388 sizeof(packets[1])));
2389 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2390 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2391 DeliverPacket(packets[2], sizeof(packets[2]));
2392 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2393 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2],
2394 sizeof(packets[2])));
2395 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
2396 DeliverPacket(packets[3], sizeof(packets[3]));
2397 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2398 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2399 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3],
2400 sizeof(packets[3])));
2401 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2402 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2403 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2404}
2405
solenberg0a617e22015-10-20 15:49:38 -07002406// Test that we properly handle failures to add a receive stream.
2407TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
2408 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002409 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002410 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002411}
2412
solenberg0a617e22015-10-20 15:49:38 -07002413// Test that we properly handle failures to add a send stream.
2414TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
2415 EXPECT_TRUE(SetupEngine());
2416 voe_.set_fail_create_channel(true);
2417 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2418}
2419
solenberg1ac56142015-10-13 03:58:19 -07002420// Test that AddRecvStream creates new stream.
2421TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2422 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002423 int channel_num = voe_.GetLastChannel();
2424 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002425 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002426}
2427
2428// Test that after adding a recv stream, we do not decode more codecs than
2429// those previously passed into SetRecvCodecs.
2430TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002431 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002432 cricket::AudioRecvParameters parameters;
2433 parameters.codecs.push_back(kIsacCodec);
2434 parameters.codecs.push_back(kPcmuCodec);
2435 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002436 EXPECT_TRUE(channel_->AddRecvStream(
2437 cricket::StreamParams::CreateLegacy(kSsrc1)));
2438 int channel_num2 = voe_.GetLastChannel();
2439 webrtc::CodecInst gcodec;
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002440 rtc::strcpyn(gcodec.plname, ARRAY_SIZE(gcodec.plname), "opus");
2441 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002442 gcodec.channels = 2;
2443 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2444}
2445
2446// Test that we properly clean up any streams that were added, even if
2447// not explicitly removed.
2448TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002449 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002450 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002451 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2452 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2453 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2454 delete channel_;
2455 channel_ = NULL;
2456 EXPECT_EQ(0, voe_.GetNumChannels());
2457}
2458
wu@webrtc.org78187522013-10-07 23:32:02 +00002459TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002460 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002461 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2462}
2463
2464TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2465 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002466 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002467 // Manually delete channel to simulate a failure.
2468 int channel = voe_.GetLastChannel();
2469 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2470 // Add recv stream 2 should work.
2471 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002472 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002473 EXPECT_NE(channel, new_channel);
2474 // The last created channel is deleted too.
2475 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002476}
2477
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002478// Test the InsertDtmf on default send stream as caller.
2479TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2480 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002481}
2482
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002483// Test the InsertDtmf on default send stream as callee
2484TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2485 TestInsertDtmf(0, false);
2486}
2487
2488// Test the InsertDtmf on specified send stream as caller.
2489TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2490 TestInsertDtmf(kSsrc1, true);
2491}
2492
2493// Test the InsertDtmf on specified send stream as callee.
2494TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2495 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002496}
2497
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002498TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002499 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002500 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002501 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2502 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2503 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2504 EXPECT_TRUE(channel_->SetPlayout(true));
2505 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2506 EXPECT_TRUE(channel_->SetPlayout(false));
2507 EXPECT_FALSE(channel_->SetPlayout(true));
2508}
2509
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002510TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002511 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002512
2513 bool ec_enabled;
2514 webrtc::EcModes ec_mode;
2515 bool ec_metrics_enabled;
2516 webrtc::AecmModes aecm_mode;
2517 bool cng_enabled;
2518 bool agc_enabled;
2519 webrtc::AgcModes agc_mode;
2520 webrtc::AgcConfig agc_config;
2521 bool ns_enabled;
2522 webrtc::NsModes ns_mode;
2523 bool highpass_filter_enabled;
2524 bool stereo_swapping_enabled;
2525 bool typing_detection_enabled;
2526 voe_.GetEcStatus(ec_enabled, ec_mode);
2527 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2528 voe_.GetAecmMode(aecm_mode, cng_enabled);
2529 voe_.GetAgcStatus(agc_enabled, agc_mode);
2530 voe_.GetAgcConfig(agc_config);
2531 voe_.GetNsStatus(ns_enabled, ns_mode);
2532 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2533 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2534 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2535 EXPECT_TRUE(ec_enabled);
2536 EXPECT_TRUE(ec_metrics_enabled);
2537 EXPECT_FALSE(cng_enabled);
2538 EXPECT_TRUE(agc_enabled);
2539 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2540 EXPECT_TRUE(ns_enabled);
2541 EXPECT_TRUE(highpass_filter_enabled);
2542 EXPECT_FALSE(stereo_swapping_enabled);
2543 EXPECT_TRUE(typing_detection_enabled);
2544 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2545 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2546
2547 // Nothing set, so all ignored.
2548 cricket::AudioOptions options;
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002549 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002550 voe_.GetEcStatus(ec_enabled, ec_mode);
2551 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2552 voe_.GetAecmMode(aecm_mode, cng_enabled);
2553 voe_.GetAgcStatus(agc_enabled, agc_mode);
2554 voe_.GetAgcConfig(agc_config);
2555 voe_.GetNsStatus(ns_enabled, ns_mode);
2556 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2557 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2558 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2559 EXPECT_TRUE(ec_enabled);
2560 EXPECT_TRUE(ec_metrics_enabled);
2561 EXPECT_FALSE(cng_enabled);
2562 EXPECT_TRUE(agc_enabled);
2563 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2564 EXPECT_TRUE(ns_enabled);
2565 EXPECT_TRUE(highpass_filter_enabled);
2566 EXPECT_FALSE(stereo_swapping_enabled);
2567 EXPECT_TRUE(typing_detection_enabled);
2568 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2569 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
Henrik Lundin64dad832015-05-11 12:44:23 +02002570 EXPECT_EQ(50, voe_.GetNetEqCapacity()); // From GetDefaultEngineOptions().
Henrik Lundin5263b3c2015-06-01 10:29:41 +02002571 EXPECT_FALSE(
2572 voe_.GetNetEqFastAccelerate()); // From GetDefaultEngineOptions().
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002573
2574 // Turn echo cancellation off
2575 options.echo_cancellation.Set(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002576 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002577 voe_.GetEcStatus(ec_enabled, ec_mode);
2578 EXPECT_FALSE(ec_enabled);
2579
2580 // Turn echo cancellation back on, with settings, and make sure
2581 // nothing else changed.
2582 options.echo_cancellation.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002583 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002584 voe_.GetEcStatus(ec_enabled, ec_mode);
2585 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2586 voe_.GetAecmMode(aecm_mode, cng_enabled);
2587 voe_.GetAgcStatus(agc_enabled, agc_mode);
2588 voe_.GetAgcConfig(agc_config);
2589 voe_.GetNsStatus(ns_enabled, ns_mode);
2590 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2591 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2592 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2593 EXPECT_TRUE(ec_enabled);
2594 EXPECT_TRUE(ec_metrics_enabled);
2595 EXPECT_TRUE(agc_enabled);
2596 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2597 EXPECT_TRUE(ns_enabled);
2598 EXPECT_TRUE(highpass_filter_enabled);
2599 EXPECT_FALSE(stereo_swapping_enabled);
2600 EXPECT_TRUE(typing_detection_enabled);
2601 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2602 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2603
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002604 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2605 // control.
2606 options.delay_agnostic_aec.Set(true);
2607 ASSERT_TRUE(engine_.SetOptions(options));
2608 voe_.GetEcStatus(ec_enabled, ec_mode);
2609 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2610 voe_.GetAecmMode(aecm_mode, cng_enabled);
2611 EXPECT_TRUE(ec_enabled);
2612 EXPECT_TRUE(ec_metrics_enabled);
2613 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2614
2615 // Turn off echo cancellation and delay agnostic aec.
2616 options.delay_agnostic_aec.Set(false);
Henrik Lundin441f6342015-06-09 16:03:13 +02002617 options.extended_filter_aec.Set(false);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002618 options.echo_cancellation.Set(false);
2619 ASSERT_TRUE(engine_.SetOptions(options));
2620 voe_.GetEcStatus(ec_enabled, ec_mode);
2621 EXPECT_FALSE(ec_enabled);
2622 // Turning delay agnostic aec back on should also turn on echo cancellation.
2623 options.delay_agnostic_aec.Set(true);
2624 ASSERT_TRUE(engine_.SetOptions(options));
2625 voe_.GetEcStatus(ec_enabled, ec_mode);
2626 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2627 EXPECT_TRUE(ec_enabled);
2628 EXPECT_TRUE(ec_metrics_enabled);
2629 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2630
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002631 // Turn off AGC
2632 options.auto_gain_control.Set(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002633 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002634 voe_.GetAgcStatus(agc_enabled, agc_mode);
2635 EXPECT_FALSE(agc_enabled);
2636
2637 // Turn AGC back on
2638 options.auto_gain_control.Set(true);
2639 options.adjust_agc_delta.Clear();
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002640 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002641 voe_.GetAgcStatus(agc_enabled, agc_mode);
2642 EXPECT_TRUE(agc_enabled);
2643 voe_.GetAgcConfig(agc_config);
2644 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2645
2646 // Turn off other options (and stereo swapping on).
2647 options.noise_suppression.Set(false);
2648 options.highpass_filter.Set(false);
2649 options.typing_detection.Set(false);
2650 options.stereo_swapping.Set(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002651 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002652 voe_.GetNsStatus(ns_enabled, ns_mode);
2653 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2654 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2655 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2656 EXPECT_FALSE(ns_enabled);
2657 EXPECT_FALSE(highpass_filter_enabled);
2658 EXPECT_FALSE(typing_detection_enabled);
2659 EXPECT_TRUE(stereo_swapping_enabled);
2660
solenberg1ac56142015-10-13 03:58:19 -07002661 // Set options again to ensure it has no impact.
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002662 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002663 voe_.GetEcStatus(ec_enabled, ec_mode);
2664 voe_.GetNsStatus(ns_enabled, ns_mode);
2665 EXPECT_TRUE(ec_enabled);
2666 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2667 EXPECT_FALSE(ns_enabled);
2668 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2669}
2670
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002671TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002672 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002673
2674 bool ec_enabled;
2675 webrtc::EcModes ec_mode;
2676 bool ec_metrics_enabled;
2677 bool agc_enabled;
2678 webrtc::AgcModes agc_mode;
2679 bool ns_enabled;
2680 webrtc::NsModes ns_mode;
2681 bool highpass_filter_enabled;
2682 bool stereo_swapping_enabled;
2683 bool typing_detection_enabled;
2684
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002685 voe_.GetEcStatus(ec_enabled, ec_mode);
2686 voe_.GetEcMetricsStatus(ec_metrics_enabled);
2687 voe_.GetAgcStatus(agc_enabled, agc_mode);
2688 voe_.GetNsStatus(ns_enabled, ns_mode);
2689 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2690 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2691 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2692 EXPECT_TRUE(ec_enabled);
2693 EXPECT_TRUE(agc_enabled);
2694 EXPECT_TRUE(ns_enabled);
2695 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002696 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002697 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002698}
2699
2700TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2701 webrtc::AgcConfig set_config = {0};
2702 set_config.targetLeveldBOv = 3;
2703 set_config.digitalCompressionGaindB = 9;
2704 set_config.limiterEnable = true;
2705 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002706 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002707
2708 webrtc::AgcConfig config = {0};
2709 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2710 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2711 EXPECT_EQ(set_config.digitalCompressionGaindB,
2712 config.digitalCompressionGaindB);
2713 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2714}
2715
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002716TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002717 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg66f43392015-09-09 01:36:22 -07002718 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2719 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002720 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002721 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2722 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002723 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002724
2725 // Have to add a stream to make SetSend work.
2726 cricket::StreamParams stream1;
2727 stream1.ssrcs.push_back(1);
2728 channel1->AddSendStream(stream1);
2729 cricket::StreamParams stream2;
2730 stream2.ssrcs.push_back(2);
2731 channel2->AddSendStream(stream2);
2732
2733 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002734 cricket::AudioSendParameters parameters_options_all = send_parameters_;
2735 parameters_options_all.options.echo_cancellation.Set(true);
2736 parameters_options_all.options.auto_gain_control.Set(true);
2737 parameters_options_all.options.noise_suppression.Set(true);
2738 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2739 EXPECT_EQ(parameters_options_all.options, channel1->options());
2740 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2741 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002742
2743 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002744 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
2745 parameters_options_no_ns.options.noise_suppression.Set(false);
2746 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2747 cricket::AudioOptions expected_options = parameters_options_all.options;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002748 expected_options.echo_cancellation.Set(true);
2749 expected_options.auto_gain_control.Set(true);
2750 expected_options.noise_suppression.Set(false);
solenberg66f43392015-09-09 01:36:22 -07002751 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002752
2753 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002754 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
2755 parameters_options_no_agc.options.auto_gain_control.Set(false);
2756 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002757 expected_options.echo_cancellation.Set(true);
2758 expected_options.auto_gain_control.Set(false);
2759 expected_options.noise_suppression.Set(true);
solenberg66f43392015-09-09 01:36:22 -07002760 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002761
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002762 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002763 bool ec_enabled;
2764 webrtc::EcModes ec_mode;
2765 bool agc_enabled;
2766 webrtc::AgcModes agc_mode;
2767 bool ns_enabled;
2768 webrtc::NsModes ns_mode;
2769 voe_.GetEcStatus(ec_enabled, ec_mode);
2770 voe_.GetAgcStatus(agc_enabled, agc_mode);
2771 voe_.GetNsStatus(ns_enabled, ns_mode);
2772 EXPECT_TRUE(ec_enabled);
2773 EXPECT_TRUE(agc_enabled);
2774 EXPECT_TRUE(ns_enabled);
2775
2776 channel1->SetSend(cricket::SEND_MICROPHONE);
2777 voe_.GetEcStatus(ec_enabled, ec_mode);
2778 voe_.GetAgcStatus(agc_enabled, agc_mode);
2779 voe_.GetNsStatus(ns_enabled, ns_mode);
2780 EXPECT_TRUE(ec_enabled);
2781 EXPECT_TRUE(agc_enabled);
2782 EXPECT_FALSE(ns_enabled);
2783
2784 channel1->SetSend(cricket::SEND_NOTHING);
2785 voe_.GetEcStatus(ec_enabled, ec_mode);
2786 voe_.GetAgcStatus(agc_enabled, agc_mode);
2787 voe_.GetNsStatus(ns_enabled, ns_mode);
2788 EXPECT_TRUE(ec_enabled);
2789 EXPECT_TRUE(agc_enabled);
2790 EXPECT_TRUE(ns_enabled);
2791
2792 channel2->SetSend(cricket::SEND_MICROPHONE);
2793 voe_.GetEcStatus(ec_enabled, ec_mode);
2794 voe_.GetAgcStatus(agc_enabled, agc_mode);
2795 voe_.GetNsStatus(ns_enabled, ns_mode);
2796 EXPECT_TRUE(ec_enabled);
2797 EXPECT_FALSE(agc_enabled);
2798 EXPECT_TRUE(ns_enabled);
2799
2800 channel2->SetSend(cricket::SEND_NOTHING);
2801 voe_.GetEcStatus(ec_enabled, ec_mode);
2802 voe_.GetAgcStatus(agc_enabled, agc_mode);
2803 voe_.GetNsStatus(ns_enabled, ns_mode);
2804 EXPECT_TRUE(ec_enabled);
2805 EXPECT_TRUE(agc_enabled);
2806 EXPECT_TRUE(ns_enabled);
2807
2808 // Make sure settings take effect while we are sending.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002809 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
2810 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2811 send_parameters_;
2812 parameters_options_no_agc_nor_ns.options.auto_gain_control.Set(false);
2813 parameters_options_no_agc_nor_ns.options.noise_suppression.Set(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002814 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002815 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002816 expected_options.echo_cancellation.Set(true);
2817 expected_options.auto_gain_control.Set(false);
2818 expected_options.noise_suppression.Set(false);
solenberg66f43392015-09-09 01:36:22 -07002819 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002820 voe_.GetEcStatus(ec_enabled, ec_mode);
2821 voe_.GetAgcStatus(agc_enabled, agc_mode);
2822 voe_.GetNsStatus(ns_enabled, ns_mode);
2823 EXPECT_TRUE(ec_enabled);
2824 EXPECT_FALSE(agc_enabled);
2825 EXPECT_FALSE(ns_enabled);
2826}
2827
wu@webrtc.orgde305012013-10-31 15:40:38 +00002828// This test verifies DSCP settings are properly applied on voice media channel.
2829TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002830 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002831 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002832 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002833 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00002834 new cricket::FakeNetworkInterface);
2835 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002836 cricket::AudioSendParameters parameters = send_parameters_;
2837 parameters.options.dscp.Set(true);
2838 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002839 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00002840 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002841 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002842 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002843 parameters.options.dscp.Set(false);
2844 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002845 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00002846}
2847
solenberg1ac56142015-10-13 03:58:19 -07002848TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002849 EXPECT_TRUE(SetupEngine());
2850 cricket::WebRtcVoiceMediaChannel* media_channel =
2851 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002852 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2853 EXPECT_TRUE(channel_->AddRecvStream(
2854 cricket::StreamParams::CreateLegacy(kSsrc1)));
2855 int channel_id = voe_.GetLastChannel();
2856 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2857 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2858 EXPECT_TRUE(channel_->AddRecvStream(
2859 cricket::StreamParams::CreateLegacy(kSsrc2)));
2860 int channel_id2 = voe_.GetLastChannel();
2861 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002862}
2863
solenberg1ac56142015-10-13 03:58:19 -07002864TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002865 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002866 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07002867 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
2868 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
2869 EXPECT_TRUE(channel_->AddSendStream(
2870 cricket::StreamParams::CreateLegacy(kSsrc1)));
2871 int channel_id = voe_.GetLastChannel();
2872 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
2873 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
2874 EXPECT_TRUE(channel_->AddSendStream(
2875 cricket::StreamParams::CreateLegacy(kSsrc2)));
2876 int channel_id2 = voe_.GetLastChannel();
2877 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002878}
2879
solenberg4bac9c52015-10-09 02:32:53 -07002880TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002881 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07002882 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002883 cricket::StreamParams stream;
2884 stream.ssrcs.push_back(kSsrc2);
2885 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07002886 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07002887 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07002888 float scale = 0;
2889 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2890 EXPECT_DOUBLE_EQ(3, scale);
2891}
2892
2893TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
2894 EXPECT_TRUE(SetupEngine());
2895 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
2896 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2897 int channel_id = voe_.GetLastChannel();
2898 float scale = 0;
2899 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
2900 EXPECT_DOUBLE_EQ(2, scale);
2901 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07002902 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07002903 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002904}
2905
pbos8fc7fa72015-07-15 08:02:58 -07002906TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02002907 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07002908 const std::string kSyncLabel = "AvSyncLabel";
2909
solenberg1ac56142015-10-13 03:58:19 -07002910 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07002911 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
2912 sp.sync_label = kSyncLabel;
2913 // Creating two channels to make sure that sync label is set properly for both
2914 // the default voice channel and following ones.
2915 EXPECT_TRUE(channel_->AddRecvStream(sp));
2916 sp.ssrcs[0] += 1;
2917 EXPECT_TRUE(channel_->AddRecvStream(sp));
2918
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002919 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07002920 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002921 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002922 << "SyncGroup should be set based on sync_label";
2923 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002924 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07002925 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07002926}
2927
pbos6bb1b6e2015-07-24 07:10:18 -07002928TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002929 // Test that changing the combined_audio_video_bwe option results in the
2930 // expected state changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002931 std::vector<uint32_t> ssrcs;
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002932 ssrcs.push_back(223);
2933 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002934
solenberg1ac56142015-10-13 03:58:19 -07002935 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002936 cricket::WebRtcVoiceMediaChannel* media_channel =
2937 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02002938 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002939 EXPECT_TRUE(media_channel->AddRecvStream(
2940 cricket::StreamParams::CreateLegacy(ssrc)));
2941 }
2942 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002943
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002944 // Combined BWE should be disabled.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002945 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002946 const auto* s = call_.GetAudioReceiveStream(ssrc);
2947 EXPECT_NE(nullptr, s);
2948 EXPECT_EQ(false, s->GetConfig().combined_audio_video_bwe);
2949 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002950
2951 // Enable combined BWE option - now it should be set up.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002952 send_parameters_.options.combined_audio_video_bwe.Set(true);
2953 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002954 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002955 const auto* s = call_.GetAudioReceiveStream(ssrc);
2956 EXPECT_NE(nullptr, s);
2957 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
2958 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002959
2960 // Disable combined BWE option - should be disabled again.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002961 send_parameters_.options.combined_audio_video_bwe.Set(false);
2962 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002963 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002964 const auto* s = call_.GetAudioReceiveStream(ssrc);
2965 EXPECT_NE(nullptr, s);
2966 EXPECT_EQ(false, s->GetConfig().combined_audio_video_bwe);
2967 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002968
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002969 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002970}
2971
pbos6bb1b6e2015-07-24 07:10:18 -07002972TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002973 // Test that adding receive streams after enabling combined bandwidth
2974 // estimation will correctly configure each channel.
solenberg1ac56142015-10-13 03:58:19 -07002975 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002976 cricket::WebRtcVoiceMediaChannel* media_channel =
2977 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002978 send_parameters_.options.combined_audio_video_bwe.Set(true);
2979 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002980
Peter Boström0c4e06b2015-10-07 12:23:21 +02002981 static const uint32_t kSsrcs[] = {1, 2, 3, 4};
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002982 for (unsigned int i = 0; i < ARRAY_SIZE(kSsrcs); ++i) {
2983 EXPECT_TRUE(media_channel->AddRecvStream(
2984 cricket::StreamParams::CreateLegacy(kSsrcs[i])));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002985 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(kSsrcs[i]));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002986 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002987 EXPECT_EQ(ARRAY_SIZE(kSsrcs), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002988}
2989
pbos6bb1b6e2015-07-24 07:10:18 -07002990TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002991 // Test that setting the header extensions results in the expected state
2992 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02002993 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002994 ssrcs.push_back(223);
2995 ssrcs.push_back(224);
2996
solenberg1ac56142015-10-13 03:58:19 -07002997 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02002998 cricket::WebRtcVoiceMediaChannel* media_channel =
2999 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003000 send_parameters_.options.combined_audio_video_bwe.Set(true);
3001 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003002 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003003 EXPECT_TRUE(media_channel->AddRecvStream(
3004 cricket::StreamParams::CreateLegacy(ssrc)));
3005 }
3006
3007 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003008 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003009 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003010 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003011 EXPECT_NE(nullptr, s);
3012 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3013 }
3014
3015 // Set up receive extensions.
3016 const auto& e_exts = engine_.rtp_header_extensions();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003017 cricket::AudioRecvParameters recv_parameters;
3018 recv_parameters.extensions = e_exts;
3019 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003020 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003021 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003022 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003023 EXPECT_NE(nullptr, s);
3024 const auto& s_exts = s->GetConfig().rtp.extensions;
3025 EXPECT_EQ(e_exts.size(), s_exts.size());
3026 for (const auto& e_ext : e_exts) {
3027 for (const auto& s_ext : s_exts) {
3028 if (e_ext.id == s_ext.id) {
3029 EXPECT_EQ(e_ext.uri, s_ext.name);
3030 }
3031 }
3032 }
3033 }
3034
3035 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003036 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003037 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003038 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003039 EXPECT_NE(nullptr, s);
3040 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3041 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003042}
3043
3044TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3045 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003046 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003047 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3048 static const unsigned char kRtcp[] = {
3049 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3050 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3051 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3052 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3053 };
3054 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3055
solenberg1ac56142015-10-13 03:58:19 -07003056 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003057 cricket::WebRtcVoiceMediaChannel* media_channel =
3058 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003059 send_parameters_.options.combined_audio_video_bwe.Set(true);
3060 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003061 EXPECT_TRUE(media_channel->AddRecvStream(
3062 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3063
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003064 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003065 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003066 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003067 EXPECT_EQ(0, s->received_packets());
3068 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3069 EXPECT_EQ(1, s->received_packets());
3070 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3071 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003072}
Minyue2013aec2015-05-13 14:14:42 +02003073
solenberg0a617e22015-10-20 15:49:38 -07003074// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003075// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003076TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenberg1ac56142015-10-13 03:58:19 -07003077 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003078 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003079 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003080 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3081 int recv_ch = voe_.GetLastChannel();
3082 EXPECT_NE(recv_ch, default_channel);
3083 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3084 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3085 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003086 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3087 recv_ch = voe_.GetLastChannel();
3088 EXPECT_NE(recv_ch, default_channel);
3089 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003090}
3091
3092TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003093 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003094 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003095
3096 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3097 int recv_ch = voe_.GetLastChannel();
3098
3099 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3100 int send_ch = voe_.GetLastChannel();
3101
3102 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3103 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3104 // channel of |recv_ch|.This is not a common case, since, normally, only the
3105 // default channel can be associated. However, the default is not deletable.
3106 // So we force the |recv_ch| to associate with a non-default channel.
3107 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3108 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3109
3110 EXPECT_TRUE(channel_->RemoveSendStream(2));
3111 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3112}
stefan658910c2015-09-03 05:48:32 -07003113
3114// Tests for the actual WebRtc VoE library.
3115
3116TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
3117 cricket::WebRtcVoiceEngine engine;
3118 cricket::AudioOptions options = engine.GetOptions();
3119 // The default options should have at least a few things set. We purposefully
3120 // don't check the option values here, though.
3121 EXPECT_TRUE(options.echo_cancellation.IsSet());
3122 EXPECT_TRUE(options.auto_gain_control.IsSet());
3123 EXPECT_TRUE(options.noise_suppression.IsSet());
3124}
3125
3126// Tests that the library initializes and shuts down properly.
3127TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3128 cricket::WebRtcVoiceEngine engine;
3129 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003130 rtc::scoped_ptr<webrtc::Call> call(
3131 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003132 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003133 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003134 EXPECT_TRUE(channel != nullptr);
3135 delete channel;
3136 engine.Terminate();
3137
3138 // Reinit to catch regression where VoiceEngineObserver reference is lost
3139 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3140 engine.Terminate();
3141}
3142
3143// Tests that the library is configured with the codecs we want.
3144TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
3145 cricket::WebRtcVoiceEngine engine;
3146 // Check codecs by name.
3147 EXPECT_TRUE(engine.FindCodec(
3148 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0)));
3149 EXPECT_TRUE(engine.FindCodec(
3150 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0)));
3151 EXPECT_TRUE(engine.FindCodec(
3152 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0)));
3153 // Check that name matching is case-insensitive.
3154 EXPECT_TRUE(engine.FindCodec(
3155 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0)));
3156 EXPECT_TRUE(engine.FindCodec(
3157 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0)));
3158 EXPECT_TRUE(engine.FindCodec(
3159 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0)));
3160 EXPECT_TRUE(engine.FindCodec(
3161 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0)));
3162 EXPECT_TRUE(engine.FindCodec(
3163 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0)));
3164 EXPECT_TRUE(engine.FindCodec(
3165 cricket::AudioCodec(96, "red", 8000, 0, 1, 0)));
3166 EXPECT_TRUE(engine.FindCodec(
3167 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0)));
3168 EXPECT_TRUE(engine.FindCodec(
3169 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0)));
3170 EXPECT_TRUE(engine.FindCodec(
3171 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0)));
3172 EXPECT_TRUE(engine.FindCodec(
3173 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0)));
3174 // Check codecs with an id by id.
3175 EXPECT_TRUE(engine.FindCodec(
3176 cricket::AudioCodec(0, "", 8000, 0, 1, 0))); // PCMU
3177 EXPECT_TRUE(engine.FindCodec(
3178 cricket::AudioCodec(8, "", 8000, 0, 1, 0))); // PCMA
3179 EXPECT_TRUE(engine.FindCodec(
3180 cricket::AudioCodec(9, "", 8000, 0, 1, 0))); // G722
3181 EXPECT_TRUE(engine.FindCodec(
3182 cricket::AudioCodec(13, "", 8000, 0, 1, 0))); // CN
3183 // Check sample/bitrate matching.
3184 EXPECT_TRUE(engine.FindCodec(
3185 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0)));
3186 // Check that bad codecs fail.
3187 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0)));
3188 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(88, "", 0, 0, 1, 0)));
3189 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 0, 2, 0)));
3190 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 5000, 0, 1, 0)));
3191 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 5000, 1, 0)));
3192 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3193 for (std::vector<cricket::AudioCodec>::const_iterator it =
3194 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3195 if (it->name == "CN" && it->clockrate == 16000) {
3196 EXPECT_EQ(105, it->id);
3197 } else if (it->name == "CN" && it->clockrate == 32000) {
3198 EXPECT_EQ(106, it->id);
3199 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3200 EXPECT_EQ(103, it->id);
3201 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3202 EXPECT_EQ(104, it->id);
3203 } else if (it->name == "G722" && it->clockrate == 8000) {
3204 EXPECT_EQ(9, it->id);
3205 } else if (it->name == "telephone-event") {
3206 EXPECT_EQ(126, it->id);
3207 } else if (it->name == "red") {
3208 EXPECT_EQ(127, it->id);
3209 } else if (it->name == "opus") {
3210 EXPECT_EQ(111, it->id);
3211 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3212 EXPECT_EQ("10", it->params.find("minptime")->second);
3213 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3214 EXPECT_EQ("60", it->params.find("maxptime")->second);
3215 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3216 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3217 }
3218 }
3219
3220 engine.Terminate();
3221}
3222
3223// Tests that VoE supports at least 32 channels
3224TEST(WebRtcVoiceEngineTest, Has32Channels) {
3225 cricket::WebRtcVoiceEngine engine;
3226 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003227 rtc::scoped_ptr<webrtc::Call> call(
3228 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003229
3230 cricket::VoiceMediaChannel* channels[32];
3231 int num_channels = 0;
stefan658910c2015-09-03 05:48:32 -07003232 while (num_channels < ARRAY_SIZE(channels)) {
3233 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003234 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003235 if (!channel)
3236 break;
stefan658910c2015-09-03 05:48:32 -07003237 channels[num_channels++] = channel;
3238 }
3239
3240 int expected = ARRAY_SIZE(channels);
3241 EXPECT_EQ(expected, num_channels);
3242
3243 while (num_channels > 0) {
3244 delete channels[--num_channels];
3245 }
stefan658910c2015-09-03 05:48:32 -07003246 engine.Terminate();
3247}
3248
3249// Test that we set our preferred codecs properly.
3250TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3251 cricket::WebRtcVoiceEngine engine;
3252 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003253 rtc::scoped_ptr<webrtc::Call> call(
3254 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003255 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3256 call.get());
3257 cricket::AudioRecvParameters parameters;
3258 parameters.codecs = engine.codecs();
3259 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003260}