From fa2927970eb669536a79017ac68d1c6f670e4cff Mon Sep 17 00:00:00 2001 From: Sam Zackrisson Date: Mon, 5 Oct 2020 15:23:04 +0200 Subject: [PATCH] AEC3: Re-add delay headroom when precise alignment is needed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This CL adds delay headroom when an external delay estimator is used. Tested: audioproc_f --aec=1 is bitexact on a large number of aecdumps Bug: b/158455753 Change-Id: I56de44e841bb8162e302181c6c386ad7fbb00dee Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/186703 Commit-Queue: Sam Zackrisson Reviewed-by: Per Ã…hgren Reviewed-by: Gustaf Ullberg Cr-Commit-Position: refs/heads/master@{#32323} --- modules/audio_processing/aec3/aec_state.cc | 7 ++++--- modules/audio_processing/aec3/aec_state.h | 4 ++-- modules/audio_processing/aec3/render_delay_buffer.cc | 8 +++++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/modules/audio_processing/aec3/aec_state.cc b/modules/audio_processing/aec3/aec_state.cc index 1e92a60e86..df56c3a433 100644 --- a/modules/audio_processing/aec3/aec_state.cc +++ b/modules/audio_processing/aec3/aec_state.cc @@ -350,8 +350,9 @@ void AecState::InitialState::InitialState::Update(bool active_render, AecState::FilterDelay::FilterDelay(const EchoCanceller3Config& config, size_t num_capture_channels) - : delay_headroom_samples_(config.delay.delay_headroom_samples), - filter_delays_blocks_(num_capture_channels, 0) {} + : delay_headroom_blocks_(config.delay.delay_headroom_samples / kBlockSize), + filter_delays_blocks_(num_capture_channels, delay_headroom_blocks_), + min_filter_delay_(delay_headroom_blocks_) {} void AecState::FilterDelay::Update( rtc::ArrayView analyzer_filter_delay_estimates_blocks, @@ -369,7 +370,7 @@ void AecState::FilterDelay::Update( const bool delay_estimator_may_not_have_converged = blocks_with_proper_filter_adaptation < 2 * kNumBlocksPerSecond; if (delay_estimator_may_not_have_converged && external_delay_) { - int delay_guess = delay_headroom_samples_ / kBlockSize; + const int delay_guess = delay_headroom_blocks_; std::fill(filter_delays_blocks_.begin(), filter_delays_blocks_.end(), delay_guess); } else { diff --git a/modules/audio_processing/aec3/aec_state.h b/modules/audio_processing/aec3/aec_state.h index 5d12226ff4..5b40e9513a 100644 --- a/modules/audio_processing/aec3/aec_state.h +++ b/modules/audio_processing/aec3/aec_state.h @@ -211,10 +211,10 @@ class AecState { size_t blocks_with_proper_filter_adaptation); private: - const int delay_headroom_samples_; + const int delay_headroom_blocks_; bool external_delay_reported_ = false; std::vector filter_delays_blocks_; - int min_filter_delay_ = 0; + int min_filter_delay_; absl::optional external_delay_; } delay_state_; diff --git a/modules/audio_processing/aec3/render_delay_buffer.cc b/modules/audio_processing/aec3/render_delay_buffer.cc index f5030e17b8..7bebc6fd47 100644 --- a/modules/audio_processing/aec3/render_delay_buffer.cc +++ b/modules/audio_processing/aec3/render_delay_buffer.cc @@ -385,9 +385,11 @@ void RenderDelayBufferImpl::ApplyTotalDelay(int delay) { void RenderDelayBufferImpl::AlignFromExternalDelay() { RTC_DCHECK(config_.delay.use_external_delay_estimator); if (external_audio_buffer_delay_) { - int64_t delay = render_call_counter_ - capture_call_counter_ + - *external_audio_buffer_delay_; - ApplyTotalDelay(delay); + const int64_t delay = render_call_counter_ - capture_call_counter_ + + *external_audio_buffer_delay_; + const int64_t delay_with_headroom = + delay - config_.delay.delay_headroom_samples / kBlockSize; + ApplyTotalDelay(delay_with_headroom); } }