From 7b80d4480e85cec2ca6010a4912333bf3aa30a50 Mon Sep 17 00:00:00 2001 From: Alessio Bazzica Date: Mon, 4 Oct 2021 18:33:37 +0200 Subject: [PATCH] AGC2: SIMD allowed config flags to field trials Bug: webrtc:7494 Change-Id: I41fa05d2ef6d969750f3d4c1e40ecbcd30293b5a Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/233741 Commit-Queue: Alessio Bazzica Reviewed-by: Jesus de Vicente Pena Cr-Commit-Position: refs/heads/main@{#35144} --- modules/audio_processing/agc2/BUILD.gn | 1 + modules/audio_processing/agc2/adaptive_agc.cc | 20 +- .../audio_processing_unittest.cc | 24 --- .../include/audio_processing.cc | 191 +++++++++--------- .../include/audio_processing.h | 4 - 5 files changed, 103 insertions(+), 137 deletions(-) diff --git a/modules/audio_processing/agc2/BUILD.gn b/modules/audio_processing/agc2/BUILD.gn index ce70c5d2e2..4e6daec826 100644 --- a/modules/audio_processing/agc2/BUILD.gn +++ b/modules/audio_processing/agc2/BUILD.gn @@ -47,6 +47,7 @@ rtc_library("adaptive_digital") { "../../../rtc_base:rtc_base_approved", "../../../rtc_base:safe_compare", "../../../rtc_base:safe_minmax", + "../../../system_wrappers:field_trial", "../../../system_wrappers:metrics", ] diff --git a/modules/audio_processing/agc2/adaptive_agc.cc b/modules/audio_processing/agc2/adaptive_agc.cc index eafbcc26ae..3f82d00594 100644 --- a/modules/audio_processing/agc2/adaptive_agc.cc +++ b/modules/audio_processing/agc2/adaptive_agc.cc @@ -16,24 +16,21 @@ #include "modules/audio_processing/logging/apm_data_dumper.h" #include "rtc_base/checks.h" #include "rtc_base/logging.h" +#include "system_wrappers/include/field_trial.h" namespace webrtc { namespace { -using AdaptiveDigitalConfig = - AudioProcessing::Config::GainController2::AdaptiveDigital; - // Detects the available CPU features and applies any kill-switches. -AvailableCpuFeatures GetAllowedCpuFeatures( - const AdaptiveDigitalConfig& config) { +AvailableCpuFeatures GetAllowedCpuFeatures() { AvailableCpuFeatures features = GetAvailableCpuFeatures(); - if (!config.sse2_allowed) { + if (field_trial::IsEnabled("WebRTC-Agc2SimdSse2KillSwitch")) { features.sse2 = false; } - if (!config.avx2_allowed) { + if (field_trial::IsEnabled("WebRTC-Agc2SimdAvx2KillSwitch")) { features.avx2 = false; } - if (!config.neon_allowed) { + if (field_trial::IsEnabled("WebRTC-Agc2SimdNeonKillSwitch")) { features.neon = false; } return features; @@ -41,10 +38,11 @@ AvailableCpuFeatures GetAllowedCpuFeatures( } // namespace -AdaptiveAgc::AdaptiveAgc(ApmDataDumper* apm_data_dumper, - const AdaptiveDigitalConfig& config) +AdaptiveAgc::AdaptiveAgc( + ApmDataDumper* apm_data_dumper, + const AudioProcessing::Config::GainController2::AdaptiveDigital& config) : speech_level_estimator_(apm_data_dumper, config), - vad_(config.vad_reset_period_ms, GetAllowedCpuFeatures(config)), + vad_(config.vad_reset_period_ms, GetAllowedCpuFeatures()), gain_controller_(apm_data_dumper, config), apm_data_dumper_(apm_data_dumper), noise_level_estimator_(CreateNoiseFloorEstimator(apm_data_dumper)), diff --git a/modules/audio_processing/audio_processing_unittest.cc b/modules/audio_processing/audio_processing_unittest.cc index 436effd57e..a7f9b18903 100644 --- a/modules/audio_processing/audio_processing_unittest.cc +++ b/modules/audio_processing/audio_processing_unittest.cc @@ -3137,18 +3137,6 @@ TEST(AudioProcessing, GainController2ConfigEqual) { b_adaptive.max_output_noise_level_dbfs = a_adaptive.max_output_noise_level_dbfs; EXPECT_EQ(a, b); - - Toggle(a_adaptive.sse2_allowed); - b_adaptive.sse2_allowed = a_adaptive.sse2_allowed; - EXPECT_EQ(a, b); - - Toggle(a_adaptive.avx2_allowed); - b_adaptive.avx2_allowed = a_adaptive.avx2_allowed; - EXPECT_EQ(a, b); - - Toggle(a_adaptive.neon_allowed); - b_adaptive.neon_allowed = a_adaptive.neon_allowed; - EXPECT_EQ(a, b); } // Checks that one differing parameter is sufficient to make two configs @@ -3203,18 +3191,6 @@ TEST(AudioProcessing, GainController2ConfigNotEqual) { a_adaptive.max_output_noise_level_dbfs += 1.0f; EXPECT_NE(a, b); a_adaptive = b_adaptive; - - Toggle(a_adaptive.sse2_allowed); - EXPECT_NE(a, b); - a_adaptive = b_adaptive; - - Toggle(a_adaptive.avx2_allowed); - EXPECT_NE(a, b); - a_adaptive = b_adaptive; - - Toggle(a_adaptive.neon_allowed); - EXPECT_NE(a, b); - a_adaptive = b_adaptive; } } // namespace webrtc diff --git a/modules/audio_processing/include/audio_processing.cc b/modules/audio_processing/include/audio_processing.cc index 71d093812a..f57ace7dbf 100644 --- a/modules/audio_processing/include/audio_processing.cc +++ b/modules/audio_processing/include/audio_processing.cc @@ -96,9 +96,7 @@ bool Agc2Config::AdaptiveDigital::operator==( adjacent_speech_frames_threshold == rhs.adjacent_speech_frames_threshold && max_gain_change_db_per_second == rhs.max_gain_change_db_per_second && - max_output_noise_level_dbfs == rhs.max_output_noise_level_dbfs && - sse2_allowed == rhs.sse2_allowed && avx2_allowed == rhs.avx2_allowed && - neon_allowed == rhs.neon_allowed; + max_output_noise_level_dbfs == rhs.max_output_noise_level_dbfs; } bool Agc2Config::operator==(const Agc2Config& rhs) const { @@ -123,101 +121,98 @@ operator==(const AudioProcessing::Config::CaptureLevelAdjustment:: std::string AudioProcessing::Config::ToString() const { char buf[2048]; rtc::SimpleStringBuilder builder(buf); - builder - << "AudioProcessing::Config{ " - "pipeline: { " - "maximum_internal_processing_rate: " - << pipeline.maximum_internal_processing_rate - << ", multi_channel_render: " << pipeline.multi_channel_render - << ", multi_channel_capture: " << pipeline.multi_channel_capture - << " }, pre_amplifier: { enabled: " << pre_amplifier.enabled - << ", fixed_gain_factor: " << pre_amplifier.fixed_gain_factor - << " },capture_level_adjustment: { enabled: " - << capture_level_adjustment.enabled - << ", pre_gain_factor: " << capture_level_adjustment.pre_gain_factor - << ", post_gain_factor: " << capture_level_adjustment.post_gain_factor - << ", analog_mic_gain_emulation: { enabled: " - << capture_level_adjustment.analog_mic_gain_emulation.enabled - << ", initial_level: " - << capture_level_adjustment.analog_mic_gain_emulation.initial_level - << " }}, high_pass_filter: { enabled: " << high_pass_filter.enabled - << " }, echo_canceller: { enabled: " << echo_canceller.enabled - << ", mobile_mode: " << echo_canceller.mobile_mode - << ", enforce_high_pass_filtering: " - << echo_canceller.enforce_high_pass_filtering - << " }, noise_suppression: { enabled: " << noise_suppression.enabled - << ", level: " << NoiseSuppressionLevelToString(noise_suppression.level) - << " }, transient_suppression: { enabled: " - << transient_suppression.enabled - << " }, voice_detection: { enabled: " << voice_detection.enabled - << " }, gain_controller1: { enabled: " << gain_controller1.enabled - << ", mode: " << GainController1ModeToString(gain_controller1.mode) - << ", target_level_dbfs: " << gain_controller1.target_level_dbfs - << ", compression_gain_db: " << gain_controller1.compression_gain_db - << ", enable_limiter: " << gain_controller1.enable_limiter - << ", analog_level_minimum: " << gain_controller1.analog_level_minimum - << ", analog_level_maximum: " << gain_controller1.analog_level_maximum - << ", analog_gain_controller { enabled: " - << gain_controller1.analog_gain_controller.enabled - << ", startup_min_volume: " - << gain_controller1.analog_gain_controller.startup_min_volume - << ", clipped_level_min: " - << gain_controller1.analog_gain_controller.clipped_level_min - << ", enable_digital_adaptive: " - << gain_controller1.analog_gain_controller.enable_digital_adaptive - << ", clipped_level_step: " - << gain_controller1.analog_gain_controller.clipped_level_step - << ", clipped_ratio_threshold: " - << gain_controller1.analog_gain_controller.clipped_ratio_threshold - << ", clipped_wait_frames: " - << gain_controller1.analog_gain_controller.clipped_wait_frames - << ", clipping_predictor: { enabled: " - << gain_controller1.analog_gain_controller.clipping_predictor.enabled - << ", mode: " - << gain_controller1.analog_gain_controller.clipping_predictor.mode - << ", window_length: " - << gain_controller1.analog_gain_controller.clipping_predictor - .window_length - << ", reference_window_length: " - << gain_controller1.analog_gain_controller.clipping_predictor - .reference_window_length - << ", reference_window_delay: " - << gain_controller1.analog_gain_controller.clipping_predictor - .reference_window_delay - << ", clipping_threshold: " - << gain_controller1.analog_gain_controller.clipping_predictor - .clipping_threshold - << ", crest_factor_margin: " - << gain_controller1.analog_gain_controller.clipping_predictor - .crest_factor_margin - << ", use_predicted_step: " - << gain_controller1.analog_gain_controller.clipping_predictor - .use_predicted_step - << " }}}, gain_controller2: { enabled: " << gain_controller2.enabled - << ", fixed_digital: { gain_db: " - << gain_controller2.fixed_digital.gain_db - << " }, adaptive_digital: { enabled: " - << gain_controller2.adaptive_digital.enabled - << ", dry_run: " << gain_controller2.adaptive_digital.dry_run - << ", headroom_db: " << gain_controller2.adaptive_digital.headroom_db - << ", max_gain_db: " << gain_controller2.adaptive_digital.max_gain_db - << ", initial_gain_db: " - << gain_controller2.adaptive_digital.initial_gain_db - << ", vad_reset_period_ms: " - << gain_controller2.adaptive_digital.vad_reset_period_ms - << ", adjacent_speech_frames_threshold: " - << gain_controller2.adaptive_digital.adjacent_speech_frames_threshold - << ", max_gain_change_db_per_second: " - << gain_controller2.adaptive_digital.max_gain_change_db_per_second - << ", max_output_noise_level_dbfs: " - << gain_controller2.adaptive_digital.max_output_noise_level_dbfs - << ", sse2_allowed: " << gain_controller2.adaptive_digital.sse2_allowed - << ", avx2_allowed: " << gain_controller2.adaptive_digital.avx2_allowed - << ", neon_allowed: " << gain_controller2.adaptive_digital.neon_allowed - << "}}, residual_echo_detector: { enabled: " - << residual_echo_detector.enabled - << " }, level_estimation: { enabled: " << level_estimation.enabled - << " }}"; + builder << "AudioProcessing::Config{ " + "pipeline: { " + "maximum_internal_processing_rate: " + << pipeline.maximum_internal_processing_rate + << ", multi_channel_render: " << pipeline.multi_channel_render + << ", multi_channel_capture: " << pipeline.multi_channel_capture + << " }, pre_amplifier: { enabled: " << pre_amplifier.enabled + << ", fixed_gain_factor: " << pre_amplifier.fixed_gain_factor + << " },capture_level_adjustment: { enabled: " + << capture_level_adjustment.enabled + << ", pre_gain_factor: " << capture_level_adjustment.pre_gain_factor + << ", post_gain_factor: " << capture_level_adjustment.post_gain_factor + << ", analog_mic_gain_emulation: { enabled: " + << capture_level_adjustment.analog_mic_gain_emulation.enabled + << ", initial_level: " + << capture_level_adjustment.analog_mic_gain_emulation.initial_level + << " }}, high_pass_filter: { enabled: " << high_pass_filter.enabled + << " }, echo_canceller: { enabled: " << echo_canceller.enabled + << ", mobile_mode: " << echo_canceller.mobile_mode + << ", enforce_high_pass_filtering: " + << echo_canceller.enforce_high_pass_filtering + << " }, noise_suppression: { enabled: " << noise_suppression.enabled + << ", level: " + << NoiseSuppressionLevelToString(noise_suppression.level) + << " }, transient_suppression: { enabled: " + << transient_suppression.enabled + << " }, voice_detection: { enabled: " << voice_detection.enabled + << " }, gain_controller1: { enabled: " << gain_controller1.enabled + << ", mode: " << GainController1ModeToString(gain_controller1.mode) + << ", target_level_dbfs: " << gain_controller1.target_level_dbfs + << ", compression_gain_db: " << gain_controller1.compression_gain_db + << ", enable_limiter: " << gain_controller1.enable_limiter + << ", analog_level_minimum: " << gain_controller1.analog_level_minimum + << ", analog_level_maximum: " << gain_controller1.analog_level_maximum + << ", analog_gain_controller { enabled: " + << gain_controller1.analog_gain_controller.enabled + << ", startup_min_volume: " + << gain_controller1.analog_gain_controller.startup_min_volume + << ", clipped_level_min: " + << gain_controller1.analog_gain_controller.clipped_level_min + << ", enable_digital_adaptive: " + << gain_controller1.analog_gain_controller.enable_digital_adaptive + << ", clipped_level_step: " + << gain_controller1.analog_gain_controller.clipped_level_step + << ", clipped_ratio_threshold: " + << gain_controller1.analog_gain_controller.clipped_ratio_threshold + << ", clipped_wait_frames: " + << gain_controller1.analog_gain_controller.clipped_wait_frames + << ", clipping_predictor: { enabled: " + << gain_controller1.analog_gain_controller.clipping_predictor.enabled + << ", mode: " + << gain_controller1.analog_gain_controller.clipping_predictor.mode + << ", window_length: " + << gain_controller1.analog_gain_controller.clipping_predictor + .window_length + << ", reference_window_length: " + << gain_controller1.analog_gain_controller.clipping_predictor + .reference_window_length + << ", reference_window_delay: " + << gain_controller1.analog_gain_controller.clipping_predictor + .reference_window_delay + << ", clipping_threshold: " + << gain_controller1.analog_gain_controller.clipping_predictor + .clipping_threshold + << ", crest_factor_margin: " + << gain_controller1.analog_gain_controller.clipping_predictor + .crest_factor_margin + << ", use_predicted_step: " + << gain_controller1.analog_gain_controller.clipping_predictor + .use_predicted_step + << " }}}, gain_controller2: { enabled: " << gain_controller2.enabled + << ", fixed_digital: { gain_db: " + << gain_controller2.fixed_digital.gain_db + << " }, adaptive_digital: { enabled: " + << gain_controller2.adaptive_digital.enabled + << ", dry_run: " << gain_controller2.adaptive_digital.dry_run + << ", headroom_db: " << gain_controller2.adaptive_digital.headroom_db + << ", max_gain_db: " << gain_controller2.adaptive_digital.max_gain_db + << ", initial_gain_db: " + << gain_controller2.adaptive_digital.initial_gain_db + << ", vad_reset_period_ms: " + << gain_controller2.adaptive_digital.vad_reset_period_ms + << ", adjacent_speech_frames_threshold: " + << gain_controller2.adaptive_digital.adjacent_speech_frames_threshold + << ", max_gain_change_db_per_second: " + << gain_controller2.adaptive_digital.max_gain_change_db_per_second + << ", max_output_noise_level_dbfs: " + << gain_controller2.adaptive_digital.max_output_noise_level_dbfs + << "}}, residual_echo_detector: { enabled: " + << residual_echo_detector.enabled + << " }, level_estimation: { enabled: " << level_estimation.enabled + << " }}"; return builder.str(); } diff --git a/modules/audio_processing/include/audio_processing.h b/modules/audio_processing/include/audio_processing.h index 121e430b60..590540132f 100644 --- a/modules/audio_processing/include/audio_processing.h +++ b/modules/audio_processing/include/audio_processing.h @@ -379,10 +379,6 @@ class RTC_EXPORT AudioProcessing : public rtc::RefCountInterface { int adjacent_speech_frames_threshold = 12; float max_gain_change_db_per_second = 3.0f; float max_output_noise_level_dbfs = -50.0f; - // TODO(bugs.webrtc.org/7494): Replace with field trials. - bool sse2_allowed = true; - bool avx2_allowed = true; - bool neon_allowed = true; } adaptive_digital; } gain_controller2;