From 5e3d0f88c85b608e727817790e5b8b6f821dc587 Mon Sep 17 00:00:00 2001 From: Sebastian Jansson Date: Thu, 25 Apr 2019 13:52:24 +0200 Subject: [PATCH] Moves trendline estimation configuration to trendline_estimator.cc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:9883 Change-Id: I5b2139de0c085e1c5ec7c55b5c5ff9a95067e170 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/134205 Commit-Queue: Sebastian Jansson Reviewed-by: Björn Terelius Cr-Commit-Position: refs/heads/master@{#27767} --- .../goog_cc/delay_based_bwe.cc | 51 +++---------------- .../goog_cc/delay_based_bwe.h | 6 +-- .../goog_cc/trendline_estimator.cc | 45 +++++++++++++++- .../goog_cc/trendline_estimator.h | 3 ++ 4 files changed, 56 insertions(+), 49 deletions(-) diff --git a/modules/congestion_controller/goog_cc/delay_based_bwe.cc b/modules/congestion_controller/goog_cc/delay_based_bwe.cc index b63b84a13a..2ec3b857dc 100644 --- a/modules/congestion_controller/goog_cc/delay_based_bwe.cc +++ b/modules/congestion_controller/goog_cc/delay_based_bwe.cc @@ -40,30 +40,6 @@ constexpr double kTimestampToMs = // after the API has been changed. constexpr uint32_t kFixedSsrc = 0; -// Parameters for linear least squares fit of regression line to noisy data. -constexpr size_t kDefaultTrendlineWindowSize = 20; -constexpr double kDefaultTrendlineSmoothingCoeff = 0.9; -constexpr double kDefaultTrendlineThresholdGain = 4.0; - -const char kBweWindowSizeInPacketsExperiment[] = - "WebRTC-BweWindowSizeInPackets"; - -size_t ReadTrendlineFilterWindowSize( - const WebRtcKeyValueConfig* key_value_config) { - std::string experiment_string = - key_value_config->Lookup(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; - RTC_LOG(WARNING) << "Window size must be greater than 1."; - } - RTC_LOG(LS_WARNING) << "Failed to parse parameters for BweWindowSizeInPackets" - " experiment from field trial string. Using default."; - return kDefaultTrendlineWindowSize; -} } // namespace DelayBasedBwe::Result::Result() @@ -86,31 +62,19 @@ DelayBasedBwe::DelayBasedBwe(const WebRtcKeyValueConfig* key_value_config, RtcEventLog* event_log, NetworkStatePredictor* network_state_predictor) : event_log_(event_log), + key_value_config_(key_value_config), + network_state_predictor_(network_state_predictor), inter_arrival_(), - delay_detector_(), + delay_detector_( + new TrendlineEstimator(key_value_config_, network_state_predictor_)), last_seen_packet_(Timestamp::MinusInfinity()), uma_recorded_(false), rate_control_(key_value_config, /*send_side=*/true), - trendline_window_size_( - key_value_config->Lookup(kBweWindowSizeInPacketsExperiment) - .find("Enabled") == 0 - ? ReadTrendlineFilterWindowSize(key_value_config) - : kDefaultTrendlineWindowSize), - trendline_smoothing_coeff_(kDefaultTrendlineSmoothingCoeff), - trendline_threshold_gain_(kDefaultTrendlineThresholdGain), prev_bitrate_(DataRate::Zero()), prev_state_(BandwidthUsage::kBwNormal), alr_limited_backoff_enabled_( key_value_config->Lookup("WebRTC-Bwe-AlrLimitedBackoff") - .find("Enabled") == 0), - network_state_predictor_(network_state_predictor) { - RTC_LOG(LS_INFO) - << "Using Trendline filter for delay change estimation with window size " - << trendline_window_size_; - delay_detector_.reset(new TrendlineEstimator( - trendline_window_size_, trendline_smoothing_coeff_, - trendline_threshold_gain_, network_state_predictor_)); -} + .find("Enabled") == 0) {} DelayBasedBwe::~DelayBasedBwe() {} @@ -176,9 +140,8 @@ void DelayBasedBwe::IncomingPacketFeedback( inter_arrival_.reset( new InterArrival((kTimestampGroupLengthMs << kInterArrivalShift) / 1000, kTimestampToMs, true)); - delay_detector_.reset(new TrendlineEstimator( - trendline_window_size_, trendline_smoothing_coeff_, - trendline_threshold_gain_, network_state_predictor_)); + delay_detector_.reset( + new TrendlineEstimator(key_value_config_, network_state_predictor_)); } last_seen_packet_ = at_time; diff --git a/modules/congestion_controller/goog_cc/delay_based_bwe.h b/modules/congestion_controller/goog_cc/delay_based_bwe.h index efd5edb704..53b1242bad 100644 --- a/modules/congestion_controller/goog_cc/delay_based_bwe.h +++ b/modules/congestion_controller/goog_cc/delay_based_bwe.h @@ -83,18 +83,16 @@ class DelayBasedBwe { rtc::RaceChecker network_race_; RtcEventLog* const event_log_; + const WebRtcKeyValueConfig* const key_value_config_; + NetworkStatePredictor* network_state_predictor_; std::unique_ptr inter_arrival_; std::unique_ptr delay_detector_; Timestamp last_seen_packet_; bool uma_recorded_; AimdRateControl rate_control_; - size_t trendline_window_size_; - double trendline_smoothing_coeff_; - double trendline_threshold_gain_; DataRate prev_bitrate_; BandwidthUsage prev_state_; bool alr_limited_backoff_enabled_; - NetworkStatePredictor* network_state_predictor_; RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(DelayBasedBwe); }; diff --git a/modules/congestion_controller/goog_cc/trendline_estimator.cc b/modules/congestion_controller/goog_cc/trendline_estimator.cc index 7db15a47eb..6053adafbc 100644 --- a/modules/congestion_controller/goog_cc/trendline_estimator.cc +++ b/modules/congestion_controller/goog_cc/trendline_estimator.cc @@ -13,16 +13,43 @@ #include #include +#include #include "absl/types/optional.h" #include "modules/remote_bitrate_estimator/include/bwe_defines.h" #include "modules/remote_bitrate_estimator/test/bwe_test_logging.h" #include "rtc_base/checks.h" +#include "rtc_base/logging.h" #include "rtc_base/numerics/safe_minmax.h" namespace webrtc { namespace { + +// Parameters for linear least squares fit of regression line to noisy data. +constexpr size_t kDefaultTrendlineWindowSize = 20; +constexpr double kDefaultTrendlineSmoothingCoeff = 0.9; +constexpr double kDefaultTrendlineThresholdGain = 4.0; +const char kBweWindowSizeInPacketsExperiment[] = + "WebRTC-BweWindowSizeInPackets"; + +size_t ReadTrendlineFilterWindowSize( + const WebRtcKeyValueConfig* key_value_config) { + std::string experiment_string = + key_value_config->Lookup(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; + RTC_LOG(WARNING) << "Window size must be greater than 1."; + } + RTC_LOG(LS_WARNING) << "Failed to parse parameters for BweWindowSizeInPackets" + " experiment from field trial string. Using default."; + return kDefaultTrendlineWindowSize; +} + absl::optional LinearFitSlope( const std::deque>& points) { RTC_DCHECK(points.size() >= 2); @@ -54,6 +81,18 @@ constexpr int kDeltaCounterMax = 1000; } // namespace +TrendlineEstimator::TrendlineEstimator( + const WebRtcKeyValueConfig* key_value_config, + NetworkStatePredictor* network_state_predictor) + : TrendlineEstimator( + key_value_config->Lookup(kBweWindowSizeInPacketsExperiment) + .find("Enabled") == 0 + ? ReadTrendlineFilterWindowSize(key_value_config) + : kDefaultTrendlineWindowSize, + kDefaultTrendlineSmoothingCoeff, + kDefaultTrendlineThresholdGain, + network_state_predictor) {} + TrendlineEstimator::TrendlineEstimator( size_t window_size, double smoothing_coef, @@ -78,7 +117,11 @@ TrendlineEstimator::TrendlineEstimator( overuse_counter_(0), hypothesis_(BandwidthUsage::kBwNormal), hypothesis_predicted_(BandwidthUsage::kBwNormal), - network_state_predictor_(network_state_predictor) {} + network_state_predictor_(network_state_predictor) { + RTC_LOG(LS_INFO) + << "Using Trendline filter for delay change estimation with window size " + << window_size_; +} TrendlineEstimator::~TrendlineEstimator() {} diff --git a/modules/congestion_controller/goog_cc/trendline_estimator.h b/modules/congestion_controller/goog_cc/trendline_estimator.h index f85c0fc23c..065ad174f1 100644 --- a/modules/congestion_controller/goog_cc/trendline_estimator.h +++ b/modules/congestion_controller/goog_cc/trendline_estimator.h @@ -16,6 +16,7 @@ #include #include "api/network_state_predictor.h" +#include "api/transport/webrtc_key_value_config.h" #include "modules/congestion_controller/goog_cc/delay_increase_detector_interface.h" #include "modules/remote_bitrate_estimator/include/bwe_defines.h" #include "rtc_base/constructor_magic.h" @@ -24,6 +25,8 @@ namespace webrtc { class TrendlineEstimator : public DelayIncreaseDetectorInterface { public: + TrendlineEstimator(const WebRtcKeyValueConfig* key_value_config, + NetworkStatePredictor* network_state_predictor); // |window_size| is the number of points required to compute a trend line. // |smoothing_coef| controls how much we smooth out the delay before fitting // the trend line. |threshold_gain| is used to scale the trendline slope for