From e0083d480420c2b7318dd20b933c0773d4149a4c Mon Sep 17 00:00:00 2001 From: Per K Date: Fri, 15 Sep 2023 08:35:55 +0200 Subject: [PATCH] lower limit cap of probe to max of current estimate and link capacity The purpose is to not allow an initial low link capacity estimate to reduce the current estimate. Only delay overuse detection , low probe results or a loss event can reduce the estimate. Bug: webrtc:14392 Change-Id: Ib1618347f2c7681e3bd65d85ee687dec3cd67c97 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/320380 Reviewed-by: Diep Bui Commit-Queue: Per Kjellander Cr-Commit-Position: refs/heads/main@{#40751} --- .../goog_cc/probe_controller.cc | 9 ++++----- .../goog_cc/probe_controller_unittest.cc | 12 +++++++----- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/modules/congestion_controller/goog_cc/probe_controller.cc b/modules/congestion_controller/goog_cc/probe_controller.cc index 4e58830f33..6139704fb5 100644 --- a/modules/congestion_controller/goog_cc/probe_controller.cc +++ b/modules/congestion_controller/goog_cc/probe_controller.cc @@ -515,16 +515,15 @@ std::vector ProbeController::InitiateProbing( RTC_LOG(LS_INFO) << "Not sending probe, Network state estimate is zero"; return {}; } - estimate_capped_bitrate = - std::min({estimate_capped_bitrate, max_probe_bitrate, - network_estimate_->link_capacity_upper * - config_.network_state_probe_scale}); + estimate_capped_bitrate = std::min( + {estimate_capped_bitrate, max_probe_bitrate, + std::max(estimated_bitrate_, network_estimate_->link_capacity_upper * + config_.network_state_probe_scale)}); } std::vector pending_probes; for (DataRate bitrate : bitrates_to_probe) { RTC_DCHECK(!bitrate.IsZero()); - bitrate = std::min(bitrate, estimate_capped_bitrate); if (bitrate > max_probe_bitrate) { bitrate = max_probe_bitrate; diff --git a/modules/congestion_controller/goog_cc/probe_controller_unittest.cc b/modules/congestion_controller/goog_cc/probe_controller_unittest.cc index 939a95ae8c..6c02b3e2b5 100644 --- a/modules/congestion_controller/goog_cc/probe_controller_unittest.cc +++ b/modules/congestion_controller/goog_cc/probe_controller_unittest.cc @@ -1103,12 +1103,14 @@ TEST(ProbeControllerTest, SendsProbeIfNetworkStateEstimateLowerThanMaxProbe) { EXPECT_FALSE(probes.empty()); } -TEST(ProbeControllerTest, DontSendProbeIfNetworkStateEstimateIsZero) { +TEST(ProbeControllerTest, + ProbeNotLimitedByNetworkStateEsimateIfLowerThantCurrent) { ProbeControllerFixture fixture( "WebRTC-Bwe-ProbingConfiguration/" "network_state_interval:5s,limit_probe_target_rate_to_loss_bwe:true/"); std::unique_ptr probe_controller = fixture.CreateController(); + probe_controller->EnablePeriodicAlrProbing(true); auto probes = probe_controller->SetBitrates( kMinBitrate, kStartBitrate, kMaxBitrate, fixture.CurrentTime()); probes = probe_controller->SetEstimatedBitrate( @@ -1121,13 +1123,13 @@ TEST(ProbeControllerTest, DontSendProbeIfNetworkStateEstimateIsZero) { probes = probe_controller->Process(fixture.CurrentTime()); ASSERT_TRUE(probes.empty()); + probe_controller->SetAlrStartTimeMs(fixture.CurrentTime().ms()); probe_controller->SetNetworkStateEstimate( - {.link_capacity_upper = DataRate::Zero()}); - probes = probe_controller->Process(fixture.CurrentTime()); - EXPECT_TRUE(probes.empty()); + {.link_capacity_upper = kStartBitrate / 2}); fixture.AdvanceTime(TimeDelta::Seconds(6)); probes = probe_controller->Process(fixture.CurrentTime()); - EXPECT_TRUE(probes.empty()); + ASSERT_FALSE(probes.empty()); + EXPECT_EQ(probes[0].target_data_rate, kStartBitrate); } TEST(ProbeControllerTest, DontProbeIfDelayIncreased) {