diff --git a/modules/pacing/task_queue_paced_sender.cc b/modules/pacing/task_queue_paced_sender.cc index fffb371c17..b13bc11546 100644 --- a/modules/pacing/task_queue_paced_sender.cc +++ b/modules/pacing/task_queue_paced_sender.cc @@ -25,6 +25,8 @@ namespace webrtc { namespace { +constexpr const char* kBurstyPacerFieldTrial = "WebRTC-BurstyPacer"; + constexpr const char* kSlackedTaskQueuePacedSenderFieldTrial = "WebRTC-SlackedTaskQueuePacedSender"; @@ -32,6 +34,12 @@ constexpr const char* kSlackedTaskQueuePacedSenderFieldTrial = const int TaskQueuePacedSender::kNoPacketHoldback = -1; +TaskQueuePacedSender::BurstyPacerFlags::BurstyPacerFlags( + const FieldTrialsView& field_trials) + : burst("burst") { + ParseFieldTrial({&burst}, field_trials.Lookup(kBurstyPacerFieldTrial)); +} + TaskQueuePacedSender::SlackedPacerFlags::SlackedPacerFlags( const FieldTrialsView& field_trials) : allow_low_precision("Enabled"), @@ -50,6 +58,7 @@ TaskQueuePacedSender::TaskQueuePacedSender( TimeDelta max_hold_back_window, int max_hold_back_window_in_packets) : clock_(clock), + bursty_pacer_flags_(field_trials), slacked_pacer_flags_(field_trials), max_hold_back_window_(slacked_pacer_flags_.allow_low_precision ? PacingController::kMinSleepTime @@ -67,10 +76,18 @@ TaskQueuePacedSender::TaskQueuePacedSender( "TaskQueuePacedSender", TaskQueueFactory::Priority::NORMAL)) { RTC_DCHECK_GE(max_hold_back_window_, PacingController::kMinSleepTime); + // There are multiple field trials that can affect burst. If multiple bursts + // are specified we pick the largest of the values. + absl::optional burst = bursty_pacer_flags_.burst.GetOptional(); if (slacked_pacer_flags_.allow_low_precision && slacked_pacer_flags_.send_burst_interval) { - pacing_controller_.SetSendBurstInterval( - slacked_pacer_flags_.send_burst_interval.Value()); + TimeDelta slacked_burst = slacked_pacer_flags_.send_burst_interval.Value(); + if (!burst.has_value() || burst.value() < slacked_burst) { + burst = slacked_burst; + } + } + if (burst.has_value()) { + pacing_controller_.SetSendBurstInterval(burst.value()); } } diff --git a/modules/pacing/task_queue_paced_sender.h b/modules/pacing/task_queue_paced_sender.h index 769cedb124..97b0453e0b 100644 --- a/modules/pacing/task_queue_paced_sender.h +++ b/modules/pacing/task_queue_paced_sender.h @@ -131,6 +131,15 @@ class TaskQueuePacedSender : public RtpPacketPacer, public RtpPacketSender { Stats GetStats() const; Clock* const clock_; + struct BurstyPacerFlags { + // Parses `kBurstyPacerFieldTrial`. Example: + // --force-fieldtrials=WebRTC-BurstyPacer/burst:20ms/ + explicit BurstyPacerFlags(const FieldTrialsView& field_trials); + // If set, the pacer is allowed to build up a packet "debt" that correspond + // to approximately the send rate during the specified interval. + FieldTrialOptional burst; + }; + const BurstyPacerFlags bursty_pacer_flags_; struct SlackedPacerFlags { // Parses `kSlackedTaskQueuePacedSenderFieldTrial`. Example: // --force-fieldtrials=WebRTC-SlackedTaskQueuePacedSender/Enabled,max_queue_time:75ms/