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:
parent
cf04e06e99
commit
fa2927970e
@ -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 {
|
||||
|
||||
@ -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_;
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user