From 0987273e1de0b751554760bc54d806d4c88bed57 Mon Sep 17 00:00:00 2001 From: Andrei Dumitru Date: Thu, 29 Aug 2019 12:00:29 -0700 Subject: [PATCH] Add option to enable retransmission for all temporal layers in the constructor for rtp_sender_video. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit R=nisse@webrtc.org Change-Id: I09d03af461d7fbe200098fe91845f7b76fab6c4f Bug: webrtc:10954 Change-Id: I09d03af461d7fbe200098fe91845f7b76fab6c4f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/150863 Commit-Queue: Andrei Dumitru Reviewed-by: Niels Moller Reviewed-by: Åsa Persson Cr-Commit-Position: refs/heads/master@{#29114} --- call/rtp_video_sender.cc | 3 ++- modules/rtp_rtcp/source/nack_rtx_unittest.cc | 3 ++- .../rtp_rtcp/source/rtp_rtcp_impl_unittest.cc | 2 +- modules/rtp_rtcp/source/rtp_sender_unittest.cc | 18 +++++++++--------- modules/rtp_rtcp/source/rtp_sender_video.cc | 7 +++++-- modules/rtp_rtcp/source/rtp_sender_video.h | 4 +++- .../source/rtp_sender_video_unittest.cc | 1 + 7 files changed, 23 insertions(+), 15 deletions(-) diff --git a/call/rtp_video_sender.cc b/call/rtp_video_sender.cc index f5cac2f2a4..420c442845 100644 --- a/call/rtp_video_sender.cc +++ b/call/rtp_video_sender.cc @@ -134,7 +134,8 @@ std::vector CreateRtpStreamSenders( configuration.clock, rtp_rtcp->RtpSender(), configuration.flexfec_sender, playout_delay_oracle.get(), frame_encryptor, crypto_options.sframe.require_frame_encryption, - rtp_config.lntf.enabled, FieldTrialBasedConfig()); + rtp_config.lntf.enabled, /*enable_retransmit_all_layers*/ false, + FieldTrialBasedConfig()); rtp_streams.emplace_back(std::move(playout_delay_oracle), std::move(rtp_rtcp), std::move(sender_video)); } diff --git a/modules/rtp_rtcp/source/nack_rtx_unittest.cc b/modules/rtp_rtcp/source/nack_rtx_unittest.cc index 363fa7960e..bd13280410 100644 --- a/modules/rtp_rtcp/source/nack_rtx_unittest.cc +++ b/modules/rtp_rtcp/source/nack_rtx_unittest.cc @@ -139,7 +139,8 @@ class RtpRtcpRtxNackTest : public ::testing::Test { rtp_rtcp_module_ = RtpRtcp::Create(configuration); rtp_sender_video_ = absl::make_unique( &fake_clock, rtp_rtcp_module_->RtpSender(), nullptr, - &playout_delay_oracle_, nullptr, false, false, FieldTrialBasedConfig()); + &playout_delay_oracle_, nullptr, false, false, false, + FieldTrialBasedConfig()); rtp_rtcp_module_->SetRTCPStatus(RtcpMode::kCompound); rtp_rtcp_module_->SetStorePacketsStatus(true, 600); EXPECT_EQ(0, rtp_rtcp_module_->SetSendingStatus(true)); diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl_unittest.cc b/modules/rtp_rtcp/source/rtp_rtcp_impl_unittest.cc index 3cec171676..0f8c756cad 100644 --- a/modules/rtp_rtcp/source/rtp_rtcp_impl_unittest.cc +++ b/modules/rtp_rtcp/source/rtp_rtcp_impl_unittest.cc @@ -184,7 +184,7 @@ class RtpRtcpImplTest : public ::testing::Test { sender_video_ = absl::make_unique( &clock_, sender_.impl_->RtpSender(), nullptr, &playout_delay_oracle_, - nullptr, false, false, FieldTrialBasedConfig()); + nullptr, false, false, false, FieldTrialBasedConfig()); memset(&codec_, 0, sizeof(VideoCodec)); codec_.plType = 100; diff --git a/modules/rtp_rtcp/source/rtp_sender_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_unittest.cc index 7c4c374fc2..517266a11f 100644 --- a/modules/rtp_rtcp/source/rtp_sender_unittest.cc +++ b/modules/rtp_rtcp/source/rtp_sender_unittest.cc @@ -591,7 +591,7 @@ TEST_P(RtpSenderTestWithoutPacer, OnSendSideDelayUpdated) { PlayoutDelayOracle playout_delay_oracle; RTPSenderVideo rtp_sender_video(&fake_clock_, rtp_sender_.get(), nullptr, &playout_delay_oracle, nullptr, false, false, - FieldTrialBasedConfig()); + false, FieldTrialBasedConfig()); const uint8_t kPayloadType = 127; const char payload_name[] = "GENERIC"; @@ -1084,7 +1084,7 @@ TEST_P(RtpSenderTestWithoutPacer, SendGenericVideo) { PlayoutDelayOracle playout_delay_oracle; RTPSenderVideo rtp_sender_video(&fake_clock_, rtp_sender_.get(), nullptr, &playout_delay_oracle, nullptr, false, false, - FieldTrialBasedConfig()); + false, FieldTrialBasedConfig()); rtp_sender_video.RegisterPayloadType(payload_type, payload_name, /*raw_payload=*/false); uint8_t payload[] = {47, 11, 32, 93, 89}; @@ -1127,7 +1127,7 @@ TEST_P(RtpSenderTestWithoutPacer, SendRawVideo) { PlayoutDelayOracle playout_delay_oracle; RTPSenderVideo rtp_sender_video(&fake_clock_, rtp_sender_.get(), nullptr, &playout_delay_oracle, nullptr, false, false, - FieldTrialBasedConfig()); + false, FieldTrialBasedConfig()); rtp_sender_video.RegisterPayloadType(payload_type, payload_name, /*raw_payload=*/true); @@ -1170,7 +1170,7 @@ TEST_P(RtpSenderTest, SendFlexfecPackets) { PlayoutDelayOracle playout_delay_oracle; RTPSenderVideo rtp_sender_video( &fake_clock_, rtp_sender_.get(), &flexfec_sender, &playout_delay_oracle, - nullptr, false, false, FieldTrialBasedConfig()); + nullptr, false, false, false, FieldTrialBasedConfig()); rtp_sender_video.RegisterPayloadType(kMediaPayloadType, "GENERIC", /*raw_payload=*/false); @@ -1255,7 +1255,7 @@ TEST_P(RtpSenderTest, NoFlexfecForTimingFrames) { PlayoutDelayOracle playout_delay_oracle; RTPSenderVideo rtp_sender_video( &fake_clock_, rtp_sender_.get(), &flexfec_sender, &playout_delay_oracle, - nullptr, false, false, FieldTrialBasedConfig()); + nullptr, false, false, false, FieldTrialBasedConfig()); rtp_sender_video.RegisterPayloadType(kMediaPayloadType, "GENERIC", /*raw_payload=*/false); @@ -1379,7 +1379,7 @@ TEST_P(RtpSenderTestWithoutPacer, SendFlexfecPackets) { PlayoutDelayOracle playout_delay_oracle; RTPSenderVideo rtp_sender_video( &fake_clock_, rtp_sender_.get(), &flexfec_sender, &playout_delay_oracle, - nullptr, false, false, FieldTrialBasedConfig()); + nullptr, false, false, false, FieldTrialBasedConfig()); rtp_sender_video.RegisterPayloadType(kMediaPayloadType, "GENERIC", /*raw_payload=*/false); @@ -1647,7 +1647,7 @@ TEST_P(RtpSenderTest, FecOverheadRate) { PlayoutDelayOracle playout_delay_oracle; RTPSenderVideo rtp_sender_video( &fake_clock_, rtp_sender_.get(), &flexfec_sender, &playout_delay_oracle, - nullptr, false, false, FieldTrialBasedConfig()); + nullptr, false, false, false, FieldTrialBasedConfig()); rtp_sender_video.RegisterPayloadType(kMediaPayloadType, "GENERIC", /*raw_payload=*/false); // Parameters selected to generate a single FEC packet per media packet. @@ -1720,7 +1720,7 @@ TEST_P(RtpSenderTest, BitrateCallbacks) { PlayoutDelayOracle playout_delay_oracle; RTPSenderVideo rtp_sender_video(&fake_clock_, rtp_sender_.get(), nullptr, &playout_delay_oracle, nullptr, false, false, - FieldTrialBasedConfig()); + false, FieldTrialBasedConfig()); const char payload_name[] = "GENERIC"; const uint8_t payload_type = 127; rtp_sender_video.RegisterPayloadType(payload_type, payload_name, @@ -1809,7 +1809,7 @@ TEST_P(RtpSenderTestWithoutPacer, StreamDataCountersCallbacks) { PlayoutDelayOracle playout_delay_oracle; RTPSenderVideo rtp_sender_video(&fake_clock_, rtp_sender_.get(), nullptr, &playout_delay_oracle, nullptr, false, false, - FieldTrialBasedConfig()); + false, FieldTrialBasedConfig()); rtp_sender_video.RegisterPayloadType(payload_type, payload_name, /*raw_payload=*/false); uint8_t payload[] = {47, 11, 32, 93, 89}; diff --git a/modules/rtp_rtcp/source/rtp_sender_video.cc b/modules/rtp_rtcp/source/rtp_sender_video.cc index d5cad467d1..9f76984d46 100644 --- a/modules/rtp_rtcp/source/rtp_sender_video.cc +++ b/modules/rtp_rtcp/source/rtp_sender_video.cc @@ -204,11 +204,14 @@ RTPSenderVideo::RTPSenderVideo(Clock* clock, FrameEncryptorInterface* frame_encryptor, bool require_frame_encryption, bool need_rtp_packet_infos, + bool enable_retransmit_all_layers, const WebRtcKeyValueConfig& field_trials) : rtp_sender_(rtp_sender), clock_(clock), - retransmission_settings_(kRetransmitBaseLayer | - kConditionallyRetransmitHigherLayers), + retransmission_settings_( + enable_retransmit_all_layers + ? kRetransmitAllLayers + : (kRetransmitBaseLayer | kConditionallyRetransmitHigherLayers)), last_rotation_(kVideoRotation_0), transmit_color_space_next_frame_(false), playout_delay_oracle_(playout_delay_oracle), diff --git a/modules/rtp_rtcp/source/rtp_sender_video.h b/modules/rtp_rtcp/source/rtp_sender_video.h index 9b9d157f9a..e3e22735b6 100644 --- a/modules/rtp_rtcp/source/rtp_sender_video.h +++ b/modules/rtp_rtcp/source/rtp_sender_video.h @@ -45,7 +45,8 @@ enum RetransmissionMode : uint8_t { kRetransmitOff = 0x0, kRetransmitBaseLayer = 0x2, kRetransmitHigherLayers = 0x4, - kConditionallyRetransmitHigherLayers = 0x8, + kRetransmitAllLayers = 0x6, + kConditionallyRetransmitHigherLayers = 0x8 }; class RTPSenderVideo { @@ -59,6 +60,7 @@ class RTPSenderVideo { FrameEncryptorInterface* frame_encryptor, bool require_frame_encryption, bool need_rtp_packet_infos, + bool enable_retransmit_all_layers, const WebRtcKeyValueConfig& field_trials); virtual ~RTPSenderVideo(); diff --git a/modules/rtp_rtcp/source/rtp_sender_video_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_video_unittest.cc index 946b62e9cd..d11a7ace49 100644 --- a/modules/rtp_rtcp/source/rtp_sender_video_unittest.cc +++ b/modules/rtp_rtcp/source/rtp_sender_video_unittest.cc @@ -106,6 +106,7 @@ class TestRtpSenderVideo : public RTPSenderVideo { nullptr, false, false, + false, field_trials) {} ~TestRtpSenderVideo() override {}