Add field trials to configure the backoff factor and the trendline window of the BWE.
These field trials can be set with a string similar to:
WebRTC-BweWindowSizeInPackets/Enabled-150/WebRTC-BweBackOffFactor/Enabled-0.95/
BweWindowSizeInPackets
Number of packets which the delay-based BWE window is based on. A larger value means lower delay-sensitivity.
Default in WebRTC: 20
Reasonable values for streaming: 50-150
BweBackOffFactor
How far the BWE will back off when the delay increases. A value closer to 1.0 means smaller back-off.
Range: > 0.0, < 1.0
Default in WebRTC: 0.85
Reasonable values for streaming: 0.85-0.95
Bug: webrtc:8212
Change-Id: I61f0883788b689847a43273b63cef663042f4d42
Reviewed-on: https://webrtc-review.googlesource.com/6764
Commit-Queue: Stefan Holmer <stefan@webrtc.org>
Reviewed-by: Björn Terelius <terelius@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20172}
diff --git a/modules/congestion_controller/delay_based_bwe.cc b/modules/congestion_controller/delay_based_bwe.cc
index fbe8dcc..af6af76 100644
--- a/modules/congestion_controller/delay_based_bwe.cc
+++ b/modules/congestion_controller/delay_based_bwe.cc
@@ -48,11 +48,23 @@
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 @@
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 4784a83..f6fe97d 100644
--- a/modules/remote_bitrate_estimator/BUILD.gn
+++ b/modules/remote_bitrate_estimator/BUILD.gn
@@ -170,6 +170,7 @@
":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 2daac01..96b0534 100644
--- a/modules/remote_bitrate_estimator/aimd_rate_control.cc
+++ b/modules/remote_bitrate_estimator/aimd_rate_control.cc
@@ -13,19 +13,45 @@
#include <algorithm>
#include <cassert>
#include <cmath>
+#include <string>
#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 @@
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 ee66c72..a623bf1 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 @@
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;