diff --git a/media/engine/simulcast_encoder_adapter.cc b/media/engine/simulcast_encoder_adapter.cc index 5ca2a03fc4..7007db6d22 100644 --- a/media/engine/simulcast_encoder_adapter.cc +++ b/media/engine/simulcast_encoder_adapter.cc @@ -265,7 +265,8 @@ SimulcastEncoderAdapter::SimulcastEncoderAdapter( .Vp8BoostBaseLayerQuality()), prefer_temporal_support_on_base_layer_(env_.field_trials().IsEnabled( "WebRTC-Video-PreferTemporalSupportOnBaseLayer")), - per_layer_pli_(SupportsPerLayerPictureLossIndication(format.parameters)) { + per_layer_pli_(SupportsPerLayerPictureLossIndication(format.parameters)), + encoder_info_override_(env.field_trials()) { RTC_DCHECK(primary_factory); // The adapter is typically created on the worker thread, but operated on diff --git a/modules/video_coding/codecs/av1/libaom_av1_encoder.cc b/modules/video_coding/codecs/av1/libaom_av1_encoder.cc index 0eaea9275d..6a97c636ac 100644 --- a/modules/video_coding/codecs/av1/libaom_av1_encoder.cc +++ b/modules/video_coding/codecs/av1/libaom_av1_encoder.cc @@ -180,6 +180,7 @@ LibaomAv1Encoder::LibaomAv1Encoder(const Environment& env, frame_for_encode_(nullptr), encoded_image_callback_(nullptr), timestamp_(0), + encoder_info_override_(env.field_trials()), disable_frame_dropping_(env.field_trials().IsEnabled( "WebRTC-LibaomAv1Encoder-DisableFrameDropping")), max_consec_frame_drop_(GetMaxConsecutiveFrameDrop(env.field_trials())) {} diff --git a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc index e9cf5d8ef4..be3ccc31b8 100644 --- a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc +++ b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc @@ -316,6 +316,7 @@ LibvpxVp8Encoder::LibvpxVp8Encoder(const Environment& env, last_encoder_output_time_(kMaxSimulcastStreams, Timestamp::MinusInfinity()), framerate_controller_(variable_framerate_screenshare::kMinFps), + encoder_info_override_(env_.field_trials()), max_frame_drop_interval_(ParseFrameDropInterval(env_.field_trials())), android_specific_threading_settings_(env_.field_trials().IsEnabled( "WebRTC-LibvpxVp8Encoder-AndroidSpecificThreadingSettings")) { diff --git a/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc b/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc index 31f41a09c6..877d10d00a 100644 --- a/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc +++ b/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc @@ -264,6 +264,7 @@ LibvpxVp9Encoder::LibvpxVp9Encoder(const Environment& env, performance_flags_(ParsePerformanceFlagsFromTrials(env.field_trials())), num_steady_state_frames_(0), config_changed_(true), + encoder_info_override_(env.field_trials()), svc_frame_drop_config_(ParseSvcFrameDropConfig(env.field_trials())) { codec_ = {}; memset(&svc_params_, 0, sizeof(vpx_svc_extra_cfg_t)); diff --git a/rtc_base/experiments/BUILD.gn b/rtc_base/experiments/BUILD.gn index c3e00662b2..a8cd9c548e 100644 --- a/rtc_base/experiments/BUILD.gn +++ b/rtc_base/experiments/BUILD.gn @@ -145,8 +145,8 @@ rtc_library("encoder_info_settings") { deps = [ ":field_trial_parser", "..:logging", + "../../api:field_trials_view", "../../api/video_codecs:video_codecs_api", - "../../system_wrappers:field_trial", ] absl_deps = [ "//third_party/abseil-cpp/absl/strings", diff --git a/rtc_base/experiments/encoder_info_settings.cc b/rtc_base/experiments/encoder_info_settings.cc index 136201d261..e9229dff25 100644 --- a/rtc_base/experiments/encoder_info_settings.cc +++ b/rtc_base/experiments/encoder_info_settings.cc @@ -13,9 +13,9 @@ #include #include "absl/strings/string_view.h" +#include "api/field_trials_view.h" #include "rtc_base/experiments/field_trial_list.h" #include "rtc_base/logging.h" -#include "system_wrappers/include/field_trial.h" namespace webrtc { namespace { @@ -175,7 +175,8 @@ EncoderInfoSettings::GetSinglecastBitrateLimitForResolutionWhenQpIsUntrusted( } } -EncoderInfoSettings::EncoderInfoSettings(absl::string_view name) +EncoderInfoSettings::EncoderInfoSettings(const FieldTrialsView& field_trials, + absl::string_view name) : requested_resolution_alignment_("requested_resolution_alignment"), apply_alignment_to_all_simulcast_layers_( "apply_alignment_to_all_simulcast_layers") { @@ -194,15 +195,15 @@ EncoderInfoSettings::EncoderInfoSettings(absl::string_view name) [](BitrateLimit* b) { return &b->max_bitrate_bps; })}, {}); - std::string name_str(name); - if (field_trial::FindFullName(name_str).empty()) { + std::string experiment_string = field_trials.Lookup(name); + if (experiment_string.empty()) { // Encoder name not found, use common string applying to all encoders. - name_str = "WebRTC-GetEncoderInfoOverride"; + experiment_string = field_trials.Lookup("WebRTC-GetEncoderInfoOverride"); } ParseFieldTrial({&bitrate_limits, &requested_resolution_alignment_, &apply_alignment_to_all_simulcast_layers_}, - field_trial::FindFullName(name_str)); + experiment_string); resolution_bitrate_limits_ = ToResolutionBitrateLimits(bitrate_limits.Get()); } @@ -220,17 +221,22 @@ absl::optional EncoderInfoSettings::requested_resolution_alignment() EncoderInfoSettings::~EncoderInfoSettings() {} SimulcastEncoderAdapterEncoderInfoSettings:: - SimulcastEncoderAdapterEncoderInfoSettings() + SimulcastEncoderAdapterEncoderInfoSettings( + const FieldTrialsView& field_trials) : EncoderInfoSettings( + field_trials, "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride") {} -LibvpxVp8EncoderInfoSettings::LibvpxVp8EncoderInfoSettings() - : EncoderInfoSettings("WebRTC-VP8-GetEncoderInfoOverride") {} +LibvpxVp8EncoderInfoSettings::LibvpxVp8EncoderInfoSettings( + const FieldTrialsView& field_trials) + : EncoderInfoSettings(field_trials, "WebRTC-VP8-GetEncoderInfoOverride") {} -LibvpxVp9EncoderInfoSettings::LibvpxVp9EncoderInfoSettings() - : EncoderInfoSettings("WebRTC-VP9-GetEncoderInfoOverride") {} +LibvpxVp9EncoderInfoSettings::LibvpxVp9EncoderInfoSettings( + const FieldTrialsView& field_trials) + : EncoderInfoSettings(field_trials, "WebRTC-VP9-GetEncoderInfoOverride") {} -LibaomAv1EncoderInfoSettings::LibaomAv1EncoderInfoSettings() - : EncoderInfoSettings("WebRTC-Av1-GetEncoderInfoOverride") {} +LibaomAv1EncoderInfoSettings::LibaomAv1EncoderInfoSettings( + const FieldTrialsView& field_trials) + : EncoderInfoSettings(field_trials, "WebRTC-Av1-GetEncoderInfoOverride") {} } // namespace webrtc diff --git a/rtc_base/experiments/encoder_info_settings.h b/rtc_base/experiments/encoder_info_settings.h index 416bf6be7a..b20023827e 100644 --- a/rtc_base/experiments/encoder_info_settings.h +++ b/rtc_base/experiments/encoder_info_settings.h @@ -16,6 +16,7 @@ #include "absl/strings/string_view.h" #include "absl/types/optional.h" +#include "api/field_trials_view.h" #include "api/video_codecs/video_encoder.h" #include "rtc_base/experiments/field_trial_parser.h" @@ -59,7 +60,8 @@ class EncoderInfoSettings { resolution_bitrate_limits); protected: - explicit EncoderInfoSettings(absl::string_view name); + EncoderInfoSettings(const FieldTrialsView& field_trials, + absl::string_view name); private: FieldTrialOptional requested_resolution_alignment_; @@ -70,28 +72,29 @@ class EncoderInfoSettings { // EncoderInfo settings for SimulcastEncoderAdapter. class SimulcastEncoderAdapterEncoderInfoSettings : public EncoderInfoSettings { public: - SimulcastEncoderAdapterEncoderInfoSettings(); + explicit SimulcastEncoderAdapterEncoderInfoSettings( + const FieldTrialsView& field_trials); ~SimulcastEncoderAdapterEncoderInfoSettings() override {} }; // EncoderInfo settings for LibvpxVp8Encoder. class LibvpxVp8EncoderInfoSettings : public EncoderInfoSettings { public: - LibvpxVp8EncoderInfoSettings(); + explicit LibvpxVp8EncoderInfoSettings(const FieldTrialsView& field_trials); ~LibvpxVp8EncoderInfoSettings() override {} }; // EncoderInfo settings for LibvpxVp9Encoder. class LibvpxVp9EncoderInfoSettings : public EncoderInfoSettings { public: - LibvpxVp9EncoderInfoSettings(); + explicit LibvpxVp9EncoderInfoSettings(const FieldTrialsView& field_trials); ~LibvpxVp9EncoderInfoSettings() override {} }; // EncoderInfo settings for LibaomAv1Encoder. class LibaomAv1EncoderInfoSettings : public EncoderInfoSettings { public: - LibaomAv1EncoderInfoSettings(); + explicit LibaomAv1EncoderInfoSettings(const FieldTrialsView& field_trials); ~LibaomAv1EncoderInfoSettings() override {} }; diff --git a/rtc_base/experiments/encoder_info_settings_unittest.cc b/rtc_base/experiments/encoder_info_settings_unittest.cc index 929c777821..5739673432 100644 --- a/rtc_base/experiments/encoder_info_settings_unittest.cc +++ b/rtc_base/experiments/encoder_info_settings_unittest.cc @@ -11,59 +11,63 @@ #include "rtc_base/experiments/encoder_info_settings.h" #include "rtc_base/gunit.h" -#include "test/field_trial.h" +#include "test/explicit_key_value_config.h" #include "test/gmock.h" namespace webrtc { +using test::ExplicitKeyValueConfig; + TEST(SimulcastEncoderAdapterSettingsTest, NoValuesWithoutFieldTrial) { - SimulcastEncoderAdapterEncoderInfoSettings settings; + ExplicitKeyValueConfig field_trials(""); + + SimulcastEncoderAdapterEncoderInfoSettings settings(field_trials); EXPECT_EQ(absl::nullopt, settings.requested_resolution_alignment()); EXPECT_FALSE(settings.apply_alignment_to_all_simulcast_layers()); EXPECT_TRUE(settings.resolution_bitrate_limits().empty()); } TEST(SimulcastEncoderAdapterSettingsTest, NoValueForInvalidAlignment) { - webrtc::test::ScopedFieldTrials field_trials( + ExplicitKeyValueConfig field_trials( "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/" "requested_resolution_alignment:0/"); - SimulcastEncoderAdapterEncoderInfoSettings settings; + SimulcastEncoderAdapterEncoderInfoSettings settings(field_trials); EXPECT_EQ(absl::nullopt, settings.requested_resolution_alignment()); } TEST(SimulcastEncoderAdapterSettingsTest, GetResolutionAlignment) { - webrtc::test::ScopedFieldTrials field_trials( + ExplicitKeyValueConfig field_trials( "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/" "requested_resolution_alignment:2/"); - SimulcastEncoderAdapterEncoderInfoSettings settings; + SimulcastEncoderAdapterEncoderInfoSettings settings(field_trials); EXPECT_EQ(2u, settings.requested_resolution_alignment()); EXPECT_FALSE(settings.apply_alignment_to_all_simulcast_layers()); EXPECT_TRUE(settings.resolution_bitrate_limits().empty()); } TEST(SimulcastEncoderAdapterSettingsTest, GetApplyAlignment) { - webrtc::test::ScopedFieldTrials field_trials( + ExplicitKeyValueConfig field_trials( "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/" "requested_resolution_alignment:3," "apply_alignment_to_all_simulcast_layers/"); - SimulcastEncoderAdapterEncoderInfoSettings settings; + SimulcastEncoderAdapterEncoderInfoSettings settings(field_trials); EXPECT_EQ(3u, settings.requested_resolution_alignment()); EXPECT_TRUE(settings.apply_alignment_to_all_simulcast_layers()); EXPECT_TRUE(settings.resolution_bitrate_limits().empty()); } TEST(SimulcastEncoderAdapterSettingsTest, GetResolutionBitrateLimits) { - webrtc::test::ScopedFieldTrials field_trials( + ExplicitKeyValueConfig field_trials( "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/" "frame_size_pixels:123," "min_start_bitrate_bps:11000," "min_bitrate_bps:44000," "max_bitrate_bps:77000/"); - SimulcastEncoderAdapterEncoderInfoSettings settings; + SimulcastEncoderAdapterEncoderInfoSettings settings(field_trials); EXPECT_EQ(absl::nullopt, settings.requested_resolution_alignment()); EXPECT_FALSE(settings.apply_alignment_to_all_simulcast_layers()); EXPECT_THAT(settings.resolution_bitrate_limits(), @@ -72,14 +76,14 @@ TEST(SimulcastEncoderAdapterSettingsTest, GetResolutionBitrateLimits) { } TEST(SimulcastEncoderAdapterSettingsTest, GetResolutionBitrateLimitsWithList) { - webrtc::test::ScopedFieldTrials field_trials( + ExplicitKeyValueConfig field_trials( "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/" "frame_size_pixels:123|456|789," "min_start_bitrate_bps:11000|22000|33000," "min_bitrate_bps:44000|55000|66000," "max_bitrate_bps:77000|88000|99000/"); - SimulcastEncoderAdapterEncoderInfoSettings settings; + SimulcastEncoderAdapterEncoderInfoSettings settings(field_trials); EXPECT_THAT( settings.resolution_bitrate_limits(), ::testing::ElementsAre( @@ -89,13 +93,13 @@ TEST(SimulcastEncoderAdapterSettingsTest, GetResolutionBitrateLimitsWithList) { } TEST(EncoderSettingsTest, CommonSettingsUsedIfEncoderNameUnspecified) { - webrtc::test::ScopedFieldTrials field_trials( + ExplicitKeyValueConfig field_trials( "WebRTC-VP8-GetEncoderInfoOverride/requested_resolution_alignment:2/" "WebRTC-GetEncoderInfoOverride/requested_resolution_alignment:3/"); - LibvpxVp8EncoderInfoSettings vp8_settings; + LibvpxVp8EncoderInfoSettings vp8_settings(field_trials); EXPECT_EQ(2u, vp8_settings.requested_resolution_alignment()); - LibvpxVp9EncoderInfoSettings vp9_settings; + LibvpxVp9EncoderInfoSettings vp9_settings(field_trials); EXPECT_EQ(3u, vp9_settings.requested_resolution_alignment()); } diff --git a/video/end_to_end_tests/resolution_bitrate_limits_tests.cc b/video/end_to_end_tests/resolution_bitrate_limits_tests.cc index 73df8dcd14..89d4a9aab0 100644 --- a/video/end_to_end_tests/resolution_bitrate_limits_tests.cc +++ b/video/end_to_end_tests/resolution_bitrate_limits_tests.cc @@ -126,7 +126,8 @@ class InitEncodeTest : public test::EndToEndTest, encoder_factory_(this), payload_name_(payload_name), configs_(configs), - expectations_(expectations) {} + expectations_(expectations), + encoder_info_override_(env.field_trials()) {} void OnFrameGeneratorCapturerCreated( test::FrameGeneratorCapturer* frame_generator_capturer) override {