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);
}
}