Reland "Remove APM internal usage of EchoCancellation"
Original CL: https://webrtc-review.googlesource.com/c/src/+/97603 - Changes EchoCancellationImpl to inherit privately from EchoCancellation. - Removes usage of AudioProcessing::echo_cancellation() inside most of the audio processing module and unit tests. - Default-enables metrics collection in AEC2. The CL breaks audioproc_f backwards compatibility: It can no longer use all recorded settings (drift compensation, suppression level), but prints an error message when such settings are encountered. Revert CL: https://webrtc-review.googlesource.com/c/src/+/100305 Bug: webrtc:9535 TBR: gustaf@webrtc.org Change-Id: I9248046b3a6a82df6221e502481836948643a991 Reviewed-on: https://webrtc-review.googlesource.com/100461 Reviewed-by: Sam Zackrisson <saza@webrtc.org> Commit-Queue: Sam Zackrisson <saza@webrtc.org> Cr-Commit-Position: refs/heads/master@{#24749}
This commit is contained in:
committed by
Commit Bot
parent
92e0038c44
commit
cdf0e6d4c5
@ -188,11 +188,7 @@ void EnableAllAPComponents(AudioProcessing* ap) {
|
||||
EXPECT_NOERR(ap->gain_control()->Enable(true));
|
||||
#elif defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE)
|
||||
apm_config.echo_canceller.mobile_mode = false;
|
||||
EXPECT_NOERR(ap->echo_cancellation()->enable_drift_compensation(true));
|
||||
EXPECT_NOERR(ap->echo_cancellation()->enable_metrics(true));
|
||||
EXPECT_NOERR(ap->echo_cancellation()->enable_delay_logging(true));
|
||||
EXPECT_NOERR(ap->echo_cancellation()->set_suppression_level(
|
||||
EchoCancellation::SuppressionLevel::kModerateSuppression));
|
||||
apm_config.echo_canceller.legacy_moderate_suppression_level = true;
|
||||
|
||||
EXPECT_NOERR(ap->gain_control()->set_mode(GainControl::kAdaptiveAnalog));
|
||||
EXPECT_NOERR(ap->gain_control()->set_analog_level_limits(0, 255));
|
||||
@ -580,7 +576,6 @@ void ApmTest::ReadFrameWithRewind(FILE* file, AudioFrame* frame) {
|
||||
|
||||
void ApmTest::ProcessWithDefaultStreamParameters(AudioFrame* frame) {
|
||||
EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(0));
|
||||
apm_->echo_cancellation()->set_stream_drift_samples(0);
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
apm_->gain_control()->set_stream_analog_level(127));
|
||||
EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame));
|
||||
@ -665,13 +660,8 @@ void ApmTest::ProcessDelayVerificationTest(int delay_ms, int system_delay_ms,
|
||||
delete frame;
|
||||
|
||||
if (frame_count == 250) {
|
||||
int median;
|
||||
int std;
|
||||
float poor_fraction;
|
||||
// Discard the first delay metrics to avoid convergence effects.
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
apm_->echo_cancellation()->GetDelayMetrics(&median, &std,
|
||||
&poor_fraction));
|
||||
static_cast<void>(apm_->GetStatistics(true /* has_remote_tracks */));
|
||||
}
|
||||
}
|
||||
|
||||
@ -694,12 +684,10 @@ void ApmTest::ProcessDelayVerificationTest(int delay_ms, int system_delay_ms,
|
||||
expected_median - rtc::dchecked_cast<int>(96 / samples_per_ms), delay_min,
|
||||
delay_max);
|
||||
// Verify delay metrics.
|
||||
int median;
|
||||
int std;
|
||||
float poor_fraction;
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
apm_->echo_cancellation()->GetDelayMetrics(&median, &std,
|
||||
&poor_fraction));
|
||||
AudioProcessingStats stats =
|
||||
apm_->GetStatistics(true /* has_remote_tracks */);
|
||||
ASSERT_TRUE(stats.delay_median_ms.has_value());
|
||||
int32_t median = *stats.delay_median_ms;
|
||||
EXPECT_GE(expected_median_high, median);
|
||||
EXPECT_LE(expected_median_low, median);
|
||||
}
|
||||
@ -721,19 +709,16 @@ void ApmTest::StreamParametersTest(Format format) {
|
||||
ProcessStreamChooser(format));
|
||||
|
||||
// Other stream parameters set correctly.
|
||||
EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(true));
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
apm_->echo_cancellation()->enable_drift_compensation(true));
|
||||
AudioProcessing::Config apm_config = apm_->GetConfig();
|
||||
apm_config.echo_canceller.enabled = true;
|
||||
apm_config.echo_canceller.mobile_mode = false;
|
||||
apm_->ApplyConfig(apm_config);
|
||||
EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(100));
|
||||
apm_->echo_cancellation()->set_stream_drift_samples(0);
|
||||
EXPECT_EQ(apm_->kStreamParameterNotSetError,
|
||||
ProcessStreamChooser(format));
|
||||
EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(false));
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
apm_->echo_cancellation()->enable_drift_compensation(false));
|
||||
|
||||
// -- Missing delay --
|
||||
EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(true));
|
||||
EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format));
|
||||
EXPECT_EQ(apm_->kStreamParameterNotSetError,
|
||||
ProcessStreamChooser(format));
|
||||
@ -746,34 +731,12 @@ void ApmTest::StreamParametersTest(Format format) {
|
||||
|
||||
// Other stream parameters set correctly.
|
||||
EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
apm_->echo_cancellation()->enable_drift_compensation(true));
|
||||
apm_->echo_cancellation()->set_stream_drift_samples(0);
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
apm_->gain_control()->set_stream_analog_level(127));
|
||||
EXPECT_EQ(apm_->kStreamParameterNotSetError,
|
||||
ProcessStreamChooser(format));
|
||||
EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(false));
|
||||
|
||||
// -- Missing drift --
|
||||
EXPECT_EQ(apm_->kStreamParameterNotSetError,
|
||||
ProcessStreamChooser(format));
|
||||
|
||||
// Resets after successful ProcessStream().
|
||||
EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(100));
|
||||
apm_->echo_cancellation()->set_stream_drift_samples(0);
|
||||
EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format));
|
||||
EXPECT_EQ(apm_->kStreamParameterNotSetError,
|
||||
ProcessStreamChooser(format));
|
||||
|
||||
// Other stream parameters set correctly.
|
||||
EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
|
||||
EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(100));
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
apm_->gain_control()->set_stream_analog_level(127));
|
||||
EXPECT_EQ(apm_->kStreamParameterNotSetError,
|
||||
ProcessStreamChooser(format));
|
||||
|
||||
// -- No stream parameters --
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
AnalyzeReverseStreamChooser(format));
|
||||
@ -782,7 +745,6 @@ void ApmTest::StreamParametersTest(Format format) {
|
||||
|
||||
// -- All there --
|
||||
EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(100));
|
||||
apm_->echo_cancellation()->set_stream_drift_samples(0);
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
apm_->gain_control()->set_stream_analog_level(127));
|
||||
EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format));
|
||||
@ -906,79 +868,13 @@ TEST_F(ApmTest, SampleRatesInt) {
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(ApmTest, EchoCancellation) {
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
apm_->echo_cancellation()->enable_drift_compensation(true));
|
||||
EXPECT_TRUE(apm_->echo_cancellation()->is_drift_compensation_enabled());
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
apm_->echo_cancellation()->enable_drift_compensation(false));
|
||||
EXPECT_FALSE(apm_->echo_cancellation()->is_drift_compensation_enabled());
|
||||
|
||||
EchoCancellation::SuppressionLevel level[] = {
|
||||
EchoCancellation::kLowSuppression,
|
||||
EchoCancellation::kModerateSuppression,
|
||||
EchoCancellation::kHighSuppression,
|
||||
};
|
||||
for (size_t i = 0; i < arraysize(level); i++) {
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
apm_->echo_cancellation()->set_suppression_level(level[i]));
|
||||
EXPECT_EQ(level[i],
|
||||
apm_->echo_cancellation()->suppression_level());
|
||||
}
|
||||
|
||||
EchoCancellation::Metrics metrics;
|
||||
EXPECT_EQ(apm_->kNotEnabledError,
|
||||
apm_->echo_cancellation()->GetMetrics(&metrics));
|
||||
|
||||
EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(true));
|
||||
EXPECT_TRUE(apm_->echo_cancellation()->is_enabled());
|
||||
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
apm_->echo_cancellation()->enable_metrics(true));
|
||||
EXPECT_TRUE(apm_->echo_cancellation()->are_metrics_enabled());
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
apm_->echo_cancellation()->enable_metrics(false));
|
||||
EXPECT_FALSE(apm_->echo_cancellation()->are_metrics_enabled());
|
||||
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
apm_->echo_cancellation()->enable_delay_logging(true));
|
||||
EXPECT_TRUE(apm_->echo_cancellation()->is_delay_logging_enabled());
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
apm_->echo_cancellation()->enable_delay_logging(false));
|
||||
EXPECT_FALSE(apm_->echo_cancellation()->is_delay_logging_enabled());
|
||||
|
||||
EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(false));
|
||||
EXPECT_FALSE(apm_->echo_cancellation()->is_enabled());
|
||||
|
||||
int median = 0;
|
||||
int std = 0;
|
||||
float poor_fraction = 0;
|
||||
EXPECT_EQ(apm_->kNotEnabledError, apm_->echo_cancellation()->GetDelayMetrics(
|
||||
&median, &std, &poor_fraction));
|
||||
|
||||
EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(true));
|
||||
EXPECT_TRUE(apm_->echo_cancellation()->is_enabled());
|
||||
EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(false));
|
||||
EXPECT_FALSE(apm_->echo_cancellation()->is_enabled());
|
||||
|
||||
EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(true));
|
||||
EXPECT_TRUE(apm_->echo_cancellation()->is_enabled());
|
||||
EXPECT_TRUE(apm_->echo_cancellation()->aec_core() != NULL);
|
||||
EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(false));
|
||||
EXPECT_FALSE(apm_->echo_cancellation()->is_enabled());
|
||||
EXPECT_FALSE(apm_->echo_cancellation()->aec_core() != NULL);
|
||||
}
|
||||
|
||||
TEST_F(ApmTest, DISABLED_EchoCancellationReportsCorrectDelays) {
|
||||
// TODO(bjornv): Fix this test to work with DA-AEC.
|
||||
// Enable AEC only.
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
apm_->echo_cancellation()->enable_drift_compensation(false));
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
apm_->echo_cancellation()->enable_metrics(false));
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
apm_->echo_cancellation()->enable_delay_logging(true));
|
||||
EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(true));
|
||||
AudioProcessing::Config apm_config = apm_->GetConfig();
|
||||
apm_config.echo_canceller.enabled = true;
|
||||
apm_config.echo_canceller.mobile_mode = false;
|
||||
apm_->ApplyConfig(apm_config);
|
||||
Config config;
|
||||
config.Set<DelayAgnostic>(new DelayAgnostic(false));
|
||||
apm_->SetExtraOptions(config);
|
||||
@ -1446,8 +1342,9 @@ TEST_F(ApmTest, VoiceDetection) {
|
||||
}
|
||||
|
||||
TEST_F(ApmTest, AllProcessingDisabledByDefault) {
|
||||
EXPECT_FALSE(apm_->echo_cancellation()->is_enabled());
|
||||
EXPECT_FALSE(apm_->echo_control_mobile()->is_enabled());
|
||||
AudioProcessing::Config config = apm_->GetConfig();
|
||||
EXPECT_FALSE(config.echo_canceller.enabled);
|
||||
EXPECT_FALSE(config.high_pass_filter.enabled);
|
||||
EXPECT_FALSE(apm_->gain_control()->is_enabled());
|
||||
EXPECT_FALSE(apm_->high_pass_filter()->is_enabled());
|
||||
EXPECT_FALSE(apm_->level_estimator()->is_enabled());
|
||||
@ -1530,7 +1427,6 @@ TEST_F(ApmTest, IdenticalInputChannelsResultInIdenticalOutputChannels) {
|
||||
frame_->vad_activity_ = AudioFrame::kVadUnknown;
|
||||
|
||||
ASSERT_EQ(kNoErr, apm_->set_stream_delay_ms(0));
|
||||
apm_->echo_cancellation()->set_stream_drift_samples(0);
|
||||
ASSERT_EQ(kNoErr,
|
||||
apm_->gain_control()->set_stream_analog_level(analog_level));
|
||||
ASSERT_EQ(kNoErr, apm_->ProcessStream(frame_));
|
||||
@ -1590,7 +1486,10 @@ TEST_F(ApmTest, SplittingFilter) {
|
||||
// first few frames of data being unaffected by the AEC.
|
||||
// TODO(andrew): This test, and the one below, rely rather tenuously on the
|
||||
// behavior of the AEC. Think of something more robust.
|
||||
EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(true));
|
||||
AudioProcessing::Config apm_config = apm_->GetConfig();
|
||||
apm_config.echo_canceller.enabled = true;
|
||||
apm_config.echo_canceller.mobile_mode = false;
|
||||
apm_->ApplyConfig(apm_config);
|
||||
// Make sure we have extended filter enabled. This makes sure nothing is
|
||||
// touched until we have a farend frame.
|
||||
Config config;
|
||||
@ -1599,10 +1498,8 @@ TEST_F(ApmTest, SplittingFilter) {
|
||||
SetFrameTo(frame_, 1000);
|
||||
frame_copy.CopyFrom(*frame_);
|
||||
EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(0));
|
||||
apm_->echo_cancellation()->set_stream_drift_samples(0);
|
||||
EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
|
||||
EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(0));
|
||||
apm_->echo_cancellation()->set_stream_drift_samples(0);
|
||||
EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
|
||||
EXPECT_TRUE(FrameDataAreEqual(*frame_, frame_copy));
|
||||
|
||||
@ -1614,7 +1511,6 @@ TEST_F(ApmTest, SplittingFilter) {
|
||||
SetFrameTo(frame_, 1000);
|
||||
frame_copy.CopyFrom(*frame_);
|
||||
EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(0));
|
||||
apm_->echo_cancellation()->set_stream_drift_samples(0);
|
||||
EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
|
||||
EXPECT_FALSE(FrameDataAreEqual(*frame_, frame_copy));
|
||||
}
|
||||
@ -1686,7 +1582,6 @@ void ApmTest::ProcessDebugDump(const std::string& in_filename,
|
||||
|
||||
EXPECT_NOERR(apm_->gain_control()->set_stream_analog_level(msg.level()));
|
||||
EXPECT_NOERR(apm_->set_stream_delay_ms(msg.delay()));
|
||||
apm_->echo_cancellation()->set_stream_drift_samples(msg.drift());
|
||||
if (msg.has_keypress()) {
|
||||
apm_->set_stream_key_pressed(msg.keypress());
|
||||
} else {
|
||||
@ -1907,8 +1802,6 @@ TEST_F(ApmTest, FloatAndIntInterfacesGiveSimilarResults) {
|
||||
|
||||
EXPECT_NOERR(apm_->set_stream_delay_ms(0));
|
||||
EXPECT_NOERR(fapm->set_stream_delay_ms(0));
|
||||
apm_->echo_cancellation()->set_stream_drift_samples(0);
|
||||
fapm->echo_cancellation()->set_stream_drift_samples(0);
|
||||
EXPECT_NOERR(apm_->gain_control()->set_stream_analog_level(analog_level));
|
||||
EXPECT_NOERR(fapm->gain_control()->set_stream_analog_level(analog_level));
|
||||
|
||||
@ -1945,8 +1838,6 @@ TEST_F(ApmTest, FloatAndIntInterfacesGiveSimilarResults) {
|
||||
analog_level = fapm->gain_control()->stream_analog_level();
|
||||
EXPECT_EQ(apm_->gain_control()->stream_analog_level(),
|
||||
fapm->gain_control()->stream_analog_level());
|
||||
EXPECT_EQ(apm_->echo_cancellation()->stream_has_echo(),
|
||||
fapm->echo_cancellation()->stream_has_echo());
|
||||
EXPECT_NEAR(apm_->noise_suppression()->speech_probability(),
|
||||
fapm->noise_suppression()->speech_probability(),
|
||||
0.01);
|
||||
@ -2045,7 +1936,6 @@ TEST_F(ApmTest, Process) {
|
||||
frame_->vad_activity_ = AudioFrame::kVadUnknown;
|
||||
|
||||
EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(0));
|
||||
apm_->echo_cancellation()->set_stream_drift_samples(0);
|
||||
EXPECT_EQ(apm_->kNoError,
|
||||
apm_->gain_control()->set_stream_analog_level(analog_level));
|
||||
|
||||
@ -2411,7 +2301,6 @@ class AudioProcessingTest
|
||||
processing_config.reverse_output_stream(), rev_out_cb.channels()));
|
||||
|
||||
EXPECT_NOERR(ap->set_stream_delay_ms(0));
|
||||
ap->echo_cancellation()->set_stream_drift_samples(0);
|
||||
EXPECT_NOERR(ap->gain_control()->set_stream_analog_level(analog_level));
|
||||
|
||||
EXPECT_NOERR(ap->ProcessStream(
|
||||
@ -2870,25 +2759,17 @@ std::unique_ptr<AudioProcessing> CreateApm(bool use_AEC2) {
|
||||
}
|
||||
|
||||
// Disable all components except for an AEC and the residual echo detector.
|
||||
AudioProcessing::Config config;
|
||||
config.residual_echo_detector.enabled = true;
|
||||
config.high_pass_filter.enabled = false;
|
||||
config.gain_controller2.enabled = false;
|
||||
apm->ApplyConfig(config);
|
||||
AudioProcessing::Config apm_config;
|
||||
apm_config.residual_echo_detector.enabled = true;
|
||||
apm_config.high_pass_filter.enabled = false;
|
||||
apm_config.gain_controller2.enabled = false;
|
||||
apm_config.echo_canceller.enabled = true;
|
||||
apm_config.echo_canceller.mobile_mode = !use_AEC2;
|
||||
apm->ApplyConfig(apm_config);
|
||||
EXPECT_EQ(apm->gain_control()->Enable(false), 0);
|
||||
EXPECT_EQ(apm->level_estimator()->Enable(false), 0);
|
||||
EXPECT_EQ(apm->noise_suppression()->Enable(false), 0);
|
||||
EXPECT_EQ(apm->voice_detection()->Enable(false), 0);
|
||||
|
||||
if (use_AEC2) {
|
||||
EXPECT_EQ(apm->echo_control_mobile()->Enable(false), 0);
|
||||
EXPECT_EQ(apm->echo_cancellation()->enable_metrics(true), 0);
|
||||
EXPECT_EQ(apm->echo_cancellation()->enable_delay_logging(true), 0);
|
||||
EXPECT_EQ(apm->echo_cancellation()->Enable(true), 0);
|
||||
} else {
|
||||
EXPECT_EQ(apm->echo_cancellation()->Enable(false), 0);
|
||||
EXPECT_EQ(apm->echo_control_mobile()->Enable(true), 0);
|
||||
}
|
||||
return apm;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user