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);
   }
 }