From 4b572d048a885d56bf2411e2ddabc90e3991b338 Mon Sep 17 00:00:00 2001 From: peah Date: Thu, 6 Apr 2017 16:33:06 -0700 Subject: [PATCH] Correction of the AEC3 underrun behavior and minor other corrections This CL corrects the behavior during buffer underruns. Furthermore, it increases the tolerance for API call jitter, and removes the minimum value for the comfort noise. BUG=webrtc:6018 Review-Url: https://codereview.webrtc.org/2787123003 Cr-Commit-Position: refs/heads/master@{#17576} --- .../audio_processing/aec3/aec3_common.h | 2 +- .../audio_processing/aec3/block_processor.cc | 52 +++++++++---------- .../aec3/render_delay_buffer.cc | 5 ++ 3 files changed, 32 insertions(+), 27 deletions(-) diff --git a/webrtc/modules/audio_processing/aec3/aec3_common.h b/webrtc/modules/audio_processing/aec3/aec3_common.h index ef7dcdf261..f03a7e33d2 100644 --- a/webrtc/modules/audio_processing/aec3/aec3_common.h +++ b/webrtc/modules/audio_processing/aec3/aec3_common.h @@ -63,7 +63,7 @@ constexpr float kFixedEchoPathGain = 100; constexpr size_t kRenderDelayBufferSize = (3 * kDownsampledRenderBufferSize) / (4 * kSubBlockSize); -constexpr size_t kMaxApiCallsJitterBlocks = 10; +constexpr size_t kMaxApiCallsJitterBlocks = 20; constexpr size_t kRenderTransferQueueSize = kMaxApiCallsJitterBlocks / 2; static_assert(2 * kRenderTransferQueueSize >= kMaxApiCallsJitterBlocks, "Requirement to ensure buffer overflow detection"); diff --git a/webrtc/modules/audio_processing/aec3/block_processor.cc b/webrtc/modules/audio_processing/aec3/block_processor.cc index 79892345b1..bb1286cd43 100644 --- a/webrtc/modules/audio_processing/aec3/block_processor.cc +++ b/webrtc/modules/audio_processing/aec3/block_processor.cc @@ -101,34 +101,34 @@ void BlockProcessorImpl::ProcessCapture( // been a render buffer overrun as the buffer alignment may be noncausal. delay_controller_->Reset(); render_buffer_->Reset(); - } else { - // Update the render buffers with new render data, filling the buffers with - // empty blocks when there is no render data available. - render_buffer_underrun = !render_buffer_->UpdateBuffers(); - - // Compute and and apply the render delay required to achieve proper signal - // alignment. - const size_t old_delay = render_buffer_->Delay(); - const size_t new_delay = delay_controller_->GetDelay( - render_buffer_->GetDownsampledRenderBuffer(), (*capture_block)[0]); - render_buffer_->SetDelay(new_delay); - const size_t achieved_delay = render_buffer_->Delay(); - - // Inform the delay controller of the actually set delay to allow it to - // properly react to a non-feasible delay. - delay_controller_->SetDelay(achieved_delay); - - // Remove the echo from the capture signal. - echo_remover_->ProcessCapture( - delay_controller_->AlignmentHeadroomSamples(), - EchoPathVariability(echo_path_gain_change, - old_delay != achieved_delay || - old_delay != new_delay || - render_buffer_overrun_occurred_), - capture_signal_saturation, render_buffer_->GetRenderBuffer(), - capture_block); } + // Update the render buffers with new render data, filling the buffers with + // empty blocks when there is no render data available. + render_buffer_underrun = !render_buffer_->UpdateBuffers(); + + // Compute and and apply the render delay required to achieve proper signal + // alignment. + const size_t old_delay = render_buffer_->Delay(); + const size_t new_delay = delay_controller_->GetDelay( + render_buffer_->GetDownsampledRenderBuffer(), (*capture_block)[0]); + render_buffer_->SetDelay(new_delay); + const size_t achieved_delay = render_buffer_->Delay(); + + // Inform the delay controller of the actually set delay to allow it to + // properly react to a non-feasible delay. + delay_controller_->SetDelay(achieved_delay); + + // Remove the echo from the capture signal. + echo_remover_->ProcessCapture( + delay_controller_->AlignmentHeadroomSamples(), + EchoPathVariability(echo_path_gain_change, + old_delay != achieved_delay || + old_delay != new_delay || + render_buffer_overrun_occurred_), + capture_signal_saturation, render_buffer_->GetRenderBuffer(), + capture_block); + // Update the metrics. metrics_.UpdateCapture(render_buffer_underrun); diff --git a/webrtc/modules/audio_processing/aec3/render_delay_buffer.cc b/webrtc/modules/audio_processing/aec3/render_delay_buffer.cc index cf3e2482ef..6e6766ab4d 100644 --- a/webrtc/modules/audio_processing/aec3/render_delay_buffer.cc +++ b/webrtc/modules/audio_processing/aec3/render_delay_buffer.cc @@ -124,6 +124,11 @@ void RenderDelayBufferImpl::Reset() { downsampled_render_buffer_.buffer.fill(0.f); fft_buffer_.Clear(); api_call_jitter_buffer_.Reset(); + for (auto& c : buffer_) { + for (auto& b : c) { + std::fill(b.begin(), b.end(), 0.f); + } + } } bool RenderDelayBufferImpl::Insert(