From 0601d68ac85e201d7bf377373daf249c07a7ab74 Mon Sep 17 00:00:00 2001 From: Sebastian Jansson Date: Mon, 25 Jun 2018 19:23:05 +0200 Subject: [PATCH] Adds field trial for disabling pacer queue draining. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This CL adds a field trial that disables the feature that the pacer will ignore the pacing rate and send extra fast to drain the queues if the pacer queue starts to fill up. BBR assumes that the pacing rate will be respected and sending more increase the risk of overestimating the bandwidth. Bug: webrtc:8415 Change-Id: Ibba315360dafef1c317d14a83199172f9f8cc6aa Reviewed-on: https://webrtc-review.googlesource.com/80964 Reviewed-by: Stefan Holmer Reviewed-by: Björn Terelius Commit-Queue: Sebastian Jansson Cr-Commit-Position: refs/heads/master@{#23773} --- modules/pacing/paced_sender.cc | 18 ++++++++++++------ modules/pacing/paced_sender.h | 2 ++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/modules/pacing/paced_sender.cc b/modules/pacing/paced_sender.cc index 96554ad6a2..53dec05dc6 100644 --- a/modules/pacing/paced_sender.cc +++ b/modules/pacing/paced_sender.cc @@ -63,6 +63,7 @@ PacedSender::PacedSender(const Clock* clock, : clock_(clock), packet_sender_(packet_sender), alr_detector_(rtc::MakeUnique(event_log)), + drain_large_queues_(!field_trial::IsDisabled("WebRTC-Pacer-DrainQueue")), send_padding_if_silent_( field_trial::IsEnabled("WebRTC-Pacer-PadInSilence")), video_blocks_audio_(!field_trial::IsDisabled("WebRTC-Pacer-BlockAudio")), @@ -83,6 +84,9 @@ PacedSender::PacedSender(const Clock* clock, pacing_factor_(kDefaultPaceMultiplier), queue_time_limit(kMaxQueueLengthMs), account_for_audio_(false) { + if (!drain_large_queues_) + RTC_LOG(LS_WARNING) << "Pacer queues will not be drained," + "pushback experiment must be enabled."; UpdateBudgetWithElapsedTime(kMinPacketLimitMs); } @@ -291,12 +295,14 @@ void PacedSender::Process() { // has avg_time_left_ms left to get queue_size_bytes out of the queue, if // time constraint shall be met. Determine bitrate needed for that. packets_->UpdateQueueTime(clock_->TimeInMilliseconds()); - int64_t avg_time_left_ms = std::max( - 1, queue_time_limit - packets_->AverageQueueTimeMs()); - int min_bitrate_needed_kbps = - static_cast(queue_size_bytes * 8 / avg_time_left_ms); - if (min_bitrate_needed_kbps > target_bitrate_kbps) - target_bitrate_kbps = min_bitrate_needed_kbps; + if (drain_large_queues_) { + int64_t avg_time_left_ms = std::max( + 1, queue_time_limit - packets_->AverageQueueTimeMs()); + int min_bitrate_needed_kbps = + static_cast(queue_size_bytes * 8 / avg_time_left_ms); + if (min_bitrate_needed_kbps > target_bitrate_kbps) + target_bitrate_kbps = min_bitrate_needed_kbps; + } } media_budget_->set_target_rate_kbps(target_bitrate_kbps); diff --git a/modules/pacing/paced_sender.h b/modules/pacing/paced_sender.h index 8b407922c3..2f13de9522 100644 --- a/modules/pacing/paced_sender.h +++ b/modules/pacing/paced_sender.h @@ -162,6 +162,8 @@ class PacedSender : public Pacer { const Clock* const clock_; PacketSender* const packet_sender_; const std::unique_ptr alr_detector_ RTC_PT_GUARDED_BY(critsect_); + + const bool drain_large_queues_; const bool send_padding_if_silent_; const bool video_blocks_audio_; rtc::CriticalSection critsect_;