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}
This commit is contained in:
@ -53,10 +53,10 @@ TEST(RenderDelayController, NoRenderSignal) {
|
||||
for (auto down_sampling_factor : kDownSamplingFactors) {
|
||||
config.delay.down_sampling_factor = down_sampling_factor;
|
||||
config.delay.num_filters = num_matched_filters;
|
||||
for (auto rate : {8000, 16000, 32000, 48000}) {
|
||||
for (auto rate : {16000, 32000, 48000}) {
|
||||
SCOPED_TRACE(ProduceDebugText(rate));
|
||||
std::unique_ptr<RenderDelayBuffer> delay_buffer(
|
||||
RenderDelayBuffer::Create(config, rate));
|
||||
RenderDelayBuffer::Create(config, rate, 1));
|
||||
std::unique_ptr<RenderDelayController> delay_controller(
|
||||
RenderDelayController::Create(config, rate));
|
||||
for (size_t k = 0; k < 100; ++k) {
|
||||
@ -72,6 +72,7 @@ TEST(RenderDelayController, NoRenderSignal) {
|
||||
|
||||
// Verifies the basic API call sequence.
|
||||
TEST(RenderDelayController, BasicApiCalls) {
|
||||
constexpr size_t kNumChannels = 1;
|
||||
std::vector<float> capture_block(kBlockSize, 0.f);
|
||||
absl::optional<DelayEstimate> delay_blocks;
|
||||
for (size_t num_matched_filters = 4; num_matched_filters == 10;
|
||||
@ -80,11 +81,13 @@ TEST(RenderDelayController, BasicApiCalls) {
|
||||
EchoCanceller3Config config;
|
||||
config.delay.down_sampling_factor = down_sampling_factor;
|
||||
config.delay.num_filters = num_matched_filters;
|
||||
for (auto rate : {8000, 16000, 32000, 48000}) {
|
||||
std::vector<std::vector<float>> render_block(
|
||||
NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f));
|
||||
for (auto rate : {16000, 32000, 48000}) {
|
||||
std::vector<std::vector<std::vector<float>>> render_block(
|
||||
NumBandsForRate(rate),
|
||||
std::vector<std::vector<float>>(
|
||||
kNumChannels, std::vector<float>(kBlockSize, 0.f)));
|
||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||
RenderDelayBuffer::Create(config, rate));
|
||||
RenderDelayBuffer::Create(config, rate, kNumChannels));
|
||||
std::unique_ptr<RenderDelayController> delay_controller(
|
||||
RenderDelayController::Create(EchoCanceller3Config(), rate));
|
||||
for (size_t k = 0; k < 10; ++k) {
|
||||
@ -114,35 +117,45 @@ TEST(RenderDelayController, Alignment) {
|
||||
config.delay.down_sampling_factor = down_sampling_factor;
|
||||
config.delay.num_filters = num_matched_filters;
|
||||
|
||||
for (auto rate : {8000, 16000, 32000, 48000}) {
|
||||
std::vector<std::vector<float>> render_block(
|
||||
NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f));
|
||||
for (size_t num_render_channels : {1, 2}) {
|
||||
for (auto rate : {16000, 32000, 48000}) {
|
||||
std::vector<std::vector<std::vector<float>>> render_block(
|
||||
NumBandsForRate(rate),
|
||||
std::vector<std::vector<float>>(
|
||||
num_render_channels, std::vector<float>(kBlockSize, 0.f)));
|
||||
|
||||
for (size_t delay_samples : {15, 50, 150, 200, 800, 4000}) {
|
||||
absl::optional<DelayEstimate> delay_blocks;
|
||||
SCOPED_TRACE(ProduceDebugText(rate, delay_samples));
|
||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||
RenderDelayBuffer::Create(config, rate));
|
||||
std::unique_ptr<RenderDelayController> delay_controller(
|
||||
RenderDelayController::Create(config, rate));
|
||||
DelayBuffer<float> signal_delay_buffer(delay_samples);
|
||||
for (size_t k = 0; k < (400 + delay_samples / kBlockSize); ++k) {
|
||||
RandomizeSampleVector(&random_generator, render_block[0]);
|
||||
signal_delay_buffer.Delay(render_block[0], capture_block);
|
||||
render_delay_buffer->Insert(render_block);
|
||||
render_delay_buffer->PrepareCaptureProcessing();
|
||||
delay_blocks = delay_controller->GetDelay(
|
||||
render_delay_buffer->GetDownsampledRenderBuffer(),
|
||||
render_delay_buffer->Delay(), capture_block);
|
||||
for (size_t delay_samples : {15, 50, 150, 200, 800, 4000}) {
|
||||
absl::optional<DelayEstimate> delay_blocks;
|
||||
SCOPED_TRACE(ProduceDebugText(rate, delay_samples));
|
||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||
RenderDelayBuffer::Create(config, rate, num_render_channels));
|
||||
std::unique_ptr<RenderDelayController> delay_controller(
|
||||
RenderDelayController::Create(config, rate));
|
||||
DelayBuffer<float> signal_delay_buffer(delay_samples);
|
||||
for (size_t k = 0; k < (400 + delay_samples / kBlockSize); ++k) {
|
||||
for (size_t band = 0; band < render_block.size(); ++band) {
|
||||
for (size_t channel = 0; channel < render_block[band].size();
|
||||
++channel) {
|
||||
RandomizeSampleVector(&random_generator,
|
||||
render_block[band][channel]);
|
||||
}
|
||||
}
|
||||
signal_delay_buffer.Delay(render_block[0][0], capture_block);
|
||||
render_delay_buffer->Insert(render_block);
|
||||
render_delay_buffer->PrepareCaptureProcessing();
|
||||
delay_blocks = delay_controller->GetDelay(
|
||||
render_delay_buffer->GetDownsampledRenderBuffer(),
|
||||
render_delay_buffer->Delay(), capture_block);
|
||||
}
|
||||
ASSERT_TRUE(!!delay_blocks);
|
||||
|
||||
constexpr int kDelayHeadroomBlocks = 1;
|
||||
size_t expected_delay_blocks =
|
||||
std::max(0, static_cast<int>(delay_samples / kBlockSize) -
|
||||
kDelayHeadroomBlocks);
|
||||
|
||||
EXPECT_EQ(expected_delay_blocks, delay_blocks->delay);
|
||||
}
|
||||
ASSERT_TRUE(!!delay_blocks);
|
||||
|
||||
constexpr int kDelayHeadroomBlocks = 1;
|
||||
size_t expected_delay_blocks =
|
||||
std::max(0, static_cast<int>(delay_samples / kBlockSize) -
|
||||
kDelayHeadroomBlocks);
|
||||
|
||||
EXPECT_EQ(expected_delay_blocks, delay_blocks->delay);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -153,35 +166,41 @@ TEST(RenderDelayController, Alignment) {
|
||||
// delays.
|
||||
TEST(RenderDelayController, NonCausalAlignment) {
|
||||
Random random_generator(42U);
|
||||
constexpr size_t kNumRenderChannels = 1;
|
||||
constexpr size_t kNumCaptureChannels = 1;
|
||||
for (size_t num_matched_filters = 4; num_matched_filters == 10;
|
||||
num_matched_filters++) {
|
||||
for (auto down_sampling_factor : kDownSamplingFactors) {
|
||||
EchoCanceller3Config config;
|
||||
config.delay.down_sampling_factor = down_sampling_factor;
|
||||
config.delay.num_filters = num_matched_filters;
|
||||
for (auto rate : {8000, 16000, 32000, 48000}) {
|
||||
std::vector<std::vector<float>> render_block(
|
||||
NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f));
|
||||
std::vector<std::vector<float>> capture_block(
|
||||
NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f));
|
||||
for (auto rate : {16000, 32000, 48000}) {
|
||||
std::vector<std::vector<std::vector<float>>> render_block(
|
||||
NumBandsForRate(rate),
|
||||
std::vector<std::vector<float>>(
|
||||
kNumRenderChannels, std::vector<float>(kBlockSize, 0.f)));
|
||||
std::vector<std::vector<std::vector<float>>> capture_block(
|
||||
NumBandsForRate(rate),
|
||||
std::vector<std::vector<float>>(
|
||||
kNumCaptureChannels, std::vector<float>(kBlockSize, 0.f)));
|
||||
|
||||
for (int delay_samples : {-15, -50, -150, -200}) {
|
||||
absl::optional<DelayEstimate> delay_blocks;
|
||||
SCOPED_TRACE(ProduceDebugText(rate, -delay_samples));
|
||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||
RenderDelayBuffer::Create(config, rate));
|
||||
RenderDelayBuffer::Create(config, rate, kNumRenderChannels));
|
||||
std::unique_ptr<RenderDelayController> delay_controller(
|
||||
RenderDelayController::Create(EchoCanceller3Config(), rate));
|
||||
DelayBuffer<float> signal_delay_buffer(-delay_samples);
|
||||
for (int k = 0;
|
||||
k < (400 - delay_samples / static_cast<int>(kBlockSize)); ++k) {
|
||||
RandomizeSampleVector(&random_generator, capture_block[0]);
|
||||
signal_delay_buffer.Delay(capture_block[0], render_block[0]);
|
||||
RandomizeSampleVector(&random_generator, capture_block[0][0]);
|
||||
signal_delay_buffer.Delay(capture_block[0][0], render_block[0][0]);
|
||||
render_delay_buffer->Insert(render_block);
|
||||
render_delay_buffer->PrepareCaptureProcessing();
|
||||
delay_blocks = delay_controller->GetDelay(
|
||||
render_delay_buffer->GetDownsampledRenderBuffer(),
|
||||
render_delay_buffer->Delay(), capture_block[0]);
|
||||
render_delay_buffer->Delay(), capture_block[0][0]);
|
||||
}
|
||||
|
||||
ASSERT_FALSE(delay_blocks);
|
||||
@ -195,6 +214,7 @@ TEST(RenderDelayController, NonCausalAlignment) {
|
||||
// simple timeshifts between the signals when there is jitter in the API calls.
|
||||
TEST(RenderDelayController, AlignmentWithJitter) {
|
||||
Random random_generator(42U);
|
||||
constexpr size_t kNumRenderChannels = 1;
|
||||
std::vector<float> capture_block(kBlockSize, 0.f);
|
||||
for (size_t num_matched_filters = 4; num_matched_filters == 10;
|
||||
num_matched_filters++) {
|
||||
@ -202,14 +222,16 @@ TEST(RenderDelayController, AlignmentWithJitter) {
|
||||
EchoCanceller3Config config;
|
||||
config.delay.down_sampling_factor = down_sampling_factor;
|
||||
config.delay.num_filters = num_matched_filters;
|
||||
for (auto rate : {8000, 16000, 32000, 48000}) {
|
||||
std::vector<std::vector<float>> render_block(
|
||||
NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f));
|
||||
for (auto rate : {16000, 32000, 48000}) {
|
||||
std::vector<std::vector<std::vector<float>>> render_block(
|
||||
NumBandsForRate(rate),
|
||||
std::vector<std::vector<float>>(
|
||||
kNumRenderChannels, std::vector<float>(kBlockSize, 0.f)));
|
||||
for (size_t delay_samples : {15, 50, 300, 800}) {
|
||||
absl::optional<DelayEstimate> delay_blocks;
|
||||
SCOPED_TRACE(ProduceDebugText(rate, delay_samples));
|
||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||
RenderDelayBuffer::Create(config, rate));
|
||||
RenderDelayBuffer::Create(config, rate, kNumRenderChannels));
|
||||
std::unique_ptr<RenderDelayController> delay_controller(
|
||||
RenderDelayController::Create(config, rate));
|
||||
DelayBuffer<float> signal_delay_buffer(delay_samples);
|
||||
@ -220,8 +242,8 @@ TEST(RenderDelayController, AlignmentWithJitter) {
|
||||
++j) {
|
||||
std::vector<std::vector<float>> capture_block_buffer;
|
||||
for (size_t k = 0; k < (kMaxTestJitterBlocks - 1); ++k) {
|
||||
RandomizeSampleVector(&random_generator, render_block[0]);
|
||||
signal_delay_buffer.Delay(render_block[0], capture_block);
|
||||
RandomizeSampleVector(&random_generator, render_block[0][0]);
|
||||
signal_delay_buffer.Delay(render_block[0][0], capture_block);
|
||||
capture_block_buffer.push_back(capture_block);
|
||||
render_delay_buffer->Insert(render_block);
|
||||
}
|
||||
@ -259,10 +281,10 @@ TEST(RenderDelayController, InitialHeadroom) {
|
||||
EchoCanceller3Config config;
|
||||
config.delay.down_sampling_factor = down_sampling_factor;
|
||||
config.delay.num_filters = num_matched_filters;
|
||||
for (auto rate : {8000, 16000, 32000, 48000}) {
|
||||
for (auto rate : {16000, 32000, 48000}) {
|
||||
SCOPED_TRACE(ProduceDebugText(rate));
|
||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||
RenderDelayBuffer::Create(config, rate));
|
||||
RenderDelayBuffer::Create(config, rate, 1));
|
||||
|
||||
std::unique_ptr<RenderDelayController> delay_controller(
|
||||
RenderDelayController::Create(config, rate));
|
||||
@ -277,10 +299,10 @@ TEST(RenderDelayController, InitialHeadroom) {
|
||||
TEST(RenderDelayController, WrongCaptureSize) {
|
||||
std::vector<float> block(kBlockSize - 1, 0.f);
|
||||
EchoCanceller3Config config;
|
||||
for (auto rate : {8000, 16000, 32000, 48000}) {
|
||||
for (auto rate : {16000, 32000, 48000}) {
|
||||
SCOPED_TRACE(ProduceDebugText(rate));
|
||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||
RenderDelayBuffer::Create(config, rate));
|
||||
RenderDelayBuffer::Create(config, rate, 1));
|
||||
EXPECT_DEATH(
|
||||
std::unique_ptr<RenderDelayController>(
|
||||
RenderDelayController::Create(EchoCanceller3Config(), rate))
|
||||
@ -298,7 +320,7 @@ TEST(RenderDelayController, DISABLED_WrongSampleRate) {
|
||||
SCOPED_TRACE(ProduceDebugText(rate));
|
||||
EchoCanceller3Config config;
|
||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||
RenderDelayBuffer::Create(config, rate));
|
||||
RenderDelayBuffer::Create(config, rate, 1));
|
||||
EXPECT_DEATH(
|
||||
std::unique_ptr<RenderDelayController>(
|
||||
RenderDelayController::Create(EchoCanceller3Config(), rate)),
|
||||
|
||||
Reference in New Issue
Block a user