Avoid AGC2 runtime allocation and activate it on demand

This CL ensures that the AGC2 is created and initialized only when
needed.

Apart from that, the CL also avoids a runtime-reallocation that happens
each time the setting is applied.

Bug: webrtc:5298
Change-Id: Iad9eaa05a3d0baa0788cd11b2aa17ddd8e0c509b
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/163987
Commit-Queue: Per Åhgren <peah@webrtc.org>
Reviewed-by: Sam Zackrisson <saza@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30139}
This commit is contained in:
Per Åhgren 2020-01-03 10:36:34 +01:00 committed by Commit Bot
parent 83ee98292f
commit 2bd85ab039
2 changed files with 30 additions and 14 deletions

View File

@ -372,10 +372,6 @@ AudioProcessingImpl::AudioProcessingImpl(
new rtc::RefCountedObject<ResidualEchoDetector>(); new rtc::RefCountedObject<ResidualEchoDetector>();
} }
// TODO(alessiob): Move the injected gain controller once injection is
// implemented.
submodules_.gain_controller2.reset(new GainController2());
// TODO(webrtc:5298): Remove once the use of ExperimentalNs has been // TODO(webrtc:5298): Remove once the use of ExperimentalNs has been
// deprecated. // deprecated.
#if !(defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)) #if !(defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS))
@ -656,6 +652,9 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) {
config_.gain_controller1.analog_level_maximum != config_.gain_controller1.analog_level_maximum !=
config.gain_controller1.analog_level_maximum; config.gain_controller1.analog_level_maximum;
const bool agc2_config_changed =
config_.gain_controller2.enabled != config.gain_controller2.enabled;
const bool voice_detection_config_changed = const bool voice_detection_config_changed =
config_.voice_detection.enabled != config.voice_detection.enabled; config_.voice_detection.enabled != config.voice_detection.enabled;
@ -694,9 +693,10 @@ void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) {
<< "\nReverting to default parameter set"; << "\nReverting to default parameter set";
config_.gain_controller2 = AudioProcessing::Config::GainController2(); config_.gain_controller2 = AudioProcessing::Config::GainController2();
} }
if (agc2_config_changed) {
InitializeGainController2(); InitializeGainController2();
}
InitializePreAmplifier(); InitializePreAmplifier();
submodules_.gain_controller2->ApplyConfig(config_.gain_controller2);
if (config_.level_estimation.enabled && !submodules_.output_level_estimator) { if (config_.level_estimation.enabled && !submodules_.output_level_estimator) {
submodules_.output_level_estimator = std::make_unique<LevelEstimator>(); submodules_.output_level_estimator = std::make_unique<LevelEstimator>();
@ -931,7 +931,7 @@ void AudioProcessingImpl::HandleCaptureRuntimeSettings() {
break; break;
} }
case RuntimeSetting::Type::kCaptureFixedPostGain: { case RuntimeSetting::Type::kCaptureFixedPostGain: {
if (config_.gain_controller2.enabled) { if (submodules_.gain_controller2) {
float value; float value;
setting.GetFloat(&value); setting.GetFloat(&value);
config_.gain_controller2.fixed_digital.gain_db = value; config_.gain_controller2.fixed_digital.gain_db = value;
@ -1411,7 +1411,7 @@ int AudioProcessingImpl::ProcessCaptureStreamLocked() {
submodules_.capture_analyzer->Analyze(capture_buffer); submodules_.capture_analyzer->Analyze(capture_buffer);
} }
if (config_.gain_controller2.enabled) { if (submodules_.gain_controller2) {
submodules_.gain_controller2->NotifyAnalogLevel( submodules_.gain_controller2->NotifyAnalogLevel(
recommended_stream_analog_level()); recommended_stream_analog_level());
submodules_.gain_controller2->Process(capture_buffer); submodules_.gain_controller2->Process(capture_buffer);
@ -1761,7 +1761,7 @@ bool AudioProcessingImpl::UpdateActiveSubmoduleStates() {
config_.high_pass_filter.enabled, !!submodules_.echo_control_mobile, config_.high_pass_filter.enabled, !!submodules_.echo_control_mobile,
config_.residual_echo_detector.enabled, config_.residual_echo_detector.enabled,
!!submodules_.legacy_noise_suppressor || !!submodules_.noise_suppressor, !!submodules_.legacy_noise_suppressor || !!submodules_.noise_suppressor,
submodules_.gain_control->is_enabled(), config_.gain_controller2.enabled, submodules_.gain_control->is_enabled(), !!submodules_.gain_controller2,
config_.pre_amplifier.enabled, capture_nonlocked_.echo_controller_enabled, config_.pre_amplifier.enabled, capture_nonlocked_.echo_controller_enabled,
config_.voice_detection.enabled, !!submodules_.transient_suppressor); config_.voice_detection.enabled, !!submodules_.transient_suppressor);
} }
@ -1888,7 +1888,16 @@ void AudioProcessingImpl::InitializeEchoController() {
void AudioProcessingImpl::InitializeGainController2() { void AudioProcessingImpl::InitializeGainController2() {
if (config_.gain_controller2.enabled) { if (config_.gain_controller2.enabled) {
if (!submodules_.gain_controller2) {
// TODO(alessiob): Move the injected gain controller once injection is
// implemented.
submodules_.gain_controller2.reset(new GainController2());
}
submodules_.gain_controller2->Initialize(proc_fullband_sample_rate_hz()); submodules_.gain_controller2->Initialize(proc_fullband_sample_rate_hz());
submodules_.gain_controller2->ApplyConfig(config_.gain_controller2);
} else {
submodules_.gain_controller2.reset();
} }
} }

View File

@ -27,8 +27,11 @@ GainController2::GainController2()
new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))), new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
gain_applier_(/*hard_clip_samples=*/false, gain_applier_(/*hard_clip_samples=*/false,
/*initial_gain_factor=*/0.f), /*initial_gain_factor=*/0.f),
adaptive_agc_(new AdaptiveAgc(data_dumper_.get())), limiter_(static_cast<size_t>(48000), data_dumper_.get(), "Agc2") {
limiter_(static_cast<size_t>(48000), data_dumper_.get(), "Agc2") {} if (config_.adaptive_digital.enabled) {
adaptive_agc_.reset(new AdaptiveAgc(data_dumper_.get()));
}
}
GainController2::~GainController2() = default; GainController2::~GainController2() = default;
@ -47,14 +50,14 @@ void GainController2::Process(AudioBuffer* audio) {
audio->num_frames()); audio->num_frames());
// Apply fixed gain first, then the adaptive one. // Apply fixed gain first, then the adaptive one.
gain_applier_.ApplyGain(float_frame); gain_applier_.ApplyGain(float_frame);
if (config_.adaptive_digital.enabled) { if (adaptive_agc_) {
adaptive_agc_->Process(float_frame, limiter_.LastAudioLevel()); adaptive_agc_->Process(float_frame, limiter_.LastAudioLevel());
} }
limiter_.Process(float_frame); limiter_.Process(float_frame);
} }
void GainController2::NotifyAnalogLevel(int level) { void GainController2::NotifyAnalogLevel(int level) {
if (analog_level_ != level && config_.adaptive_digital.enabled) { if (analog_level_ != level && adaptive_agc_) {
adaptive_agc_->Reset(); adaptive_agc_->Reset();
} }
analog_level_ = level; analog_level_ = level;
@ -72,7 +75,11 @@ void GainController2::ApplyConfig(
limiter_.Reset(); limiter_.Reset();
} }
gain_applier_.SetGainFactor(DbToRatio(config_.fixed_digital.gain_db)); gain_applier_.SetGainFactor(DbToRatio(config_.fixed_digital.gain_db));
if (config_.adaptive_digital.enabled) {
adaptive_agc_.reset(new AdaptiveAgc(data_dumper_.get(), config_)); adaptive_agc_.reset(new AdaptiveAgc(data_dumper_.get(), config_));
} else {
adaptive_agc_.reset();
}
} }
bool GainController2::Validate( bool GainController2::Validate(