From 15179a998631f5e45da13d600fd067da18bd71ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Per=20=C3=85hgren?= Date: Fri, 12 Mar 2021 14:12:44 +0000 Subject: [PATCH] Allowing reduced computations in the noise suppressor when the output is not used MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This CL adds functionality in the noise suppressor that allows the computational complexity to be reduced when the output of APM is not used. Bug: b/177830919 Change-Id: I849351ba9559fae770e4667d78e38abde5230eed Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/211342 Reviewed-by: Gustaf Ullberg Commit-Queue: Per Ã…hgren Cr-Commit-Position: refs/heads/master@{#33477} --- modules/audio_processing/audio_processing_impl.cc | 4 ++++ modules/audio_processing/ns/noise_suppressor.cc | 6 ++++++ modules/audio_processing/ns/noise_suppressor.h | 9 +++++++++ 3 files changed, 19 insertions(+) diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc index 496f985e42..b23d363dc3 100644 --- a/modules/audio_processing/audio_processing_impl.cc +++ b/modules/audio_processing/audio_processing_impl.cc @@ -679,6 +679,10 @@ void AudioProcessingImpl::HandleCaptureOutputUsedSetting( submodules_.echo_controller->SetCaptureOutputUsage( capture_.capture_output_used); } + if (submodules_.noise_suppressor) { + submodules_.noise_suppressor->SetCaptureOutputUsage( + capture_.capture_output_used); + } } void AudioProcessingImpl::SetRuntimeSetting(RuntimeSetting setting) { diff --git a/modules/audio_processing/ns/noise_suppressor.cc b/modules/audio_processing/ns/noise_suppressor.cc index 89e1fe0d91..d66faa6ed4 100644 --- a/modules/audio_processing/ns/noise_suppressor.cc +++ b/modules/audio_processing/ns/noise_suppressor.cc @@ -448,6 +448,12 @@ void NoiseSuppressor::Process(AudioBuffer* audio) { } } + // Only do the below processing if the output of the audio processing module + // is used. + if (!capture_output_used_) { + return; + } + // Aggregate the Wiener filters for all channels. std::array filter_data; rtc::ArrayView filter = filter_data; diff --git a/modules/audio_processing/ns/noise_suppressor.h b/modules/audio_processing/ns/noise_suppressor.h index d9628869bb..1e321cf4a2 100644 --- a/modules/audio_processing/ns/noise_suppressor.h +++ b/modules/audio_processing/ns/noise_suppressor.h @@ -41,12 +41,21 @@ class NoiseSuppressor { // Applies noise suppression. void Process(AudioBuffer* audio); + // Specifies whether the capture output will be used. The purpose of this is + // to allow the noise suppressor to deactivate some of the processing when the + // resulting output is anyway not used, for instance when the endpoint is + // muted. + void SetCaptureOutputUsage(bool capture_output_used) { + capture_output_used_ = capture_output_used; + } + private: const size_t num_bands_; const size_t num_channels_; const SuppressionParams suppression_params_; int32_t num_analyzed_frames_ = -1; NrFft fft_; + bool capture_output_used_ = true; struct ChannelState { ChannelState(const SuppressionParams& suppression_params, size_t num_bands);