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:
parent
ac40185001
commit
8da0652263
@ -108,13 +108,14 @@ rtc_library("gain_controller2") {
|
|||||||
":apm_logging",
|
":apm_logging",
|
||||||
":audio_buffer",
|
":audio_buffer",
|
||||||
":audio_frame_view",
|
":audio_frame_view",
|
||||||
|
"../../api:field_trials_view",
|
||||||
"../../api/audio:audio_frame_api",
|
"../../api/audio:audio_frame_api",
|
||||||
"../../api/audio:audio_processing",
|
"../../api/audio:audio_processing",
|
||||||
|
"../../api/environment",
|
||||||
"../../common_audio",
|
"../../common_audio",
|
||||||
"../../rtc_base:checks",
|
"../../rtc_base:checks",
|
||||||
"../../rtc_base:logging",
|
"../../rtc_base:logging",
|
||||||
"../../rtc_base:stringutils",
|
"../../rtc_base:stringutils",
|
||||||
"../../system_wrappers:field_trial",
|
|
||||||
"agc2:adaptive_digital_gain_controller",
|
"agc2:adaptive_digital_gain_controller",
|
||||||
"agc2:common",
|
"agc2:common",
|
||||||
"agc2:cpu_features",
|
"agc2:cpu_features",
|
||||||
|
|||||||
@ -431,7 +431,8 @@ AudioProcessingImpl::AudioProcessingImpl(
|
|||||||
std::unique_ptr<EchoControlFactory> echo_control_factory,
|
std::unique_ptr<EchoControlFactory> echo_control_factory,
|
||||||
rtc::scoped_refptr<EchoDetector> echo_detector,
|
rtc::scoped_refptr<EchoDetector> echo_detector,
|
||||||
std::unique_ptr<CustomAudioAnalyzer> capture_analyzer)
|
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_(
|
use_setup_specific_default_aec3_config_(
|
||||||
UseSetupSpecificDefaultAec3Congfig(env.field_trials())),
|
UseSetupSpecificDefaultAec3Congfig(env.field_trials())),
|
||||||
capture_runtime_settings_(RuntimeSettingQueueSize()),
|
capture_runtime_settings_(RuntimeSettingQueueSize()),
|
||||||
@ -2038,7 +2039,7 @@ void AudioProcessingImpl::InitializeGainController2() {
|
|||||||
const InputVolumeController::Config input_volume_controller_config =
|
const InputVolumeController::Config input_volume_controller_config =
|
||||||
InputVolumeController::Config{};
|
InputVolumeController::Config{};
|
||||||
submodules_.gain_controller2 = std::make_unique<GainController2>(
|
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(),
|
proc_fullband_sample_rate_hz(), num_output_channels(),
|
||||||
/*use_internal_vad=*/true);
|
/*use_internal_vad=*/true);
|
||||||
submodules_.gain_controller2->SetCaptureOutputUsed(
|
submodules_.gain_controller2->SetCaptureOutputUsed(
|
||||||
|
|||||||
@ -178,6 +178,7 @@ class AudioProcessingImpl : public AudioProcessing {
|
|||||||
SwapQueue<RuntimeSetting>& runtime_settings_;
|
SwapQueue<RuntimeSetting>& runtime_settings_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const Environment env_;
|
||||||
const std::unique_ptr<ApmDataDumper> data_dumper_;
|
const std::unique_ptr<ApmDataDumper> data_dumper_;
|
||||||
static std::atomic<int> instance_count_;
|
static std::atomic<int> instance_count_;
|
||||||
const bool use_setup_specific_default_aec3_config_;
|
const bool use_setup_specific_default_aec3_config_;
|
||||||
|
|||||||
@ -14,6 +14,8 @@
|
|||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#include "api/audio/audio_frame.h"
|
#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 "common_audio/include/audio_util.h"
|
||||||
#include "modules/audio_processing/agc2/agc2_common.h"
|
#include "modules/audio_processing/agc2/agc2_common.h"
|
||||||
#include "modules/audio_processing/agc2/cpu_features.h"
|
#include "modules/audio_processing/agc2/cpu_features.h"
|
||||||
@ -23,7 +25,6 @@
|
|||||||
#include "rtc_base/checks.h"
|
#include "rtc_base/checks.h"
|
||||||
#include "rtc_base/logging.h"
|
#include "rtc_base/logging.h"
|
||||||
#include "rtc_base/strings/string_builder.h"
|
#include "rtc_base/strings/string_builder.h"
|
||||||
#include "system_wrappers/include/field_trial.h"
|
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
namespace {
|
namespace {
|
||||||
@ -37,15 +38,16 @@ constexpr int kLogLimiterStatsPeriodNumFrames =
|
|||||||
kLogLimiterStatsPeriodMs / kFrameLengthMs;
|
kLogLimiterStatsPeriodMs / kFrameLengthMs;
|
||||||
|
|
||||||
// Detects the available CPU features and applies any kill-switches.
|
// Detects the available CPU features and applies any kill-switches.
|
||||||
AvailableCpuFeatures GetAllowedCpuFeatures() {
|
AvailableCpuFeatures GetAllowedCpuFeatures(
|
||||||
|
const FieldTrialsView& field_trials) {
|
||||||
AvailableCpuFeatures features = GetAvailableCpuFeatures();
|
AvailableCpuFeatures features = GetAvailableCpuFeatures();
|
||||||
if (field_trial::IsEnabled("WebRTC-Agc2SimdSse2KillSwitch")) {
|
if (field_trials.IsEnabled("WebRTC-Agc2SimdSse2KillSwitch")) {
|
||||||
features.sse2 = false;
|
features.sse2 = false;
|
||||||
}
|
}
|
||||||
if (field_trial::IsEnabled("WebRTC-Agc2SimdAvx2KillSwitch")) {
|
if (field_trials.IsEnabled("WebRTC-Agc2SimdAvx2KillSwitch")) {
|
||||||
features.avx2 = false;
|
features.avx2 = false;
|
||||||
}
|
}
|
||||||
if (field_trial::IsEnabled("WebRTC-Agc2SimdNeonKillSwitch")) {
|
if (field_trials.IsEnabled("WebRTC-Agc2SimdNeonKillSwitch")) {
|
||||||
features.neon = false;
|
features.neon = false;
|
||||||
}
|
}
|
||||||
return features;
|
return features;
|
||||||
@ -85,12 +87,13 @@ AudioLevels ComputeAudioLevels(DeinterleavedView<float> frame,
|
|||||||
std::atomic<int> GainController2::instance_count_(0);
|
std::atomic<int> GainController2::instance_count_(0);
|
||||||
|
|
||||||
GainController2::GainController2(
|
GainController2::GainController2(
|
||||||
|
const Environment& env,
|
||||||
const Agc2Config& config,
|
const Agc2Config& config,
|
||||||
const InputVolumeControllerConfig& input_volume_controller_config,
|
const InputVolumeControllerConfig& input_volume_controller_config,
|
||||||
int sample_rate_hz,
|
int sample_rate_hz,
|
||||||
int num_channels,
|
int num_channels,
|
||||||
bool use_internal_vad)
|
bool use_internal_vad)
|
||||||
: cpu_features_(GetAllowedCpuFeatures()),
|
: cpu_features_(GetAllowedCpuFeatures(env.field_trials())),
|
||||||
data_dumper_(instance_count_.fetch_add(1) + 1),
|
data_dumper_(instance_count_.fetch_add(1) + 1),
|
||||||
fixed_gain_applier_(
|
fixed_gain_applier_(
|
||||||
/*hard_clip_samples=*/false,
|
/*hard_clip_samples=*/false,
|
||||||
|
|||||||
@ -16,6 +16,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "api/audio/audio_processing.h"
|
#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/adaptive_digital_gain_controller.h"
|
||||||
#include "modules/audio_processing/agc2/cpu_features.h"
|
#include "modules/audio_processing/agc2/cpu_features.h"
|
||||||
#include "modules/audio_processing/agc2/gain_applier.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
|
// Ctor. If `use_internal_vad` is true, an internal voice activity
|
||||||
// detector is used for digital adaptive gain.
|
// detector is used for digital adaptive gain.
|
||||||
GainController2(
|
GainController2(
|
||||||
|
const Environment& env,
|
||||||
const AudioProcessing::Config::GainController2& config,
|
const AudioProcessing::Config::GainController2& config,
|
||||||
const InputVolumeController::Config& input_volume_controller_config,
|
const InputVolumeController::Config& input_volume_controller_config,
|
||||||
int sample_rate_hz,
|
int sample_rate_hz,
|
||||||
|
|||||||
@ -16,6 +16,8 @@
|
|||||||
#include <numeric>
|
#include <numeric>
|
||||||
#include <tuple>
|
#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/agc2/agc2_testing_common.h"
|
||||||
#include "modules/audio_processing/audio_buffer.h"
|
#include "modules/audio_processing/audio_buffer.h"
|
||||||
#include "modules/audio_processing/test/audio_buffer_tools.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.adaptive_digital.enabled = false;
|
||||||
config.fixed_digital.gain_db = fixed_gain_db;
|
config.fixed_digital.gain_db = fixed_gain_db;
|
||||||
EXPECT_TRUE(GainController2::Validate(config));
|
EXPECT_TRUE(GainController2::Validate(config));
|
||||||
return std::make_unique<GainController2>(
|
return std::make_unique<GainController2>(CreateEnvironment(), config,
|
||||||
config, InputVolumeControllerConfig{}, sample_rate_hz,
|
InputVolumeControllerConfig{},
|
||||||
/*num_channels=*/1,
|
sample_rate_hz,
|
||||||
/*use_internal_vad=*/true);
|
/*num_channels=*/1,
|
||||||
|
/*use_internal_vad=*/true);
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr InputVolumeControllerConfig kTestInputVolumeControllerConfig{
|
constexpr InputVolumeControllerConfig kTestInputVolumeControllerConfig{
|
||||||
@ -174,7 +177,8 @@ TEST(GainController2,
|
|||||||
config.input_volume_controller.enabled = false;
|
config.input_volume_controller.enabled = false;
|
||||||
|
|
||||||
auto gain_controller = std::make_unique<GainController2>(
|
auto gain_controller = std::make_unique<GainController2>(
|
||||||
config, InputVolumeControllerConfig{}, kSampleRateHz, kNumChannels,
|
CreateEnvironment(), config, InputVolumeControllerConfig{}, kSampleRateHz,
|
||||||
|
kNumChannels,
|
||||||
/*use_internal_vad=*/true);
|
/*use_internal_vad=*/true);
|
||||||
|
|
||||||
EXPECT_FALSE(gain_controller->recommended_input_volume().has_value());
|
EXPECT_FALSE(gain_controller->recommended_input_volume().has_value());
|
||||||
@ -206,7 +210,8 @@ TEST(
|
|||||||
config.input_volume_controller.enabled = false;
|
config.input_volume_controller.enabled = false;
|
||||||
|
|
||||||
auto gain_controller = std::make_unique<GainController2>(
|
auto gain_controller = std::make_unique<GainController2>(
|
||||||
config, kTestInputVolumeControllerConfig, kSampleRateHz, kNumChannels,
|
CreateEnvironment(), config, kTestInputVolumeControllerConfig,
|
||||||
|
kSampleRateHz, kNumChannels,
|
||||||
/*use_internal_vad=*/true);
|
/*use_internal_vad=*/true);
|
||||||
|
|
||||||
EXPECT_FALSE(gain_controller->recommended_input_volume().has_value());
|
EXPECT_FALSE(gain_controller->recommended_input_volume().has_value());
|
||||||
@ -238,7 +243,8 @@ TEST(GainController2,
|
|||||||
config.adaptive_digital.enabled = true;
|
config.adaptive_digital.enabled = true;
|
||||||
|
|
||||||
auto gain_controller = std::make_unique<GainController2>(
|
auto gain_controller = std::make_unique<GainController2>(
|
||||||
config, InputVolumeControllerConfig{}, kSampleRateHz, kNumChannels,
|
CreateEnvironment(), config, InputVolumeControllerConfig{}, kSampleRateHz,
|
||||||
|
kNumChannels,
|
||||||
/*use_internal_vad=*/true);
|
/*use_internal_vad=*/true);
|
||||||
|
|
||||||
EXPECT_FALSE(gain_controller->recommended_input_volume().has_value());
|
EXPECT_FALSE(gain_controller->recommended_input_volume().has_value());
|
||||||
@ -271,7 +277,8 @@ TEST(
|
|||||||
config.adaptive_digital.enabled = true;
|
config.adaptive_digital.enabled = true;
|
||||||
|
|
||||||
auto gain_controller = std::make_unique<GainController2>(
|
auto gain_controller = std::make_unique<GainController2>(
|
||||||
config, kTestInputVolumeControllerConfig, kSampleRateHz, kNumChannels,
|
CreateEnvironment(), config, kTestInputVolumeControllerConfig,
|
||||||
|
kSampleRateHz, kNumChannels,
|
||||||
/*use_internal_vad=*/true);
|
/*use_internal_vad=*/true);
|
||||||
|
|
||||||
EXPECT_FALSE(gain_controller->recommended_input_volume().has_value());
|
EXPECT_FALSE(gain_controller->recommended_input_volume().has_value());
|
||||||
@ -292,7 +299,7 @@ TEST(
|
|||||||
// Checks that the default config is applied.
|
// Checks that the default config is applied.
|
||||||
TEST(GainController2, ApplyDefaultConfig) {
|
TEST(GainController2, ApplyDefaultConfig) {
|
||||||
auto gain_controller2 = std::make_unique<GainController2>(
|
auto gain_controller2 = std::make_unique<GainController2>(
|
||||||
Agc2Config{}, InputVolumeControllerConfig{},
|
CreateEnvironment(), Agc2Config{}, InputVolumeControllerConfig{},
|
||||||
/*sample_rate_hz=*/16000, /*num_channels=*/2,
|
/*sample_rate_hz=*/16000, /*num_channels=*/2,
|
||||||
/*use_internal_vad=*/true);
|
/*use_internal_vad=*/true);
|
||||||
EXPECT_TRUE(gain_controller2.get());
|
EXPECT_TRUE(gain_controller2.get());
|
||||||
@ -409,8 +416,9 @@ TEST(GainController2, CheckFinalGainWithAdaptiveDigitalController) {
|
|||||||
Agc2Config config;
|
Agc2Config config;
|
||||||
config.fixed_digital.gain_db = 0.0f;
|
config.fixed_digital.gain_db = 0.0f;
|
||||||
config.adaptive_digital.enabled = true;
|
config.adaptive_digital.enabled = true;
|
||||||
GainController2 agc2(config, /*input_volume_controller_config=*/{},
|
GainController2 agc2(CreateEnvironment(), config,
|
||||||
kSampleRateHz, kStereo,
|
/*input_volume_controller_config=*/{}, kSampleRateHz,
|
||||||
|
kStereo,
|
||||||
/*use_internal_vad=*/true);
|
/*use_internal_vad=*/true);
|
||||||
|
|
||||||
test::InputAudioFile input_file(
|
test::InputAudioFile input_file(
|
||||||
@ -464,10 +472,10 @@ TEST(GainController2DeathTest,
|
|||||||
AudioBuffer audio_buffer(kSampleRateHz, kStereo, kSampleRateHz, kStereo,
|
AudioBuffer audio_buffer(kSampleRateHz, kStereo, kSampleRateHz, kStereo,
|
||||||
kSampleRateHz, kStereo);
|
kSampleRateHz, kStereo);
|
||||||
// Create AGC2 so that the interval VAD is also created.
|
// Create AGC2 so that the interval VAD is also created.
|
||||||
GainController2 agc2(/*config=*/{.adaptive_digital = {.enabled = true}},
|
GainController2 agc2(
|
||||||
/*input_volume_controller_config=*/{}, kSampleRateHz,
|
CreateEnvironment(), /*config=*/{.adaptive_digital = {.enabled = true}},
|
||||||
kStereo,
|
/*input_volume_controller_config=*/{}, kSampleRateHz, kStereo,
|
||||||
/*use_internal_vad=*/true);
|
/*use_internal_vad=*/true);
|
||||||
|
|
||||||
EXPECT_DEATH(agc2.Process(/*speech_probability=*/0.123f,
|
EXPECT_DEATH(agc2.Process(/*speech_probability=*/0.123f,
|
||||||
/*input_volume_changed=*/false, &audio_buffer),
|
/*input_volume_changed=*/false, &audio_buffer),
|
||||||
@ -483,13 +491,15 @@ TEST(GainController2,
|
|||||||
constexpr int kStereo = 2;
|
constexpr int kStereo = 2;
|
||||||
|
|
||||||
// Create AGC2 enabling only the adaptive digital controller.
|
// Create AGC2 enabling only the adaptive digital controller.
|
||||||
|
const Environment env = CreateEnvironment();
|
||||||
Agc2Config config;
|
Agc2Config config;
|
||||||
config.fixed_digital.gain_db = 0.0f;
|
config.fixed_digital.gain_db = 0.0f;
|
||||||
config.adaptive_digital.enabled = true;
|
config.adaptive_digital.enabled = true;
|
||||||
GainController2 agc2(config, /*input_volume_controller_config=*/{},
|
GainController2 agc2(env, config, /*input_volume_controller_config=*/{},
|
||||||
kSampleRateHz, kStereo,
|
kSampleRateHz, kStereo,
|
||||||
/*use_internal_vad=*/false);
|
/*use_internal_vad=*/false);
|
||||||
GainController2 agc2_reference(config, /*input_volume_controller_config=*/{},
|
GainController2 agc2_reference(env, config,
|
||||||
|
/*input_volume_controller_config=*/{},
|
||||||
kSampleRateHz, kStereo,
|
kSampleRateHz, kStereo,
|
||||||
/*use_internal_vad=*/true);
|
/*use_internal_vad=*/true);
|
||||||
|
|
||||||
@ -554,13 +564,15 @@ TEST(GainController2,
|
|||||||
constexpr int kStereo = 2;
|
constexpr int kStereo = 2;
|
||||||
|
|
||||||
// Create AGC2 enabling only the adaptive digital controller.
|
// Create AGC2 enabling only the adaptive digital controller.
|
||||||
|
const Environment env = CreateEnvironment();
|
||||||
Agc2Config config;
|
Agc2Config config;
|
||||||
config.fixed_digital.gain_db = 0.0f;
|
config.fixed_digital.gain_db = 0.0f;
|
||||||
config.adaptive_digital.enabled = true;
|
config.adaptive_digital.enabled = true;
|
||||||
GainController2 agc2(config, /*input_volume_controller_config=*/{},
|
GainController2 agc2(env, config, /*input_volume_controller_config=*/{},
|
||||||
kSampleRateHz, kStereo,
|
kSampleRateHz, kStereo,
|
||||||
/*use_internal_vad=*/false);
|
/*use_internal_vad=*/false);
|
||||||
GainController2 agc2_reference(config, /*input_volume_controller_config=*/{},
|
GainController2 agc2_reference(env, config,
|
||||||
|
/*input_volume_controller_config=*/{},
|
||||||
kSampleRateHz, kStereo,
|
kSampleRateHz, kStereo,
|
||||||
/*use_internal_vad=*/true);
|
/*use_internal_vad=*/true);
|
||||||
VoiceActivityDetectorWrapper vad(GetAvailableCpuFeatures(), kSampleRateHz);
|
VoiceActivityDetectorWrapper vad(GetAvailableCpuFeatures(), kSampleRateHz);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user