diff --git a/modules/audio_processing/aec3/echo_remover.cc b/modules/audio_processing/aec3/echo_remover.cc index d1a44a3d4c..717e9b0568 100644 --- a/modules/audio_processing/aec3/echo_remover.cc +++ b/modules/audio_processing/aec3/echo_remover.cc @@ -156,13 +156,13 @@ class EchoRemoverImpl final : public EchoRemover { bool echo_leakage_detected_ = false; AecState aec_state_; EchoRemoverMetrics metrics_; - std::vector> e_; std::vector> e_old_; std::vector> y_old_; size_t block_counter_ = 0; int gain_change_hangover_ = 0; bool main_filter_output_last_selected_ = true; + std::vector> e_heap_; std::vector> Y2_heap_; std::vector> E2_heap_; std::vector> R2_heap_; @@ -199,9 +199,9 @@ EchoRemoverImpl::EchoRemoverImpl(const EchoCanceller3Config& config, render_signal_analyzer_(config_), residual_echo_estimators_(num_capture_channels_), aec_state_(config_), - e_(num_capture_channels_), e_old_(num_capture_channels_), y_old_(num_capture_channels_), + e_heap_(NumChannelsOnHeap(num_capture_channels_)), Y2_heap_(NumChannelsOnHeap(num_capture_channels_)), E2_heap_(NumChannelsOnHeap(num_capture_channels_)), R2_heap_(NumChannelsOnHeap(num_capture_channels_)), @@ -212,6 +212,10 @@ EchoRemoverImpl::EchoRemoverImpl(const EchoCanceller3Config& config, high_band_comfort_noise_heap_(NumChannelsOnHeap(num_capture_channels_)), subtractor_output_heap_(NumChannelsOnHeap(num_capture_channels_)) { RTC_DCHECK(ValidFullBandRate(sample_rate_hz)); + for (auto& e_k : e_heap_) { + e_k.fill(0.f); + } + for (size_t ch = 0; ch < num_capture_channels_; ++ch) { residual_echo_estimators_[ch] = std::make_unique(config_); @@ -221,7 +225,6 @@ EchoRemoverImpl::EchoRemoverImpl(const EchoCanceller3Config& config, suppression_gains_[ch] = std::make_unique( config_, optimization_, sample_rate_hz); cngs_[ch] = std::make_unique(optimization_); - e_[ch].fill(0.f); e_old_[ch].fill(0.f); y_old_[ch].fill(0.f); } @@ -256,6 +259,7 @@ void EchoRemoverImpl::ProcessCapture( RTC_DCHECK_EQ((*y)[0][0].size(), kBlockSize); // Stack allocated data to use when the number of channels is low. + std::array, kMaxNumChannelsOnStack> e_stack; std::array, kMaxNumChannelsOnStack> Y2_stack; std::array, kMaxNumChannelsOnStack> @@ -270,6 +274,8 @@ void EchoRemoverImpl::ProcessCapture( std::array high_band_comfort_noise_stack; std::array subtractor_output_stack; + rtc::ArrayView> e(e_stack.data(), + num_capture_channels_); rtc::ArrayView> Y2( Y2_stack.data(), num_capture_channels_); rtc::ArrayView> E2( @@ -289,6 +295,8 @@ void EchoRemoverImpl::ProcessCapture( if (NumChannelsOnHeap(num_capture_channels_) > 0) { // If the stack-allocated space is too small, use the heap for storing the // microphone data. + e = rtc::ArrayView>(e_heap_.data(), + num_capture_channels_); Y2 = rtc::ArrayView>( Y2_heap_.data(), num_capture_channels_); E2 = rtc::ArrayView>( @@ -367,9 +375,9 @@ void EchoRemoverImpl::ProcessCapture( aec_state_, &subtractor_output[ch]); // Compute spectra. - FormLinearFilterOutput(subtractor_output[ch], e_[ch]); + FormLinearFilterOutput(subtractor_output[ch], e[ch]); WindowedPaddedFft(fft_, y_low, y_old_[ch], &Y[ch]); - WindowedPaddedFft(fft_, e_[ch], e_old_[ch], &E[ch]); + WindowedPaddedFft(fft_, e[ch], e_old_[ch], &E[ch]); LinearEchoPower(E[ch], Y[ch], &S2_linear[ch]); Y[ch].Spectrum(optimization_, Y2[ch]); E[ch].Spectrum(optimization_, E2[ch]); @@ -385,7 +393,7 @@ void EchoRemoverImpl::ProcessCapture( const auto& Y_fft = aec_state_.UseLinearFilterOutput() ? E : Y; data_dumper_->DumpWav("aec3_output_linear", kBlockSize, &y0[0], 16000, 1); - data_dumper_->DumpWav("aec3_output_linear2", kBlockSize, &e_[0][0], 16000, 1); + data_dumper_->DumpWav("aec3_output_linear2", kBlockSize, &e[0][0], 16000, 1); float high_bands_gain = 1.f; std::array G;