AEC3: Adding default AEC3 configurations that are setup specific

This adds functionality to AEC3 to produce setup-specific
default configurations that are tailored to work well for the
number of channels at hand.

The tunings are only used for the case when no echo control factory
has been provided.

Bug: webrtc:11151,chromium:1029717
Change-Id: I1bd2d10327300c7b0f3169a52bf66700b781fd6b
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/161086
Reviewed-by: Sam Zackrisson <saza@webrtc.org>
Commit-Queue: Per Åhgren <peah@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29972}
This commit is contained in:
Per Åhgren
2019-12-02 14:59:40 +01:00
committed by Commit Bot
parent cf20519262
commit b2b58d84e3
4 changed files with 41 additions and 1 deletions

View File

@ -445,6 +445,25 @@ bool EchoCanceller3::ActiveProcessing() const {
return true; return true;
} }
EchoCanceller3Config EchoCanceller3::CreateDefaultConfig(
size_t num_render_channels,
size_t num_capture_channels) {
EchoCanceller3Config cfg;
if (num_render_channels > 1) {
// Use shorter and more rapidly adapting shadow filter to compensate for
// thge increased number of total filter parameters to adapt.
cfg.filter.shadow.length_blocks = 11;
cfg.filter.shadow.rate = 0.95f;
cfg.filter.shadow_initial.length_blocks = 11;
cfg.filter.shadow_initial.rate = 0.95f;
// Use more concervative suppressor behavior for non-nearend speech.
cfg.suppressor.normal_tuning.max_dec_factor_lf = 0.35f;
cfg.suppressor.normal_tuning.max_inc_factor = 1.5f;
}
return cfg;
}
void EchoCanceller3::EmptyRenderQueue() { void EchoCanceller3::EmptyRenderQueue() {
RTC_DCHECK_RUNS_SERIALIZED(&capture_race_checker_); RTC_DCHECK_RUNS_SERIALIZED(&capture_race_checker_);
bool frame_to_buffer = bool frame_to_buffer =

View File

@ -124,6 +124,11 @@ class EchoCanceller3 : public EchoControl {
block_processor_->UpdateEchoLeakageStatus(leakage_detected); block_processor_->UpdateEchoLeakageStatus(leakage_detected);
} }
// Produces a default configuration that is suitable for a certain combination
// of render and capture channels.
static EchoCanceller3Config CreateDefaultConfig(size_t num_render_channels,
size_t num_capture_channels);
private: private:
class RenderWriter; class RenderWriter;

View File

@ -75,6 +75,14 @@ bool DetectLegacyNsEnforcement() {
return field_trial::IsEnabled("WebRTC-NewNoiseSuppressionKillSwitch"); return field_trial::IsEnabled("WebRTC-NewNoiseSuppressionKillSwitch");
} }
// Checks whether AEC3 should be allowed to decide what the default
// configuration should be based on the render and capture channel configuration
// at hand.
bool UseSetupSpecificDefaultAec3Congfig() {
return !field_trial::IsEnabled(
"WebRTC-Aec3SetupSpecificDefaultConfigDefaultsKillSwitch");
}
// Identify the native processing rate that best handles a sample rate. // Identify the native processing rate that best handles a sample rate.
int SuitableProcessRate(int minimum_rate, int SuitableProcessRate(int minimum_rate,
int max_splitting_rate, int max_splitting_rate,
@ -312,6 +320,8 @@ AudioProcessingImpl::AudioProcessingImpl(
: data_dumper_( : data_dumper_(
new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))), new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
enforced_usage_of_legacy_ns_(DetectLegacyNsEnforcement()), enforced_usage_of_legacy_ns_(DetectLegacyNsEnforcement()),
use_setup_specific_default_aec3_config_(
UseSetupSpecificDefaultAec3Congfig()),
capture_runtime_settings_(kRuntimeSettingQueueSize), capture_runtime_settings_(kRuntimeSettingQueueSize),
render_runtime_settings_(kRuntimeSettingQueueSize), render_runtime_settings_(kRuntimeSettingQueueSize),
capture_runtime_settings_enqueuer_(&capture_runtime_settings_), capture_runtime_settings_enqueuer_(&capture_runtime_settings_),
@ -1826,8 +1836,13 @@ void AudioProcessingImpl::InitializeEchoController() {
proc_sample_rate_hz(), num_reverse_channels(), num_proc_channels()); proc_sample_rate_hz(), num_reverse_channels(), num_proc_channels());
RTC_DCHECK(submodules_.echo_controller); RTC_DCHECK(submodules_.echo_controller);
} else { } else {
EchoCanceller3Config config =
use_setup_specific_default_aec3_config_
? EchoCanceller3::CreateDefaultConfig(num_reverse_channels(),
num_proc_channels())
: EchoCanceller3Config();
submodules_.echo_controller = std::make_unique<EchoCanceller3>( submodules_.echo_controller = std::make_unique<EchoCanceller3>(
EchoCanceller3Config(), proc_sample_rate_hz(), num_reverse_channels(), config, proc_sample_rate_hz(), num_reverse_channels(),
num_proc_channels()); num_proc_channels());
} }

View File

@ -153,6 +153,7 @@ class AudioProcessingImpl : public AudioProcessing {
std::unique_ptr<ApmDataDumper> data_dumper_; std::unique_ptr<ApmDataDumper> data_dumper_;
static int instance_count_; static int instance_count_;
const bool enforced_usage_of_legacy_ns_; const bool enforced_usage_of_legacy_ns_;
const bool use_setup_specific_default_aec3_config_;
SwapQueue<RuntimeSetting> capture_runtime_settings_; SwapQueue<RuntimeSetting> capture_runtime_settings_;
SwapQueue<RuntimeSetting> render_runtime_settings_; SwapQueue<RuntimeSetting> render_runtime_settings_;