From e05c43cc396818059ffae4552f6c5a133d99e24b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Per=20=C3=85hgren?= Date: Wed, 9 May 2018 12:26:51 +0200 Subject: [PATCH] Remove the headroom and delay estimation feedback loop in AEC3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This CL ensures that the external audio buffer delay is correctly used by removing the applied headroom and avoiding that the delay estimation feedback fromt the echo remover overrules the external delay information. Bug: webrtc:9241,chromium:839860 Change-Id: I53cc78ace34a71994ab24a3b552f29979e2aae78 Reviewed-on: https://webrtc-review.googlesource.com/75513 Reviewed-by: Gustaf Ullberg Commit-Queue: Per Ã…hgren Cr-Commit-Position: refs/heads/master@{#23189} --- modules/audio_processing/aec3/echo_remover.cc | 3 ++- .../audio_processing/aec3/render_delay_buffer.cc | 14 +++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/modules/audio_processing/aec3/echo_remover.cc b/modules/audio_processing/aec3/echo_remover.cc index 96887fe38b..df34e861b9 100644 --- a/modules/audio_processing/aec3/echo_remover.cc +++ b/modules/audio_processing/aec3/echo_remover.cc @@ -74,7 +74,8 @@ class EchoRemoverImpl final : public EchoRemover { // Returns the internal delay estimate in blocks. rtc::Optional Delay() const override { - return aec_state_.InternalDelay(); + // TODO(peah): Remove or reactivate this functionality. + return rtc::nullopt; } // Updates the status on whether echo leakage is detected in the output of the diff --git a/modules/audio_processing/aec3/render_delay_buffer.cc b/modules/audio_processing/aec3/render_delay_buffer.cc index 0809cb2645..35332d8b5c 100644 --- a/modules/audio_processing/aec3/render_delay_buffer.cc +++ b/modules/audio_processing/aec3/render_delay_buffer.cc @@ -25,10 +25,16 @@ #include "rtc_base/checks.h" #include "rtc_base/constructormagic.h" #include "rtc_base/logging.h" +#include "system_wrappers/include/field_trial.h" namespace webrtc { namespace { +bool EnableZeroExternalDelayHeadroom() { + return !field_trial::IsEnabled( + "WebRTC-Aec3ZeroExternalDelayHeadroomKillSwitch"); +} + class RenderDelayBufferImpl final : public RenderDelayBuffer { public: RenderDelayBufferImpl(const EchoCanceller3Config& config, size_t num_bands); @@ -57,6 +63,7 @@ class RenderDelayBufferImpl final : public RenderDelayBuffer { std::unique_ptr data_dumper_; const Aec3Optimization optimization_; const EchoCanceller3Config config_; + const bool use_zero_external_delay_headroom_; const int sub_block_size_; MatrixBuffer blocks_; VectorBuffer spectra_; @@ -161,6 +168,7 @@ RenderDelayBufferImpl::RenderDelayBufferImpl(const EchoCanceller3Config& config, new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))), optimization_(DetectOptimization()), config_(config), + use_zero_external_delay_headroom_(EnableZeroExternalDelayHeadroom()), sub_block_size_( static_cast(config.delay.down_sampling_factor > 0 ? kBlockSize / config.delay.down_sampling_factor @@ -203,12 +211,12 @@ void RenderDelayBufferImpl::Reset() { // Check for any external audio buffer delay and whether it is feasible. if (external_audio_buffer_delay_) { - constexpr size_t kHeadroom = 2; + const size_t headroom = use_zero_external_delay_headroom_ ? 0 : 2; size_t external_delay_to_set = 0; - if (*external_audio_buffer_delay_ < kHeadroom) { + if (*external_audio_buffer_delay_ < headroom) { external_delay_to_set = 0; } else { - external_delay_to_set = *external_audio_buffer_delay_ - kHeadroom; + external_delay_to_set = *external_audio_buffer_delay_ - headroom; } external_delay_to_set = std::min(external_delay_to_set, MaxDelay());