In AimdRateControl, add trial to use current bitrate as min upper limit
This is to ensure that a bad NetworkState estimate can not decrease BWE unless an delay BW overuse has been detected. Bug: webrtc:10489 Change-Id: Ic3a516345999eeba814200c2e295a19b347b2eb6 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/317800 Commit-Queue: Per Kjellander <perkj@webrtc.org> Reviewed-by: Diep Bui <diepbp@google.com> Auto-Submit: Per Kjellander <perkj@webrtc.org> Cr-Commit-Position: refs/heads/main@{#40628}
This commit is contained in:
parent
4d25a77fd3
commit
b5dedfc856
@ -83,7 +83,8 @@ AimdRateControl::AimdRateControl(const FieldTrialsView& key_value_config,
|
|||||||
initial_backoff_interval_("initial_backoff_interval"),
|
initial_backoff_interval_("initial_backoff_interval"),
|
||||||
link_capacity_fix_("link_capacity_fix") {
|
link_capacity_fix_("link_capacity_fix") {
|
||||||
ParseFieldTrial(
|
ParseFieldTrial(
|
||||||
{&disable_estimate_bounded_increase_},
|
{&disable_estimate_bounded_increase_,
|
||||||
|
&use_current_estimate_as_min_upper_bound_},
|
||||||
key_value_config.Lookup("WebRTC-Bwe-EstimateBoundedIncrease"));
|
key_value_config.Lookup("WebRTC-Bwe-EstimateBoundedIncrease"));
|
||||||
// E.g
|
// E.g
|
||||||
// WebRTC-BweAimdRateControlConfig/initial_backoff_interval:100ms/
|
// WebRTC-BweAimdRateControlConfig/initial_backoff_interval:100ms/
|
||||||
@ -350,7 +351,10 @@ void AimdRateControl::ChangeBitrate(const RateControlInput& input,
|
|||||||
DataRate AimdRateControl::ClampBitrate(DataRate new_bitrate) const {
|
DataRate AimdRateControl::ClampBitrate(DataRate new_bitrate) const {
|
||||||
if (!disable_estimate_bounded_increase_ && network_estimate_ &&
|
if (!disable_estimate_bounded_increase_ && network_estimate_ &&
|
||||||
network_estimate_->link_capacity_upper.IsFinite()) {
|
network_estimate_->link_capacity_upper.IsFinite()) {
|
||||||
DataRate upper_bound = network_estimate_->link_capacity_upper;
|
DataRate upper_bound =
|
||||||
|
use_current_estimate_as_min_upper_bound_
|
||||||
|
? std::max(network_estimate_->link_capacity_upper, current_bitrate_)
|
||||||
|
: network_estimate_->link_capacity_upper;
|
||||||
new_bitrate = std::min(upper_bound, new_bitrate);
|
new_bitrate = std::min(upper_bound, new_bitrate);
|
||||||
}
|
}
|
||||||
if (network_estimate_ && network_estimate_->link_capacity_lower.IsFinite() &&
|
if (network_estimate_ && network_estimate_->link_capacity_lower.IsFinite() &&
|
||||||
|
|||||||
@ -105,6 +105,8 @@ class AimdRateControl {
|
|||||||
const bool no_bitrate_increase_in_alr_;
|
const bool no_bitrate_increase_in_alr_;
|
||||||
// If "Disabled", estimated link capacity is not used as upper bound.
|
// If "Disabled", estimated link capacity is not used as upper bound.
|
||||||
FieldTrialFlag disable_estimate_bounded_increase_{"Disabled"};
|
FieldTrialFlag disable_estimate_bounded_increase_{"Disabled"};
|
||||||
|
FieldTrialParameter<bool> use_current_estimate_as_min_upper_bound_{"c_upper",
|
||||||
|
false};
|
||||||
absl::optional<DataRate> last_decrease_;
|
absl::optional<DataRate> last_decrease_;
|
||||||
FieldTrialOptional<TimeDelta> initial_backoff_interval_;
|
FieldTrialOptional<TimeDelta> initial_backoff_interval_;
|
||||||
FieldTrialFlag link_capacity_fix_;
|
FieldTrialFlag link_capacity_fix_;
|
||||||
|
|||||||
@ -212,6 +212,36 @@ TEST(AimdRateControlTest, SetEstimateUpperLimitedByNetworkEstimate) {
|
|||||||
network_estimate.link_capacity_upper);
|
network_estimate.link_capacity_upper);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(AimdRateControlTest,
|
||||||
|
SetEstimateUpperLimitedByCurrentBitrateIfNetworkEstimateIsLow) {
|
||||||
|
AimdRateControl aimd_rate_control(
|
||||||
|
ExplicitKeyValueConfig(
|
||||||
|
"WebRTC-Bwe-EstimateBoundedIncrease/c_upper:true/"),
|
||||||
|
/*send_side=*/true);
|
||||||
|
aimd_rate_control.SetEstimate(DataRate::BitsPerSec(500'000), kInitialTime);
|
||||||
|
ASSERT_EQ(aimd_rate_control.LatestEstimate(), DataRate::BitsPerSec(500'000));
|
||||||
|
|
||||||
|
NetworkStateEstimate network_estimate;
|
||||||
|
network_estimate.link_capacity_upper = DataRate::BitsPerSec(300'000);
|
||||||
|
aimd_rate_control.SetNetworkStateEstimate(network_estimate);
|
||||||
|
aimd_rate_control.SetEstimate(DataRate::BitsPerSec(700'000), kInitialTime);
|
||||||
|
EXPECT_EQ(aimd_rate_control.LatestEstimate(), DataRate::BitsPerSec(500'000));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(AimdRateControlTest,
|
||||||
|
SetEstimateDefaultNotUpperLimitedByCurrentBitrateIfNetworkEstimateIsLow) {
|
||||||
|
AimdRateControl aimd_rate_control(ExplicitKeyValueConfig(""),
|
||||||
|
/*send_side=*/true);
|
||||||
|
aimd_rate_control.SetEstimate(DataRate::BitsPerSec(500'000), kInitialTime);
|
||||||
|
ASSERT_EQ(aimd_rate_control.LatestEstimate(), DataRate::BitsPerSec(500'000));
|
||||||
|
|
||||||
|
NetworkStateEstimate network_estimate;
|
||||||
|
network_estimate.link_capacity_upper = DataRate::BitsPerSec(300'000);
|
||||||
|
aimd_rate_control.SetNetworkStateEstimate(network_estimate);
|
||||||
|
aimd_rate_control.SetEstimate(DataRate::BitsPerSec(700'000), kInitialTime);
|
||||||
|
EXPECT_EQ(aimd_rate_control.LatestEstimate(), DataRate::BitsPerSec(300'000));
|
||||||
|
}
|
||||||
|
|
||||||
TEST(AimdRateControlTest, SetEstimateLowerLimitedByNetworkEstimate) {
|
TEST(AimdRateControlTest, SetEstimateLowerLimitedByNetworkEstimate) {
|
||||||
AimdRateControl aimd_rate_control(ExplicitKeyValueConfig(""),
|
AimdRateControl aimd_rate_control(ExplicitKeyValueConfig(""),
|
||||||
/*send_side=*/true);
|
/*send_side=*/true);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user