tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

render_buffer.cc (2978B)


      1 /*
      2 *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
      3 *
      4 *  Use of this source code is governed by a BSD-style license
      5 *  that can be found in the LICENSE file in the root of the source
      6 *  tree. An additional intellectual property rights grant can be found
      7 *  in the file PATENTS.  All contributing project authors may
      8 *  be found in the AUTHORS file in the root of the source tree.
      9 */
     10 
     11 #include "modules/audio_processing/aec3/render_buffer.h"
     12 
     13 #include <algorithm>
     14 #include <array>
     15 #include <cstddef>
     16 
     17 #include "modules/audio_processing/aec3/aec3_common.h"
     18 #include "modules/audio_processing/aec3/block_buffer.h"
     19 #include "modules/audio_processing/aec3/fft_buffer.h"
     20 #include "modules/audio_processing/aec3/spectrum_buffer.h"
     21 #include "rtc_base/checks.h"
     22 
     23 namespace webrtc {
     24 
     25 RenderBuffer::RenderBuffer(BlockBuffer* block_buffer,
     26                           SpectrumBuffer* spectrum_buffer,
     27                           FftBuffer* fft_buffer)
     28    : block_buffer_(block_buffer),
     29      spectrum_buffer_(spectrum_buffer),
     30      fft_buffer_(fft_buffer) {
     31  RTC_DCHECK(block_buffer_);
     32  RTC_DCHECK(spectrum_buffer_);
     33  RTC_DCHECK(fft_buffer_);
     34  RTC_DCHECK_EQ(block_buffer_->buffer.size(), fft_buffer_->buffer.size());
     35  RTC_DCHECK_EQ(spectrum_buffer_->buffer.size(), fft_buffer_->buffer.size());
     36  RTC_DCHECK_EQ(spectrum_buffer_->read, fft_buffer_->read);
     37  RTC_DCHECK_EQ(spectrum_buffer_->write, fft_buffer_->write);
     38 }
     39 
     40 RenderBuffer::~RenderBuffer() = default;
     41 
     42 void RenderBuffer::SpectralSum(
     43    size_t num_spectra,
     44    std::array<float, kFftLengthBy2Plus1>* X2) const {
     45  X2->fill(0.f);
     46  int position = spectrum_buffer_->read;
     47  for (size_t j = 0; j < num_spectra; ++j) {
     48    for (const auto& channel_spectrum : spectrum_buffer_->buffer[position]) {
     49      for (size_t k = 0; k < X2->size(); ++k) {
     50        (*X2)[k] += channel_spectrum[k];
     51      }
     52    }
     53    position = spectrum_buffer_->IncIndex(position);
     54  }
     55 }
     56 
     57 void RenderBuffer::SpectralSums(
     58    size_t num_spectra_shorter,
     59    size_t num_spectra_longer,
     60    std::array<float, kFftLengthBy2Plus1>* X2_shorter,
     61    std::array<float, kFftLengthBy2Plus1>* X2_longer) const {
     62  RTC_DCHECK_LE(num_spectra_shorter, num_spectra_longer);
     63  X2_shorter->fill(0.f);
     64  int position = spectrum_buffer_->read;
     65  size_t j = 0;
     66  for (; j < num_spectra_shorter; ++j) {
     67    for (const auto& channel_spectrum : spectrum_buffer_->buffer[position]) {
     68      for (size_t k = 0; k < X2_shorter->size(); ++k) {
     69        (*X2_shorter)[k] += channel_spectrum[k];
     70      }
     71    }
     72    position = spectrum_buffer_->IncIndex(position);
     73  }
     74  std::copy(X2_shorter->begin(), X2_shorter->end(), X2_longer->begin());
     75  for (; j < num_spectra_longer; ++j) {
     76    for (const auto& channel_spectrum : spectrum_buffer_->buffer[position]) {
     77      for (size_t k = 0; k < X2_longer->size(); ++k) {
     78        (*X2_longer)[k] += channel_spectrum[k];
     79      }
     80    }
     81    position = spectrum_buffer_->IncIndex(position);
     82  }
     83 }
     84 
     85 }  // namespace webrtc