Reland "Reland "Add core multi-channel pipeline in AEC3 This CL adds basic the basic pipeline to support multi-channel processing in AEC3.""
This is a reland of a66395e72f9fc86873bf443579ec73c3d78af240
Original change's description:
> Reland "Add core multi-channel pipeline in AEC3 This CL adds basic the basic pipeline to support multi-channel processing in AEC3."
>
> This is a reland of f3a197e55323aee974a932c52dd19fa88e5d4e38
>
> Original change's description:
> > Add core multi-channel pipeline in AEC3
> > This CL adds basic the basic pipeline to support multi-channel
> > processing in AEC3.
> >
> > Apart from that, it removes the 8 kHz processing support in several
> > places of the AEC3 code.
> >
> > Bug: webrtc:10913
> > Change-Id: If5b75fa325ed0071deea94a7546cb4a7adf22137
> > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/150332
> > Commit-Queue: Per Åhgren <peah@webrtc.org>
> > Reviewed-by: Sam Zackrisson <saza@webrtc.org>
> > Cr-Commit-Position: refs/heads/master@{#29017}
>
> Bug: webrtc:10913
> Change-Id: Ifc4b13bd994cfd22dca8f8755fa5700617cc379d
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/151124
> Reviewed-by: Sam Zackrisson <saza@webrtc.org>
> Commit-Queue: Per Åhgren <peah@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#29034}
Bug: webrtc:10913
Change-Id: Id8da5666df8c86f290c73ad5dc9958199f1a7ebe
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/151127
Commit-Queue: Sam Zackrisson <saza@webrtc.org>
Reviewed-by: Sam Zackrisson <saza@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29042}
diff --git a/modules/audio_processing/aec3/render_delay_buffer.cc b/modules/audio_processing/aec3/render_delay_buffer.cc
index 11fe450..379f5a1 100644
--- a/modules/audio_processing/aec3/render_delay_buffer.cc
+++ b/modules/audio_processing/aec3/render_delay_buffer.cc
@@ -39,12 +39,15 @@
class RenderDelayBufferImpl final : public RenderDelayBuffer {
public:
- RenderDelayBufferImpl(const EchoCanceller3Config& config, int sample_rate_hz);
+ RenderDelayBufferImpl(const EchoCanceller3Config& config,
+ int sample_rate_hz,
+ size_t num_render_channels);
RenderDelayBufferImpl() = delete;
~RenderDelayBufferImpl() override;
void Reset() override;
- BufferingEvent Insert(const std::vector<std::vector<float>>& block) override;
+ BufferingEvent Insert(
+ const std::vector<std::vector<std::vector<float>>>& block) override;
BufferingEvent PrepareCaptureProcessing() override;
bool AlignFromDelay(size_t delay) override;
void AlignFromExternalDelay() override;
@@ -90,12 +93,11 @@
bool external_audio_buffer_delay_verified_after_reset_ = false;
size_t min_latency_blocks_ = 0;
size_t excess_render_detection_counter_ = 0;
- int sample_rate_hz_;
int MapDelayToTotalDelay(size_t delay) const;
int ComputeDelay() const;
void ApplyTotalDelay(int delay);
- void InsertBlock(const std::vector<std::vector<float>>& block,
+ void InsertBlock(const std::vector<std::vector<std::vector<float>>>& block,
int previous_write);
bool DetectActiveRender(rtc::ArrayView<const float> x) const;
bool DetectExcessRenderBlocks();
@@ -109,7 +111,8 @@
int RenderDelayBufferImpl::instance_count_ = 0;
RenderDelayBufferImpl::RenderDelayBufferImpl(const EchoCanceller3Config& config,
- int sample_rate_hz)
+ int sample_rate_hz,
+ size_t num_render_channels)
: data_dumper_(
new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
optimization_(DetectOptimization()),
@@ -122,6 +125,7 @@
config.delay.num_filters,
config.filter.main.length_blocks),
NumBandsForRate(sample_rate_hz),
+ num_render_channels,
kBlockSize),
spectra_(blocks_.buffer.size(), kFftLengthBy2Plus1),
ffts_(blocks_.buffer.size()),
@@ -132,9 +136,7 @@
render_decimator_(down_sampling_factor_),
fft_(),
render_ds_(sub_block_size_, 0.f),
- buffer_headroom_(config.filter.main.length_blocks),
- sample_rate_hz_(sample_rate_hz) {
- RTC_DCHECK_GE(sample_rate_hz, 8000);
+ buffer_headroom_(config.filter.main.length_blocks) {
RTC_DCHECK_EQ(blocks_.buffer.size(), ffts_.buffer.size());
RTC_DCHECK_EQ(spectra_.buffer.size(), ffts_.buffer.size());
@@ -184,7 +186,7 @@
// Inserts a new block into the render buffers.
RenderDelayBuffer::BufferingEvent RenderDelayBufferImpl::Insert(
- const std::vector<std::vector<float>>& block) {
+ const std::vector<std::vector<std::vector<float>>>& block) {
++render_call_counter_;
if (delay_) {
if (!last_call_was_render_) {
@@ -212,7 +214,7 @@
// Detect and update render activity.
if (!render_activity_) {
- render_activity_counter_ += DetectActiveRender(block[0]) ? 1 : 0;
+ render_activity_counter_ += DetectActiveRender(block[0][0]) ? 1 : 0;
render_activity_ = render_activity_counter_ >= 20;
}
@@ -315,8 +317,7 @@
}
// Convert delay from milliseconds to blocks (rounded down).
- external_audio_buffer_delay_ =
- delay_ms >> ((sample_rate_hz_ == 8000) ? 1 : 2);
+ external_audio_buffer_delay_ = delay_ms >> 2;
}
bool RenderDelayBufferImpl::HasReceivedBufferDelay() {
@@ -359,7 +360,7 @@
// Inserts a block into the render buffers.
void RenderDelayBufferImpl::InsertBlock(
- const std::vector<std::vector<float>>& block,
+ const std::vector<std::vector<std::vector<float>>>& block,
int previous_write) {
auto& b = blocks_;
auto& lr = low_rate_;
@@ -372,13 +373,14 @@
std::copy(block[k].begin(), block[k].end(), b.buffer[b.write][k].begin());
}
- data_dumper_->DumpWav("aec3_render_decimator_input", block[0].size(),
- block[0].data(), 16000, 1);
- render_decimator_.Decimate(block[0], ds);
+ data_dumper_->DumpWav("aec3_render_decimator_input", block[0][0].size(),
+ block[0][0].data(), 16000, 1);
+ render_decimator_.Decimate(block[0][0], ds);
data_dumper_->DumpWav("aec3_render_decimator_output", ds.size(), ds.data(),
16000 / down_sampling_factor_, 1);
std::copy(ds.rbegin(), ds.rend(), lr.buffer.begin() + lr.write);
- fft_.PaddedFft(block[0], b.buffer[previous_write][0], &f.buffer[f.write]);
+ fft_.PaddedFft(block[0][0], b.buffer[previous_write][0][0],
+ &f.buffer[f.write]);
f.buffer[f.write].Spectrum(optimization_, s.buffer[s.write]);
}
@@ -457,8 +459,9 @@
} // namespace
RenderDelayBuffer* RenderDelayBuffer::Create(const EchoCanceller3Config& config,
- int sample_rate_hz) {
- return new RenderDelayBufferImpl(config, sample_rate_hz);
+ int sample_rate_hz,
+ size_t num_render_channels) {
+ return new RenderDelayBufferImpl(config, sample_rate_hz, num_render_channels);
}
} // namespace webrtc