blob: e2ce2e3b139e97541470e09a962c6071a5b85ee5 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/platform/mediastream/media_stream_audio_processor_options.h"
#include "build/build_config.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace blink {
TEST(ConfigAutomaticGainControlTest, EnableDefaultAGC1) {
webrtc::AudioProcessing::Config apm_config;
ConfigAutomaticGainControl(
/*agc_enabled=*/true,
/*experimental_agc_enabled=*/false,
/*agc2_properties=*/base::nullopt,
/*compression_gain_db=*/base::nullopt, apm_config);
EXPECT_TRUE(apm_config.gain_controller1.enabled);
EXPECT_EQ(
apm_config.gain_controller1.mode,
#if defined(OS_ANDROID)
webrtc::AudioProcessing::Config::GainController1::Mode::kFixedDigital);
#else
webrtc::AudioProcessing::Config::GainController1::Mode::kAdaptiveAnalog);
#endif // defined(OS_ANDROID)
}
TEST(ConfigAutomaticGainControlTest, EnableFixedDigitalAGC2) {
webrtc::AudioProcessing::Config apm_config;
const double compression_gain_db = 10.0;
ConfigAutomaticGainControl(
/*agc_enabled=*/true,
/*experimental_agc_enabled=*/false,
/*agc2_properties=*/base::nullopt, compression_gain_db, apm_config);
EXPECT_FALSE(apm_config.gain_controller1.enabled);
EXPECT_TRUE(apm_config.gain_controller2.enabled);
EXPECT_FALSE(apm_config.gain_controller2.adaptive_digital.enabled);
EXPECT_FLOAT_EQ(apm_config.gain_controller2.fixed_digital.gain_db,
compression_gain_db);
}
TEST(ConfigAutomaticGainControlTest, EnableHybridAGC) {
webrtc::AudioProcessing::Config apm_config;
blink::AdaptiveGainController2Properties agc2_properties;
agc2_properties.vad_probability_attack = 0.2f;
agc2_properties.use_peaks_not_rms = true;
agc2_properties.level_estimator_speech_frames_threshold = 3;
agc2_properties.initial_saturation_margin_db = 10;
agc2_properties.extra_saturation_margin_db = 10;
agc2_properties.gain_applier_speech_frames_threshold = 5;
agc2_properties.max_gain_change_db_per_second = 4;
agc2_properties.max_output_noise_level_dbfs = -22;
agc2_properties.sse2_allowed = true;
agc2_properties.avx2_allowed = true;
agc2_properties.neon_allowed = true;
const double compression_gain_db = 10.0;
ConfigAutomaticGainControl(
/*agc_enabled=*/true,
/*experimental_agc_enabled=*/true, agc2_properties, compression_gain_db,
apm_config);
EXPECT_TRUE(apm_config.gain_controller1.enabled);
EXPECT_EQ(
apm_config.gain_controller1.mode,
#if defined(OS_ANDROID)
webrtc::AudioProcessing::Config::GainController1::Mode::kFixedDigital);
#else
webrtc::AudioProcessing::Config::GainController1::Mode::kAdaptiveAnalog);
#endif // defined(OS_ANDROID)
EXPECT_TRUE(apm_config.gain_controller2.enabled);
// `compression_gain_db` has no effect when hybrid AGC is active.
EXPECT_EQ(apm_config.gain_controller2.fixed_digital.gain_db, 0);
const auto& adaptive_digital = apm_config.gain_controller2.adaptive_digital;
EXPECT_TRUE(adaptive_digital.enabled);
EXPECT_FLOAT_EQ(adaptive_digital.vad_probability_attack,
agc2_properties.vad_probability_attack);
EXPECT_EQ(
adaptive_digital.level_estimator,
webrtc::AudioProcessing::Config::GainController2::LevelEstimator::kPeak);
EXPECT_EQ(adaptive_digital.level_estimator_adjacent_speech_frames_threshold,
agc2_properties.level_estimator_speech_frames_threshold);
EXPECT_FLOAT_EQ(adaptive_digital.initial_saturation_margin_db,
agc2_properties.initial_saturation_margin_db);
EXPECT_FLOAT_EQ(adaptive_digital.extra_saturation_margin_db,
agc2_properties.extra_saturation_margin_db);
EXPECT_EQ(adaptive_digital.gain_applier_adjacent_speech_frames_threshold,
agc2_properties.gain_applier_speech_frames_threshold);
EXPECT_FLOAT_EQ(adaptive_digital.max_gain_change_db_per_second,
agc2_properties.max_gain_change_db_per_second);
EXPECT_FLOAT_EQ(adaptive_digital.max_output_noise_level_dbfs,
agc2_properties.max_output_noise_level_dbfs);
EXPECT_TRUE(adaptive_digital.sse2_allowed);
EXPECT_TRUE(adaptive_digital.avx2_allowed);
EXPECT_TRUE(adaptive_digital.neon_allowed);
}
TEST(PopulateApmConfigTest, DefaultWithoutConfigJson) {
webrtc::AudioProcessing::Config apm_config;
AudioProcessingProperties properties;
base::Optional<double> gain_control_compression_gain_db;
PopulateApmConfig(&apm_config, properties,
base::nullopt, // |audio_processing_platform_config_json|.
&gain_control_compression_gain_db);
EXPECT_FALSE(gain_control_compression_gain_db.has_value());
EXPECT_TRUE(apm_config.high_pass_filter.enabled);
EXPECT_FALSE(apm_config.pre_amplifier.enabled);
EXPECT_TRUE(apm_config.noise_suppression.enabled);
EXPECT_EQ(apm_config.noise_suppression.level,
webrtc::AudioProcessing::Config::NoiseSuppression::kHigh);
EXPECT_TRUE(apm_config.echo_canceller.enabled);
#if defined(OS_ANDROID)
EXPECT_TRUE(
#else
EXPECT_FALSE(
#endif
apm_config.echo_canceller.mobile_mode);
}
TEST(PopulateApmConfigTest, SetGainsInConfigJson) {
webrtc::AudioProcessing::Config apm_config;
AudioProcessingProperties properties;
base::Optional<std::string> audio_processing_platform_config_json =
"{\"gain_control_compression_gain_db\": 10, "
"\"pre_amplifier_fixed_gain_factor\": 2.0}";
base::Optional<double> gain_control_compression_gain_db;
PopulateApmConfig(&apm_config, properties,
audio_processing_platform_config_json,
&gain_control_compression_gain_db);
EXPECT_TRUE(gain_control_compression_gain_db.has_value());
EXPECT_EQ(gain_control_compression_gain_db.value(), 10);
EXPECT_TRUE(apm_config.high_pass_filter.enabled);
EXPECT_TRUE(apm_config.pre_amplifier.enabled);
EXPECT_FLOAT_EQ(apm_config.pre_amplifier.fixed_gain_factor, 2.0);
EXPECT_TRUE(apm_config.noise_suppression.enabled);
EXPECT_EQ(apm_config.noise_suppression.level,
webrtc::AudioProcessing::Config::NoiseSuppression::kHigh);
EXPECT_TRUE(apm_config.echo_canceller.enabled);
#if defined(OS_ANDROID)
EXPECT_TRUE(
#else
EXPECT_FALSE(
#endif
apm_config.echo_canceller.mobile_mode);
}
TEST(PopulateApmConfigTest, SetNoiseSuppressionLevelInConfigJson) {
webrtc::AudioProcessing::Config apm_config;
AudioProcessingProperties properties;
base::Optional<std::string> audio_processing_platform_config_json =
"{\"noise_suppression_level\": 3}";
base::Optional<double> gain_control_compression_gain_db;
PopulateApmConfig(&apm_config, properties,
audio_processing_platform_config_json,
&gain_control_compression_gain_db);
EXPECT_FALSE(gain_control_compression_gain_db.has_value());
EXPECT_TRUE(apm_config.high_pass_filter.enabled);
EXPECT_FALSE(apm_config.pre_amplifier.enabled);
EXPECT_TRUE(apm_config.noise_suppression.enabled);
EXPECT_EQ(apm_config.noise_suppression.level,
webrtc::AudioProcessing::Config::NoiseSuppression::kVeryHigh);
EXPECT_TRUE(apm_config.echo_canceller.enabled);
#if defined(OS_ANDROID)
EXPECT_TRUE(
#else
EXPECT_FALSE(
#endif
apm_config.echo_canceller.mobile_mode);
}
} // namespace blink