From d97b862593dcfe5e0c666ede330259263bb32ffc Mon Sep 17 00:00:00 2001 From: Bjorn Terelius Date: Wed, 4 Jul 2018 17:03:55 +0200 Subject: [PATCH] Field trial to initialize throughput estimate faster. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The current acknowledged bitrate (i.e. throughput) estimator takes 500ms to initialize. This CL creates a field trial to experiment with this arbitrary initialization time. Bug: webrtc:9492, webrtc:7746 Change-Id: I8a803f7bc0ee78856e808e289f37bab57d763efa Reviewed-on: https://webrtc-review.googlesource.com/87145 Reviewed-by: Philip Eliasson Commit-Queue: Björn Terelius Cr-Commit-Position: refs/heads/master@{#23852} --- .../goog_cc/bitrate_estimator.cc | 50 ++++++++++++++++--- .../goog_cc/bitrate_estimator.h | 3 +- 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/modules/congestion_controller/goog_cc/bitrate_estimator.cc b/modules/congestion_controller/goog_cc/bitrate_estimator.cc index 692c3da2bc..c776827802 100644 --- a/modules/congestion_controller/goog_cc/bitrate_estimator.cc +++ b/modules/congestion_controller/goog_cc/bitrate_estimator.cc @@ -11,23 +11,57 @@ #include "modules/congestion_controller/goog_cc/bitrate_estimator.h" #include +#include #include "modules/remote_bitrate_estimator/test/bwe_test_logging.h" #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" +#include "rtc_base/logging.h" +#include "system_wrappers/include/field_trial.h" namespace webrtc { namespace { constexpr int kInitialRateWindowMs = 500; constexpr int kRateWindowMs = 150; + +const char kBweInitialThroughputWindowExperiment[] = + "WebRTC-BweInitialThroughputWindowExperiment"; + +int ReadInitialThroughputWindowSizeMs() { + std::string experiment_string = + webrtc::field_trial::FindFullName(kBweInitialThroughputWindowExperiment); + int initial_window_ms = kInitialRateWindowMs; + int parsed_values = + sscanf(experiment_string.c_str(), "Enabled-%d", &initial_window_ms); + if (parsed_values != 1) { + RTC_LOG(LS_ERROR) << "Incorrectly formatted field trial string for " + << kBweInitialThroughputWindowExperiment; + return kInitialRateWindowMs; + } + if (kRateWindowMs <= initial_window_ms && initial_window_ms <= 1000) { + RTC_LOG(LS_INFO) << kBweInitialThroughputWindowExperiment + << " enabled with " << initial_window_ms << " ms window."; + return initial_window_ms; + } + RTC_LOG(LS_ERROR) + << "Initial window for throughput estimation must be between " + << kRateWindowMs << " and 1000 ms."; + return kInitialRateWindowMs; +} + } // namespace BitrateEstimator::BitrateEstimator() : sum_(0), - current_win_ms_(0), + initial_window_ms_(kInitialRateWindowMs), + current_window_ms_(0), prev_time_ms_(-1), bitrate_estimate_(-1.0f), - bitrate_estimate_var_(50.0f) {} + bitrate_estimate_var_(50.0f) { + if (field_trial::IsEnabled(kBweInitialThroughputWindowExperiment)) { + initial_window_ms_ = ReadInitialThroughputWindowSizeMs(); + } +} BitrateEstimator::~BitrateEstimator() = default; @@ -36,7 +70,7 @@ void BitrateEstimator::Update(int64_t now_ms, int bytes) { // We use a larger window at the beginning to get a more stable sample that // we can use to initialize the estimate. if (bitrate_estimate_ < 0.f) - rate_window_ms = kInitialRateWindowMs; + rate_window_ms = initial_window_ms_; float bitrate_sample = UpdateWindow(now_ms, bytes, rate_window_ms); if (bitrate_sample < 0.0f) return; @@ -71,21 +105,21 @@ float BitrateEstimator::UpdateWindow(int64_t now_ms, if (now_ms < prev_time_ms_) { prev_time_ms_ = -1; sum_ = 0; - current_win_ms_ = 0; + current_window_ms_ = 0; } if (prev_time_ms_ >= 0) { - current_win_ms_ += now_ms - prev_time_ms_; + current_window_ms_ += now_ms - prev_time_ms_; // Reset if nothing has been received for more than a full window. if (now_ms - prev_time_ms_ > rate_window_ms) { sum_ = 0; - current_win_ms_ %= rate_window_ms; + current_window_ms_ %= rate_window_ms; } } prev_time_ms_ = now_ms; float bitrate_sample = -1.0f; - if (current_win_ms_ >= rate_window_ms) { + if (current_window_ms_ >= rate_window_ms) { bitrate_sample = 8.0f * sum_ / static_cast(rate_window_ms); - current_win_ms_ -= rate_window_ms; + current_window_ms_ -= rate_window_ms; sum_ = 0; } sum_ += bytes; diff --git a/modules/congestion_controller/goog_cc/bitrate_estimator.h b/modules/congestion_controller/goog_cc/bitrate_estimator.h index 24f08fa50b..610fa214e7 100644 --- a/modules/congestion_controller/goog_cc/bitrate_estimator.h +++ b/modules/congestion_controller/goog_cc/bitrate_estimator.h @@ -35,7 +35,8 @@ class BitrateEstimator { private: float UpdateWindow(int64_t now_ms, int bytes, int rate_window_ms); int sum_; - int64_t current_win_ms_; + int64_t initial_window_ms_; + int64_t current_window_ms_; int64_t prev_time_ms_; float bitrate_estimate_; float bitrate_estimate_var_;