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()