diff --git a/rtc_base/experiments/BUILD.gn b/rtc_base/experiments/BUILD.gn index d44eefd4fc..ace9007436 100644 --- a/rtc_base/experiments/BUILD.gn +++ b/rtc_base/experiments/BUILD.gn @@ -117,7 +117,7 @@ rtc_library("normalize_simulcast_size_experiment") { ] deps = [ "..:logging", - "../../system_wrappers:field_trial", + "../../api:field_trials_view", ] absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ] } @@ -287,6 +287,7 @@ if (rtc_include_tests && !build_with_chromium) { "../../api/video:video_frame", "../../api/video_codecs:video_codecs_api", "../../system_wrappers:field_trial", + "../../test:explicit_key_value_config", "../../test:field_trial", "../../test:scoped_key_value_config", "../../test:test_main", diff --git a/rtc_base/experiments/normalize_simulcast_size_experiment.cc b/rtc_base/experiments/normalize_simulcast_size_experiment.cc index ce817a0797..6fe881a5d3 100644 --- a/rtc_base/experiments/normalize_simulcast_size_experiment.cc +++ b/rtc_base/experiments/normalize_simulcast_size_experiment.cc @@ -14,8 +14,8 @@ #include +#include "api/field_trials_view.h" #include "rtc_base/logging.h" -#include "system_wrappers/include/field_trial.h" namespace webrtc { namespace { @@ -24,11 +24,12 @@ constexpr int kMinSetting = 0; constexpr int kMaxSetting = 5; } // namespace -absl::optional NormalizeSimulcastSizeExperiment::GetBase2Exponent() { - if (!webrtc::field_trial::IsEnabled(kFieldTrial)) +absl::optional NormalizeSimulcastSizeExperiment::GetBase2Exponent( + const FieldTrialsView& field_trials) { + if (!field_trials.IsEnabled(kFieldTrial)) return absl::nullopt; - const std::string group = webrtc::field_trial::FindFullName(kFieldTrial); + const std::string group = field_trials.Lookup(kFieldTrial); if (group.empty()) return absl::nullopt; diff --git a/rtc_base/experiments/normalize_simulcast_size_experiment.h b/rtc_base/experiments/normalize_simulcast_size_experiment.h index 6b358202b2..3c187f9002 100644 --- a/rtc_base/experiments/normalize_simulcast_size_experiment.h +++ b/rtc_base/experiments/normalize_simulcast_size_experiment.h @@ -12,12 +12,14 @@ #define RTC_BASE_EXPERIMENTS_NORMALIZE_SIMULCAST_SIZE_EXPERIMENT_H_ #include "absl/types/optional.h" +#include "api/field_trials_view.h" namespace webrtc { class NormalizeSimulcastSizeExperiment { public: // Returns the base two exponent from field trial. - static absl::optional GetBase2Exponent(); + static absl::optional GetBase2Exponent( + const FieldTrialsView& field_trials); }; } // namespace webrtc diff --git a/rtc_base/experiments/normalize_simulcast_size_experiment_unittest.cc b/rtc_base/experiments/normalize_simulcast_size_experiment_unittest.cc index 34e07427cf..afafa01176 100644 --- a/rtc_base/experiments/normalize_simulcast_size_experiment_unittest.cc +++ b/rtc_base/experiments/normalize_simulcast_size_experiment_unittest.cc @@ -10,50 +10,58 @@ #include "rtc_base/experiments/normalize_simulcast_size_experiment.h" -#include "test/field_trial.h" +#include "test/explicit_key_value_config.h" #include "test/gtest.h" namespace webrtc { +using test::ExplicitKeyValueConfig; + TEST(NormalizeSimulcastSizeExperimentTest, GetExponent) { - webrtc::test::ScopedFieldTrials field_trials( + ExplicitKeyValueConfig field_trials( "WebRTC-NormalizeSimulcastResolution/Enabled-2/"); - EXPECT_EQ(2, NormalizeSimulcastSizeExperiment::GetBase2Exponent()); + EXPECT_EQ(2, + NormalizeSimulcastSizeExperiment::GetBase2Exponent(field_trials)); } TEST(NormalizeSimulcastSizeExperimentTest, GetExponentWithTwoParameters) { - webrtc::test::ScopedFieldTrials field_trials( + ExplicitKeyValueConfig field_trials( "WebRTC-NormalizeSimulcastResolution/Enabled-3-4/"); - EXPECT_EQ(3, NormalizeSimulcastSizeExperiment::GetBase2Exponent()); + EXPECT_EQ(3, + NormalizeSimulcastSizeExperiment::GetBase2Exponent(field_trials)); } TEST(NormalizeSimulcastSizeExperimentTest, GetExponentFailsIfNotEnabled) { - webrtc::test::ScopedFieldTrials field_trials( + ExplicitKeyValueConfig field_trials( "WebRTC-NormalizeSimulcastResolution/Disabled/"); - EXPECT_FALSE(NormalizeSimulcastSizeExperiment::GetBase2Exponent()); + EXPECT_FALSE( + NormalizeSimulcastSizeExperiment::GetBase2Exponent(field_trials)); } TEST(NormalizeSimulcastSizeExperimentTest, GetExponentFailsForInvalidFieldTrial) { - webrtc::test::ScopedFieldTrials field_trials( + ExplicitKeyValueConfig field_trials( "WebRTC-NormalizeSimulcastResolution/Enabled-invalid/"); - EXPECT_FALSE(NormalizeSimulcastSizeExperiment::GetBase2Exponent()); + EXPECT_FALSE( + NormalizeSimulcastSizeExperiment::GetBase2Exponent(field_trials)); } TEST(NormalizeSimulcastSizeExperimentTest, GetExponentFailsForNegativeOutOfBoundValue) { // Supported range: [0, 5]. - webrtc::test::ScopedFieldTrials field_trials( + ExplicitKeyValueConfig field_trials( "WebRTC-NormalizeSimulcastResolution/Enabled--1/"); - EXPECT_FALSE(NormalizeSimulcastSizeExperiment::GetBase2Exponent()); + EXPECT_FALSE( + NormalizeSimulcastSizeExperiment::GetBase2Exponent(field_trials)); } TEST(NormalizeSimulcastSizeExperimentTest, GetExponentFailsForPositiveOutOfBoundValue) { // Supported range: [0, 5]. - webrtc::test::ScopedFieldTrials field_trials( + ExplicitKeyValueConfig field_trials( "WebRTC-NormalizeSimulcastResolution/Enabled-6/"); - EXPECT_FALSE(NormalizeSimulcastSizeExperiment::GetBase2Exponent()); + EXPECT_FALSE( + NormalizeSimulcastSizeExperiment::GetBase2Exponent(field_trials)); } } // namespace webrtc diff --git a/video/config/encoder_stream_factory.cc b/video/config/encoder_stream_factory.cc index 2528a1bc08..1302ba8ce9 100644 --- a/video/config/encoder_stream_factory.cc +++ b/video/config/encoder_stream_factory.cc @@ -340,16 +340,19 @@ EncoderStreamFactory::CreateSimulcastOrConferenceModeScreenshareStreams( default_scale_factors_used = IsScaleFactorsPowerOfTwo(encoder_config); } const bool norm_size_configured = - webrtc::NormalizeSimulcastSizeExperiment::GetBase2Exponent().has_value(); + webrtc::NormalizeSimulcastSizeExperiment::GetBase2Exponent(trials_) + .has_value(); const int normalized_width = (default_scale_factors_used || norm_size_configured) && (width >= kMinLayerSize) - ? NormalizeSimulcastSize(width, encoder_config.number_of_streams) + ? NormalizeSimulcastSize(trials_, width, + encoder_config.number_of_streams) : width; const int normalized_height = (default_scale_factors_used || norm_size_configured) && (height >= kMinLayerSize) - ? NormalizeSimulcastSize(height, encoder_config.number_of_streams) + ? NormalizeSimulcastSize(trials_, height, + encoder_config.number_of_streams) : height; for (size_t i = 0; i < layers.size(); ++i) { layers[i].active = encoder_config.simulcast_layers[i].active; diff --git a/video/config/simulcast.cc b/video/config/simulcast.cc index 2c600c8572..6db23d1aa2 100644 --- a/video/config/simulcast.cc +++ b/video/config/simulcast.cc @@ -19,6 +19,7 @@ #include "absl/strings/match.h" #include "absl/types/optional.h" +#include "api/field_trials_view.h" #include "api/video/video_codec_constants.h" #include "media/base/media_constants.h" #include "modules/video_coding/utility/simulcast_rate_allocator.h" @@ -33,6 +34,8 @@ namespace cricket { namespace { +using ::webrtc::FieldTrialsView; + constexpr char kUseLegacySimulcastLayerLimitFieldTrial[] = "WebRTC-LegacySimulcastLayerLimit"; @@ -218,10 +221,12 @@ int FindSimulcastFormatIndex(int width, // Round size to nearest simulcast-friendly size. // Simulcast stream width and height must both be dividable by // |2 ^ (simulcast_layers - 1)|. -int NormalizeSimulcastSize(int size, size_t simulcast_layers) { +int NormalizeSimulcastSize(const FieldTrialsView& field_trials, + int size, + size_t simulcast_layers) { int base2_exponent = static_cast(simulcast_layers) - 1; const absl::optional experimental_base2_exponent = - webrtc::NormalizeSimulcastSizeExperiment::GetBase2Exponent(); + webrtc::NormalizeSimulcastSizeExperiment::GetBase2Exponent(field_trials); if (experimental_base2_exponent && (size > (1 << *experimental_base2_exponent))) { base2_exponent = *experimental_base2_exponent; @@ -411,8 +416,8 @@ std::vector GetNormalSimulcastLayers( const int num_temporal_layers = DefaultNumberOfTemporalLayers(trials); // Format width and height has to be divisible by |2 ^ num_simulcast_layers - // 1|. - width = NormalizeSimulcastSize(width, layer_count); - height = NormalizeSimulcastSize(height, layer_count); + width = NormalizeSimulcastSize(trials, width, layer_count); + height = NormalizeSimulcastSize(trials, height, layer_count); // Add simulcast streams, from highest resolution (`s` = num_simulcast_layers // -1) to lowest resolution at `s` = 0. for (size_t s = layer_count - 1;; --s) { diff --git a/video/config/simulcast.h b/video/config/simulcast.h index 4bd99935e9..af622060a8 100644 --- a/video/config/simulcast.h +++ b/video/config/simulcast.h @@ -31,7 +31,9 @@ void BoostMaxSimulcastLayer(webrtc::DataRate max_bitrate, std::vector* layers); // Round size to nearest simulcast-friendly size -int NormalizeSimulcastSize(int size, size_t simulcast_layers); +int NormalizeSimulcastSize(const webrtc::FieldTrialsView& field_trials, + int size, + size_t simulcast_layers); // Gets simulcast settings. std::vector GetSimulcastConfig(