Remove the ability for EchoRemover to override the render vs capture alignment

This change removes the (unused) ability of EchoRemover overriding
the delay of the RenderDelayController. The change is tested for
bit-exactness.

Bug: webrtc:8671
Change-Id: I188ef740f1437de64ffe236d07a7dcd4128192c2
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/130518
Commit-Queue: Gustaf Ullberg <gustaf@webrtc.org>
Reviewed-by: Per Åhgren <peah@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27414}
This commit is contained in:
Gustaf Ullberg 2019-04-02 14:00:46 +02:00 committed by Commit Bot
parent f537da6c19
commit 1107cab646
8 changed files with 12 additions and 47 deletions

View file

@ -71,7 +71,6 @@ class BlockProcessorImpl final : public BlockProcessor {
RenderDelayBuffer::BufferingEvent render_event_;
size_t capture_call_counter_ = 0;
absl::optional<DelayEstimate> estimated_delay_;
absl::optional<int> echo_remover_delay_;
};
int BlockProcessorImpl::instance_count_ = 0;
@ -150,11 +149,11 @@ void BlockProcessorImpl::ProcessCapture(
&(*capture_block)[0][0],
LowestBandRate(sample_rate_hz_), 1);
// Compute and and apply the render delay required to achieve proper signal
// Compute and apply the render delay required to achieve proper signal
// alignment.
estimated_delay_ = delay_controller_->GetDelay(
render_buffer_->GetDownsampledRenderBuffer(), render_buffer_->Delay(),
echo_remover_delay_, (*capture_block)[0]);
estimated_delay_ =
delay_controller_->GetDelay(render_buffer_->GetDownsampledRenderBuffer(),
render_buffer_->Delay(), (*capture_block)[0]);
if (estimated_delay_) {
bool delay_change = render_buffer_->SetDelay(estimated_delay_->delay);
@ -173,10 +172,6 @@ void BlockProcessorImpl::ProcessCapture(
echo_path_variability, capture_signal_saturation, estimated_delay_,
render_buffer_->GetRenderBuffer(), capture_block);
// Check to see if a refined delay estimate has been obtained from the echo
// remover.
echo_remover_delay_ = echo_remover_->Delay();
// Update the metrics.
metrics_.UpdateCapture(false);
}

View file

@ -166,7 +166,7 @@ TEST(BlockProcessor, DISABLED_SubmoduleIntegration) {
EXPECT_CALL(*render_delay_buffer_mock, Delay())
.Times(kNumBlocks)
.WillRepeatedly(Return(0));
EXPECT_CALL(*render_delay_controller_mock, GetDelay(_, _, _, _))
EXPECT_CALL(*render_delay_controller_mock, GetDelay(_, _, _))
.Times(kNumBlocks);
EXPECT_CALL(*echo_remover_mock, ProcessCapture(_, _, _, _, _))
.Times(kNumBlocks);

View file

@ -97,12 +97,6 @@ class EchoRemoverImpl final : public EchoRemover {
RenderBuffer* render_buffer,
std::vector<std::vector<float>>* capture) override;
// Returns the internal delay estimate in blocks.
absl::optional<int> Delay() const override {
// TODO(peah): Remove or reactivate this functionality.
return absl::nullopt;
}
// Updates the status on whether echo leakage is detected in the output of the
// echo remover.
void UpdateEchoLeakageStatus(bool leakage_detected) override {

View file

@ -42,9 +42,6 @@ class EchoRemover {
RenderBuffer* render_buffer,
std::vector<std::vector<float>>* capture) = 0;
// Returns the internal delay estimate in blocks.
virtual absl::optional<int> Delay() const = 0;
// Updates the status on whether echo leakage is detected in the output of the
// echo remover.
virtual void UpdateEchoLeakageStatus(bool leakage_detected) = 0;

View file

@ -27,11 +27,10 @@ class MockRenderDelayController : public RenderDelayController {
MOCK_METHOD1(Reset, void(bool reset_delay_statistics));
MOCK_METHOD0(LogRenderCall, void());
MOCK_METHOD4(GetDelay,
MOCK_METHOD3(GetDelay,
absl::optional<DelayEstimate>(
const DownsampledRenderBuffer& render_buffer,
size_t render_delay_buffer_delay,
const absl::optional<int>& echo_remover_delay,
rtc::ArrayView<const float> capture));
MOCK_CONST_METHOD0(HasClockdrift, bool());
};

View file

@ -39,7 +39,6 @@ class RenderDelayControllerImpl final : public RenderDelayController {
absl::optional<DelayEstimate> GetDelay(
const DownsampledRenderBuffer& render_buffer,
size_t render_delay_buffer_delay,
const absl::optional<int>& echo_remover_delay,
rtc::ArrayView<const float> capture) override;
bool HasClockdrift() const override;
@ -117,21 +116,12 @@ void RenderDelayControllerImpl::LogRenderCall() {}
absl::optional<DelayEstimate> RenderDelayControllerImpl::GetDelay(
const DownsampledRenderBuffer& render_buffer,
size_t render_delay_buffer_delay,
const absl::optional<int>& echo_remover_delay,
rtc::ArrayView<const float> capture) {
RTC_DCHECK_EQ(kBlockSize, capture.size());
++capture_call_counter_;
auto delay_samples = delay_estimator_.EstimateDelay(render_buffer, capture);
// Overrule the delay estimator delay if the echo remover reports a delay.
if (echo_remover_delay) {
int total_echo_remover_delay_samples =
(render_delay_buffer_delay + *echo_remover_delay) * kBlockSize;
delay_samples = DelayEstimate(DelayEstimate::Quality::kRefined,
total_echo_remover_delay_samples);
}
if (delay_samples) {
if (!delay_samples_ || delay_samples->delay != delay_samples_->delay) {
delay_change_counter_ = 0;

View file

@ -39,7 +39,6 @@ class RenderDelayController {
virtual absl::optional<DelayEstimate> GetDelay(
const DownsampledRenderBuffer& render_buffer,
size_t render_delay_buffer_delay,
const absl::optional<int>& echo_remover_delay,
rtc::ArrayView<const float> capture) = 0;
// Returns true if clockdrift has been detected.

View file

@ -48,7 +48,6 @@ constexpr size_t kDownSamplingFactors[] = {2, 4, 8};
TEST(RenderDelayController, NoRenderSignal) {
std::vector<float> block(kBlockSize, 0.f);
EchoCanceller3Config config;
absl::optional<int> echo_remover_delay_;
for (size_t num_matched_filters = 4; num_matched_filters == 10;
num_matched_filters++) {
for (auto down_sampling_factor : kDownSamplingFactors) {
@ -63,7 +62,7 @@ TEST(RenderDelayController, NoRenderSignal) {
for (size_t k = 0; k < 100; ++k) {
auto delay = delay_controller->GetDelay(
delay_buffer->GetDownsampledRenderBuffer(), delay_buffer->Delay(),
echo_remover_delay_, block);
block);
EXPECT_FALSE(delay->delay);
}
}
@ -75,7 +74,6 @@ TEST(RenderDelayController, NoRenderSignal) {
TEST(RenderDelayController, BasicApiCalls) {
std::vector<float> capture_block(kBlockSize, 0.f);
absl::optional<DelayEstimate> delay_blocks;
absl::optional<int> echo_remover_delay;
for (size_t num_matched_filters = 4; num_matched_filters == 10;
num_matched_filters++) {
for (auto down_sampling_factor : kDownSamplingFactors) {
@ -95,7 +93,7 @@ TEST(RenderDelayController, BasicApiCalls) {
delay_blocks = delay_controller->GetDelay(
render_delay_buffer->GetDownsampledRenderBuffer(),
render_delay_buffer->Delay(), echo_remover_delay, capture_block);
render_delay_buffer->Delay(), capture_block);
}
EXPECT_TRUE(delay_blocks);
EXPECT_FALSE(delay_blocks->delay);
@ -108,7 +106,6 @@ TEST(RenderDelayController, BasicApiCalls) {
// simple timeshifts between the signals.
TEST(RenderDelayController, Alignment) {
Random random_generator(42U);
absl::optional<int> echo_remover_delay;
std::vector<float> capture_block(kBlockSize, 0.f);
for (size_t num_matched_filters = 4; num_matched_filters == 10;
num_matched_filters++) {
@ -136,8 +133,7 @@ TEST(RenderDelayController, Alignment) {
render_delay_buffer->PrepareCaptureProcessing();
delay_blocks = delay_controller->GetDelay(
render_delay_buffer->GetDownsampledRenderBuffer(),
render_delay_buffer->Delay(), echo_remover_delay,
capture_block);
render_delay_buffer->Delay(), capture_block);
}
ASSERT_TRUE(!!delay_blocks);
@ -157,7 +153,6 @@ TEST(RenderDelayController, Alignment) {
// delays.
TEST(RenderDelayController, NonCausalAlignment) {
Random random_generator(42U);
absl::optional<int> echo_remover_delay;
for (size_t num_matched_filters = 4; num_matched_filters == 10;
num_matched_filters++) {
for (auto down_sampling_factor : kDownSamplingFactors) {
@ -186,8 +181,7 @@ TEST(RenderDelayController, NonCausalAlignment) {
render_delay_buffer->PrepareCaptureProcessing();
delay_blocks = delay_controller->GetDelay(
render_delay_buffer->GetDownsampledRenderBuffer(),
render_delay_buffer->Delay(), echo_remover_delay,
capture_block[0]);
render_delay_buffer->Delay(), capture_block[0]);
}
ASSERT_FALSE(delay_blocks);
@ -201,7 +195,6 @@ TEST(RenderDelayController, NonCausalAlignment) {
// simple timeshifts between the signals when there is jitter in the API calls.
TEST(RenderDelayController, AlignmentWithJitter) {
Random random_generator(42U);
absl::optional<int> echo_remover_delay;
std::vector<float> capture_block(kBlockSize, 0.f);
for (size_t num_matched_filters = 4; num_matched_filters == 10;
num_matched_filters++) {
@ -236,8 +229,7 @@ TEST(RenderDelayController, AlignmentWithJitter) {
render_delay_buffer->PrepareCaptureProcessing();
delay_blocks = delay_controller->GetDelay(
render_delay_buffer->GetDownsampledRenderBuffer(),
render_delay_buffer->Delay(), echo_remover_delay,
capture_block_buffer[k]);
render_delay_buffer->Delay(), capture_block_buffer[k]);
}
}
@ -285,7 +277,6 @@ TEST(RenderDelayController, InitialHeadroom) {
TEST(RenderDelayController, WrongCaptureSize) {
std::vector<float> block(kBlockSize - 1, 0.f);
EchoCanceller3Config config;
absl::optional<int> echo_remover_delay;
for (auto rate : {8000, 16000, 32000, 48000}) {
SCOPED_TRACE(ProduceDebugText(rate));
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
@ -294,7 +285,7 @@ TEST(RenderDelayController, WrongCaptureSize) {
std::unique_ptr<RenderDelayController>(
RenderDelayController::Create(EchoCanceller3Config(), rate))
->GetDelay(render_delay_buffer->GetDownsampledRenderBuffer(),
render_delay_buffer->Delay(), echo_remover_delay, block),
render_delay_buffer->Delay(), block),
"");
}
}