AGC2: SIMD allowed config flags to field trials
Bug: webrtc:7494 Change-Id: I41fa05d2ef6d969750f3d4c1e40ecbcd30293b5a Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/233741 Commit-Queue: Alessio Bazzica <alessiob@webrtc.org> Reviewed-by: Jesus de Vicente Pena <devicentepena@webrtc.org> Cr-Commit-Position: refs/heads/main@{#35144}
This commit is contained in:
parent
41bbc3df78
commit
7b80d4480e
@ -47,6 +47,7 @@ rtc_library("adaptive_digital") {
|
||||
"../../../rtc_base:rtc_base_approved",
|
||||
"../../../rtc_base:safe_compare",
|
||||
"../../../rtc_base:safe_minmax",
|
||||
"../../../system_wrappers:field_trial",
|
||||
"../../../system_wrappers:metrics",
|
||||
]
|
||||
|
||||
|
||||
@ -16,24 +16,21 @@
|
||||
#include "modules/audio_processing/logging/apm_data_dumper.h"
|
||||
#include "rtc_base/checks.h"
|
||||
#include "rtc_base/logging.h"
|
||||
#include "system_wrappers/include/field_trial.h"
|
||||
|
||||
namespace webrtc {
|
||||
namespace {
|
||||
|
||||
using AdaptiveDigitalConfig =
|
||||
AudioProcessing::Config::GainController2::AdaptiveDigital;
|
||||
|
||||
// Detects the available CPU features and applies any kill-switches.
|
||||
AvailableCpuFeatures GetAllowedCpuFeatures(
|
||||
const AdaptiveDigitalConfig& config) {
|
||||
AvailableCpuFeatures GetAllowedCpuFeatures() {
|
||||
AvailableCpuFeatures features = GetAvailableCpuFeatures();
|
||||
if (!config.sse2_allowed) {
|
||||
if (field_trial::IsEnabled("WebRTC-Agc2SimdSse2KillSwitch")) {
|
||||
features.sse2 = false;
|
||||
}
|
||||
if (!config.avx2_allowed) {
|
||||
if (field_trial::IsEnabled("WebRTC-Agc2SimdAvx2KillSwitch")) {
|
||||
features.avx2 = false;
|
||||
}
|
||||
if (!config.neon_allowed) {
|
||||
if (field_trial::IsEnabled("WebRTC-Agc2SimdNeonKillSwitch")) {
|
||||
features.neon = false;
|
||||
}
|
||||
return features;
|
||||
@ -41,10 +38,11 @@ AvailableCpuFeatures GetAllowedCpuFeatures(
|
||||
|
||||
} // namespace
|
||||
|
||||
AdaptiveAgc::AdaptiveAgc(ApmDataDumper* apm_data_dumper,
|
||||
const AdaptiveDigitalConfig& config)
|
||||
AdaptiveAgc::AdaptiveAgc(
|
||||
ApmDataDumper* apm_data_dumper,
|
||||
const AudioProcessing::Config::GainController2::AdaptiveDigital& config)
|
||||
: speech_level_estimator_(apm_data_dumper, config),
|
||||
vad_(config.vad_reset_period_ms, GetAllowedCpuFeatures(config)),
|
||||
vad_(config.vad_reset_period_ms, GetAllowedCpuFeatures()),
|
||||
gain_controller_(apm_data_dumper, config),
|
||||
apm_data_dumper_(apm_data_dumper),
|
||||
noise_level_estimator_(CreateNoiseFloorEstimator(apm_data_dumper)),
|
||||
|
||||
@ -3137,18 +3137,6 @@ TEST(AudioProcessing, GainController2ConfigEqual) {
|
||||
b_adaptive.max_output_noise_level_dbfs =
|
||||
a_adaptive.max_output_noise_level_dbfs;
|
||||
EXPECT_EQ(a, b);
|
||||
|
||||
Toggle(a_adaptive.sse2_allowed);
|
||||
b_adaptive.sse2_allowed = a_adaptive.sse2_allowed;
|
||||
EXPECT_EQ(a, b);
|
||||
|
||||
Toggle(a_adaptive.avx2_allowed);
|
||||
b_adaptive.avx2_allowed = a_adaptive.avx2_allowed;
|
||||
EXPECT_EQ(a, b);
|
||||
|
||||
Toggle(a_adaptive.neon_allowed);
|
||||
b_adaptive.neon_allowed = a_adaptive.neon_allowed;
|
||||
EXPECT_EQ(a, b);
|
||||
}
|
||||
|
||||
// Checks that one differing parameter is sufficient to make two configs
|
||||
@ -3203,18 +3191,6 @@ TEST(AudioProcessing, GainController2ConfigNotEqual) {
|
||||
a_adaptive.max_output_noise_level_dbfs += 1.0f;
|
||||
EXPECT_NE(a, b);
|
||||
a_adaptive = b_adaptive;
|
||||
|
||||
Toggle(a_adaptive.sse2_allowed);
|
||||
EXPECT_NE(a, b);
|
||||
a_adaptive = b_adaptive;
|
||||
|
||||
Toggle(a_adaptive.avx2_allowed);
|
||||
EXPECT_NE(a, b);
|
||||
a_adaptive = b_adaptive;
|
||||
|
||||
Toggle(a_adaptive.neon_allowed);
|
||||
EXPECT_NE(a, b);
|
||||
a_adaptive = b_adaptive;
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
@ -96,9 +96,7 @@ bool Agc2Config::AdaptiveDigital::operator==(
|
||||
adjacent_speech_frames_threshold ==
|
||||
rhs.adjacent_speech_frames_threshold &&
|
||||
max_gain_change_db_per_second == rhs.max_gain_change_db_per_second &&
|
||||
max_output_noise_level_dbfs == rhs.max_output_noise_level_dbfs &&
|
||||
sse2_allowed == rhs.sse2_allowed && avx2_allowed == rhs.avx2_allowed &&
|
||||
neon_allowed == rhs.neon_allowed;
|
||||
max_output_noise_level_dbfs == rhs.max_output_noise_level_dbfs;
|
||||
}
|
||||
|
||||
bool Agc2Config::operator==(const Agc2Config& rhs) const {
|
||||
@ -123,101 +121,98 @@ operator==(const AudioProcessing::Config::CaptureLevelAdjustment::
|
||||
std::string AudioProcessing::Config::ToString() const {
|
||||
char buf[2048];
|
||||
rtc::SimpleStringBuilder builder(buf);
|
||||
builder
|
||||
<< "AudioProcessing::Config{ "
|
||||
"pipeline: { "
|
||||
"maximum_internal_processing_rate: "
|
||||
<< pipeline.maximum_internal_processing_rate
|
||||
<< ", multi_channel_render: " << pipeline.multi_channel_render
|
||||
<< ", multi_channel_capture: " << pipeline.multi_channel_capture
|
||||
<< " }, pre_amplifier: { enabled: " << pre_amplifier.enabled
|
||||
<< ", fixed_gain_factor: " << pre_amplifier.fixed_gain_factor
|
||||
<< " },capture_level_adjustment: { enabled: "
|
||||
<< capture_level_adjustment.enabled
|
||||
<< ", pre_gain_factor: " << capture_level_adjustment.pre_gain_factor
|
||||
<< ", post_gain_factor: " << capture_level_adjustment.post_gain_factor
|
||||
<< ", analog_mic_gain_emulation: { enabled: "
|
||||
<< capture_level_adjustment.analog_mic_gain_emulation.enabled
|
||||
<< ", initial_level: "
|
||||
<< capture_level_adjustment.analog_mic_gain_emulation.initial_level
|
||||
<< " }}, high_pass_filter: { enabled: " << high_pass_filter.enabled
|
||||
<< " }, echo_canceller: { enabled: " << echo_canceller.enabled
|
||||
<< ", mobile_mode: " << echo_canceller.mobile_mode
|
||||
<< ", enforce_high_pass_filtering: "
|
||||
<< echo_canceller.enforce_high_pass_filtering
|
||||
<< " }, noise_suppression: { enabled: " << noise_suppression.enabled
|
||||
<< ", level: " << NoiseSuppressionLevelToString(noise_suppression.level)
|
||||
<< " }, transient_suppression: { enabled: "
|
||||
<< transient_suppression.enabled
|
||||
<< " }, voice_detection: { enabled: " << voice_detection.enabled
|
||||
<< " }, gain_controller1: { enabled: " << gain_controller1.enabled
|
||||
<< ", mode: " << GainController1ModeToString(gain_controller1.mode)
|
||||
<< ", target_level_dbfs: " << gain_controller1.target_level_dbfs
|
||||
<< ", compression_gain_db: " << gain_controller1.compression_gain_db
|
||||
<< ", enable_limiter: " << gain_controller1.enable_limiter
|
||||
<< ", analog_level_minimum: " << gain_controller1.analog_level_minimum
|
||||
<< ", analog_level_maximum: " << gain_controller1.analog_level_maximum
|
||||
<< ", analog_gain_controller { enabled: "
|
||||
<< gain_controller1.analog_gain_controller.enabled
|
||||
<< ", startup_min_volume: "
|
||||
<< gain_controller1.analog_gain_controller.startup_min_volume
|
||||
<< ", clipped_level_min: "
|
||||
<< gain_controller1.analog_gain_controller.clipped_level_min
|
||||
<< ", enable_digital_adaptive: "
|
||||
<< gain_controller1.analog_gain_controller.enable_digital_adaptive
|
||||
<< ", clipped_level_step: "
|
||||
<< gain_controller1.analog_gain_controller.clipped_level_step
|
||||
<< ", clipped_ratio_threshold: "
|
||||
<< gain_controller1.analog_gain_controller.clipped_ratio_threshold
|
||||
<< ", clipped_wait_frames: "
|
||||
<< gain_controller1.analog_gain_controller.clipped_wait_frames
|
||||
<< ", clipping_predictor: { enabled: "
|
||||
<< gain_controller1.analog_gain_controller.clipping_predictor.enabled
|
||||
<< ", mode: "
|
||||
<< gain_controller1.analog_gain_controller.clipping_predictor.mode
|
||||
<< ", window_length: "
|
||||
<< gain_controller1.analog_gain_controller.clipping_predictor
|
||||
.window_length
|
||||
<< ", reference_window_length: "
|
||||
<< gain_controller1.analog_gain_controller.clipping_predictor
|
||||
.reference_window_length
|
||||
<< ", reference_window_delay: "
|
||||
<< gain_controller1.analog_gain_controller.clipping_predictor
|
||||
.reference_window_delay
|
||||
<< ", clipping_threshold: "
|
||||
<< gain_controller1.analog_gain_controller.clipping_predictor
|
||||
.clipping_threshold
|
||||
<< ", crest_factor_margin: "
|
||||
<< gain_controller1.analog_gain_controller.clipping_predictor
|
||||
.crest_factor_margin
|
||||
<< ", use_predicted_step: "
|
||||
<< gain_controller1.analog_gain_controller.clipping_predictor
|
||||
.use_predicted_step
|
||||
<< " }}}, gain_controller2: { enabled: " << gain_controller2.enabled
|
||||
<< ", fixed_digital: { gain_db: "
|
||||
<< gain_controller2.fixed_digital.gain_db
|
||||
<< " }, adaptive_digital: { enabled: "
|
||||
<< gain_controller2.adaptive_digital.enabled
|
||||
<< ", dry_run: " << gain_controller2.adaptive_digital.dry_run
|
||||
<< ", headroom_db: " << gain_controller2.adaptive_digital.headroom_db
|
||||
<< ", max_gain_db: " << gain_controller2.adaptive_digital.max_gain_db
|
||||
<< ", initial_gain_db: "
|
||||
<< gain_controller2.adaptive_digital.initial_gain_db
|
||||
<< ", vad_reset_period_ms: "
|
||||
<< gain_controller2.adaptive_digital.vad_reset_period_ms
|
||||
<< ", adjacent_speech_frames_threshold: "
|
||||
<< gain_controller2.adaptive_digital.adjacent_speech_frames_threshold
|
||||
<< ", max_gain_change_db_per_second: "
|
||||
<< gain_controller2.adaptive_digital.max_gain_change_db_per_second
|
||||
<< ", max_output_noise_level_dbfs: "
|
||||
<< gain_controller2.adaptive_digital.max_output_noise_level_dbfs
|
||||
<< ", sse2_allowed: " << gain_controller2.adaptive_digital.sse2_allowed
|
||||
<< ", avx2_allowed: " << gain_controller2.adaptive_digital.avx2_allowed
|
||||
<< ", neon_allowed: " << gain_controller2.adaptive_digital.neon_allowed
|
||||
<< "}}, residual_echo_detector: { enabled: "
|
||||
<< residual_echo_detector.enabled
|
||||
<< " }, level_estimation: { enabled: " << level_estimation.enabled
|
||||
<< " }}";
|
||||
builder << "AudioProcessing::Config{ "
|
||||
"pipeline: { "
|
||||
"maximum_internal_processing_rate: "
|
||||
<< pipeline.maximum_internal_processing_rate
|
||||
<< ", multi_channel_render: " << pipeline.multi_channel_render
|
||||
<< ", multi_channel_capture: " << pipeline.multi_channel_capture
|
||||
<< " }, pre_amplifier: { enabled: " << pre_amplifier.enabled
|
||||
<< ", fixed_gain_factor: " << pre_amplifier.fixed_gain_factor
|
||||
<< " },capture_level_adjustment: { enabled: "
|
||||
<< capture_level_adjustment.enabled
|
||||
<< ", pre_gain_factor: " << capture_level_adjustment.pre_gain_factor
|
||||
<< ", post_gain_factor: " << capture_level_adjustment.post_gain_factor
|
||||
<< ", analog_mic_gain_emulation: { enabled: "
|
||||
<< capture_level_adjustment.analog_mic_gain_emulation.enabled
|
||||
<< ", initial_level: "
|
||||
<< capture_level_adjustment.analog_mic_gain_emulation.initial_level
|
||||
<< " }}, high_pass_filter: { enabled: " << high_pass_filter.enabled
|
||||
<< " }, echo_canceller: { enabled: " << echo_canceller.enabled
|
||||
<< ", mobile_mode: " << echo_canceller.mobile_mode
|
||||
<< ", enforce_high_pass_filtering: "
|
||||
<< echo_canceller.enforce_high_pass_filtering
|
||||
<< " }, noise_suppression: { enabled: " << noise_suppression.enabled
|
||||
<< ", level: "
|
||||
<< NoiseSuppressionLevelToString(noise_suppression.level)
|
||||
<< " }, transient_suppression: { enabled: "
|
||||
<< transient_suppression.enabled
|
||||
<< " }, voice_detection: { enabled: " << voice_detection.enabled
|
||||
<< " }, gain_controller1: { enabled: " << gain_controller1.enabled
|
||||
<< ", mode: " << GainController1ModeToString(gain_controller1.mode)
|
||||
<< ", target_level_dbfs: " << gain_controller1.target_level_dbfs
|
||||
<< ", compression_gain_db: " << gain_controller1.compression_gain_db
|
||||
<< ", enable_limiter: " << gain_controller1.enable_limiter
|
||||
<< ", analog_level_minimum: " << gain_controller1.analog_level_minimum
|
||||
<< ", analog_level_maximum: " << gain_controller1.analog_level_maximum
|
||||
<< ", analog_gain_controller { enabled: "
|
||||
<< gain_controller1.analog_gain_controller.enabled
|
||||
<< ", startup_min_volume: "
|
||||
<< gain_controller1.analog_gain_controller.startup_min_volume
|
||||
<< ", clipped_level_min: "
|
||||
<< gain_controller1.analog_gain_controller.clipped_level_min
|
||||
<< ", enable_digital_adaptive: "
|
||||
<< gain_controller1.analog_gain_controller.enable_digital_adaptive
|
||||
<< ", clipped_level_step: "
|
||||
<< gain_controller1.analog_gain_controller.clipped_level_step
|
||||
<< ", clipped_ratio_threshold: "
|
||||
<< gain_controller1.analog_gain_controller.clipped_ratio_threshold
|
||||
<< ", clipped_wait_frames: "
|
||||
<< gain_controller1.analog_gain_controller.clipped_wait_frames
|
||||
<< ", clipping_predictor: { enabled: "
|
||||
<< gain_controller1.analog_gain_controller.clipping_predictor.enabled
|
||||
<< ", mode: "
|
||||
<< gain_controller1.analog_gain_controller.clipping_predictor.mode
|
||||
<< ", window_length: "
|
||||
<< gain_controller1.analog_gain_controller.clipping_predictor
|
||||
.window_length
|
||||
<< ", reference_window_length: "
|
||||
<< gain_controller1.analog_gain_controller.clipping_predictor
|
||||
.reference_window_length
|
||||
<< ", reference_window_delay: "
|
||||
<< gain_controller1.analog_gain_controller.clipping_predictor
|
||||
.reference_window_delay
|
||||
<< ", clipping_threshold: "
|
||||
<< gain_controller1.analog_gain_controller.clipping_predictor
|
||||
.clipping_threshold
|
||||
<< ", crest_factor_margin: "
|
||||
<< gain_controller1.analog_gain_controller.clipping_predictor
|
||||
.crest_factor_margin
|
||||
<< ", use_predicted_step: "
|
||||
<< gain_controller1.analog_gain_controller.clipping_predictor
|
||||
.use_predicted_step
|
||||
<< " }}}, gain_controller2: { enabled: " << gain_controller2.enabled
|
||||
<< ", fixed_digital: { gain_db: "
|
||||
<< gain_controller2.fixed_digital.gain_db
|
||||
<< " }, adaptive_digital: { enabled: "
|
||||
<< gain_controller2.adaptive_digital.enabled
|
||||
<< ", dry_run: " << gain_controller2.adaptive_digital.dry_run
|
||||
<< ", headroom_db: " << gain_controller2.adaptive_digital.headroom_db
|
||||
<< ", max_gain_db: " << gain_controller2.adaptive_digital.max_gain_db
|
||||
<< ", initial_gain_db: "
|
||||
<< gain_controller2.adaptive_digital.initial_gain_db
|
||||
<< ", vad_reset_period_ms: "
|
||||
<< gain_controller2.adaptive_digital.vad_reset_period_ms
|
||||
<< ", adjacent_speech_frames_threshold: "
|
||||
<< gain_controller2.adaptive_digital.adjacent_speech_frames_threshold
|
||||
<< ", max_gain_change_db_per_second: "
|
||||
<< gain_controller2.adaptive_digital.max_gain_change_db_per_second
|
||||
<< ", max_output_noise_level_dbfs: "
|
||||
<< gain_controller2.adaptive_digital.max_output_noise_level_dbfs
|
||||
<< "}}, residual_echo_detector: { enabled: "
|
||||
<< residual_echo_detector.enabled
|
||||
<< " }, level_estimation: { enabled: " << level_estimation.enabled
|
||||
<< " }}";
|
||||
return builder.str();
|
||||
}
|
||||
|
||||
|
||||
@ -379,10 +379,6 @@ class RTC_EXPORT AudioProcessing : public rtc::RefCountInterface {
|
||||
int adjacent_speech_frames_threshold = 12;
|
||||
float max_gain_change_db_per_second = 3.0f;
|
||||
float max_output_noise_level_dbfs = -50.0f;
|
||||
// TODO(bugs.webrtc.org/7494): Replace with field trials.
|
||||
bool sse2_allowed = true;
|
||||
bool avx2_allowed = true;
|
||||
bool neon_allowed = true;
|
||||
} adaptive_digital;
|
||||
} gain_controller2;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user