AEC3: Re-add delay headroom when precise alignment is needed 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 <saza@webrtc.org> Reviewed-by: Per Ã…hgren <peah@webrtc.org> Reviewed-by: Gustaf Ullberg <gustaf@webrtc.org> Cr-Commit-Position: refs/heads/master@{#32323}
diff --git a/modules/audio_processing/aec3/aec_state.cc b/modules/audio_processing/aec3/aec_state.cc index 1e92a60..df56c3a 100644 --- a/modules/audio_processing/aec3/aec_state.cc +++ b/modules/audio_processing/aec3/aec_state.cc
@@ -350,8 +350,9 @@ 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<const int> analyzer_filter_delay_estimates_blocks, @@ -369,7 +370,7 @@ 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 5d12226..5b40e95 100644 --- a/modules/audio_processing/aec3/aec_state.h +++ b/modules/audio_processing/aec3/aec_state.h
@@ -211,10 +211,10 @@ 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<int> filter_delays_blocks_; - int min_filter_delay_ = 0; + int min_filter_delay_; absl::optional<DelayEstimate> 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 f5030e1..7bebc6f 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::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); } }