Fix for NACK retransmission in Scenario tests.

This fixes a bug where NACK mode was not properly enabled
due to missing send side configuration.

Bug: webrtc:9510
Change-Id: I318fdf44f17e57d30589115a452f6a64f81ee973
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/143781
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28391}
This commit is contained in:
Sebastian Jansson
2019-06-26 16:22:39 +02:00
committed by Commit Bot
parent be0adee768
commit c57b0ee11c
2 changed files with 29 additions and 6 deletions

View File

@ -124,6 +124,8 @@ VideoSendStream::Config CreateVideoSendStreamConfig(VideoStreamConfig config,
VideoSendStream::Config send_config(send_transport);
send_config.rtp.payload_name = CodecTypeToPayloadString(config.encoder.codec);
send_config.rtp.payload_type = CodecTypeToPayloadType(config.encoder.codec);
send_config.rtp.nack.rtp_history_ms =
config.stream.nack_history_time.ms<int>();
send_config.rtp.ssrcs = ssrcs;
send_config.rtp.extensions = GetVideoRtpExtensions(config);
@ -359,20 +361,23 @@ SendVideoStream::SendVideoStream(CallClient* sender,
using Codec = VideoStreamConfig::Encoder::Codec;
switch (config.encoder.implementation) {
case Encoder::Implementation::kFake:
if (config.encoder.codec == Codec::kVideoCodecGeneric) {
encoder_factory_ =
absl::make_unique<FunctionVideoEncoderFactory>([this]() {
rtc::CritScope cs(&crit_);
auto encoder =
absl::make_unique<test::FakeEncoder>(sender_->clock_);
std::unique_ptr<FakeEncoder> encoder;
if (config_.encoder.codec == Codec::kVideoCodecVP8) {
encoder =
absl::make_unique<test::FakeVP8Encoder>(sender_->clock_);
} else if (config_.encoder.codec == Codec::kVideoCodecGeneric) {
encoder = absl::make_unique<test::FakeEncoder>(sender_->clock_);
} else {
RTC_NOTREACHED();
}
fake_encoders_.push_back(encoder.get());
if (config_.encoder.fake.max_rate.IsFinite())
encoder->SetMaxBitrate(config_.encoder.fake.max_rate.kbps());
return encoder;
});
} else {
RTC_NOTREACHED();
}
break;
case VideoStreamConfig::Encoder::Implementation::kSoftware:
encoder_factory_.reset(new InternalEncoderFactory());

View File

@ -114,6 +114,22 @@ TEST(VideoStreamTest, RecievesVp8SimulcastFrames) {
EXPECT_GE(frame_counts[2], kExpectedCount);
}
TEST(VideoStreamTest, SendsNacksOnLoss) {
Scenario s;
auto route =
s.CreateRoutes(s.CreateClient("caller", CallClientConfig()),
{s.CreateSimulationNode([](NetworkSimulationConfig* c) {
c->loss_rate = 0.2;
})},
s.CreateClient("callee", CallClientConfig()),
{s.CreateSimulationNode(NetworkSimulationConfig())});
// NACK retransmissions are enabled by default.
auto video = s.CreateVideoStream(route->forward(), VideoStreamConfig());
s.RunFor(TimeDelta::seconds(1));
auto stream_stats = video->send()->GetStats().substreams.begin()->second;
EXPECT_GT(stream_stats.rtp_stats.retransmitted.packets, 0u);
}
TEST(VideoStreamTest, SendsFecWithUlpFec) {
Scenario s;
auto route =
@ -124,6 +140,8 @@ TEST(VideoStreamTest, SendsFecWithUlpFec) {
s.CreateClient("callee", CallClientConfig()),
{s.CreateSimulationNode(NetworkSimulationConfig())});
auto video = s.CreateVideoStream(route->forward(), [&](VideoStreamConfig* c) {
// We do not allow NACK+ULPFEC for generic codec, using VP8.
c->encoder.codec = VideoStreamConfig::Encoder::Codec::kVideoCodecVP8;
c->stream.use_ulpfec = true;
});
s.RunFor(TimeDelta::seconds(5));