Redesign of the render buffering in AEC3

This CL centralizes the render buffering in AEC3 so that all render
buffers are updated and synchronized/aligned with the render alignment
buffer.

Bug: webrtc:8597, chromium:790905
Change-Id: I8a94e5c1f27316b6100b420eec9652ea31c1a91d
Reviewed-on: https://webrtc-review.googlesource.com/25680
Commit-Queue: Per Åhgren <peah@webrtc.org>
Reviewed-by: Gustaf Ullberg <gustaf@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20989}
diff --git a/modules/audio_processing/aec3/render_buffer.cc b/modules/audio_processing/aec3/render_buffer.cc
index fa86ea6..60b50ce 100644
--- a/modules/audio_processing/aec3/render_buffer.cc
+++ b/modules/audio_processing/aec3/render_buffer.cc
@@ -17,21 +17,18 @@
 
 namespace webrtc {
 
-RenderBuffer::RenderBuffer(Aec3Optimization optimization,
-                           size_t num_bands,
-                           size_t num_partitions,
-                           const std::vector<size_t> num_ffts_for_spectral_sums)
-    : optimization_(optimization),
-      fft_buffer_(num_partitions),
-      spectrum_buffer_(num_partitions, std::array<float, kFftLengthBy2Plus1>()),
-      spectral_sums_(num_ffts_for_spectral_sums.size(),
-                     std::array<float, kFftLengthBy2Plus1>()),
-      last_block_(num_bands, std::vector<float>(kBlockSize, 0.f)),
-      fft_() {
-  // Current implementation only allows a maximum of one spectral sum lengths.
-  RTC_DCHECK_EQ(1, num_ffts_for_spectral_sums.size());
-  spectral_sums_length_ = num_ffts_for_spectral_sums[0];
-  RTC_DCHECK_GE(fft_buffer_.size(), spectral_sums_length_);
+RenderBuffer::RenderBuffer(size_t num_ffts_for_spectral_sums,
+                           MatrixBuffer* block_buffer,
+                           VectorBuffer* spectrum_buffer,
+                           FftBuffer* fft_buffer)
+    : block_buffer_(block_buffer),
+      spectrum_buffer_(spectrum_buffer),
+      fft_buffer_(fft_buffer),
+      spectral_sums_length_(num_ffts_for_spectral_sums) {
+  RTC_DCHECK(block_buffer_);
+  RTC_DCHECK(spectrum_buffer_);
+  RTC_DCHECK(fft_buffer_);
+  RTC_DCHECK_GE(fft_buffer_->buffer.size(), spectral_sums_length_);
 
   Clear();
 }
@@ -39,56 +36,17 @@
 RenderBuffer::~RenderBuffer() = default;
 
 void RenderBuffer::Clear() {
-  position_ = 0;
-  for (auto& sum : spectral_sums_) {
-    sum.fill(0.f);
-  }
-
-  for (auto& spectrum : spectrum_buffer_) {
-    spectrum.fill(0.f);
-  }
-
-  for (auto& fft : fft_buffer_) {
-    fft.Clear();
-  }
-
-  for (auto& b : last_block_) {
-    std::fill(b.begin(), b.end(), 0.f);
-  }
+  spectral_sums_.fill(0.f);
 }
 
-void RenderBuffer::Insert(const std::vector<std::vector<float>>& block) {
-  // Compute the FFT of the data in the lowest band.
-  FftData X;
-  fft_.PaddedFft(block[0], last_block_[0], &X);
-
-  // Copy the last render frame.
-  RTC_DCHECK_EQ(last_block_.size(), block.size());
-  for (size_t k = 0; k < block.size(); ++k) {
-    RTC_DCHECK_EQ(last_block_[k].size(), block[k].size());
-    std::copy(block[k].begin(), block[k].end(), last_block_[k].begin());
-  }
-
-  // Insert X into the buffer.
-  position_ = position_ > 0 ? position_ - 1 : fft_buffer_.size() - 1;
-  fft_buffer_[position_].Assign(X);
-
-  // Compute and insert the spectrum for the FFT into the spectrum buffer.
-  X.Spectrum(optimization_, &spectrum_buffer_[position_]);
-
-  // Pre-compute and cache the spectral sums.
-  std::copy(spectrum_buffer_[position_].begin(),
-            spectrum_buffer_[position_].end(), spectral_sums_[0].begin());
-  size_t position = (position_ + 1) % fft_buffer_.size();
-  for (size_t j = 1; j < spectral_sums_length_; ++j) {
-    const std::array<float, kFftLengthBy2Plus1>& spectrum =
-        spectrum_buffer_[position];
-
-    for (size_t k = 0; k < spectral_sums_[0].size(); ++k) {
-      spectral_sums_[0][k] += spectrum[k];
+void RenderBuffer::UpdateSpectralSum() {
+  std::fill(spectral_sums_.begin(), spectral_sums_.end(), 0.f);
+  size_t position = spectrum_buffer_->read;
+  for (size_t j = 0; j < spectral_sums_length_; ++j) {
+    for (size_t k = 0; k < spectral_sums_.size(); ++k) {
+      spectral_sums_[k] += spectrum_buffer_->buffer[position][k];
     }
-
-    position = position < (fft_buffer_.size() - 1) ? position + 1 : 0;
+    position = spectrum_buffer_->IncIndex(position);
   }
 }