APM: fix level estimator null pointer bug
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 <peah@webrtc.org> Commit-Queue: Alessio Bazzica <alessiob@webrtc.org> Cr-Commit-Position: refs/heads/main@{#35230}
This commit is contained in:

committed by
WebRTC LUCI CQ

parent
50c25ac078
commit
bf2a70a14d
@ -418,6 +418,7 @@ void AudioProcessingImpl::InitializeLocked() {
|
|||||||
InitializePostProcessor();
|
InitializePostProcessor();
|
||||||
InitializePreProcessor();
|
InitializePreProcessor();
|
||||||
InitializeCaptureLevelsAdjuster();
|
InitializeCaptureLevelsAdjuster();
|
||||||
|
InitializeLevelEstimator();
|
||||||
|
|
||||||
if (aec_dump_) {
|
if (aec_dump_) {
|
||||||
aec_dump_->WriteInitMessage(formats_.api_format, rtc::TimeUTCMillis());
|
aec_dump_->WriteInitMessage(formats_.api_format, rtc::TimeUTCMillis());
|
||||||
@ -595,9 +596,7 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) {
|
|||||||
InitializeCaptureLevelsAdjuster();
|
InitializeCaptureLevelsAdjuster();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config_.level_estimation.enabled && !submodules_.output_level_estimator) {
|
InitializeLevelEstimator();
|
||||||
submodules_.output_level_estimator = std::make_unique<LevelEstimator>();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (voice_detection_config_changed) {
|
if (voice_detection_config_changed) {
|
||||||
InitializeVoiceDetector();
|
InitializeVoiceDetector();
|
||||||
@ -1333,8 +1332,8 @@ int AudioProcessingImpl::ProcessCaptureStreamLocked() {
|
|||||||
submodules_.capture_post_processor->Process(capture_buffer);
|
submodules_.capture_post_processor->Process(capture_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (submodules_.output_level_estimator) {
|
||||||
// The level estimator operates on the recombined data.
|
// The level estimator operates on the recombined data.
|
||||||
if (config_.level_estimation.enabled) {
|
|
||||||
submodules_.output_level_estimator->ProcessStream(*capture_buffer);
|
submodules_.output_level_estimator->ProcessStream(*capture_buffer);
|
||||||
capture_.stats.output_rms_dbfs =
|
capture_.stats.output_rms_dbfs =
|
||||||
submodules_.output_level_estimator->RMS();
|
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<LevelEstimator>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void AudioProcessingImpl::InitializePostProcessor() {
|
void AudioProcessingImpl::InitializePostProcessor() {
|
||||||
if (submodules_.capture_post_processor) {
|
if (submodules_.capture_post_processor) {
|
||||||
submodules_.capture_post_processor->Initialize(
|
submodules_.capture_post_processor->Initialize(
|
||||||
|
@ -284,6 +284,7 @@ class AudioProcessingImpl : public AudioProcessing {
|
|||||||
RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_capture_);
|
RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_capture_);
|
||||||
void InitializePostProcessor() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_capture_);
|
void InitializePostProcessor() RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_capture_);
|
||||||
void InitializeAnalyzer() 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
|
// Initializations of render-only submodules, requiring the render lock
|
||||||
// already acquired.
|
// already acquired.
|
||||||
|
Reference in New Issue
Block a user