blob: d44abd9df47710fc9c8138e979d483f7893ea2da [file] [log] [blame]
peah522d71b2017-02-23 05:16:26 -08001/*
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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MODULES_AUDIO_PROCESSING_AEC3_RENDER_BUFFER_H_
12#define MODULES_AUDIO_PROCESSING_AEC3_RENDER_BUFFER_H_
peah522d71b2017-02-23 05:16:26 -080013
Yves Gerey988cc082018-10-23 12:03:01 +020014#include <stddef.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020015
Per Åhgren8ba58612017-12-01 23:01:44 +010016#include <array>
Yves Gerey988cc082018-10-23 12:03:01 +020017#include <vector>
peah522d71b2017-02-23 05:16:26 -080018
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "api/array_view.h"
Yves Gerey988cc082018-10-23 12:03:01 +020020#include "modules/audio_processing/aec3/aec3_common.h"
Sam Zackrissonf3f61592019-09-05 11:30:49 +020021#include "modules/audio_processing/aec3/block_buffer.h"
Per Åhgren8ba58612017-12-01 23:01:44 +010022#include "modules/audio_processing/aec3/fft_buffer.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "modules/audio_processing/aec3/fft_data.h"
Sam Zackrissonf3f61592019-09-05 11:30:49 +020024#include "modules/audio_processing/aec3/spectrum_buffer.h"
Yves Gerey988cc082018-10-23 12:03:01 +020025#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080026#include "rtc_base/constructor_magic.h"
peah522d71b2017-02-23 05:16:26 -080027
28namespace webrtc {
29
peahcf02cf12017-04-05 14:18:07 -070030// Provides a buffer of the render data for the echo remover.
31class RenderBuffer {
peah522d71b2017-02-23 05:16:26 -080032 public:
Sam Zackrissonf3f61592019-09-05 11:30:49 +020033 RenderBuffer(BlockBuffer* block_buffer,
34 SpectrumBuffer* spectrum_buffer,
Per Åhgren8ba58612017-12-01 23:01:44 +010035 FftBuffer* fft_buffer);
peahcf02cf12017-04-05 14:18:07 -070036 ~RenderBuffer();
peah522d71b2017-02-23 05:16:26 -080037
Per Åhgrenec22e3f2017-12-20 15:20:37 +010038 // Get a block.
Per Åhgrence202a02019-09-02 17:01:19 +020039 const std::vector<std::vector<std::vector<float>>>& Block(
40 int buffer_offset_blocks) const {
Per Åhgrenec22e3f2017-12-20 15:20:37 +010041 int position =
42 block_buffer_->OffsetIndex(block_buffer_->read, buffer_offset_blocks);
43 return block_buffer_->buffer[position];
peahcf02cf12017-04-05 14:18:07 -070044 }
peah522d71b2017-02-23 05:16:26 -080045
Per Åhgren8ba58612017-12-01 23:01:44 +010046 // Get the spectrum from one of the FFTs in the buffer.
Sam Zackrissona81c09d2019-09-05 09:35:10 +020047 rtc::ArrayView<const float> Spectrum(int buffer_offset_ffts,
48 size_t channel) const {
Per Åhgrenec22e3f2017-12-20 15:20:37 +010049 int position = spectrum_buffer_->OffsetIndex(spectrum_buffer_->read,
50 buffer_offset_ffts);
Sam Zackrissona81c09d2019-09-05 09:35:10 +020051 return spectrum_buffer_->buffer[position][channel];
peah522d71b2017-02-23 05:16:26 -080052 }
53
Per Åhgrenec22e3f2017-12-20 15:20:37 +010054 // Returns the circular fft buffer.
Sam Zackrissoncfb94972019-09-05 15:03:07 +020055 rtc::ArrayView<const std::vector<FftData>> GetFftBuffer() const {
Per Åhgrenec22e3f2017-12-20 15:20:37 +010056 return fft_buffer_->buffer;
peah522d71b2017-02-23 05:16:26 -080057 }
58
Per Åhgren8ba58612017-12-01 23:01:44 +010059 // Returns the current position in the circular buffer.
Per Åhgrenec22e3f2017-12-20 15:20:37 +010060 size_t Position() const {
61 RTC_DCHECK_EQ(spectrum_buffer_->read, fft_buffer_->read);
62 RTC_DCHECK_EQ(spectrum_buffer_->write, fft_buffer_->write);
63 return fft_buffer_->read;
64 }
65
66 // Returns the sum of the spectrums for a certain number of FFTs.
67 void SpectralSum(size_t num_spectra,
68 std::array<float, kFftLengthBy2Plus1>* X2) const;
peah522d71b2017-02-23 05:16:26 -080069
Per Åhgrenee8ad5f2018-08-10 21:15:48 +020070 // Returns the sums of the spectrums for two numbers of FFTs.
71 void SpectralSums(size_t num_spectra_shorter,
72 size_t num_spectra_longer,
73 std::array<float, kFftLengthBy2Plus1>* X2_shorter,
74 std::array<float, kFftLengthBy2Plus1>* X2_longer) const;
75
Per Åhgrenb6b00dc2018-02-20 22:18:27 +010076 // Gets the recent activity seen in the render signal.
77 bool GetRenderActivity() const { return render_activity_; }
78
79 // Specifies the recent activity seen in the render signal.
80 void SetRenderActivity(bool activity) { render_activity_ = activity; }
81
Jesús de Vicente Peñad5cb4772018-04-25 13:58:45 +020082 // Returns the headroom between the write and the read positions in the
Jesús de Vicente Peña95581922018-04-30 08:37:57 +020083 // buffer.
Jesús de Vicente Peñad5cb4772018-04-25 13:58:45 +020084 int Headroom() const {
85 // The write and read indices are decreased over time.
86 int headroom =
87 fft_buffer_->write < fft_buffer_->read
88 ? fft_buffer_->read - fft_buffer_->write
89 : fft_buffer_->size - fft_buffer_->write + fft_buffer_->read;
90
91 RTC_DCHECK_LE(0, headroom);
92 RTC_DCHECK_GE(fft_buffer_->size, headroom);
93
94 return headroom;
95 }
96
Jesús de Vicente Peña95581922018-04-30 08:37:57 +020097 // Returns a reference to the spectrum buffer.
Sam Zackrissonf3f61592019-09-05 11:30:49 +020098 const SpectrumBuffer& GetSpectrumBuffer() const { return *spectrum_buffer_; }
Jesús de Vicente Peña95581922018-04-30 08:37:57 +020099
Jesús de Vicente Peña2f2633d2018-05-02 09:47:22 +0200100 // Returns a reference to the block buffer.
Sam Zackrissonf3f61592019-09-05 11:30:49 +0200101 const BlockBuffer& GetBlockBuffer() const { return *block_buffer_; }
Jesús de Vicente Peña2f2633d2018-05-02 09:47:22 +0200102
peah522d71b2017-02-23 05:16:26 -0800103 private:
Sam Zackrissonf3f61592019-09-05 11:30:49 +0200104 const BlockBuffer* const block_buffer_;
105 const SpectrumBuffer* const spectrum_buffer_;
Per Åhgren8ba58612017-12-01 23:01:44 +0100106 const FftBuffer* const fft_buffer_;
Per Åhgrenb6b00dc2018-02-20 22:18:27 +0100107 bool render_activity_ = false;
peahcf02cf12017-04-05 14:18:07 -0700108 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RenderBuffer);
peah522d71b2017-02-23 05:16:26 -0800109};
110
111} // namespace webrtc
112
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200113#endif // MODULES_AUDIO_PROCESSING_AEC3_RENDER_BUFFER_H_