Allow the SlackedPacer experiment to control SendBurstInterval.

When the slacked pacer experiment is enabled the next pacing opportunity
may be a full tick (~16 ms) from now. Add a flag to allow experimenting
with a burst interval (= 16 ms?) such that we can send bursts in
MaybeProcessPackets.

A common use case would be that EnqueuePackets triggers
MaybeProcessPackets when we are off-tick but we'd still like to create
an immediate burst instead of waiting for the next tick or two for that
to happen.

Bug: webrtc:14152
Change-Id: Ib0ed8312cb7d53b80f3520fff3a6e3bbb5a93fd1
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/264985
Reviewed-by: Per Kjellander <perkj@webrtc.org>
Commit-Queue: Henrik Boström <hbos@webrtc.org>
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#37116}
diff --git a/modules/pacing/task_queue_paced_sender.cc b/modules/pacing/task_queue_paced_sender.cc
index db8e87a..5f268a7 100644
--- a/modules/pacing/task_queue_paced_sender.cc
+++ b/modules/pacing/task_queue_paced_sender.cc
@@ -35,10 +35,11 @@
 TaskQueuePacedSender::SlackedPacerFlags::SlackedPacerFlags(
     const FieldTrialsView& field_trials)
     : allow_low_precision("Enabled"),
-      max_low_precision_expected_queue_time("max_queue_time") {
-  ParseFieldTrial(
-      {&allow_low_precision, &max_low_precision_expected_queue_time},
-      field_trials.Lookup(kSlackedTaskQueuePacedSenderFieldTrial));
+      max_low_precision_expected_queue_time("max_queue_time"),
+      send_burst_interval("send_burst_interval") {
+  ParseFieldTrial({&allow_low_precision, &max_low_precision_expected_queue_time,
+                   &send_burst_interval},
+                  field_trials.Lookup(kSlackedTaskQueuePacedSenderFieldTrial));
 }
 
 TaskQueuePacedSender::TaskQueuePacedSender(
@@ -66,6 +67,11 @@
           "TaskQueuePacedSender",
           TaskQueueFactory::Priority::NORMAL)) {
   RTC_DCHECK_GE(max_hold_back_window_, PacingController::kMinSleepTime);
+  if (slacked_pacer_flags_.allow_low_precision &&
+      slacked_pacer_flags_.send_burst_interval) {
+    pacing_controller_.SetSendBurstInterval(
+        slacked_pacer_flags_.send_burst_interval.Value());
+  }
 }
 
 TaskQueuePacedSender::~TaskQueuePacedSender() {
diff --git a/modules/pacing/task_queue_paced_sender.h b/modules/pacing/task_queue_paced_sender.h
index a390be2..769cedb 100644
--- a/modules/pacing/task_queue_paced_sender.h
+++ b/modules/pacing/task_queue_paced_sender.h
@@ -141,10 +141,14 @@
     // implementation supports slack. When probing, high precision is used
     // regardless to ensure good bandwidth estimation.
     FieldTrialFlag allow_low_precision;
-    // Controlled via the "max_queue_time" experiment arm. If set, uses high
-    // precision scheduling of MaybeProcessPackets() whenever the expected queue
-    // time is greater than or equal to this value.
+    // Controlled via the "max_queue_time" experiment argument. If set, uses
+    // high precision scheduling of MaybeProcessPackets() whenever the expected
+    // queue time is greater than or equal to this value.
     FieldTrialOptional<TimeDelta> max_low_precision_expected_queue_time;
+    // Controlled via "send_burst_interval" experiment argument. If set, the
+    // pacer is allowed to build up a packet "debt" that correspond to
+    // approximately the send rate during the specified interval.
+    FieldTrialOptional<TimeDelta> send_burst_interval;
   };
   const SlackedPacerFlags slacked_pacer_flags_;
   // The holdback window prevents too frequent delayed MaybeProcessPackets()