Rename APM Config DelayCorrection to ExtendedFilter

We use this Config struct for enabling/disabling Extended filter mode
in AEC. This change renames it to ExtendedFilter for readability
reasons. The corresponding media constraint is also renamed to
kExtendedFilterEchoCancellation.

The old Config is kept in parallel with the new during a transition
period. This is to avoid problems with API breakages. During this
period, if any of the two Configs are enabled, the extended filter
mode is engaged in APM. That is, the two Configs are combined with an
"OR" operation.

This change also renames experimental_aec in AudioOptions to extended_filter_aec.

BUG=4696
R=bjornv@webrtc.org, tommi@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/54659004

Cr-Commit-Position: refs/heads/master@{#9378}
This commit is contained in:
Henrik Lundin 2015-06-05 09:55:32 +02:00
parent efdce6927e
commit 5f4b7e2873
17 changed files with 74 additions and 64 deletions

View File

@ -58,8 +58,8 @@ void FromConstraints(const MediaConstraintsInterface::Constraints& constraints,
if (iter->key == MediaConstraintsInterface::kEchoCancellation)
options->echo_cancellation.Set(value);
else if (iter->key ==
MediaConstraintsInterface::kExperimentalEchoCancellation)
options->experimental_aec.Set(value);
MediaConstraintsInterface::kExtendedFilterEchoCancellation)
options->extended_filter_aec.Set(value);
else if (iter->key == MediaConstraintsInterface::kDAEchoCancellation)
options->delay_agnostic_aec.Set(value);
else if (iter->key == MediaConstraintsInterface::kAutoGainControl)

View File

@ -45,7 +45,7 @@ TEST(LocalAudioSourceTest, SetValidOptions) {
webrtc::FakeConstraints constraints;
constraints.AddMandatory(MediaConstraintsInterface::kEchoCancellation, false);
constraints.AddOptional(
MediaConstraintsInterface::kExperimentalEchoCancellation, true);
MediaConstraintsInterface::kExtendedFilterEchoCancellation, true);
constraints.AddOptional(MediaConstraintsInterface::kDAEchoCancellation, true);
constraints.AddOptional(MediaConstraintsInterface::kAutoGainControl, true);
constraints.AddOptional(
@ -61,7 +61,7 @@ TEST(LocalAudioSourceTest, SetValidOptions) {
bool value;
EXPECT_TRUE(source->options().echo_cancellation.Get(&value));
EXPECT_FALSE(value);
EXPECT_TRUE(source->options().experimental_aec.Get(&value));
EXPECT_TRUE(source->options().extended_filter_aec.Get(&value));
EXPECT_TRUE(value);
EXPECT_TRUE(source->options().delay_agnostic_aec.Get(&value));
EXPECT_TRUE(value);

View File

@ -48,7 +48,7 @@ const char MediaConstraintsInterface::kMinFrameRate[] = "minFrameRate";
// Audio constraints.
const char MediaConstraintsInterface::kEchoCancellation[] =
"googEchoCancellation";
const char MediaConstraintsInterface::kExperimentalEchoCancellation[] =
const char MediaConstraintsInterface::kExtendedFilterEchoCancellation[] =
"googEchoCancellation2";
const char MediaConstraintsInterface::kDAEchoCancellation[] =
"googDAEchoCancellation";

View File

@ -74,7 +74,7 @@ class MediaConstraintsInterface {
// Constraint keys used by a local audio source.
// These keys are google specific.
static const char kEchoCancellation[]; // googEchoCancellation
static const char kExperimentalEchoCancellation[]; // googEchoCancellation2
static const char kExtendedFilterEchoCancellation[]; // googEchoCancellation2
static const char kDAEchoCancellation[]; // googDAEchoCancellation
static const char kAutoGainControl[]; // googAutoGainControl
static const char kExperimentalAutoGainControl[]; // googAutoGainControl2

View File

@ -159,7 +159,7 @@ struct AudioOptions {
conference_mode.SetFrom(change.conference_mode);
adjust_agc_delta.SetFrom(change.adjust_agc_delta);
experimental_agc.SetFrom(change.experimental_agc);
experimental_aec.SetFrom(change.experimental_aec);
extended_filter_aec.SetFrom(change.extended_filter_aec);
delay_agnostic_aec.SetFrom(change.delay_agnostic_aec);
experimental_ns.SetFrom(change.experimental_ns);
aec_dump.SetFrom(change.aec_dump);
@ -191,7 +191,7 @@ struct AudioOptions {
aecm_generate_comfort_noise == o.aecm_generate_comfort_noise &&
conference_mode == o.conference_mode &&
experimental_agc == o.experimental_agc &&
experimental_aec == o.experimental_aec &&
extended_filter_aec == o.extended_filter_aec &&
delay_agnostic_aec == o.delay_agnostic_aec &&
experimental_ns == o.experimental_ns &&
adjust_agc_delta == o.adjust_agc_delta &&
@ -226,7 +226,7 @@ struct AudioOptions {
ost << ToStringIfSet("conference", conference_mode);
ost << ToStringIfSet("agc_delta", adjust_agc_delta);
ost << ToStringIfSet("experimental_agc", experimental_agc);
ost << ToStringIfSet("experimental_aec", experimental_aec);
ost << ToStringIfSet("extended_filter_aec", extended_filter_aec);
ost << ToStringIfSet("delay_agnostic_aec", delay_agnostic_aec);
ost << ToStringIfSet("experimental_ns", experimental_ns);
ost << ToStringIfSet("aec_dump", aec_dump);
@ -269,7 +269,7 @@ struct AudioOptions {
Settable<bool> conference_mode;
Settable<int> adjust_agc_delta;
Settable<bool> experimental_agc;
Settable<bool> experimental_aec;
Settable<bool> extended_filter_aec;
Settable<bool> delay_agnostic_aec;
Settable<bool> experimental_ns;
Settable<bool> aec_dump;

View File

@ -357,7 +357,7 @@ static AudioOptions GetDefaultEngineOptions() {
options.conference_mode.Set(false);
options.adjust_agc_delta.Set(0);
options.experimental_agc.Set(false);
options.experimental_aec.Set(false);
options.extended_filter_aec.Set(false);
options.delay_agnostic_aec.Set(false);
options.experimental_ns.Set(false);
options.aec_dump.Set(false);
@ -661,7 +661,7 @@ bool WebRtcVoiceEngine::ApplyOptions(const AudioOptions& options_in) {
agc_mode = webrtc::kAgcFixedDigital;
options.typing_detection.Set(false);
options.experimental_agc.Set(false);
options.experimental_aec.Set(false);
options.extended_filter_aec.Set(false);
options.experimental_ns.Set(false);
#endif
@ -672,7 +672,7 @@ bool WebRtcVoiceEngine::ApplyOptions(const AudioOptions& options_in) {
if (options.delay_agnostic_aec.Get(&use_delay_agnostic_aec)) {
if (use_delay_agnostic_aec) {
options.echo_cancellation.Set(true);
options.experimental_aec.Set(true);
options.extended_filter_aec.Set(true);
ec_mode = webrtc::kEcConference;
}
}
@ -848,12 +848,12 @@ bool WebRtcVoiceEngine::ApplyOptions(const AudioOptions& options_in) {
new webrtc::ReportedDelay(!delay_agnostic_aec));
}
experimental_aec_.SetFrom(options.experimental_aec);
bool experimental_aec;
if (experimental_aec_.Get(&experimental_aec)) {
LOG(LS_INFO) << "Experimental aec is enabled? " << experimental_aec;
config.Set<webrtc::DelayCorrection>(
new webrtc::DelayCorrection(experimental_aec));
extended_filter_aec_.SetFrom(options.extended_filter_aec);
bool extended_filter;
if (extended_filter_aec_.Get(&extended_filter)) {
LOG(LS_INFO) << "Extended filter aec is enabled? " << extended_filter;
config.Set<webrtc::ExtendedFilter>(
new webrtc::ExtendedFilter(extended_filter));
}
experimental_ns_.SetFrom(options.experimental_ns);

View File

@ -266,11 +266,11 @@ class WebRtcVoiceEngine
rtc::CriticalSection signal_media_critical_;
// Cache received experimental_aec, delay_agnostic_aec and experimental_ns
// Cache received extended_filter_aec, delay_agnostic_aec and experimental_ns
// values, and apply them in case they are missing in the audio options. We
// need to do this because SetExtraOptions() will revert to defaults for
// options which are not provided.
Settable<bool> experimental_aec_;
Settable<bool> extended_filter_aec_;
Settable<bool> delay_agnostic_aec_;
Settable<bool> experimental_ns_;
};

View File

@ -2895,7 +2895,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
// Turn off echo cancellation and delay agnostic aec.
options.delay_agnostic_aec.Set(false);
options.experimental_aec.Set(false);
options.extended_filter_aec.Set(false);
options.echo_cancellation.Set(false);
ASSERT_TRUE(engine_.SetOptions(options));
voe_.GetEcStatus(ec_enabled, ec_mode);

View File

@ -1934,14 +1934,14 @@ int WebRtcAec_reported_delay_enabled(AecCore* self) {
return self->reported_delay_enabled;
}
void WebRtcAec_enable_delay_correction(AecCore* self, int enable) {
void WebRtcAec_enable_extended_filter(AecCore* self, int enable) {
self->extended_filter_enabled = enable;
self->num_partitions = enable ? kExtendedNumPartitions : kNormalNumPartitions;
// Update the delay estimator with filter length. See InitAEC() for details.
WebRtc_set_allowed_offset(self->delay_estimator, self->num_partitions / 2);
}
int WebRtcAec_delay_correction_enabled(AecCore* self) {
int WebRtcAec_extended_filter_enabled(AecCore* self) {
return self->extended_filter_enabled;
}

View File

@ -108,14 +108,11 @@ void WebRtcAec_enable_reported_delay(AecCore* self, int enable);
// Returns non-zero if reported delay is enabled and zero if disabled.
int WebRtcAec_reported_delay_enabled(AecCore* self);
// We now interpret delay correction to mean an extended filter length feature.
// We reuse the delay correction infrastructure to avoid changes through to
// libjingle. See details along with |DelayCorrection| in
// echo_cancellation_impl.h. Non-zero enables, zero disables.
void WebRtcAec_enable_delay_correction(AecCore* self, int enable);
// Enables or disables extended filter mode. Non-zero enables, zero disables.
void WebRtcAec_enable_extended_filter(AecCore* self, int enable);
// Returns non-zero if delay correction is enabled and zero if disabled.
int WebRtcAec_delay_correction_enabled(AecCore* self);
// Returns non-zero if extended filter mode is enabled and zero if disabled.
int WebRtcAec_extended_filter_enabled(AecCore* self);
// Returns the current |system_delay|, i.e., the buffered difference between
// far-end and near-end.

View File

@ -373,7 +373,7 @@ int32_t WebRtcAec_Process(void* aecInst,
}
// This returns the value of aec->extended_filter_enabled.
if (WebRtcAec_delay_correction_enabled(aecpc->aec)) {
if (WebRtcAec_extended_filter_enabled(aecpc->aec)) {
ProcessExtended(aecpc,
nearend,
num_bands,

View File

@ -57,18 +57,19 @@ AudioProcessing::Error MapError(int err) {
EchoCancellationImpl::EchoCancellationImpl(const AudioProcessing* apm,
CriticalSectionWrapper* crit)
: ProcessingComponent(),
apm_(apm),
crit_(crit),
drift_compensation_enabled_(false),
metrics_enabled_(false),
suppression_level_(kModerateSuppression),
stream_drift_samples_(0),
was_stream_drift_set_(false),
stream_has_echo_(false),
delay_logging_enabled_(false),
delay_correction_enabled_(false),
reported_delay_enabled_(true) {}
: ProcessingComponent(),
apm_(apm),
crit_(crit),
drift_compensation_enabled_(false),
metrics_enabled_(false),
suppression_level_(kModerateSuppression),
stream_drift_samples_(0),
was_stream_drift_set_(false),
stream_has_echo_(false),
delay_logging_enabled_(false),
extended_filter_enabled_(false),
reported_delay_enabled_(true) {
}
EchoCancellationImpl::~EchoCancellationImpl() {}
@ -327,7 +328,10 @@ int EchoCancellationImpl::Initialize() {
}
void EchoCancellationImpl::SetExtraOptions(const Config& config) {
delay_correction_enabled_ = config.Get<DelayCorrection>().enabled;
// Both ExtendedFilter and DelayCorrection are diabled by default. If any one
// of them is true, then the extended filter mode is enabled.
extended_filter_enabled_ = config.Get<ExtendedFilter>().enabled ||
config.Get<DelayCorrection>().enabled;
reported_delay_enabled_ = config.Get<ReportedDelay>().enabled;
Configure();
}
@ -366,8 +370,9 @@ int EchoCancellationImpl::ConfigureHandle(void* handle) const {
config.skewMode = drift_compensation_enabled_;
config.delay_logging = delay_logging_enabled_;
WebRtcAec_enable_delay_correction(WebRtcAec_aec_core(
static_cast<Handle*>(handle)), delay_correction_enabled_ ? 1 : 0);
WebRtcAec_enable_extended_filter(
WebRtcAec_aec_core(static_cast<Handle*>(handle)),
extended_filter_enabled_ ? 1 : 0);
WebRtcAec_enable_reported_delay(WebRtcAec_aec_core(
static_cast<Handle*>(handle)), reported_delay_enabled_ ? 1 : 0);
return WebRtcAec_set_config(static_cast<Handle*>(handle), config);

View File

@ -74,7 +74,7 @@ class EchoCancellationImpl : public EchoCancellation,
bool was_stream_drift_set_;
bool stream_has_echo_;
bool delay_logging_enabled_;
bool delay_correction_enabled_;
bool extended_filter_enabled_;
bool reported_delay_enabled_;
};

View File

@ -18,7 +18,7 @@ extern "C" {
namespace webrtc {
TEST(EchoCancellationInternalTest, DelayCorrection) {
TEST(EchoCancellationInternalTest, ExtendedFilter) {
rtc::scoped_ptr<AudioProcessing> ap(AudioProcessing::Create());
EXPECT_TRUE(ap->echo_cancellation()->aec_core() == NULL);
@ -28,24 +28,24 @@ TEST(EchoCancellationInternalTest, DelayCorrection) {
AecCore* aec_core = ap->echo_cancellation()->aec_core();
ASSERT_TRUE(aec_core != NULL);
// Disabled by default.
EXPECT_EQ(0, WebRtcAec_delay_correction_enabled(aec_core));
EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core));
Config config;
config.Set<DelayCorrection>(new DelayCorrection(true));
config.Set<ExtendedFilter>(new ExtendedFilter(true));
ap->SetExtraOptions(config);
EXPECT_EQ(1, WebRtcAec_delay_correction_enabled(aec_core));
EXPECT_EQ(1, WebRtcAec_extended_filter_enabled(aec_core));
// Retains setting after initialization.
EXPECT_EQ(ap->kNoError, ap->Initialize());
EXPECT_EQ(1, WebRtcAec_delay_correction_enabled(aec_core));
EXPECT_EQ(1, WebRtcAec_extended_filter_enabled(aec_core));
config.Set<DelayCorrection>(new DelayCorrection(false));
config.Set<ExtendedFilter>(new ExtendedFilter(false));
ap->SetExtraOptions(config);
EXPECT_EQ(0, WebRtcAec_delay_correction_enabled(aec_core));
EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core));
// Retains setting after initialization.
EXPECT_EQ(ap->kNoError, ap->Initialize());
EXPECT_EQ(0, WebRtcAec_delay_correction_enabled(aec_core));
EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core));
}
TEST(EchoCancellationInternalTest, ReportedDelay) {

View File

@ -37,10 +37,10 @@ class LevelEstimator;
class NoiseSuppression;
class VoiceDetection;
// Use to enable the delay correction feature. This now engages an extended
// filter mode in the AEC, along with robustness measures around the reported
// system delays. It comes with a significant increase in AEC complexity, but is
// much more robust to unreliable reported delays.
// Use to enable the extended filter mode in the AEC, along with robustness
// measures around the reported system delays. It comes with a significant
// increase in AEC complexity, but is much more robust to unreliable reported
// delays.
//
// Detailed changes to the algorithm:
// - The filter length is changed from 48 to 128 ms. This comes with tuning of
@ -54,11 +54,19 @@ class VoiceDetection;
// the delay difference more heavily, and back off from the difference more.
// Adjustments force a readaptation of the filter, so they should be avoided
// except when really necessary.
// TODO(henrik.lundin): Remove DelayCorrection once ExtendedFilter has
// propagated through to all channels
// (https://code.google.com/p/webrtc/issues/detail?id=4696).
struct DelayCorrection {
DelayCorrection() : enabled(false) {}
explicit DelayCorrection(bool enabled) : enabled(enabled) {}
bool enabled;
};
struct ExtendedFilter {
ExtendedFilter() : enabled(false) {}
explicit ExtendedFilter(bool enabled) : enabled(enabled) {}
bool enabled;
};
// Use to disable the reported system delays. By disabling the reported system
// delays the echo cancellation algorithm assumes the process and reverse

View File

@ -1587,7 +1587,7 @@ TEST_F(ApmTest, SplittingFilter) {
// Make sure we have extended filter enabled. This makes sure nothing is
// touched until we have a farend frame.
Config config;
config.Set<DelayCorrection>(new DelayCorrection(true));
config.Set<ExtendedFilter>(new ExtendedFilter(true));
apm_->SetExtraOptions(config);
SetFrameTo(frame_, 1000);
frame_copy.CopyFrom(*frame_);
@ -1969,8 +1969,8 @@ TEST_F(ApmTest, Process) {
Config config;
config.Set<ExperimentalAgc>(new ExperimentalAgc(false));
config.Set<DelayCorrection>(
new DelayCorrection(test->use_aec_extended_filter()));
config.Set<ExtendedFilter>(
new ExtendedFilter(test->use_aec_extended_filter()));
apm_.reset(AudioProcessing::Create(config));
EnableAllComponents();

View File

@ -258,7 +258,7 @@ void void_main(int argc, char* argv[]) {
suppression_level)));
} else if (strcmp(argv[i], "--extended_filter") == 0) {
config.Set<DelayCorrection>(new DelayCorrection(true));
config.Set<ExtendedFilter>(new ExtendedFilter(true));
} else if (strcmp(argv[i], "--no_reported_delay") == 0) {
config.Set<ReportedDelay>(new ReportedDelay(false));