AEC3: Remove redundant class

This CL removes the redundant class in preparation
for adding multichannel functionality to the
reverb computation.

The changes are bitexact.

Bug: webrtc:10913
Change-Id: I284665f7143cb5e1c79bfa573638fdff5f2411c9
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/155960
Commit-Queue: Per Åhgren <peah@webrtc.org>
Reviewed-by: Sam Zackrisson <saza@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29414}
diff --git a/modules/audio_processing/aec3/BUILD.gn b/modules/audio_processing/aec3/BUILD.gn
index 6baf3a1..a9026f8 100644
--- a/modules/audio_processing/aec3/BUILD.gn
+++ b/modules/audio_processing/aec3/BUILD.gn
@@ -84,8 +84,6 @@
     "render_delay_controller.h",
     "render_delay_controller_metrics.cc",
     "render_delay_controller_metrics.h",
-    "render_reverb_model.cc",
-    "render_reverb_model.h",
     "render_signal_analyzer.cc",
     "render_signal_analyzer.h",
     "residual_echo_estimator.cc",
diff --git a/modules/audio_processing/aec3/aec_state.cc b/modules/audio_processing/aec3/aec_state.cc
index f0e183a..bd6710a 100644
--- a/modules/audio_processing/aec3/aec_state.cc
+++ b/modules/audio_processing/aec3/aec_state.cc
@@ -29,6 +29,56 @@
 constexpr size_t kBlocksSinceConvergencedFilterInit = 10000;
 constexpr size_t kBlocksSinceConsistentEstimateInit = 10000;
 
+void UpdateAndComputeReverb(
+    const SpectrumBuffer& spectrum_buffer,
+    int delay_blocks,
+    float reverb_decay,
+    ReverbModel* reverb_model,
+    rtc::ArrayView<float, kFftLengthBy2Plus1> reverb_power_spectrum) {
+  RTC_DCHECK(reverb_model);
+  const size_t num_render_channels = spectrum_buffer.buffer[0].size();
+  int idx_at_delay =
+      spectrum_buffer.OffsetIndex(spectrum_buffer.read, delay_blocks);
+  int idx_past = spectrum_buffer.IncIndex(idx_at_delay);
+
+  std::array<float, kFftLengthBy2Plus1> X2_data;
+  rtc::ArrayView<const float> X2;
+  if (num_render_channels > 1) {
+    auto sum_channels =
+        [](size_t num_render_channels,
+           const std::vector<std::vector<float>>& spectrum_band_0,
+           rtc::ArrayView<float, kFftLengthBy2Plus1> render_power) {
+          std::fill(render_power.begin(), render_power.end(), 0.f);
+          for (size_t ch = 0; ch < num_render_channels; ++ch) {
+            RTC_DCHECK_EQ(spectrum_band_0[ch].size(), kFftLengthBy2Plus1);
+            for (size_t k = 0; k < kFftLengthBy2Plus1; ++k) {
+              render_power[k] += spectrum_band_0[ch][k];
+            }
+          }
+        };
+    sum_channels(num_render_channels, spectrum_buffer.buffer[idx_past],
+                 X2_data);
+    reverb_model->UpdateReverbNoFreqShaping(
+        X2_data, /*power_spectrum_scaling=*/1.0f, reverb_decay);
+
+    sum_channels(num_render_channels, spectrum_buffer.buffer[idx_at_delay],
+                 X2_data);
+    X2 = X2_data;
+  } else {
+    reverb_model->UpdateReverbNoFreqShaping(
+        spectrum_buffer.buffer[idx_past][/*channel=*/0],
+        /*power_spectrum_scaling=*/1.0f, reverb_decay);
+
+    X2 = spectrum_buffer.buffer[idx_at_delay][/*channel=*/0];
+  }
+
+  rtc::ArrayView<const float, kFftLengthBy2Plus1> reverb_power =
+      reverb_model->reverb();
+  for (size_t k = 0; k < X2.size(); ++k) {
+    reverb_power_spectrum[k] = X2[k] + reverb_power[k];
+  }
+}
+
 }  // namespace
 
 int AecState::instance_count_ = 0;
@@ -171,14 +221,14 @@
       active_render && !SaturatedCapture() ? 1 : 0;
 
   std::array<float, kFftLengthBy2Plus1> X2_reverb;
-  render_reverb_.Apply(render_buffer.GetSpectrumBuffer(),
-                       delay_state_.DirectPathFilterDelay(), ReverbDecay(),
-                       X2_reverb);
+
+  UpdateAndComputeReverb(render_buffer.GetSpectrumBuffer(),
+                         delay_state_.DirectPathFilterDelay(), ReverbDecay(),
+                         &reverb_model_, X2_reverb);
 
   if (config_.echo_audibility.use_stationarity_properties) {
     // Update the echo audibility evaluator.
-    echo_audibility_.Update(render_buffer,
-                            render_reverb_.GetReverbContributionPowerSpectrum(),
+    echo_audibility_.Update(render_buffer, reverb_model_.reverb(),
                             delay_state_.DirectPathFilterDelay(),
                             delay_state_.ExternalDelayReported());
   }
diff --git a/modules/audio_processing/aec3/aec_state.h b/modules/audio_processing/aec3/aec_state.h
index 500822d..69cdafd 100644
--- a/modules/audio_processing/aec3/aec_state.h
+++ b/modules/audio_processing/aec3/aec_state.h
@@ -28,7 +28,6 @@
 #include "modules/audio_processing/aec3/erle_estimator.h"
 #include "modules/audio_processing/aec3/filter_analyzer.h"
 #include "modules/audio_processing/aec3/render_buffer.h"
-#include "modules/audio_processing/aec3/render_reverb_model.h"
 #include "modules/audio_processing/aec3/reverb_model_estimator.h"
 #include "modules/audio_processing/aec3/subtractor_output.h"
 #include "modules/audio_processing/aec3/subtractor_output_analyzer.h"
@@ -294,7 +293,7 @@
   absl::optional<DelayEstimate> external_delay_;
   EchoAudibility echo_audibility_;
   ReverbModelEstimator reverb_model_estimator_;
-  RenderReverbModel render_reverb_;
+  ReverbModel reverb_model_;
   std::vector<SubtractorOutputAnalyzer> subtractor_output_analyzers_;
 };
 
diff --git a/modules/audio_processing/aec3/render_reverb_model.cc b/modules/audio_processing/aec3/render_reverb_model.cc
deleted file mode 100644
index 0410a9a..0000000
--- a/modules/audio_processing/aec3/render_reverb_model.cc
+++ /dev/null
@@ -1,49 +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/aec3/render_reverb_model.h"
-
-#include <algorithm>
-
-#include "api/array_view.h"
-#include "rtc_base/checks.h"
-
-namespace webrtc {
-
-RenderReverbModel::RenderReverbModel() {
-  Reset();
-}
-
-RenderReverbModel::~RenderReverbModel() = default;
-
-void RenderReverbModel::Reset() {
-  render_reverb_.Reset();
-}
-
-void RenderReverbModel::Apply(const SpectrumBuffer& spectrum_buffer,
-                              int delay_blocks,
-                              float reverb_decay,
-                              rtc::ArrayView<float> reverb_power_spectrum) {
-  int idx_at_delay =
-      spectrum_buffer.OffsetIndex(spectrum_buffer.read, delay_blocks);
-  int idx_past = spectrum_buffer.IncIndex(idx_at_delay);
-  const auto& X2 = spectrum_buffer.buffer[idx_at_delay][/*channel=*/0];
-  RTC_DCHECK_EQ(X2.size(), reverb_power_spectrum.size());
-  render_reverb_.UpdateReverbNoFreqShaping(
-      spectrum_buffer.buffer[idx_past][/*channel=*/0], 1.0f, reverb_decay);
-
-  rtc::ArrayView<const float, kFftLengthBy2Plus1> reverb_power =
-      render_reverb_.reverb();
-  for (size_t k = 0; k < X2.size(); ++k) {
-    reverb_power_spectrum[k] = X2[k] + reverb_power[k];
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/render_reverb_model.h b/modules/audio_processing/aec3/render_reverb_model.h
deleted file mode 100644
index 8859a90..0000000
--- a/modules/audio_processing/aec3/render_reverb_model.h
+++ /dev/null
@@ -1,49 +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_AEC3_RENDER_REVERB_MODEL_H_
-#define MODULES_AUDIO_PROCESSING_AEC3_RENDER_REVERB_MODEL_H_
-
-#include "api/array_view.h"
-#include "modules/audio_processing/aec3/reverb_model.h"
-#include "modules/audio_processing/aec3/spectrum_buffer.h"
-
-namespace webrtc {
-
-// The RenderReverbModel class applies an exponential reverberant model over the
-// render spectrum.
-class RenderReverbModel {
- public:
-  RenderReverbModel();
-  ~RenderReverbModel();
-
-  // Resets the state.
-  void Reset();
-
-  // Applies the reverberation model over the render spectrum. It also returns
-  // the reverberation render power spectrum in the array reverb_power_spectrum.
-  void Apply(const SpectrumBuffer& spectrum_buffer,
-             int delay_blocks,
-             float reverb_decay,
-             rtc::ArrayView<float> reverb_power_spectrum);
-
-  // Gets the reverberation spectrum that was added to the render spectrum for
-  // computing the reverberation render spectrum.
-  rtc::ArrayView<const float> GetReverbContributionPowerSpectrum() const {
-    return render_reverb_.reverb();
-  }
-
- private:
-  ReverbModel render_reverb_;
-};
-
-}  // namespace webrtc.
-
-#endif  // MODULES_AUDIO_PROCESSING_AEC3_RENDER_REVERB_MODEL_H_