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}
This commit is contained in:
Sam Zackrisson 2020-10-05 15:23:04 +02:00 committed by Commit Bot
parent cf04e06e99
commit fa2927970e
3 changed files with 11 additions and 8 deletions

View File

@ -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<const int> 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 {

View File

@ -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<int> filter_delays_blocks_;
int min_filter_delay_ = 0;
int min_filter_delay_;
absl::optional<DelayEstimate> external_delay_;
} delay_state_;

View File

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