From bf2a70a14ddebd00a2dfc85686a7fb6f3997b712 Mon Sep 17 00:00:00 2001 From: Alessio Bazzica Date: Mon, 18 Oct 2021 11:32:05 +0200 Subject: [PATCH] APM: fix level estimator null pointer bug MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When APM is used without calling `ApplyConfig()` and the level estimator sub-module, which is disabled by default (see [1]), is used, APM crashes because the enabled config flag is true, but the unique pointer object is unset. [1] https://source.chromium.org/chromium/chromium/src/+/main:third_party/webrtc/modules/audio_processing/include/audio_processing.h;l=391?q=include%2Faudio_processing.h Bug: webrtc:7494 Change-Id: I482a9aa4f6a0a56793769674aba7b2661330bb14 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/235375 Reviewed-by: Per Ã…hgren Commit-Queue: Alessio Bazzica Cr-Commit-Position: refs/heads/main@{#35230} --- .../audio_processing/audio_processing_impl.cc | 19 ++++++++++++++----- .../audio_processing/audio_processing_impl.h | 1 + 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc index ee9f5c782e..d85ec6275b 100644 --- a/modules/audio_processing/audio_processing_impl.cc +++ b/modules/audio_processing/audio_processing_impl.cc @@ -418,6 +418,7 @@ void AudioProcessingImpl::InitializeLocked() { InitializePostProcessor(); InitializePreProcessor(); InitializeCaptureLevelsAdjuster(); + InitializeLevelEstimator(); if (aec_dump_) { aec_dump_->WriteInitMessage(formats_.api_format, rtc::TimeUTCMillis()); @@ -595,9 +596,7 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) { InitializeCaptureLevelsAdjuster(); } - if (config_.level_estimation.enabled && !submodules_.output_level_estimator) { - submodules_.output_level_estimator = std::make_unique(); - } + InitializeLevelEstimator(); if (voice_detection_config_changed) { InitializeVoiceDetector(); @@ -1333,8 +1332,8 @@ int AudioProcessingImpl::ProcessCaptureStreamLocked() { submodules_.capture_post_processor->Process(capture_buffer); } - // The level estimator operates on the recombined data. - if (config_.level_estimation.enabled) { + if (submodules_.output_level_estimator) { + // The level estimator operates on the recombined data. submodules_.output_level_estimator->ProcessStream(*capture_buffer); capture_.stats.output_rms_dbfs = submodules_.output_level_estimator->RMS(); @@ -2015,6 +2014,16 @@ void AudioProcessingImpl::InitializeAnalyzer() { } } +void AudioProcessingImpl::InitializeLevelEstimator() { + if (!config_.level_estimation.enabled) { + submodules_.output_level_estimator.reset(); + return; + } + if (!submodules_.output_level_estimator) { + submodules_.output_level_estimator = std::make_unique(); + } +} + void AudioProcessingImpl::InitializePostProcessor() { if (submodules_.capture_post_processor) { submodules_.capture_post_processor->Initialize( diff --git a/modules/audio_processing/audio_processing_impl.h b/modules/audio_processing/audio_processing_impl.h index 89f5d63783..6b19b4d668 100644 --- a/modules/audio_processing/audio_processing_impl.h +++ b/modules/audio_processing/audio_processing_impl.h @@ -284,6 +284,7 @@ class AudioProcessingImpl : public AudioProcessing { RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_capture_); void InitializePostProcessor() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_capture_); void InitializeAnalyzer() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_capture_); + void InitializeLevelEstimator() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_capture_); // Initializations of render-only submodules, requiring the render lock // already acquired.