diff --git a/modules/pacing/paced_sender.cc b/modules/pacing/paced_sender.cc index f35b19b2eb..8a5edf1ae1 100644 --- a/modules/pacing/paced_sender.cc +++ b/modules/pacing/paced_sender.cc @@ -365,6 +365,11 @@ void PacedSender::SetPacingFactor(float pacing_factor) { SetEstimatedBitrate(estimated_bitrate_bps_); } +float PacedSender::GetPacingFactor() const { + rtc::CritScope cs(&critsect_); + return pacing_factor_; +} + void PacedSender::SetQueueTimeLimit(int limit_ms) { rtc::CritScope cs(&critsect_); queue_time_limit = limit_ms; diff --git a/modules/pacing/paced_sender.h b/modules/pacing/paced_sender.h index 4e812fd5f1..b92ee3a8ce 100644 --- a/modules/pacing/paced_sender.h +++ b/modules/pacing/paced_sender.h @@ -144,6 +144,7 @@ class PacedSender : public Pacer { // Called when the prober is associated with a process thread. void ProcessThreadAttached(ProcessThread* process_thread) override; void SetPacingFactor(float pacing_factor); + float GetPacingFactor() const; void SetQueueTimeLimit(int limit_ms); private: diff --git a/video/video_send_stream.cc b/video/video_send_stream.cc index 53e76cf15f..6aa8c28599 100644 --- a/video/video_send_stream.cc +++ b/video/video_send_stream.cc @@ -143,9 +143,13 @@ std::unique_ptr MaybeCreateFlexfecSender( RTPSender::FecExtensionSizes(), rtp_state, Clock::GetRealTimeClock())); } -} // namespace - -namespace { +bool TransportSeqNumExtensionConfigured(const VideoSendStream::Config& config) { + const std::vector& extensions = config.rtp.extensions; + return std::find_if( + extensions.begin(), extensions.end(), [](const RtpExtension& ext) { + return ext.uri == RtpExtension::kTransportSequenceNumberUri; + }) != extensions.end(); +} bool PayloadTypeSupportsSkippingFecPackets(const std::string& payload_name) { const VideoCodecType codecType = PayloadStringToCodecType(payload_name); @@ -719,18 +723,22 @@ VideoSendStreamImpl::VideoSendStreamImpl( field_trial::FindFullName( AlrDetector::kScreenshareProbingBweExperimentName) .empty()); - rtc::Optional alr_settings; - if (content_type == VideoEncoderConfig::ContentType::kScreen) { - alr_settings = AlrDetector::ParseAlrSettingsFromFieldTrial( - AlrDetector::kScreenshareProbingBweExperimentName); - } else { - alr_settings = AlrDetector::ParseAlrSettingsFromFieldTrial( - AlrDetector::kStrictPacingAndProbingExperimentName); - } - if (alr_settings) { - transport->send_side_cc()->EnablePeriodicAlrProbing(true); - transport->pacer()->SetPacingFactor(alr_settings->pacing_factor); - transport->pacer()->SetQueueTimeLimit(alr_settings->max_paced_queue_time); + // If send-side BWE is enabled, check if we should apply updated probing and + // pacing settings. + if (TransportSeqNumExtensionConfigured(*config_)) { + rtc::Optional alr_settings; + if (content_type == VideoEncoderConfig::ContentType::kScreen) { + alr_settings = AlrDetector::ParseAlrSettingsFromFieldTrial( + AlrDetector::kScreenshareProbingBweExperimentName); + } else { + alr_settings = AlrDetector::ParseAlrSettingsFromFieldTrial( + AlrDetector::kStrictPacingAndProbingExperimentName); + } + if (alr_settings) { + transport->send_side_cc()->EnablePeriodicAlrProbing(true); + transport->pacer()->SetPacingFactor(alr_settings->pacing_factor); + transport->pacer()->SetQueueTimeLimit(alr_settings->max_paced_queue_time); + } } if (config_->periodic_alr_bandwidth_probing) { diff --git a/video/video_send_stream_tests.cc b/video/video_send_stream_tests.cc index fd80697bdf..f417dde76e 100644 --- a/video/video_send_stream_tests.cc +++ b/video/video_send_stream_tests.cc @@ -15,6 +15,7 @@ #include "call/rtp_transport_controller_send.h" #include "common_video/include/frame_callback.h" #include "common_video/include/video_frame.h" +#include "modules/pacing/alr_detector.h" #include "modules/rtp_rtcp/include/rtp_header_parser.h" #include "modules/rtp_rtcp/include/rtp_rtcp.h" #include "modules/rtp_rtcp/source/rtcp_sender.h" @@ -3511,4 +3512,81 @@ TEST_F(VideoSendStreamTest, SendsKeepAlive) { RunBaseTest(&test); } +TEST_F(VideoSendStreamTest, ConfiguresAlrWhenSendSideOn) { + const std::string kAlrProbingExperiment = + std::string(AlrDetector::kScreenshareProbingBweExperimentName) + + "/1.1,2875,85,20,-20,0/"; + test::ScopedFieldTrials alr_experiment(kAlrProbingExperiment); + class PacingFactorObserver : public test::SendTest { + public: + PacingFactorObserver(bool configure_send_side, float expected_pacing_factor) + : test::SendTest(kDefaultTimeoutMs), + configure_send_side_(configure_send_side), + expected_pacing_factor_(expected_pacing_factor), + paced_sender_(nullptr) {} + + void ModifyVideoConfigs( + VideoSendStream::Config* send_config, + std::vector* receive_configs, + VideoEncoderConfig* encoder_config) override { + // Check if send-side bwe extension is already present, and remove it if + // it is not desired. + bool has_send_side = false; + for (auto it = send_config->rtp.extensions.begin(); + it != send_config->rtp.extensions.end(); ++it) { + if (it->uri == RtpExtension::kTransportSequenceNumberUri) { + if (configure_send_side_) { + has_send_side = true; + } else { + send_config->rtp.extensions.erase(it); + } + break; + } + } + + if (configure_send_side_ && !has_send_side) { + // Want send side, not present by default, so add it. + send_config->rtp.extensions.emplace_back( + RtpExtension::kTransportSequenceNumberUri, + RtpExtension::kTransportSequenceNumberDefaultId); + } + + // ALR only enabled for screenshare. + encoder_config->content_type = VideoEncoderConfig::ContentType::kScreen; + } + + void OnRtpTransportControllerSendCreated( + RtpTransportControllerSend* controller) override { + // Grab a reference to the pacer. + paced_sender_ = controller->pacer(); + } + + void OnVideoStreamsCreated( + VideoSendStream* send_stream, + const std::vector& receive_streams) override { + // Video streams created, check that pacer is correctly configured. + EXPECT_EQ(expected_pacing_factor_, paced_sender_->GetPacingFactor()); + observation_complete_.Set(); + } + + void PerformTest() override { + EXPECT_TRUE(Wait()) << "Timed out while waiting for pacer config."; + } + + private: + const bool configure_send_side_; + const float expected_pacing_factor_; + const PacedSender* paced_sender_; + }; + + // Send-side bwe on, use pacing factor from |kAlrProbingExperiment| above. + PacingFactorObserver test_with_send_side(true, 1.1f); + RunBaseTest(&test_with_send_side); + + // Send-side bwe off, use default pacing factor. + PacingFactorObserver test_without_send_side( + false, PacedSender::kDefaultPaceMultiplier); + RunBaseTest(&test_without_send_side); +} + } // namespace webrtc