Configure VoE NACK through AudioReceiveStream::Config, for receive streams. Also minor refactoring of WVoE unit test.

BUG=webrtc:4690

Review-Url: https://codereview.webrtc.org/2060813002
Cr-Commit-Position: refs/heads/master@{#13140}
This commit is contained in:
solenberg 2016-06-14 12:13:00 -07:00 committed by Commit bot
parent 184a3fd648
commit 8189b02fea
7 changed files with 96 additions and 123 deletions

View File

@ -50,6 +50,8 @@ std::string AudioReceiveStream::Config::Rtp::ToString() const {
std::stringstream ss;
ss << "{remote_ssrc: " << remote_ssrc;
ss << ", local_ssrc: " << local_ssrc;
ss << ", transport_cc: " << (transport_cc ? "on" : "off");
ss << ", nack: " << nack.ToString();
ss << ", extensions: [";
for (size_t i = 0; i < extensions.size(); ++i) {
ss << extensions[i].ToString();
@ -58,7 +60,6 @@ std::string AudioReceiveStream::Config::Rtp::ToString() const {
}
}
ss << ']';
ss << ", transport_cc: " << (transport_cc ? "on" : "off");
ss << '}';
return ss.str();
}
@ -93,6 +94,10 @@ AudioReceiveStream::AudioReceiveStream(
VoiceEngineImpl* voe_impl = static_cast<VoiceEngineImpl*>(voice_engine());
channel_proxy_ = voe_impl->GetChannelProxy(config_.voe_channel_id);
channel_proxy_->SetLocalSSRC(config.rtp.local_ssrc);
// TODO(solenberg): Config NACK history window (which is a packet count),
// using the actual packet size for the configured codec.
channel_proxy_->SetNACKStatus(config_.rtp.nack.rtp_history_ms != 0,
config_.rtp.nack.rtp_history_ms / 20);
// TODO(ossu): This is where we'd like to set the decoder factory to
// use. However, since it needs to be included when constructing Channel, we

View File

@ -85,6 +85,7 @@ struct ConfigHelper {
EXPECT_FALSE(channel_proxy_);
channel_proxy_ = new testing::StrictMock<MockVoEChannelProxy>();
EXPECT_CALL(*channel_proxy_, SetLocalSSRC(kLocalSsrc)).Times(1);
EXPECT_CALL(*channel_proxy_, SetNACKStatus(true, 15)).Times(1);
EXPECT_CALL(*channel_proxy_,
SetReceiveAbsoluteSenderTimeStatus(true, kAbsSendTimeId))
.Times(1);
@ -112,6 +113,7 @@ struct ConfigHelper {
stream_config_.voe_channel_id = kChannelId;
stream_config_.rtp.local_ssrc = kLocalSsrc;
stream_config_.rtp.remote_ssrc = kRemoteSsrc;
stream_config_.rtp.nack.rtp_history_ms = 300;
stream_config_.rtp.extensions.push_back(
RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeId));
stream_config_.rtp.extensions.push_back(
@ -234,9 +236,9 @@ TEST(AudioReceiveStreamTest, ConfigToString) {
RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeId));
config.voe_channel_id = kChannelId;
EXPECT_EQ(
"{rtp: {remote_ssrc: 1234, local_ssrc: 5678, extensions: [{uri: "
"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time, id: 2}], "
"transport_cc: off}, "
"{rtp: {remote_ssrc: 1234, local_ssrc: 5678, transport_cc: off, "
"nack: {rtp_history_ms: 0}, extensions: [{uri: "
"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time, id: 2}]}, "
"rtcp_send_transport: nullptr, "
"voe_channel_id: 2}",
config.ToString());

View File

@ -79,6 +79,9 @@ class AudioReceiveStream {
// for details.
bool transport_cc = false;
// See NackConfig for description.
NackConfig nack;
// RTP header extensions used for the received stream.
std::vector<RtpExtension> extensions;
} rtp;

View File

@ -134,10 +134,8 @@ class FakeWebRtcVoiceEngine
bool codec_fec = false;
int max_encoding_bandwidth = 0;
bool opus_dtx = false;
bool nack = false;
int cn8_type = 13;
int cn16_type = 105;
int nack_max_packets = 0;
uint32_t send_ssrc = 0;
int associate_send_channel = -1;
std::vector<webrtc::CodecInst> recv_codecs;
@ -176,12 +174,6 @@ class FakeWebRtcVoiceEngine
int GetMaxEncodingBandwidth(int channel) {
return channels_[channel]->max_encoding_bandwidth;
}
bool GetNACK(int channel) {
return channels_[channel]->nack;
}
int GetNACKMaxPackets(int channel) {
return channels_[channel]->nack_max_packets;
}
int GetSendCNPayloadType(int channel, bool wideband) {
return (wideband) ?
channels_[channel]->cn16_type :
@ -477,12 +469,7 @@ class FakeWebRtcVoiceEngine
WEBRTC_STUB(GetRTCPStatistics, (int channel, webrtc::CallStatistics& stats));
WEBRTC_STUB(SetREDStatus, (int channel, bool enable, int redPayloadtype));
WEBRTC_STUB(GetREDStatus, (int channel, bool& enable, int& redPayloadtype));
WEBRTC_FUNC(SetNACKStatus, (int channel, bool enable, int maxNoPackets)) {
WEBRTC_CHECK_CHANNEL(channel);
channels_[channel]->nack = enable;
channels_[channel]->nack_max_packets = maxNoPackets;
return 0;
}
WEBRTC_STUB(SetNACKStatus, (int channel, bool enable, int maxNoPackets));
// webrtc::VoEVolumeControl
WEBRTC_STUB(SetSpeakerVolume, (unsigned int));

View File

@ -61,9 +61,6 @@ const int kDefaultAudioDeviceId = -1;
const int kDefaultAudioDeviceId = 0;
#endif
// Parameter used for NACK.
// This value is equivalent to 5 seconds of audio data at 20 ms per packet.
const int kNackMaxPackets = 250;
constexpr int kNackRtpHistoryMs = 5000;
// Codec parameters for Opus.
@ -1267,6 +1264,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream {
uint32_t remote_ssrc,
uint32_t local_ssrc,
bool use_transport_cc,
bool use_nack,
const std::string& sync_group,
const std::vector<webrtc::RtpExtension>& extensions,
webrtc::Call* call,
@ -1281,7 +1279,7 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream {
config_.voe_channel_id = ch;
config_.sync_group = sync_group;
config_.decoder_factory = decoder_factory;
RecreateAudioReceiveStream(use_transport_cc, extensions);
RecreateAudioReceiveStream(use_transport_cc, use_nack, extensions);
}
~WebRtcAudioReceiveStream() {
@ -1292,11 +1290,16 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream {
void RecreateAudioReceiveStream(
const std::vector<webrtc::RtpExtension>& extensions) {
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
RecreateAudioReceiveStream(config_.rtp.transport_cc, extensions);
RecreateAudioReceiveStream(config_.rtp.transport_cc,
config_.rtp.nack.rtp_history_ms != 0,
extensions);
}
void RecreateAudioReceiveStream(bool use_transport_cc) {
void RecreateAudioReceiveStream(bool use_transport_cc, bool use_nack) {
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
RecreateAudioReceiveStream(use_transport_cc, config_.rtp.extensions);
RecreateAudioReceiveStream(use_transport_cc,
use_nack,
config_.rtp.extensions);
}
webrtc::AudioReceiveStream::Stats GetStats() const {
@ -1318,14 +1321,16 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream {
private:
void RecreateAudioReceiveStream(
bool use_transport_cc,
bool use_nack,
const std::vector<webrtc::RtpExtension>& extensions) {
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
if (stream_) {
call_->DestroyAudioReceiveStream(stream_);
stream_ = nullptr;
}
config_.rtp.extensions = extensions;
config_.rtp.transport_cc = use_transport_cc;
config_.rtp.nack.rtp_history_ms = use_nack ? kNackRtpHistoryMs : 0;
config_.rtp.extensions = extensions;
RTC_DCHECK(!stream_);
stream_ = call_->CreateAudioReceiveStream(config_);
RTC_CHECK(stream_);
@ -1730,19 +1735,17 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs(
}
}
// Set nack status on receive channels.
for (const auto& kv : recv_streams_) {
SetNack(kv.second->channel(), send_codec_spec_.nack_enabled);
}
// Check if the transport cc feedback has changed on the preferred send codec,
// and in that case reconfigure all receive streams.
if (recv_transport_cc_enabled_ != send_codec_spec_.transport_cc_enabled) {
// Check if the transport cc feedback or NACK status has changed on the
// preferred send codec, and in that case reconfigure all receive streams.
if (recv_transport_cc_enabled_ != send_codec_spec_.transport_cc_enabled ||
recv_nack_enabled_ != send_codec_spec_.nack_enabled) {
LOG(LS_INFO) << "Recreate all the receive streams because the send "
"codec has changed.";
recv_transport_cc_enabled_ = send_codec_spec_.transport_cc_enabled;
recv_nack_enabled_ = send_codec_spec_.nack_enabled;
for (auto& kv : recv_streams_) {
kv.second->RecreateAudioReceiveStream(recv_transport_cc_enabled_);
kv.second->RecreateAudioReceiveStream(recv_transport_cc_enabled_,
recv_nack_enabled_);
}
}
@ -1856,16 +1859,6 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs(
return true;
}
void WebRtcVoiceMediaChannel::SetNack(int channel, bool nack_enabled) {
if (nack_enabled) {
LOG(LS_INFO) << "Enabling NACK for channel " << channel;
engine()->voe()->rtp()->SetNACKStatus(channel, true, kNackMaxPackets);
} else {
LOG(LS_INFO) << "Disabling NACK for channel " << channel;
engine()->voe()->rtp()->SetNACKStatus(channel, false, 0);
}
}
bool WebRtcVoiceMediaChannel::SetSendCodec(
int channel, const webrtc::CodecInst& send_codec) {
LOG(LS_INFO) << "Send channel " << channel << " selected voice codec "
@ -2137,11 +2130,10 @@ bool WebRtcVoiceMediaChannel::AddRecvStream(const StreamParams& sp) {
recv_streams_.insert(std::make_pair(
ssrc, new WebRtcAudioReceiveStream(channel, ssrc, receiver_reports_ssrc_,
recv_transport_cc_enabled_,
recv_nack_enabled_,
sp.sync_label, recv_rtp_extensions_,
call_, this,
engine()->decoder_factory_)));
SetNack(channel, send_codec_spec_.nack_enabled);
SetPlayout(channel, playout_);
return true;

View File

@ -244,7 +244,6 @@ class WebRtcVoiceMediaChannel final : public VoiceMediaChannel,
bool SetRecvCodecs(const std::vector<AudioCodec>& codecs);
bool SetSendCodecs(const std::vector<AudioCodec>& codecs);
bool SetSendCodecs(int channel, const webrtc::RtpParameters& rtp_parameters);
void SetNack(int channel, bool nack_enabled);
bool SetSendCodec(int channel, const webrtc::CodecInst& send_codec);
bool SetLocalSource(uint32_t ssrc, AudioSource* source);
bool MuteStream(uint32_t ssrc, bool mute);
@ -279,6 +278,7 @@ class WebRtcVoiceMediaChannel final : public VoiceMediaChannel,
rtc::Optional<int> dtmf_payload_type_;
bool desired_playout_ = false;
bool recv_transport_cc_enabled_ = false;
bool recv_nack_enabled_ = false;
bool playout_ = false;
bool send_ = false;
webrtc::Call* const call_ = nullptr;

View File

@ -107,18 +107,20 @@ class WebRtcVoiceEngineTestFake : public testing::Test {
send_parameters_.codecs.push_back(kPcmuCodec);
recv_parameters_.codecs.push_back(kPcmuCodec);
}
bool SetupChannel() {
channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
cricket::AudioOptions());
return (channel_ != nullptr);
}
bool SetupRecvStream() {
if (!SetupChannel()) {
return false;
}
return channel_->AddRecvStream(
cricket::StreamParams::CreateLegacy(kSsrc1));
return AddRecvStream(kSsrc1);
}
bool SetupSendStream() {
if (!SetupChannel()) {
return false;
@ -128,6 +130,12 @@ class WebRtcVoiceEngineTestFake : public testing::Test {
}
return channel_->SetAudioSend(kSsrc1, true, nullptr, &fake_source_);
}
bool AddRecvStream(uint32_t ssrc) {
EXPECT_TRUE(channel_);
return channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(ssrc));
}
void SetupForMultiSendStream() {
EXPECT_TRUE(SetupSendStream());
// Remove stream added in Setup.
@ -136,10 +144,12 @@ class WebRtcVoiceEngineTestFake : public testing::Test {
// Verify the channel does not exist.
EXPECT_FALSE(call_.GetAudioSendStream(kSsrc1));
}
void DeliverPacket(const void* data, int len) {
rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
channel_->OnPacketReceived(&packet, rtc::PacketTime());
}
void TearDown() override {
delete channel_;
}
@ -351,8 +361,7 @@ class WebRtcVoiceEngineTestFake : public testing::Test {
EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
// Ensure extension is set properly on new stream.
EXPECT_TRUE(channel_->AddRecvStream(
cricket::StreamParams::CreateLegacy(kSsrc2)));
EXPECT_TRUE(AddRecvStream(kSsrc2));
EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
call_.GetAudioReceiveStream(kSsrc2));
EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
@ -511,8 +520,7 @@ TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
// Test that we can add a receive stream and that it has the correct defaults.
TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
EXPECT_TRUE(SetupChannel());
EXPECT_TRUE(
channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
EXPECT_TRUE(AddRecvStream(kSsrc1));
const webrtc::AudioReceiveStream::Config& config =
GetRecvStreamConfig(kSsrc1);
EXPECT_EQ(kSsrc1, config.rtp.remote_ssrc);
@ -596,8 +604,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
parameters.codecs[0].id = 106; // collide with existing telephone-event
parameters.codecs[2].id = 126;
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
EXPECT_TRUE(channel_->AddRecvStream(
cricket::StreamParams::CreateLegacy(kSsrc1)));
EXPECT_TRUE(AddRecvStream(kSsrc1));
int channel_num = voe_.GetLastChannel();
webrtc::CodecInst gcodec;
rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
@ -640,8 +647,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
parameters.codecs.push_back(kPcmuCodec);
parameters.codecs.push_back(kOpusCodec);
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
EXPECT_TRUE(channel_->AddRecvStream(
cricket::StreamParams::CreateLegacy(kSsrc1)));
EXPECT_TRUE(AddRecvStream(kSsrc1));
int channel_num = voe_.GetLastChannel();
webrtc::CodecInst opus;
cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
@ -663,8 +669,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
parameters.codecs.push_back(kOpusCodec);
parameters.codecs[2].params["stereo"] = "0";
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
EXPECT_TRUE(channel_->AddRecvStream(
cricket::StreamParams::CreateLegacy(kSsrc1)));
EXPECT_TRUE(AddRecvStream(kSsrc1));
int channel_num2 = voe_.GetLastChannel();
webrtc::CodecInst opus;
cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
@ -686,8 +691,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
parameters.codecs.push_back(kOpusCodec);
parameters.codecs[2].params["stereo"] = "1";
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
EXPECT_TRUE(channel_->AddRecvStream(
cricket::StreamParams::CreateLegacy(kSsrc1)));
EXPECT_TRUE(AddRecvStream(kSsrc1));
int channel_num2 = voe_.GetLastChannel();
webrtc::CodecInst opus;
cricket::WebRtcVoiceEngine::ToCodecInst(kOpusCodec, &opus);
@ -709,8 +713,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
parameters.codecs[0].id = 106; // collide with existing telephone-event
parameters.codecs[2].id = 126;
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
EXPECT_TRUE(channel_->AddRecvStream(
cricket::StreamParams::CreateLegacy(kSsrc1)));
EXPECT_TRUE(AddRecvStream(kSsrc1));
int channel_num2 = voe_.GetLastChannel();
webrtc::CodecInst gcodec;
rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "ISAC");
@ -1373,16 +1376,15 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
// Test that we can enable NACK with opus as callee.
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
EXPECT_TRUE(SetupRecvStream());
int channel_num = voe_.GetLastChannel();
cricket::AudioSendParameters parameters;
parameters.codecs.push_back(kOpusCodec);
parameters.codecs[0].AddFeedbackParam(
cricket::FeedbackParam(cricket::kRtcpFbParamNack,
cricket::kParamValueEmpty));
EXPECT_FALSE(voe_.GetNACK(channel_num));
EXPECT_EQ(0, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
EXPECT_TRUE(channel_->SetSendParameters(parameters));
// NACK should be enabled even with no send stream.
EXPECT_TRUE(voe_.GetNACK(channel_num));
EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
EXPECT_TRUE(channel_->AddSendStream(
cricket::StreamParams::CreateLegacy(kSsrc1)));
@ -1392,18 +1394,17 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
// Test that we can enable NACK on receive streams.
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
EXPECT_TRUE(SetupSendStream());
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
int channel_num2 = voe_.GetLastChannel();
EXPECT_TRUE(AddRecvStream(kSsrc2));
cricket::AudioSendParameters parameters;
parameters.codecs.push_back(kOpusCodec);
parameters.codecs[0].AddFeedbackParam(
cricket::FeedbackParam(cricket::kRtcpFbParamNack,
cricket::kParamValueEmpty));
EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
EXPECT_FALSE(voe_.GetNACK(channel_num2));
EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
EXPECT_TRUE(channel_->SetSendParameters(parameters));
EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
EXPECT_TRUE(voe_.GetNACK(channel_num2));
EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
}
// Test that we can disable NACK.
@ -1426,8 +1427,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
// Test that we can disable NACK on receive streams.
TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
EXPECT_TRUE(SetupSendStream());
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
int channel_num2 = voe_.GetLastChannel();
EXPECT_TRUE(AddRecvStream(kSsrc2));
cricket::AudioSendParameters parameters;
parameters.codecs.push_back(kOpusCodec);
parameters.codecs[0].AddFeedbackParam(
@ -1435,13 +1435,13 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
cricket::kParamValueEmpty));
EXPECT_TRUE(channel_->SetSendParameters(parameters));
EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
EXPECT_TRUE(voe_.GetNACK(channel_num2));
EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
parameters.codecs.clear();
parameters.codecs.push_back(kOpusCodec);
EXPECT_TRUE(channel_->SetSendParameters(parameters));
EXPECT_EQ(0, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
EXPECT_FALSE(voe_.GetNACK(channel_num2));
EXPECT_EQ(0, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
}
// Test that NACK is enabled on a new receive stream.
@ -1456,12 +1456,10 @@ TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
EXPECT_TRUE(channel_->SetSendParameters(parameters));
EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrc1).rtp.nack.rtp_history_ms);
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
int 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));
EXPECT_TRUE(AddRecvStream(kSsrc2));
EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc2).rtp.nack.rtp_history_ms);
EXPECT_TRUE(AddRecvStream(kSsrc3));
EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrc3).rtp.nack.rtp_history_ms);
}
// Test that without useinbandfec, Opus FEC is off.
@ -1570,8 +1568,7 @@ TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
cricket::AudioRecvParameters recv_parameters;
recv_parameters.codecs.push_back(kIsacCodec);
EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
EXPECT_TRUE(
channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
EXPECT_TRUE(AddRecvStream(kSsrc1));
ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrc1) != nullptr);
EXPECT_FALSE(
call_.GetAudioReceiveStream(kSsrc1)->GetConfig().rtp.transport_cc);
@ -2276,8 +2273,7 @@ TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
// 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)));
EXPECT_TRUE(AddRecvStream(kSsrc2));
// We need send codec to be set to get all stats.
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
@ -2334,8 +2330,7 @@ TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
EXPECT_FALSE(voe_.GetPlayout(channel_num1));
// Adding another stream should enable playout on the new stream only.
EXPECT_TRUE(
channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc2)));
EXPECT_TRUE(AddRecvStream(kSsrc2));
int channel_num2 = voe_.GetLastChannel();
SetSend(channel_, true);
EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
@ -2345,8 +2340,7 @@ TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
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(kSsrc3)));
EXPECT_TRUE(AddRecvStream(kSsrc3));
int channel_num3 = voe_.GetLastChannel();
EXPECT_FALSE(voe_.GetPlayout(channel_num1));
EXPECT_TRUE(voe_.GetPlayout(channel_num2));
@ -2442,8 +2436,7 @@ TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
EXPECT_TRUE(SetupSendStream());
// SetupSendStream adds a send stream with kSsrc1, so the receive
// stream has to use a different SSRC.
EXPECT_TRUE(channel_->AddRecvStream(
cricket::StreamParams::CreateLegacy(kSsrc2)));
EXPECT_TRUE(AddRecvStream(kSsrc2));
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
SetAudioSendStreamStats();
@ -2496,8 +2489,7 @@ TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
EXPECT_TRUE(SetupSendStream());
EXPECT_TRUE(call_.GetAudioSendStream(kSsrc1));
EXPECT_TRUE(channel_->AddRecvStream(
cricket::StreamParams::CreateLegacy(kSsrc2)));
EXPECT_TRUE(AddRecvStream(kSsrc2));
EXPECT_EQ(kSsrc1, GetRecvStreamConfig(kSsrc2).rtp.local_ssrc);
}
@ -2505,7 +2497,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
// receive channel is created before the send channel.
TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
EXPECT_TRUE(SetupChannel());
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
EXPECT_TRUE(AddRecvStream(1));
int receive_channel_num = voe_.GetLastChannel();
EXPECT_TRUE(channel_->AddSendStream(
cricket::StreamParams::CreateLegacy(1234)));
@ -2517,7 +2509,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
// Test that we can properly receive packets.
TEST_F(WebRtcVoiceEngineTestFake, Recv) {
EXPECT_TRUE(SetupChannel());
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
EXPECT_TRUE(AddRecvStream(1));
DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
@ -2530,12 +2522,9 @@ TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
const uint32_t ssrc1 = 1;
const uint32_t ssrc2 = 2;
const uint32_t ssrc3 = 3;
EXPECT_TRUE(channel_->AddRecvStream(
cricket::StreamParams::CreateLegacy(ssrc1)));
EXPECT_TRUE(channel_->AddRecvStream(
cricket::StreamParams::CreateLegacy(ssrc2)));
EXPECT_TRUE(channel_->AddRecvStream(
cricket::StreamParams::CreateLegacy(ssrc3)));
EXPECT_TRUE(AddRecvStream(ssrc1));
EXPECT_TRUE(AddRecvStream(ssrc2));
EXPECT_TRUE(AddRecvStream(ssrc3));
// Create packets with the right SSRCs.
unsigned char packets[4][sizeof(kPcmuFrame)];
for (size_t i = 0; i < arraysize(packets); ++i) {
@ -2630,8 +2619,7 @@ TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
// Add a known stream, send packet and verify we got it.
const uint32_t signaled_ssrc = 1;
rtc::SetBE32(&packet[8], signaled_ssrc);
EXPECT_TRUE(channel_->AddRecvStream(
cricket::StreamParams::CreateLegacy(signaled_ssrc)));
EXPECT_TRUE(AddRecvStream(signaled_ssrc));
DeliverPacket(packet, sizeof(packet));
EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
packet, sizeof(packet)));
@ -2658,7 +2646,7 @@ TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignalledAfterSignalled) {
TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
EXPECT_TRUE(SetupChannel());
voe_.set_fail_create_channel(true);
EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
EXPECT_FALSE(AddRecvStream(2));
}
// Test that we properly handle failures to add a send stream.
@ -2672,7 +2660,7 @@ TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
EXPECT_TRUE(SetupRecvStream());
int channel_num = voe_.GetLastChannel();
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
EXPECT_TRUE(AddRecvStream(1));
EXPECT_NE(channel_num, voe_.GetLastChannel());
}
@ -2684,8 +2672,7 @@ TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
parameters.codecs.push_back(kIsacCodec);
parameters.codecs.push_back(kPcmuCodec);
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
EXPECT_TRUE(channel_->AddRecvStream(
cricket::StreamParams::CreateLegacy(kSsrc1)));
EXPECT_TRUE(AddRecvStream(kSsrc1));
int channel_num2 = voe_.GetLastChannel();
webrtc::CodecInst gcodec;
rtc::strcpyn(gcodec.plname, arraysize(gcodec.plname), "opus");
@ -2699,8 +2686,8 @@ TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
EXPECT_TRUE(SetupSendStream());
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
EXPECT_TRUE(AddRecvStream(1));
EXPECT_TRUE(AddRecvStream(2));
EXPECT_EQ(3, voe_.GetNumChannels()); // default channel + 2 added
delete channel_;
channel_ = NULL;
@ -2709,17 +2696,17 @@ TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
EXPECT_TRUE(SetupSendStream());
EXPECT_FALSE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(0)));
EXPECT_FALSE(AddRecvStream(0));
}
TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
EXPECT_TRUE(SetupChannel());
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
EXPECT_TRUE(AddRecvStream(1));
// 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)));
EXPECT_TRUE(AddRecvStream(2));
int new_channel = voe_.GetLastChannel();
EXPECT_NE(channel, new_channel);
// The last created channel is deleted too.
@ -2750,8 +2737,8 @@ TEST_F(WebRtcVoiceEngineTestFake, TestSetPlayoutError) {
EXPECT_TRUE(SetupSendStream());
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
SetSend(channel_, true);
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(2)));
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
EXPECT_TRUE(AddRecvStream(2));
EXPECT_TRUE(AddRecvStream(3));
EXPECT_TRUE(channel_->SetPlayout(true));
voe_.set_playout_fail_channel(voe_.GetLastChannel() - 1);
EXPECT_TRUE(channel_->SetPlayout(false));
@ -3104,13 +3091,11 @@ TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
cricket::WebRtcVoiceMediaChannel* media_channel =
static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
EXPECT_TRUE(channel_->AddRecvStream(
cricket::StreamParams::CreateLegacy(kSsrc1)));
EXPECT_TRUE(AddRecvStream(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)));
EXPECT_TRUE(AddRecvStream(kSsrc2));
int channel_id2 = voe_.GetLastChannel();
EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrc2));
}
@ -3268,13 +3253,13 @@ TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel) {
EXPECT_TRUE(SetupSendStream());
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
int default_channel = voe_.GetLastChannel();
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
EXPECT_TRUE(AddRecvStream(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);
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(3)));
EXPECT_TRUE(AddRecvStream(3));
recv_ch = voe_.GetLastChannel();
EXPECT_NE(recv_ch, default_channel);
EXPECT_EQ(voe_.GetAssociateSendChannel(recv_ch), default_channel);
@ -3284,7 +3269,7 @@ TEST_F(WebRtcVoiceEngineTestFake, AssociateChannelResetUponDeleteChannnel) {
EXPECT_TRUE(SetupSendStream());
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
EXPECT_TRUE(AddRecvStream(1));
int recv_ch = voe_.GetLastChannel();
EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
@ -3309,8 +3294,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
// Setting the sink before a recv stream exists should do nothing.
channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_1));
EXPECT_TRUE(
channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc1)));
EXPECT_TRUE(AddRecvStream(kSsrc1));
EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
// Now try actually setting the sink.