Switch to injected field trials in GainController2

Bug: webrtc:369904700
Change-Id: I28dc43ffe4f1edaf55a5be05371618cbb76d0709
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/371660
Reviewed-by: Sam Zackrisson <saza@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#43596}
This commit is contained in:
Danil Chapovalov 2024-12-16 12:44:11 +01:00 committed by WebRTC LUCI CQ
parent ac40185001
commit 8da0652263
6 changed files with 48 additions and 28 deletions

View File

@ -108,13 +108,14 @@ rtc_library("gain_controller2") {
":apm_logging",
":audio_buffer",
":audio_frame_view",
"../../api:field_trials_view",
"../../api/audio:audio_frame_api",
"../../api/audio:audio_processing",
"../../api/environment",
"../../common_audio",
"../../rtc_base:checks",
"../../rtc_base:logging",
"../../rtc_base:stringutils",
"../../system_wrappers:field_trial",
"agc2:adaptive_digital_gain_controller",
"agc2:common",
"agc2:cpu_features",

View File

@ -431,7 +431,8 @@ AudioProcessingImpl::AudioProcessingImpl(
std::unique_ptr<EchoControlFactory> echo_control_factory,
rtc::scoped_refptr<EchoDetector> echo_detector,
std::unique_ptr<CustomAudioAnalyzer> capture_analyzer)
: data_dumper_(new ApmDataDumper(instance_count_.fetch_add(1) + 1)),
: env_(env),
data_dumper_(new ApmDataDumper(instance_count_.fetch_add(1) + 1)),
use_setup_specific_default_aec3_config_(
UseSetupSpecificDefaultAec3Congfig(env.field_trials())),
capture_runtime_settings_(RuntimeSettingQueueSize()),
@ -2038,7 +2039,7 @@ void AudioProcessingImpl::InitializeGainController2() {
const InputVolumeController::Config input_volume_controller_config =
InputVolumeController::Config{};
submodules_.gain_controller2 = std::make_unique<GainController2>(
config_.gain_controller2, input_volume_controller_config,
env_, config_.gain_controller2, input_volume_controller_config,
proc_fullband_sample_rate_hz(), num_output_channels(),
/*use_internal_vad=*/true);
submodules_.gain_controller2->SetCaptureOutputUsed(

View File

@ -178,6 +178,7 @@ class AudioProcessingImpl : public AudioProcessing {
SwapQueue<RuntimeSetting>& runtime_settings_;
};
const Environment env_;
const std::unique_ptr<ApmDataDumper> data_dumper_;
static std::atomic<int> instance_count_;
const bool use_setup_specific_default_aec3_config_;

View File

@ -14,6 +14,8 @@
#include <utility>
#include "api/audio/audio_frame.h"
#include "api/environment/environment.h"
#include "api/field_trials_view.h"
#include "common_audio/include/audio_util.h"
#include "modules/audio_processing/agc2/agc2_common.h"
#include "modules/audio_processing/agc2/cpu_features.h"
@ -23,7 +25,6 @@
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
#include "rtc_base/strings/string_builder.h"
#include "system_wrappers/include/field_trial.h"
namespace webrtc {
namespace {
@ -37,15 +38,16 @@ constexpr int kLogLimiterStatsPeriodNumFrames =
kLogLimiterStatsPeriodMs / kFrameLengthMs;
// Detects the available CPU features and applies any kill-switches.
AvailableCpuFeatures GetAllowedCpuFeatures() {
AvailableCpuFeatures GetAllowedCpuFeatures(
const FieldTrialsView& field_trials) {
AvailableCpuFeatures features = GetAvailableCpuFeatures();
if (field_trial::IsEnabled("WebRTC-Agc2SimdSse2KillSwitch")) {
if (field_trials.IsEnabled("WebRTC-Agc2SimdSse2KillSwitch")) {
features.sse2 = false;
}
if (field_trial::IsEnabled("WebRTC-Agc2SimdAvx2KillSwitch")) {
if (field_trials.IsEnabled("WebRTC-Agc2SimdAvx2KillSwitch")) {
features.avx2 = false;
}
if (field_trial::IsEnabled("WebRTC-Agc2SimdNeonKillSwitch")) {
if (field_trials.IsEnabled("WebRTC-Agc2SimdNeonKillSwitch")) {
features.neon = false;
}
return features;
@ -85,12 +87,13 @@ AudioLevels ComputeAudioLevels(DeinterleavedView<float> frame,
std::atomic<int> GainController2::instance_count_(0);
GainController2::GainController2(
const Environment& env,
const Agc2Config& config,
const InputVolumeControllerConfig& input_volume_controller_config,
int sample_rate_hz,
int num_channels,
bool use_internal_vad)
: cpu_features_(GetAllowedCpuFeatures()),
: cpu_features_(GetAllowedCpuFeatures(env.field_trials())),
data_dumper_(instance_count_.fetch_add(1) + 1),
fixed_gain_applier_(
/*hard_clip_samples=*/false,

View File

@ -16,6 +16,7 @@
#include <string>
#include "api/audio/audio_processing.h"
#include "api/environment/environment.h"
#include "modules/audio_processing/agc2/adaptive_digital_gain_controller.h"
#include "modules/audio_processing/agc2/cpu_features.h"
#include "modules/audio_processing/agc2/gain_applier.h"
@ -38,6 +39,7 @@ class GainController2 {
// Ctor. If `use_internal_vad` is true, an internal voice activity
// detector is used for digital adaptive gain.
GainController2(
const Environment& env,
const AudioProcessing::Config::GainController2& config,
const InputVolumeController::Config& input_volume_controller_config,
int sample_rate_hz,

View File

@ -16,6 +16,8 @@
#include <numeric>
#include <tuple>
#include "api/environment/environment.h"
#include "api/environment/environment_factory.h"
#include "modules/audio_processing/agc2/agc2_testing_common.h"
#include "modules/audio_processing/audio_buffer.h"
#include "modules/audio_processing/test/audio_buffer_tools.h"
@ -72,10 +74,11 @@ std::unique_ptr<GainController2> CreateAgc2FixedDigitalMode(
config.adaptive_digital.enabled = false;
config.fixed_digital.gain_db = fixed_gain_db;
EXPECT_TRUE(GainController2::Validate(config));
return std::make_unique<GainController2>(
config, InputVolumeControllerConfig{}, sample_rate_hz,
/*num_channels=*/1,
/*use_internal_vad=*/true);
return std::make_unique<GainController2>(CreateEnvironment(), config,
InputVolumeControllerConfig{},
sample_rate_hz,
/*num_channels=*/1,
/*use_internal_vad=*/true);
}
constexpr InputVolumeControllerConfig kTestInputVolumeControllerConfig{
@ -174,7 +177,8 @@ TEST(GainController2,
config.input_volume_controller.enabled = false;
auto gain_controller = std::make_unique<GainController2>(
config, InputVolumeControllerConfig{}, kSampleRateHz, kNumChannels,
CreateEnvironment(), config, InputVolumeControllerConfig{}, kSampleRateHz,
kNumChannels,
/*use_internal_vad=*/true);
EXPECT_FALSE(gain_controller->recommended_input_volume().has_value());
@ -206,7 +210,8 @@ TEST(
config.input_volume_controller.enabled = false;
auto gain_controller = std::make_unique<GainController2>(
config, kTestInputVolumeControllerConfig, kSampleRateHz, kNumChannels,
CreateEnvironment(), config, kTestInputVolumeControllerConfig,
kSampleRateHz, kNumChannels,
/*use_internal_vad=*/true);
EXPECT_FALSE(gain_controller->recommended_input_volume().has_value());
@ -238,7 +243,8 @@ TEST(GainController2,
config.adaptive_digital.enabled = true;
auto gain_controller = std::make_unique<GainController2>(
config, InputVolumeControllerConfig{}, kSampleRateHz, kNumChannels,
CreateEnvironment(), config, InputVolumeControllerConfig{}, kSampleRateHz,
kNumChannels,
/*use_internal_vad=*/true);
EXPECT_FALSE(gain_controller->recommended_input_volume().has_value());
@ -271,7 +277,8 @@ TEST(
config.adaptive_digital.enabled = true;
auto gain_controller = std::make_unique<GainController2>(
config, kTestInputVolumeControllerConfig, kSampleRateHz, kNumChannels,
CreateEnvironment(), config, kTestInputVolumeControllerConfig,
kSampleRateHz, kNumChannels,
/*use_internal_vad=*/true);
EXPECT_FALSE(gain_controller->recommended_input_volume().has_value());
@ -292,7 +299,7 @@ TEST(
// Checks that the default config is applied.
TEST(GainController2, ApplyDefaultConfig) {
auto gain_controller2 = std::make_unique<GainController2>(
Agc2Config{}, InputVolumeControllerConfig{},
CreateEnvironment(), Agc2Config{}, InputVolumeControllerConfig{},
/*sample_rate_hz=*/16000, /*num_channels=*/2,
/*use_internal_vad=*/true);
EXPECT_TRUE(gain_controller2.get());
@ -409,8 +416,9 @@ TEST(GainController2, CheckFinalGainWithAdaptiveDigitalController) {
Agc2Config config;
config.fixed_digital.gain_db = 0.0f;
config.adaptive_digital.enabled = true;
GainController2 agc2(config, /*input_volume_controller_config=*/{},
kSampleRateHz, kStereo,
GainController2 agc2(CreateEnvironment(), config,
/*input_volume_controller_config=*/{}, kSampleRateHz,
kStereo,
/*use_internal_vad=*/true);
test::InputAudioFile input_file(
@ -464,10 +472,10 @@ TEST(GainController2DeathTest,
AudioBuffer audio_buffer(kSampleRateHz, kStereo, kSampleRateHz, kStereo,
kSampleRateHz, kStereo);
// Create AGC2 so that the interval VAD is also created.
GainController2 agc2(/*config=*/{.adaptive_digital = {.enabled = true}},
/*input_volume_controller_config=*/{}, kSampleRateHz,
kStereo,
/*use_internal_vad=*/true);
GainController2 agc2(
CreateEnvironment(), /*config=*/{.adaptive_digital = {.enabled = true}},
/*input_volume_controller_config=*/{}, kSampleRateHz, kStereo,
/*use_internal_vad=*/true);
EXPECT_DEATH(agc2.Process(/*speech_probability=*/0.123f,
/*input_volume_changed=*/false, &audio_buffer),
@ -483,13 +491,15 @@ TEST(GainController2,
constexpr int kStereo = 2;
// Create AGC2 enabling only the adaptive digital controller.
const Environment env = CreateEnvironment();
Agc2Config config;
config.fixed_digital.gain_db = 0.0f;
config.adaptive_digital.enabled = true;
GainController2 agc2(config, /*input_volume_controller_config=*/{},
GainController2 agc2(env, config, /*input_volume_controller_config=*/{},
kSampleRateHz, kStereo,
/*use_internal_vad=*/false);
GainController2 agc2_reference(config, /*input_volume_controller_config=*/{},
GainController2 agc2_reference(env, config,
/*input_volume_controller_config=*/{},
kSampleRateHz, kStereo,
/*use_internal_vad=*/true);
@ -554,13 +564,15 @@ TEST(GainController2,
constexpr int kStereo = 2;
// Create AGC2 enabling only the adaptive digital controller.
const Environment env = CreateEnvironment();
Agc2Config config;
config.fixed_digital.gain_db = 0.0f;
config.adaptive_digital.enabled = true;
GainController2 agc2(config, /*input_volume_controller_config=*/{},
GainController2 agc2(env, config, /*input_volume_controller_config=*/{},
kSampleRateHz, kStereo,
/*use_internal_vad=*/false);
GainController2 agc2_reference(config, /*input_volume_controller_config=*/{},
GainController2 agc2_reference(env, config,
/*input_volume_controller_config=*/{},
kSampleRateHz, kStereo,
/*use_internal_vad=*/true);
VoiceActivityDetectorWrapper vad(GetAvailableCpuFeatures(), kSampleRateHz);