Query EncoderInfoSettings through propagated field trials

Instead of from the global field trial string.

Bug: webrtc:42220378
Change-Id: Iddb41429e388792de02f702b4caa35689c57d9e5
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/347720
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42201}
diff --git a/media/engine/simulcast_encoder_adapter.cc b/media/engine/simulcast_encoder_adapter.cc
index 5ca2a03..7007db6 100644
--- a/media/engine/simulcast_encoder_adapter.cc
+++ b/media/engine/simulcast_encoder_adapter.cc
@@ -265,7 +265,8 @@
               .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 0eaea92..6a97c63 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 @@
       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 e9cf5d8..be3ccc3 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 @@
       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 31f41a0..877d10d 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 @@
       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 c3e0066..a8cd9c5 100644
--- a/rtc_base/experiments/BUILD.gn
+++ b/rtc_base/experiments/BUILD.gn
@@ -145,8 +145,8 @@
   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 136201d..e9229df 100644
--- a/rtc_base/experiments/encoder_info_settings.cc
+++ b/rtc_base/experiments/encoder_info_settings.cc
@@ -13,9 +13,9 @@
 #include <stdio.h>
 
 #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::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 @@
            [](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 @@
 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 416bf6b..b200238 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 @@
           resolution_bitrate_limits);
 
  protected:
-  explicit EncoderInfoSettings(absl::string_view name);
+  EncoderInfoSettings(const FieldTrialsView& field_trials,
+                      absl::string_view name);
 
  private:
   FieldTrialOptional<uint32_t> requested_resolution_alignment_;
@@ -70,28 +72,29 @@
 // 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 929c777..5739673 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, 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(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 73df8dc..89d4a9a 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 @@
         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 {