Correct setting Scream padding end time This fix a bug where padding start after 1s after a congestion event instead of ensuring that the correct time period after last padding attempt have passed. Bug: webrtc:447037083 Change-Id: I6e0915a793abfa14648c01bde09ffc41e4f64e86 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/459960 Reviewed-by: Jakob Ivarsson‎ <jakobi@webrtc.org> Commit-Queue: Per Kjellander <perkj@webrtc.org> Cr-Commit-Position: refs/heads/main@{#47256}
diff --git a/modules/congestion_controller/scream/scream_network_controller.cc b/modules/congestion_controller/scream/scream_network_controller.cc index e20e589..c496bc7 100644 --- a/modules/congestion_controller/scream/scream_network_controller.cc +++ b/modules/congestion_controller/scream/scream_network_controller.cc
@@ -64,6 +64,7 @@ RTC_DCHECK(network_available_); RTC_DCHECK(!first_update_created_); first_update_created_ = true; + padding_interval_end_time_ = Timestamp::MinusInfinity(); if (allow_initial_bwe_before_media_) { initial_bwe_probe_end_time_ = now + params_.initial_probing_duration.Get(); } @@ -237,9 +238,9 @@ now + params_.periodic_padding_duration.Get(); allow_padding = true; } - } else { + } else if (now < padding_interval_end_time_) { // Stop padding immediately if a congestion event occurred recently. - padding_interval_end_time_ = Timestamp::MinusInfinity(); + padding_interval_end_time_ = now; } DataRate padding_rate = DataRate::Zero();
diff --git a/modules/congestion_controller/scream/scream_network_controller_unittest.cc b/modules/congestion_controller/scream/scream_network_controller_unittest.cc index 9dc4280..6331b8d 100644 --- a/modules/congestion_controller/scream/scream_network_controller_unittest.cc +++ b/modules/congestion_controller/scream/scream_network_controller_unittest.cc
@@ -412,7 +412,9 @@ scream_controller.OnTransportPacketsFeedback(feedback); if (update.pacer_config.has_value()) { if (update.pacer_config->pad_rate() != DataRate::Zero()) { - padding_start = clock.CurrentTime(); + if (padding_start.IsZero()) { + padding_start = clock.CurrentTime(); + } if (increase_send_rate) { // Set the send rate equal to the padding rate. send_rate = update.pacer_config->pad_rate(); @@ -487,6 +489,40 @@ EXPECT_LT(time_between_padding, TimeDelta::Millis(3300)); } +TEST(ScreamControllerTest, DelayPaddingAfterCongestion) { + SimulatedClock clock(Timestamp::Seconds(1'234)); + Environment env = CreateTestEnvironment({.time = &clock}); + NetworkControllerConfig config(env); + ScreamNetworkController scream_controller(config); + CcFeedbackGenerator feedback_generator( + {.network_config = {.queue_delay_ms = 10, + .link_capacity = DataRate::KilobitsPerSec(500)}, + .send_as_ect1 = true}); + StreamsConfig streams_config; + streams_config.max_total_allocated_bitrate = DataRate::KilobitsPerSec(1000); + scream_controller.OnStreamsConfig(streams_config); + + // Padding should start, but then stop since pushing to max allocated causes + // congestion. + PaddingTestResult result_1 = ProcessUntilPaddingStartAndStop( + clock, scream_controller, feedback_generator, + /*increase_send_rate=*/true); + + // Ensure it was stopped quickly when congestion kicked in. + EXPECT_LT(result_1.padding_stop - result_1.padding_start, + TimeDelta::Seconds(1)); + + // Network recovers because increase_send_rate=false keeps sending rate at + // 50kbps. Wait until next padding starts. + PaddingTestResult result_2 = ProcessUntilPaddingStartAndStop( + clock, scream_controller, feedback_generator, + /*increase_send_rate=*/false); + + TimeDelta time_until_padding = result_2.padding_start - result_1.padding_stop; + EXPECT_GT(time_until_padding, TimeDelta::Millis(2500)); + EXPECT_LT(time_until_padding, TimeDelta::Millis(3500)); +} + TEST(ScreamControllerTest, PadsToMinOf2xCurrentMaxAndEverSeenMax) { SimulatedClock clock(Timestamp::Seconds(1'234)); Environment env = CreateTestEnvironment({.time = &clock});