Remove unused code in APM

- The injection of the AGC2 level estimator into `AgcManagerDirect`
  is not used anymore
- `ExperimentalAgc::enabled_agc2_level_estimator` can also be removed
- 3 ctors of `ExperimentalAgc` are unused
- `AgcManagerDirectStandaloneTest::AgcMinMicLevelExperiment` can be
  split into separate unit tests (better code clarity)

Bug: webrtc:7494
Change-Id: I5843147c38cf7cb5ee484b0a72fe13dcf363efaf
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/202025
Commit-Queue: Alessio Bazzica <alessiob@webrtc.org>
Reviewed-by: Per Ã…hgren <peah@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#33027}
diff --git a/modules/audio_processing/agc/BUILD.gn b/modules/audio_processing/agc/BUILD.gn
index 8235456..5ad6644 100644
--- a/modules/audio_processing/agc/BUILD.gn
+++ b/modules/audio_processing/agc/BUILD.gn
@@ -33,7 +33,6 @@
     "../../../rtc_base:safe_minmax",
     "../../../system_wrappers:field_trial",
     "../../../system_wrappers:metrics",
-    "../agc2:level_estimation_agc",
     "../vad",
   ]
   absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
diff --git a/modules/audio_processing/agc/agc_manager_direct.cc b/modules/audio_processing/agc/agc_manager_direct.cc
index 1428d2a..3f467ce 100644
--- a/modules/audio_processing/agc/agc_manager_direct.cc
+++ b/modules/audio_processing/agc/agc_manager_direct.cc
@@ -16,7 +16,6 @@
 #include "common_audio/include/audio_util.h"
 #include "modules/audio_processing/agc/gain_control.h"
 #include "modules/audio_processing/agc/gain_map_internal.h"
-#include "modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.h"
 #include "rtc_base/atomic_ops.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
@@ -138,24 +137,18 @@
 MonoAgc::MonoAgc(ApmDataDumper* data_dumper,
                  int startup_min_level,
                  int clipped_level_min,
-                 bool use_agc2_level_estimation,
                  bool disable_digital_adaptive,
                  int min_mic_level)
     : min_mic_level_(min_mic_level),
       disable_digital_adaptive_(disable_digital_adaptive),
+      agc_(std::make_unique<Agc>()),
       max_level_(kMaxMicLevel),
       max_compression_gain_(kMaxCompressionGain),
       target_compression_(kDefaultCompressionGain),
       compression_(target_compression_),
       compression_accumulator_(compression_),
       startup_min_level_(ClampLevel(startup_min_level, min_mic_level_)),
-      clipped_level_min_(clipped_level_min) {
-  if (use_agc2_level_estimation) {
-    agc_ = std::make_unique<AdaptiveModeLevelEstimatorAgc>(data_dumper);
-  } else {
-    agc_ = std::make_unique<Agc>();
-  }
-}
+      clipped_level_min_(clipped_level_min) {}
 
 MonoAgc::~MonoAgc() = default;
 
@@ -415,7 +408,6 @@
     : AgcManagerDirect(/*num_capture_channels*/ 1,
                        startup_min_level,
                        clipped_level_min,
-                       /*use_agc2_level_estimation*/ false,
                        /*disable_digital_adaptive*/ false,
                        sample_rate_hz) {
   RTC_DCHECK(channel_agcs_[0]);
@@ -426,7 +418,6 @@
 AgcManagerDirect::AgcManagerDirect(int num_capture_channels,
                                    int startup_min_level,
                                    int clipped_level_min,
-                                   bool use_agc2_level_estimation,
                                    bool disable_digital_adaptive,
                                    int sample_rate_hz)
     : data_dumper_(
@@ -445,7 +436,7 @@
 
     channel_agcs_[ch] = std::make_unique<MonoAgc>(
         data_dumper_ch, startup_min_level, clipped_level_min,
-        use_agc2_level_estimation, disable_digital_adaptive_, min_mic_level);
+        disable_digital_adaptive_, min_mic_level);
   }
   RTC_DCHECK_LT(0, channel_agcs_.size());
   channel_agcs_[0]->ActivateLogging();
diff --git a/modules/audio_processing/agc/agc_manager_direct.h b/modules/audio_processing/agc/agc_manager_direct.h
index d3663be..8356b0c 100644
--- a/modules/audio_processing/agc/agc_manager_direct.h
+++ b/modules/audio_processing/agc/agc_manager_direct.h
@@ -38,7 +38,6 @@
   AgcManagerDirect(int num_capture_channels,
                    int startup_min_level,
                    int clipped_level_min,
-                   bool use_agc2_level_estimation,
                    bool disable_digital_adaptive,
                    int sample_rate_hz);
 
@@ -73,6 +72,16 @@
                            DisableDigitalDisablesDigital);
   FRIEND_TEST_ALL_PREFIXES(AgcManagerDirectStandaloneTest,
                            AgcMinMicLevelExperiment);
+  FRIEND_TEST_ALL_PREFIXES(AgcManagerDirectStandaloneTest,
+                           AgcMinMicLevelExperimentDisabled);
+  FRIEND_TEST_ALL_PREFIXES(AgcManagerDirectStandaloneTest,
+                           AgcMinMicLevelExperimentOutOfRangeAbove);
+  FRIEND_TEST_ALL_PREFIXES(AgcManagerDirectStandaloneTest,
+                           AgcMinMicLevelExperimentOutOfRangeBelow);
+  FRIEND_TEST_ALL_PREFIXES(AgcManagerDirectStandaloneTest,
+                           AgcMinMicLevelExperimentEnabled50);
+  FRIEND_TEST_ALL_PREFIXES(AgcManagerDirectStandaloneTest,
+                           AgcMinMicLevelExperimentEnabledAboveStartupLevel);
 
   // Dependency injection for testing. Don't delete |agc| as the memory is owned
   // by the manager.
@@ -106,7 +115,6 @@
   MonoAgc(ApmDataDumper* data_dumper,
           int startup_min_level,
           int clipped_level_min,
-          bool use_agc2_level_estimation,
           bool disable_digital_adaptive,
           int min_mic_level);
   ~MonoAgc();
diff --git a/modules/audio_processing/agc/agc_manager_direct_unittest.cc b/modules/audio_processing/agc/agc_manager_direct_unittest.cc
index 995801a..c909b08 100644
--- a/modules/audio_processing/agc/agc_manager_direct_unittest.cc
+++ b/modules/audio_processing/agc/agc_manager_direct_unittest.cc
@@ -56,6 +56,13 @@
   MOCK_METHOD(bool, stream_is_saturated, (), (const, override));
 };
 
+std::unique_ptr<AgcManagerDirect> CreateAgcManagerDirect(
+    int startup_min_level) {
+  return std::make_unique<AgcManagerDirect>(
+      /*num_capture_channels=*/1, startup_min_level, kClippedMin,
+      /*disable_digital_adaptive=*/true, kSampleRateHz);
+}
+
 }  // namespace
 
 class AgcManagerDirectTest : public ::testing::Test {
@@ -692,77 +699,78 @@
 TEST(AgcManagerDirectStandaloneTest, DisableDigitalDisablesDigital) {
   auto agc = std::unique_ptr<Agc>(new ::testing::NiceMock<MockAgc>());
   MockGainControl gctrl;
-  AgcManagerDirect manager(/* num_capture_channels */ 1, kInitialVolume,
-                           kClippedMin,
-                           /* use agc2 level estimation */ false,
-                           /* disable digital adaptive */ true, kSampleRateHz);
-
   EXPECT_CALL(gctrl, set_mode(GainControl::kFixedDigital));
   EXPECT_CALL(gctrl, set_target_level_dbfs(0));
   EXPECT_CALL(gctrl, set_compression_gain_db(0));
   EXPECT_CALL(gctrl, enable_limiter(false));
 
-  manager.Initialize();
-  manager.SetupDigitalGainControl(&gctrl);
+  std::unique_ptr<AgcManagerDirect> manager =
+      CreateAgcManagerDirect(kInitialVolume);
+  manager->Initialize();
+  manager->SetupDigitalGainControl(&gctrl);
 }
 
 TEST(AgcManagerDirectStandaloneTest, AgcMinMicLevelExperiment) {
-  auto agc_man = std::unique_ptr<AgcManagerDirect>(new AgcManagerDirect(
-      /* num_capture_channels */ 1, kInitialVolume, kClippedMin, true, true,
-      kSampleRateHz));
-  EXPECT_EQ(agc_man->channel_agcs_[0]->min_mic_level(), kMinMicLevel);
-  EXPECT_EQ(agc_man->channel_agcs_[0]->startup_min_level(), kInitialVolume);
-  {
-    test::ScopedFieldTrials field_trial(
-        "WebRTC-Audio-AgcMinMicLevelExperiment/Disabled/");
-    agc_man.reset(new AgcManagerDirect(
-        /* num_capture_channels */ 1, kInitialVolume, kClippedMin, true, true,
-        kSampleRateHz));
-    EXPECT_EQ(agc_man->channel_agcs_[0]->min_mic_level(), kMinMicLevel);
-    EXPECT_EQ(agc_man->channel_agcs_[0]->startup_min_level(), kInitialVolume);
-  }
-  {
-    // Valid range of field-trial parameter is [0,255].
-    test::ScopedFieldTrials field_trial(
-        "WebRTC-Audio-AgcMinMicLevelExperiment/Enabled-256/");
-    agc_man.reset(new AgcManagerDirect(
-        /* num_capture_channels */ 1, kInitialVolume, kClippedMin, true, true,
-        kSampleRateHz));
-    EXPECT_EQ(agc_man->channel_agcs_[0]->min_mic_level(), kMinMicLevel);
-    EXPECT_EQ(agc_man->channel_agcs_[0]->startup_min_level(), kInitialVolume);
-  }
-  {
-    test::ScopedFieldTrials field_trial(
-        "WebRTC-Audio-AgcMinMicLevelExperiment/Enabled--1/");
-    agc_man.reset(new AgcManagerDirect(
-        /* num_capture_channels */ 1, kInitialVolume, kClippedMin, true, true,
-        kSampleRateHz));
-    EXPECT_EQ(agc_man->channel_agcs_[0]->min_mic_level(), kMinMicLevel);
-    EXPECT_EQ(agc_man->channel_agcs_[0]->startup_min_level(), kInitialVolume);
-  }
-  {
-    // Verify that a valid experiment changes the minimum microphone level.
-    // The start volume is larger than the min level and should therefore not
-    // be changed.
-    test::ScopedFieldTrials field_trial(
-        "WebRTC-Audio-AgcMinMicLevelExperiment/Enabled-50/");
-    agc_man.reset(new AgcManagerDirect(
-        /* num_capture_channels */ 1, kInitialVolume, kClippedMin, true, true,
-        kSampleRateHz));
-    EXPECT_EQ(agc_man->channel_agcs_[0]->min_mic_level(), 50);
-    EXPECT_EQ(agc_man->channel_agcs_[0]->startup_min_level(), kInitialVolume);
-  }
-  {
-    // Use experiment to reduce the default minimum microphone level, start at
-    // a lower level and ensure that the startup level is increased to the min
-    // level set by the experiment.
-    test::ScopedFieldTrials field_trial(
-        "WebRTC-Audio-AgcMinMicLevelExperiment/Enabled-50/");
-    agc_man.reset(new AgcManagerDirect(/* num_capture_channels */ 1, 30,
-                                       kClippedMin, true, true, kSampleRateHz));
-    EXPECT_EQ(agc_man->channel_agcs_[0]->min_mic_level(), 50);
-    EXPECT_EQ(agc_man->channel_agcs_[0]->startup_min_level(), 50);
-  }
+  std::unique_ptr<AgcManagerDirect> manager =
+      CreateAgcManagerDirect(kInitialVolume);
+  EXPECT_EQ(manager->channel_agcs_[0]->min_mic_level(), kMinMicLevel);
+  EXPECT_EQ(manager->channel_agcs_[0]->startup_min_level(), kInitialVolume);
+}
+
+TEST(AgcManagerDirectStandaloneTest, AgcMinMicLevelExperimentDisabled) {
+  test::ScopedFieldTrials field_trial(
+      "WebRTC-Audio-AgcMinMicLevelExperiment/Disabled/");
+  std::unique_ptr<AgcManagerDirect> manager =
+      CreateAgcManagerDirect(kInitialVolume);
+  EXPECT_EQ(manager->channel_agcs_[0]->min_mic_level(), kMinMicLevel);
+  EXPECT_EQ(manager->channel_agcs_[0]->startup_min_level(), kInitialVolume);
+}
+
+// Checks that a field-trial parameter outside of the valid range [0,255] is
+// ignored.
+TEST(AgcManagerDirectStandaloneTest, AgcMinMicLevelExperimentOutOfRangeAbove) {
+  test::ScopedFieldTrials field_trial(
+      "WebRTC-Audio-AgcMinMicLevelExperiment/Enabled-256/");
+  std::unique_ptr<AgcManagerDirect> manager =
+      CreateAgcManagerDirect(kInitialVolume);
+  EXPECT_EQ(manager->channel_agcs_[0]->min_mic_level(), kMinMicLevel);
+  EXPECT_EQ(manager->channel_agcs_[0]->startup_min_level(), kInitialVolume);
+}
+
+// Checks that a field-trial parameter outside of the valid range [0,255] is
+// ignored.
+TEST(AgcManagerDirectStandaloneTest, AgcMinMicLevelExperimentOutOfRangeBelow) {
+  test::ScopedFieldTrials field_trial(
+      "WebRTC-Audio-AgcMinMicLevelExperiment/Enabled--1/");
+  std::unique_ptr<AgcManagerDirect> manager =
+      CreateAgcManagerDirect(kInitialVolume);
+  EXPECT_EQ(manager->channel_agcs_[0]->min_mic_level(), kMinMicLevel);
+  EXPECT_EQ(manager->channel_agcs_[0]->startup_min_level(), kInitialVolume);
+}
+
+// Verifies that a valid experiment changes the minimum microphone level. The
+// start volume is larger than the min level and should therefore not be
+// changed.
+TEST(AgcManagerDirectStandaloneTest, AgcMinMicLevelExperimentEnabled50) {
+  test::ScopedFieldTrials field_trial(
+      "WebRTC-Audio-AgcMinMicLevelExperiment/Enabled-50/");
+  std::unique_ptr<AgcManagerDirect> manager =
+      CreateAgcManagerDirect(kInitialVolume);
+  EXPECT_EQ(manager->channel_agcs_[0]->min_mic_level(), 50);
+  EXPECT_EQ(manager->channel_agcs_[0]->startup_min_level(), kInitialVolume);
+}
+
+// Uses experiment to reduce the default minimum microphone level, start at a
+// lower level and ensure that the startup level is increased to the min level
+// set by the experiment.
+TEST(AgcManagerDirectStandaloneTest,
+     AgcMinMicLevelExperimentEnabledAboveStartupLevel) {
+  test::ScopedFieldTrials field_trial(
+      "WebRTC-Audio-AgcMinMicLevelExperiment/Enabled-50/");
+  std::unique_ptr<AgcManagerDirect> manager =
+      CreateAgcManagerDirect(/*startup_min_level=*/30);
+  EXPECT_EQ(manager->channel_agcs_[0]->min_mic_level(), 50);
+  EXPECT_EQ(manager->channel_agcs_[0]->startup_min_level(), 50);
 }
 
 }  // namespace webrtc
diff --git a/modules/audio_processing/agc2/BUILD.gn b/modules/audio_processing/agc2/BUILD.gn
index 7b71f6a..8f2ee0f 100644
--- a/modules/audio_processing/agc2/BUILD.gn
+++ b/modules/audio_processing/agc2/BUILD.gn
@@ -15,31 +15,6 @@
   ]
 }
 
-rtc_library("level_estimation_agc") {
-  sources = [
-    "adaptive_mode_level_estimator_agc.cc",
-    "adaptive_mode_level_estimator_agc.h",
-  ]
-  configs += [ "..:apm_debug_dump" ]
-  deps = [
-    ":adaptive_digital",
-    ":common",
-    ":gain_applier",
-    ":noise_level_estimator",
-    ":rnn_vad_with_level",
-    "..:api",
-    "..:apm_logging",
-    "..:audio_frame_view",
-    "../../../api:array_view",
-    "../../../common_audio",
-    "../../../rtc_base:checks",
-    "../../../rtc_base:rtc_base_approved",
-    "../../../rtc_base:safe_minmax",
-    "../agc:level_estimation",
-    "../vad",
-  ]
-}
-
 rtc_library("adaptive_digital") {
   sources = [
     "adaptive_agc.cc",
diff --git a/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.cc b/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.cc
deleted file mode 100644
index 5ceeb7d..0000000
--- a/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.h"
-
-#include <cmath>
-#include <vector>
-
-#include "modules/audio_processing/agc2/agc2_common.h"
-#include "modules/audio_processing/include/audio_frame_view.h"
-
-namespace webrtc {
-
-AdaptiveModeLevelEstimatorAgc::AdaptiveModeLevelEstimatorAgc(
-    ApmDataDumper* apm_data_dumper)
-    : level_estimator_(apm_data_dumper) {
-  set_target_level_dbfs(kDefaultAgc2LevelHeadroomDbfs);
-}
-
-// |audio| must be mono; in a multi-channel stream, provide the first (usually
-// left) channel.
-void AdaptiveModeLevelEstimatorAgc::Process(const int16_t* audio,
-                                            size_t length,
-                                            int sample_rate_hz) {
-  std::vector<float> float_audio_frame(audio, audio + length);
-  const float* const first_channel = &float_audio_frame[0];
-  AudioFrameView<const float> frame_view(&first_channel, 1 /* num channels */,
-                                         length);
-  const auto vad_prob = agc2_vad_.AnalyzeFrame(frame_view);
-  latest_voice_probability_ = vad_prob.speech_probability;
-  if (latest_voice_probability_ > kVadConfidenceThreshold) {
-    time_in_ms_since_last_estimate_ += kFrameDurationMs;
-  }
-  level_estimator_.Update(vad_prob);
-}
-
-// Retrieves the difference between the target RMS level and the current
-// signal RMS level in dB. Returns true if an update is available and false
-// otherwise, in which case |error| should be ignored and no action taken.
-bool AdaptiveModeLevelEstimatorAgc::GetRmsErrorDb(int* error) {
-  if (time_in_ms_since_last_estimate_ <= kTimeUntilConfidentMs) {
-    return false;
-  }
-  *error =
-      std::floor(target_level_dbfs() - level_estimator_.level_dbfs() + 0.5f);
-  time_in_ms_since_last_estimate_ = 0;
-  return true;
-}
-
-void AdaptiveModeLevelEstimatorAgc::Reset() {
-  level_estimator_.Reset();
-}
-
-float AdaptiveModeLevelEstimatorAgc::voice_probability() const {
-  return latest_voice_probability_;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.h b/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.h
deleted file mode 100644
index bc6fa84..0000000
--- a/modules/audio_processing/agc2/adaptive_mode_level_estimator_agc.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_MODE_LEVEL_ESTIMATOR_AGC_H_
-#define MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_MODE_LEVEL_ESTIMATOR_AGC_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "modules/audio_processing/agc/agc.h"
-#include "modules/audio_processing/agc2/adaptive_mode_level_estimator.h"
-#include "modules/audio_processing/agc2/saturation_protector.h"
-#include "modules/audio_processing/agc2/vad_with_level.h"
-
-namespace webrtc {
-class AdaptiveModeLevelEstimatorAgc : public Agc {
- public:
-  explicit AdaptiveModeLevelEstimatorAgc(ApmDataDumper* apm_data_dumper);
-
-  // |audio| must be mono; in a multi-channel stream, provide the first (usually
-  // left) channel.
-  void Process(const int16_t* audio,
-               size_t length,
-               int sample_rate_hz) override;
-
-  // Retrieves the difference between the target RMS level and the current
-  // signal RMS level in dB. Returns true if an update is available and false
-  // otherwise, in which case |error| should be ignored and no action taken.
-  bool GetRmsErrorDb(int* error) override;
-  void Reset() override;
-
-  float voice_probability() const override;
-
- private:
-  static constexpr int kTimeUntilConfidentMs = 700;
-  static constexpr int kDefaultAgc2LevelHeadroomDbfs = -1;
-  int32_t time_in_ms_since_last_estimate_ = 0;
-  AdaptiveModeLevelEstimator level_estimator_;
-  VadLevelAnalyzer agc2_vad_;
-  float latest_voice_probability_ = 0.f;
-};
-}  // namespace webrtc
-
-#endif  // MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_MODE_LEVEL_ESTIMATOR_AGC_H_
diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc
index 37112f0..f9a6460 100644
--- a/modules/audio_processing/audio_processing_impl.cc
+++ b/modules/audio_processing/audio_processing_impl.cc
@@ -304,8 +304,6 @@
       config.Get<ExperimentalAgc>().startup_min_volume;
   config_.gain_controller1.analog_gain_controller.clipped_level_min =
       config.Get<ExperimentalAgc>().clipped_level_min;
-  config_.gain_controller1.analog_gain_controller.enable_agc2_level_estimator =
-      config.Get<ExperimentalAgc>().enabled_agc2_level_estimator;
   config_.gain_controller1.analog_gain_controller.enable_digital_adaptive =
       !config.Get<ExperimentalAgc>().digital_adaptive_disabled;
 #endif
@@ -1782,8 +1780,6 @@
         num_proc_channels(),
         config_.gain_controller1.analog_gain_controller.startup_min_volume,
         config_.gain_controller1.analog_gain_controller.clipped_level_min,
-        config_.gain_controller1.analog_gain_controller
-            .enable_agc2_level_estimator,
         !config_.gain_controller1.analog_gain_controller
              .enable_digital_adaptive,
         capture_nonlocked_.split_rate));
diff --git a/modules/audio_processing/audio_processing_unittest.cc b/modules/audio_processing/audio_processing_unittest.cc
index 545c780..e3aedf6 100644
--- a/modules/audio_processing/audio_processing_unittest.cc
+++ b/modules/audio_processing/audio_processing_unittest.cc
@@ -2931,10 +2931,6 @@
   b_analog.clipped_level_min = a_analog.clipped_level_min;
   EXPECT_EQ(a, b);
 
-  Toggle(a_analog.enable_agc2_level_estimator);
-  b_analog.enable_agc2_level_estimator = a_analog.enable_agc2_level_estimator;
-  EXPECT_EQ(a, b);
-
   Toggle(a_analog.enable_digital_adaptive);
   b_analog.enable_digital_adaptive = a_analog.enable_digital_adaptive;
   EXPECT_EQ(a, b);
@@ -2989,10 +2985,6 @@
   EXPECT_NE(a, b);
   a_analog.clipped_level_min = b_analog.clipped_level_min;
 
-  Toggle(a_analog.enable_agc2_level_estimator);
-  EXPECT_NE(a, b);
-  a_analog.enable_agc2_level_estimator = b_analog.enable_agc2_level_estimator;
-
   Toggle(a_analog.enable_digital_adaptive);
   EXPECT_NE(a, b);
   a_analog.enable_digital_adaptive = b_analog.enable_digital_adaptive;
diff --git a/modules/audio_processing/include/audio_processing.cc b/modules/audio_processing/include/audio_processing.cc
index 3bc00751..7cb2136 100644
--- a/modules/audio_processing/include/audio_processing.cc
+++ b/modules/audio_processing/include/audio_processing.cc
@@ -87,8 +87,6 @@
          analog_lhs.enabled == analog_rhs.enabled &&
          analog_lhs.startup_min_volume == analog_rhs.startup_min_volume &&
          analog_lhs.clipped_level_min == analog_rhs.clipped_level_min &&
-         analog_lhs.enable_agc2_level_estimator ==
-             analog_rhs.enable_agc2_level_estimator &&
          analog_lhs.enable_digital_adaptive ==
              analog_rhs.enable_digital_adaptive;
 }
diff --git a/modules/audio_processing/include/audio_processing.h b/modules/audio_processing/include/audio_processing.h
index 942e0c0..1070a56 100644
--- a/modules/audio_processing/include/audio_processing.h
+++ b/modules/audio_processing/include/audio_processing.h
@@ -72,32 +72,13 @@
 struct ExperimentalAgc {
   ExperimentalAgc() = default;
   explicit ExperimentalAgc(bool enabled) : enabled(enabled) {}
-  ExperimentalAgc(bool enabled,
-                  bool enabled_agc2_level_estimator,
-                  bool digital_adaptive_disabled)
-      : enabled(enabled),
-        enabled_agc2_level_estimator(enabled_agc2_level_estimator),
-        digital_adaptive_disabled(digital_adaptive_disabled) {}
-  // Deprecated constructor: will be removed.
-  ExperimentalAgc(bool enabled,
-                  bool enabled_agc2_level_estimator,
-                  bool digital_adaptive_disabled,
-                  bool analyze_before_aec)
-      : enabled(enabled),
-        enabled_agc2_level_estimator(enabled_agc2_level_estimator),
-        digital_adaptive_disabled(digital_adaptive_disabled) {}
   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)
-      : enabled(enabled),
-        startup_min_volume(startup_min_volume),
-        clipped_level_min(clipped_level_min) {}
   static const ConfigOptionID identifier = ConfigOptionID::kExperimentalAgc;
   bool enabled = true;
   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 digital_adaptive_disabled = false;
 };
 
@@ -331,7 +312,6 @@
         // Lowest analog microphone level that will be applied in response to
         // clipping.
         int clipped_level_min = kClippedLevelMin;
-        bool enable_agc2_level_estimator = false;
         bool enable_digital_adaptive = true;
       } analog_gain_controller;
     } gain_controller1;
diff --git a/modules/audio_processing/test/audio_processing_simulator.cc b/modules/audio_processing/test/audio_processing_simulator.cc
index 40ca7d1..1c8e0a5 100644
--- a/modules/audio_processing/test/audio_processing_simulator.cc
+++ b/modules/audio_processing/test/audio_processing_simulator.cc
@@ -497,11 +497,6 @@
     apm_config.gain_controller1.analog_gain_controller.enabled =
         *settings_.use_analog_agc;
   }
-  if (settings_.use_analog_agc_agc2_level_estimator) {
-    apm_config.gain_controller1.analog_gain_controller
-        .enable_agc2_level_estimator =
-        *settings_.use_analog_agc_agc2_level_estimator;
-  }
   if (settings_.analog_agc_disable_digital_adaptive) {
     apm_config.gain_controller1.analog_gain_controller.enable_digital_adaptive =
         *settings_.analog_agc_disable_digital_adaptive;
diff --git a/modules/audio_processing/test/audio_processing_simulator.h b/modules/audio_processing/test/audio_processing_simulator.h
index 63e644a..84f8ce4 100644
--- a/modules/audio_processing/test/audio_processing_simulator.h
+++ b/modules/audio_processing/test/audio_processing_simulator.h
@@ -106,7 +106,6 @@
   absl::optional<bool> use_vad;
   absl::optional<bool> use_le;
   absl::optional<bool> use_all;
-  absl::optional<bool> use_analog_agc_agc2_level_estimator;
   absl::optional<bool> analog_agc_disable_digital_adaptive;
   absl::optional<int> agc_mode;
   absl::optional<int> agc_target_level;
diff --git a/modules/audio_processing/test/audioproc_float_impl.cc b/modules/audio_processing/test/audioproc_float_impl.cc
index ab395f1..2002e2e 100644
--- a/modules/audio_processing/test/audioproc_float_impl.cc
+++ b/modules/audio_processing/test/audioproc_float_impl.cc
@@ -125,11 +125,6 @@
           "Force-deactivate (1) digital adaptation in "
           "experimental AGC. Digital adaptation is active by default (0).");
 ABSL_FLAG(int,
-          analog_agc_agc2_level_estimator,
-          kParameterNotSpecifiedValue,
-          "AGC2 level estimation"
-          " in the experimental AGC. AGC1 level estimation is the default (0)");
-ABSL_FLAG(int,
           agc_mode,
           kParameterNotSpecifiedValue,
           "Specify the AGC mode (0-2)");
@@ -387,8 +382,6 @@
   SetSettingIfFlagSet(absl::GetFlag(FLAGS_le), &settings.use_le);
   SetSettingIfFlagSet(absl::GetFlag(FLAGS_analog_agc_disable_digital_adaptive),
                       &settings.analog_agc_disable_digital_adaptive);
-  SetSettingIfFlagSet(absl::GetFlag(FLAGS_analog_agc_agc2_level_estimator),
-                      &settings.use_analog_agc_agc2_level_estimator);
   SetSettingIfSpecified(absl::GetFlag(FLAGS_agc_mode), &settings.agc_mode);
   SetSettingIfSpecified(absl::GetFlag(FLAGS_agc_target_level),
                         &settings.agc_target_level);