blob: 630983344c8e92e38aa84bdea504bddf4a526809 [file] [log] [blame]
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001/*
2 * libjingle
3 * Copyright 2008 Google Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
henrike@webrtc.org28e20752013-07-10 00:45:36 +000027
tfarina5237aaf2015-11-10 23:44:30 -080028#include "webrtc/base/arraysize.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000029#include "webrtc/base/byteorder.h"
30#include "webrtc/base/gunit.h"
Fredrik Solenberg709ed672015-09-15 12:26:33 +020031#include "webrtc/call.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032#include "talk/media/base/constants.h"
33#include "talk/media/base/fakemediaengine.h"
wu@webrtc.orgde305012013-10-31 15:40:38 +000034#include "talk/media/base/fakenetworkinterface.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035#include "talk/media/base/fakertp.h"
Fredrik Solenberg4b60c732015-05-07 14:07:48 +020036#include "talk/media/webrtc/fakewebrtccall.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000037#include "talk/media/webrtc/fakewebrtcvoiceengine.h"
38#include "talk/media/webrtc/webrtcvoiceengine.h"
deadbeefcbecd352015-09-23 11:50:27 -070039#include "webrtc/p2p/base/faketransportcontroller.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000040#include "talk/session/media/channel.h"
41
buildbot@webrtc.org150835e2014-05-06 15:54:38 +000042using cricket::kRtpAudioLevelHeaderExtension;
43using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
44
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020045namespace {
46
47const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
48const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
49const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
50const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
51const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
52const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
53const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
54const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
55const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, 0,
56 1, 0);
57const cricket::AudioCodec* const kAudioCodecs[] = {
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +000058 &kPcmuCodec, &kIsacCodec, &kOpusCodec, &kG722CodecVoE, &kRedCodec,
59 &kCn8000Codec, &kCn16000Codec, &kTelephoneEventCodec,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060};
solenberg85a04962015-10-27 03:35:21 -070061const uint32_t kSsrc1 = 0x99;
62const uint32_t kSsrc2 = 0x98;
63const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064
65class FakeVoEWrapper : public cricket::VoEWrapper {
66 public:
67 explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
68 : cricket::VoEWrapper(engine, // processing
69 engine, // base
70 engine, // codec
71 engine, // dtmf
henrike@webrtc.org28e20752013-07-10 00:45:36 +000072 engine, // hw
henrike@webrtc.org28e20752013-07-10 00:45:36 +000073 engine, // network
74 engine, // rtp
henrike@webrtc.org28e20752013-07-10 00:45:36 +000075 engine) { // volume
76 }
77};
78
wu@webrtc.org97077a32013-10-25 21:18:33 +000079class FakeVoETraceWrapper : public cricket::VoETraceWrapper {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080 public:
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +020081 int SetTraceFilter(const unsigned int filter) override {
wu@webrtc.org97077a32013-10-25 21:18:33 +000082 filter_ = filter;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000083 return 0;
84 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +020085 int SetTraceFile(const char* fileNameUTF8) override { return 0; }
86 int SetTraceCallback(webrtc::TraceCallback* callback) override { return 0; }
wu@webrtc.org97077a32013-10-25 21:18:33 +000087 unsigned int filter_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088};
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +020089} // namespace
henrike@webrtc.org28e20752013-07-10 00:45:36 +000090
91class WebRtcVoiceEngineTestFake : public testing::Test {
92 public:
henrike@webrtc.org28e20752013-07-10 00:45:36 +000093 WebRtcVoiceEngineTestFake()
Fredrik Solenberg709ed672015-09-15 12:26:33 +020094 : call_(webrtc::Call::Config()),
tfarina5237aaf2015-11-10 23:44:30 -080095 voe_(kAudioCodecs, arraysize(kAudioCodecs)),
wu@webrtc.org97077a32013-10-25 21:18:33 +000096 trace_wrapper_(new FakeVoETraceWrapper()),
Jelena Marusicc28a8962015-05-29 15:05:44 +020097 engine_(new FakeVoEWrapper(&voe_), trace_wrapper_),
98 channel_(nullptr) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +020099 send_parameters_.codecs.push_back(kPcmuCodec);
100 recv_parameters_.codecs.push_back(kPcmuCodec);
Karl Wibergbe579832015-11-10 22:34:18 +0100101 options_adjust_agc_.adjust_agc_delta = rtc::Optional<int>(-10);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000102 }
solenberg1ac56142015-10-13 03:58:19 -0700103 bool SetupEngine() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000104 if (!engine_.Init(rtc::Thread::Current())) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000105 return false;
106 }
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200107 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200108 return (channel_ != nullptr);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000109 }
solenberg1ac56142015-10-13 03:58:19 -0700110 bool SetupEngineWithRecvStream() {
111 if (!SetupEngine()) {
112 return false;
113 }
114 return channel_->AddRecvStream(
115 cricket::StreamParams::CreateLegacy(kSsrc1));
116 }
117 bool SetupEngineWithSendStream() {
118 if (!SetupEngine()) {
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000119 return false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000120 }
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000121 return channel_->AddSendStream(
122 cricket::StreamParams::CreateLegacy(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000123 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000124 void SetupForMultiSendStream() {
solenberg1ac56142015-10-13 03:58:19 -0700125 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg0a617e22015-10-20 15:49:38 -0700126 // Remove stream added in Setup.
solenberg3a941542015-11-16 07:34:50 -0800127 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg85a04962015-10-27 03:35:21 -0700128 EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
solenberg0a617e22015-10-20 15:49:38 -0700129 // Verify the channel does not exist.
solenberg3a941542015-11-16 07:34:50 -0800130 EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000131 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000132 void DeliverPacket(const void* data, int len) {
Karl Wiberg94784372015-04-20 14:03:07 +0200133 rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000134 channel_->OnPacketReceived(&packet, rtc::PacketTime());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000135 }
Fredrik Solenbergaaf8ff22015-05-07 16:05:53 +0200136 void TearDown() override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000137 delete channel_;
138 engine_.Terminate();
139 }
140
solenberg3a941542015-11-16 07:34:50 -0800141 const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
142 const auto* send_stream = call_.GetAudioSendStream(ssrc);
143 EXPECT_TRUE(send_stream);
144 return send_stream->GetConfig();
145 }
146
solenberg7add0582015-11-20 09:59:34 -0800147 const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
148 const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
149 EXPECT_TRUE(recv_stream);
150 return recv_stream->GetConfig();
151 }
152
Peter Boström0c4e06b2015-10-07 12:23:21 +0200153 void TestInsertDtmf(uint32_t ssrc, bool caller) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000154 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200155 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200156 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000157 if (caller) {
solenberg0a617e22015-10-20 15:49:38 -0700158 // If this is a caller, local description will be applied and add the
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000159 // send stream.
160 EXPECT_TRUE(channel_->AddSendStream(
161 cricket::StreamParams::CreateLegacy(kSsrc1)));
162 }
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000163
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000164 // Test we can only InsertDtmf when the other side supports telephone-event.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200165 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000166 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
167 EXPECT_FALSE(channel_->CanInsertDtmf());
168 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111, cricket::DF_SEND));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200169 send_parameters_.codecs.push_back(kTelephoneEventCodec);
170 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000171 EXPECT_TRUE(channel_->CanInsertDtmf());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000172
173 if (!caller) {
solenberg0a617e22015-10-20 15:49:38 -0700174 // If this is callee, there's no active send channel yet.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000175 EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
176 EXPECT_TRUE(channel_->AddSendStream(
177 cricket::StreamParams::CreateLegacy(kSsrc1)));
178 }
179
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000180 // Check we fail if the ssrc is invalid.
181 EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111, cricket::DF_SEND));
182
183 // Test send
solenberg0a617e22015-10-20 15:49:38 -0700184 int channel_id = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000185 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
186 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123, cricket::DF_SEND));
187 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 2, 123));
188
189 // Test play
190 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(3, 134));
191 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 3, 134, cricket::DF_PLAY));
192 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(3, 134));
193
194 // Test send and play
195 EXPECT_FALSE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
196 EXPECT_FALSE(voe_.WasPlayDtmfToneCalled(4, 145));
197 EXPECT_TRUE(channel_->InsertDtmf(ssrc, 4, 145,
198 cricket::DF_PLAY | cricket::DF_SEND));
199 EXPECT_TRUE(voe_.WasSendTelephoneEventCalled(channel_id, 4, 145));
200 EXPECT_TRUE(voe_.WasPlayDtmfToneCalled(4, 145));
201 }
202
203 // Test that send bandwidth is set correctly.
204 // |codec| is the codec under test.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000205 // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
206 // |expected_result| is the expected result from SetMaxSendBandwidth().
207 // |expected_bitrate| is the expected audio bitrate afterward.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000208 void TestSendBandwidth(const cricket::AudioCodec& codec,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000209 int max_bitrate,
210 bool expected_result,
211 int expected_bitrate) {
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200212 cricket::AudioSendParameters parameters;
213 parameters.codecs.push_back(codec);
214 parameters.max_bandwidth_bps = max_bitrate;
215 EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
216
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000217 int channel_num = voe_.GetLastChannel();
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000218 webrtc::CodecInst temp_codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000219 EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000220 EXPECT_EQ(expected_bitrate, temp_codec.rate);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000221 }
222
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000223 void TestSetSendRtpHeaderExtensions(const std::string& ext) {
solenberg0a617e22015-10-20 15:49:38 -0700224 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000225
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000226 // Ensure extensions are off by default.
solenberg3a941542015-11-16 07:34:50 -0800227 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000228
229 // Ensure unknown extensions won't cause an error.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200230 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000231 "urn:ietf:params:unknownextention", 1));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200232 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800233 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000234
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000235 // Ensure extensions stay off with an empty list of headers.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200236 send_parameters_.extensions.clear();
237 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800238 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000239
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000240 // Ensure extension is set properly.
241 const int id = 1;
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200242 send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
243 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800244 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
245 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
246 EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000247
solenberg7add0582015-11-20 09:59:34 -0800248 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000249 EXPECT_TRUE(channel_->AddSendStream(
solenberg0a617e22015-10-20 15:49:38 -0700250 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg3a941542015-11-16 07:34:50 -0800251 EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
252 call_.GetAudioSendStream(kSsrc2));
253 EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
254 EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
255 EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000256
257 // Ensure all extensions go back off with an empty list.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200258 send_parameters_.codecs.push_back(kPcmuCodec);
259 send_parameters_.extensions.clear();
260 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg3a941542015-11-16 07:34:50 -0800261 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
262 EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000263 }
264
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000265 void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
solenberg1ac56142015-10-13 03:58:19 -0700266 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000267
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000268 // Ensure extensions are off by default.
solenberg7add0582015-11-20 09:59:34 -0800269 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000270
271 // Ensure unknown extensions won't cause an error.
solenberg7add0582015-11-20 09:59:34 -0800272 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000273 "urn:ietf:params:unknownextention", 1));
solenberg7add0582015-11-20 09:59:34 -0800274 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
275 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000276
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000277 // Ensure extensions stay off with an empty list of headers.
solenberg7add0582015-11-20 09:59:34 -0800278 recv_parameters_.extensions.clear();
279 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
280 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000281
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000282 // Ensure extension is set properly.
283 const int id = 2;
solenberg7add0582015-11-20 09:59:34 -0800284 recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
285 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
286 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
287 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
288 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
henrike@webrtc.org79047f92014-03-06 23:46:59 +0000289
solenberg7add0582015-11-20 09:59:34 -0800290 // Ensure extension is set properly on new stream.
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000291 EXPECT_TRUE(channel_->AddRecvStream(
solenberg1ac56142015-10-13 03:58:19 -0700292 cricket::StreamParams::CreateLegacy(kSsrc2)));
solenberg7add0582015-11-20 09:59:34 -0800293 EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
294 call_.GetAudioReceiveStream(kSsrc2));
295 EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
296 EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
297 EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
buildbot@webrtc.org150835e2014-05-06 15:54:38 +0000298
299 // Ensure all extensions go back off with an empty list.
solenberg7add0582015-11-20 09:59:34 -0800300 recv_parameters_.extensions.clear();
301 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
302 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
303 EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +0000304 }
305
solenberg85a04962015-10-27 03:35:21 -0700306 webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
307 webrtc::AudioSendStream::Stats stats;
308 stats.local_ssrc = 12;
309 stats.bytes_sent = 345;
310 stats.packets_sent = 678;
311 stats.packets_lost = 9012;
312 stats.fraction_lost = 34.56f;
313 stats.codec_name = "codec_name_send";
314 stats.ext_seqnum = 789;
315 stats.jitter_ms = 12;
316 stats.rtt_ms = 345;
317 stats.audio_level = 678;
318 stats.aec_quality_min = 9.01f;
319 stats.echo_delay_median_ms = 234;
320 stats.echo_delay_std_ms = 567;
321 stats.echo_return_loss = 890;
322 stats.echo_return_loss_enhancement = 1234;
323 stats.typing_noise_detected = true;
324 return stats;
325 }
326 void SetAudioSendStreamStats() {
327 for (auto* s : call_.GetAudioSendStreams()) {
328 s->SetStats(GetAudioSendStreamStats());
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200329 }
solenberg85a04962015-10-27 03:35:21 -0700330 }
solenberg566ef242015-11-06 15:34:49 -0800331 void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
332 bool is_sending) {
solenberg85a04962015-10-27 03:35:21 -0700333 const auto stats = GetAudioSendStreamStats();
334 EXPECT_EQ(info.ssrc(), stats.local_ssrc);
335 EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
336 EXPECT_EQ(info.packets_sent, stats.packets_sent);
337 EXPECT_EQ(info.packets_lost, stats.packets_lost);
338 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
339 EXPECT_EQ(info.codec_name, stats.codec_name);
340 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
341 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
342 EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
343 EXPECT_EQ(info.audio_level, stats.audio_level);
344 EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
345 EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
346 EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
347 EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
348 EXPECT_EQ(info.echo_return_loss_enhancement,
349 stats.echo_return_loss_enhancement);
solenberg566ef242015-11-06 15:34:49 -0800350 EXPECT_EQ(info.typing_noise_detected,
351 stats.typing_noise_detected && is_sending);
solenberg85a04962015-10-27 03:35:21 -0700352 }
353
354 webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
355 webrtc::AudioReceiveStream::Stats stats;
356 stats.remote_ssrc = 123;
357 stats.bytes_rcvd = 456;
358 stats.packets_rcvd = 768;
359 stats.packets_lost = 101;
360 stats.fraction_lost = 23.45f;
361 stats.codec_name = "codec_name_recv";
362 stats.ext_seqnum = 678;
363 stats.jitter_ms = 901;
364 stats.jitter_buffer_ms = 234;
365 stats.jitter_buffer_preferred_ms = 567;
366 stats.delay_estimate_ms = 890;
367 stats.audio_level = 1234;
368 stats.expand_rate = 5.67f;
369 stats.speech_expand_rate = 8.90f;
370 stats.secondary_decoded_rate = 1.23f;
371 stats.accelerate_rate = 4.56f;
372 stats.preemptive_expand_rate = 7.89f;
373 stats.decoding_calls_to_silence_generator = 12;
374 stats.decoding_calls_to_neteq = 345;
375 stats.decoding_normal = 67890;
376 stats.decoding_plc = 1234;
377 stats.decoding_cng = 5678;
378 stats.decoding_plc_cng = 9012;
379 stats.capture_start_ntp_time_ms = 3456;
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200380 return stats;
381 }
382 void SetAudioReceiveStreamStats() {
383 for (auto* s : call_.GetAudioReceiveStreams()) {
384 s->SetStats(GetAudioReceiveStreamStats());
385 }
386 }
387 void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
solenberg85a04962015-10-27 03:35:21 -0700388 const auto stats = GetAudioReceiveStreamStats();
389 EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
390 EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
391 EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
392 EXPECT_EQ(info.packets_lost, stats.packets_lost);
393 EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
394 EXPECT_EQ(info.codec_name, stats.codec_name);
395 EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
396 EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
397 EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200398 EXPECT_EQ(info.jitter_buffer_preferred_ms,
solenberg85a04962015-10-27 03:35:21 -0700399 stats.jitter_buffer_preferred_ms);
400 EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
401 EXPECT_EQ(info.audio_level, stats.audio_level);
402 EXPECT_EQ(info.expand_rate, stats.expand_rate);
403 EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
404 EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
405 EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
406 EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200407 EXPECT_EQ(info.decoding_calls_to_silence_generator,
solenberg85a04962015-10-27 03:35:21 -0700408 stats.decoding_calls_to_silence_generator);
409 EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
410 EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
411 EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
412 EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
413 EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
414 EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +0200415 }
416
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000417 protected:
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200418 cricket::FakeCall call_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000419 cricket::FakeWebRtcVoiceEngine voe_;
wu@webrtc.org97077a32013-10-25 21:18:33 +0000420 FakeVoETraceWrapper* trace_wrapper_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000421 cricket::WebRtcVoiceEngine engine_;
422 cricket::VoiceMediaChannel* channel_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000423
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200424 cricket::AudioSendParameters send_parameters_;
425 cricket::AudioRecvParameters recv_parameters_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000426 cricket::AudioOptions options_adjust_agc_;
427};
428
429// Tests that our stub library "works".
430TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
431 EXPECT_FALSE(voe_.IsInited());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000432 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000433 EXPECT_TRUE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000434 engine_.Terminate();
435 EXPECT_FALSE(voe_.IsInited());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000436}
437
438// Tests that we can create and destroy a channel.
439TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000440 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200441 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +0200442 EXPECT_TRUE(channel_ != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000443}
444
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000445// Tests that the list of supported codecs is created properly and ordered
446// correctly
447TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
448 const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
449 ASSERT_FALSE(codecs.empty());
450 EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
451 EXPECT_EQ(48000, codecs[0].clockrate);
452 EXPECT_EQ(2, codecs[0].channels);
453 EXPECT_EQ(64000, codecs[0].bitrate);
454 int pref = codecs[0].preference;
455 for (size_t i = 1; i < codecs.size(); ++i) {
456 EXPECT_GT(pref, codecs[i].preference);
457 pref = codecs[i].preference;
458 }
459}
460
461// Tests that we can find codecs by name or id, and that we interpret the
462// clockrate and bitrate fields properly.
463TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
464 cricket::AudioCodec codec;
465 webrtc::CodecInst codec_inst;
466 // Find PCMU with explicit clockrate and bitrate.
467 EXPECT_TRUE(engine_.FindWebRtcCodec(kPcmuCodec, &codec_inst));
468 // Find ISAC with explicit clockrate and 0 bitrate.
469 EXPECT_TRUE(engine_.FindWebRtcCodec(kIsacCodec, &codec_inst));
470 // Find telephone-event with explicit clockrate and 0 bitrate.
471 EXPECT_TRUE(engine_.FindWebRtcCodec(kTelephoneEventCodec, &codec_inst));
472 // Find ISAC with a different payload id.
473 codec = kIsacCodec;
474 codec.id = 127;
475 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
476 EXPECT_EQ(codec.id, codec_inst.pltype);
477 // Find PCMU with a 0 clockrate.
478 codec = kPcmuCodec;
479 codec.clockrate = 0;
480 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
481 EXPECT_EQ(codec.id, codec_inst.pltype);
482 EXPECT_EQ(8000, codec_inst.plfreq);
483 // Find PCMU with a 0 bitrate.
484 codec = kPcmuCodec;
485 codec.bitrate = 0;
486 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
487 EXPECT_EQ(codec.id, codec_inst.pltype);
488 EXPECT_EQ(64000, codec_inst.rate);
489 // Find ISAC with an explicit bitrate.
490 codec = kIsacCodec;
491 codec.bitrate = 32000;
492 EXPECT_TRUE(engine_.FindWebRtcCodec(codec, &codec_inst));
493 EXPECT_EQ(codec.id, codec_inst.pltype);
494 EXPECT_EQ(32000, codec_inst.rate);
495}
496
497// Test that we set our inbound codecs properly, including changing PT.
498TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
499 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200500 cricket::AudioRecvParameters parameters;
501 parameters.codecs.push_back(kIsacCodec);
502 parameters.codecs.push_back(kPcmuCodec);
503 parameters.codecs.push_back(kTelephoneEventCodec);
504 parameters.codecs[0].id = 106; // collide with existing telephone-event
505 parameters.codecs[2].id = 126;
506 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
solenberg1ac56142015-10-13 03:58:19 -0700507 EXPECT_TRUE(channel_->AddRecvStream(
508 cricket::StreamParams::CreateLegacy(kSsrc1)));
509 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000510 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800511 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000512 gcodec.plfreq = 16000;
513 gcodec.channels = 1;
514 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
515 EXPECT_EQ(106, gcodec.pltype);
516 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800517 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000518 gcodec.plfreq = 8000;
519 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
520 EXPECT_EQ(126, gcodec.pltype);
521 EXPECT_STREQ("telephone-event", gcodec.plname);
522}
523
524// Test that we fail to set an unknown inbound codec.
525TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
526 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200527 cricket::AudioRecvParameters parameters;
528 parameters.codecs.push_back(kIsacCodec);
529 parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
530 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000531}
532
533// Test that we fail if we have duplicate types in the inbound list.
534TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
535 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200536 cricket::AudioRecvParameters parameters;
537 parameters.codecs.push_back(kIsacCodec);
538 parameters.codecs.push_back(kCn16000Codec);
539 parameters.codecs[1].id = kIsacCodec.id;
540 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000541}
542
543// Test that we can decode OPUS without stereo parameters.
544TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
545 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200546 cricket::AudioRecvParameters parameters;
547 parameters.codecs.push_back(kIsacCodec);
548 parameters.codecs.push_back(kPcmuCodec);
549 parameters.codecs.push_back(kOpusCodec);
550 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000551 EXPECT_TRUE(channel_->AddRecvStream(
552 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg1ac56142015-10-13 03:58:19 -0700553 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000554 webrtc::CodecInst opus;
555 engine_.FindWebRtcCodec(kOpusCodec, &opus);
556 // Even without stereo parameters, recv codecs still specify channels = 2.
557 EXPECT_EQ(2, opus.channels);
558 EXPECT_EQ(111, opus.pltype);
559 EXPECT_STREQ("opus", opus.plname);
560 opus.pltype = 0;
solenberg1ac56142015-10-13 03:58:19 -0700561 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000562 EXPECT_EQ(111, opus.pltype);
563}
564
565// Test that we can decode OPUS with stereo = 0.
566TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
567 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200568 cricket::AudioRecvParameters parameters;
569 parameters.codecs.push_back(kIsacCodec);
570 parameters.codecs.push_back(kPcmuCodec);
571 parameters.codecs.push_back(kOpusCodec);
572 parameters.codecs[2].params["stereo"] = "0";
573 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000574 EXPECT_TRUE(channel_->AddRecvStream(
575 cricket::StreamParams::CreateLegacy(kSsrc1)));
576 int channel_num2 = voe_.GetLastChannel();
577 webrtc::CodecInst opus;
578 engine_.FindWebRtcCodec(kOpusCodec, &opus);
579 // Even when stereo is off, recv codecs still specify channels = 2.
580 EXPECT_EQ(2, opus.channels);
581 EXPECT_EQ(111, opus.pltype);
582 EXPECT_STREQ("opus", opus.plname);
583 opus.pltype = 0;
584 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
585 EXPECT_EQ(111, opus.pltype);
586}
587
588// Test that we can decode OPUS with stereo = 1.
589TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
590 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200591 cricket::AudioRecvParameters parameters;
592 parameters.codecs.push_back(kIsacCodec);
593 parameters.codecs.push_back(kPcmuCodec);
594 parameters.codecs.push_back(kOpusCodec);
595 parameters.codecs[2].params["stereo"] = "1";
596 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000597 EXPECT_TRUE(channel_->AddRecvStream(
598 cricket::StreamParams::CreateLegacy(kSsrc1)));
599 int channel_num2 = voe_.GetLastChannel();
600 webrtc::CodecInst opus;
601 engine_.FindWebRtcCodec(kOpusCodec, &opus);
602 EXPECT_EQ(2, opus.channels);
603 EXPECT_EQ(111, opus.pltype);
604 EXPECT_STREQ("opus", opus.plname);
605 opus.pltype = 0;
606 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
607 EXPECT_EQ(111, opus.pltype);
608}
609
610// Test that changes to recv codecs are applied to all streams.
611TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
612 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200613 cricket::AudioRecvParameters parameters;
614 parameters.codecs.push_back(kIsacCodec);
615 parameters.codecs.push_back(kPcmuCodec);
616 parameters.codecs.push_back(kTelephoneEventCodec);
617 parameters.codecs[0].id = 106; // collide with existing telephone-event
618 parameters.codecs[2].id = 126;
619 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000620 EXPECT_TRUE(channel_->AddRecvStream(
621 cricket::StreamParams::CreateLegacy(kSsrc1)));
622 int channel_num2 = voe_.GetLastChannel();
623 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800624 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000625 gcodec.plfreq = 16000;
626 gcodec.channels = 1;
627 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
628 EXPECT_EQ(106, gcodec.pltype);
629 EXPECT_STREQ("ISAC", gcodec.plname);
tfarina5237aaf2015-11-10 23:44:30 -0800630 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631 gcodec.plfreq = 8000;
632 gcodec.channels = 1;
633 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
634 EXPECT_EQ(126, gcodec.pltype);
635 EXPECT_STREQ("telephone-event", gcodec.plname);
636}
637
638TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
solenberg1ac56142015-10-13 03:58:19 -0700639 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200640 cricket::AudioRecvParameters parameters;
641 parameters.codecs.push_back(kIsacCodec);
642 parameters.codecs[0].id = 106; // collide with existing telephone-event
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200643 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000644
645 int channel_num2 = voe_.GetLastChannel();
646 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -0800647 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000648 gcodec.plfreq = 16000;
649 gcodec.channels = 1;
650 EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
651 EXPECT_EQ(106, gcodec.pltype);
652 EXPECT_STREQ("ISAC", gcodec.plname);
653}
654
655// Test that we can apply the same set of codecs again while playing.
656TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700657 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200658 cricket::AudioRecvParameters parameters;
659 parameters.codecs.push_back(kIsacCodec);
660 parameters.codecs.push_back(kCn16000Codec);
661 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662 EXPECT_TRUE(channel_->SetPlayout(true));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200663 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000664
665 // Changing the payload type of a codec should fail.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200666 parameters.codecs[0].id = 127;
667 EXPECT_FALSE(channel_->SetRecvParameters(parameters));
668 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000669 EXPECT_TRUE(voe_.GetPlayout(channel_num));
670}
671
672// Test that we can add a codec while playing.
673TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
solenberg1ac56142015-10-13 03:58:19 -0700674 EXPECT_TRUE(SetupEngineWithRecvStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200675 cricket::AudioRecvParameters parameters;
676 parameters.codecs.push_back(kIsacCodec);
677 parameters.codecs.push_back(kCn16000Codec);
678 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000679 EXPECT_TRUE(channel_->SetPlayout(true));
680
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200681 parameters.codecs.push_back(kOpusCodec);
682 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
683 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000684 EXPECT_TRUE(voe_.GetPlayout(channel_num));
685 webrtc::CodecInst gcodec;
686 EXPECT_TRUE(engine_.FindWebRtcCodec(kOpusCodec, &gcodec));
687 EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
688}
689
690TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
solenberg1ac56142015-10-13 03:58:19 -0700691 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000692
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000693 // Test that when autobw is enabled, bitrate is kept as the default
694 // value. autobw is enabled for the following tests because the target
695 // bitrate is <= 0.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000696
697 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000698 TestSendBandwidth(kIsacCodec, 0, true, 32000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000699
700 // PCMU, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000701 TestSendBandwidth(kPcmuCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000702
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000703 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000704 TestSendBandwidth(kOpusCodec, -1, true, 64000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000705}
706
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000707TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700708 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000709
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000710 // Test that the bitrate of a multi-rate codec is always the maximum.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000711
712 // ISAC, default bitrate == 32000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000713 TestSendBandwidth(kIsacCodec, 128000, true, 128000);
714 TestSendBandwidth(kIsacCodec, 16000, true, 16000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000715
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000716 // opus, default bitrate == 64000.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000717 TestSendBandwidth(kOpusCodec, 96000, true, 96000);
718 TestSendBandwidth(kOpusCodec, 48000, true, 48000);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000719}
720
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000721TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -0700722 EXPECT_TRUE(SetupEngineWithSendStream());
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000723
724 // Test that we can only set a maximum bitrate for a fixed-rate codec
725 // if it's bigger than the fixed rate.
726
727 // PCMU, fixed bitrate == 64000.
728 TestSendBandwidth(kPcmuCodec, 0, true, 64000);
729 TestSendBandwidth(kPcmuCodec, 1, false, 64000);
730 TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
731 TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
732 TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
733 TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
734 TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
735}
736
737TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
solenberg1ac56142015-10-13 03:58:19 -0700738 EXPECT_TRUE(SetupEngine());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200739 const int kDesiredBitrate = 128000;
740 cricket::AudioSendParameters parameters;
741 parameters.codecs = engine_.codecs();
742 parameters.max_bandwidth_bps = kDesiredBitrate;
743 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000744
745 EXPECT_TRUE(channel_->AddSendStream(
746 cricket::StreamParams::CreateLegacy(kSsrc1)));
747
748 int channel_num = voe_.GetLastChannel();
749 webrtc::CodecInst codec;
750 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200751 EXPECT_EQ(kDesiredBitrate, codec.rate);
wu@webrtc.org1d1ffc92013-10-16 18:12:02 +0000752}
753
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000754// Test that bitrate cannot be set for CBR codecs.
755// Bitrate is ignored if it is higher than the fixed bitrate.
756// Bitrate less then the fixed bitrate is an error.
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000757TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
solenberg1ac56142015-10-13 03:58:19 -0700758 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000759
760 // PCMU, default bitrate == 64000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200761 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
762 int channel_num = voe_.GetLastChannel();
763 webrtc::CodecInst codec;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000764 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
765 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200766
767 send_parameters_.max_bandwidth_bps = 128000;
768 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000769 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
770 EXPECT_EQ(64000, codec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200771
772 send_parameters_.max_bandwidth_bps = 128;
773 EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000774 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
775 EXPECT_EQ(64000, codec.rate);
776}
777
778// Test that we apply codecs properly.
779TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
solenberg1ac56142015-10-13 03:58:19 -0700780 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200781 cricket::AudioSendParameters parameters;
782 parameters.codecs.push_back(kIsacCodec);
783 parameters.codecs.push_back(kPcmuCodec);
784 parameters.codecs.push_back(kRedCodec);
785 parameters.codecs[0].id = 96;
786 parameters.codecs[0].bitrate = 48000;
787 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000788 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200789 int channel_num = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000790 webrtc::CodecInst gcodec;
791 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
792 EXPECT_EQ(96, gcodec.pltype);
793 EXPECT_EQ(48000, gcodec.rate);
794 EXPECT_STREQ("ISAC", gcodec.plname);
795 EXPECT_FALSE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +0000796 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000797 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
798 EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
799 EXPECT_EQ(106, voe_.GetSendTelephoneEventPayloadType(channel_num));
800}
801
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000802// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
803// to apply.
804TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
solenberg1ac56142015-10-13 03:58:19 -0700805 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200806 cricket::AudioSendParameters parameters;
807 parameters.codecs.push_back(kIsacCodec);
808 parameters.codecs.push_back(kPcmuCodec);
809 parameters.codecs.push_back(kRedCodec);
810 parameters.codecs[0].id = 96;
811 parameters.codecs[0].bitrate = 48000;
812 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000813 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
814 // Calling SetSendCodec again with same codec which is already set.
815 // In this case media channel shouldn't send codec to VoE.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200816 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org05e7b442014-04-01 17:44:24 +0000817 EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
818}
819
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000820// Verify that G722 is set with 16000 samples per second to WebRTC.
821TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
solenberg1ac56142015-10-13 03:58:19 -0700822 EXPECT_TRUE(SetupEngineWithSendStream());
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000823 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200824 cricket::AudioSendParameters parameters;
825 parameters.codecs.push_back(kG722CodecSdp);
826 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrik.lundin@webrtc.orgf85dbce2014-11-07 12:25:00 +0000827 webrtc::CodecInst gcodec;
828 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
829 EXPECT_STREQ("G722", gcodec.plname);
830 EXPECT_EQ(1, gcodec.channels);
831 EXPECT_EQ(16000, gcodec.plfreq);
832}
833
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000834// Test that if clockrate is not 48000 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000835TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
solenberg1ac56142015-10-13 03:58:19 -0700836 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200837 cricket::AudioSendParameters parameters;
838 parameters.codecs.push_back(kOpusCodec);
839 parameters.codecs[0].bitrate = 0;
840 parameters.codecs[0].clockrate = 50000;
841 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000842}
843
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000844// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000845TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700846 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200847 cricket::AudioSendParameters parameters;
848 parameters.codecs.push_back(kOpusCodec);
849 parameters.codecs[0].bitrate = 0;
850 parameters.codecs[0].channels = 0;
851 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000852}
853
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +0000854// Test that if channels=0 for opus, we fail.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000855TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700856 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200857 cricket::AudioSendParameters parameters;
858 parameters.codecs.push_back(kOpusCodec);
859 parameters.codecs[0].bitrate = 0;
860 parameters.codecs[0].channels = 0;
861 parameters.codecs[0].params["stereo"] = "1";
862 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000863}
864
865// Test that if channel is 1 for opus and there's no stereo, we fail.
866TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700867 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200868 cricket::AudioSendParameters parameters;
869 parameters.codecs.push_back(kOpusCodec);
870 parameters.codecs[0].bitrate = 0;
871 parameters.codecs[0].channels = 1;
872 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000873}
874
875// Test that if channel is 1 for opus and stereo=0, we fail.
876TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700877 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200878 cricket::AudioSendParameters parameters;
879 parameters.codecs.push_back(kOpusCodec);
880 parameters.codecs[0].bitrate = 0;
881 parameters.codecs[0].channels = 1;
882 parameters.codecs[0].params["stereo"] = "0";
883 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000884}
885
886// Test that if channel is 1 for opus and stereo=1, we fail.
887TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700888 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200889 cricket::AudioSendParameters parameters;
890 parameters.codecs.push_back(kOpusCodec);
891 parameters.codecs[0].bitrate = 0;
892 parameters.codecs[0].channels = 1;
893 parameters.codecs[0].params["stereo"] = "1";
894 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000895}
896
897// Test that with bitrate=0 and no stereo,
898// channels and bitrate are 1 and 32000.
899TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -0700900 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000901 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200902 cricket::AudioSendParameters parameters;
903 parameters.codecs.push_back(kOpusCodec);
904 parameters.codecs[0].bitrate = 0;
905 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000906 webrtc::CodecInst gcodec;
907 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
908 EXPECT_STREQ("opus", gcodec.plname);
909 EXPECT_EQ(1, gcodec.channels);
910 EXPECT_EQ(32000, gcodec.rate);
911}
912
913// Test that with bitrate=0 and stereo=0,
914// channels and bitrate are 1 and 32000.
915TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700916 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000917 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200918 cricket::AudioSendParameters parameters;
919 parameters.codecs.push_back(kOpusCodec);
920 parameters.codecs[0].bitrate = 0;
921 parameters.codecs[0].params["stereo"] = "0";
922 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000923 webrtc::CodecInst gcodec;
924 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
925 EXPECT_STREQ("opus", gcodec.plname);
926 EXPECT_EQ(1, gcodec.channels);
927 EXPECT_EQ(32000, gcodec.rate);
928}
929
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000930// Test that with bitrate=invalid and stereo=0,
931// channels and bitrate are 1 and 32000.
932TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700933 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000934 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200935 cricket::AudioSendParameters parameters;
936 parameters.codecs.push_back(kOpusCodec);
937 parameters.codecs[0].params["stereo"] = "0";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000938 webrtc::CodecInst gcodec;
939
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000940 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200941 parameters.codecs[0].bitrate = 5999;
942 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000943 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
944 EXPECT_STREQ("opus", gcodec.plname);
945 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000946 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000947
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200948 parameters.codecs[0].bitrate = 510001;
949 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000950 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
951 EXPECT_STREQ("opus", gcodec.plname);
952 EXPECT_EQ(1, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000953 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000954}
955
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000956// Test that with bitrate=0 and stereo=1,
957// channels and bitrate are 2 and 64000.
958TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700959 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000960 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200961 cricket::AudioSendParameters parameters;
962 parameters.codecs.push_back(kOpusCodec);
963 parameters.codecs[0].bitrate = 0;
964 parameters.codecs[0].params["stereo"] = "1";
965 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000966 webrtc::CodecInst gcodec;
967 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
968 EXPECT_STREQ("opus", gcodec.plname);
969 EXPECT_EQ(2, gcodec.channels);
970 EXPECT_EQ(64000, gcodec.rate);
971}
972
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000973// Test that with bitrate=invalid and stereo=1,
974// channels and bitrate are 2 and 64000.
975TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -0700976 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +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].params["stereo"] = "1";
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000981 webrtc::CodecInst gcodec;
982
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000983 // bitrate that's out of the range between 6000 and 510000 will be clamped.
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200984 parameters.codecs[0].bitrate = 5999;
985 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000986 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
987 EXPECT_STREQ("opus", gcodec.plname);
988 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000989 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000990
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200991 parameters.codecs[0].bitrate = 510001;
992 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000993 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
994 EXPECT_STREQ("opus", gcodec.plname);
995 EXPECT_EQ(2, gcodec.channels);
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +0000996 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000997}
998
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000999// Test that with bitrate=N and stereo unset,
1000// channels and bitrate are 1 and N.
1001TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001002 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001003 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001004 cricket::AudioSendParameters parameters;
1005 parameters.codecs.push_back(kOpusCodec);
1006 parameters.codecs[0].bitrate = 96000;
1007 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001008 webrtc::CodecInst gcodec;
1009 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1010 EXPECT_EQ(111, gcodec.pltype);
1011 EXPECT_EQ(96000, gcodec.rate);
1012 EXPECT_STREQ("opus", gcodec.plname);
1013 EXPECT_EQ(1, gcodec.channels);
1014 EXPECT_EQ(48000, gcodec.plfreq);
1015}
1016
1017// Test that with bitrate=N and stereo=0,
1018// channels and bitrate are 1 and N.
1019TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001020 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001021 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001022 cricket::AudioSendParameters parameters;
1023 parameters.codecs.push_back(kOpusCodec);
1024 parameters.codecs[0].bitrate = 30000;
1025 parameters.codecs[0].params["stereo"] = "0";
1026 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001027 webrtc::CodecInst gcodec;
1028 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1029 EXPECT_EQ(1, gcodec.channels);
1030 EXPECT_EQ(30000, gcodec.rate);
1031 EXPECT_STREQ("opus", gcodec.plname);
1032}
1033
1034// Test that with bitrate=N and without any parameters,
1035// channels and bitrate are 1 and N.
1036TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
solenberg1ac56142015-10-13 03:58:19 -07001037 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001038 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001039 cricket::AudioSendParameters parameters;
1040 parameters.codecs.push_back(kOpusCodec);
1041 parameters.codecs[0].bitrate = 30000;
1042 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001043 webrtc::CodecInst gcodec;
1044 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1045 EXPECT_EQ(1, gcodec.channels);
1046 EXPECT_EQ(30000, gcodec.rate);
1047 EXPECT_STREQ("opus", gcodec.plname);
1048}
1049
1050// Test that with bitrate=N and stereo=1,
1051// channels and bitrate are 2 and N.
1052TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
solenberg1ac56142015-10-13 03:58:19 -07001053 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001054 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001055 cricket::AudioSendParameters parameters;
1056 parameters.codecs.push_back(kOpusCodec);
1057 parameters.codecs[0].bitrate = 30000;
1058 parameters.codecs[0].params["stereo"] = "1";
1059 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001060 webrtc::CodecInst gcodec;
1061 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1062 EXPECT_EQ(2, gcodec.channels);
1063 EXPECT_EQ(30000, gcodec.rate);
1064 EXPECT_STREQ("opus", gcodec.plname);
1065}
1066
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001067// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
1068// Also test that the "maxaveragebitrate" can't be set to values outside the
1069// range of 6000 and 510000
1070TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001071 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001072 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001073 cricket::AudioSendParameters parameters;
1074 parameters.codecs.push_back(kOpusCodec);
1075 parameters.codecs[0].bitrate = 30000;
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001076 webrtc::CodecInst gcodec;
1077
1078 // Ignore if less than 6000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001079 parameters.codecs[0].params["maxaveragebitrate"] = "5999";
1080 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001081 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001082 EXPECT_EQ(6000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001083
1084 // Ignore if larger than 510000.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001085 parameters.codecs[0].params["maxaveragebitrate"] = "510001";
1086 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001087 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
buildbot@webrtc.org9d446f22014-10-23 12:22:06 +00001088 EXPECT_EQ(510000, gcodec.rate);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001089
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001090 parameters.codecs[0].params["maxaveragebitrate"] = "200000";
1091 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +00001092 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1093 EXPECT_EQ(200000, gcodec.rate);
1094}
1095
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001096// Test that we can enable NACK with opus as caller.
1097TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001098 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001099 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001100 cricket::AudioSendParameters parameters;
1101 parameters.codecs.push_back(kOpusCodec);
1102 parameters.codecs[0].AddFeedbackParam(
1103 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1104 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001105 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001106 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001107 EXPECT_TRUE(voe_.GetNACK(channel_num));
1108}
1109
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001110// Test that we can enable NACK with opus as callee.
1111TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
solenberg0a617e22015-10-20 15:49:38 -07001112 EXPECT_TRUE(SetupEngineWithRecvStream());
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001113 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001114 cricket::AudioSendParameters parameters;
1115 parameters.codecs.push_back(kOpusCodec);
1116 parameters.codecs[0].AddFeedbackParam(
1117 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1118 cricket::kParamValueEmpty));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001119 EXPECT_FALSE(voe_.GetNACK(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001120 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001121 EXPECT_FALSE(voe_.GetNACK(channel_num));
1122
1123 EXPECT_TRUE(channel_->AddSendStream(
1124 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001125 EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001126}
1127
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001128// Test that we can enable NACK on receive streams.
1129TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001130 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001131 int channel_num1 = voe_.GetLastChannel();
1132 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1133 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001134 cricket::AudioSendParameters parameters;
1135 parameters.codecs.push_back(kOpusCodec);
1136 parameters.codecs[0].AddFeedbackParam(
1137 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1138 cricket::kParamValueEmpty));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001139 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1140 EXPECT_FALSE(voe_.GetNACK(channel_num2));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001141 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001142 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1143 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1144}
1145
1146// Test that we can disable NACK.
1147TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001148 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001149 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001150 cricket::AudioSendParameters parameters;
1151 parameters.codecs.push_back(kOpusCodec);
1152 parameters.codecs[0].AddFeedbackParam(
1153 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1154 cricket::kParamValueEmpty));
1155 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001156 EXPECT_TRUE(voe_.GetNACK(channel_num));
1157
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001158 parameters.codecs.clear();
1159 parameters.codecs.push_back(kOpusCodec);
1160 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001161 EXPECT_FALSE(voe_.GetNACK(channel_num));
1162}
1163
1164// Test that we can disable NACK on receive streams.
1165TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001166 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001167 int channel_num1 = voe_.GetLastChannel();
1168 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1169 int channel_num2 = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001170 cricket::AudioSendParameters parameters;
1171 parameters.codecs.push_back(kOpusCodec);
1172 parameters.codecs[0].AddFeedbackParam(
1173 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1174 cricket::kParamValueEmpty));
1175 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001176 EXPECT_TRUE(voe_.GetNACK(channel_num1));
1177 EXPECT_TRUE(voe_.GetNACK(channel_num2));
1178
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001179 parameters.codecs.clear();
1180 parameters.codecs.push_back(kOpusCodec);
1181 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001182 EXPECT_FALSE(voe_.GetNACK(channel_num1));
1183 EXPECT_FALSE(voe_.GetNACK(channel_num2));
1184}
1185
1186// Test that NACK is enabled on a new receive stream.
1187TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
solenberg1ac56142015-10-13 03:58:19 -07001188 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001189 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001190 cricket::AudioSendParameters parameters;
1191 parameters.codecs.push_back(kIsacCodec);
1192 parameters.codecs.push_back(kCn16000Codec);
1193 parameters.codecs[0].AddFeedbackParam(
1194 cricket::FeedbackParam(cricket::kRtcpFbParamNack,
1195 cricket::kParamValueEmpty));
1196 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001197 EXPECT_TRUE(voe_.GetNACK(channel_num));
1198
1199 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
1200 channel_num = voe_.GetLastChannel();
1201 EXPECT_TRUE(voe_.GetNACK(channel_num));
1202 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
1203 channel_num = voe_.GetLastChannel();
1204 EXPECT_TRUE(voe_.GetNACK(channel_num));
1205}
1206
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001207// Test that without useinbandfec, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001208TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
solenberg1ac56142015-10-13 03:58:19 -07001209 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001210 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001211 cricket::AudioSendParameters parameters;
1212 parameters.codecs.push_back(kOpusCodec);
1213 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001214 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1215}
1216
1217// Test that with useinbandfec=0, Opus FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001218TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001219 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001220 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001221 cricket::AudioSendParameters parameters;
1222 parameters.codecs.push_back(kOpusCodec);
1223 parameters.codecs[0].bitrate = 0;
1224 parameters.codecs[0].params["useinbandfec"] = "0";
1225 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001226 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1227 webrtc::CodecInst gcodec;
1228 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1229 EXPECT_STREQ("opus", gcodec.plname);
1230 EXPECT_EQ(1, gcodec.channels);
1231 EXPECT_EQ(32000, gcodec.rate);
1232}
1233
1234// Test that with useinbandfec=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001235TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
solenberg1ac56142015-10-13 03:58:19 -07001236 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001237 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001238 cricket::AudioSendParameters parameters;
1239 parameters.codecs.push_back(kOpusCodec);
1240 parameters.codecs[0].bitrate = 0;
1241 parameters.codecs[0].params["useinbandfec"] = "1";
1242 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001243 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1244 webrtc::CodecInst gcodec;
1245 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1246 EXPECT_STREQ("opus", gcodec.plname);
1247 EXPECT_EQ(1, gcodec.channels);
1248 EXPECT_EQ(32000, gcodec.rate);
1249}
1250
1251// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001252TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001253 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001254 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001255 cricket::AudioSendParameters parameters;
1256 parameters.codecs.push_back(kOpusCodec);
1257 parameters.codecs[0].bitrate = 0;
1258 parameters.codecs[0].params["stereo"] = "1";
1259 parameters.codecs[0].params["useinbandfec"] = "1";
1260 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001261 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1262 webrtc::CodecInst gcodec;
1263 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1264 EXPECT_STREQ("opus", gcodec.plname);
1265 EXPECT_EQ(2, gcodec.channels);
1266 EXPECT_EQ(64000, gcodec.rate);
1267}
1268
1269// Test that with non-Opus, codec FEC is off.
buildbot@webrtc.orgd27d9ae2014-06-19 01:56:46 +00001270TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001271 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001272 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001273 cricket::AudioSendParameters parameters;
1274 parameters.codecs.push_back(kIsacCodec);
1275 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001276 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1277}
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001278
1279// Test the with non-Opus, even if useinbandfec=1, FEC is off.
1280TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
solenberg1ac56142015-10-13 03:58:19 -07001281 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001282 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001283 cricket::AudioSendParameters parameters;
1284 parameters.codecs.push_back(kIsacCodec);
1285 parameters.codecs[0].params["useinbandfec"] = "1";
1286 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org3ffa1f92014-07-02 19:51:26 +00001287 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
1288}
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001289
1290// Test that Opus FEC status can be changed.
1291TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
solenberg1ac56142015-10-13 03:58:19 -07001292 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001293 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001294 cricket::AudioSendParameters parameters;
1295 parameters.codecs.push_back(kOpusCodec);
1296 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001297 EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001298 parameters.codecs[0].params["useinbandfec"] = "1";
1299 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001300 EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
1301}
1302
1303// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
1304TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
solenberg1ac56142015-10-13 03:58:19 -07001305 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001306 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001307 cricket::AudioSendParameters parameters;
1308 parameters.codecs.push_back(kOpusCodec);
1309 parameters.codecs[0].bitrate = 0;
1310 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
1311 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001312 EXPECT_EQ(cricket::kOpusBandwidthNb,
1313 voe_.GetMaxEncodingBandwidth(channel_num));
1314 webrtc::CodecInst gcodec;
1315 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1316 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001317
1318 EXPECT_EQ(12000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001319 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1320 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001321 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1322 EXPECT_EQ(24000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001323}
1324
1325// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
1326TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
solenberg1ac56142015-10-13 03:58:19 -07001327 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001328 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001329 cricket::AudioSendParameters parameters;
1330 parameters.codecs.push_back(kOpusCodec);
1331 parameters.codecs[0].bitrate = 0;
1332 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
1333 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001334 EXPECT_EQ(cricket::kOpusBandwidthMb,
1335 voe_.GetMaxEncodingBandwidth(channel_num));
1336 webrtc::CodecInst gcodec;
1337 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1338 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001339
1340 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001341 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1342 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001343 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1344 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001345}
1346
1347// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
1348TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
solenberg1ac56142015-10-13 03:58:19 -07001349 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001350 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].bitrate = 0;
1354 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
1355 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001356 EXPECT_EQ(cricket::kOpusBandwidthWb,
1357 voe_.GetMaxEncodingBandwidth(channel_num));
1358 webrtc::CodecInst gcodec;
1359 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1360 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001361
1362 EXPECT_EQ(20000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001363 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1364 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001365 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1366 EXPECT_EQ(40000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001367}
1368
1369// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
1370TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
solenberg1ac56142015-10-13 03:58:19 -07001371 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001372 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001373 cricket::AudioSendParameters parameters;
1374 parameters.codecs.push_back(kOpusCodec);
1375 parameters.codecs[0].bitrate = 0;
1376 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
1377 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001378 EXPECT_EQ(cricket::kOpusBandwidthSwb,
1379 voe_.GetMaxEncodingBandwidth(channel_num));
1380 webrtc::CodecInst gcodec;
1381 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1382 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001383
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001384 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001385 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1386 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001387 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1388 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001389}
1390
1391// Test 24000 < maxplaybackrate triggers Opus full band mode.
1392TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
solenberg1ac56142015-10-13 03:58:19 -07001393 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001394 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001395 cricket::AudioSendParameters parameters;
1396 parameters.codecs.push_back(kOpusCodec);
1397 parameters.codecs[0].bitrate = 0;
1398 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
1399 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001400 EXPECT_EQ(cricket::kOpusBandwidthFb,
1401 voe_.GetMaxEncodingBandwidth(channel_num));
1402 webrtc::CodecInst gcodec;
1403 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1404 EXPECT_STREQ("opus", gcodec.plname);
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001405
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001406 EXPECT_EQ(32000, gcodec.rate);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001407 parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
1408 EXPECT_TRUE(channel_->SetSendParameters(parameters));
minyue@webrtc.org2dc6f312014-10-31 05:33:10 +00001409 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1410 EXPECT_EQ(64000, gcodec.rate);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001411}
1412
1413// Test Opus that without maxplaybackrate, default playback rate is used.
1414TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001415 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001416 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001417 cricket::AudioSendParameters parameters;
1418 parameters.codecs.push_back(kOpusCodec);
1419 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001420 EXPECT_EQ(cricket::kOpusBandwidthFb,
1421 voe_.GetMaxEncodingBandwidth(channel_num));
1422}
1423
1424// Test the with non-Opus, maxplaybackrate has no effect.
1425TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
solenberg1ac56142015-10-13 03:58:19 -07001426 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001427 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001428 cricket::AudioSendParameters parameters;
1429 parameters.codecs.push_back(kIsacCodec);
1430 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
1431 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001432 EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
1433}
1434
1435// Test maxplaybackrate can be set on two streams.
1436TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
solenberg1ac56142015-10-13 03:58:19 -07001437 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001438 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001439 cricket::AudioSendParameters parameters;
1440 parameters.codecs.push_back(kOpusCodec);
1441 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001442 // Default bandwidth is 24000.
1443 EXPECT_EQ(cricket::kOpusBandwidthFb,
1444 voe_.GetMaxEncodingBandwidth(channel_num));
1445
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001446 parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001447
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001448 EXPECT_TRUE(channel_->SetSendParameters(parameters));
buildbot@webrtc.org5d639b32014-09-10 07:57:12 +00001449 EXPECT_EQ(cricket::kOpusBandwidthNb,
1450 voe_.GetMaxEncodingBandwidth(channel_num));
1451
1452 channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
1453 channel_num = voe_.GetLastChannel();
1454 EXPECT_EQ(cricket::kOpusBandwidthNb,
1455 voe_.GetMaxEncodingBandwidth(channel_num));
1456}
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001457
Minyue Li7100dcd2015-03-27 05:05:59 +01001458// Test that with usedtx=0, Opus DTX is off.
1459TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001460 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001461 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001462 cricket::AudioSendParameters parameters;
1463 parameters.codecs.push_back(kOpusCodec);
1464 parameters.codecs[0].params["usedtx"] = "0";
1465 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001466 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1467}
1468
1469// Test that with usedtx=1, Opus DTX is on.
1470TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001471 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001472 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001473 cricket::AudioSendParameters parameters;
1474 parameters.codecs.push_back(kOpusCodec);
1475 parameters.codecs[0].params["usedtx"] = "1";
1476 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001477 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1478 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1479}
1480
1481// Test that usedtx=1 works with stereo Opus.
1482TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
solenberg1ac56142015-10-13 03:58:19 -07001483 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001484 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001485 cricket::AudioSendParameters parameters;
1486 parameters.codecs.push_back(kOpusCodec);
1487 parameters.codecs[0].params["usedtx"] = "1";
1488 parameters.codecs[0].params["stereo"] = "1";
1489 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001490 EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
1491 EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
1492}
1493
1494// Test that usedtx=1 does not work with non Opus.
1495TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
solenberg1ac56142015-10-13 03:58:19 -07001496 EXPECT_TRUE(SetupEngineWithSendStream());
Minyue Li7100dcd2015-03-27 05:05:59 +01001497 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001498 cricket::AudioSendParameters parameters;
1499 parameters.codecs.push_back(kIsacCodec);
1500 parameters.codecs[0].params["usedtx"] = "1";
1501 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Minyue Li7100dcd2015-03-27 05:05:59 +01001502 EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
1503}
1504
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001505// Test that we can switch back and forth between Opus and ISAC with CN.
1506TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
solenberg1ac56142015-10-13 03:58:19 -07001507 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001508 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001509 cricket::AudioSendParameters opus_parameters;
1510 opus_parameters.codecs.push_back(kOpusCodec);
1511 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001512 webrtc::CodecInst gcodec;
1513 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001514 EXPECT_EQ(111, gcodec.pltype);
1515 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001516
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001517 cricket::AudioSendParameters isac_parameters;
1518 isac_parameters.codecs.push_back(kIsacCodec);
1519 isac_parameters.codecs.push_back(kCn16000Codec);
1520 isac_parameters.codecs.push_back(kOpusCodec);
1521 EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001522 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1523 EXPECT_EQ(103, gcodec.pltype);
1524 EXPECT_STREQ("ISAC", gcodec.plname);
1525
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001526 EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001527 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00001528 EXPECT_EQ(111, gcodec.pltype);
1529 EXPECT_STREQ("opus", gcodec.plname);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001530}
1531
1532// Test that we handle various ways of specifying bitrate.
1533TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
solenberg1ac56142015-10-13 03:58:19 -07001534 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001535 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001536 cricket::AudioSendParameters parameters;
1537 parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
1538 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001539 webrtc::CodecInst gcodec;
1540 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1541 EXPECT_EQ(103, gcodec.pltype);
1542 EXPECT_STREQ("ISAC", gcodec.plname);
1543 EXPECT_EQ(32000, gcodec.rate);
1544
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001545 parameters.codecs[0].bitrate = 0; // bitrate == default
1546 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001547 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1548 EXPECT_EQ(103, gcodec.pltype);
1549 EXPECT_STREQ("ISAC", gcodec.plname);
1550 EXPECT_EQ(-1, gcodec.rate);
1551
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001552 parameters.codecs[0].bitrate = 28000; // bitrate == 28000
1553 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001554 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1555 EXPECT_EQ(103, gcodec.pltype);
1556 EXPECT_STREQ("ISAC", gcodec.plname);
1557 EXPECT_EQ(28000, gcodec.rate);
1558
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001559 parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
1560 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001561 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1562 EXPECT_EQ(0, gcodec.pltype);
1563 EXPECT_STREQ("PCMU", gcodec.plname);
1564 EXPECT_EQ(64000, gcodec.rate);
1565
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001566 parameters.codecs[0].bitrate = 0; // bitrate == default
1567 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001568 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1569 EXPECT_EQ(0, gcodec.pltype);
1570 EXPECT_STREQ("PCMU", gcodec.plname);
1571 EXPECT_EQ(64000, gcodec.rate);
1572
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001573 parameters.codecs[0] = kOpusCodec;
1574 parameters.codecs[0].bitrate = 0; // bitrate == default
1575 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001576 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1577 EXPECT_EQ(111, gcodec.pltype);
1578 EXPECT_STREQ("opus", gcodec.plname);
1579 EXPECT_EQ(32000, gcodec.rate);
1580}
1581
Brave Yao5225dd82015-03-26 07:39:19 +08001582// Test that we could set packet size specified in kCodecParamPTime.
1583TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
solenberg1ac56142015-10-13 03:58:19 -07001584 EXPECT_TRUE(SetupEngineWithSendStream());
Brave Yao5225dd82015-03-26 07:39:19 +08001585 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001586 cricket::AudioSendParameters parameters;
1587 parameters.codecs.push_back(kOpusCodec);
1588 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1589 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001590 webrtc::CodecInst gcodec;
1591 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1592 EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
1593
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001594 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
1595 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001596 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1597 EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
1598
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001599 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
1600 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001601 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1602 EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
1603
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001604 parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
1605 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
1606 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001607 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1608 EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
1609
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001610 parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
1611 parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
1612 EXPECT_TRUE(channel_->SetSendParameters(parameters));
Brave Yao5225dd82015-03-26 07:39:19 +08001613 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1614 EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
1615}
1616
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001617// Test that we fail if no codecs are specified.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001618TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
solenberg1ac56142015-10-13 03:58:19 -07001619 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001620 cricket::AudioSendParameters parameters;
1621 EXPECT_FALSE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001622}
1623
1624// Test that we can set send codecs even with telephone-event codec as the first
1625// one on the list.
1626TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001627 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001628 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001629 cricket::AudioSendParameters parameters;
1630 parameters.codecs.push_back(kTelephoneEventCodec);
1631 parameters.codecs.push_back(kIsacCodec);
1632 parameters.codecs.push_back(kPcmuCodec);
1633 parameters.codecs[0].id = 98; // DTMF
1634 parameters.codecs[1].id = 96;
1635 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001636 webrtc::CodecInst gcodec;
1637 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001638 EXPECT_EQ(96, gcodec.pltype);
1639 EXPECT_STREQ("ISAC", gcodec.plname);
1640 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1641}
1642
1643// Test that we can set send codecs even with CN codec as the first
1644// one on the list.
1645TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
solenberg1ac56142015-10-13 03:58:19 -07001646 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001647 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001648 cricket::AudioSendParameters parameters;
1649 parameters.codecs.push_back(kCn16000Codec);
1650 parameters.codecs.push_back(kIsacCodec);
1651 parameters.codecs.push_back(kPcmuCodec);
1652 parameters.codecs[0].id = 98; // wideband CN
1653 parameters.codecs[1].id = 96;
1654 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org704bf9e2014-02-27 17:52:04 +00001655 webrtc::CodecInst gcodec;
1656 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1657 EXPECT_EQ(96, gcodec.pltype);
1658 EXPECT_STREQ("ISAC", gcodec.plname);
1659 EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001660}
1661
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001662// Test that we set VAD and DTMF types correctly as caller.
1663TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001664 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001665 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001666 cricket::AudioSendParameters parameters;
1667 parameters.codecs.push_back(kIsacCodec);
1668 parameters.codecs.push_back(kPcmuCodec);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001669 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001670 parameters.codecs.push_back(kCn16000Codec);
1671 parameters.codecs.push_back(kCn8000Codec);
1672 parameters.codecs.push_back(kTelephoneEventCodec);
1673 parameters.codecs.push_back(kRedCodec);
1674 parameters.codecs[0].id = 96;
1675 parameters.codecs[2].id = 97; // wideband CN
1676 parameters.codecs[4].id = 98; // DTMF
1677 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001678 webrtc::CodecInst gcodec;
1679 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1680 EXPECT_EQ(96, gcodec.pltype);
1681 EXPECT_STREQ("ISAC", gcodec.plname);
1682 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001683 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001684 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1685 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1686 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1687}
1688
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001689// Test that we set VAD and DTMF types correctly as callee.
1690TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001691 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001692 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001693 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001694
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001695 cricket::AudioSendParameters parameters;
1696 parameters.codecs.push_back(kIsacCodec);
1697 parameters.codecs.push_back(kPcmuCodec);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001698 // TODO(juberti): cn 32000
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001699 parameters.codecs.push_back(kCn16000Codec);
1700 parameters.codecs.push_back(kCn8000Codec);
1701 parameters.codecs.push_back(kTelephoneEventCodec);
1702 parameters.codecs.push_back(kRedCodec);
1703 parameters.codecs[0].id = 96;
1704 parameters.codecs[2].id = 97; // wideband CN
1705 parameters.codecs[4].id = 98; // DTMF
1706 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001707 EXPECT_TRUE(channel_->AddSendStream(
1708 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001709 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001710
1711 webrtc::CodecInst gcodec;
1712 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1713 EXPECT_EQ(96, gcodec.pltype);
1714 EXPECT_STREQ("ISAC", gcodec.plname);
1715 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001716 EXPECT_FALSE(voe_.GetRED(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001717 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1718 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1719 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1720}
1721
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001722// Test that we only apply VAD if we have a CN codec that matches the
1723// send codec clockrate.
1724TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
solenberg1ac56142015-10-13 03:58:19 -07001725 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001726 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001727 cricket::AudioSendParameters parameters;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001728 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001729 parameters.codecs.push_back(kIsacCodec);
1730 parameters.codecs.push_back(kCn16000Codec);
1731 parameters.codecs[1].id = 97;
1732 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001733 webrtc::CodecInst gcodec;
1734 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1735 EXPECT_STREQ("ISAC", gcodec.plname);
1736 EXPECT_TRUE(voe_.GetVAD(channel_num));
1737 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1738 // Set PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001739 parameters.codecs[0] = kPcmuCodec;
1740 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001741 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1742 EXPECT_STREQ("PCMU", gcodec.plname);
1743 EXPECT_FALSE(voe_.GetVAD(channel_num));
1744 // Set PCMU(8K) and CN(8K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001745 parameters.codecs[1] = kCn8000Codec;
1746 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001747 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1748 EXPECT_STREQ("PCMU", gcodec.plname);
1749 EXPECT_TRUE(voe_.GetVAD(channel_num));
1750 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
Brave Yao5225dd82015-03-26 07:39:19 +08001751 // Set ISAC(16K) and CN(8K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001752 parameters.codecs[0] = kIsacCodec;
1753 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001754 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1755 EXPECT_STREQ("ISAC", gcodec.plname);
1756 EXPECT_FALSE(voe_.GetVAD(channel_num));
1757}
1758
1759// Test that we perform case-insensitive matching of codec names.
1760TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
solenberg1ac56142015-10-13 03:58:19 -07001761 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001762 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001763 cricket::AudioSendParameters parameters;
1764 parameters.codecs.push_back(kIsacCodec);
1765 parameters.codecs.push_back(kPcmuCodec);
1766 parameters.codecs.push_back(kCn16000Codec);
1767 parameters.codecs.push_back(kCn8000Codec);
1768 parameters.codecs.push_back(kTelephoneEventCodec);
1769 parameters.codecs.push_back(kRedCodec);
1770 parameters.codecs[0].name = "iSaC";
1771 parameters.codecs[0].id = 96;
1772 parameters.codecs[2].id = 97; // wideband CN
1773 parameters.codecs[4].id = 98; // DTMF
1774 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001775 webrtc::CodecInst gcodec;
1776 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1777 EXPECT_EQ(96, gcodec.pltype);
1778 EXPECT_STREQ("ISAC", gcodec.plname);
1779 EXPECT_TRUE(voe_.GetVAD(channel_num));
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001780 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001781 EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
1782 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
1783 EXPECT_EQ(98, voe_.GetSendTelephoneEventPayloadType(channel_num));
1784}
1785
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001786// Test that we set up RED correctly as caller.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001787TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
solenberg1ac56142015-10-13 03:58:19 -07001788 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001789 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001790 cricket::AudioSendParameters parameters;
1791 parameters.codecs.push_back(kRedCodec);
1792 parameters.codecs.push_back(kIsacCodec);
1793 parameters.codecs.push_back(kPcmuCodec);
1794 parameters.codecs[0].id = 127;
1795 parameters.codecs[0].params[""] = "96/96";
1796 parameters.codecs[1].id = 96;
1797 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001798 webrtc::CodecInst gcodec;
1799 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1800 EXPECT_EQ(96, gcodec.pltype);
1801 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001802 EXPECT_TRUE(voe_.GetRED(channel_num));
1803 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001804}
1805
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001806// Test that we set up RED correctly as callee.
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001807TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001808 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02001809 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
Jelena Marusicc28a8962015-05-29 15:05:44 +02001810 EXPECT_TRUE(channel_ != nullptr);
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001811
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001812 cricket::AudioSendParameters parameters;
1813 parameters.codecs.push_back(kRedCodec);
1814 parameters.codecs.push_back(kIsacCodec);
1815 parameters.codecs.push_back(kPcmuCodec);
1816 parameters.codecs[0].id = 127;
1817 parameters.codecs[0].params[""] = "96/96";
1818 parameters.codecs[1].id = 96;
1819 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001820 EXPECT_TRUE(channel_->AddSendStream(
1821 cricket::StreamParams::CreateLegacy(kSsrc1)));
solenberg0a617e22015-10-20 15:49:38 -07001822 int channel_num = voe_.GetLastChannel();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001823 webrtc::CodecInst gcodec;
1824 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1825 EXPECT_EQ(96, gcodec.pltype);
1826 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001827 EXPECT_TRUE(voe_.GetRED(channel_num));
1828 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00001829}
1830
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001831// Test that we set up RED correctly if params are omitted.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001832TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
solenberg1ac56142015-10-13 03:58:19 -07001833 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001834 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001835 cricket::AudioSendParameters parameters;
1836 parameters.codecs.push_back(kRedCodec);
1837 parameters.codecs.push_back(kIsacCodec);
1838 parameters.codecs.push_back(kPcmuCodec);
1839 parameters.codecs[0].id = 127;
1840 parameters.codecs[1].id = 96;
1841 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001842 webrtc::CodecInst gcodec;
1843 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1844 EXPECT_EQ(96, gcodec.pltype);
1845 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001846 EXPECT_TRUE(voe_.GetRED(channel_num));
1847 EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001848}
1849
1850// Test that we ignore RED if the parameters aren't named the way we expect.
1851TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
solenberg1ac56142015-10-13 03:58:19 -07001852 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001853 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001854 cricket::AudioSendParameters parameters;
1855 parameters.codecs.push_back(kRedCodec);
1856 parameters.codecs.push_back(kIsacCodec);
1857 parameters.codecs.push_back(kPcmuCodec);
1858 parameters.codecs[0].id = 127;
1859 parameters.codecs[0].params["ABC"] = "96/96";
1860 parameters.codecs[1].id = 96;
1861 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001862 webrtc::CodecInst gcodec;
1863 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1864 EXPECT_EQ(96, gcodec.pltype);
1865 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001866 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001867}
1868
1869// Test that we ignore RED if it uses different primary/secondary encoding.
1870TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
solenberg1ac56142015-10-13 03:58:19 -07001871 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001872 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001873 cricket::AudioSendParameters parameters;
1874 parameters.codecs.push_back(kRedCodec);
1875 parameters.codecs.push_back(kIsacCodec);
1876 parameters.codecs.push_back(kPcmuCodec);
1877 parameters.codecs[0].id = 127;
1878 parameters.codecs[0].params[""] = "96/0";
1879 parameters.codecs[1].id = 96;
1880 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001881 webrtc::CodecInst gcodec;
1882 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1883 EXPECT_EQ(96, gcodec.pltype);
1884 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001885 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001886}
1887
1888// Test that we ignore RED if it uses more than 2 encodings.
1889TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
solenberg1ac56142015-10-13 03:58:19 -07001890 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001891 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001892 cricket::AudioSendParameters parameters;
1893 parameters.codecs.push_back(kRedCodec);
1894 parameters.codecs.push_back(kIsacCodec);
1895 parameters.codecs.push_back(kPcmuCodec);
1896 parameters.codecs[0].id = 127;
1897 parameters.codecs[0].params[""] = "96/96/96";
1898 parameters.codecs[1].id = 96;
1899 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001900 webrtc::CodecInst gcodec;
1901 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1902 EXPECT_EQ(96, gcodec.pltype);
1903 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001904 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001905}
1906
1907// Test that we ignore RED if it has bogus codec ids.
1908TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
solenberg1ac56142015-10-13 03:58:19 -07001909 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001910 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001911 cricket::AudioSendParameters parameters;
1912 parameters.codecs.push_back(kRedCodec);
1913 parameters.codecs.push_back(kIsacCodec);
1914 parameters.codecs.push_back(kPcmuCodec);
1915 parameters.codecs[0].id = 127;
1916 parameters.codecs[0].params[""] = "ABC/ABC";
1917 parameters.codecs[1].id = 96;
1918 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001919 webrtc::CodecInst gcodec;
1920 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1921 EXPECT_EQ(96, gcodec.pltype);
1922 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001923 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001924}
1925
1926// Test that we ignore RED if it refers to a codec that is not present.
1927TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
solenberg1ac56142015-10-13 03:58:19 -07001928 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001929 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001930 cricket::AudioSendParameters parameters;
1931 parameters.codecs.push_back(kRedCodec);
1932 parameters.codecs.push_back(kIsacCodec);
1933 parameters.codecs.push_back(kPcmuCodec);
1934 parameters.codecs[0].id = 127;
1935 parameters.codecs[0].params[""] = "97/97";
1936 parameters.codecs[1].id = 96;
1937 EXPECT_TRUE(channel_->SetSendParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001938 webrtc::CodecInst gcodec;
1939 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
1940 EXPECT_EQ(96, gcodec.pltype);
1941 EXPECT_STREQ("ISAC", gcodec.plname);
buildbot@webrtc.orgae740dd2014-06-17 10:56:41 +00001942 EXPECT_FALSE(voe_.GetRED(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001943}
1944
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001945// Test support for audio level header extension.
1946TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
1947 TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001948}
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001949TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
1950 TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
1951}
henrike@webrtc.org79047f92014-03-06 23:46:59 +00001952
buildbot@webrtc.org150835e2014-05-06 15:54:38 +00001953// Test support for absolute send time header extension.
1954TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
1955 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
1956}
1957TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
1958 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001959}
1960
solenberg1ac56142015-10-13 03:58:19 -07001961// Test that we can create a channel and start sending on it.
1962TEST_F(WebRtcVoiceEngineTestFake, Send) {
1963 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001964 int channel_num = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02001965 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001966 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1967 EXPECT_TRUE(voe_.GetSend(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001968 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
1969 EXPECT_FALSE(voe_.GetSend(channel_num));
solenberg1ac56142015-10-13 03:58:19 -07001970}
1971
1972// Test that we can create a channel and start playing out on it.
1973TEST_F(WebRtcVoiceEngineTestFake, Playout) {
1974 EXPECT_TRUE(SetupEngineWithRecvStream());
1975 int channel_num = voe_.GetLastChannel();
1976 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
1977 EXPECT_TRUE(channel_->SetPlayout(true));
1978 EXPECT_TRUE(voe_.GetPlayout(channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001979 EXPECT_TRUE(channel_->SetPlayout(false));
1980 EXPECT_FALSE(voe_.GetPlayout(channel_num));
1981}
1982
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001983// Test that we can add and remove send streams.
1984TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
1985 SetupForMultiSendStream();
1986
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001987 // Set the global state for sending.
1988 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
1989
solenbergc96df772015-10-21 13:01:53 -07001990 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001991 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07001992 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001993 // Verify that we are in a sending state for all the created streams.
solenberg3a941542015-11-16 07:34:50 -08001994 EXPECT_TRUE(voe_.GetSend(GetSendStreamConfig(ssrc).voe_channel_id));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001995 }
tfarina5237aaf2015-11-10 23:44:30 -08001996 EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00001997
solenbergc96df772015-10-21 13:01:53 -07001998 // Delete the send streams.
1999 for (uint32_t ssrc : kSsrcs4) {
2000 EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
solenberg3a941542015-11-16 07:34:50 -08002001 EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
solenbergc96df772015-10-21 13:01:53 -07002002 EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002003 }
solenbergc96df772015-10-21 13:01:53 -07002004 EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002005}
2006
2007// Test SetSendCodecs correctly configure the codecs in all send streams.
2008TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
2009 SetupForMultiSendStream();
2010
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002011 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002012 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002013 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002014 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002015 }
2016
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002017 cricket::AudioSendParameters parameters;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002018 // Set ISAC(16K) and CN(16K). VAD should be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002019 parameters.codecs.push_back(kIsacCodec);
2020 parameters.codecs.push_back(kCn16000Codec);
2021 parameters.codecs[1].id = 97;
2022 EXPECT_TRUE(channel_->SetSendParameters(parameters));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002023
2024 // Verify ISAC and VAD are corrected configured on all send channels.
2025 webrtc::CodecInst gcodec;
solenbergc96df772015-10-21 13:01:53 -07002026 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002027 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002028 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2029 EXPECT_STREQ("ISAC", gcodec.plname);
2030 EXPECT_TRUE(voe_.GetVAD(channel_num));
2031 EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
2032 }
2033
2034 // Change to PCMU(8K) and CN(16K). VAD should not be activated.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002035 parameters.codecs[0] = kPcmuCodec;
2036 EXPECT_TRUE(channel_->SetSendParameters(parameters));
solenbergc96df772015-10-21 13:01:53 -07002037 for (uint32_t ssrc : kSsrcs4) {
solenberg3a941542015-11-16 07:34:50 -08002038 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002039 EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
2040 EXPECT_STREQ("PCMU", gcodec.plname);
2041 EXPECT_FALSE(voe_.GetVAD(channel_num));
2042 }
2043}
2044
2045// Test we can SetSend on all send streams correctly.
2046TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
2047 SetupForMultiSendStream();
2048
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002049 // Create the send channels and they should be a SEND_NOTHING date.
solenbergc96df772015-10-21 13:01:53 -07002050 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002051 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002052 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002053 int channel_num = voe_.GetLastChannel();
2054 EXPECT_FALSE(voe_.GetSend(channel_num));
2055 }
2056
2057 // Set the global state for starting sending.
2058 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
solenbergc96df772015-10-21 13:01:53 -07002059 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002060 // Verify that we are in a sending state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002061 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002062 EXPECT_TRUE(voe_.GetSend(channel_num));
2063 }
2064
2065 // Set the global state for stopping sending.
2066 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
solenbergc96df772015-10-21 13:01:53 -07002067 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002068 // Verify that we are in a stop state for all the send streams.
solenberg3a941542015-11-16 07:34:50 -08002069 int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002070 EXPECT_FALSE(voe_.GetSend(channel_num));
2071 }
2072}
2073
2074// Test we can set the correct statistics on all send streams.
2075TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
2076 SetupForMultiSendStream();
2077
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002078 // Create send streams.
solenbergc96df772015-10-21 13:01:53 -07002079 for (uint32_t ssrc : kSsrcs4) {
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002080 EXPECT_TRUE(channel_->AddSendStream(
solenbergc96df772015-10-21 13:01:53 -07002081 cricket::StreamParams::CreateLegacy(ssrc)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002082 }
solenberg85a04962015-10-27 03:35:21 -07002083 SetAudioSendStreamStats();
2084
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002085 // Create a receive stream to check that none of the send streams end up in
2086 // the receive stream stats.
2087 EXPECT_TRUE(channel_->AddRecvStream(
2088 cricket::StreamParams::CreateLegacy(kSsrc2)));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002089 // We need send codec to be set to get all stats.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002090 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2091 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002092
solenberg85a04962015-10-27 03:35:21 -07002093 // Check stats for the added streams.
2094 {
2095 cricket::VoiceMediaInfo info;
2096 EXPECT_EQ(true, channel_->GetStats(&info));
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002097
solenberg85a04962015-10-27 03:35:21 -07002098 // We have added 4 send streams. We should see empty stats for all.
tfarina5237aaf2015-11-10 23:44:30 -08002099 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002100 for (const auto& sender : info.senders) {
solenberg566ef242015-11-06 15:34:49 -08002101 VerifyVoiceSenderInfo(sender, false);
solenberg85a04962015-10-27 03:35:21 -07002102 }
2103
2104 // We have added one receive stream. We should see empty stats.
2105 EXPECT_EQ(info.receivers.size(), 1u);
2106 EXPECT_EQ(info.receivers[0].ssrc(), 0);
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002107 }
solenberg1ac56142015-10-13 03:58:19 -07002108
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002109 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002110 {
2111 cricket::VoiceMediaInfo info;
2112 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2113 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002114 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002115 EXPECT_EQ(0u, info.receivers.size());
2116 }
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002117
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002118 // Deliver a new packet - a default receive stream should be created and we
2119 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002120 {
2121 cricket::VoiceMediaInfo info;
2122 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2123 SetAudioReceiveStreamStats();
2124 EXPECT_EQ(true, channel_->GetStats(&info));
tfarina5237aaf2015-11-10 23:44:30 -08002125 EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
solenberg85a04962015-10-27 03:35:21 -07002126 EXPECT_EQ(1u, info.receivers.size());
2127 VerifyVoiceReceiverInfo(info.receivers[0]);
2128 }
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002129}
2130
wu@webrtc.org9dba5252013-08-05 20:36:57 +00002131// Test that we can add and remove receive streams, and do proper send/playout.
2132// We can receive on multiple streams while sending one stream.
2133TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002134 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002135 int channel_num1 = voe_.GetLastChannel();
2136
solenberg1ac56142015-10-13 03:58:19 -07002137 // Start playout without a receive stream.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002138 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002139 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002140 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002141
solenberg1ac56142015-10-13 03:58:19 -07002142 // Adding another stream should enable playout on the new stream only.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002143 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2144 int channel_num2 = voe_.GetLastChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002145 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2146 EXPECT_TRUE(voe_.GetSend(channel_num1));
2147 EXPECT_FALSE(voe_.GetSend(channel_num2));
2148
solenberg1ac56142015-10-13 03:58:19 -07002149 // Make sure only the new stream is played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002150 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2151 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2152
2153 // Adding yet another stream should have stream 2 and 3 enabled for playout.
2154 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2155 int channel_num3 = voe_.GetLastChannel();
2156 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2157 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2158 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2159 EXPECT_FALSE(voe_.GetSend(channel_num3));
2160
2161 // Stop sending.
2162 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2163 EXPECT_FALSE(voe_.GetSend(channel_num1));
2164 EXPECT_FALSE(voe_.GetSend(channel_num2));
2165 EXPECT_FALSE(voe_.GetSend(channel_num3));
2166
2167 // Stop playout.
2168 EXPECT_TRUE(channel_->SetPlayout(false));
2169 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2170 EXPECT_FALSE(voe_.GetPlayout(channel_num2));
2171 EXPECT_FALSE(voe_.GetPlayout(channel_num3));
2172
solenberg1ac56142015-10-13 03:58:19 -07002173 // Restart playout and make sure only recv streams are played out.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002174 EXPECT_TRUE(channel_->SetPlayout(true));
2175 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
2176 EXPECT_TRUE(voe_.GetPlayout(channel_num2));
2177 EXPECT_TRUE(voe_.GetPlayout(channel_num3));
2178
solenberg1ac56142015-10-13 03:58:19 -07002179 // Now remove the recv streams and verify that the send stream doesn't play.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002180 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2181 EXPECT_TRUE(channel_->RemoveRecvStream(2));
solenberg1ac56142015-10-13 03:58:19 -07002182 EXPECT_FALSE(voe_.GetPlayout(channel_num1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002183}
2184
2185// Test that we can set the devices to use.
2186TEST_F(WebRtcVoiceEngineTestFake, SetDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002187 EXPECT_TRUE(SetupEngineWithSendStream());
2188 int send_channel = voe_.GetLastChannel();
2189 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2190 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002191 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002192
2193 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2194 cricket::kFakeDefaultDeviceId);
2195 cricket::Device dev(cricket::kFakeDeviceName,
2196 cricket::kFakeDeviceId);
2197
2198 // Test SetDevices() while not sending or playing.
2199 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2200
2201 // Test SetDevices() while sending and playing.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002202 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2203 EXPECT_TRUE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002204 EXPECT_TRUE(voe_.GetSend(send_channel));
2205 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002206
2207 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2208
solenberg1ac56142015-10-13 03:58:19 -07002209 EXPECT_TRUE(voe_.GetSend(send_channel));
2210 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002211
2212 // Test that failure to open newly selected devices does not prevent opening
2213 // ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002214 voe_.set_playout_fail_channel(recv_channel);
2215 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002216
2217 EXPECT_FALSE(engine_.SetDevices(&default_dev, &default_dev));
2218
solenberg1ac56142015-10-13 03:58:19 -07002219 EXPECT_FALSE(voe_.GetSend(send_channel));
2220 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002221
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002222 voe_.set_playout_fail_channel(-1);
2223 voe_.set_send_fail_channel(-1);
2224
2225 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2226
solenberg1ac56142015-10-13 03:58:19 -07002227 EXPECT_TRUE(voe_.GetSend(send_channel));
2228 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002229}
2230
2231// Test that we can set the devices to use even if we failed to
2232// open the initial ones.
2233TEST_F(WebRtcVoiceEngineTestFake, SetDevicesWithInitiallyBadDevices) {
solenberg1ac56142015-10-13 03:58:19 -07002234 EXPECT_TRUE(SetupEngineWithSendStream());
2235 int send_channel = voe_.GetLastChannel();
2236 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2237 int recv_channel = voe_.GetLastChannel();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002238 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002239
2240 cricket::Device default_dev(cricket::kFakeDefaultDeviceName,
2241 cricket::kFakeDefaultDeviceId);
2242 cricket::Device dev(cricket::kFakeDeviceName,
2243 cricket::kFakeDeviceId);
2244
2245 // Test that failure to open devices selected before starting
2246 // send/play does not prevent opening newly selected ones after that.
solenberg1ac56142015-10-13 03:58:19 -07002247 voe_.set_playout_fail_channel(recv_channel);
2248 voe_.set_send_fail_channel(send_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002249
2250 EXPECT_TRUE(engine_.SetDevices(&default_dev, &default_dev));
2251
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002252 EXPECT_FALSE(channel_->SetSend(cricket::SEND_MICROPHONE));
2253 EXPECT_FALSE(channel_->SetPlayout(true));
solenberg1ac56142015-10-13 03:58:19 -07002254 EXPECT_FALSE(voe_.GetSend(send_channel));
2255 EXPECT_FALSE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002256
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002257 voe_.set_playout_fail_channel(-1);
2258 voe_.set_send_fail_channel(-1);
2259
2260 EXPECT_TRUE(engine_.SetDevices(&dev, &dev));
2261
solenberg1ac56142015-10-13 03:58:19 -07002262 EXPECT_TRUE(voe_.GetSend(send_channel));
2263 EXPECT_TRUE(voe_.GetPlayout(recv_channel));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002264}
2265
2266// Test that we can create a channel configured for Codian bridges,
solenberg1ac56142015-10-13 03:58:19 -07002267// and start sending on it.
2268TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
2269 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002270 int channel_num = voe_.GetLastChannel();
2271 webrtc::AgcConfig agc_config;
2272 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2273 EXPECT_EQ(0, agc_config.targetLeveldBOv);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002274 send_parameters_.options = options_adjust_agc_;
2275 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002276 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2277 EXPECT_TRUE(voe_.GetSend(channel_num));
2278 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2279 EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002280 EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
2281 EXPECT_FALSE(voe_.GetSend(channel_num));
2282 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2283 EXPECT_EQ(0, agc_config.targetLeveldBOv); // level was restored
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002284}
2285
wu@webrtc.org97077a32013-10-25 21:18:33 +00002286TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002287 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002288 webrtc::AgcConfig agc_config;
2289 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2290 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2291
2292 cricket::AudioOptions options;
Karl Wibergbe579832015-11-10 22:34:18 +01002293 options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
2294 options.tx_agc_digital_compression_gain = rtc::Optional<uint16_t>(9);
2295 options.tx_agc_limiter = rtc::Optional<bool>(true);
2296 options.auto_gain_control = rtc::Optional<bool>(true);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002297 EXPECT_TRUE(engine_.SetOptions(options));
2298
2299 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2300 EXPECT_EQ(3, agc_config.targetLeveldBOv);
2301 EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
2302 EXPECT_TRUE(agc_config.limiterEnable);
2303
2304 // Check interaction with adjust_agc_delta. Both should be respected, for
2305 // backwards compatibility.
Karl Wibergbe579832015-11-10 22:34:18 +01002306 options.adjust_agc_delta = rtc::Optional<int>(-10);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002307 EXPECT_TRUE(engine_.SetOptions(options));
2308
2309 EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
2310 EXPECT_EQ(13, agc_config.targetLeveldBOv);
2311}
2312
wu@webrtc.org97077a32013-10-25 21:18:33 +00002313TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002314 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002315 cricket::AudioOptions options;
Karl Wibergbe579832015-11-10 22:34:18 +01002316 options.recording_sample_rate = rtc::Optional<uint32_t>(48000);
2317 options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
wu@webrtc.org97077a32013-10-25 21:18:33 +00002318 EXPECT_TRUE(engine_.SetOptions(options));
2319
2320 unsigned int recording_sample_rate, playout_sample_rate;
2321 EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
2322 EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
2323 EXPECT_EQ(48000u, recording_sample_rate);
2324 EXPECT_EQ(44100u, playout_sample_rate);
2325}
2326
2327TEST_F(WebRtcVoiceEngineTestFake, TraceFilterViaTraceOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002328 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002329 engine_.SetLogging(rtc::LS_INFO, "");
wu@webrtc.org97077a32013-10-25 21:18:33 +00002330 EXPECT_EQ(
2331 // Info:
2332 webrtc::kTraceStateInfo | webrtc::kTraceInfo |
2333 // Warning:
2334 webrtc::kTraceTerseInfo | webrtc::kTraceWarning |
2335 // Error:
2336 webrtc::kTraceError | webrtc::kTraceCritical,
2337 static_cast<int>(trace_wrapper_->filter_));
2338 // Now set it explicitly
2339 std::string filter =
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002340 "tracefilter " + rtc::ToString(webrtc::kTraceDefault);
2341 engine_.SetLogging(rtc::LS_VERBOSE, filter.c_str());
wu@webrtc.org97077a32013-10-25 21:18:33 +00002342 EXPECT_EQ(static_cast<unsigned int>(webrtc::kTraceDefault),
2343 trace_wrapper_->filter_);
2344}
2345
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002346// Test that we can set the outgoing SSRC properly.
2347// SSRC is set in SetupEngine by calling AddSendStream.
2348TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002349 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002350 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002351}
2352
2353TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
2354 // Setup. We need send codec to be set to get all stats.
solenberg1ac56142015-10-13 03:58:19 -07002355 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg85a04962015-10-27 03:35:21 -07002356 SetAudioSendStreamStats();
solenberg1ac56142015-10-13 03:58:19 -07002357 // SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
2358 // stream has to use a different SSRC.
buildbot@webrtc.org7e71b772014-06-13 01:14:01 +00002359 EXPECT_TRUE(channel_->AddRecvStream(
2360 cricket::StreamParams::CreateLegacy(kSsrc2)));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002361 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
2362 EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002363
solenberg85a04962015-10-27 03:35:21 -07002364 // Check stats for the added streams.
2365 {
2366 cricket::VoiceMediaInfo info;
2367 EXPECT_EQ(true, channel_->GetStats(&info));
2368
2369 // We have added one send stream. We should see the stats we've set.
2370 EXPECT_EQ(1u, info.senders.size());
solenberg566ef242015-11-06 15:34:49 -08002371 VerifyVoiceSenderInfo(info.senders[0], false);
solenberg85a04962015-10-27 03:35:21 -07002372 // We have added one receive stream. We should see empty stats.
2373 EXPECT_EQ(info.receivers.size(), 1u);
2374 EXPECT_EQ(info.receivers[0].ssrc(), 0);
2375 }
solenberg1ac56142015-10-13 03:58:19 -07002376
solenberg566ef242015-11-06 15:34:49 -08002377 // Start sending - this affects some reported stats.
2378 {
2379 cricket::VoiceMediaInfo info;
2380 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2381 EXPECT_EQ(true, channel_->GetStats(&info));
2382 VerifyVoiceSenderInfo(info.senders[0], true);
2383 }
2384
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002385 // Remove the kSsrc2 stream. No receiver stats.
solenberg85a04962015-10-27 03:35:21 -07002386 {
2387 cricket::VoiceMediaInfo info;
2388 EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
2389 EXPECT_EQ(true, channel_->GetStats(&info));
2390 EXPECT_EQ(1u, info.senders.size());
2391 EXPECT_EQ(0u, info.receivers.size());
2392 }
solenberg1ac56142015-10-13 03:58:19 -07002393
Fredrik Solenberg4f4ec0a2015-10-22 10:49:27 +02002394 // Deliver a new packet - a default receive stream should be created and we
2395 // should see stats again.
solenberg85a04962015-10-27 03:35:21 -07002396 {
2397 cricket::VoiceMediaInfo info;
2398 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2399 SetAudioReceiveStreamStats();
2400 EXPECT_EQ(true, channel_->GetStats(&info));
2401 EXPECT_EQ(1u, info.senders.size());
2402 EXPECT_EQ(1u, info.receivers.size());
2403 VerifyVoiceReceiverInfo(info.receivers[0]);
2404 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002405}
2406
2407// Test that we can set the outgoing SSRC properly with multiple streams.
2408// SSRC is set in SetupEngine by calling AddSendStream.
2409TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
solenberg1ac56142015-10-13 03:58:19 -07002410 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg3a941542015-11-16 07:34:50 -08002411 EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
solenberg7add0582015-11-20 09:59:34 -08002412 EXPECT_TRUE(channel_->AddRecvStream(
2413 cricket::StreamParams::CreateLegacy(kSsrc2)));
2414 EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002415}
2416
2417// Test that the local SSRC is the same on sending and receiving channels if the
2418// receive channel is created before the send channel.
2419TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002420 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002421 channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002422
2423 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2424 int receive_channel_num = voe_.GetLastChannel();
2425 EXPECT_TRUE(channel_->AddSendStream(
2426 cricket::StreamParams::CreateLegacy(1234)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002427
solenberg3a941542015-11-16 07:34:50 -08002428 EXPECT_TRUE(call_.GetAudioSendStream(1234));
solenberg85a04962015-10-27 03:35:21 -07002429 EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002430}
2431
2432// Test that we can properly receive packets.
2433TEST_F(WebRtcVoiceEngineTestFake, Recv) {
2434 EXPECT_TRUE(SetupEngine());
solenberg7e63ef02015-11-20 00:19:43 -08002435 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002436 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
solenberg1ac56142015-10-13 03:58:19 -07002437 int channel_num = voe_.GetLastChannel();
solenberg7e63ef02015-11-20 00:19:43 -08002438 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002439}
2440
2441// Test that we can properly receive packets on multiple streams.
2442TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
solenberg7e63ef02015-11-20 00:19:43 -08002443 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002444 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2445 int channel_num1 = voe_.GetLastChannel();
2446 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2447 int channel_num2 = voe_.GetLastChannel();
2448 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2449 int channel_num3 = voe_.GetLastChannel();
2450 // Create packets with the right SSRCs.
2451 char packets[4][sizeof(kPcmuFrame)];
tfarina5237aaf2015-11-10 23:44:30 -08002452 for (size_t i = 0; i < arraysize(packets); ++i) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002453 memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
Peter Boström0c4e06b2015-10-07 12:23:21 +02002454 rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002455 }
2456 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2457 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2458 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002459
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002460 DeliverPacket(packets[0], sizeof(packets[0]));
2461 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2462 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2463 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002464
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002465 DeliverPacket(packets[1], sizeof(packets[1]));
solenberg7e63ef02015-11-20 00:19:43 -08002466 EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002467 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
2468 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002469
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002470 DeliverPacket(packets[2], sizeof(packets[2]));
2471 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
solenberg7e63ef02015-11-20 00:19:43 -08002472 EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002473 EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
solenberg7e63ef02015-11-20 00:19:43 -08002474
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002475 DeliverPacket(packets[3], sizeof(packets[3]));
2476 EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
2477 EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
solenberg7e63ef02015-11-20 00:19:43 -08002478 EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
2479
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002480 EXPECT_TRUE(channel_->RemoveRecvStream(3));
2481 EXPECT_TRUE(channel_->RemoveRecvStream(2));
2482 EXPECT_TRUE(channel_->RemoveRecvStream(1));
2483}
2484
solenberg7e63ef02015-11-20 00:19:43 -08002485// Test that receiving on an unsignalled stream works (default channel will be
2486// created).
2487TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
2488 EXPECT_TRUE(SetupEngine());
2489 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
2490 int channel_num = voe_.GetLastChannel();
2491 EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
2492}
2493
2494// Test that receiving on an unsignalled stream works (default channel will be
2495// created), and that packets will be forwarded to the default channel
2496// regardless of their SSRCs.
2497TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
2498 EXPECT_TRUE(SetupEngine());
2499 char packet[sizeof(kPcmuFrame)];
2500 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2501
2502 // Note that the first unknown SSRC cannot be 0, because we only support
2503 // creating receive streams for SSRC!=0.
2504 DeliverPacket(packet, sizeof(packet));
2505 int channel_num = voe_.GetLastChannel();
2506 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2507 // Once we have the default channel, SSRC==0 will be ok.
2508 for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
2509 rtc::SetBE32(&packet[8], ssrc);
2510 DeliverPacket(packet, sizeof(packet));
2511 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2512 }
2513}
2514
2515// Test that a default channel is created even after a signalled stream has been
2516// added, and that this stream will get any packets for unknown SSRCs.
2517TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
2518 EXPECT_TRUE(SetupEngine());
2519 char packet[sizeof(kPcmuFrame)];
2520 memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
2521
2522 // Add a known stream, send packet and verify we got it.
2523 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2524 int signalled_channel_num = voe_.GetLastChannel();
2525 DeliverPacket(packet, sizeof(packet));
2526 EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
2527
2528 // Note that the first unknown SSRC cannot be 0, because we only support
2529 // creating receive streams for SSRC!=0.
2530 rtc::SetBE32(&packet[8], 7011);
2531 DeliverPacket(packet, sizeof(packet));
2532 int channel_num = voe_.GetLastChannel();
2533 EXPECT_NE(channel_num, signalled_channel_num);
2534 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2535 // Once we have the default channel, SSRC==0 will be ok.
2536 for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
2537 rtc::SetBE32(&packet[8], ssrc);
2538 DeliverPacket(packet, sizeof(packet));
2539 EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
2540 }
2541}
2542
solenberg0a617e22015-10-20 15:49:38 -07002543// Test that we properly handle failures to add a receive stream.
2544TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
2545 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002546 voe_.set_fail_create_channel(true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002547 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002548}
2549
solenberg0a617e22015-10-20 15:49:38 -07002550// Test that we properly handle failures to add a send stream.
2551TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
2552 EXPECT_TRUE(SetupEngine());
2553 voe_.set_fail_create_channel(true);
2554 EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
2555}
2556
solenberg1ac56142015-10-13 03:58:19 -07002557// Test that AddRecvStream creates new stream.
2558TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
2559 EXPECT_TRUE(SetupEngineWithRecvStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002560 int channel_num = voe_.GetLastChannel();
2561 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002562 EXPECT_NE(channel_num, voe_.GetLastChannel());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002563}
2564
2565// Test that after adding a recv stream, we do not decode more codecs than
2566// those previously passed into SetRecvCodecs.
2567TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
solenberg1ac56142015-10-13 03:58:19 -07002568 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002569 cricket::AudioRecvParameters parameters;
2570 parameters.codecs.push_back(kIsacCodec);
2571 parameters.codecs.push_back(kPcmuCodec);
2572 EXPECT_TRUE(channel_->SetRecvParameters(parameters));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002573 EXPECT_TRUE(channel_->AddRecvStream(
2574 cricket::StreamParams::CreateLegacy(kSsrc1)));
2575 int channel_num2 = voe_.GetLastChannel();
2576 webrtc::CodecInst gcodec;
tfarina5237aaf2015-11-10 23:44:30 -08002577 rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
minyue@webrtc.orgf9b5c1b2015-02-17 12:36:41 +00002578 gcodec.plfreq = 48000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002579 gcodec.channels = 2;
2580 EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
2581}
2582
2583// Test that we properly clean up any streams that were added, even if
2584// not explicitly removed.
2585TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
solenberg1ac56142015-10-13 03:58:19 -07002586 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002587 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002588 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
2589 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2590 EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
2591 delete channel_;
2592 channel_ = NULL;
2593 EXPECT_EQ(0, voe_.GetNumChannels());
2594}
2595
wu@webrtc.org78187522013-10-07 23:32:02 +00002596TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
solenberg1ac56142015-10-13 03:58:19 -07002597 EXPECT_TRUE(SetupEngineWithSendStream());
wu@webrtc.org78187522013-10-07 23:32:02 +00002598 EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
2599}
2600
2601TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
2602 EXPECT_TRUE(SetupEngine());
wu@webrtc.org78187522013-10-07 23:32:02 +00002603 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
solenberg1ac56142015-10-13 03:58:19 -07002604 // Manually delete channel to simulate a failure.
2605 int channel = voe_.GetLastChannel();
2606 EXPECT_EQ(0, voe_.DeleteChannel(channel));
2607 // Add recv stream 2 should work.
2608 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
wu@webrtc.org78187522013-10-07 23:32:02 +00002609 int new_channel = voe_.GetLastChannel();
solenberg1ac56142015-10-13 03:58:19 -07002610 EXPECT_NE(channel, new_channel);
2611 // The last created channel is deleted too.
2612 EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
wu@webrtc.org78187522013-10-07 23:32:02 +00002613}
2614
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002615// Test the InsertDtmf on default send stream as caller.
2616TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
2617 TestInsertDtmf(0, true);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002618}
2619
wu@webrtc.orgcadf9042013-08-30 21:24:16 +00002620// Test the InsertDtmf on default send stream as callee
2621TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
2622 TestInsertDtmf(0, false);
2623}
2624
2625// Test the InsertDtmf on specified send stream as caller.
2626TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
2627 TestInsertDtmf(kSsrc1, true);
2628}
2629
2630// Test the InsertDtmf on specified send stream as callee.
2631TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
2632 TestInsertDtmf(kSsrc1, false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002633}
2634
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002635TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
solenberg1ac56142015-10-13 03:58:19 -07002636 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002637 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002638 EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
2639 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
2640 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
2641 EXPECT_TRUE(channel_->SetPlayout(true));
2642 voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
2643 EXPECT_TRUE(channel_->SetPlayout(false));
2644 EXPECT_FALSE(channel_->SetPlayout(true));
2645}
2646
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002647TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002648 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002649
2650 bool ec_enabled;
2651 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002652 webrtc::AecmModes aecm_mode;
2653 bool cng_enabled;
2654 bool agc_enabled;
2655 webrtc::AgcModes agc_mode;
2656 webrtc::AgcConfig agc_config;
2657 bool ns_enabled;
2658 webrtc::NsModes ns_mode;
2659 bool highpass_filter_enabled;
2660 bool stereo_swapping_enabled;
2661 bool typing_detection_enabled;
2662 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002663 voe_.GetAecmMode(aecm_mode, cng_enabled);
2664 voe_.GetAgcStatus(agc_enabled, agc_mode);
2665 voe_.GetAgcConfig(agc_config);
2666 voe_.GetNsStatus(ns_enabled, ns_mode);
2667 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2668 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2669 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2670 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002671 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002672 EXPECT_FALSE(cng_enabled);
2673 EXPECT_TRUE(agc_enabled);
2674 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2675 EXPECT_TRUE(ns_enabled);
2676 EXPECT_TRUE(highpass_filter_enabled);
2677 EXPECT_FALSE(stereo_swapping_enabled);
2678 EXPECT_TRUE(typing_detection_enabled);
2679 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2680 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2681
2682 // Nothing set, so all ignored.
2683 cricket::AudioOptions options;
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002684 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002685 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002686 voe_.GetAecmMode(aecm_mode, cng_enabled);
2687 voe_.GetAgcStatus(agc_enabled, agc_mode);
2688 voe_.GetAgcConfig(agc_config);
2689 voe_.GetNsStatus(ns_enabled, ns_mode);
2690 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2691 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2692 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2693 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002694 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002695 EXPECT_FALSE(cng_enabled);
2696 EXPECT_TRUE(agc_enabled);
2697 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2698 EXPECT_TRUE(ns_enabled);
2699 EXPECT_TRUE(highpass_filter_enabled);
2700 EXPECT_FALSE(stereo_swapping_enabled);
2701 EXPECT_TRUE(typing_detection_enabled);
2702 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2703 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
Henrik Lundin64dad832015-05-11 12:44:23 +02002704 EXPECT_EQ(50, voe_.GetNetEqCapacity()); // From GetDefaultEngineOptions().
Henrik Lundin5263b3c2015-06-01 10:29:41 +02002705 EXPECT_FALSE(
2706 voe_.GetNetEqFastAccelerate()); // From GetDefaultEngineOptions().
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002707
2708 // Turn echo cancellation off
Karl Wibergbe579832015-11-10 22:34:18 +01002709 options.echo_cancellation = rtc::Optional<bool>(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002710 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002711 voe_.GetEcStatus(ec_enabled, ec_mode);
2712 EXPECT_FALSE(ec_enabled);
2713
2714 // Turn echo cancellation back on, with settings, and make sure
2715 // nothing else changed.
Karl Wibergbe579832015-11-10 22:34:18 +01002716 options.echo_cancellation = rtc::Optional<bool>(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002717 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002718 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002719 voe_.GetAecmMode(aecm_mode, cng_enabled);
2720 voe_.GetAgcStatus(agc_enabled, agc_mode);
2721 voe_.GetAgcConfig(agc_config);
2722 voe_.GetNsStatus(ns_enabled, ns_mode);
2723 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2724 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2725 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2726 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002727 EXPECT_TRUE(voe_.ec_metrics_enabled());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002728 EXPECT_TRUE(agc_enabled);
2729 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2730 EXPECT_TRUE(ns_enabled);
2731 EXPECT_TRUE(highpass_filter_enabled);
2732 EXPECT_FALSE(stereo_swapping_enabled);
2733 EXPECT_TRUE(typing_detection_enabled);
2734 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2735 EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
2736
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002737 // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
2738 // control.
Karl Wibergbe579832015-11-10 22:34:18 +01002739 options.delay_agnostic_aec = rtc::Optional<bool>(true);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002740 ASSERT_TRUE(engine_.SetOptions(options));
2741 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002742 voe_.GetAecmMode(aecm_mode, cng_enabled);
2743 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002744 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002745 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2746
2747 // Turn off echo cancellation and delay agnostic aec.
Karl Wibergbe579832015-11-10 22:34:18 +01002748 options.delay_agnostic_aec = rtc::Optional<bool>(false);
2749 options.extended_filter_aec = rtc::Optional<bool>(false);
2750 options.echo_cancellation = rtc::Optional<bool>(false);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002751 ASSERT_TRUE(engine_.SetOptions(options));
2752 voe_.GetEcStatus(ec_enabled, ec_mode);
2753 EXPECT_FALSE(ec_enabled);
2754 // Turning delay agnostic aec back on should also turn on echo cancellation.
Karl Wibergbe579832015-11-10 22:34:18 +01002755 options.delay_agnostic_aec = rtc::Optional<bool>(true);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002756 ASSERT_TRUE(engine_.SetOptions(options));
2757 voe_.GetEcStatus(ec_enabled, ec_mode);
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002758 EXPECT_TRUE(ec_enabled);
solenberg85a04962015-10-27 03:35:21 -07002759 EXPECT_TRUE(voe_.ec_metrics_enabled());
Bjorn Volckerbf395c12015-03-25 22:45:56 +01002760 EXPECT_EQ(ec_mode, webrtc::kEcConference);
2761
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002762 // Turn off AGC
Karl Wibergbe579832015-11-10 22:34:18 +01002763 options.auto_gain_control = rtc::Optional<bool>(false);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002764 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002765 voe_.GetAgcStatus(agc_enabled, agc_mode);
2766 EXPECT_FALSE(agc_enabled);
2767
2768 // Turn AGC back on
Karl Wibergbe579832015-11-10 22:34:18 +01002769 options.auto_gain_control = rtc::Optional<bool>(true);
2770 options.adjust_agc_delta = rtc::Optional<int>();
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002771 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002772 voe_.GetAgcStatus(agc_enabled, agc_mode);
2773 EXPECT_TRUE(agc_enabled);
2774 voe_.GetAgcConfig(agc_config);
2775 EXPECT_EQ(0, agc_config.targetLeveldBOv);
2776
2777 // Turn off other options (and stereo swapping on).
Karl Wibergbe579832015-11-10 22:34:18 +01002778 options.noise_suppression = rtc::Optional<bool>(false);
2779 options.highpass_filter = rtc::Optional<bool>(false);
2780 options.typing_detection = rtc::Optional<bool>(false);
2781 options.stereo_swapping = rtc::Optional<bool>(true);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002782 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002783 voe_.GetNsStatus(ns_enabled, ns_mode);
2784 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2785 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2786 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2787 EXPECT_FALSE(ns_enabled);
2788 EXPECT_FALSE(highpass_filter_enabled);
2789 EXPECT_FALSE(typing_detection_enabled);
2790 EXPECT_TRUE(stereo_swapping_enabled);
2791
solenberg1ac56142015-10-13 03:58:19 -07002792 // Set options again to ensure it has no impact.
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002793 ASSERT_TRUE(engine_.SetOptions(options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002794 voe_.GetEcStatus(ec_enabled, ec_mode);
2795 voe_.GetNsStatus(ns_enabled, ns_mode);
2796 EXPECT_TRUE(ec_enabled);
2797 EXPECT_EQ(webrtc::kEcConference, ec_mode);
2798 EXPECT_FALSE(ns_enabled);
2799 EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
2800}
2801
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002802TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002803 EXPECT_TRUE(SetupEngineWithSendStream());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002804
2805 bool ec_enabled;
2806 webrtc::EcModes ec_mode;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002807 bool agc_enabled;
2808 webrtc::AgcModes agc_mode;
2809 bool ns_enabled;
2810 webrtc::NsModes ns_mode;
2811 bool highpass_filter_enabled;
2812 bool stereo_swapping_enabled;
2813 bool typing_detection_enabled;
2814
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002815 voe_.GetEcStatus(ec_enabled, ec_mode);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002816 voe_.GetAgcStatus(agc_enabled, agc_mode);
2817 voe_.GetNsStatus(ns_enabled, ns_mode);
2818 highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
2819 stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
2820 voe_.GetTypingDetectionStatus(typing_detection_enabled);
2821 EXPECT_TRUE(ec_enabled);
2822 EXPECT_TRUE(agc_enabled);
2823 EXPECT_TRUE(ns_enabled);
2824 EXPECT_TRUE(highpass_filter_enabled);
mallinath@webrtc.orga27be8e2013-09-27 23:04:10 +00002825 EXPECT_TRUE(typing_detection_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002826 EXPECT_FALSE(stereo_swapping_enabled);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002827}
2828
2829TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
2830 webrtc::AgcConfig set_config = {0};
2831 set_config.targetLeveldBOv = 3;
2832 set_config.digitalCompressionGaindB = 9;
2833 set_config.limiterEnable = true;
2834 EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002835 EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002836
2837 webrtc::AgcConfig config = {0};
2838 EXPECT_EQ(0, voe_.GetAgcConfig(config));
2839 EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
2840 EXPECT_EQ(set_config.digitalCompressionGaindB,
2841 config.digitalCompressionGaindB);
2842 EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
2843}
2844
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002845TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
solenberg1ac56142015-10-13 03:58:19 -07002846 EXPECT_TRUE(SetupEngineWithSendStream());
solenberg66f43392015-09-09 01:36:22 -07002847 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
2848 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002849 engine_.CreateChannel(&call_, cricket::AudioOptions())));
solenberg66f43392015-09-09 01:36:22 -07002850 rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
2851 static_cast<cricket::WebRtcVoiceMediaChannel*>(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002852 engine_.CreateChannel(&call_, cricket::AudioOptions())));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002853
2854 // Have to add a stream to make SetSend work.
2855 cricket::StreamParams stream1;
2856 stream1.ssrcs.push_back(1);
2857 channel1->AddSendStream(stream1);
2858 cricket::StreamParams stream2;
2859 stream2.ssrcs.push_back(2);
2860 channel2->AddSendStream(stream2);
2861
2862 // AEC and AGC and NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002863 cricket::AudioSendParameters parameters_options_all = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002864 parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
2865 parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
2866 parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002867 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
2868 EXPECT_EQ(parameters_options_all.options, channel1->options());
2869 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
2870 EXPECT_EQ(parameters_options_all.options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002871
2872 // unset NS
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002873 cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002874 parameters_options_no_ns.options.noise_suppression =
2875 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002876 ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
2877 cricket::AudioOptions expected_options = parameters_options_all.options;
Karl Wibergbe579832015-11-10 22:34:18 +01002878 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2879 expected_options.auto_gain_control = rtc::Optional<bool>(true);
2880 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002881 EXPECT_EQ(expected_options, channel1->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002882
2883 // unset AGC
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002884 cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002885 parameters_options_no_agc.options.auto_gain_control =
2886 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002887 ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
Karl Wibergbe579832015-11-10 22:34:18 +01002888 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2889 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2890 expected_options.noise_suppression = rtc::Optional<bool>(true);
solenberg66f43392015-09-09 01:36:22 -07002891 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002892
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002893 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002894 bool ec_enabled;
2895 webrtc::EcModes ec_mode;
2896 bool agc_enabled;
2897 webrtc::AgcModes agc_mode;
2898 bool ns_enabled;
2899 webrtc::NsModes ns_mode;
2900 voe_.GetEcStatus(ec_enabled, ec_mode);
2901 voe_.GetAgcStatus(agc_enabled, agc_mode);
2902 voe_.GetNsStatus(ns_enabled, ns_mode);
2903 EXPECT_TRUE(ec_enabled);
2904 EXPECT_TRUE(agc_enabled);
2905 EXPECT_TRUE(ns_enabled);
2906
2907 channel1->SetSend(cricket::SEND_MICROPHONE);
2908 voe_.GetEcStatus(ec_enabled, ec_mode);
2909 voe_.GetAgcStatus(agc_enabled, agc_mode);
2910 voe_.GetNsStatus(ns_enabled, ns_mode);
2911 EXPECT_TRUE(ec_enabled);
2912 EXPECT_TRUE(agc_enabled);
2913 EXPECT_FALSE(ns_enabled);
2914
2915 channel1->SetSend(cricket::SEND_NOTHING);
2916 voe_.GetEcStatus(ec_enabled, ec_mode);
2917 voe_.GetAgcStatus(agc_enabled, agc_mode);
2918 voe_.GetNsStatus(ns_enabled, ns_mode);
2919 EXPECT_TRUE(ec_enabled);
2920 EXPECT_TRUE(agc_enabled);
2921 EXPECT_TRUE(ns_enabled);
2922
2923 channel2->SetSend(cricket::SEND_MICROPHONE);
2924 voe_.GetEcStatus(ec_enabled, ec_mode);
2925 voe_.GetAgcStatus(agc_enabled, agc_mode);
2926 voe_.GetNsStatus(ns_enabled, ns_mode);
2927 EXPECT_TRUE(ec_enabled);
2928 EXPECT_FALSE(agc_enabled);
2929 EXPECT_TRUE(ns_enabled);
2930
2931 channel2->SetSend(cricket::SEND_NOTHING);
2932 voe_.GetEcStatus(ec_enabled, ec_mode);
2933 voe_.GetAgcStatus(agc_enabled, agc_mode);
2934 voe_.GetNsStatus(ns_enabled, ns_mode);
2935 EXPECT_TRUE(ec_enabled);
2936 EXPECT_TRUE(agc_enabled);
2937 EXPECT_TRUE(ns_enabled);
2938
2939 // Make sure settings take effect while we are sending.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002940 ASSERT_TRUE(engine_.SetOptions(parameters_options_all.options));
2941 cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
2942 send_parameters_;
kwiberg102c6a62015-10-30 02:47:38 -07002943 parameters_options_no_agc_nor_ns.options.auto_gain_control =
Karl Wibergbe579832015-11-10 22:34:18 +01002944 rtc::Optional<bool>(false);
kwiberg102c6a62015-10-30 02:47:38 -07002945 parameters_options_no_agc_nor_ns.options.noise_suppression =
Karl Wibergbe579832015-11-10 22:34:18 +01002946 rtc::Optional<bool>(false);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002947 channel2->SetSend(cricket::SEND_MICROPHONE);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002948 channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
Karl Wibergbe579832015-11-10 22:34:18 +01002949 expected_options.echo_cancellation = rtc::Optional<bool>(true);
2950 expected_options.auto_gain_control = rtc::Optional<bool>(false);
2951 expected_options.noise_suppression = rtc::Optional<bool>(false);
solenberg66f43392015-09-09 01:36:22 -07002952 EXPECT_EQ(expected_options, channel2->options());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002953 voe_.GetEcStatus(ec_enabled, ec_mode);
2954 voe_.GetAgcStatus(agc_enabled, agc_mode);
2955 voe_.GetNsStatus(ns_enabled, ns_mode);
2956 EXPECT_TRUE(ec_enabled);
2957 EXPECT_FALSE(agc_enabled);
2958 EXPECT_FALSE(ns_enabled);
2959}
2960
wu@webrtc.orgde305012013-10-31 15:40:38 +00002961// This test verifies DSCP settings are properly applied on voice media channel.
2962TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
solenberg1ac56142015-10-13 03:58:19 -07002963 EXPECT_TRUE(SetupEngineWithSendStream());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002964 rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
Fredrik Solenberg709ed672015-09-15 12:26:33 +02002965 engine_.CreateChannel(&call_, cricket::AudioOptions()));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002966 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
wu@webrtc.orgde305012013-10-31 15:40:38 +00002967 new cricket::FakeNetworkInterface);
2968 channel->SetInterface(network_interface.get());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002969 cricket::AudioSendParameters parameters = send_parameters_;
Karl Wibergbe579832015-11-10 22:34:18 +01002970 parameters.options.dscp = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002971 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002972 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
henrika@webrtc.orgaebb1ad2014-01-14 10:00:58 +00002973 // Verify previous value is not modified if dscp option is not set.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002974 EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002975 EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
Karl Wibergbe579832015-11-10 22:34:18 +01002976 parameters.options.dscp = rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02002977 EXPECT_TRUE(channel->SetSendParameters(parameters));
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00002978 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
wu@webrtc.orgde305012013-10-31 15:40:38 +00002979}
2980
solenberg1ac56142015-10-13 03:58:19 -07002981TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002982 EXPECT_TRUE(SetupEngine());
2983 cricket::WebRtcVoiceMediaChannel* media_channel =
2984 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
solenberg1ac56142015-10-13 03:58:19 -07002985 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
2986 EXPECT_TRUE(channel_->AddRecvStream(
2987 cricket::StreamParams::CreateLegacy(kSsrc1)));
2988 int channel_id = voe_.GetLastChannel();
2989 EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
2990 EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
2991 EXPECT_TRUE(channel_->AddRecvStream(
2992 cricket::StreamParams::CreateLegacy(kSsrc2)));
2993 int channel_id2 = voe_.GetLastChannel();
2994 EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002995}
2996
solenberg1ac56142015-10-13 03:58:19 -07002997TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002998 EXPECT_TRUE(SetupEngine());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00002999 cricket::WebRtcVoiceMediaChannel* media_channel =
solenberg1ac56142015-10-13 03:58:19 -07003000 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
3001 EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
3002 EXPECT_TRUE(channel_->AddSendStream(
3003 cricket::StreamParams::CreateLegacy(kSsrc1)));
3004 int channel_id = voe_.GetLastChannel();
3005 EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
3006 EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
3007 EXPECT_TRUE(channel_->AddSendStream(
3008 cricket::StreamParams::CreateLegacy(kSsrc2)));
3009 int channel_id2 = voe_.GetLastChannel();
3010 EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003011}
3012
solenberg4bac9c52015-10-09 02:32:53 -07003013TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003014 EXPECT_TRUE(SetupEngine());
solenberg4bac9c52015-10-09 02:32:53 -07003015 EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003016 cricket::StreamParams stream;
3017 stream.ssrcs.push_back(kSsrc2);
3018 EXPECT_TRUE(channel_->AddRecvStream(stream));
solenberg1ac56142015-10-13 03:58:19 -07003019 int channel_id = voe_.GetLastChannel();
solenberg4bac9c52015-10-09 02:32:53 -07003020 EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
solenberg1ac56142015-10-13 03:58:19 -07003021 float scale = 0;
3022 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3023 EXPECT_DOUBLE_EQ(3, scale);
3024}
3025
3026TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
3027 EXPECT_TRUE(SetupEngine());
3028 EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
3029 DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
3030 int channel_id = voe_.GetLastChannel();
3031 float scale = 0;
3032 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
3033 EXPECT_DOUBLE_EQ(2, scale);
3034 EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
solenbergbb741b32015-09-07 03:56:38 -07003035 EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
solenberg4bac9c52015-10-09 02:32:53 -07003036 EXPECT_DOUBLE_EQ(3, scale);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003037}
3038
pbos8fc7fa72015-07-15 08:02:58 -07003039TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
Peter Boström0c4e06b2015-10-07 12:23:21 +02003040 const uint32_t kAudioSsrc = 123;
pbos8fc7fa72015-07-15 08:02:58 -07003041 const std::string kSyncLabel = "AvSyncLabel";
3042
solenberg1ac56142015-10-13 03:58:19 -07003043 EXPECT_TRUE(SetupEngineWithSendStream());
pbos8fc7fa72015-07-15 08:02:58 -07003044 cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
3045 sp.sync_label = kSyncLabel;
3046 // Creating two channels to make sure that sync label is set properly for both
3047 // the default voice channel and following ones.
3048 EXPECT_TRUE(channel_->AddRecvStream(sp));
3049 sp.ssrcs[0] += 1;
3050 EXPECT_TRUE(channel_->AddRecvStream(sp));
3051
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003052 ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
pbos8fc7fa72015-07-15 08:02:58 -07003053 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003054 call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003055 << "SyncGroup should be set based on sync_label";
3056 EXPECT_EQ(kSyncLabel,
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003057 call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
pbos8fc7fa72015-07-15 08:02:58 -07003058 << "SyncGroup should be set based on sync_label";
pbos8fc7fa72015-07-15 08:02:58 -07003059}
3060
pbos6bb1b6e2015-07-24 07:10:18 -07003061TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003062 // Test that changing the combined_audio_video_bwe option results in the
3063 // expected state changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003064 std::vector<uint32_t> ssrcs;
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003065 ssrcs.push_back(223);
3066 ssrcs.push_back(224);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003067
solenberg1ac56142015-10-13 03:58:19 -07003068 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003069 cricket::WebRtcVoiceMediaChannel* media_channel =
3070 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Peter Boström0c4e06b2015-10-07 12:23:21 +02003071 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003072 EXPECT_TRUE(media_channel->AddRecvStream(
3073 cricket::StreamParams::CreateLegacy(ssrc)));
3074 }
3075 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003076
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003077 // Combined BWE should be disabled.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003078 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003079 const auto* s = call_.GetAudioReceiveStream(ssrc);
3080 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07003081 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003082 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003083
3084 // Enable combined BWE option - now it should be set up.
Karl Wibergbe579832015-11-10 22:34:18 +01003085 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003086 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003087 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003088 const auto* s = call_.GetAudioReceiveStream(ssrc);
3089 EXPECT_NE(nullptr, s);
3090 EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
3091 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003092
3093 // Disable combined BWE option - should be disabled again.
Karl Wibergbe579832015-11-10 22:34:18 +01003094 send_parameters_.options.combined_audio_video_bwe =
3095 rtc::Optional<bool>(false);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003096 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003097 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003098 const auto* s = call_.GetAudioReceiveStream(ssrc);
3099 EXPECT_NE(nullptr, s);
solenberg85a04962015-10-27 03:35:21 -07003100 EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003101 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003102
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003103 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003104}
3105
pbos6bb1b6e2015-07-24 07:10:18 -07003106TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003107 // Test that adding receive streams after enabling combined bandwidth
3108 // estimation will correctly configure each channel.
solenberg1ac56142015-10-13 03:58:19 -07003109 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003110 cricket::WebRtcVoiceMediaChannel* media_channel =
3111 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003112 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003113 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003114
Peter Boström0c4e06b2015-10-07 12:23:21 +02003115 static const uint32_t kSsrcs[] = {1, 2, 3, 4};
tfarina5237aaf2015-11-10 23:44:30 -08003116 for (unsigned int i = 0; i < arraysize(kSsrcs); ++i) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003117 EXPECT_TRUE(media_channel->AddRecvStream(
3118 cricket::StreamParams::CreateLegacy(kSsrcs[i])));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003119 EXPECT_NE(nullptr, call_.GetAudioReceiveStream(kSsrcs[i]));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003120 }
tfarina5237aaf2015-11-10 23:44:30 -08003121 EXPECT_EQ(arraysize(kSsrcs), call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003122}
3123
solenberg3a941542015-11-16 07:34:50 -08003124// TODO(solenberg): Remove, once recv streams are configured through Call.
3125// (This is then covered by TestSetRecvRtpHeaderExtensions.)
pbos6bb1b6e2015-07-24 07:10:18 -07003126TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003127 // Test that setting the header extensions results in the expected state
3128 // changes on an associated Call.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003129 std::vector<uint32_t> ssrcs;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003130 ssrcs.push_back(223);
3131 ssrcs.push_back(224);
3132
solenberg1ac56142015-10-13 03:58:19 -07003133 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003134 cricket::WebRtcVoiceMediaChannel* media_channel =
3135 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003136 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003137 EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
Peter Boström0c4e06b2015-10-07 12:23:21 +02003138 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003139 EXPECT_TRUE(media_channel->AddRecvStream(
3140 cricket::StreamParams::CreateLegacy(ssrc)));
3141 }
3142
3143 // Combined BWE should be set up, but with no configured extensions.
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003144 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003145 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003146 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003147 EXPECT_NE(nullptr, s);
3148 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3149 }
3150
3151 // Set up receive extensions.
3152 const auto& e_exts = engine_.rtp_header_extensions();
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003153 cricket::AudioRecvParameters recv_parameters;
3154 recv_parameters.extensions = e_exts;
3155 channel_->SetRecvParameters(recv_parameters);
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003156 EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003157 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003158 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003159 EXPECT_NE(nullptr, s);
3160 const auto& s_exts = s->GetConfig().rtp.extensions;
3161 EXPECT_EQ(e_exts.size(), s_exts.size());
3162 for (const auto& e_ext : e_exts) {
3163 for (const auto& s_ext : s_exts) {
3164 if (e_ext.id == s_ext.id) {
3165 EXPECT_EQ(e_ext.uri, s_ext.name);
3166 }
3167 }
3168 }
3169 }
3170
3171 // Disable receive extensions.
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003172 channel_->SetRecvParameters(cricket::AudioRecvParameters());
Peter Boström0c4e06b2015-10-07 12:23:21 +02003173 for (uint32_t ssrc : ssrcs) {
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003174 const auto* s = call_.GetAudioReceiveStream(ssrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003175 EXPECT_NE(nullptr, s);
3176 EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
3177 }
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003178}
3179
3180TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
3181 // Test that packets are forwarded to the Call when configured accordingly.
Peter Boström0c4e06b2015-10-07 12:23:21 +02003182 const uint32_t kAudioSsrc = 1;
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003183 rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
3184 static const unsigned char kRtcp[] = {
3185 0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
3186 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
3187 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3188 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
3189 };
3190 rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
3191
solenberg1ac56142015-10-13 03:58:19 -07003192 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003193 cricket::WebRtcVoiceMediaChannel* media_channel =
3194 static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
Karl Wibergbe579832015-11-10 22:34:18 +01003195 send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003196 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003197 EXPECT_TRUE(media_channel->AddRecvStream(
3198 cricket::StreamParams::CreateLegacy(kAudioSsrc)));
3199
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003200 EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003201 const cricket::FakeAudioReceiveStream* s =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003202 call_.GetAudioReceiveStream(kAudioSsrc);
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003203 EXPECT_EQ(0, s->received_packets());
3204 channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
3205 EXPECT_EQ(1, s->received_packets());
3206 channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
3207 EXPECT_EQ(2, s->received_packets());
Fredrik Solenberg4b60c732015-05-07 14:07:48 +02003208}
Minyue2013aec2015-05-13 14:14:42 +02003209
solenberg0a617e22015-10-20 15:49:38 -07003210// All receive channels should be associated with the first send channel,
solenberg1ac56142015-10-13 03:58:19 -07003211// since they do not send RTCP SR.
solenberg0a617e22015-10-20 15:49:38 -07003212TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
solenberg1ac56142015-10-13 03:58:19 -07003213 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003214 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
solenberg8fb30c32015-10-13 03:06:58 -07003215 int default_channel = voe_.GetLastChannel();
Minyue2013aec2015-05-13 14:14:42 +02003216 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3217 int recv_ch = voe_.GetLastChannel();
3218 EXPECT_NE(recv_ch, default_channel);
3219 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
3220 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3221 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
solenberg1ac56142015-10-13 03:58:19 -07003222 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
3223 recv_ch = voe_.GetLastChannel();
3224 EXPECT_NE(recv_ch, default_channel);
3225 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
Minyue2013aec2015-05-13 14:14:42 +02003226}
3227
3228TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
solenberg1ac56142015-10-13 03:58:19 -07003229 EXPECT_TRUE(SetupEngineWithSendStream());
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003230 EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
Minyue2013aec2015-05-13 14:14:42 +02003231
3232 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
3233 int recv_ch = voe_.GetLastChannel();
3234
3235 EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
3236 int send_ch = voe_.GetLastChannel();
3237
3238 // Manually associate |recv_ch| to |send_ch|. This test is to verify a
3239 // deleting logic, i.e., deleting |send_ch| will reset the associate send
3240 // channel of |recv_ch|.This is not a common case, since, normally, only the
3241 // default channel can be associated. However, the default is not deletable.
3242 // So we force the |recv_ch| to associate with a non-default channel.
3243 EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
3244 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
3245
3246 EXPECT_TRUE(channel_->RemoveSendStream(2));
3247 EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
3248}
stefan658910c2015-09-03 05:48:32 -07003249
3250// Tests for the actual WebRtc VoE library.
3251
3252TEST(WebRtcVoiceEngineTest, TestDefaultOptionsBeforeInit) {
3253 cricket::WebRtcVoiceEngine engine;
3254 cricket::AudioOptions options = engine.GetOptions();
3255 // The default options should have at least a few things set. We purposefully
3256 // don't check the option values here, though.
kwiberg102c6a62015-10-30 02:47:38 -07003257 EXPECT_TRUE(options.echo_cancellation);
3258 EXPECT_TRUE(options.auto_gain_control);
3259 EXPECT_TRUE(options.noise_suppression);
stefan658910c2015-09-03 05:48:32 -07003260}
3261
3262// Tests that the library initializes and shuts down properly.
3263TEST(WebRtcVoiceEngineTest, StartupShutdown) {
3264 cricket::WebRtcVoiceEngine engine;
3265 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003266 rtc::scoped_ptr<webrtc::Call> call(
3267 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003268 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003269 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003270 EXPECT_TRUE(channel != nullptr);
3271 delete channel;
3272 engine.Terminate();
3273
3274 // Reinit to catch regression where VoiceEngineObserver reference is lost
3275 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
3276 engine.Terminate();
3277}
3278
3279// Tests that the library is configured with the codecs we want.
3280TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
3281 cricket::WebRtcVoiceEngine engine;
3282 // Check codecs by name.
3283 EXPECT_TRUE(engine.FindCodec(
3284 cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0)));
3285 EXPECT_TRUE(engine.FindCodec(
3286 cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0)));
3287 EXPECT_TRUE(engine.FindCodec(
3288 cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0)));
3289 // Check that name matching is case-insensitive.
3290 EXPECT_TRUE(engine.FindCodec(
3291 cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0)));
3292 EXPECT_TRUE(engine.FindCodec(
3293 cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0)));
3294 EXPECT_TRUE(engine.FindCodec(
3295 cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0)));
3296 EXPECT_TRUE(engine.FindCodec(
3297 cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0)));
3298 EXPECT_TRUE(engine.FindCodec(
3299 cricket::AudioCodec(96, "G722", 8000, 0, 1, 0)));
3300 EXPECT_TRUE(engine.FindCodec(
3301 cricket::AudioCodec(96, "red", 8000, 0, 1, 0)));
3302 EXPECT_TRUE(engine.FindCodec(
3303 cricket::AudioCodec(96, "CN", 32000, 0, 1, 0)));
3304 EXPECT_TRUE(engine.FindCodec(
3305 cricket::AudioCodec(96, "CN", 16000, 0, 1, 0)));
3306 EXPECT_TRUE(engine.FindCodec(
3307 cricket::AudioCodec(96, "CN", 8000, 0, 1, 0)));
3308 EXPECT_TRUE(engine.FindCodec(
3309 cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0)));
3310 // Check codecs with an id by id.
3311 EXPECT_TRUE(engine.FindCodec(
3312 cricket::AudioCodec(0, "", 8000, 0, 1, 0))); // PCMU
3313 EXPECT_TRUE(engine.FindCodec(
3314 cricket::AudioCodec(8, "", 8000, 0, 1, 0))); // PCMA
3315 EXPECT_TRUE(engine.FindCodec(
3316 cricket::AudioCodec(9, "", 8000, 0, 1, 0))); // G722
3317 EXPECT_TRUE(engine.FindCodec(
3318 cricket::AudioCodec(13, "", 8000, 0, 1, 0))); // CN
3319 // Check sample/bitrate matching.
3320 EXPECT_TRUE(engine.FindCodec(
3321 cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0)));
3322 // Check that bad codecs fail.
3323 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0)));
3324 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(88, "", 0, 0, 1, 0)));
3325 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 0, 2, 0)));
3326 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 5000, 0, 1, 0)));
3327 EXPECT_FALSE(engine.FindCodec(cricket::AudioCodec(0, "", 0, 5000, 1, 0)));
3328 // Verify the payload id of common audio codecs, including CN, ISAC, and G722.
3329 for (std::vector<cricket::AudioCodec>::const_iterator it =
3330 engine.codecs().begin(); it != engine.codecs().end(); ++it) {
3331 if (it->name == "CN" && it->clockrate == 16000) {
3332 EXPECT_EQ(105, it->id);
3333 } else if (it->name == "CN" && it->clockrate == 32000) {
3334 EXPECT_EQ(106, it->id);
3335 } else if (it->name == "ISAC" && it->clockrate == 16000) {
3336 EXPECT_EQ(103, it->id);
3337 } else if (it->name == "ISAC" && it->clockrate == 32000) {
3338 EXPECT_EQ(104, it->id);
3339 } else if (it->name == "G722" && it->clockrate == 8000) {
3340 EXPECT_EQ(9, it->id);
3341 } else if (it->name == "telephone-event") {
3342 EXPECT_EQ(126, it->id);
3343 } else if (it->name == "red") {
3344 EXPECT_EQ(127, it->id);
3345 } else if (it->name == "opus") {
3346 EXPECT_EQ(111, it->id);
3347 ASSERT_TRUE(it->params.find("minptime") != it->params.end());
3348 EXPECT_EQ("10", it->params.find("minptime")->second);
3349 ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
3350 EXPECT_EQ("60", it->params.find("maxptime")->second);
3351 ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
3352 EXPECT_EQ("1", it->params.find("useinbandfec")->second);
3353 }
3354 }
3355
3356 engine.Terminate();
3357}
3358
3359// Tests that VoE supports at least 32 channels
3360TEST(WebRtcVoiceEngineTest, Has32Channels) {
3361 cricket::WebRtcVoiceEngine engine;
3362 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003363 rtc::scoped_ptr<webrtc::Call> call(
3364 webrtc::Call::Create(webrtc::Call::Config()));
stefan658910c2015-09-03 05:48:32 -07003365
3366 cricket::VoiceMediaChannel* channels[32];
3367 int num_channels = 0;
tfarina5237aaf2015-11-10 23:44:30 -08003368 while (num_channels < arraysize(channels)) {
stefan658910c2015-09-03 05:48:32 -07003369 cricket::VoiceMediaChannel* channel =
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003370 engine.CreateChannel(call.get(), cricket::AudioOptions());
stefan658910c2015-09-03 05:48:32 -07003371 if (!channel)
3372 break;
stefan658910c2015-09-03 05:48:32 -07003373 channels[num_channels++] = channel;
3374 }
3375
tfarina5237aaf2015-11-10 23:44:30 -08003376 int expected = arraysize(channels);
stefan658910c2015-09-03 05:48:32 -07003377 EXPECT_EQ(expected, num_channels);
3378
3379 while (num_channels > 0) {
3380 delete channels[--num_channels];
3381 }
stefan658910c2015-09-03 05:48:32 -07003382 engine.Terminate();
3383}
3384
3385// Test that we set our preferred codecs properly.
3386TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
3387 cricket::WebRtcVoiceEngine engine;
3388 EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
Fredrik Solenberg709ed672015-09-15 12:26:33 +02003389 rtc::scoped_ptr<webrtc::Call> call(
3390 webrtc::Call::Create(webrtc::Call::Config()));
Fredrik Solenbergb071a192015-09-17 16:42:56 +02003391 cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
3392 call.get());
3393 cricket::AudioRecvParameters parameters;
3394 parameters.codecs = engine.codecs();
3395 EXPECT_TRUE(channel.SetRecvParameters(parameters));
stefan658910c2015-09-03 05:48:32 -07003396}