2014-03-06 23:46:59 +00:00
|
|
|
|
/*
|
|
|
|
|
|
* libjingle
|
|
|
|
|
|
* Copyright 2008 Google Inc.
|
|
|
|
|
|
*
|
|
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
|
|
* modification, are permitted provided that the following conditions are met:
|
|
|
|
|
|
*
|
|
|
|
|
|
* 1. Redistributions of source code must retain the above copyright notice,
|
|
|
|
|
|
* this list of conditions and the following disclaimer.
|
|
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
|
|
|
|
* this list of conditions and the following disclaimer in the documentation
|
|
|
|
|
|
* and/or other materials provided with the distribution.
|
|
|
|
|
|
* 3. The name of the author may not be used to endorse or promote products
|
|
|
|
|
|
* derived from this software without specific prior written permission.
|
|
|
|
|
|
*
|
|
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
|
|
|
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
|
|
|
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
|
|
|
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
|
|
|
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
|
|
|
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
|
|
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
|
|
|
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
|
|
|
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
|
|
*/
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
2015-11-10 23:44:30 -08:00
|
|
|
|
#include "webrtc/base/arraysize.h"
|
2014-07-29 17:36:52 +00:00
|
|
|
|
#include "webrtc/base/byteorder.h"
|
|
|
|
|
|
#include "webrtc/base/gunit.h"
|
2015-09-15 12:26:33 +02:00
|
|
|
|
#include "webrtc/call.h"
|
2013-07-10 00:45:36 +00:00
|
|
|
|
#include "talk/media/base/constants.h"
|
|
|
|
|
|
#include "talk/media/base/fakemediaengine.h"
|
2013-10-31 15:40:38 +00:00
|
|
|
|
#include "talk/media/base/fakenetworkinterface.h"
|
2013-07-10 00:45:36 +00:00
|
|
|
|
#include "talk/media/base/fakertp.h"
|
2015-05-07 14:07:48 +02:00
|
|
|
|
#include "talk/media/webrtc/fakewebrtccall.h"
|
2013-07-10 00:45:36 +00:00
|
|
|
|
#include "talk/media/webrtc/fakewebrtcvoiceengine.h"
|
|
|
|
|
|
#include "talk/media/webrtc/webrtcvoiceengine.h"
|
2015-09-23 11:50:27 -07:00
|
|
|
|
#include "webrtc/p2p/base/faketransportcontroller.h"
|
2013-07-10 00:45:36 +00:00
|
|
|
|
#include "talk/session/media/channel.h"
|
|
|
|
|
|
|
2014-05-06 15:54:38 +00:00
|
|
|
|
using cricket::kRtpAudioLevelHeaderExtension;
|
|
|
|
|
|
using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
|
|
|
|
|
|
|
2015-10-22 10:49:27 +02:00
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
|
|
|
|
const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1, 0);
|
|
|
|
|
|
const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1, 0);
|
|
|
|
|
|
const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 64000, 2, 0);
|
|
|
|
|
|
const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1, 0);
|
|
|
|
|
|
const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1, 0);
|
|
|
|
|
|
const cricket::AudioCodec kRedCodec(117, "red", 8000, 0, 1, 0);
|
|
|
|
|
|
const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1, 0);
|
|
|
|
|
|
const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1, 0);
|
|
|
|
|
|
const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000, 0,
|
|
|
|
|
|
1, 0);
|
2015-10-27 03:35:21 -07:00
|
|
|
|
const uint32_t kSsrc1 = 0x99;
|
|
|
|
|
|
const uint32_t kSsrc2 = 0x98;
|
|
|
|
|
|
const uint32_t kSsrcs4[] = { 1, 2, 3, 4 };
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
|
|
|
|
|
class FakeVoEWrapper : public cricket::VoEWrapper {
|
|
|
|
|
|
public:
|
|
|
|
|
|
explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
|
|
|
|
|
|
: cricket::VoEWrapper(engine, // processing
|
|
|
|
|
|
engine, // base
|
|
|
|
|
|
engine, // codec
|
|
|
|
|
|
engine, // hw
|
|
|
|
|
|
engine, // network
|
|
|
|
|
|
engine, // rtp
|
|
|
|
|
|
engine) { // volume
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
2015-10-22 10:49:27 +02:00
|
|
|
|
} // namespace
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
|
|
|
|
|
class WebRtcVoiceEngineTestFake : public testing::Test {
|
|
|
|
|
|
public:
|
|
|
|
|
|
WebRtcVoiceEngineTestFake()
|
2015-09-15 12:26:33 +02:00
|
|
|
|
: call_(webrtc::Call::Config()),
|
2015-11-20 16:08:07 -08:00
|
|
|
|
engine_(new FakeVoEWrapper(&voe_)),
|
2015-05-29 15:05:44 +02:00
|
|
|
|
channel_(nullptr) {
|
2015-09-17 16:42:56 +02:00
|
|
|
|
send_parameters_.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
recv_parameters_.codecs.push_back(kPcmuCodec);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
2015-10-13 03:58:19 -07:00
|
|
|
|
bool SetupEngine() {
|
2014-07-29 17:36:52 +00:00
|
|
|
|
if (!engine_.Init(rtc::Thread::Current())) {
|
2014-05-06 15:54:38 +00:00
|
|
|
|
return false;
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
2015-09-15 12:26:33 +02:00
|
|
|
|
channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
|
2015-05-29 15:05:44 +02:00
|
|
|
|
return (channel_ != nullptr);
|
2014-05-06 15:54:38 +00:00
|
|
|
|
}
|
2015-10-13 03:58:19 -07:00
|
|
|
|
bool SetupEngineWithRecvStream() {
|
|
|
|
|
|
if (!SetupEngine()) {
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
return channel_->AddRecvStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc1));
|
|
|
|
|
|
}
|
|
|
|
|
|
bool SetupEngineWithSendStream() {
|
|
|
|
|
|
if (!SetupEngine()) {
|
2014-05-06 15:54:38 +00:00
|
|
|
|
return false;
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
2014-05-06 15:54:38 +00:00
|
|
|
|
return channel_->AddSendStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc1));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
2013-08-05 20:36:57 +00:00
|
|
|
|
void SetupForMultiSendStream() {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-10-20 15:49:38 -07:00
|
|
|
|
// Remove stream added in Setup.
|
2015-11-16 07:34:50 -08:00
|
|
|
|
EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
|
2015-10-27 03:35:21 -07:00
|
|
|
|
EXPECT_TRUE(channel_->RemoveSendStream(kSsrc1));
|
2015-10-20 15:49:38 -07:00
|
|
|
|
// Verify the channel does not exist.
|
2015-11-16 07:34:50 -08:00
|
|
|
|
EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
|
2013-08-05 20:36:57 +00:00
|
|
|
|
}
|
2013-07-10 00:45:36 +00:00
|
|
|
|
void DeliverPacket(const void* data, int len) {
|
rtc::Buffer improvements
1. Constructors, SetData(), and AppendData() now accept uint8_t*,
int8_t*, and char*. Previously, they accepted void*, meaning that
any kind of pointer was accepted. I think requiring an explicit
cast in cases where the input array isn't already of a byte-sized
type is a better compromise between convenience and safety.
2. data() can now return a uint8_t* instead of a char*, which seems
more appropriate for a byte array, and is harder to mix up with
zero-terminated C strings. data<int8_t>() is also available so
that callers that want that type instead won't have to cast, as
is data<char>() (which remains the default until all existing
callers have been fixed).
3. Constructors, SetData(), and AppendData() now accept arrays
natively, not just decayed to pointers. The advantage of this is
that callers don't have to pass the size separately.
4. There are new constructors that allow setting size and capacity
without initializing the array. Previously, this had to be done
separately after construction.
5. Instead of TransferTo(), Buffer now supports swap(), and move
construction and assignment, and has a Pass() method that works
just like std::move(). (The Pass method is modeled after
scoped_ptr::Pass().)
R=jmarusic@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/42989004
Cr-Commit-Position: refs/heads/master@{#9033}
2015-04-20 14:03:07 +02:00
|
|
|
|
rtc::Buffer packet(reinterpret_cast<const uint8_t*>(data), len);
|
2014-07-29 17:36:52 +00:00
|
|
|
|
channel_->OnPacketReceived(&packet, rtc::PacketTime());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
2015-05-07 16:05:53 +02:00
|
|
|
|
void TearDown() override {
|
2013-07-10 00:45:36 +00:00
|
|
|
|
delete channel_;
|
|
|
|
|
|
engine_.Terminate();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-12-04 15:22:19 +01:00
|
|
|
|
const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
|
|
|
|
|
|
const auto* send_stream = call_.GetAudioSendStream(ssrc);
|
|
|
|
|
|
EXPECT_TRUE(send_stream);
|
|
|
|
|
|
return *send_stream;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-11-16 07:34:50 -08:00
|
|
|
|
const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
|
|
|
|
|
|
const auto* send_stream = call_.GetAudioSendStream(ssrc);
|
|
|
|
|
|
EXPECT_TRUE(send_stream);
|
|
|
|
|
|
return send_stream->GetConfig();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-11-20 09:59:34 -08:00
|
|
|
|
const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
|
|
|
|
|
|
const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
|
|
|
|
|
|
EXPECT_TRUE(recv_stream);
|
|
|
|
|
|
return recv_stream->GetConfig();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
|
void TestInsertDtmf(uint32_t ssrc, bool caller) {
|
2014-07-29 17:36:52 +00:00
|
|
|
|
EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
|
2015-09-15 12:26:33 +02:00
|
|
|
|
channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
|
2015-05-29 15:05:44 +02:00
|
|
|
|
EXPECT_TRUE(channel_ != nullptr);
|
2013-08-30 21:24:16 +00:00
|
|
|
|
if (caller) {
|
2015-10-20 15:49:38 -07:00
|
|
|
|
// If this is a caller, local description will be applied and add the
|
2013-08-30 21:24:16 +00:00
|
|
|
|
// send stream.
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddSendStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc1)));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-07-10 00:45:36 +00:00
|
|
|
|
// Test we can only InsertDtmf when the other side supports telephone-event.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
|
|
|
|
|
|
EXPECT_FALSE(channel_->CanInsertDtmf());
|
2015-12-02 12:35:09 -08:00
|
|
|
|
EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
|
2015-09-17 16:42:56 +02:00
|
|
|
|
send_parameters_.codecs.push_back(kTelephoneEventCodec);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(channel_->CanInsertDtmf());
|
2013-08-30 21:24:16 +00:00
|
|
|
|
|
|
|
|
|
|
if (!caller) {
|
2015-10-20 15:49:38 -07:00
|
|
|
|
// If this is callee, there's no active send channel yet.
|
2015-12-02 12:35:09 -08:00
|
|
|
|
EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
|
2013-08-30 21:24:16 +00:00
|
|
|
|
EXPECT_TRUE(channel_->AddSendStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc1)));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-07-10 00:45:36 +00:00
|
|
|
|
// Check we fail if the ssrc is invalid.
|
2015-12-02 12:35:09 -08:00
|
|
|
|
EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
2015-12-04 15:22:19 +01:00
|
|
|
|
// Test send.
|
|
|
|
|
|
cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
|
|
|
|
|
|
GetSendStream(kSsrc1).GetLatestTelephoneEvent();
|
|
|
|
|
|
EXPECT_EQ(-1, telephone_event.payload_type);
|
2015-12-02 12:35:09 -08:00
|
|
|
|
EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
|
2015-12-04 15:22:19 +01:00
|
|
|
|
telephone_event = GetSendStream(kSsrc1).GetLatestTelephoneEvent();
|
|
|
|
|
|
EXPECT_EQ(kTelephoneEventCodec.id, telephone_event.payload_type);
|
|
|
|
|
|
EXPECT_EQ(2, telephone_event.event_code);
|
|
|
|
|
|
EXPECT_EQ(123, telephone_event.duration_ms);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that send bandwidth is set correctly.
|
|
|
|
|
|
// |codec| is the codec under test.
|
2014-01-15 23:15:54 +00:00
|
|
|
|
// |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
|
|
|
|
|
|
// |expected_result| is the expected result from SetMaxSendBandwidth().
|
|
|
|
|
|
// |expected_bitrate| is the expected audio bitrate afterward.
|
2013-07-10 00:45:36 +00:00
|
|
|
|
void TestSendBandwidth(const cricket::AudioCodec& codec,
|
2014-01-15 23:15:54 +00:00
|
|
|
|
int max_bitrate,
|
|
|
|
|
|
bool expected_result,
|
|
|
|
|
|
int expected_bitrate) {
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(codec);
|
|
|
|
|
|
parameters.max_bandwidth_bps = max_bitrate;
|
|
|
|
|
|
EXPECT_EQ(expected_result, channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2013-10-16 18:12:02 +00:00
|
|
|
|
webrtc::CodecInst temp_codec;
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetSendCodec(channel_num, temp_codec));
|
2014-01-15 23:15:54 +00:00
|
|
|
|
EXPECT_EQ(expected_bitrate, temp_codec.rate);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2014-05-06 15:54:38 +00:00
|
|
|
|
void TestSetSendRtpHeaderExtensions(const std::string& ext) {
|
2015-10-20 15:49:38 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-08-05 20:36:57 +00:00
|
|
|
|
|
2014-03-06 23:46:59 +00:00
|
|
|
|
// Ensure extensions are off by default.
|
2015-11-16 07:34:50 -08:00
|
|
|
|
EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
|
2013-08-05 20:36:57 +00:00
|
|
|
|
|
|
|
|
|
|
// Ensure unknown extensions won't cause an error.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
|
2014-03-06 23:46:59 +00:00
|
|
|
|
"urn:ietf:params:unknownextention", 1));
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-11-16 07:34:50 -08:00
|
|
|
|
EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
|
2013-08-05 20:36:57 +00:00
|
|
|
|
|
2014-03-06 23:46:59 +00:00
|
|
|
|
// Ensure extensions stay off with an empty list of headers.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
send_parameters_.extensions.clear();
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-11-16 07:34:50 -08:00
|
|
|
|
EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
|
2013-08-05 20:36:57 +00:00
|
|
|
|
|
2014-05-06 15:54:38 +00:00
|
|
|
|
// Ensure extension is set properly.
|
|
|
|
|
|
const int id = 1;
|
2015-09-17 16:42:56 +02:00
|
|
|
|
send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-11-16 07:34:50 -08:00
|
|
|
|
EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
|
|
|
|
|
|
EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
|
|
|
|
|
|
EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
|
2014-03-06 23:46:59 +00:00
|
|
|
|
|
2015-11-20 09:59:34 -08:00
|
|
|
|
// Ensure extension is set properly on new stream.
|
2014-05-06 15:54:38 +00:00
|
|
|
|
EXPECT_TRUE(channel_->AddSendStream(
|
2015-10-20 15:49:38 -07:00
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc2)));
|
2015-11-16 07:34:50 -08:00
|
|
|
|
EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
|
|
|
|
|
|
call_.GetAudioSendStream(kSsrc2));
|
|
|
|
|
|
EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
|
|
|
|
|
|
EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
|
|
|
|
|
|
EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
|
2013-08-05 20:36:57 +00:00
|
|
|
|
|
2014-03-06 23:46:59 +00:00
|
|
|
|
// Ensure all extensions go back off with an empty list.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
send_parameters_.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
send_parameters_.extensions.clear();
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-11-16 07:34:50 -08:00
|
|
|
|
EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
|
|
|
|
|
|
EXPECT_EQ(0u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
|
2014-03-06 23:46:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2014-05-06 15:54:38 +00:00
|
|
|
|
void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithRecvStream());
|
2014-03-06 23:46:59 +00:00
|
|
|
|
|
|
|
|
|
|
// Ensure extensions are off by default.
|
2015-11-20 09:59:34 -08:00
|
|
|
|
EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
|
2014-03-06 23:46:59 +00:00
|
|
|
|
|
|
|
|
|
|
// Ensure unknown extensions won't cause an error.
|
2015-11-20 09:59:34 -08:00
|
|
|
|
recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
|
2014-03-06 23:46:59 +00:00
|
|
|
|
"urn:ietf:params:unknownextention", 1));
|
2015-11-20 09:59:34 -08:00
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
|
|
|
|
|
|
EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
|
2014-03-06 23:46:59 +00:00
|
|
|
|
|
2014-05-06 15:54:38 +00:00
|
|
|
|
// Ensure extensions stay off with an empty list of headers.
|
2015-11-20 09:59:34 -08:00
|
|
|
|
recv_parameters_.extensions.clear();
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
|
|
|
|
|
|
EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
|
2014-03-06 23:46:59 +00:00
|
|
|
|
|
2014-05-06 15:54:38 +00:00
|
|
|
|
// Ensure extension is set properly.
|
|
|
|
|
|
const int id = 2;
|
2015-11-20 09:59:34 -08:00
|
|
|
|
recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
|
|
|
|
|
|
EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
|
|
|
|
|
|
EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
|
|
|
|
|
|
EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
|
2014-03-06 23:46:59 +00:00
|
|
|
|
|
2015-11-20 09:59:34 -08:00
|
|
|
|
// Ensure extension is set properly on new stream.
|
2014-05-06 15:54:38 +00:00
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(
|
2015-10-13 03:58:19 -07:00
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc2)));
|
2015-11-20 09:59:34 -08:00
|
|
|
|
EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
|
|
|
|
|
|
call_.GetAudioReceiveStream(kSsrc2));
|
|
|
|
|
|
EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
|
|
|
|
|
|
EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
|
|
|
|
|
|
EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
|
2014-05-06 15:54:38 +00:00
|
|
|
|
|
|
|
|
|
|
// Ensure all extensions go back off with an empty list.
|
2015-11-20 09:59:34 -08:00
|
|
|
|
recv_parameters_.extensions.clear();
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
|
|
|
|
|
|
EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
|
|
|
|
|
|
EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
|
2013-08-05 20:36:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2015-10-27 03:35:21 -07:00
|
|
|
|
webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
|
|
|
|
|
|
webrtc::AudioSendStream::Stats stats;
|
|
|
|
|
|
stats.local_ssrc = 12;
|
|
|
|
|
|
stats.bytes_sent = 345;
|
|
|
|
|
|
stats.packets_sent = 678;
|
|
|
|
|
|
stats.packets_lost = 9012;
|
|
|
|
|
|
stats.fraction_lost = 34.56f;
|
|
|
|
|
|
stats.codec_name = "codec_name_send";
|
|
|
|
|
|
stats.ext_seqnum = 789;
|
|
|
|
|
|
stats.jitter_ms = 12;
|
|
|
|
|
|
stats.rtt_ms = 345;
|
|
|
|
|
|
stats.audio_level = 678;
|
|
|
|
|
|
stats.aec_quality_min = 9.01f;
|
|
|
|
|
|
stats.echo_delay_median_ms = 234;
|
|
|
|
|
|
stats.echo_delay_std_ms = 567;
|
|
|
|
|
|
stats.echo_return_loss = 890;
|
|
|
|
|
|
stats.echo_return_loss_enhancement = 1234;
|
|
|
|
|
|
stats.typing_noise_detected = true;
|
|
|
|
|
|
return stats;
|
|
|
|
|
|
}
|
|
|
|
|
|
void SetAudioSendStreamStats() {
|
|
|
|
|
|
for (auto* s : call_.GetAudioSendStreams()) {
|
|
|
|
|
|
s->SetStats(GetAudioSendStreamStats());
|
2015-10-22 10:49:27 +02:00
|
|
|
|
}
|
2015-10-27 03:35:21 -07:00
|
|
|
|
}
|
2015-11-06 15:34:49 -08:00
|
|
|
|
void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
|
|
|
|
|
|
bool is_sending) {
|
2015-10-27 03:35:21 -07:00
|
|
|
|
const auto stats = GetAudioSendStreamStats();
|
|
|
|
|
|
EXPECT_EQ(info.ssrc(), stats.local_ssrc);
|
|
|
|
|
|
EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
|
|
|
|
|
|
EXPECT_EQ(info.packets_sent, stats.packets_sent);
|
|
|
|
|
|
EXPECT_EQ(info.packets_lost, stats.packets_lost);
|
|
|
|
|
|
EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
|
|
|
|
|
|
EXPECT_EQ(info.codec_name, stats.codec_name);
|
|
|
|
|
|
EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
|
|
|
|
|
|
EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
|
|
|
|
|
|
EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
|
|
|
|
|
|
EXPECT_EQ(info.audio_level, stats.audio_level);
|
|
|
|
|
|
EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
|
|
|
|
|
|
EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
|
|
|
|
|
|
EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
|
|
|
|
|
|
EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
|
|
|
|
|
|
EXPECT_EQ(info.echo_return_loss_enhancement,
|
|
|
|
|
|
stats.echo_return_loss_enhancement);
|
2015-11-06 15:34:49 -08:00
|
|
|
|
EXPECT_EQ(info.typing_noise_detected,
|
|
|
|
|
|
stats.typing_noise_detected && is_sending);
|
2015-10-27 03:35:21 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
|
|
|
|
|
|
webrtc::AudioReceiveStream::Stats stats;
|
|
|
|
|
|
stats.remote_ssrc = 123;
|
|
|
|
|
|
stats.bytes_rcvd = 456;
|
|
|
|
|
|
stats.packets_rcvd = 768;
|
|
|
|
|
|
stats.packets_lost = 101;
|
|
|
|
|
|
stats.fraction_lost = 23.45f;
|
|
|
|
|
|
stats.codec_name = "codec_name_recv";
|
|
|
|
|
|
stats.ext_seqnum = 678;
|
|
|
|
|
|
stats.jitter_ms = 901;
|
|
|
|
|
|
stats.jitter_buffer_ms = 234;
|
|
|
|
|
|
stats.jitter_buffer_preferred_ms = 567;
|
|
|
|
|
|
stats.delay_estimate_ms = 890;
|
|
|
|
|
|
stats.audio_level = 1234;
|
|
|
|
|
|
stats.expand_rate = 5.67f;
|
|
|
|
|
|
stats.speech_expand_rate = 8.90f;
|
|
|
|
|
|
stats.secondary_decoded_rate = 1.23f;
|
|
|
|
|
|
stats.accelerate_rate = 4.56f;
|
|
|
|
|
|
stats.preemptive_expand_rate = 7.89f;
|
|
|
|
|
|
stats.decoding_calls_to_silence_generator = 12;
|
|
|
|
|
|
stats.decoding_calls_to_neteq = 345;
|
|
|
|
|
|
stats.decoding_normal = 67890;
|
|
|
|
|
|
stats.decoding_plc = 1234;
|
|
|
|
|
|
stats.decoding_cng = 5678;
|
|
|
|
|
|
stats.decoding_plc_cng = 9012;
|
|
|
|
|
|
stats.capture_start_ntp_time_ms = 3456;
|
2015-10-22 10:49:27 +02:00
|
|
|
|
return stats;
|
|
|
|
|
|
}
|
|
|
|
|
|
void SetAudioReceiveStreamStats() {
|
|
|
|
|
|
for (auto* s : call_.GetAudioReceiveStreams()) {
|
|
|
|
|
|
s->SetStats(GetAudioReceiveStreamStats());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
|
2015-10-27 03:35:21 -07:00
|
|
|
|
const auto stats = GetAudioReceiveStreamStats();
|
|
|
|
|
|
EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
|
|
|
|
|
|
EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
|
|
|
|
|
|
EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
|
|
|
|
|
|
EXPECT_EQ(info.packets_lost, stats.packets_lost);
|
|
|
|
|
|
EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
|
|
|
|
|
|
EXPECT_EQ(info.codec_name, stats.codec_name);
|
|
|
|
|
|
EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
|
|
|
|
|
|
EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
|
|
|
|
|
|
EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
|
2015-10-22 10:49:27 +02:00
|
|
|
|
EXPECT_EQ(info.jitter_buffer_preferred_ms,
|
2015-10-27 03:35:21 -07:00
|
|
|
|
stats.jitter_buffer_preferred_ms);
|
|
|
|
|
|
EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
|
|
|
|
|
|
EXPECT_EQ(info.audio_level, stats.audio_level);
|
|
|
|
|
|
EXPECT_EQ(info.expand_rate, stats.expand_rate);
|
|
|
|
|
|
EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
|
|
|
|
|
|
EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
|
|
|
|
|
|
EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
|
|
|
|
|
|
EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
|
2015-10-22 10:49:27 +02:00
|
|
|
|
EXPECT_EQ(info.decoding_calls_to_silence_generator,
|
2015-10-27 03:35:21 -07:00
|
|
|
|
stats.decoding_calls_to_silence_generator);
|
|
|
|
|
|
EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
|
|
|
|
|
|
EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
|
|
|
|
|
|
EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
|
|
|
|
|
|
EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
|
|
|
|
|
|
EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
|
|
|
|
|
|
EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
|
2015-10-22 10:49:27 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2013-07-10 00:45:36 +00:00
|
|
|
|
protected:
|
2015-09-15 12:26:33 +02:00
|
|
|
|
cricket::FakeCall call_;
|
2013-07-10 00:45:36 +00:00
|
|
|
|
cricket::FakeWebRtcVoiceEngine voe_;
|
|
|
|
|
|
cricket::WebRtcVoiceEngine engine_;
|
|
|
|
|
|
cricket::VoiceMediaChannel* channel_;
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters send_parameters_;
|
|
|
|
|
|
cricket::AudioRecvParameters recv_parameters_;
|
2013-07-10 00:45:36 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Tests that our stub library "works".
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, StartupShutdown) {
|
|
|
|
|
|
EXPECT_FALSE(voe_.IsInited());
|
2014-07-29 17:36:52 +00:00
|
|
|
|
EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(voe_.IsInited());
|
|
|
|
|
|
engine_.Terminate();
|
|
|
|
|
|
EXPECT_FALSE(voe_.IsInited());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Tests that we can create and destroy a channel.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
|
2014-07-29 17:36:52 +00:00
|
|
|
|
EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
|
2015-09-15 12:26:33 +02:00
|
|
|
|
channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
|
2015-05-29 15:05:44 +02:00
|
|
|
|
EXPECT_TRUE(channel_ != nullptr);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Tests that the list of supported codecs is created properly and ordered
|
|
|
|
|
|
// correctly
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, CodecPreference) {
|
|
|
|
|
|
const std::vector<cricket::AudioCodec>& codecs = engine_.codecs();
|
|
|
|
|
|
ASSERT_FALSE(codecs.empty());
|
|
|
|
|
|
EXPECT_STRCASEEQ("opus", codecs[0].name.c_str());
|
|
|
|
|
|
EXPECT_EQ(48000, codecs[0].clockrate);
|
|
|
|
|
|
EXPECT_EQ(2, codecs[0].channels);
|
|
|
|
|
|
EXPECT_EQ(64000, codecs[0].bitrate);
|
|
|
|
|
|
int pref = codecs[0].preference;
|
|
|
|
|
|
for (size_t i = 1; i < codecs.size(); ++i) {
|
|
|
|
|
|
EXPECT_GT(pref, codecs[i].preference);
|
|
|
|
|
|
pref = codecs[i].preference;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Tests that we can find codecs by name or id, and that we interpret the
|
|
|
|
|
|
// clockrate and bitrate fields properly.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, FindCodec) {
|
|
|
|
|
|
cricket::AudioCodec codec;
|
|
|
|
|
|
webrtc::CodecInst codec_inst;
|
|
|
|
|
|
// Find PCMU with explicit clockrate and bitrate.
|
2015-11-27 04:00:25 -08:00
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kPcmuCodec, &codec_inst));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
// Find ISAC with explicit clockrate and 0 bitrate.
|
2015-11-27 04:00:25 -08:00
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kIsacCodec, &codec_inst));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
// Find telephone-event with explicit clockrate and 0 bitrate.
|
2015-11-27 04:00:25 -08:00
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kTelephoneEventCodec,
|
|
|
|
|
|
&codec_inst));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
// Find ISAC with a different payload id.
|
|
|
|
|
|
codec = kIsacCodec;
|
|
|
|
|
|
codec.id = 127;
|
2015-11-27 04:00:25 -08:00
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(codec.id, codec_inst.pltype);
|
|
|
|
|
|
// Find PCMU with a 0 clockrate.
|
|
|
|
|
|
codec = kPcmuCodec;
|
|
|
|
|
|
codec.clockrate = 0;
|
2015-11-27 04:00:25 -08:00
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(codec.id, codec_inst.pltype);
|
|
|
|
|
|
EXPECT_EQ(8000, codec_inst.plfreq);
|
|
|
|
|
|
// Find PCMU with a 0 bitrate.
|
|
|
|
|
|
codec = kPcmuCodec;
|
|
|
|
|
|
codec.bitrate = 0;
|
2015-11-27 04:00:25 -08:00
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(codec.id, codec_inst.pltype);
|
|
|
|
|
|
EXPECT_EQ(64000, codec_inst.rate);
|
|
|
|
|
|
// Find ISAC with an explicit bitrate.
|
|
|
|
|
|
codec = kIsacCodec;
|
|
|
|
|
|
codec.bitrate = 32000;
|
2015-11-27 04:00:25 -08:00
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(codec, &codec_inst));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(codec.id, codec_inst.pltype);
|
|
|
|
|
|
EXPECT_EQ(32000, codec_inst.rate);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we set our inbound codecs properly, including changing PT.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
|
|
|
|
|
|
EXPECT_TRUE(SetupEngine());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioRecvParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kTelephoneEventCodec);
|
|
|
|
|
|
parameters.codecs[0].id = 106; // collide with existing telephone-event
|
|
|
|
|
|
parameters.codecs[2].id = 126;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc1)));
|
|
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
2015-11-10 23:44:30 -08:00
|
|
|
|
rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
|
2013-07-10 00:45:36 +00:00
|
|
|
|
gcodec.plfreq = 16000;
|
|
|
|
|
|
gcodec.channels = 1;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(106, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
2015-11-10 23:44:30 -08:00
|
|
|
|
rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
|
2013-07-10 00:45:36 +00:00
|
|
|
|
gcodec.plfreq = 8000;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(126, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("telephone-event", gcodec.plname);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we fail to set an unknown inbound codec.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
|
|
|
|
|
|
EXPECT_TRUE(SetupEngine());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioRecvParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1, 0));
|
|
|
|
|
|
EXPECT_FALSE(channel_->SetRecvParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we fail if we have duplicate types in the inbound list.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
|
|
|
|
|
|
EXPECT_TRUE(SetupEngine());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioRecvParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kCn16000Codec);
|
|
|
|
|
|
parameters.codecs[1].id = kIsacCodec.id;
|
|
|
|
|
|
EXPECT_FALSE(channel_->SetRecvParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we can decode OPUS without stereo parameters.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
|
|
|
|
|
|
EXPECT_TRUE(SetupEngine());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioRecvParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc1)));
|
2015-10-13 03:58:19 -07:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst opus;
|
2015-11-27 04:00:25 -08:00
|
|
|
|
cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
// Even without stereo parameters, recv codecs still specify channels = 2.
|
|
|
|
|
|
EXPECT_EQ(2, opus.channels);
|
|
|
|
|
|
EXPECT_EQ(111, opus.pltype);
|
|
|
|
|
|
EXPECT_STREQ("opus", opus.plname);
|
|
|
|
|
|
opus.pltype = 0;
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num, opus));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(111, opus.pltype);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we can decode OPUS with stereo = 0.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
|
|
|
|
|
|
EXPECT_TRUE(SetupEngine());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioRecvParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[2].params["stereo"] = "0";
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc1)));
|
|
|
|
|
|
int channel_num2 = voe_.GetLastChannel();
|
|
|
|
|
|
webrtc::CodecInst opus;
|
2015-11-27 04:00:25 -08:00
|
|
|
|
cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
// Even when stereo is off, recv codecs still specify channels = 2.
|
|
|
|
|
|
EXPECT_EQ(2, opus.channels);
|
|
|
|
|
|
EXPECT_EQ(111, opus.pltype);
|
|
|
|
|
|
EXPECT_STREQ("opus", opus.plname);
|
|
|
|
|
|
opus.pltype = 0;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
|
|
|
|
|
|
EXPECT_EQ(111, opus.pltype);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we can decode OPUS with stereo = 1.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
|
|
|
|
|
|
EXPECT_TRUE(SetupEngine());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioRecvParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[2].params["stereo"] = "1";
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc1)));
|
|
|
|
|
|
int channel_num2 = voe_.GetLastChannel();
|
|
|
|
|
|
webrtc::CodecInst opus;
|
2015-11-27 04:00:25 -08:00
|
|
|
|
cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(2, opus.channels);
|
|
|
|
|
|
EXPECT_EQ(111, opus.pltype);
|
|
|
|
|
|
EXPECT_STREQ("opus", opus.plname);
|
|
|
|
|
|
opus.pltype = 0;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, opus));
|
|
|
|
|
|
EXPECT_EQ(111, opus.pltype);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that changes to recv codecs are applied to all streams.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
|
|
|
|
|
|
EXPECT_TRUE(SetupEngine());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioRecvParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kTelephoneEventCodec);
|
|
|
|
|
|
parameters.codecs[0].id = 106; // collide with existing telephone-event
|
|
|
|
|
|
parameters.codecs[2].id = 126;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc1)));
|
|
|
|
|
|
int channel_num2 = voe_.GetLastChannel();
|
|
|
|
|
|
webrtc::CodecInst gcodec;
|
2015-11-10 23:44:30 -08:00
|
|
|
|
rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
|
2013-07-10 00:45:36 +00:00
|
|
|
|
gcodec.plfreq = 16000;
|
|
|
|
|
|
gcodec.channels = 1;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
|
|
|
|
|
|
EXPECT_EQ(106, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
2015-11-10 23:44:30 -08:00
|
|
|
|
rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "telephone-event");
|
2013-07-10 00:45:36 +00:00
|
|
|
|
gcodec.plfreq = 8000;
|
|
|
|
|
|
gcodec.channels = 1;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
|
|
|
|
|
|
EXPECT_EQ(126, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("telephone-event", gcodec.plname);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithRecvStream());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioRecvParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs[0].id = 106; // collide with existing telephone-event
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
|
|
|
|
|
int channel_num2 = voe_.GetLastChannel();
|
|
|
|
|
|
webrtc::CodecInst gcodec;
|
2015-11-10 23:44:30 -08:00
|
|
|
|
rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
|
2013-07-10 00:45:36 +00:00
|
|
|
|
gcodec.plfreq = 16000;
|
|
|
|
|
|
gcodec.channels = 1;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetRecPayloadType(channel_num2, gcodec));
|
|
|
|
|
|
EXPECT_EQ(106, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we can apply the same set of codecs again while playing.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithRecvStream());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioRecvParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kCn16000Codec);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(channel_->SetPlayout(true));
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
|
|
|
|
|
// Changing the payload type of a codec should fail.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0].id = 127;
|
|
|
|
|
|
EXPECT_FALSE(channel_->SetRecvParameters(parameters));
|
|
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(voe_.GetPlayout(channel_num));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we can add a codec while playing.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithRecvStream());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioRecvParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kCn16000Codec);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(channel_->SetPlayout(true));
|
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
|
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(voe_.GetPlayout(channel_num));
|
|
|
|
|
|
webrtc::CodecInst gcodec;
|
2015-11-27 04:00:25 -08:00
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &gcodec));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(kOpusCodec.id, gcodec.pltype);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
2014-01-15 23:15:54 +00:00
|
|
|
|
// Test that when autobw is enabled, bitrate is kept as the default
|
|
|
|
|
|
// value. autobw is enabled for the following tests because the target
|
|
|
|
|
|
// bitrate is <= 0.
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
|
|
|
|
|
// ISAC, default bitrate == 32000.
|
2014-01-15 23:15:54 +00:00
|
|
|
|
TestSendBandwidth(kIsacCodec, 0, true, 32000);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
|
|
|
|
|
// PCMU, default bitrate == 64000.
|
2014-01-15 23:15:54 +00:00
|
|
|
|
TestSendBandwidth(kPcmuCodec, -1, true, 64000);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
|
|
|
|
|
// opus, default bitrate == 64000.
|
2014-01-15 23:15:54 +00:00
|
|
|
|
TestSendBandwidth(kOpusCodec, -1, true, 64000);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2014-01-15 23:15:54 +00:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
2014-01-15 23:15:54 +00:00
|
|
|
|
// Test that the bitrate of a multi-rate codec is always the maximum.
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
|
|
|
|
|
// ISAC, default bitrate == 32000.
|
2014-01-15 23:15:54 +00:00
|
|
|
|
TestSendBandwidth(kIsacCodec, 128000, true, 128000);
|
|
|
|
|
|
TestSendBandwidth(kIsacCodec, 16000, true, 16000);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
|
|
|
|
|
// opus, default bitrate == 64000.
|
2014-01-15 23:15:54 +00:00
|
|
|
|
TestSendBandwidth(kOpusCodec, 96000, true, 96000);
|
|
|
|
|
|
TestSendBandwidth(kOpusCodec, 48000, true, 48000);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2014-01-15 23:15:54 +00:00
|
|
|
|
|
|
|
|
|
|
// Test that we can only set a maximum bitrate for a fixed-rate codec
|
|
|
|
|
|
// if it's bigger than the fixed rate.
|
|
|
|
|
|
|
|
|
|
|
|
// PCMU, fixed bitrate == 64000.
|
|
|
|
|
|
TestSendBandwidth(kPcmuCodec, 0, true, 64000);
|
|
|
|
|
|
TestSendBandwidth(kPcmuCodec, 1, false, 64000);
|
|
|
|
|
|
TestSendBandwidth(kPcmuCodec, 128000, true, 64000);
|
|
|
|
|
|
TestSendBandwidth(kPcmuCodec, 32000, false, 64000);
|
|
|
|
|
|
TestSendBandwidth(kPcmuCodec, 64000, true, 64000);
|
|
|
|
|
|
TestSendBandwidth(kPcmuCodec, 63999, false, 64000);
|
|
|
|
|
|
TestSendBandwidth(kPcmuCodec, 64001, true, 64000);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2014-01-15 23:15:54 +00:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngine());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
const int kDesiredBitrate = 128000;
|
|
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs = engine_.codecs();
|
|
|
|
|
|
parameters.max_bandwidth_bps = kDesiredBitrate;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-10-16 18:12:02 +00:00
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddSendStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc1)));
|
|
|
|
|
|
|
|
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
|
|
|
|
|
webrtc::CodecInst codec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_EQ(kDesiredBitrate, codec.rate);
|
2013-10-16 18:12:02 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2013-07-10 00:45:36 +00:00
|
|
|
|
// Test that bitrate cannot be set for CBR codecs.
|
|
|
|
|
|
// Bitrate is ignored if it is higher than the fixed bitrate.
|
|
|
|
|
|
// Bitrate less then the fixed bitrate is an error.
|
2014-01-15 23:15:54 +00:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
|
|
|
|
|
// PCMU, default bitrate == 64000.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
|
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
|
|
|
|
|
webrtc::CodecInst codec;
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
|
|
|
|
|
|
EXPECT_EQ(64000, codec.rate);
|
2015-09-17 16:42:56 +02:00
|
|
|
|
|
|
|
|
|
|
send_parameters_.max_bandwidth_bps = 128000;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
|
|
|
|
|
|
EXPECT_EQ(64000, codec.rate);
|
2015-09-17 16:42:56 +02:00
|
|
|
|
|
|
|
|
|
|
send_parameters_.max_bandwidth_bps = 128;
|
|
|
|
|
|
EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, codec));
|
|
|
|
|
|
EXPECT_EQ(64000, codec.rate);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we apply codecs properly.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kRedCodec);
|
|
|
|
|
|
parameters.codecs[0].id = 96;
|
|
|
|
|
|
parameters.codecs[0].bitrate = 48000;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-04-01 17:44:24 +00:00
|
|
|
|
EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(96, gcodec.pltype);
|
|
|
|
|
|
EXPECT_EQ(48000, gcodec.rate);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetVAD(channel_num));
|
2014-06-17 10:56:41 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetRED(channel_num));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
|
|
|
|
|
|
EXPECT_EQ(105, voe_.GetSendCNPayloadType(channel_num, true));
|
2015-12-04 15:22:19 +01:00
|
|
|
|
EXPECT_FALSE(channel_->CanInsertDtmf());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2014-04-01 17:44:24 +00:00
|
|
|
|
// Test that VoE Channel doesn't call SetSendCodec again if same codec is tried
|
|
|
|
|
|
// to apply.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, DontResetSetSendCodec) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kRedCodec);
|
|
|
|
|
|
parameters.codecs[0].id = 96;
|
|
|
|
|
|
parameters.codecs[0].bitrate = 48000;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-04-01 17:44:24 +00:00
|
|
|
|
EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
|
|
|
|
|
|
// Calling SetSendCodec again with same codec which is already set.
|
|
|
|
|
|
// In this case media channel shouldn't send codec to VoE.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-04-01 17:44:24 +00:00
|
|
|
|
EXPECT_EQ(1, voe_.GetNumSetSendCodecs());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2014-11-07 12:25:00 +00:00
|
|
|
|
// Verify that G722 is set with 16000 samples per second to WebRTC.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecG722) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2014-11-07 12:25:00 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kG722CodecSdp);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-11-07 12:25:00 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("G722", gcodec.plname);
|
|
|
|
|
|
EXPECT_EQ(1, gcodec.channels);
|
|
|
|
|
|
EXPECT_EQ(16000, gcodec.plfreq);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2014-02-27 17:52:04 +00:00
|
|
|
|
// Test that if clockrate is not 48000 for opus, we fail.
|
2013-07-10 00:45:36 +00:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 0;
|
|
|
|
|
|
parameters.codecs[0].clockrate = 50000;
|
|
|
|
|
|
EXPECT_FALSE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2014-02-27 17:52:04 +00:00
|
|
|
|
// Test that if channels=0 for opus, we fail.
|
2013-07-10 00:45:36 +00:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 0;
|
|
|
|
|
|
parameters.codecs[0].channels = 0;
|
|
|
|
|
|
EXPECT_FALSE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2014-02-27 17:52:04 +00:00
|
|
|
|
// Test that if channels=0 for opus, we fail.
|
2013-07-10 00:45:36 +00:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 0;
|
|
|
|
|
|
parameters.codecs[0].channels = 0;
|
|
|
|
|
|
parameters.codecs[0].params["stereo"] = "1";
|
|
|
|
|
|
EXPECT_FALSE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that if channel is 1 for opus and there's no stereo, we fail.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 0;
|
|
|
|
|
|
parameters.codecs[0].channels = 1;
|
|
|
|
|
|
EXPECT_FALSE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that if channel is 1 for opus and stereo=0, we fail.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 0;
|
|
|
|
|
|
parameters.codecs[0].channels = 1;
|
|
|
|
|
|
parameters.codecs[0].params["stereo"] = "0";
|
|
|
|
|
|
EXPECT_FALSE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that if channel is 1 for opus and stereo=1, we fail.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 0;
|
|
|
|
|
|
parameters.codecs[0].channels = 1;
|
|
|
|
|
|
parameters.codecs[0].params["stereo"] = "1";
|
|
|
|
|
|
EXPECT_FALSE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that with bitrate=0 and no stereo,
|
|
|
|
|
|
// channels and bitrate are 1 and 32000.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 0;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
|
|
|
|
|
EXPECT_EQ(1, gcodec.channels);
|
|
|
|
|
|
EXPECT_EQ(32000, gcodec.rate);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that with bitrate=0 and stereo=0,
|
|
|
|
|
|
// channels and bitrate are 1 and 32000.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 0;
|
|
|
|
|
|
parameters.codecs[0].params["stereo"] = "0";
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
|
|
|
|
|
EXPECT_EQ(1, gcodec.channels);
|
|
|
|
|
|
EXPECT_EQ(32000, gcodec.rate);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-07-26 19:17:59 +00:00
|
|
|
|
// Test that with bitrate=invalid and stereo=0,
|
|
|
|
|
|
// channels and bitrate are 1 and 32000.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-26 19:17:59 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].params["stereo"] = "0";
|
2013-07-26 19:17:59 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
|
2014-10-23 12:22:06 +00:00
|
|
|
|
// bitrate that's out of the range between 6000 and 510000 will be clamped.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0].bitrate = 5999;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-26 19:17:59 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
|
|
|
|
|
EXPECT_EQ(1, gcodec.channels);
|
2014-10-23 12:22:06 +00:00
|
|
|
|
EXPECT_EQ(6000, gcodec.rate);
|
2013-07-26 19:17:59 +00:00
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0].bitrate = 510001;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-26 19:17:59 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
|
|
|
|
|
EXPECT_EQ(1, gcodec.channels);
|
2014-10-23 12:22:06 +00:00
|
|
|
|
EXPECT_EQ(510000, gcodec.rate);
|
2013-07-26 19:17:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2013-07-10 00:45:36 +00:00
|
|
|
|
// Test that with bitrate=0 and stereo=1,
|
|
|
|
|
|
// channels and bitrate are 2 and 64000.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 0;
|
|
|
|
|
|
parameters.codecs[0].params["stereo"] = "1";
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
|
|
|
|
|
EXPECT_EQ(2, gcodec.channels);
|
|
|
|
|
|
EXPECT_EQ(64000, gcodec.rate);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-07-26 19:17:59 +00:00
|
|
|
|
// Test that with bitrate=invalid and stereo=1,
|
|
|
|
|
|
// channels and bitrate are 2 and 64000.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-26 19:17:59 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].params["stereo"] = "1";
|
2013-07-26 19:17:59 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
|
2014-10-23 12:22:06 +00:00
|
|
|
|
// bitrate that's out of the range between 6000 and 510000 will be clamped.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0].bitrate = 5999;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-26 19:17:59 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
|
|
|
|
|
EXPECT_EQ(2, gcodec.channels);
|
2014-10-23 12:22:06 +00:00
|
|
|
|
EXPECT_EQ(6000, gcodec.rate);
|
2013-07-26 19:17:59 +00:00
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0].bitrate = 510001;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-26 19:17:59 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
|
|
|
|
|
EXPECT_EQ(2, gcodec.channels);
|
2014-10-23 12:22:06 +00:00
|
|
|
|
EXPECT_EQ(510000, gcodec.rate);
|
2013-07-26 19:17:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2013-07-10 00:45:36 +00:00
|
|
|
|
// Test that with bitrate=N and stereo unset,
|
|
|
|
|
|
// channels and bitrate are 1 and N.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 96000;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(111, gcodec.pltype);
|
|
|
|
|
|
EXPECT_EQ(96000, gcodec.rate);
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
|
|
|
|
|
EXPECT_EQ(1, gcodec.channels);
|
|
|
|
|
|
EXPECT_EQ(48000, gcodec.plfreq);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that with bitrate=N and stereo=0,
|
|
|
|
|
|
// channels and bitrate are 1 and N.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 30000;
|
|
|
|
|
|
parameters.codecs[0].params["stereo"] = "0";
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(1, gcodec.channels);
|
|
|
|
|
|
EXPECT_EQ(30000, gcodec.rate);
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that with bitrate=N and without any parameters,
|
|
|
|
|
|
// channels and bitrate are 1 and N.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 30000;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(1, gcodec.channels);
|
|
|
|
|
|
EXPECT_EQ(30000, gcodec.rate);
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that with bitrate=N and stereo=1,
|
|
|
|
|
|
// channels and bitrate are 2 and N.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 30000;
|
|
|
|
|
|
parameters.codecs[0].params["stereo"] = "1";
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(2, gcodec.channels);
|
|
|
|
|
|
EXPECT_EQ(30000, gcodec.rate);
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-07-26 19:17:59 +00:00
|
|
|
|
// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
|
|
|
|
|
|
// Also test that the "maxaveragebitrate" can't be set to values outside the
|
|
|
|
|
|
// range of 6000 and 510000
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusMaxAverageBitrate) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-26 19:17:59 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 30000;
|
2013-07-26 19:17:59 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
|
|
|
|
|
|
// Ignore if less than 6000.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0].params["maxaveragebitrate"] = "5999";
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-26 19:17:59 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
2014-10-23 12:22:06 +00:00
|
|
|
|
EXPECT_EQ(6000, gcodec.rate);
|
2013-07-26 19:17:59 +00:00
|
|
|
|
|
|
|
|
|
|
// Ignore if larger than 510000.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0].params["maxaveragebitrate"] = "510001";
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-26 19:17:59 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
2014-10-23 12:22:06 +00:00
|
|
|
|
EXPECT_EQ(510000, gcodec.rate);
|
2013-07-26 19:17:59 +00:00
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0].params["maxaveragebitrate"] = "200000";
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-26 19:17:59 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(200000, gcodec.rate);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-08-30 21:24:16 +00:00
|
|
|
|
// Test that we can enable NACK with opus as caller.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].AddFeedbackParam(
|
|
|
|
|
|
cricket::FeedbackParam(cricket::kRtcpFbParamNack,
|
|
|
|
|
|
cricket::kParamValueEmpty));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetNACK(channel_num));
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(voe_.GetNACK(channel_num));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-08-30 21:24:16 +00:00
|
|
|
|
// Test that we can enable NACK with opus as callee.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
|
2015-10-20 15:49:38 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithRecvStream());
|
2013-08-30 21:24:16 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].AddFeedbackParam(
|
|
|
|
|
|
cricket::FeedbackParam(cricket::kRtcpFbParamNack,
|
|
|
|
|
|
cricket::kParamValueEmpty));
|
2013-08-30 21:24:16 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetNACK(channel_num));
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-08-30 21:24:16 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetNACK(channel_num));
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddSendStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc1)));
|
2015-10-20 15:49:38 -07:00
|
|
|
|
EXPECT_TRUE(voe_.GetNACK(voe_.GetLastChannel()));
|
2013-08-30 21:24:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2013-07-10 00:45:36 +00:00
|
|
|
|
// Test that we can enable NACK on receive streams.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num1 = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
|
|
|
|
|
|
int channel_num2 = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].AddFeedbackParam(
|
|
|
|
|
|
cricket::FeedbackParam(cricket::kRtcpFbParamNack,
|
|
|
|
|
|
cricket::kParamValueEmpty));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetNACK(channel_num1));
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetNACK(channel_num2));
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(voe_.GetNACK(channel_num1));
|
|
|
|
|
|
EXPECT_TRUE(voe_.GetNACK(channel_num2));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we can disable NACK.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].AddFeedbackParam(
|
|
|
|
|
|
cricket::FeedbackParam(cricket::kRtcpFbParamNack,
|
|
|
|
|
|
cricket::kParamValueEmpty));
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(voe_.GetNACK(channel_num));
|
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs.clear();
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetNACK(channel_num));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we can disable NACK on receive streams.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num1 = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
|
|
|
|
|
|
int channel_num2 = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].AddFeedbackParam(
|
|
|
|
|
|
cricket::FeedbackParam(cricket::kRtcpFbParamNack,
|
|
|
|
|
|
cricket::kParamValueEmpty));
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(voe_.GetNACK(channel_num1));
|
|
|
|
|
|
EXPECT_TRUE(voe_.GetNACK(channel_num2));
|
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs.clear();
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetNACK(channel_num1));
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetNACK(channel_num2));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that NACK is enabled on a new receive stream.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kCn16000Codec);
|
|
|
|
|
|
parameters.codecs[0].AddFeedbackParam(
|
|
|
|
|
|
cricket::FeedbackParam(cricket::kRtcpFbParamNack,
|
|
|
|
|
|
cricket::kParamValueEmpty));
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(voe_.GetNACK(channel_num));
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
|
|
|
|
|
|
channel_num = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_TRUE(voe_.GetNACK(channel_num));
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
|
|
|
|
|
|
channel_num = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_TRUE(voe_.GetNACK(channel_num));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2014-06-17 10:56:41 +00:00
|
|
|
|
// Test that without useinbandfec, Opus FEC is off.
|
2014-06-19 01:56:46 +00:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecNoOpusFec) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2014-06-17 10:56:41 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-06-17 10:56:41 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that with useinbandfec=0, Opus FEC is off.
|
2014-06-19 01:56:46 +00:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusDisableFec) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2014-06-17 10:56:41 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 0;
|
|
|
|
|
|
parameters.codecs[0].params["useinbandfec"] = "0";
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-06-17 10:56:41 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
|
|
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
|
|
|
|
|
EXPECT_EQ(1, gcodec.channels);
|
|
|
|
|
|
EXPECT_EQ(32000, gcodec.rate);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that with useinbandfec=1, Opus FEC is on.
|
2014-06-19 01:56:46 +00:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFec) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2014-06-17 10:56:41 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 0;
|
|
|
|
|
|
parameters.codecs[0].params["useinbandfec"] = "1";
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-06-17 10:56:41 +00:00
|
|
|
|
EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
|
|
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
|
|
|
|
|
EXPECT_EQ(1, gcodec.channels);
|
|
|
|
|
|
EXPECT_EQ(32000, gcodec.rate);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that with useinbandfec=1, stereo=1, Opus FEC is on.
|
2014-06-19 01:56:46 +00:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusEnableFecStereo) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2014-06-17 10:56:41 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 0;
|
|
|
|
|
|
parameters.codecs[0].params["stereo"] = "1";
|
|
|
|
|
|
parameters.codecs[0].params["useinbandfec"] = "1";
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-06-17 10:56:41 +00:00
|
|
|
|
EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
|
|
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
|
|
|
|
|
EXPECT_EQ(2, gcodec.channels);
|
|
|
|
|
|
EXPECT_EQ(64000, gcodec.rate);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that with non-Opus, codec FEC is off.
|
2014-06-19 01:56:46 +00:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacNoFec) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2014-06-17 10:56:41 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-06-17 10:56:41 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
|
|
|
|
|
|
}
|
2014-07-02 19:51:26 +00:00
|
|
|
|
|
|
|
|
|
|
// Test the with non-Opus, even if useinbandfec=1, FEC is off.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecIsacWithParamNoFec) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2014-07-02 19:51:26 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs[0].params["useinbandfec"] = "1";
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-07-02 19:51:26 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
|
|
|
|
|
|
}
|
2014-09-10 07:57:12 +00:00
|
|
|
|
|
|
|
|
|
|
// Test that Opus FEC status can be changed.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, ChangeOpusFecStatus) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2014-09-10 07:57:12 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-09-10 07:57:12 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetCodecFEC(channel_num));
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0].params["useinbandfec"] = "1";
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-09-10 07:57:12 +00:00
|
|
|
|
EXPECT_TRUE(voe_.GetCodecFEC(channel_num));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateNb) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2014-09-10 07:57:12 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 0;
|
|
|
|
|
|
parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-09-10 07:57:12 +00:00
|
|
|
|
EXPECT_EQ(cricket::kOpusBandwidthNb,
|
|
|
|
|
|
voe_.GetMaxEncodingBandwidth(channel_num));
|
|
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
2014-10-31 05:33:10 +00:00
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(12000, gcodec.rate);
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-10-31 05:33:10 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(24000, gcodec.rate);
|
2014-09-10 07:57:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateMb) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2014-09-10 07:57:12 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 0;
|
|
|
|
|
|
parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8001);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-09-10 07:57:12 +00:00
|
|
|
|
EXPECT_EQ(cricket::kOpusBandwidthMb,
|
|
|
|
|
|
voe_.GetMaxEncodingBandwidth(channel_num));
|
|
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
2014-10-31 05:33:10 +00:00
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(20000, gcodec.rate);
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-10-31 05:33:10 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(40000, gcodec.rate);
|
2014-09-10 07:57:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateWb) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2014-09-10 07:57:12 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 0;
|
|
|
|
|
|
parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 12001);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-09-10 07:57:12 +00:00
|
|
|
|
EXPECT_EQ(cricket::kOpusBandwidthWb,
|
|
|
|
|
|
voe_.GetMaxEncodingBandwidth(channel_num));
|
|
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
2014-10-31 05:33:10 +00:00
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(20000, gcodec.rate);
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-10-31 05:33:10 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(40000, gcodec.rate);
|
2014-09-10 07:57:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateSwb) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2014-09-10 07:57:12 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 0;
|
|
|
|
|
|
parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 16001);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-09-10 07:57:12 +00:00
|
|
|
|
EXPECT_EQ(cricket::kOpusBandwidthSwb,
|
|
|
|
|
|
voe_.GetMaxEncodingBandwidth(channel_num));
|
|
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
2014-10-31 05:33:10 +00:00
|
|
|
|
|
2014-09-10 07:57:12 +00:00
|
|
|
|
EXPECT_EQ(32000, gcodec.rate);
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-10-31 05:33:10 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(64000, gcodec.rate);
|
2014-09-10 07:57:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test 24000 < maxplaybackrate triggers Opus full band mode.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateFb) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2014-09-10 07:57:12 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].bitrate = 0;
|
|
|
|
|
|
parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 24001);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-09-10 07:57:12 +00:00
|
|
|
|
EXPECT_EQ(cricket::kOpusBandwidthFb,
|
|
|
|
|
|
voe_.GetMaxEncodingBandwidth(channel_num));
|
|
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
2014-10-31 05:33:10 +00:00
|
|
|
|
|
2014-09-10 07:57:12 +00:00
|
|
|
|
EXPECT_EQ(32000, gcodec.rate);
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0].SetParam(cricket::kCodecParamStereo, "1");
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-10-31 05:33:10 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(64000, gcodec.rate);
|
2014-09-10 07:57:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test Opus that without maxplaybackrate, default playback rate is used.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, DefaultOpusMaxPlaybackRate) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2014-09-10 07:57:12 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-09-10 07:57:12 +00:00
|
|
|
|
EXPECT_EQ(cricket::kOpusBandwidthFb,
|
|
|
|
|
|
voe_.GetMaxEncodingBandwidth(channel_num));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test the with non-Opus, maxplaybackrate has no effect.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetNonOpusMaxPlaybackRate) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2014-09-10 07:57:12 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 32000);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-09-10 07:57:12 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetMaxEncodingBandwidth(channel_num));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test maxplaybackrate can be set on two streams.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetOpusMaxPlaybackRateOnTwoStreams) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2014-09-10 07:57:12 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-09-10 07:57:12 +00:00
|
|
|
|
// Default bandwidth is 24000.
|
|
|
|
|
|
EXPECT_EQ(cricket::kOpusBandwidthFb,
|
|
|
|
|
|
voe_.GetMaxEncodingBandwidth(channel_num));
|
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0].SetParam(cricket::kCodecParamMaxPlaybackRate, 8000);
|
2014-09-10 07:57:12 +00:00
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-09-10 07:57:12 +00:00
|
|
|
|
EXPECT_EQ(cricket::kOpusBandwidthNb,
|
|
|
|
|
|
voe_.GetMaxEncodingBandwidth(channel_num));
|
|
|
|
|
|
|
|
|
|
|
|
channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc2));
|
|
|
|
|
|
channel_num = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_EQ(cricket::kOpusBandwidthNb,
|
|
|
|
|
|
voe_.GetMaxEncodingBandwidth(channel_num));
|
|
|
|
|
|
}
|
2014-06-17 10:56:41 +00:00
|
|
|
|
|
2015-03-27 05:05:59 +01:00
|
|
|
|
// Test that with usedtx=0, Opus DTX is off.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, DisableOpusDtxOnOpus) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-03-27 05:05:59 +01:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].params["usedtx"] = "0";
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2015-03-27 05:05:59 +01:00
|
|
|
|
EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that with usedtx=1, Opus DTX is on.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpus) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-03-27 05:05:59 +01:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].params["usedtx"] = "1";
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2015-03-27 05:05:59 +01:00
|
|
|
|
EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that usedtx=1 works with stereo Opus.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, EnableOpusDtxOnOpusStereo) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-03-27 05:05:59 +01:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].params["usedtx"] = "1";
|
|
|
|
|
|
parameters.codecs[0].params["stereo"] = "1";
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2015-03-27 05:05:59 +01:00
|
|
|
|
EXPECT_TRUE(voe_.GetOpusDtx(channel_num));
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetVAD(channel_num)); // Opus DTX should not affect VAD.
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that usedtx=1 does not work with non Opus.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, CannotEnableOpusDtxOnNonOpus) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-03-27 05:05:59 +01:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs[0].params["usedtx"] = "1";
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2015-03-27 05:05:59 +01:00
|
|
|
|
EXPECT_FALSE(voe_.GetOpusDtx(channel_num));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-02-17 12:36:41 +00:00
|
|
|
|
// Test that we can switch back and forth between Opus and ISAC with CN.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters opus_parameters;
|
|
|
|
|
|
opus_parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
2015-02-17 12:36:41 +00:00
|
|
|
|
EXPECT_EQ(111, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters isac_parameters;
|
|
|
|
|
|
isac_parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
isac_parameters.codecs.push_back(kCn16000Codec);
|
|
|
|
|
|
isac_parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(isac_parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(103, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(opus_parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
2015-02-17 12:36:41 +00:00
|
|
|
|
EXPECT_EQ(111, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we handle various ways of specifying bitrate.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec); // bitrate == 32000
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(103, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
|
|
|
|
|
EXPECT_EQ(32000, gcodec.rate);
|
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0].bitrate = 0; // bitrate == default
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(103, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
|
|
|
|
|
EXPECT_EQ(-1, gcodec.rate);
|
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0].bitrate = 28000; // bitrate == 28000
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(103, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
|
|
|
|
|
EXPECT_EQ(28000, gcodec.rate);
|
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0] = kPcmuCodec; // bitrate == 64000
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(0, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("PCMU", gcodec.plname);
|
|
|
|
|
|
EXPECT_EQ(64000, gcodec.rate);
|
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0].bitrate = 0; // bitrate == default
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(0, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("PCMU", gcodec.plname);
|
|
|
|
|
|
EXPECT_EQ(64000, gcodec.rate);
|
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0] = kOpusCodec;
|
|
|
|
|
|
parameters.codecs[0].bitrate = 0; // bitrate == default
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(111, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("opus", gcodec.plname);
|
|
|
|
|
|
EXPECT_EQ(32000, gcodec.rate);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-03-26 07:39:19 +08:00
|
|
|
|
// Test that we could set packet size specified in kCodecParamPTime.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsPTimeAsPacketSize) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-03-26 07:39:19 +08:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kOpusCodec);
|
|
|
|
|
|
parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2015-03-26 07:39:19 +08:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(1920, gcodec.pacsize); // Opus gets 40ms.
|
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 5); // Below range.
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2015-03-26 07:39:19 +08:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(480, gcodec.pacsize); // Opus gets 10ms.
|
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 80); // Beyond range.
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2015-03-26 07:39:19 +08:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(2880, gcodec.pacsize); // Opus gets 60ms.
|
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0] = kIsacCodec; // Also try Isac, with unsupported size.
|
|
|
|
|
|
parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40); // Within range.
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2015-03-26 07:39:19 +08:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(480, gcodec.pacsize); // Isac gets 30ms as the next smallest value.
|
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0] = kG722CodecSdp; // Try G722 @8kHz as negotiated in SDP.
|
|
|
|
|
|
parameters.codecs[0].SetParam(cricket::kCodecParamPTime, 40);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2015-03-26 07:39:19 +08:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(640, gcodec.pacsize); // G722 gets 40ms @16kHz as defined in VoE.
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2014-02-27 17:52:04 +00:00
|
|
|
|
// Test that we fail if no codecs are specified.
|
2013-07-10 00:45:36 +00:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
EXPECT_FALSE(channel_->SetSendParameters(parameters));
|
2014-02-27 17:52:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we can set send codecs even with telephone-event codec as the first
|
|
|
|
|
|
// one on the list.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kTelephoneEventCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
parameters.codecs[0].id = 98; // DTMF
|
|
|
|
|
|
parameters.codecs[1].id = 96;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
2014-02-27 17:52:04 +00:00
|
|
|
|
EXPECT_EQ(96, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
2015-12-04 15:22:19 +01:00
|
|
|
|
EXPECT_TRUE(channel_->CanInsertDtmf());
|
2014-02-27 17:52:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we can set send codecs even with CN codec as the first
|
|
|
|
|
|
// one on the list.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2014-02-27 17:52:04 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kCn16000Codec);
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
parameters.codecs[0].id = 98; // wideband CN
|
|
|
|
|
|
parameters.codecs[1].id = 96;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-02-27 17:52:04 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(96, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
|
|
|
|
|
EXPECT_EQ(98, voe_.GetSendCNPayloadType(channel_num, true));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2013-08-30 21:24:16 +00:00
|
|
|
|
// Test that we set VAD and DTMF types correctly as caller.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
// TODO(juberti): cn 32000
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs.push_back(kCn16000Codec);
|
|
|
|
|
|
parameters.codecs.push_back(kCn8000Codec);
|
|
|
|
|
|
parameters.codecs.push_back(kTelephoneEventCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kRedCodec);
|
|
|
|
|
|
parameters.codecs[0].id = 96;
|
|
|
|
|
|
parameters.codecs[2].id = 97; // wideband CN
|
|
|
|
|
|
parameters.codecs[4].id = 98; // DTMF
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(96, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
|
|
|
|
|
EXPECT_TRUE(voe_.GetVAD(channel_num));
|
2014-06-17 10:56:41 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetRED(channel_num));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
|
|
|
|
|
|
EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
|
2015-12-04 15:22:19 +01:00
|
|
|
|
EXPECT_TRUE(channel_->CanInsertDtmf());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2013-08-30 21:24:16 +00:00
|
|
|
|
// Test that we set VAD and DTMF types correctly as callee.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
|
2014-07-29 17:36:52 +00:00
|
|
|
|
EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
|
2015-09-15 12:26:33 +02:00
|
|
|
|
channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
|
2015-05-29 15:05:44 +02:00
|
|
|
|
EXPECT_TRUE(channel_ != nullptr);
|
2013-08-30 21:24:16 +00:00
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
2013-08-30 21:24:16 +00:00
|
|
|
|
// TODO(juberti): cn 32000
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs.push_back(kCn16000Codec);
|
|
|
|
|
|
parameters.codecs.push_back(kCn8000Codec);
|
|
|
|
|
|
parameters.codecs.push_back(kTelephoneEventCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kRedCodec);
|
|
|
|
|
|
parameters.codecs[0].id = 96;
|
|
|
|
|
|
parameters.codecs[2].id = 97; // wideband CN
|
|
|
|
|
|
parameters.codecs[4].id = 98; // DTMF
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-08-30 21:24:16 +00:00
|
|
|
|
EXPECT_TRUE(channel_->AddSendStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc1)));
|
2015-10-20 15:49:38 -07:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2013-08-30 21:24:16 +00:00
|
|
|
|
|
|
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(96, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
|
|
|
|
|
EXPECT_TRUE(voe_.GetVAD(channel_num));
|
2014-06-17 10:56:41 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetRED(channel_num));
|
2013-08-30 21:24:16 +00:00
|
|
|
|
EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
|
|
|
|
|
|
EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
|
2015-12-04 15:22:19 +01:00
|
|
|
|
EXPECT_TRUE(channel_->CanInsertDtmf());
|
2013-08-30 21:24:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2013-07-10 00:45:36 +00:00
|
|
|
|
// Test that we only apply VAD if we have a CN codec that matches the
|
|
|
|
|
|
// send codec clockrate.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
2013-07-10 00:45:36 +00:00
|
|
|
|
// Set ISAC(16K) and CN(16K). VAD should be activated.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kCn16000Codec);
|
|
|
|
|
|
parameters.codecs[1].id = 97;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
|
|
|
|
|
EXPECT_TRUE(voe_.GetVAD(channel_num));
|
|
|
|
|
|
EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
|
|
|
|
|
|
// Set PCMU(8K) and CN(16K). VAD should not be activated.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0] = kPcmuCodec;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("PCMU", gcodec.plname);
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetVAD(channel_num));
|
|
|
|
|
|
// Set PCMU(8K) and CN(8K). VAD should be activated.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[1] = kCn8000Codec;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("PCMU", gcodec.plname);
|
|
|
|
|
|
EXPECT_TRUE(voe_.GetVAD(channel_num));
|
|
|
|
|
|
EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
|
2015-03-26 07:39:19 +08:00
|
|
|
|
// Set ISAC(16K) and CN(8K). VAD should not be activated.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0] = kIsacCodec;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetVAD(channel_num));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we perform case-insensitive matching of codec names.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kCn16000Codec);
|
|
|
|
|
|
parameters.codecs.push_back(kCn8000Codec);
|
|
|
|
|
|
parameters.codecs.push_back(kTelephoneEventCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kRedCodec);
|
|
|
|
|
|
parameters.codecs[0].name = "iSaC";
|
|
|
|
|
|
parameters.codecs[0].id = 96;
|
|
|
|
|
|
parameters.codecs[2].id = 97; // wideband CN
|
|
|
|
|
|
parameters.codecs[4].id = 98; // DTMF
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(96, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
|
|
|
|
|
EXPECT_TRUE(voe_.GetVAD(channel_num));
|
2014-06-17 10:56:41 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetRED(channel_num));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_EQ(13, voe_.GetSendCNPayloadType(channel_num, false));
|
|
|
|
|
|
EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
|
2015-12-04 15:22:19 +01:00
|
|
|
|
EXPECT_TRUE(channel_->CanInsertDtmf());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2014-06-17 10:56:41 +00:00
|
|
|
|
// Test that we set up RED correctly as caller.
|
2013-08-30 21:24:16 +00:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCaller) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kRedCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
parameters.codecs[0].id = 127;
|
|
|
|
|
|
parameters.codecs[0].params[""] = "96/96";
|
|
|
|
|
|
parameters.codecs[1].id = 96;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(96, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
2014-06-17 10:56:41 +00:00
|
|
|
|
EXPECT_TRUE(voe_.GetRED(channel_num));
|
|
|
|
|
|
EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2014-06-17 10:56:41 +00:00
|
|
|
|
// Test that we set up RED correctly as callee.
|
2013-08-30 21:24:16 +00:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDAsCallee) {
|
2014-07-29 17:36:52 +00:00
|
|
|
|
EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
|
2015-09-15 12:26:33 +02:00
|
|
|
|
channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
|
2015-05-29 15:05:44 +02:00
|
|
|
|
EXPECT_TRUE(channel_ != nullptr);
|
2013-08-30 21:24:16 +00:00
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kRedCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
parameters.codecs[0].id = 127;
|
|
|
|
|
|
parameters.codecs[0].params[""] = "96/96";
|
|
|
|
|
|
parameters.codecs[1].id = 96;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-08-30 21:24:16 +00:00
|
|
|
|
EXPECT_TRUE(channel_->AddSendStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc1)));
|
2015-10-20 15:49:38 -07:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2013-08-30 21:24:16 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(96, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
2014-06-17 10:56:41 +00:00
|
|
|
|
EXPECT_TRUE(voe_.GetRED(channel_num));
|
|
|
|
|
|
EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
|
2013-08-30 21:24:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2014-06-17 10:56:41 +00:00
|
|
|
|
// Test that we set up RED correctly if params are omitted.
|
2013-07-10 00:45:36 +00:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsREDNoParams) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kRedCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
parameters.codecs[0].id = 127;
|
|
|
|
|
|
parameters.codecs[1].id = 96;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(96, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
2014-06-17 10:56:41 +00:00
|
|
|
|
EXPECT_TRUE(voe_.GetRED(channel_num));
|
|
|
|
|
|
EXPECT_EQ(127, voe_.GetSendREDPayloadType(channel_num));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we ignore RED if the parameters aren't named the way we expect.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED1) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kRedCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
parameters.codecs[0].id = 127;
|
|
|
|
|
|
parameters.codecs[0].params["ABC"] = "96/96";
|
|
|
|
|
|
parameters.codecs[1].id = 96;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(96, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
2014-06-17 10:56:41 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetRED(channel_num));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we ignore RED if it uses different primary/secondary encoding.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED2) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kRedCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
parameters.codecs[0].id = 127;
|
|
|
|
|
|
parameters.codecs[0].params[""] = "96/0";
|
|
|
|
|
|
parameters.codecs[1].id = 96;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(96, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
2014-06-17 10:56:41 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetRED(channel_num));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we ignore RED if it uses more than 2 encodings.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED3) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kRedCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
parameters.codecs[0].id = 127;
|
|
|
|
|
|
parameters.codecs[0].params[""] = "96/96/96";
|
|
|
|
|
|
parameters.codecs[1].id = 96;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(96, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
2014-06-17 10:56:41 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetRED(channel_num));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we ignore RED if it has bogus codec ids.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED4) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kRedCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
parameters.codecs[0].id = 127;
|
|
|
|
|
|
parameters.codecs[0].params[""] = "ABC/ABC";
|
|
|
|
|
|
parameters.codecs[1].id = 96;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(96, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
2014-06-17 10:56:41 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetRED(channel_num));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we ignore RED if it refers to a codec that is not present.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBadRED5) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kRedCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
parameters.codecs[0].id = 127;
|
|
|
|
|
|
parameters.codecs[0].params[""] = "97/97";
|
|
|
|
|
|
parameters.codecs[1].id = 96;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
webrtc::CodecInst gcodec;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_EQ(96, gcodec.pltype);
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
2014-06-17 10:56:41 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetRED(channel_num));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2014-05-06 15:54:38 +00:00
|
|
|
|
// Test support for audio level header extension.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
|
|
|
|
|
|
TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
|
|
|
|
|
|
}
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
|
|
|
|
|
|
TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2014-05-06 15:54:38 +00:00
|
|
|
|
// Test support for absolute send time header extension.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
|
|
|
|
|
|
TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
|
|
|
|
|
|
}
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
|
|
|
|
|
|
TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2015-10-13 03:58:19 -07:00
|
|
|
|
// Test that we can create a channel and start sending on it.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, Send) {
|
|
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
|
|
|
|
|
|
EXPECT_TRUE(voe_.GetSend(channel_num));
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetSend(channel_num));
|
2015-10-13 03:58:19 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we can create a channel and start playing out on it.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, Playout) {
|
|
|
|
|
|
EXPECT_TRUE(SetupEngineWithRecvStream());
|
|
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetPlayout(true));
|
|
|
|
|
|
EXPECT_TRUE(voe_.GetPlayout(channel_num));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(channel_->SetPlayout(false));
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetPlayout(channel_num));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-08-05 20:36:57 +00:00
|
|
|
|
// Test that we can add and remove send streams.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
|
|
|
|
|
|
SetupForMultiSendStream();
|
|
|
|
|
|
|
|
|
|
|
|
// Set the global state for sending.
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
|
|
|
|
|
|
|
2015-10-21 13:01:53 -07:00
|
|
|
|
for (uint32_t ssrc : kSsrcs4) {
|
2013-08-05 20:36:57 +00:00
|
|
|
|
EXPECT_TRUE(channel_->AddSendStream(
|
2015-10-21 13:01:53 -07:00
|
|
|
|
cricket::StreamParams::CreateLegacy(ssrc)));
|
2013-08-05 20:36:57 +00:00
|
|
|
|
// Verify that we are in a sending state for all the created streams.
|
2015-11-16 07:34:50 -08:00
|
|
|
|
EXPECT_TRUE(voe_.GetSend(GetSendStreamConfig(ssrc).voe_channel_id));
|
2013-08-05 20:36:57 +00:00
|
|
|
|
}
|
2015-11-10 23:44:30 -08:00
|
|
|
|
EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
|
2013-08-05 20:36:57 +00:00
|
|
|
|
|
2015-10-21 13:01:53 -07:00
|
|
|
|
// Delete the send streams.
|
|
|
|
|
|
for (uint32_t ssrc : kSsrcs4) {
|
|
|
|
|
|
EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
|
2015-11-16 07:34:50 -08:00
|
|
|
|
EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
|
2015-10-21 13:01:53 -07:00
|
|
|
|
EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
|
2013-08-05 20:36:57 +00:00
|
|
|
|
}
|
2015-10-21 13:01:53 -07:00
|
|
|
|
EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
|
2013-08-05 20:36:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test SetSendCodecs correctly configure the codecs in all send streams.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
|
|
|
|
|
|
SetupForMultiSendStream();
|
|
|
|
|
|
|
|
|
|
|
|
// Create send streams.
|
2015-10-21 13:01:53 -07:00
|
|
|
|
for (uint32_t ssrc : kSsrcs4) {
|
2013-08-05 20:36:57 +00:00
|
|
|
|
EXPECT_TRUE(channel_->AddSendStream(
|
2015-10-21 13:01:53 -07:00
|
|
|
|
cricket::StreamParams::CreateLegacy(ssrc)));
|
2013-08-05 20:36:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters;
|
2013-08-05 20:36:57 +00:00
|
|
|
|
// Set ISAC(16K) and CN(16K). VAD should be activated.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kCn16000Codec);
|
|
|
|
|
|
parameters.codecs[1].id = 97;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2013-08-05 20:36:57 +00:00
|
|
|
|
|
|
|
|
|
|
// Verify ISAC and VAD are corrected configured on all send channels.
|
|
|
|
|
|
webrtc::CodecInst gcodec;
|
2015-10-21 13:01:53 -07:00
|
|
|
|
for (uint32_t ssrc : kSsrcs4) {
|
2015-11-16 07:34:50 -08:00
|
|
|
|
int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
|
2013-08-05 20:36:57 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("ISAC", gcodec.plname);
|
|
|
|
|
|
EXPECT_TRUE(voe_.GetVAD(channel_num));
|
|
|
|
|
|
EXPECT_EQ(97, voe_.GetSendCNPayloadType(channel_num, true));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Change to PCMU(8K) and CN(16K). VAD should not be activated.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
parameters.codecs[0] = kPcmuCodec;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2015-10-21 13:01:53 -07:00
|
|
|
|
for (uint32_t ssrc : kSsrcs4) {
|
2015-11-16 07:34:50 -08:00
|
|
|
|
int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
|
2013-08-05 20:36:57 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetSendCodec(channel_num, gcodec));
|
|
|
|
|
|
EXPECT_STREQ("PCMU", gcodec.plname);
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetVAD(channel_num));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test we can SetSend on all send streams correctly.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
|
|
|
|
|
|
SetupForMultiSendStream();
|
|
|
|
|
|
|
|
|
|
|
|
// Create the send channels and they should be a SEND_NOTHING date.
|
2015-10-21 13:01:53 -07:00
|
|
|
|
for (uint32_t ssrc : kSsrcs4) {
|
2013-08-05 20:36:57 +00:00
|
|
|
|
EXPECT_TRUE(channel_->AddSendStream(
|
2015-10-21 13:01:53 -07:00
|
|
|
|
cricket::StreamParams::CreateLegacy(ssrc)));
|
2013-08-05 20:36:57 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetSend(channel_num));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Set the global state for starting sending.
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
|
2015-10-21 13:01:53 -07:00
|
|
|
|
for (uint32_t ssrc : kSsrcs4) {
|
2013-08-05 20:36:57 +00:00
|
|
|
|
// Verify that we are in a sending state for all the send streams.
|
2015-11-16 07:34:50 -08:00
|
|
|
|
int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
|
2013-08-05 20:36:57 +00:00
|
|
|
|
EXPECT_TRUE(voe_.GetSend(channel_num));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Set the global state for stopping sending.
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
|
2015-10-21 13:01:53 -07:00
|
|
|
|
for (uint32_t ssrc : kSsrcs4) {
|
2013-08-05 20:36:57 +00:00
|
|
|
|
// Verify that we are in a stop state for all the send streams.
|
2015-11-16 07:34:50 -08:00
|
|
|
|
int channel_num = GetSendStreamConfig(ssrc).voe_channel_id;
|
2013-08-05 20:36:57 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetSend(channel_num));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test we can set the correct statistics on all send streams.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
|
|
|
|
|
|
SetupForMultiSendStream();
|
|
|
|
|
|
|
|
|
|
|
|
// Create send streams.
|
2015-10-21 13:01:53 -07:00
|
|
|
|
for (uint32_t ssrc : kSsrcs4) {
|
2013-08-05 20:36:57 +00:00
|
|
|
|
EXPECT_TRUE(channel_->AddSendStream(
|
2015-10-21 13:01:53 -07:00
|
|
|
|
cricket::StreamParams::CreateLegacy(ssrc)));
|
2013-08-05 20:36:57 +00:00
|
|
|
|
}
|
2015-10-27 03:35:21 -07:00
|
|
|
|
SetAudioSendStreamStats();
|
|
|
|
|
|
|
2014-06-13 01:14:01 +00:00
|
|
|
|
// Create a receive stream to check that none of the send streams end up in
|
|
|
|
|
|
// the receive stream stats.
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc2)));
|
2013-08-05 20:36:57 +00:00
|
|
|
|
// We need send codec to be set to get all stats.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
|
2013-08-05 20:36:57 +00:00
|
|
|
|
|
2015-10-27 03:35:21 -07:00
|
|
|
|
// Check stats for the added streams.
|
|
|
|
|
|
{
|
|
|
|
|
|
cricket::VoiceMediaInfo info;
|
|
|
|
|
|
EXPECT_EQ(true, channel_->GetStats(&info));
|
2015-10-13 03:58:19 -07:00
|
|
|
|
|
2015-10-27 03:35:21 -07:00
|
|
|
|
// We have added 4 send streams. We should see empty stats for all.
|
2015-11-10 23:44:30 -08:00
|
|
|
|
EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
|
2015-10-27 03:35:21 -07:00
|
|
|
|
for (const auto& sender : info.senders) {
|
2015-11-06 15:34:49 -08:00
|
|
|
|
VerifyVoiceSenderInfo(sender, false);
|
2015-10-27 03:35:21 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// We have added one receive stream. We should see empty stats.
|
|
|
|
|
|
EXPECT_EQ(info.receivers.size(), 1u);
|
|
|
|
|
|
EXPECT_EQ(info.receivers[0].ssrc(), 0);
|
|
|
|
|
|
}
|
2015-10-22 10:49:27 +02:00
|
|
|
|
|
|
|
|
|
|
// Remove the kSsrc2 stream. No receiver stats.
|
2015-10-27 03:35:21 -07:00
|
|
|
|
{
|
|
|
|
|
|
cricket::VoiceMediaInfo info;
|
|
|
|
|
|
EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
|
|
|
|
|
|
EXPECT_EQ(true, channel_->GetStats(&info));
|
2015-11-10 23:44:30 -08:00
|
|
|
|
EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
|
2015-10-27 03:35:21 -07:00
|
|
|
|
EXPECT_EQ(0u, info.receivers.size());
|
|
|
|
|
|
}
|
2014-06-13 01:14:01 +00:00
|
|
|
|
|
2015-10-22 10:49:27 +02:00
|
|
|
|
// Deliver a new packet - a default receive stream should be created and we
|
|
|
|
|
|
// should see stats again.
|
2015-10-27 03:35:21 -07:00
|
|
|
|
{
|
|
|
|
|
|
cricket::VoiceMediaInfo info;
|
|
|
|
|
|
DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
|
|
|
|
|
|
SetAudioReceiveStreamStats();
|
|
|
|
|
|
EXPECT_EQ(true, channel_->GetStats(&info));
|
2015-11-10 23:44:30 -08:00
|
|
|
|
EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
|
2015-10-27 03:35:21 -07:00
|
|
|
|
EXPECT_EQ(1u, info.receivers.size());
|
|
|
|
|
|
VerifyVoiceReceiverInfo(info.receivers[0]);
|
|
|
|
|
|
}
|
2013-08-05 20:36:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we can add and remove receive streams, and do proper send/playout.
|
|
|
|
|
|
// We can receive on multiple streams while sending one stream.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num1 = voe_.GetLastChannel();
|
|
|
|
|
|
|
2015-10-13 03:58:19 -07:00
|
|
|
|
// Start playout without a receive stream.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(channel_->SetPlayout(true));
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_FALSE(voe_.GetPlayout(channel_num1));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
2015-10-13 03:58:19 -07:00
|
|
|
|
// Adding another stream should enable playout on the new stream only.
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
|
|
|
|
|
|
int channel_num2 = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
|
|
|
|
|
|
EXPECT_TRUE(voe_.GetSend(channel_num1));
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetSend(channel_num2));
|
|
|
|
|
|
|
2015-10-13 03:58:19 -07:00
|
|
|
|
// Make sure only the new stream is played out.
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_FALSE(voe_.GetPlayout(channel_num1));
|
|
|
|
|
|
EXPECT_TRUE(voe_.GetPlayout(channel_num2));
|
|
|
|
|
|
|
|
|
|
|
|
// Adding yet another stream should have stream 2 and 3 enabled for playout.
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
|
|
|
|
|
|
int channel_num3 = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetPlayout(channel_num1));
|
|
|
|
|
|
EXPECT_TRUE(voe_.GetPlayout(channel_num2));
|
|
|
|
|
|
EXPECT_TRUE(voe_.GetPlayout(channel_num3));
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetSend(channel_num3));
|
|
|
|
|
|
|
|
|
|
|
|
// Stop sending.
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetSend(channel_num1));
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetSend(channel_num2));
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetSend(channel_num3));
|
|
|
|
|
|
|
|
|
|
|
|
// Stop playout.
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetPlayout(false));
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetPlayout(channel_num1));
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetPlayout(channel_num2));
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetPlayout(channel_num3));
|
|
|
|
|
|
|
2015-10-13 03:58:19 -07:00
|
|
|
|
// Restart playout and make sure only recv streams are played out.
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(channel_->SetPlayout(true));
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetPlayout(channel_num1));
|
|
|
|
|
|
EXPECT_TRUE(voe_.GetPlayout(channel_num2));
|
|
|
|
|
|
EXPECT_TRUE(voe_.GetPlayout(channel_num3));
|
|
|
|
|
|
|
2015-10-13 03:58:19 -07:00
|
|
|
|
// Now remove the recv streams and verify that the send stream doesn't play.
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(channel_->RemoveRecvStream(3));
|
|
|
|
|
|
EXPECT_TRUE(channel_->RemoveRecvStream(2));
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_FALSE(voe_.GetPlayout(channel_num1));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we can create a channel configured for Codian bridges,
|
2015-10-13 03:58:19 -07:00
|
|
|
|
// and start sending on it.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
|
|
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-12-08 09:50:23 -08:00
|
|
|
|
cricket::AudioOptions options_adjust_agc;
|
|
|
|
|
|
options_adjust_agc.adjust_agc_delta = rtc::Optional<int>(-10);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
|
|
|
|
|
webrtc::AgcConfig agc_config;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
|
|
|
|
|
|
EXPECT_EQ(0, agc_config.targetLeveldBOv);
|
2015-12-08 09:50:23 -08:00
|
|
|
|
send_parameters_.options = options_adjust_agc;
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
|
|
|
|
|
|
EXPECT_TRUE(voe_.GetSend(channel_num));
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
|
|
|
|
|
|
EXPECT_EQ(agc_config.targetLeveldBOv, 10); // level was attenuated
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSend(cricket::SEND_NOTHING));
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetSend(channel_num));
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-10-25 21:18:33 +00:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-10-25 21:18:33 +00:00
|
|
|
|
webrtc::AgcConfig agc_config;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
|
|
|
|
|
|
EXPECT_EQ(0, agc_config.targetLeveldBOv);
|
2015-12-08 09:50:23 -08:00
|
|
|
|
send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
|
|
|
|
|
|
send_parameters_.options.tx_agc_digital_compression_gain =
|
|
|
|
|
|
rtc::Optional<uint16_t>(9);
|
|
|
|
|
|
send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
|
|
|
|
|
|
send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2013-10-25 21:18:33 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
|
|
|
|
|
|
EXPECT_EQ(3, agc_config.targetLeveldBOv);
|
|
|
|
|
|
EXPECT_EQ(9, agc_config.digitalCompressionGaindB);
|
|
|
|
|
|
EXPECT_TRUE(agc_config.limiterEnable);
|
|
|
|
|
|
|
|
|
|
|
|
// Check interaction with adjust_agc_delta. Both should be respected, for
|
|
|
|
|
|
// backwards compatibility.
|
2015-12-08 09:50:23 -08:00
|
|
|
|
send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2013-10-25 21:18:33 +00:00
|
|
|
|
EXPECT_EQ(0, voe_.GetAgcConfig(agc_config));
|
|
|
|
|
|
EXPECT_EQ(13, agc_config.targetLeveldBOv);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-12-08 09:50:23 -08:00
|
|
|
|
send_parameters_.options.recording_sample_rate =
|
|
|
|
|
|
rtc::Optional<uint32_t>(48000);
|
|
|
|
|
|
send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2013-10-25 21:18:33 +00:00
|
|
|
|
|
|
|
|
|
|
unsigned int recording_sample_rate, playout_sample_rate;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.RecordingSampleRate(&recording_sample_rate));
|
|
|
|
|
|
EXPECT_EQ(0, voe_.PlayoutSampleRate(&playout_sample_rate));
|
|
|
|
|
|
EXPECT_EQ(48000u, recording_sample_rate);
|
|
|
|
|
|
EXPECT_EQ(44100u, playout_sample_rate);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-07-10 00:45:36 +00:00
|
|
|
|
// Test that we can set the outgoing SSRC properly.
|
|
|
|
|
|
// SSRC is set in SetupEngine by calling AddSendStream.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-11-16 07:34:50 -08:00
|
|
|
|
EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
|
|
|
|
|
|
// Setup. We need send codec to be set to get all stats.
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-10-27 03:35:21 -07:00
|
|
|
|
SetAudioSendStreamStats();
|
2015-10-13 03:58:19 -07:00
|
|
|
|
// SetupEngineWithSendStream adds a send stream with kSsrc1, so the receive
|
|
|
|
|
|
// stream has to use a different SSRC.
|
2014-06-13 01:14:01 +00:00
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc2)));
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
2015-10-27 03:35:21 -07:00
|
|
|
|
// Check stats for the added streams.
|
|
|
|
|
|
{
|
|
|
|
|
|
cricket::VoiceMediaInfo info;
|
|
|
|
|
|
EXPECT_EQ(true, channel_->GetStats(&info));
|
|
|
|
|
|
|
|
|
|
|
|
// We have added one send stream. We should see the stats we've set.
|
|
|
|
|
|
EXPECT_EQ(1u, info.senders.size());
|
2015-11-06 15:34:49 -08:00
|
|
|
|
VerifyVoiceSenderInfo(info.senders[0], false);
|
2015-10-27 03:35:21 -07:00
|
|
|
|
// We have added one receive stream. We should see empty stats.
|
|
|
|
|
|
EXPECT_EQ(info.receivers.size(), 1u);
|
|
|
|
|
|
EXPECT_EQ(info.receivers[0].ssrc(), 0);
|
|
|
|
|
|
}
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
2015-11-06 15:34:49 -08:00
|
|
|
|
// Start sending - this affects some reported stats.
|
|
|
|
|
|
{
|
|
|
|
|
|
cricket::VoiceMediaInfo info;
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
|
|
|
|
|
|
EXPECT_EQ(true, channel_->GetStats(&info));
|
|
|
|
|
|
VerifyVoiceSenderInfo(info.senders[0], true);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-10-22 10:49:27 +02:00
|
|
|
|
// Remove the kSsrc2 stream. No receiver stats.
|
2015-10-27 03:35:21 -07:00
|
|
|
|
{
|
|
|
|
|
|
cricket::VoiceMediaInfo info;
|
|
|
|
|
|
EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc2));
|
|
|
|
|
|
EXPECT_EQ(true, channel_->GetStats(&info));
|
|
|
|
|
|
EXPECT_EQ(1u, info.senders.size());
|
|
|
|
|
|
EXPECT_EQ(0u, info.receivers.size());
|
|
|
|
|
|
}
|
2015-10-13 03:58:19 -07:00
|
|
|
|
|
2015-10-22 10:49:27 +02:00
|
|
|
|
// Deliver a new packet - a default receive stream should be created and we
|
|
|
|
|
|
// should see stats again.
|
2015-10-27 03:35:21 -07:00
|
|
|
|
{
|
|
|
|
|
|
cricket::VoiceMediaInfo info;
|
|
|
|
|
|
DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
|
|
|
|
|
|
SetAudioReceiveStreamStats();
|
|
|
|
|
|
EXPECT_EQ(true, channel_->GetStats(&info));
|
|
|
|
|
|
EXPECT_EQ(1u, info.senders.size());
|
|
|
|
|
|
EXPECT_EQ(1u, info.receivers.size());
|
|
|
|
|
|
VerifyVoiceReceiverInfo(info.receivers[0]);
|
|
|
|
|
|
}
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we can set the outgoing SSRC properly with multiple streams.
|
|
|
|
|
|
// SSRC is set in SetupEngine by calling AddSendStream.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-11-16 07:34:50 -08:00
|
|
|
|
EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
|
2015-11-20 09:59:34 -08:00
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc2)));
|
|
|
|
|
|
EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that the local SSRC is the same on sending and receiving channels if the
|
|
|
|
|
|
// receive channel is created before the send channel.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
|
2014-07-29 17:36:52 +00:00
|
|
|
|
EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
|
2015-09-15 12:26:33 +02:00
|
|
|
|
channel_ = engine_.CreateChannel(&call_, cricket::AudioOptions());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
|
|
|
|
|
|
int receive_channel_num = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddSendStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(1234)));
|
|
|
|
|
|
|
2015-11-16 07:34:50 -08:00
|
|
|
|
EXPECT_TRUE(call_.GetAudioSendStream(1234));
|
2015-10-27 03:35:21 -07:00
|
|
|
|
EXPECT_EQ(1234U, voe_.GetLocalSSRC(receive_channel_num));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we can properly receive packets.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, Recv) {
|
|
|
|
|
|
EXPECT_TRUE(SetupEngine());
|
2015-11-20 00:19:43 -08:00
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
|
2015-10-13 03:58:19 -07:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
2015-11-20 00:19:43 -08:00
|
|
|
|
EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we can properly receive packets on multiple streams.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
|
2015-11-20 00:19:43 -08:00
|
|
|
|
EXPECT_TRUE(SetupEngine());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
|
|
|
|
|
|
int channel_num1 = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
|
|
|
|
|
|
int channel_num2 = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
|
|
|
|
|
|
int channel_num3 = voe_.GetLastChannel();
|
|
|
|
|
|
// Create packets with the right SSRCs.
|
|
|
|
|
|
char packets[4][sizeof(kPcmuFrame)];
|
2015-11-10 23:44:30 -08:00
|
|
|
|
for (size_t i = 0; i < arraysize(packets); ++i) {
|
2013-07-10 00:45:36 +00:00
|
|
|
|
memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
|
rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
|
|
|
|
|
|
EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
|
|
|
|
|
|
EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
|
2015-11-20 00:19:43 -08:00
|
|
|
|
|
2013-07-10 00:45:36 +00:00
|
|
|
|
DeliverPacket(packets[0], sizeof(packets[0]));
|
|
|
|
|
|
EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
|
|
|
|
|
|
EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
|
|
|
|
|
|
EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
|
2015-11-20 00:19:43 -08:00
|
|
|
|
|
2013-07-10 00:45:36 +00:00
|
|
|
|
DeliverPacket(packets[1], sizeof(packets[1]));
|
2015-11-20 00:19:43 -08:00
|
|
|
|
EXPECT_TRUE(voe_.CheckPacket(channel_num1, packets[1], sizeof(packets[1])));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
|
|
|
|
|
|
EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
|
2015-11-20 00:19:43 -08:00
|
|
|
|
|
2013-07-10 00:45:36 +00:00
|
|
|
|
DeliverPacket(packets[2], sizeof(packets[2]));
|
|
|
|
|
|
EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
|
2015-11-20 00:19:43 -08:00
|
|
|
|
EXPECT_TRUE(voe_.CheckPacket(channel_num2, packets[2], sizeof(packets[2])));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(voe_.CheckNoPacket(channel_num3));
|
2015-11-20 00:19:43 -08:00
|
|
|
|
|
2013-07-10 00:45:36 +00:00
|
|
|
|
DeliverPacket(packets[3], sizeof(packets[3]));
|
|
|
|
|
|
EXPECT_TRUE(voe_.CheckNoPacket(channel_num1));
|
|
|
|
|
|
EXPECT_TRUE(voe_.CheckNoPacket(channel_num2));
|
2015-11-20 00:19:43 -08:00
|
|
|
|
EXPECT_TRUE(voe_.CheckPacket(channel_num3, packets[3], sizeof(packets[3])));
|
|
|
|
|
|
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(channel_->RemoveRecvStream(3));
|
|
|
|
|
|
EXPECT_TRUE(channel_->RemoveRecvStream(2));
|
|
|
|
|
|
EXPECT_TRUE(channel_->RemoveRecvStream(1));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-11-20 00:19:43 -08:00
|
|
|
|
// Test that receiving on an unsignalled stream works (default channel will be
|
|
|
|
|
|
// created).
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalled) {
|
|
|
|
|
|
EXPECT_TRUE(SetupEngine());
|
|
|
|
|
|
DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
|
|
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_TRUE(voe_.CheckPacket(channel_num, kPcmuFrame, sizeof(kPcmuFrame)));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that receiving on an unsignalled stream works (default channel will be
|
|
|
|
|
|
// created), and that packets will be forwarded to the default channel
|
|
|
|
|
|
// regardless of their SSRCs.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledWithSsrcSwitch) {
|
|
|
|
|
|
EXPECT_TRUE(SetupEngine());
|
|
|
|
|
|
char packet[sizeof(kPcmuFrame)];
|
|
|
|
|
|
memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
|
|
|
|
|
|
|
|
|
|
|
|
// Note that the first unknown SSRC cannot be 0, because we only support
|
|
|
|
|
|
// creating receive streams for SSRC!=0.
|
|
|
|
|
|
DeliverPacket(packet, sizeof(packet));
|
|
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
|
|
|
|
|
|
// Once we have the default channel, SSRC==0 will be ok.
|
|
|
|
|
|
for (uint32_t ssrc = 0; ssrc < 10; ++ssrc) {
|
|
|
|
|
|
rtc::SetBE32(&packet[8], ssrc);
|
|
|
|
|
|
DeliverPacket(packet, sizeof(packet));
|
|
|
|
|
|
EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that a default channel is created even after a signalled stream has been
|
|
|
|
|
|
// added, and that this stream will get any packets for unknown SSRCs.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
|
|
|
|
|
|
EXPECT_TRUE(SetupEngine());
|
|
|
|
|
|
char packet[sizeof(kPcmuFrame)];
|
|
|
|
|
|
memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
|
|
|
|
|
|
|
|
|
|
|
|
// Add a known stream, send packet and verify we got it.
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
|
|
|
|
|
|
int signalled_channel_num = voe_.GetLastChannel();
|
|
|
|
|
|
DeliverPacket(packet, sizeof(packet));
|
|
|
|
|
|
EXPECT_TRUE(voe_.CheckPacket(signalled_channel_num, packet, sizeof(packet)));
|
|
|
|
|
|
|
|
|
|
|
|
// Note that the first unknown SSRC cannot be 0, because we only support
|
|
|
|
|
|
// creating receive streams for SSRC!=0.
|
|
|
|
|
|
rtc::SetBE32(&packet[8], 7011);
|
|
|
|
|
|
DeliverPacket(packet, sizeof(packet));
|
|
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_NE(channel_num, signalled_channel_num);
|
|
|
|
|
|
EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
|
|
|
|
|
|
// Once we have the default channel, SSRC==0 will be ok.
|
|
|
|
|
|
for (uint32_t ssrc = 0; ssrc < 20; ssrc += 2) {
|
|
|
|
|
|
rtc::SetBE32(&packet[8], ssrc);
|
|
|
|
|
|
DeliverPacket(packet, sizeof(packet));
|
|
|
|
|
|
EXPECT_TRUE(voe_.CheckPacket(channel_num, packet, sizeof(packet)));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-10-20 15:49:38 -07:00
|
|
|
|
// Test that we properly handle failures to add a receive stream.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
|
|
|
|
|
|
EXPECT_TRUE(SetupEngine());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
voe_.set_fail_create_channel(true);
|
|
|
|
|
|
EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-10-20 15:49:38 -07:00
|
|
|
|
// Test that we properly handle failures to add a send stream.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
|
|
|
|
|
|
EXPECT_TRUE(SetupEngine());
|
|
|
|
|
|
voe_.set_fail_create_channel(true);
|
|
|
|
|
|
EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-10-13 03:58:19 -07:00
|
|
|
|
// Test that AddRecvStream creates new stream.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
|
|
|
|
|
|
EXPECT_TRUE(SetupEngineWithRecvStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
int channel_num = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_NE(channel_num, voe_.GetLastChannel());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that after adding a recv stream, we do not decode more codecs than
|
|
|
|
|
|
// those previously passed into SetRecvCodecs.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioRecvParameters parameters;
|
|
|
|
|
|
parameters.codecs.push_back(kIsacCodec);
|
|
|
|
|
|
parameters.codecs.push_back(kPcmuCodec);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc1)));
|
|
|
|
|
|
int channel_num2 = voe_.GetLastChannel();
|
|
|
|
|
|
webrtc::CodecInst gcodec;
|
2015-11-10 23:44:30 -08:00
|
|
|
|
rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
|
2015-02-17 12:36:41 +00:00
|
|
|
|
gcodec.plfreq = 48000;
|
2013-07-10 00:45:36 +00:00
|
|
|
|
gcodec.channels = 2;
|
|
|
|
|
|
EXPECT_EQ(-1, voe_.GetRecPayloadType(channel_num2, gcodec));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we properly clean up any streams that were added, even if
|
|
|
|
|
|
// not explicitly removed.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
|
|
|
|
|
|
EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
|
|
|
|
|
|
delete channel_;
|
|
|
|
|
|
channel_ = NULL;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetNumChannels());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-10-07 23:32:02 +00:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-10-07 23:32:02 +00:00
|
|
|
|
EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
|
|
|
|
|
|
EXPECT_TRUE(SetupEngine());
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
|
2015-10-13 03:58:19 -07:00
|
|
|
|
// Manually delete channel to simulate a failure.
|
|
|
|
|
|
int channel = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_EQ(0, voe_.DeleteChannel(channel));
|
|
|
|
|
|
// Add recv stream 2 should work.
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
|
2013-10-07 23:32:02 +00:00
|
|
|
|
int new_channel = voe_.GetLastChannel();
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_NE(channel, new_channel);
|
|
|
|
|
|
// The last created channel is deleted too.
|
|
|
|
|
|
EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
|
2013-10-07 23:32:02 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2013-08-30 21:24:16 +00:00
|
|
|
|
// Test the InsertDtmf on default send stream as caller.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
|
|
|
|
|
|
TestInsertDtmf(0, true);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2013-08-30 21:24:16 +00:00
|
|
|
|
// Test the InsertDtmf on default send stream as callee
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
|
|
|
|
|
|
TestInsertDtmf(0, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test the InsertDtmf on specified send stream as caller.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
|
|
|
|
|
|
TestInsertDtmf(kSsrc1, true);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test the InsertDtmf on specified send stream as callee.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
|
|
|
|
|
|
TestInsertDtmf(kSsrc1, false);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(channel_->SetSend(cricket::SEND_MICROPHONE));
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetPlayout(true));
|
|
|
|
|
|
voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetPlayout(false));
|
|
|
|
|
|
EXPECT_FALSE(channel_->SetPlayout(true));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
|
|
|
|
|
bool ec_enabled;
|
|
|
|
|
|
webrtc::EcModes ec_mode;
|
|
|
|
|
|
webrtc::AecmModes aecm_mode;
|
|
|
|
|
|
bool cng_enabled;
|
|
|
|
|
|
bool agc_enabled;
|
|
|
|
|
|
webrtc::AgcModes agc_mode;
|
|
|
|
|
|
webrtc::AgcConfig agc_config;
|
|
|
|
|
|
bool ns_enabled;
|
|
|
|
|
|
webrtc::NsModes ns_mode;
|
|
|
|
|
|
bool highpass_filter_enabled;
|
|
|
|
|
|
bool stereo_swapping_enabled;
|
|
|
|
|
|
bool typing_detection_enabled;
|
|
|
|
|
|
voe_.GetEcStatus(ec_enabled, ec_mode);
|
|
|
|
|
|
voe_.GetAecmMode(aecm_mode, cng_enabled);
|
|
|
|
|
|
voe_.GetAgcStatus(agc_enabled, agc_mode);
|
|
|
|
|
|
voe_.GetAgcConfig(agc_config);
|
|
|
|
|
|
voe_.GetNsStatus(ns_enabled, ns_mode);
|
|
|
|
|
|
highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
|
|
|
|
|
|
stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
|
|
|
|
|
|
voe_.GetTypingDetectionStatus(typing_detection_enabled);
|
|
|
|
|
|
EXPECT_TRUE(ec_enabled);
|
2015-10-27 03:35:21 -07:00
|
|
|
|
EXPECT_TRUE(voe_.ec_metrics_enabled());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_FALSE(cng_enabled);
|
|
|
|
|
|
EXPECT_TRUE(agc_enabled);
|
|
|
|
|
|
EXPECT_EQ(0, agc_config.targetLeveldBOv);
|
|
|
|
|
|
EXPECT_TRUE(ns_enabled);
|
|
|
|
|
|
EXPECT_TRUE(highpass_filter_enabled);
|
|
|
|
|
|
EXPECT_FALSE(stereo_swapping_enabled);
|
|
|
|
|
|
EXPECT_TRUE(typing_detection_enabled);
|
|
|
|
|
|
EXPECT_EQ(ec_mode, webrtc::kEcConference);
|
|
|
|
|
|
EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
|
2015-12-08 09:50:23 -08:00
|
|
|
|
EXPECT_EQ(50, voe_.GetNetEqCapacity());
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
2015-12-08 09:50:23 -08:00
|
|
|
|
// Nothing set in AudioOptions, so everything should be as default.
|
|
|
|
|
|
send_parameters_.options = cricket::AudioOptions();
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
voe_.GetEcStatus(ec_enabled, ec_mode);
|
|
|
|
|
|
voe_.GetAecmMode(aecm_mode, cng_enabled);
|
|
|
|
|
|
voe_.GetAgcStatus(agc_enabled, agc_mode);
|
|
|
|
|
|
voe_.GetAgcConfig(agc_config);
|
|
|
|
|
|
voe_.GetNsStatus(ns_enabled, ns_mode);
|
|
|
|
|
|
highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
|
|
|
|
|
|
stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
|
|
|
|
|
|
voe_.GetTypingDetectionStatus(typing_detection_enabled);
|
|
|
|
|
|
EXPECT_TRUE(ec_enabled);
|
2015-10-27 03:35:21 -07:00
|
|
|
|
EXPECT_TRUE(voe_.ec_metrics_enabled());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_FALSE(cng_enabled);
|
|
|
|
|
|
EXPECT_TRUE(agc_enabled);
|
|
|
|
|
|
EXPECT_EQ(0, agc_config.targetLeveldBOv);
|
|
|
|
|
|
EXPECT_TRUE(ns_enabled);
|
|
|
|
|
|
EXPECT_TRUE(highpass_filter_enabled);
|
|
|
|
|
|
EXPECT_FALSE(stereo_swapping_enabled);
|
|
|
|
|
|
EXPECT_TRUE(typing_detection_enabled);
|
|
|
|
|
|
EXPECT_EQ(ec_mode, webrtc::kEcConference);
|
|
|
|
|
|
EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
|
2015-12-08 09:50:23 -08:00
|
|
|
|
EXPECT_EQ(50, voe_.GetNetEqCapacity());
|
|
|
|
|
|
EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
|
|
|
|
|
// Turn echo cancellation off
|
2015-12-08 09:50:23 -08:00
|
|
|
|
send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
voe_.GetEcStatus(ec_enabled, ec_mode);
|
|
|
|
|
|
EXPECT_FALSE(ec_enabled);
|
|
|
|
|
|
|
|
|
|
|
|
// Turn echo cancellation back on, with settings, and make sure
|
|
|
|
|
|
// nothing else changed.
|
2015-12-08 09:50:23 -08:00
|
|
|
|
send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
voe_.GetEcStatus(ec_enabled, ec_mode);
|
|
|
|
|
|
voe_.GetAecmMode(aecm_mode, cng_enabled);
|
|
|
|
|
|
voe_.GetAgcStatus(agc_enabled, agc_mode);
|
|
|
|
|
|
voe_.GetAgcConfig(agc_config);
|
|
|
|
|
|
voe_.GetNsStatus(ns_enabled, ns_mode);
|
|
|
|
|
|
highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
|
|
|
|
|
|
stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
|
|
|
|
|
|
voe_.GetTypingDetectionStatus(typing_detection_enabled);
|
|
|
|
|
|
EXPECT_TRUE(ec_enabled);
|
2015-10-27 03:35:21 -07:00
|
|
|
|
EXPECT_TRUE(voe_.ec_metrics_enabled());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(agc_enabled);
|
|
|
|
|
|
EXPECT_EQ(0, agc_config.targetLeveldBOv);
|
|
|
|
|
|
EXPECT_TRUE(ns_enabled);
|
|
|
|
|
|
EXPECT_TRUE(highpass_filter_enabled);
|
|
|
|
|
|
EXPECT_FALSE(stereo_swapping_enabled);
|
|
|
|
|
|
EXPECT_TRUE(typing_detection_enabled);
|
|
|
|
|
|
EXPECT_EQ(ec_mode, webrtc::kEcConference);
|
|
|
|
|
|
EXPECT_EQ(ns_mode, webrtc::kNsHighSuppression);
|
|
|
|
|
|
|
2015-03-25 22:45:56 +01:00
|
|
|
|
// Turn on delay agnostic aec and make sure nothing change w.r.t. echo
|
|
|
|
|
|
// control.
|
2015-12-08 09:50:23 -08:00
|
|
|
|
send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-03-25 22:45:56 +01:00
|
|
|
|
voe_.GetEcStatus(ec_enabled, ec_mode);
|
|
|
|
|
|
voe_.GetAecmMode(aecm_mode, cng_enabled);
|
|
|
|
|
|
EXPECT_TRUE(ec_enabled);
|
2015-10-27 03:35:21 -07:00
|
|
|
|
EXPECT_TRUE(voe_.ec_metrics_enabled());
|
2015-03-25 22:45:56 +01:00
|
|
|
|
EXPECT_EQ(ec_mode, webrtc::kEcConference);
|
|
|
|
|
|
|
|
|
|
|
|
// Turn off echo cancellation and delay agnostic aec.
|
2015-12-08 09:50:23 -08:00
|
|
|
|
send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
|
|
|
|
|
|
send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
|
|
|
|
|
|
send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-03-25 22:45:56 +01:00
|
|
|
|
voe_.GetEcStatus(ec_enabled, ec_mode);
|
|
|
|
|
|
EXPECT_FALSE(ec_enabled);
|
|
|
|
|
|
// Turning delay agnostic aec back on should also turn on echo cancellation.
|
2015-12-08 09:50:23 -08:00
|
|
|
|
send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-03-25 22:45:56 +01:00
|
|
|
|
voe_.GetEcStatus(ec_enabled, ec_mode);
|
|
|
|
|
|
EXPECT_TRUE(ec_enabled);
|
2015-10-27 03:35:21 -07:00
|
|
|
|
EXPECT_TRUE(voe_.ec_metrics_enabled());
|
2015-03-25 22:45:56 +01:00
|
|
|
|
EXPECT_EQ(ec_mode, webrtc::kEcConference);
|
|
|
|
|
|
|
2013-07-10 00:45:36 +00:00
|
|
|
|
// Turn off AGC
|
2015-12-08 09:50:23 -08:00
|
|
|
|
send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
voe_.GetAgcStatus(agc_enabled, agc_mode);
|
|
|
|
|
|
EXPECT_FALSE(agc_enabled);
|
|
|
|
|
|
|
|
|
|
|
|
// Turn AGC back on
|
2015-12-08 09:50:23 -08:00
|
|
|
|
send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
|
|
|
|
|
|
send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
voe_.GetAgcStatus(agc_enabled, agc_mode);
|
|
|
|
|
|
EXPECT_TRUE(agc_enabled);
|
|
|
|
|
|
voe_.GetAgcConfig(agc_config);
|
|
|
|
|
|
EXPECT_EQ(0, agc_config.targetLeveldBOv);
|
|
|
|
|
|
|
|
|
|
|
|
// Turn off other options (and stereo swapping on).
|
2015-12-08 09:50:23 -08:00
|
|
|
|
send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
|
|
|
|
|
|
send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
|
|
|
|
|
|
send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
|
|
|
|
|
|
send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
voe_.GetNsStatus(ns_enabled, ns_mode);
|
|
|
|
|
|
highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
|
|
|
|
|
|
stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
|
|
|
|
|
|
voe_.GetTypingDetectionStatus(typing_detection_enabled);
|
|
|
|
|
|
EXPECT_FALSE(ns_enabled);
|
|
|
|
|
|
EXPECT_FALSE(highpass_filter_enabled);
|
|
|
|
|
|
EXPECT_FALSE(typing_detection_enabled);
|
|
|
|
|
|
EXPECT_TRUE(stereo_swapping_enabled);
|
|
|
|
|
|
|
2015-10-13 03:58:19 -07:00
|
|
|
|
// Set options again to ensure it has no impact.
|
2015-12-08 09:50:23 -08:00
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
voe_.GetEcStatus(ec_enabled, ec_mode);
|
|
|
|
|
|
voe_.GetNsStatus(ns_enabled, ns_mode);
|
|
|
|
|
|
EXPECT_TRUE(ec_enabled);
|
|
|
|
|
|
EXPECT_EQ(webrtc::kEcConference, ec_mode);
|
|
|
|
|
|
EXPECT_FALSE(ns_enabled);
|
|
|
|
|
|
EXPECT_EQ(webrtc::kNsHighSuppression, ns_mode);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-09-27 23:04:10 +00:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, DefaultOptions) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
|
|
|
|
|
bool ec_enabled;
|
|
|
|
|
|
webrtc::EcModes ec_mode;
|
|
|
|
|
|
bool agc_enabled;
|
|
|
|
|
|
webrtc::AgcModes agc_mode;
|
|
|
|
|
|
bool ns_enabled;
|
|
|
|
|
|
webrtc::NsModes ns_mode;
|
|
|
|
|
|
bool highpass_filter_enabled;
|
|
|
|
|
|
bool stereo_swapping_enabled;
|
|
|
|
|
|
bool typing_detection_enabled;
|
|
|
|
|
|
|
|
|
|
|
|
voe_.GetEcStatus(ec_enabled, ec_mode);
|
|
|
|
|
|
voe_.GetAgcStatus(agc_enabled, agc_mode);
|
|
|
|
|
|
voe_.GetNsStatus(ns_enabled, ns_mode);
|
|
|
|
|
|
highpass_filter_enabled = voe_.IsHighPassFilterEnabled();
|
|
|
|
|
|
stereo_swapping_enabled = voe_.IsStereoChannelSwappingEnabled();
|
|
|
|
|
|
voe_.GetTypingDetectionStatus(typing_detection_enabled);
|
|
|
|
|
|
EXPECT_TRUE(ec_enabled);
|
|
|
|
|
|
EXPECT_TRUE(agc_enabled);
|
|
|
|
|
|
EXPECT_TRUE(ns_enabled);
|
|
|
|
|
|
EXPECT_TRUE(highpass_filter_enabled);
|
|
|
|
|
|
EXPECT_TRUE(typing_detection_enabled);
|
|
|
|
|
|
EXPECT_FALSE(stereo_swapping_enabled);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, InitDoesNotOverwriteDefaultAgcConfig) {
|
|
|
|
|
|
webrtc::AgcConfig set_config = {0};
|
|
|
|
|
|
set_config.targetLeveldBOv = 3;
|
|
|
|
|
|
set_config.digitalCompressionGaindB = 9;
|
|
|
|
|
|
set_config.limiterEnable = true;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.SetAgcConfig(set_config));
|
2014-07-29 17:36:52 +00:00
|
|
|
|
EXPECT_TRUE(engine_.Init(rtc::Thread::Current()));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
|
|
|
|
|
webrtc::AgcConfig config = {0};
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetAgcConfig(config));
|
|
|
|
|
|
EXPECT_EQ(set_config.targetLeveldBOv, config.targetLeveldBOv);
|
|
|
|
|
|
EXPECT_EQ(set_config.digitalCompressionGaindB,
|
|
|
|
|
|
config.digitalCompressionGaindB);
|
|
|
|
|
|
EXPECT_EQ(set_config.limiterEnable, config.limiterEnable);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-09-09 01:36:22 -07:00
|
|
|
|
rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
|
|
|
|
|
|
static_cast<cricket::WebRtcVoiceMediaChannel*>(
|
2015-09-15 12:26:33 +02:00
|
|
|
|
engine_.CreateChannel(&call_, cricket::AudioOptions())));
|
2015-09-09 01:36:22 -07:00
|
|
|
|
rtc::scoped_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
|
|
|
|
|
|
static_cast<cricket::WebRtcVoiceMediaChannel*>(
|
2015-09-15 12:26:33 +02:00
|
|
|
|
engine_.CreateChannel(&call_, cricket::AudioOptions())));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
|
|
|
|
|
// Have to add a stream to make SetSend work.
|
|
|
|
|
|
cricket::StreamParams stream1;
|
|
|
|
|
|
stream1.ssrcs.push_back(1);
|
|
|
|
|
|
channel1->AddSendStream(stream1);
|
|
|
|
|
|
cricket::StreamParams stream2;
|
|
|
|
|
|
stream2.ssrcs.push_back(2);
|
|
|
|
|
|
channel2->AddSendStream(stream2);
|
|
|
|
|
|
|
|
|
|
|
|
// AEC and AGC and NS
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters_options_all = send_parameters_;
|
2015-11-10 22:34:18 +01:00
|
|
|
|
parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
|
|
|
|
|
|
parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
|
|
|
|
|
|
parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
|
2015-09-17 16:42:56 +02:00
|
|
|
|
ASSERT_TRUE(channel1->SetSendParameters(parameters_options_all));
|
|
|
|
|
|
EXPECT_EQ(parameters_options_all.options, channel1->options());
|
|
|
|
|
|
ASSERT_TRUE(channel2->SetSendParameters(parameters_options_all));
|
|
|
|
|
|
EXPECT_EQ(parameters_options_all.options, channel2->options());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
|
|
|
|
|
// unset NS
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
|
2015-11-10 22:34:18 +01:00
|
|
|
|
parameters_options_no_ns.options.noise_suppression =
|
|
|
|
|
|
rtc::Optional<bool>(false);
|
2015-09-17 16:42:56 +02:00
|
|
|
|
ASSERT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
|
|
|
|
|
|
cricket::AudioOptions expected_options = parameters_options_all.options;
|
2015-11-10 22:34:18 +01:00
|
|
|
|
expected_options.echo_cancellation = rtc::Optional<bool>(true);
|
|
|
|
|
|
expected_options.auto_gain_control = rtc::Optional<bool>(true);
|
|
|
|
|
|
expected_options.noise_suppression = rtc::Optional<bool>(false);
|
2015-09-09 01:36:22 -07:00
|
|
|
|
EXPECT_EQ(expected_options, channel1->options());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
|
|
|
|
|
// unset AGC
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
|
2015-11-10 22:34:18 +01:00
|
|
|
|
parameters_options_no_agc.options.auto_gain_control =
|
|
|
|
|
|
rtc::Optional<bool>(false);
|
2015-09-17 16:42:56 +02:00
|
|
|
|
ASSERT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
|
2015-11-10 22:34:18 +01:00
|
|
|
|
expected_options.echo_cancellation = rtc::Optional<bool>(true);
|
|
|
|
|
|
expected_options.auto_gain_control = rtc::Optional<bool>(false);
|
|
|
|
|
|
expected_options.noise_suppression = rtc::Optional<bool>(true);
|
2015-09-09 01:36:22 -07:00
|
|
|
|
EXPECT_EQ(expected_options, channel2->options());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
|
2015-12-08 09:50:23 -08:00
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
bool ec_enabled;
|
|
|
|
|
|
webrtc::EcModes ec_mode;
|
|
|
|
|
|
bool agc_enabled;
|
|
|
|
|
|
webrtc::AgcModes agc_mode;
|
|
|
|
|
|
bool ns_enabled;
|
|
|
|
|
|
webrtc::NsModes ns_mode;
|
|
|
|
|
|
voe_.GetEcStatus(ec_enabled, ec_mode);
|
|
|
|
|
|
voe_.GetAgcStatus(agc_enabled, agc_mode);
|
|
|
|
|
|
voe_.GetNsStatus(ns_enabled, ns_mode);
|
|
|
|
|
|
EXPECT_TRUE(ec_enabled);
|
|
|
|
|
|
EXPECT_TRUE(agc_enabled);
|
|
|
|
|
|
EXPECT_TRUE(ns_enabled);
|
|
|
|
|
|
|
|
|
|
|
|
channel1->SetSend(cricket::SEND_MICROPHONE);
|
|
|
|
|
|
voe_.GetEcStatus(ec_enabled, ec_mode);
|
|
|
|
|
|
voe_.GetAgcStatus(agc_enabled, agc_mode);
|
|
|
|
|
|
voe_.GetNsStatus(ns_enabled, ns_mode);
|
|
|
|
|
|
EXPECT_TRUE(ec_enabled);
|
|
|
|
|
|
EXPECT_TRUE(agc_enabled);
|
|
|
|
|
|
EXPECT_FALSE(ns_enabled);
|
|
|
|
|
|
|
|
|
|
|
|
channel2->SetSend(cricket::SEND_MICROPHONE);
|
|
|
|
|
|
voe_.GetEcStatus(ec_enabled, ec_mode);
|
|
|
|
|
|
voe_.GetAgcStatus(agc_enabled, agc_mode);
|
|
|
|
|
|
voe_.GetNsStatus(ns_enabled, ns_mode);
|
|
|
|
|
|
EXPECT_TRUE(ec_enabled);
|
|
|
|
|
|
EXPECT_FALSE(agc_enabled);
|
|
|
|
|
|
EXPECT_TRUE(ns_enabled);
|
|
|
|
|
|
|
|
|
|
|
|
// Make sure settings take effect while we are sending.
|
2015-12-08 09:50:23 -08:00
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(parameters_options_all));
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
|
|
|
|
|
|
send_parameters_;
|
2015-10-30 02:47:38 -07:00
|
|
|
|
parameters_options_no_agc_nor_ns.options.auto_gain_control =
|
2015-11-10 22:34:18 +01:00
|
|
|
|
rtc::Optional<bool>(false);
|
2015-10-30 02:47:38 -07:00
|
|
|
|
parameters_options_no_agc_nor_ns.options.noise_suppression =
|
2015-11-10 22:34:18 +01:00
|
|
|
|
rtc::Optional<bool>(false);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
channel2->SetSend(cricket::SEND_MICROPHONE);
|
2015-09-17 16:42:56 +02:00
|
|
|
|
channel2->SetSendParameters(parameters_options_no_agc_nor_ns);
|
2015-11-10 22:34:18 +01:00
|
|
|
|
expected_options.echo_cancellation = rtc::Optional<bool>(true);
|
|
|
|
|
|
expected_options.auto_gain_control = rtc::Optional<bool>(false);
|
|
|
|
|
|
expected_options.noise_suppression = rtc::Optional<bool>(false);
|
2015-09-09 01:36:22 -07:00
|
|
|
|
EXPECT_EQ(expected_options, channel2->options());
|
2013-07-10 00:45:36 +00:00
|
|
|
|
voe_.GetEcStatus(ec_enabled, ec_mode);
|
|
|
|
|
|
voe_.GetAgcStatus(agc_enabled, agc_mode);
|
|
|
|
|
|
voe_.GetNsStatus(ns_enabled, ns_mode);
|
|
|
|
|
|
EXPECT_TRUE(ec_enabled);
|
|
|
|
|
|
EXPECT_FALSE(agc_enabled);
|
|
|
|
|
|
EXPECT_FALSE(ns_enabled);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2013-10-31 15:40:38 +00:00
|
|
|
|
// This test verifies DSCP settings are properly applied on voice media channel.
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2014-07-29 17:36:52 +00:00
|
|
|
|
rtc::scoped_ptr<cricket::VoiceMediaChannel> channel(
|
2015-09-15 12:26:33 +02:00
|
|
|
|
engine_.CreateChannel(&call_, cricket::AudioOptions()));
|
2014-07-29 17:36:52 +00:00
|
|
|
|
rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
|
2013-10-31 15:40:38 +00:00
|
|
|
|
new cricket::FakeNetworkInterface);
|
|
|
|
|
|
channel->SetInterface(network_interface.get());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioSendParameters parameters = send_parameters_;
|
2015-11-10 22:34:18 +01:00
|
|
|
|
parameters.options.dscp = rtc::Optional<bool>(true);
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel->SetSendParameters(parameters));
|
2014-07-29 17:36:52 +00:00
|
|
|
|
EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
|
2014-01-14 10:00:58 +00:00
|
|
|
|
// Verify previous value is not modified if dscp option is not set.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel->SetSendParameters(send_parameters_));
|
2014-07-29 17:36:52 +00:00
|
|
|
|
EXPECT_EQ(rtc::DSCP_EF, network_interface->dscp());
|
2015-11-10 22:34:18 +01:00
|
|
|
|
parameters.options.dscp = rtc::Optional<bool>(false);
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel->SetSendParameters(parameters));
|
2014-07-29 17:36:52 +00:00
|
|
|
|
EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
|
2013-10-31 15:40:38 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2015-10-13 03:58:19 -07:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(SetupEngine());
|
|
|
|
|
|
cricket::WebRtcVoiceMediaChannel* media_channel =
|
|
|
|
|
|
static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc1)));
|
|
|
|
|
|
int channel_id = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrc1));
|
|
|
|
|
|
EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrc2));
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc2)));
|
|
|
|
|
|
int channel_id2 = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2015-10-13 03:58:19 -07:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(SetupEngine());
|
|
|
|
|
|
cricket::WebRtcVoiceMediaChannel* media_channel =
|
2015-10-13 03:58:19 -07:00
|
|
|
|
static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
|
|
|
|
|
EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddSendStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc1)));
|
|
|
|
|
|
int channel_id = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrc1));
|
|
|
|
|
|
EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrc2));
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddSendStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrc2)));
|
|
|
|
|
|
int channel_id2 = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrc2));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2015-10-09 02:32:53 -07:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
|
2013-07-10 00:45:36 +00:00
|
|
|
|
EXPECT_TRUE(SetupEngine());
|
2015-10-09 02:32:53 -07:00
|
|
|
|
EXPECT_FALSE(channel_->SetOutputVolume(kSsrc2, 0.5));
|
2013-07-10 00:45:36 +00:00
|
|
|
|
cricket::StreamParams stream;
|
|
|
|
|
|
stream.ssrcs.push_back(kSsrc2);
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(stream));
|
2015-10-13 03:58:19 -07:00
|
|
|
|
int channel_id = voe_.GetLastChannel();
|
2015-10-09 02:32:53 -07:00
|
|
|
|
EXPECT_TRUE(channel_->SetOutputVolume(kSsrc2, 3));
|
2015-10-13 03:58:19 -07:00
|
|
|
|
float scale = 0;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
|
|
|
|
|
|
EXPECT_DOUBLE_EQ(3, scale);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeDefaultRecvStream) {
|
|
|
|
|
|
EXPECT_TRUE(SetupEngine());
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetOutputVolume(0, 2));
|
|
|
|
|
|
DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
|
|
|
|
|
|
int channel_id = voe_.GetLastChannel();
|
|
|
|
|
|
float scale = 0;
|
|
|
|
|
|
EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
|
|
|
|
|
|
EXPECT_DOUBLE_EQ(2, scale);
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetOutputVolume(0, 3));
|
2015-09-07 03:56:38 -07:00
|
|
|
|
EXPECT_EQ(0, voe_.GetChannelOutputVolumeScaling(channel_id, scale));
|
2015-10-09 02:32:53 -07:00
|
|
|
|
EXPECT_DOUBLE_EQ(3, scale);
|
2013-07-10 00:45:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2015-07-15 08:02:58 -07:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
|
const uint32_t kAudioSsrc = 123;
|
2015-07-15 08:02:58 -07:00
|
|
|
|
const std::string kSyncLabel = "AvSyncLabel";
|
|
|
|
|
|
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-07-15 08:02:58 -07:00
|
|
|
|
cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
|
|
|
|
|
|
sp.sync_label = kSyncLabel;
|
|
|
|
|
|
// Creating two channels to make sure that sync label is set properly for both
|
|
|
|
|
|
// the default voice channel and following ones.
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(sp));
|
|
|
|
|
|
sp.ssrcs[0] += 1;
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(sp));
|
|
|
|
|
|
|
2015-09-15 12:26:33 +02:00
|
|
|
|
ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
|
2015-07-15 08:02:58 -07:00
|
|
|
|
EXPECT_EQ(kSyncLabel,
|
2015-09-15 12:26:33 +02:00
|
|
|
|
call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
|
2015-07-15 08:02:58 -07:00
|
|
|
|
<< "SyncGroup should be set based on sync_label";
|
|
|
|
|
|
EXPECT_EQ(kSyncLabel,
|
2015-09-15 12:26:33 +02:00
|
|
|
|
call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
|
2015-07-15 08:02:58 -07:00
|
|
|
|
<< "SyncGroup should be set based on sync_label";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-07-24 07:10:18 -07:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, CanChangeCombinedBweOption) {
|
2015-05-07 14:07:48 +02:00
|
|
|
|
// Test that changing the combined_audio_video_bwe option results in the
|
|
|
|
|
|
// expected state changes on an associated Call.
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
|
std::vector<uint32_t> ssrcs;
|
2015-09-15 12:26:33 +02:00
|
|
|
|
ssrcs.push_back(223);
|
|
|
|
|
|
ssrcs.push_back(224);
|
2015-05-07 14:07:48 +02:00
|
|
|
|
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-05-07 14:07:48 +02:00
|
|
|
|
cricket::WebRtcVoiceMediaChannel* media_channel =
|
|
|
|
|
|
static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
|
for (uint32_t ssrc : ssrcs) {
|
2015-09-15 12:26:33 +02:00
|
|
|
|
EXPECT_TRUE(media_channel->AddRecvStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(ssrc)));
|
|
|
|
|
|
}
|
|
|
|
|
|
EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
|
2015-05-07 14:07:48 +02:00
|
|
|
|
|
2015-09-15 12:26:33 +02:00
|
|
|
|
// Combined BWE should be disabled.
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
|
for (uint32_t ssrc : ssrcs) {
|
2015-09-15 12:26:33 +02:00
|
|
|
|
const auto* s = call_.GetAudioReceiveStream(ssrc);
|
|
|
|
|
|
EXPECT_NE(nullptr, s);
|
2015-10-27 03:35:21 -07:00
|
|
|
|
EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
|
2015-09-15 12:26:33 +02:00
|
|
|
|
}
|
2015-05-07 14:07:48 +02:00
|
|
|
|
|
2015-07-24 07:10:18 -07:00
|
|
|
|
// Enable combined BWE option - now it should be set up.
|
2015-11-10 22:34:18 +01:00
|
|
|
|
send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
|
for (uint32_t ssrc : ssrcs) {
|
2015-09-15 12:26:33 +02:00
|
|
|
|
const auto* s = call_.GetAudioReceiveStream(ssrc);
|
|
|
|
|
|
EXPECT_NE(nullptr, s);
|
|
|
|
|
|
EXPECT_EQ(true, s->GetConfig().combined_audio_video_bwe);
|
|
|
|
|
|
}
|
2015-07-24 07:10:18 -07:00
|
|
|
|
|
|
|
|
|
|
// Disable combined BWE option - should be disabled again.
|
2015-11-10 22:34:18 +01:00
|
|
|
|
send_parameters_.options.combined_audio_video_bwe =
|
|
|
|
|
|
rtc::Optional<bool>(false);
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
|
for (uint32_t ssrc : ssrcs) {
|
2015-09-15 12:26:33 +02:00
|
|
|
|
const auto* s = call_.GetAudioReceiveStream(ssrc);
|
|
|
|
|
|
EXPECT_NE(nullptr, s);
|
2015-10-27 03:35:21 -07:00
|
|
|
|
EXPECT_FALSE(s->GetConfig().combined_audio_video_bwe);
|
2015-09-15 12:26:33 +02:00
|
|
|
|
}
|
2015-05-07 14:07:48 +02:00
|
|
|
|
|
2015-09-15 12:26:33 +02:00
|
|
|
|
EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
|
2015-05-07 14:07:48 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2015-07-24 07:10:18 -07:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, ConfigureCombinedBweForNewRecvStreams) {
|
2015-05-07 14:07:48 +02:00
|
|
|
|
// Test that adding receive streams after enabling combined bandwidth
|
|
|
|
|
|
// estimation will correctly configure each channel.
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-05-07 14:07:48 +02:00
|
|
|
|
cricket::WebRtcVoiceMediaChannel* media_channel =
|
|
|
|
|
|
static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
2015-11-10 22:34:18 +01:00
|
|
|
|
send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
|
2015-05-07 14:07:48 +02:00
|
|
|
|
|
2015-12-08 09:50:23 -08:00
|
|
|
|
for (uint32_t ssrc : kSsrcs4) {
|
2015-05-07 14:07:48 +02:00
|
|
|
|
EXPECT_TRUE(media_channel->AddRecvStream(
|
2015-12-08 09:50:23 -08:00
|
|
|
|
cricket::StreamParams::CreateLegacy(ssrc)));
|
|
|
|
|
|
EXPECT_NE(nullptr, call_.GetAudioReceiveStream(ssrc));
|
2015-05-07 14:07:48 +02:00
|
|
|
|
}
|
2015-12-08 09:50:23 -08:00
|
|
|
|
EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioReceiveStreams().size());
|
2015-05-07 14:07:48 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
2015-11-16 07:34:50 -08:00
|
|
|
|
// TODO(solenberg): Remove, once recv streams are configured through Call.
|
|
|
|
|
|
// (This is then covered by TestSetRecvRtpHeaderExtensions.)
|
2015-07-24 07:10:18 -07:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
|
2015-05-07 14:07:48 +02:00
|
|
|
|
// Test that setting the header extensions results in the expected state
|
|
|
|
|
|
// changes on an associated Call.
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
|
std::vector<uint32_t> ssrcs;
|
2015-05-07 14:07:48 +02:00
|
|
|
|
ssrcs.push_back(223);
|
|
|
|
|
|
ssrcs.push_back(224);
|
|
|
|
|
|
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-05-07 14:07:48 +02:00
|
|
|
|
cricket::WebRtcVoiceMediaChannel* media_channel =
|
|
|
|
|
|
static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
2015-11-10 22:34:18 +01:00
|
|
|
|
send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(media_channel->SetSendParameters(send_parameters_));
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
|
for (uint32_t ssrc : ssrcs) {
|
2015-05-07 14:07:48 +02:00
|
|
|
|
EXPECT_TRUE(media_channel->AddRecvStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(ssrc)));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Combined BWE should be set up, but with no configured extensions.
|
2015-09-15 12:26:33 +02:00
|
|
|
|
EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
|
for (uint32_t ssrc : ssrcs) {
|
2015-09-15 12:26:33 +02:00
|
|
|
|
const auto* s = call_.GetAudioReceiveStream(ssrc);
|
2015-05-07 14:07:48 +02:00
|
|
|
|
EXPECT_NE(nullptr, s);
|
|
|
|
|
|
EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Set up receive extensions.
|
2015-12-07 10:45:43 +01:00
|
|
|
|
cricket::RtpCapabilities capabilities = engine_.GetCapabilities();
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::AudioRecvParameters recv_parameters;
|
2015-12-07 10:45:43 +01:00
|
|
|
|
recv_parameters.extensions = capabilities.header_extensions;
|
2015-09-17 16:42:56 +02:00
|
|
|
|
channel_->SetRecvParameters(recv_parameters);
|
2015-09-15 12:26:33 +02:00
|
|
|
|
EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
|
for (uint32_t ssrc : ssrcs) {
|
2015-09-15 12:26:33 +02:00
|
|
|
|
const auto* s = call_.GetAudioReceiveStream(ssrc);
|
2015-05-07 14:07:48 +02:00
|
|
|
|
EXPECT_NE(nullptr, s);
|
|
|
|
|
|
const auto& s_exts = s->GetConfig().rtp.extensions;
|
2015-12-07 10:45:43 +01:00
|
|
|
|
EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
|
|
|
|
|
|
for (const auto& e_ext : capabilities.header_extensions) {
|
2015-05-07 14:07:48 +02:00
|
|
|
|
for (const auto& s_ext : s_exts) {
|
|
|
|
|
|
if (e_ext.id == s_ext.id) {
|
|
|
|
|
|
EXPECT_EQ(e_ext.uri, s_ext.name);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Disable receive extensions.
|
2015-09-17 16:42:56 +02:00
|
|
|
|
channel_->SetRecvParameters(cricket::AudioRecvParameters());
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
|
for (uint32_t ssrc : ssrcs) {
|
2015-09-15 12:26:33 +02:00
|
|
|
|
const auto* s = call_.GetAudioReceiveStream(ssrc);
|
2015-05-07 14:07:48 +02:00
|
|
|
|
EXPECT_NE(nullptr, s);
|
|
|
|
|
|
EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
|
|
|
|
|
|
// Test that packets are forwarded to the Call when configured accordingly.
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
|
const uint32_t kAudioSsrc = 1;
|
2015-05-07 14:07:48 +02:00
|
|
|
|
rtc::Buffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
|
|
|
|
|
|
static const unsigned char kRtcp[] = {
|
|
|
|
|
|
0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
|
|
|
|
|
|
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
|
|
|
|
};
|
|
|
|
|
|
rtc::Buffer kRtcpPacket(kRtcp, sizeof(kRtcp));
|
|
|
|
|
|
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-05-07 14:07:48 +02:00
|
|
|
|
cricket::WebRtcVoiceMediaChannel* media_channel =
|
|
|
|
|
|
static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
|
2015-11-10 22:34:18 +01:00
|
|
|
|
send_parameters_.options.combined_audio_video_bwe = rtc::Optional<bool>(true);
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-05-07 14:07:48 +02:00
|
|
|
|
EXPECT_TRUE(media_channel->AddRecvStream(
|
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kAudioSsrc)));
|
|
|
|
|
|
|
2015-09-15 12:26:33 +02:00
|
|
|
|
EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
|
2015-05-07 14:07:48 +02:00
|
|
|
|
const cricket::FakeAudioReceiveStream* s =
|
2015-09-15 12:26:33 +02:00
|
|
|
|
call_.GetAudioReceiveStream(kAudioSsrc);
|
2015-05-07 14:07:48 +02:00
|
|
|
|
EXPECT_EQ(0, s->received_packets());
|
|
|
|
|
|
channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
|
|
|
|
|
|
EXPECT_EQ(1, s->received_packets());
|
|
|
|
|
|
channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
|
|
|
|
|
|
EXPECT_EQ(2, s->received_packets());
|
|
|
|
|
|
}
|
2015-05-13 14:14:42 +02:00
|
|
|
|
|
2015-10-20 15:49:38 -07:00
|
|
|
|
// All receive channels should be associated with the first send channel,
|
2015-10-13 03:58:19 -07:00
|
|
|
|
// since they do not send RTCP SR.
|
2015-10-20 15:49:38 -07:00
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-10-13 03:06:58 -07:00
|
|
|
|
int default_channel = voe_.GetLastChannel();
|
2015-05-13 14:14:42 +02:00
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
|
|
|
|
|
|
int recv_ch = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_NE(recv_ch, default_channel);
|
|
|
|
|
|
EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
|
|
|
|
|
|
EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
|
|
|
|
|
|
recv_ch = voe_.GetLastChannel();
|
|
|
|
|
|
EXPECT_NE(recv_ch, default_channel);
|
|
|
|
|
|
EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
|
2015-05-13 14:14:42 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
|
2015-10-13 03:58:19 -07:00
|
|
|
|
EXPECT_TRUE(SetupEngineWithSendStream());
|
2015-09-17 16:42:56 +02:00
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-05-13 14:14:42 +02:00
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
|
|
|
|
|
|
int recv_ch = voe_.GetLastChannel();
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
|
|
|
|
|
|
int send_ch = voe_.GetLastChannel();
|
|
|
|
|
|
|
|
|
|
|
|
// Manually associate |recv_ch| to |send_ch|. This test is to verify a
|
|
|
|
|
|
// deleting logic, i.e., deleting |send_ch| will reset the associate send
|
|
|
|
|
|
// channel of |recv_ch|.This is not a common case, since, normally, only the
|
|
|
|
|
|
// default channel can be associated. However, the default is not deletable.
|
|
|
|
|
|
// So we force the |recv_ch| to associate with a non-default channel.
|
|
|
|
|
|
EXPECT_EQ(0, voe_.AssociateSendChannel(recv_ch, send_ch));
|
|
|
|
|
|
EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), send_ch);
|
|
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel_->RemoveSendStream(2));
|
|
|
|
|
|
EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), -1);
|
|
|
|
|
|
}
|
2015-09-03 05:48:32 -07:00
|
|
|
|
|
|
|
|
|
|
// Tests that the library initializes and shuts down properly.
|
|
|
|
|
|
TEST(WebRtcVoiceEngineTest, StartupShutdown) {
|
|
|
|
|
|
cricket::WebRtcVoiceEngine engine;
|
|
|
|
|
|
EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
|
2015-09-15 12:26:33 +02:00
|
|
|
|
rtc::scoped_ptr<webrtc::Call> call(
|
|
|
|
|
|
webrtc::Call::Create(webrtc::Call::Config()));
|
2015-09-03 05:48:32 -07:00
|
|
|
|
cricket::VoiceMediaChannel* channel =
|
2015-09-15 12:26:33 +02:00
|
|
|
|
engine.CreateChannel(call.get(), cricket::AudioOptions());
|
2015-09-03 05:48:32 -07:00
|
|
|
|
EXPECT_TRUE(channel != nullptr);
|
|
|
|
|
|
delete channel;
|
|
|
|
|
|
engine.Terminate();
|
|
|
|
|
|
|
|
|
|
|
|
// Reinit to catch regression where VoiceEngineObserver reference is lost
|
|
|
|
|
|
EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
|
|
|
|
|
|
engine.Terminate();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Tests that the library is configured with the codecs we want.
|
|
|
|
|
|
TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
|
|
|
|
|
|
// Check codecs by name.
|
2015-11-27 04:00:25 -08:00
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(96, "OPUS", 48000, 0, 2, 0), nullptr));
|
|
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(96, "ISAC", 16000, 0, 1, 0), nullptr));
|
|
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(96, "ISAC", 32000, 0, 1, 0), nullptr));
|
2015-09-03 05:48:32 -07:00
|
|
|
|
// Check that name matching is case-insensitive.
|
2015-11-27 04:00:25 -08:00
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(96, "ILBC", 8000, 0, 1, 0), nullptr));
|
|
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(96, "iLBC", 8000, 0, 1, 0), nullptr));
|
|
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(96, "PCMU", 8000, 0, 1, 0), nullptr));
|
|
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(96, "PCMA", 8000, 0, 1, 0), nullptr));
|
|
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(96, "G722", 8000, 0, 1, 0), nullptr));
|
|
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(96, "red", 8000, 0, 1, 0), nullptr));
|
|
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(96, "CN", 32000, 0, 1, 0), nullptr));
|
|
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(96, "CN", 16000, 0, 1, 0), nullptr));
|
|
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(96, "CN", 8000, 0, 1, 0), nullptr));
|
|
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(96, "telephone-event", 8000, 0, 1, 0), nullptr));
|
2015-09-03 05:48:32 -07:00
|
|
|
|
// Check codecs with an id by id.
|
2015-11-27 04:00:25 -08:00
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(0, "", 8000, 0, 1, 0), nullptr)); // PCMU
|
|
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(8, "", 8000, 0, 1, 0), nullptr)); // PCMA
|
|
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(9, "", 8000, 0, 1, 0), nullptr)); // G722
|
|
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(13, "", 8000, 0, 1, 0), nullptr)); // CN
|
2015-09-03 05:48:32 -07:00
|
|
|
|
// Check sample/bitrate matching.
|
2015-11-27 04:00:25 -08:00
|
|
|
|
EXPECT_TRUE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(0, "PCMU", 8000, 64000, 1, 0), nullptr));
|
2015-09-03 05:48:32 -07:00
|
|
|
|
// Check that bad codecs fail.
|
2015-11-27 04:00:25 -08:00
|
|
|
|
EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(99, "ABCD", 0, 0, 1, 0), nullptr));
|
|
|
|
|
|
EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(88, "", 0, 0, 1, 0), nullptr));
|
|
|
|
|
|
EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(0, "", 0, 0, 2, 0), nullptr));
|
|
|
|
|
|
EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(0, "", 5000, 0, 1, 0), nullptr));
|
|
|
|
|
|
EXPECT_FALSE(cricket::WebRtcVoiceEngine::ToCodecInst(
|
|
|
|
|
|
cricket::AudioCodec(0, "", 0, 5000, 1, 0), nullptr));
|
|
|
|
|
|
|
2015-09-03 05:48:32 -07:00
|
|
|
|
// Verify the payload id of common audio codecs, including CN, ISAC, and G722.
|
2015-11-27 04:00:25 -08:00
|
|
|
|
cricket::WebRtcVoiceEngine engine;
|
2015-09-03 05:48:32 -07:00
|
|
|
|
for (std::vector<cricket::AudioCodec>::const_iterator it =
|
|
|
|
|
|
engine.codecs().begin(); it != engine.codecs().end(); ++it) {
|
|
|
|
|
|
if (it->name == "CN" && it->clockrate == 16000) {
|
|
|
|
|
|
EXPECT_EQ(105, it->id);
|
|
|
|
|
|
} else if (it->name == "CN" && it->clockrate == 32000) {
|
|
|
|
|
|
EXPECT_EQ(106, it->id);
|
|
|
|
|
|
} else if (it->name == "ISAC" && it->clockrate == 16000) {
|
|
|
|
|
|
EXPECT_EQ(103, it->id);
|
|
|
|
|
|
} else if (it->name == "ISAC" && it->clockrate == 32000) {
|
|
|
|
|
|
EXPECT_EQ(104, it->id);
|
|
|
|
|
|
} else if (it->name == "G722" && it->clockrate == 8000) {
|
|
|
|
|
|
EXPECT_EQ(9, it->id);
|
|
|
|
|
|
} else if (it->name == "telephone-event") {
|
|
|
|
|
|
EXPECT_EQ(126, it->id);
|
|
|
|
|
|
} else if (it->name == "red") {
|
|
|
|
|
|
EXPECT_EQ(127, it->id);
|
|
|
|
|
|
} else if (it->name == "opus") {
|
|
|
|
|
|
EXPECT_EQ(111, it->id);
|
|
|
|
|
|
ASSERT_TRUE(it->params.find("minptime") != it->params.end());
|
|
|
|
|
|
EXPECT_EQ("10", it->params.find("minptime")->second);
|
|
|
|
|
|
ASSERT_TRUE(it->params.find("maxptime") != it->params.end());
|
|
|
|
|
|
EXPECT_EQ("60", it->params.find("maxptime")->second);
|
|
|
|
|
|
ASSERT_TRUE(it->params.find("useinbandfec") != it->params.end());
|
|
|
|
|
|
EXPECT_EQ("1", it->params.find("useinbandfec")->second);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
engine.Terminate();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Tests that VoE supports at least 32 channels
|
|
|
|
|
|
TEST(WebRtcVoiceEngineTest, Has32Channels) {
|
|
|
|
|
|
cricket::WebRtcVoiceEngine engine;
|
|
|
|
|
|
EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
|
2015-09-15 12:26:33 +02:00
|
|
|
|
rtc::scoped_ptr<webrtc::Call> call(
|
|
|
|
|
|
webrtc::Call::Create(webrtc::Call::Config()));
|
2015-09-03 05:48:32 -07:00
|
|
|
|
|
|
|
|
|
|
cricket::VoiceMediaChannel* channels[32];
|
|
|
|
|
|
int num_channels = 0;
|
2015-11-10 23:44:30 -08:00
|
|
|
|
while (num_channels < arraysize(channels)) {
|
2015-09-03 05:48:32 -07:00
|
|
|
|
cricket::VoiceMediaChannel* channel =
|
2015-09-15 12:26:33 +02:00
|
|
|
|
engine.CreateChannel(call.get(), cricket::AudioOptions());
|
2015-09-03 05:48:32 -07:00
|
|
|
|
if (!channel)
|
|
|
|
|
|
break;
|
|
|
|
|
|
channels[num_channels++] = channel;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-11-10 23:44:30 -08:00
|
|
|
|
int expected = arraysize(channels);
|
2015-09-03 05:48:32 -07:00
|
|
|
|
EXPECT_EQ(expected, num_channels);
|
|
|
|
|
|
|
|
|
|
|
|
while (num_channels > 0) {
|
|
|
|
|
|
delete channels[--num_channels];
|
|
|
|
|
|
}
|
|
|
|
|
|
engine.Terminate();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test that we set our preferred codecs properly.
|
|
|
|
|
|
TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
|
|
|
|
|
|
cricket::WebRtcVoiceEngine engine;
|
|
|
|
|
|
EXPECT_TRUE(engine.Init(rtc::Thread::Current()));
|
2015-09-15 12:26:33 +02:00
|
|
|
|
rtc::scoped_ptr<webrtc::Call> call(
|
|
|
|
|
|
webrtc::Call::Create(webrtc::Call::Config()));
|
2015-09-17 16:42:56 +02:00
|
|
|
|
cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::AudioOptions(),
|
|
|
|
|
|
call.get());
|
|
|
|
|
|
cricket::AudioRecvParameters parameters;
|
|
|
|
|
|
parameters.codecs = engine.codecs();
|
|
|
|
|
|
EXPECT_TRUE(channel.SetRecvParameters(parameters));
|
2015-09-03 05:48:32 -07:00
|
|
|
|
}
|