From 64cb83bbd95d9cb457265f01ab903c3e7e98a3a3 Mon Sep 17 00:00:00 2001 From: Alex Loiko Date: Mon, 2 Jul 2018 13:38:19 +0200 Subject: [PATCH] Flags and settings for AGC2 in AgcManagerDirect. This CL adds two flags to audioproc_f. The flags control AgcManagerDirect. The flags are '--experimental_agc_agc2_level_estimator' and '--experimental_agc_agc2_digital_adaptive'. After this CL, the flags are be applied to AgcManagerDirect. The flags have no effect in release-mode. They cause a crash in debug-mode. In an upcoming CL, '--experimental_agc_agc2_level_estimator 1' will replace the speech level estimation in ExperimentalAgc with that of AGC2. '--experimental_agc_agc2_digital_adaptive 1' will replace the digital gain selection and application with that of AGC2. These audioproc_f will activate both new settings: ./out/Target/audioproc_f --agc 1 --experimental_agc 1 --experimental_agc_agc2_digital_adaptive 1 --experimental_agc_agc2_level_estimator 1 --simulate_mic_gain 1 --simulated_mic_kind 2 See also https://webrtc-review.googlesource.com/c/src/+/79360 Bug: webrtc:7494 Change-Id: If0e65893dffdddb312e553787b8cedaf9a334323 Reviewed-on: https://webrtc-review.googlesource.com/86548 Commit-Queue: Alex Loiko Reviewed-by: Alessio Bazzica Cr-Commit-Position: refs/heads/master@{#23802} --- .../agc/agc_manager_direct.cc | 54 +++++++++++-------- .../audio_processing/agc/agc_manager_direct.h | 16 +++++- .../audio_processing/audio_processing_impl.cc | 10 +++- .../audio_processing/audio_processing_impl.h | 13 ++++- .../include/audio_processing.h | 9 ++++ .../test/audio_processing_simulator.cc | 6 ++- .../test/audio_processing_simulator.h | 2 + .../test/audioproc_float_impl.cc | 13 +++++ 8 files changed, 96 insertions(+), 27 deletions(-) diff --git a/modules/audio_processing/agc/agc_manager_direct.cc b/modules/audio_processing/agc/agc_manager_direct.cc index 1ae4e5c4ce..a0ae0c0727 100644 --- a/modules/audio_processing/agc/agc_manager_direct.cc +++ b/modules/audio_processing/agc/agc_manager_direct.cc @@ -111,33 +111,37 @@ class DebugFile { AgcManagerDirect::AgcManagerDirect(GainControl* gctrl, VolumeCallbacks* volume_callbacks, int startup_min_level, - int clipped_level_min) - : data_dumper_(new ApmDataDumper(instance_counter_)), - agc_(new Agc()), - gctrl_(gctrl), - volume_callbacks_(volume_callbacks), - frames_since_clipped_(kClippedWaitFrames), - level_(0), - max_level_(kMaxMicLevel), - max_compression_gain_(kMaxCompressionGain), - target_compression_(kDefaultCompressionGain), - compression_(target_compression_), - compression_accumulator_(compression_), - capture_muted_(false), - check_volume_on_next_process_(true), // Check at startup. - startup_(true), - startup_min_level_(ClampLevel(startup_min_level)), - clipped_level_min_(clipped_level_min), - file_preproc_(new DebugFile("agc_preproc.pcm")), - file_postproc_(new DebugFile("agc_postproc.pcm")) { - instance_counter_++; -} + int clipped_level_min, + bool use_agc2_level_estimation, + bool use_agc2_digital_adaptive) + : AgcManagerDirect(new Agc(), + gctrl, + volume_callbacks, + startup_min_level, + clipped_level_min, + use_agc2_level_estimation, + use_agc2_digital_adaptive) {} AgcManagerDirect::AgcManagerDirect(Agc* agc, GainControl* gctrl, VolumeCallbacks* volume_callbacks, int startup_min_level, int clipped_level_min) + : AgcManagerDirect(agc, + gctrl, + volume_callbacks, + startup_min_level, + clipped_level_min, + false, + false) {} + +AgcManagerDirect::AgcManagerDirect(Agc* agc, + GainControl* gctrl, + VolumeCallbacks* volume_callbacks, + int startup_min_level, + int clipped_level_min, + bool use_agc2_level_estimation, + bool use_agc2_digital_adaptive) : data_dumper_(new ApmDataDumper(instance_counter_)), agc_(agc), gctrl_(gctrl), @@ -152,11 +156,19 @@ AgcManagerDirect::AgcManagerDirect(Agc* agc, capture_muted_(false), check_volume_on_next_process_(true), // Check at startup. startup_(true), + use_agc2_level_estimation_(use_agc2_level_estimation), + use_agc2_digital_adaptive_(use_agc2_digital_adaptive), startup_min_level_(ClampLevel(startup_min_level)), clipped_level_min_(clipped_level_min), file_preproc_(new DebugFile("agc_preproc.pcm")), file_postproc_(new DebugFile("agc_postproc.pcm")) { instance_counter_++; + if (use_agc2_level_estimation_) { + RTC_NOTREACHED() << "Agc2 level estimation not implemented."; + } + if (use_agc2_digital_adaptive_) { + RTC_NOTREACHED() << "Agc2 digital adaptive not implemented."; + } } AgcManagerDirect::~AgcManagerDirect() {} diff --git a/modules/audio_processing/agc/agc_manager_direct.h b/modules/audio_processing/agc/agc_manager_direct.h index 55f294f27e..cc51af6cf2 100644 --- a/modules/audio_processing/agc/agc_manager_direct.h +++ b/modules/audio_processing/agc/agc_manager_direct.h @@ -48,7 +48,10 @@ class AgcManagerDirect final { AgcManagerDirect(GainControl* gctrl, VolumeCallbacks* volume_callbacks, int startup_min_level, - int clipped_level_min); + int clipped_level_min, + bool use_agc2_level_estimation, + bool use_agc2_digital_adaptive); + // Dependency injection for testing. Don't delete |agc| as the memory is owned // by the manager. AgcManagerDirect(Agc* agc, @@ -56,6 +59,15 @@ class AgcManagerDirect final { VolumeCallbacks* volume_callbacks, int startup_min_level, int clipped_level_min); + + // Most general c-tor. + AgcManagerDirect(Agc* agc, + GainControl* gctrl, + VolumeCallbacks* volume_callbacks, + int startup_min_level, + int clipped_level_min, + bool use_agc2_level_estimation, + bool use_agc2_digital_adaptive); ~AgcManagerDirect(); int Initialize(); @@ -103,6 +115,8 @@ class AgcManagerDirect final { bool capture_muted_; bool check_volume_on_next_process_; bool startup_; + const bool use_agc2_level_estimation_; + const bool use_agc2_digital_adaptive_; int startup_min_level_; const int clipped_level_min_; diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc index 38f67302db..e87d2cf21c 100644 --- a/modules/audio_processing/audio_processing_impl.cc +++ b/modules/audio_processing/audio_processing_impl.cc @@ -366,9 +366,13 @@ AudioProcessingImpl::AudioProcessingImpl( constants_(config.Get().startup_min_volume, config.Get().clipped_level_min, #if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS) + false, + false, false), #else - config.Get().enabled), + config.Get().enabled, + config.Get().enabled_agc2_level_estimator, + config.Get().enabled_agc2_digital_adaptive), #endif #if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS) capture_(false), @@ -542,7 +546,9 @@ int AudioProcessingImpl::InitializeLocked() { private_submodules_->agc_manager.reset(new AgcManagerDirect( public_submodules_->gain_control.get(), public_submodules_->gain_control_for_experimental_agc.get(), - constants_.agc_startup_min_volume, constants_.agc_clipped_level_min)); + constants_.agc_startup_min_volume, constants_.agc_clipped_level_min, + constants_.use_experimental_agc_agc2_level_estimation, + constants_.use_experimental_agc_agc2_digital_adaptive)); } private_submodules_->agc_manager->Initialize(); private_submodules_->agc_manager->SetCaptureMuted( diff --git a/modules/audio_processing/audio_processing_impl.h b/modules/audio_processing/audio_processing_impl.h index d97e6763e5..8a5d245d1c 100644 --- a/modules/audio_processing/audio_processing_impl.h +++ b/modules/audio_processing/audio_processing_impl.h @@ -352,14 +352,23 @@ class AudioProcessingImpl : public AudioProcessing { const struct ApmConstants { ApmConstants(int agc_startup_min_volume, int agc_clipped_level_min, - bool use_experimental_agc) + bool use_experimental_agc, + bool use_experimental_agc_agc2_level_estimation, + bool use_experimental_agc_agc2_digital_adaptive) : // Format of processing streams at input/output call sites. agc_startup_min_volume(agc_startup_min_volume), agc_clipped_level_min(agc_clipped_level_min), - use_experimental_agc(use_experimental_agc) {} + use_experimental_agc(use_experimental_agc), + use_experimental_agc_agc2_level_estimation( + use_experimental_agc_agc2_level_estimation), + use_experimental_agc_agc2_digital_adaptive( + use_experimental_agc_agc2_digital_adaptive) {} int agc_startup_min_volume; int agc_clipped_level_min; bool use_experimental_agc; + bool use_experimental_agc_agc2_level_estimation; + bool use_experimental_agc_agc2_digital_adaptive; + } constants_; struct ApmCaptureState { diff --git a/modules/audio_processing/include/audio_processing.h b/modules/audio_processing/include/audio_processing.h index d24502e873..0882d3378c 100644 --- a/modules/audio_processing/include/audio_processing.h +++ b/modules/audio_processing/include/audio_processing.h @@ -122,6 +122,13 @@ static constexpr int kClippedLevelMin = 70; struct ExperimentalAgc { ExperimentalAgc() = default; explicit ExperimentalAgc(bool enabled) : enabled(enabled) {} + ExperimentalAgc(bool enabled, + bool enabled_agc2_level_estimator, + bool enabled_agc2_digital_adaptive) + : enabled(enabled), + enabled_agc2_level_estimator(enabled_agc2_level_estimator), + enabled_agc2_digital_adaptive(enabled_agc2_digital_adaptive) {} + ExperimentalAgc(bool enabled, int startup_min_volume) : enabled(enabled), startup_min_volume(startup_min_volume) {} ExperimentalAgc(bool enabled, int startup_min_volume, int clipped_level_min) @@ -133,6 +140,8 @@ struct ExperimentalAgc { int startup_min_volume = kAgcStartupMinVolume; // Lowest microphone level that will be applied in response to clipping. int clipped_level_min = kClippedLevelMin; + bool enabled_agc2_level_estimator = false; + bool enabled_agc2_digital_adaptive = false; }; // Use to enable experimental noise suppression. It can be set in the diff --git a/modules/audio_processing/test/audio_processing_simulator.cc b/modules/audio_processing/test/audio_processing_simulator.cc index a0740cf0c8..dce875ea75 100644 --- a/modules/audio_processing/test/audio_processing_simulator.cc +++ b/modules/audio_processing/test/audio_processing_simulator.cc @@ -615,7 +615,11 @@ void AudioProcessingSimulator::CreateAudioProcessor() { config.Set(new DelayAgnostic(!settings_.use_delay_agnostic || *settings_.use_delay_agnostic)); config.Set(new ExperimentalAgc( - !settings_.use_experimental_agc || *settings_.use_experimental_agc)); + !settings_.use_experimental_agc || *settings_.use_experimental_agc, + !!settings_.use_experimental_agc_agc2_level_estimator && + *settings_.use_experimental_agc_agc2_level_estimator, + !!settings_.use_experimental_agc_agc2_digital_adaptive && + *settings_.use_experimental_agc_agc2_digital_adaptive)); if (settings_.use_ed) { apm_config.residual_echo_detector.enabled = *settings_.use_ed; } diff --git a/modules/audio_processing/test/audio_processing_simulator.h b/modules/audio_processing/test/audio_processing_simulator.h index e82e7d5d69..b0cf0fdf88 100644 --- a/modules/audio_processing/test/audio_processing_simulator.h +++ b/modules/audio_processing/test/audio_processing_simulator.h @@ -66,6 +66,8 @@ struct SimulationSettings { absl::optional use_drift_compensation; absl::optional use_aec3; absl::optional use_experimental_agc; + absl::optional use_experimental_agc_agc2_level_estimator; + absl::optional use_experimental_agc_agc2_digital_adaptive; absl::optional aecm_routing_mode; absl::optional use_aecm_comfort_noise; absl::optional agc_mode; diff --git a/modules/audio_processing/test/audioproc_float_impl.cc b/modules/audio_processing/test/audioproc_float_impl.cc index ebf20e35e1..5d7b7e1481 100644 --- a/modules/audio_processing/test/audioproc_float_impl.cc +++ b/modules/audio_processing/test/audioproc_float_impl.cc @@ -118,6 +118,14 @@ DEFINE_int(aec3, DEFINE_int(experimental_agc, kParameterNotSpecifiedValue, "Activate (1) or deactivate(0) the experimental AGC"); +DEFINE_int( + experimental_agc_agc2_level_estimator, + kParameterNotSpecifiedValue, + "Activate (1) or deactivate(0) AGC2 level estimate in experimental AGC"); +DEFINE_int(experimental_agc_agc2_digital_adaptive, + kParameterNotSpecifiedValue, + "Activate (1) or deactivate(0) AGC2 digital adaptation in " + "experimental AGC"); DEFINE_int( refined_adaptive_filter, kParameterNotSpecifiedValue, @@ -256,6 +264,11 @@ SimulationSettings CreateSettings() { SetSettingIfFlagSet(FLAG_aec3, &settings.use_aec3); SetSettingIfFlagSet(FLAG_experimental_agc, &settings.use_experimental_agc); + SetSettingIfFlagSet(FLAG_experimental_agc_agc2_level_estimator, + &settings.use_experimental_agc_agc2_level_estimator); + SetSettingIfFlagSet(FLAG_experimental_agc_agc2_digital_adaptive, + &settings.use_experimental_agc_agc2_digital_adaptive); + SetSettingIfSpecified(FLAG_aecm_routing_mode, &settings.aecm_routing_mode); SetSettingIfFlagSet(FLAG_aecm_comfort_noise, &settings.use_aecm_comfort_noise);