From 3b1a8bb00c8a019a0ab67321ab940b038705ac8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Spr=C3=A5ng?= Date: Tue, 19 Nov 2019 11:24:31 +0100 Subject: [PATCH] Account for rounding errors in dyanmic pacing mode. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Keeps behavior for old periodic processing. Rounding sleep time reduced chance for small bursts of busy-looping when time approaches 0. Also fixes a DCHECK which may trigger if there are rounding errors in the timing. Bug: webrtc:10809 Change-Id: Iba8450f906fd6ab3b1da97e04507b16ac6bbde3f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/160000 Reviewed-by: Philip Eliasson Commit-Queue: Erik Språng Cr-Commit-Position: refs/heads/master@{#29841} --- modules/pacing/paced_sender.cc | 8 ++++++-- modules/pacing/pacing_controller.cc | 5 +++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/modules/pacing/paced_sender.cc b/modules/pacing/paced_sender.cc index 56eed92682..0a3d3c0b34 100644 --- a/modules/pacing/paced_sender.cc +++ b/modules/pacing/paced_sender.cc @@ -150,8 +150,12 @@ int64_t PacedSender::TimeUntilNextProcess() { rtc::CritScope cs(&critsect_); Timestamp next_send_time = pacing_controller_.NextSendTime(); - return std::max(TimeDelta::Zero(), next_send_time - clock_->CurrentTime()) - .ms(); + TimeDelta sleep_time = + std::max(TimeDelta::Zero(), next_send_time - clock_->CurrentTime()); + if (process_mode_ == PacingController::ProcessMode::kDynamic) { + return sleep_time.RoundTo(TimeDelta::ms(1)).ms(); + } + return sleep_time.ms(); } void PacedSender::Process() { diff --git a/modules/pacing/pacing_controller.cc b/modules/pacing/pacing_controller.cc index 6a8e203758..5b7dda3640 100644 --- a/modules/pacing/pacing_controller.cc +++ b/modules/pacing/pacing_controller.cc @@ -586,8 +586,9 @@ RoundRobinPacketQueue::QueuedPacket* PacingController::GetPendingPacket( } } else { // In dynamic mode we should never try get a non-probe packet until - // the media debt is actually zero. - RTC_DCHECK(media_debt_.IsZero()); + // the media debt is actually zero. Since there can be rounding errors, + // allow some discrepancy. + RTC_DCHECK_LE(media_debt_, media_rate_ * kMinSleepTime); } } }