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 <alessiob@webrtc.org>
Reviewed-by: Jesus de Vicente Pena <devicentepena@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#35144}
diff --git a/modules/audio_processing/agc2/BUILD.gn b/modules/audio_processing/agc2/BUILD.gn
index ce70c5d..4e6daec 100644
--- a/modules/audio_processing/agc2/BUILD.gn
+++ b/modules/audio_processing/agc2/BUILD.gn
@@ -47,6 +47,7 @@
     "../../../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 eafbcc2..3f82d00 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 @@
 
 }  // 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 436effd..a7f9b18 100644
--- a/modules/audio_processing/audio_processing_unittest.cc
+++ b/modules/audio_processing/audio_processing_unittest.cc
@@ -3137,18 +3137,6 @@
   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 @@
   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 71d0938..f57ace7 100644
--- a/modules/audio_processing/include/audio_processing.cc
+++ b/modules/audio_processing/include/audio_processing.cc
@@ -96,9 +96,7 @@
          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 @@
 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 121e430..5905401 100644
--- a/modules/audio_processing/include/audio_processing.h
+++ b/modules/audio_processing/include/audio_processing.h
@@ -379,10 +379,6 @@
         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;