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}
This commit is contained in:
Stefan Holmer 2017-10-06 08:43:34 +02:00 committed by Commit Bot
parent e68b6c970e
commit ea00e483d1
4 changed files with 77 additions and 9 deletions

View File

@ -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() {}

View File

@ -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) {

View File

@ -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 @@ 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() {}

View File

@ -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;