From 8263020407ee9fc66afdc00985c7263e6784ccf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Bostr=C3=B6m?= Date: Fri, 3 Jun 2022 13:09:46 +0200 Subject: [PATCH] Allow the SlackedPacer experiment to control SendBurstInterval. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Commit-Queue: Henrik Boström Reviewed-by: Philip Eliasson Cr-Commit-Position: refs/heads/main@{#37116} --- modules/pacing/task_queue_paced_sender.cc | 14 ++++++++++---- modules/pacing/task_queue_paced_sender.h | 10 +++++++--- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/modules/pacing/task_queue_paced_sender.cc b/modules/pacing/task_queue_paced_sender.cc index db8e87ae6e..5f268a76a4 100644 --- a/modules/pacing/task_queue_paced_sender.cc +++ b/modules/pacing/task_queue_paced_sender.cc @@ -35,10 +35,11 @@ const int TaskQueuePacedSender::kNoPacketHoldback = -1; 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::TaskQueuePacedSender( "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 a390be28b2..769cedb124 100644 --- a/modules/pacing/task_queue_paced_sender.h +++ b/modules/pacing/task_queue_paced_sender.h @@ -141,10 +141,14 @@ class TaskQueuePacedSender : public RtpPacketPacer, public RtpPacketSender { // 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 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 send_burst_interval; }; const SlackedPacerFlags slacked_pacer_flags_; // The holdback window prevents too frequent delayed MaybeProcessPackets()