diff --git a/modules/congestion_controller/delay_based_bwe.cc b/modules/congestion_controller/delay_based_bwe.cc index fbe8dcced3..af6af76ae7 100644 --- a/modules/congestion_controller/delay_based_bwe.cc +++ b/modules/congestion_controller/delay_based_bwe.cc @@ -48,11 +48,23 @@ constexpr double kDefaultTrendlineThresholdGain = 4.0; constexpr int kMaxConsecutiveFailedLookups = 5; const char kBweSparseUpdateExperiment[] = "WebRTC-BweSparseUpdateExperiment"; +const char kBweWindowSizeInPacketsExperiment[] = + "WebRTC-BweWindowSizeInPackets"; -bool BweSparseUpdateExperimentIsEnabled() { +size_t ReadTrendlineFilterWindowSize() { std::string experiment_string = - webrtc::field_trial::FindFullName(kBweSparseUpdateExperiment); - return experiment_string == "Enabled"; + webrtc::field_trial::FindFullName(kBweWindowSizeInPacketsExperiment); + size_t window_size; + int parsed_values = + sscanf(experiment_string.c_str(), "Enabled-%zu", &window_size); + if (parsed_values == 1) { + if (window_size > 1) + return window_size; + LOG(WARNING) << "Window size must be greater than 1."; + } + LOG(LS_WARNING) << "Failed to parse parameters for BweTrendlineFilter " + "experiment from field trial string. Using default."; + return kDefaultTrendlineWindowSize; } } // namespace @@ -81,14 +93,20 @@ DelayBasedBwe::DelayBasedBwe(RtcEventLog* event_log, const Clock* clock) last_seen_packet_ms_(-1), uma_recorded_(false), probe_bitrate_estimator_(event_log), - trendline_window_size_(kDefaultTrendlineWindowSize), + trendline_window_size_( + webrtc::field_trial::IsEnabled(kBweWindowSizeInPacketsExperiment) + ? ReadTrendlineFilterWindowSize() + : kDefaultTrendlineWindowSize), trendline_smoothing_coeff_(kDefaultTrendlineSmoothingCoeff), trendline_threshold_gain_(kDefaultTrendlineThresholdGain), consecutive_delayed_feedbacks_(0), prev_bitrate_(0), prev_state_(BandwidthUsage::kBwNormal), - in_sparse_update_experiment_(BweSparseUpdateExperimentIsEnabled()) { - LOG(LS_INFO) << "Using Trendline filter for delay change estimation."; + in_sparse_update_experiment_( + webrtc::field_trial::IsEnabled(kBweSparseUpdateExperiment)) { + LOG(LS_INFO) + << "Using Trendline filter for delay change estimation with window size " + << trendline_window_size_; } DelayBasedBwe::~DelayBasedBwe() {} diff --git a/modules/remote_bitrate_estimator/BUILD.gn b/modules/remote_bitrate_estimator/BUILD.gn index 4784a835f4..f6fe97d99a 100644 --- a/modules/remote_bitrate_estimator/BUILD.gn +++ b/modules/remote_bitrate_estimator/BUILD.gn @@ -170,6 +170,7 @@ if (rtc_include_tests) { ":bwe_simulator_lib", ":remote_bitrate_estimator", "../../rtc_base:rtc_base_approved", + "../../test:field_trial", "../../test:test_support", ] if (!build_with_chromium && is_clang) { diff --git a/modules/remote_bitrate_estimator/aimd_rate_control.cc b/modules/remote_bitrate_estimator/aimd_rate_control.cc index 2daac01d21..96b0534cde 100644 --- a/modules/remote_bitrate_estimator/aimd_rate_control.cc +++ b/modules/remote_bitrate_estimator/aimd_rate_control.cc @@ -13,19 +13,45 @@ #include #include #include +#include #include "rtc_base/checks.h" #include "rtc_base/safe_minmax.h" -#include "modules/remote_bitrate_estimator/overuse_detector.h" #include "modules/remote_bitrate_estimator/include/bwe_defines.h" #include "modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h" +#include "modules/remote_bitrate_estimator/overuse_detector.h" #include "modules/remote_bitrate_estimator/test/bwe_test_logging.h" +#include "rtc_base/logging.h" +#include "system_wrappers/include/field_trial.h" namespace webrtc { static const int64_t kDefaultRttMs = 200; static const int64_t kMaxFeedbackIntervalMs = 1000; +static const float kDefaultBackoffFactor = 0.85f; + +const char kBweBackOffFactorExperiment[] = "WebRTC-BweBackOffFactor"; + +float ReadTrendlineFilterWindowSize() { + std::string experiment_string = + webrtc::field_trial::FindFullName(kBweBackOffFactorExperiment); + float backoff_factor; + int parsed_values = + sscanf(experiment_string.c_str(), "Enabled-%f", &backoff_factor); + if (parsed_values == 1) { + if (backoff_factor < 1.0f) { + LOG(WARNING) << "Back-off factor must be less than 1."; + } else if (backoff_factor > 0.0f) { + LOG(WARNING) << "Back-off factor must be greater than 0."; + } else { + return backoff_factor; + } + } + LOG(LS_WARNING) << "Failed to parse parameters for AimdRateControl " + "experiment from field trial string. Using default."; + return kDefaultBackoffFactor; +} AimdRateControl::AimdRateControl() : min_configured_bitrate_bps_(congestion_controller::GetMinBitrateBps()), @@ -38,9 +64,13 @@ AimdRateControl::AimdRateControl() time_last_bitrate_change_(-1), time_first_incoming_estimate_(-1), bitrate_is_initialized_(false), - beta_(0.85f), + beta_(webrtc::field_trial::IsEnabled(kBweBackOffFactorExperiment) + ? ReadTrendlineFilterWindowSize() + : kDefaultBackoffFactor), rtt_(kDefaultRttMs), - in_experiment_(!AdaptiveThresholdExperimentIsDisabled()) {} + in_experiment_(!AdaptiveThresholdExperimentIsDisabled()) { + LOG(LS_INFO) << "Using aimd rate control with back off factor " << beta_; +} AimdRateControl::~AimdRateControl() {} diff --git a/modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc b/modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc index ee66c72b55..a623bf1d32 100644 --- a/modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc +++ b/modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc @@ -22,6 +22,7 @@ #include "modules/remote_bitrate_estimator/test/packet_sender.h" #include "rtc_base/constructormagic.h" #include "rtc_base/random.h" +#include "test/field_trial.h" #include "test/testsupport/fileutils.h" namespace webrtc { @@ -142,6 +143,24 @@ TEST_P(BweFeedbackTest, GoogleWifiTrace3Mbps) { 0, receiver.GetDelayStats(), counter2.GetBitrateStats()); } +TEST_P(BweFeedbackTest, GoogleWifiTrace3MbpsStreaming) { + test::ScopedFieldTrials override_field_trials( + "WebRTC-BweWindowSizeInPackets/Enabled-100/" + "WebRTC-BweBackOffFactor/Enabled-0.95/"); + AdaptiveVideoSource source(0, 30, 300, 0, 0); + VideoSender sender(&uplink_, &source, GetParam()); + RateCounterFilter counter1(&uplink_, 0, "sender_output", + bwe_names[GetParam()]); + TraceBasedDeliveryFilter filter(&uplink_, 0, "link_capacity"); + filter.set_max_delay_ms(500); + RateCounterFilter counter2(&uplink_, 0, "Receiver", bwe_names[GetParam()]); + PacketReceiver receiver(&uplink_, 0, GetParam(), false, false); + ASSERT_TRUE(filter.Init(test::ResourcePath("google-wifi-3mbps", "rx"))); + RunFor(300 * 1000); + PrintResults(filter.GetBitrateStats().GetMean(), counter2.GetBitrateStats(), + 0, receiver.GetDelayStats(), counter2.GetBitrateStats()); +} + TEST_P(BweFeedbackTest, PacedSelfFairness50msTest) { int64_t kRttMs = 100; int64_t kMaxJitterMs = 15;