From b4c188de3bd06f0ac55e227211497633bd752dc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Per=20=C3=85hgren?= Date: Wed, 20 Dec 2017 00:25:18 +0100 Subject: [PATCH] Added logging of the maximum observed API call jitter in AEC3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:8672 Change-Id: Ib64cca5ff5b809c4931db266a9e5a75d378504af Reviewed-on: https://webrtc-review.googlesource.com/35021 Reviewed-by: Gustaf Ullberg Commit-Queue: Per Ã…hgren Cr-Commit-Position: refs/heads/master@{#21550} --- .../aec3/render_delay_buffer.cc | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/modules/audio_processing/aec3/render_delay_buffer.cc b/modules/audio_processing/aec3/render_delay_buffer.cc index 3e7901b33a..cdc90788f1 100644 --- a/modules/audio_processing/aec3/render_delay_buffer.cc +++ b/modules/audio_processing/aec3/render_delay_buffer.cc @@ -67,6 +67,11 @@ class RenderDelayBufferImpl final : public RenderDelayBuffer { const Aec3Fft fft_; std::vector render_ds_; const int buffer_headroom_; + bool last_call_was_render_ = false; + int num_api_calls_in_a_row_ = 0; + int max_observed_jitter_ = 1; + size_t capture_call_counter_ = 0; + size_t render_call_counter_ = 0; int LowRateBufferOffset() const { return DelayEstimatorOffset(config_) >> 1; } int MaxExternalDelayToInternalDelay(size_t delay) const; @@ -179,6 +184,9 @@ RenderDelayBufferImpl::~RenderDelayBufferImpl() = default; // Resets the buffer delays and clears the reported delays. void RenderDelayBufferImpl::Reset() { + last_call_was_render_ = false; + num_api_calls_in_a_row_ = 1; + // Pre-fill the low rate buffer (which is used for delay estimation) to add // headroom for the allowed api call jitter. low_rate_.read = low_rate_.OffsetIndex( @@ -195,6 +203,22 @@ void RenderDelayBufferImpl::Reset() { // Inserts a new block into the render buffers. RenderDelayBuffer::BufferingEvent RenderDelayBufferImpl::Insert( const std::vector>& block) { + ++render_call_counter_; + if (delay_) { + if (!last_call_was_render_) { + last_call_was_render_ = true; + num_api_calls_in_a_row_ = 1; + } else { + if (++num_api_calls_in_a_row_ > max_observed_jitter_) { + max_observed_jitter_ = num_api_calls_in_a_row_; + RTC_LOG(LS_INFO) + << "New max number api jitter observed at render block " + << render_call_counter_ << ": " << num_api_calls_in_a_row_ + << " blocks"; + } + } + } + // Increase the write indices to where the new blocks should be written. const int previous_write = blocks_.write; IncreaseWriteIndices(sub_block_size_, &blocks_, &spectra_, &ffts_, @@ -220,6 +244,22 @@ RenderDelayBuffer::BufferingEvent RenderDelayBufferImpl::Insert( RenderDelayBuffer::BufferingEvent RenderDelayBufferImpl::PrepareCaptureProcessing() { BufferingEvent event = BufferingEvent::kNone; + ++capture_call_counter_; + + if (delay_) { + if (last_call_was_render_) { + last_call_was_render_ = false; + num_api_calls_in_a_row_ = 1; + } else { + if (++num_api_calls_in_a_row_ > max_observed_jitter_) { + max_observed_jitter_ = num_api_calls_in_a_row_; + RTC_LOG(LS_INFO) + << "New max number api jitter observed at capture block " + << capture_call_counter_ << ": " << num_api_calls_in_a_row_ + << " blocks"; + } + } + } if (RenderUnderrun(internal_delay_, blocks_, low_rate_)) { // Don't increase the read indices if there is a render underrun.