Add new field trial for controlling congestion window settings
Bug: None
Change-Id: Idb7425e394db74a9dfb4f3764a58710497adff56
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/131127
Reviewed-by: Magnus Flodman <mflodman@webrtc.org>
Reviewed-by: Christoffer Rodbro <crodbro@webrtc.org>
Commit-Queue: Evan Shrubsole <eshr@google.com>
Cr-Commit-Position: refs/heads/master@{#27538}
diff --git a/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc b/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc
index 1831f5d..e617def 100644
--- a/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc
+++ b/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc
@@ -239,8 +239,7 @@
// Test congestion window pushback on network delay happens.
TEST_F(GoogCcNetworkControllerTest, CongestionWindowPushbackOnNetworkDelay) {
ScopedFieldTrials trial(
- "WebRTC-CongestionWindowPushback/Enabled/WebRTC-CwndExperiment/"
- "Enabled-800/");
+ "WebRTC-CongestionWindow/QueueSize:800,MinBitrate:30000/");
Scenario s("googcc_unit/cwnd_on_delay", false);
auto send_net = s.CreateSimulationNode([=](NetworkNodeConfig* c) {
c->simulation.bandwidth = DataRate::kbps(1000);
@@ -328,8 +327,7 @@
TEST_F(GoogCcNetworkControllerTest,
PaddingRateLimitedByCongestionWindowInTrial) {
ScopedFieldTrials trial(
- "WebRTC-CongestionWindowPushback/Enabled/WebRTC-CwndExperiment/"
- "Enabled-200/");
+ "WebRTC-CongestionWindow/QueueSize:200,MinBitrate:30000/");
Scenario s("googcc_unit/padding_limited", false);
NetworkNodeConfig net_conf;
@@ -633,8 +631,8 @@
TargetRateReducedOnPacingBufferBuildupInTrial) {
// Configure strict pacing to ensure build-up.
ScopedFieldTrials trial(
- "WebRTC-CongestionWindowPushback/Enabled/WebRTC-CwndExperiment/"
- "Enabled-100/WebRTC-Video-Pacing/factor:1.0/"
+ "WebRTC-CongestionWindow/QueueSize:100,MinBitrate:30000/"
+ "WebRTC-Video-Pacing/factor:1.0/"
"WebRTC-AddPacingToCongestionWindowPushback/Enabled/");
const DataRate kLinkCapacity = DataRate::kbps(1000);
diff --git a/rtc_base/experiments/rate_control_settings.cc b/rtc_base/experiments/rate_control_settings.cc
index 608996b..7ef42de 100644
--- a/rtc_base/experiments/rate_control_settings.cc
+++ b/rtc_base/experiments/rate_control_settings.cc
@@ -16,6 +16,7 @@
#include <string>
#include "api/transport/field_trial_based_config.h"
+#include "rtc_base/experiments/field_trial_parser.h"
#include "rtc_base/logging.h"
#include "rtc_base/numerics/safe_conversions.h"
@@ -23,11 +24,8 @@
namespace {
-const char* kCongestionWindowFieldTrialName = "WebRTC-CwndExperiment";
const int kDefaultAcceptedQueueMs = 250;
-const char* kCongestionWindowPushbackFieldTrialName =
- "WebRTC-CongestionWindowPushback";
const int kDefaultMinPushbackTargetBitrateBps = 30000;
const char kVp8TrustedRateControllerFieldTrialName[] =
@@ -43,40 +41,6 @@
// Default to 35% hysteresis for simulcast screenshare.
const double kDefaultScreenshareHysteresisFactor = 1.35;
-absl::optional<int> MaybeReadCwndExperimentParameter(
- const WebRtcKeyValueConfig* const key_value_config) {
- int64_t accepted_queue_ms;
- std::string experiment_string =
- key_value_config->Lookup(kCongestionWindowFieldTrialName);
- int parsed_values =
- sscanf(experiment_string.c_str(), "Enabled-%" PRId64, &accepted_queue_ms);
- if (parsed_values == 1) {
- RTC_CHECK_GE(accepted_queue_ms, 0)
- << "Accepted must be greater than or equal to 0.";
- return rtc::checked_cast<int>(accepted_queue_ms);
- } else if (experiment_string.find("Enabled") == 0) {
- return kDefaultAcceptedQueueMs;
- }
- return absl::nullopt;
-}
-
-absl::optional<int> MaybeReadCongestionWindowPushbackExperimentParameter(
- const WebRtcKeyValueConfig* const key_value_config) {
- uint32_t min_pushback_target_bitrate_bps;
- std::string experiment_string =
- key_value_config->Lookup(kCongestionWindowPushbackFieldTrialName);
- int parsed_values = sscanf(experiment_string.c_str(), "Enabled-%" PRIu32,
- &min_pushback_target_bitrate_bps);
- if (parsed_values == 1) {
- RTC_CHECK_GE(min_pushback_target_bitrate_bps, 0)
- << "Min pushback target bitrate must be greater than or equal to 0.";
- return rtc::checked_cast<int>(min_pushback_target_bitrate_bps);
- } else if (experiment_string.find("Enabled") == 0) {
- return kDefaultMinPushbackTargetBitrateBps;
- }
- return absl::nullopt;
-}
-
bool IsEnabled(const WebRtcKeyValueConfig* const key_value_config,
absl::string_view key) {
return key_value_config->Lookup(key).find("Enabled") == 0;
@@ -98,12 +62,8 @@
RateControlSettings::RateControlSettings(
const WebRtcKeyValueConfig* const key_value_config)
- : congestion_window_("cwnd",
- MaybeReadCwndExperimentParameter(key_value_config)),
- congestion_window_pushback_(
- "cwnd_pushback",
- MaybeReadCongestionWindowPushbackExperimentParameter(
- key_value_config)),
+ : congestion_window_("QueueSize"),
+ congestion_window_pushback_("MinBitrate"),
pacing_factor_("pacing_factor"),
alr_probing_("alr_probing", false),
trust_vp8_(
@@ -124,8 +84,9 @@
probe_max_allocation_("probe_max_allocation", true),
bitrate_adjuster_("bitrate_adjuster", false),
vp8_s0_boost_("vp8_s0_boost", true) {
- ParseFieldTrial({&congestion_window_, &congestion_window_pushback_,
- &pacing_factor_, &alr_probing_, &trust_vp8_, &trust_vp9_,
+ ParseFieldTrial({&congestion_window_, &congestion_window_pushback_},
+ key_value_config->Lookup("WebRTC-CongestionWindow"));
+ ParseFieldTrial({&pacing_factor_, &alr_probing_, &trust_vp8_, &trust_vp9_,
&video_hysteresis_, &screenshare_hysteresis_,
&probe_max_allocation_, &bitrate_adjuster_, &vp8_s0_boost_},
key_value_config->Lookup("WebRTC-VideoRateControl"));
diff --git a/rtc_base/experiments/rate_control_settings_unittest.cc b/rtc_base/experiments/rate_control_settings_unittest.cc
index 0d8c376..0f23df0 100644
--- a/rtc_base/experiments/rate_control_settings_unittest.cc
+++ b/rtc_base/experiments/rate_control_settings_unittest.cc
@@ -23,7 +23,8 @@
EXPECT_FALSE(
RateControlSettings::ParseFromFieldTrials().UseCongestionWindow());
- test::ScopedFieldTrials field_trials("WebRTC-VideoRateControl/cwnd:100/");
+ test::ScopedFieldTrials field_trials(
+ "WebRTC-CongestionWindow/QueueSize:100/");
const RateControlSettings settings_after =
RateControlSettings::ParseFromFieldTrials();
EXPECT_TRUE(settings_after.UseCongestionWindow());
@@ -35,7 +36,7 @@
.UseCongestionWindowPushback());
test::ScopedFieldTrials field_trials(
- "WebRTC-VideoRateControl/cwnd:100,cwnd_pushback:100000/");
+ "WebRTC-CongestionWindow/QueueSize:100,MinBitrate:100000/");
const RateControlSettings settings_after =
RateControlSettings::ParseFromFieldTrials();
EXPECT_TRUE(settings_after.UseCongestionWindowPushback());
diff --git a/video/end_to_end_tests/transport_feedback_tests.cc b/video/end_to_end_tests/transport_feedback_tests.cc
index b607bf6..95ab6ce 100644
--- a/video/end_to_end_tests/transport_feedback_tests.cc
+++ b/video/end_to_end_tests/transport_feedback_tests.cc
@@ -345,7 +345,7 @@
TEST_F(TransportFeedbackEndToEndTest,
StopsAndResumesMediaWhenCongestionWindowFull) {
test::ScopedFieldTrials override_field_trials(
- "WebRTC-CwndExperiment/Enabled-250/");
+ "WebRTC-CongestionWindow/QueueSize:250/");
class TransportFeedbackTester : public test::EndToEndTest {
public: