diff --git a/talk/app/webrtc/localaudiosource.cc b/talk/app/webrtc/localaudiosource.cc index 808e2cfa45..b37d1e3e41 100644 --- a/talk/app/webrtc/localaudiosource.cc +++ b/talk/app/webrtc/localaudiosource.cc @@ -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::kExtendedFilterEchoCancellation) - options->extended_filter_aec.Set(value); + MediaConstraintsInterface::kExperimentalEchoCancellation) + options->experimental_aec.Set(value); else if (iter->key == MediaConstraintsInterface::kDAEchoCancellation) options->delay_agnostic_aec.Set(value); else if (iter->key == MediaConstraintsInterface::kAutoGainControl) diff --git a/talk/app/webrtc/localaudiosource_unittest.cc b/talk/app/webrtc/localaudiosource_unittest.cc index 43a132b9f6..569f814a52 100644 --- a/talk/app/webrtc/localaudiosource_unittest.cc +++ b/talk/app/webrtc/localaudiosource_unittest.cc @@ -45,7 +45,7 @@ TEST(LocalAudioSourceTest, SetValidOptions) { webrtc::FakeConstraints constraints; constraints.AddMandatory(MediaConstraintsInterface::kEchoCancellation, false); constraints.AddOptional( - MediaConstraintsInterface::kExtendedFilterEchoCancellation, true); + MediaConstraintsInterface::kExperimentalEchoCancellation, 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().extended_filter_aec.Get(&value)); + EXPECT_TRUE(source->options().experimental_aec.Get(&value)); EXPECT_TRUE(value); EXPECT_TRUE(source->options().delay_agnostic_aec.Get(&value)); EXPECT_TRUE(value); diff --git a/talk/app/webrtc/mediaconstraintsinterface.cc b/talk/app/webrtc/mediaconstraintsinterface.cc index 7fbc61d794..a84dde27b3 100644 --- a/talk/app/webrtc/mediaconstraintsinterface.cc +++ b/talk/app/webrtc/mediaconstraintsinterface.cc @@ -48,7 +48,7 @@ const char MediaConstraintsInterface::kMinFrameRate[] = "minFrameRate"; // Audio constraints. const char MediaConstraintsInterface::kEchoCancellation[] = "googEchoCancellation"; -const char MediaConstraintsInterface::kExtendedFilterEchoCancellation[] = +const char MediaConstraintsInterface::kExperimentalEchoCancellation[] = "googEchoCancellation2"; const char MediaConstraintsInterface::kDAEchoCancellation[] = "googDAEchoCancellation"; diff --git a/talk/app/webrtc/mediaconstraintsinterface.h b/talk/app/webrtc/mediaconstraintsinterface.h index 1148d80f7c..cc682097f7 100644 --- a/talk/app/webrtc/mediaconstraintsinterface.h +++ b/talk/app/webrtc/mediaconstraintsinterface.h @@ -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 kExtendedFilterEchoCancellation[]; // googEchoCancellation2 + static const char kExperimentalEchoCancellation[]; // googEchoCancellation2 static const char kDAEchoCancellation[]; // googDAEchoCancellation static const char kAutoGainControl[]; // googAutoGainControl static const char kExperimentalAutoGainControl[]; // googAutoGainControl2 diff --git a/talk/media/base/mediachannel.h b/talk/media/base/mediachannel.h index e7af7a76aa..b5b2460772 100644 --- a/talk/media/base/mediachannel.h +++ b/talk/media/base/mediachannel.h @@ -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); - extended_filter_aec.SetFrom(change.extended_filter_aec); + experimental_aec.SetFrom(change.experimental_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 && - extended_filter_aec == o.extended_filter_aec && + experimental_aec == o.experimental_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("extended_filter_aec", extended_filter_aec); + ost << ToStringIfSet("experimental_aec", experimental_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 conference_mode; Settable adjust_agc_delta; Settable experimental_agc; - Settable extended_filter_aec; + Settable experimental_aec; Settable delay_agnostic_aec; Settable experimental_ns; Settable aec_dump; diff --git a/talk/media/webrtc/webrtcvoiceengine.cc b/talk/media/webrtc/webrtcvoiceengine.cc index 84a26c51b8..aad0d43aa8 100644 --- a/talk/media/webrtc/webrtcvoiceengine.cc +++ b/talk/media/webrtc/webrtcvoiceengine.cc @@ -357,7 +357,7 @@ static AudioOptions GetDefaultEngineOptions() { options.conference_mode.Set(false); options.adjust_agc_delta.Set(0); options.experimental_agc.Set(false); - options.extended_filter_aec.Set(false); + options.experimental_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.extended_filter_aec.Set(false); + options.experimental_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.extended_filter_aec.Set(true); + options.experimental_aec.Set(true); ec_mode = webrtc::kEcConference; } } @@ -848,12 +848,12 @@ bool WebRtcVoiceEngine::ApplyOptions(const AudioOptions& options_in) { new webrtc::ReportedDelay(!delay_agnostic_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( - new webrtc::ExtendedFilter(extended_filter)); + 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( + new webrtc::DelayCorrection(experimental_aec)); } experimental_ns_.SetFrom(options.experimental_ns); diff --git a/talk/media/webrtc/webrtcvoiceengine.h b/talk/media/webrtc/webrtcvoiceengine.h index 35f2dbc93e..65dde08545 100644 --- a/talk/media/webrtc/webrtcvoiceengine.h +++ b/talk/media/webrtc/webrtcvoiceengine.h @@ -266,11 +266,11 @@ class WebRtcVoiceEngine rtc::CriticalSection signal_media_critical_; - // Cache received extended_filter_aec, delay_agnostic_aec and experimental_ns + // Cache received experimental_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 extended_filter_aec_; + Settable experimental_aec_; Settable delay_agnostic_aec_; Settable experimental_ns_; }; diff --git a/talk/media/webrtc/webrtcvoiceengine_unittest.cc b/talk/media/webrtc/webrtcvoiceengine_unittest.cc index 0dc7b510ee..cf8100b06a 100644 --- a/talk/media/webrtc/webrtcvoiceengine_unittest.cc +++ b/talk/media/webrtc/webrtcvoiceengine_unittest.cc @@ -2895,7 +2895,7 @@ TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) { // Turn off echo cancellation and delay agnostic aec. options.delay_agnostic_aec.Set(false); - options.extended_filter_aec.Set(false); + options.experimental_aec.Set(false); options.echo_cancellation.Set(false); ASSERT_TRUE(engine_.SetOptions(options)); voe_.GetEcStatus(ec_enabled, ec_mode); diff --git a/webrtc/modules/audio_processing/aec/aec_core.c b/webrtc/modules/audio_processing/aec/aec_core.c index 32266f4e32..d4e11dcc43 100644 --- a/webrtc/modules/audio_processing/aec/aec_core.c +++ b/webrtc/modules/audio_processing/aec/aec_core.c @@ -1934,14 +1934,14 @@ int WebRtcAec_reported_delay_enabled(AecCore* self) { return self->reported_delay_enabled; } -void WebRtcAec_enable_extended_filter(AecCore* self, int enable) { +void WebRtcAec_enable_delay_correction(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_extended_filter_enabled(AecCore* self) { +int WebRtcAec_delay_correction_enabled(AecCore* self) { return self->extended_filter_enabled; } diff --git a/webrtc/modules/audio_processing/aec/aec_core.h b/webrtc/modules/audio_processing/aec/aec_core.h index aa5687a4f4..d9335e322d 100644 --- a/webrtc/modules/audio_processing/aec/aec_core.h +++ b/webrtc/modules/audio_processing/aec/aec_core.h @@ -108,11 +108,14 @@ 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); -// Enables or disables extended filter mode. Non-zero enables, zero disables. -void WebRtcAec_enable_extended_filter(AecCore* self, int enable); +// 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); -// Returns non-zero if extended filter mode is enabled and zero if disabled. -int WebRtcAec_extended_filter_enabled(AecCore* self); +// Returns non-zero if delay correction is enabled and zero if disabled. +int WebRtcAec_delay_correction_enabled(AecCore* self); // Returns the current |system_delay|, i.e., the buffered difference between // far-end and near-end. diff --git a/webrtc/modules/audio_processing/aec/echo_cancellation.c b/webrtc/modules/audio_processing/aec/echo_cancellation.c index 06d081d3ce..54ac24dcf4 100644 --- a/webrtc/modules/audio_processing/aec/echo_cancellation.c +++ b/webrtc/modules/audio_processing/aec/echo_cancellation.c @@ -373,7 +373,7 @@ int32_t WebRtcAec_Process(void* aecInst, } // This returns the value of aec->extended_filter_enabled. - if (WebRtcAec_extended_filter_enabled(aecpc->aec)) { + if (WebRtcAec_delay_correction_enabled(aecpc->aec)) { ProcessExtended(aecpc, nearend, num_bands, diff --git a/webrtc/modules/audio_processing/echo_cancellation_impl.cc b/webrtc/modules/audio_processing/echo_cancellation_impl.cc index e28f127839..245941a426 100644 --- a/webrtc/modules/audio_processing/echo_cancellation_impl.cc +++ b/webrtc/modules/audio_processing/echo_cancellation_impl.cc @@ -57,19 +57,18 @@ 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), - extended_filter_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), + delay_correction_enabled_(false), + reported_delay_enabled_(true) {} EchoCancellationImpl::~EchoCancellationImpl() {} @@ -328,10 +327,7 @@ int EchoCancellationImpl::Initialize() { } void EchoCancellationImpl::SetExtraOptions(const Config& config) { - // 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().enabled || - config.Get().enabled; + delay_correction_enabled_ = config.Get().enabled; reported_delay_enabled_ = config.Get().enabled; Configure(); } @@ -370,9 +366,8 @@ int EchoCancellationImpl::ConfigureHandle(void* handle) const { config.skewMode = drift_compensation_enabled_; config.delay_logging = delay_logging_enabled_; - WebRtcAec_enable_extended_filter( - WebRtcAec_aec_core(static_cast(handle)), - extended_filter_enabled_ ? 1 : 0); + WebRtcAec_enable_delay_correction(WebRtcAec_aec_core( + static_cast(handle)), delay_correction_enabled_ ? 1 : 0); WebRtcAec_enable_reported_delay(WebRtcAec_aec_core( static_cast(handle)), reported_delay_enabled_ ? 1 : 0); return WebRtcAec_set_config(static_cast(handle), config); diff --git a/webrtc/modules/audio_processing/echo_cancellation_impl.h b/webrtc/modules/audio_processing/echo_cancellation_impl.h index cf3ebf61af..ed3d7b5099 100644 --- a/webrtc/modules/audio_processing/echo_cancellation_impl.h +++ b/webrtc/modules/audio_processing/echo_cancellation_impl.h @@ -74,7 +74,7 @@ class EchoCancellationImpl : public EchoCancellation, bool was_stream_drift_set_; bool stream_has_echo_; bool delay_logging_enabled_; - bool extended_filter_enabled_; + bool delay_correction_enabled_; bool reported_delay_enabled_; }; diff --git a/webrtc/modules/audio_processing/echo_cancellation_impl_unittest.cc b/webrtc/modules/audio_processing/echo_cancellation_impl_unittest.cc index 63b6db919f..aac9a1e705 100644 --- a/webrtc/modules/audio_processing/echo_cancellation_impl_unittest.cc +++ b/webrtc/modules/audio_processing/echo_cancellation_impl_unittest.cc @@ -18,7 +18,7 @@ extern "C" { namespace webrtc { -TEST(EchoCancellationInternalTest, ExtendedFilter) { +TEST(EchoCancellationInternalTest, DelayCorrection) { rtc::scoped_ptr ap(AudioProcessing::Create()); EXPECT_TRUE(ap->echo_cancellation()->aec_core() == NULL); @@ -28,24 +28,24 @@ TEST(EchoCancellationInternalTest, ExtendedFilter) { AecCore* aec_core = ap->echo_cancellation()->aec_core(); ASSERT_TRUE(aec_core != NULL); // Disabled by default. - EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core)); + EXPECT_EQ(0, WebRtcAec_delay_correction_enabled(aec_core)); Config config; - config.Set(new ExtendedFilter(true)); + config.Set(new DelayCorrection(true)); ap->SetExtraOptions(config); - EXPECT_EQ(1, WebRtcAec_extended_filter_enabled(aec_core)); + EXPECT_EQ(1, WebRtcAec_delay_correction_enabled(aec_core)); // Retains setting after initialization. EXPECT_EQ(ap->kNoError, ap->Initialize()); - EXPECT_EQ(1, WebRtcAec_extended_filter_enabled(aec_core)); + EXPECT_EQ(1, WebRtcAec_delay_correction_enabled(aec_core)); - config.Set(new ExtendedFilter(false)); + config.Set(new DelayCorrection(false)); ap->SetExtraOptions(config); - EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core)); + EXPECT_EQ(0, WebRtcAec_delay_correction_enabled(aec_core)); // Retains setting after initialization. EXPECT_EQ(ap->kNoError, ap->Initialize()); - EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core)); + EXPECT_EQ(0, WebRtcAec_delay_correction_enabled(aec_core)); } TEST(EchoCancellationInternalTest, ReportedDelay) { diff --git a/webrtc/modules/audio_processing/include/audio_processing.h b/webrtc/modules/audio_processing/include/audio_processing.h index a4dd0495c2..8c3436d539 100644 --- a/webrtc/modules/audio_processing/include/audio_processing.h +++ b/webrtc/modules/audio_processing/include/audio_processing.h @@ -37,10 +37,10 @@ class LevelEstimator; class NoiseSuppression; class VoiceDetection; -// 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. +// 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. // // Detailed changes to the algorithm: // - The filter length is changed from 48 to 128 ms. This comes with tuning of @@ -54,19 +54,11 @@ 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 diff --git a/webrtc/modules/audio_processing/test/audio_processing_unittest.cc b/webrtc/modules/audio_processing/test/audio_processing_unittest.cc index c19449ae25..d3c292a3c4 100644 --- a/webrtc/modules/audio_processing/test/audio_processing_unittest.cc +++ b/webrtc/modules/audio_processing/test/audio_processing_unittest.cc @@ -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(new ExtendedFilter(true)); + config.Set(new DelayCorrection(true)); apm_->SetExtraOptions(config); SetFrameTo(frame_, 1000); frame_copy.CopyFrom(*frame_); @@ -1969,8 +1969,8 @@ TEST_F(ApmTest, Process) { Config config; config.Set(new ExperimentalAgc(false)); - config.Set( - new ExtendedFilter(test->use_aec_extended_filter())); + config.Set( + new DelayCorrection(test->use_aec_extended_filter())); apm_.reset(AudioProcessing::Create(config)); EnableAllComponents(); diff --git a/webrtc/modules/audio_processing/test/process_test.cc b/webrtc/modules/audio_processing/test/process_test.cc index 0f28a44492..23d4d18bca 100644 --- a/webrtc/modules/audio_processing/test/process_test.cc +++ b/webrtc/modules/audio_processing/test/process_test.cc @@ -258,7 +258,7 @@ void void_main(int argc, char* argv[]) { suppression_level))); } else if (strcmp(argv[i], "--extended_filter") == 0) { - config.Set(new ExtendedFilter(true)); + config.Set(new DelayCorrection(true)); } else if (strcmp(argv[i], "--no_reported_delay") == 0) { config.Set(new ReportedDelay(false));