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});