From 9136abb45ae2cdc2c136aa8a05e39a4446db06db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Per=20=C3=85hgren?= Date: Thu, 19 Dec 2019 10:38:01 +0100 Subject: [PATCH] AEC3: Ensure that the data size in the reverb computer is not fixed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This CL ensures that the no data vectors in the reverb computer code are fixed. This allows arbitrary long filters to be used, and ensures that a minimum required heap size is used. Bug: webrtc:8671 Change-Id: I7085ed262a3f5965d796270434b6578f4030606e Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/162661 Reviewed-by: Sam Zackrisson Commit-Queue: Per Ã…hgren Cr-Commit-Position: refs/heads/master@{#30115} --- api/audio/echo_canceller3_config.cc | 16 ++++++++++++---- modules/audio_processing/aec3/aec3_common.h | 1 - .../aec3/reverb_decay_estimator.cc | 2 +- .../aec3/reverb_decay_estimator.h | 2 +- .../signal_dependent_erle_estimator_unittest.cc | 2 +- 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/api/audio/echo_canceller3_config.cc b/api/audio/echo_canceller3_config.cc index 49133568aa..7fd0744c37 100644 --- a/api/audio/echo_canceller3_config.cc +++ b/api/audio/echo_canceller3_config.cc @@ -38,6 +38,14 @@ bool Limit(int* value, int min, int max) { *value = clamped; return res; } + +bool FloorLimit(size_t* value, size_t min) { + size_t clamped = *value >= min ? *value : min; + bool res = *value == clamped; + *value = clamped; + return res; +} + } // namespace EchoCanceller3Config::EchoCanceller3Config() = default; @@ -110,14 +118,14 @@ bool EchoCanceller3Config::Validate(EchoCanceller3Config* config) { res = res & Limit(&c->delay.delay_selection_thresholds.initial, 1, 250); res = res & Limit(&c->delay.delay_selection_thresholds.converged, 1, 250); - res = res & Limit(&c->filter.main.length_blocks, 1, 50); + res = res & FloorLimit(&c->filter.main.length_blocks, 1); res = res & Limit(&c->filter.main.leakage_converged, 0.f, 1000.f); res = res & Limit(&c->filter.main.leakage_diverged, 0.f, 1000.f); res = res & Limit(&c->filter.main.error_floor, 0.f, 1000.f); res = res & Limit(&c->filter.main.error_ceil, 0.f, 100000000.f); res = res & Limit(&c->filter.main.noise_gate, 0.f, 100000000.f); - res = res & Limit(&c->filter.main_initial.length_blocks, 1, 50); + res = res & FloorLimit(&c->filter.main_initial.length_blocks, 1); res = res & Limit(&c->filter.main_initial.leakage_converged, 0.f, 1000.f); res = res & Limit(&c->filter.main_initial.leakage_diverged, 0.f, 1000.f); res = res & Limit(&c->filter.main_initial.error_floor, 0.f, 1000.f); @@ -129,11 +137,11 @@ bool EchoCanceller3Config::Validate(EchoCanceller3Config* config) { res = false; } - res = res & Limit(&c->filter.shadow.length_blocks, 1, 50); + res = res & FloorLimit(&c->filter.shadow.length_blocks, 1); res = res & Limit(&c->filter.shadow.rate, 0.f, 1.f); res = res & Limit(&c->filter.shadow.noise_gate, 0.f, 100000000.f); - res = res & Limit(&c->filter.shadow_initial.length_blocks, 1, 50); + res = res & FloorLimit(&c->filter.shadow_initial.length_blocks, 1); res = res & Limit(&c->filter.shadow_initial.rate, 0.f, 1.f); res = res & Limit(&c->filter.shadow_initial.noise_gate, 0.f, 100000000.f); diff --git a/modules/audio_processing/aec3/aec3_common.h b/modules/audio_processing/aec3/aec3_common.h index d778e50f24..ed28c88f20 100644 --- a/modules/audio_processing/aec3/aec3_common.h +++ b/modules/audio_processing/aec3/aec3_common.h @@ -38,7 +38,6 @@ constexpr size_t kFftLengthBy2Minus1 = kFftLengthBy2 - 1; constexpr size_t kFftLength = 2 * kFftLengthBy2; constexpr size_t kFftLengthBy2Log2 = 6; -constexpr int kMaxAdaptiveFilterLength = 50; constexpr int kRenderTransferQueueSizeFrames = 100; constexpr size_t kMaxNumBands = 3; diff --git a/modules/audio_processing/aec3/reverb_decay_estimator.cc b/modules/audio_processing/aec3/reverb_decay_estimator.cc index 2415931948..b9f6120181 100644 --- a/modules/audio_processing/aec3/reverb_decay_estimator.cc +++ b/modules/audio_processing/aec3/reverb_decay_estimator.cc @@ -92,8 +92,8 @@ ReverbDecayEstimator::ReverbDecayEstimator(const EchoCanceller3Config& config) kEarlyReverbMinSizeBlocks), late_reverb_start_(kEarlyReverbMinSizeBlocks), late_reverb_end_(kEarlyReverbMinSizeBlocks), + previous_gains_(config.filter.main.length_blocks, 0.f), decay_(std::fabs(config.ep_strength.default_len)) { - previous_gains_.fill(0.f); RTC_DCHECK_GT(config.filter.main.length_blocks, static_cast(kEarlyReverbMinSizeBlocks)); } diff --git a/modules/audio_processing/aec3/reverb_decay_estimator.h b/modules/audio_processing/aec3/reverb_decay_estimator.h index 4c8d0c6434..3bb9b2bb20 100644 --- a/modules/audio_processing/aec3/reverb_decay_estimator.h +++ b/modules/audio_processing/aec3/reverb_decay_estimator.h @@ -101,7 +101,7 @@ class ReverbDecayEstimator { int block_to_analyze_ = 0; int estimation_region_candidate_size_ = 0; bool estimation_region_identified_ = false; - std::array previous_gains_; + std::vector previous_gains_; float decay_; float tail_gain_ = 0.f; float smoothing_constant_ = 0.f; diff --git a/modules/audio_processing/aec3/signal_dependent_erle_estimator_unittest.cc b/modules/audio_processing/aec3/signal_dependent_erle_estimator_unittest.cc index 394310d9e2..641c9158a0 100644 --- a/modules/audio_processing/aec3/signal_dependent_erle_estimator_unittest.cc +++ b/modules/audio_processing/aec3/signal_dependent_erle_estimator_unittest.cc @@ -143,7 +143,7 @@ TEST(SignalDependentErleEstimator, SweepSettings) { for (size_t num_capture_channels : {1, 2, 4}) { EchoCanceller3Config cfg; size_t max_length_blocks = 50; - for (size_t blocks = 0; blocks < max_length_blocks; + for (size_t blocks = 1; blocks < max_length_blocks; blocks = blocks + 10) { for (size_t delay_headroom = 0; delay_headroom < 5; ++delay_headroom) { for (size_t num_sections = 2; num_sections < max_length_blocks;