Provide Environment to SimulcastRateAllocator at construction

So that this class can use propagated field trials instead of the global

Bug: webrtc:42220378
Change-Id: Ic1dba0c4967735606904329f7e9e6c09f186b809
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/350641
Reviewed-by: Erik Språng <sprang@webrtc.org>
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42326}
diff --git a/api/video/BUILD.gn b/api/video/BUILD.gn
index 48b13c9..16e27af 100644
--- a/api/video/BUILD.gn
+++ b/api/video/BUILD.gn
@@ -264,7 +264,6 @@
   sources = [ "video_bitrate_allocator_factory.h" ]
   deps = [
     ":video_bitrate_allocator",
-    "../../rtc_base:checks",
     "../environment",
     "../video_codecs:video_codecs_api",
   ]
diff --git a/api/video/builtin_video_bitrate_allocator_factory.cc b/api/video/builtin_video_bitrate_allocator_factory.cc
index 252ae21..bfc41ef 100644
--- a/api/video/builtin_video_bitrate_allocator_factory.cc
+++ b/api/video/builtin_video_bitrate_allocator_factory.cc
@@ -29,7 +29,8 @@
   BuiltinVideoBitrateAllocatorFactory() = default;
   ~BuiltinVideoBitrateAllocatorFactory() override = default;
 
-  std::unique_ptr<VideoBitrateAllocator> CreateVideoBitrateAllocator(
+  std::unique_ptr<VideoBitrateAllocator> Create(
+      const Environment& env,
       const VideoCodec& codec) override {
     // TODO(https://crbug.com/webrtc/14884): Update SvcRateAllocator to
     // support simulcast and use it for VP9/AV1 simulcast as well.
@@ -38,7 +39,7 @@
         codec.numberOfSimulcastStreams <= 1) {
       return std::make_unique<SvcRateAllocator>(codec);
     }
-    return std::make_unique<SimulcastRateAllocator>(codec);
+    return std::make_unique<SimulcastRateAllocator>(env, codec);
   }
 };
 
diff --git a/api/video/video_bitrate_allocator_factory.h b/api/video/video_bitrate_allocator_factory.h
index a6e0a1a..31b6794 100644
--- a/api/video/video_bitrate_allocator_factory.h
+++ b/api/video/video_bitrate_allocator_factory.h
@@ -16,7 +16,6 @@
 #include "api/environment/environment.h"
 #include "api/video/video_bitrate_allocator.h"
 #include "api/video_codecs/video_codec.h"
-#include "rtc_base/checks.h"
 
 namespace webrtc {
 
@@ -29,15 +28,7 @@
   // Creates a VideoBitrateAllocator for a specific video codec.
   virtual std::unique_ptr<VideoBitrateAllocator> Create(
       const Environment& env,
-      const VideoCodec& codec) {
-    return CreateVideoBitrateAllocator(codec);
-  }
-  virtual std::unique_ptr<VideoBitrateAllocator> CreateVideoBitrateAllocator(
-      const VideoCodec& codec) {
-    // Newer code shouldn't call this function,
-    // Older code should implement it in derived classes.
-    RTC_CHECK_NOTREACHED();
-  }
+      const VideoCodec& codec) = 0;
 };
 
 }  // namespace webrtc
diff --git a/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc b/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc
index 9438b0d..dbe72c2 100644
--- a/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc
+++ b/api/video_codecs/test/video_encoder_software_fallback_wrapper_unittest.cc
@@ -93,10 +93,11 @@
   VideoEncoderSoftwareFallbackWrapperTestBase(
       const Environment& env,
       std::unique_ptr<VideoEncoder> sw_encoder)
-      : fake_encoder_(new CountingFakeEncoder()),
+      : env_(env),
+        fake_encoder_(new CountingFakeEncoder()),
         wrapper_initialized_(false),
         fallback_wrapper_(CreateVideoEncoderSoftwareFallbackWrapper(
-            env,
+            env_,
             std::move(sw_encoder),
             std::unique_ptr<VideoEncoder>(fake_encoder_),
             false)) {}
@@ -172,6 +173,7 @@
               fallback_wrapper_->GetEncoderInfo().implementation_name);
   }
 
+  const Environment env_;
   FakeEncodedImageCallback callback_;
   // `fake_encoder_` is owned and released by `fallback_wrapper_`.
   CountingFakeEncoder* fake_encoder_;
@@ -232,7 +234,7 @@
   codec_.width = kWidth;
   codec_.height = kHeight;
   codec_.VP8()->numberOfTemporalLayers = 1;
-  rate_allocator_.reset(new SimulcastRateAllocator(codec_));
+  rate_allocator_ = std::make_unique<SimulcastRateAllocator>(env_, codec_);
 
   if (wrapper_initialized_) {
     fallback_wrapper_->Release();
@@ -263,7 +265,7 @@
   codec_.width = kWidth;
   codec_.height = kHeight;
   codec_.VP8()->numberOfTemporalLayers = 1;
-  rate_allocator_.reset(new SimulcastRateAllocator(codec_));
+  rate_allocator_ = std::make_unique<SimulcastRateAllocator>(env_, codec_);
 
   if (wrapper_initialized_) {
     fallback_wrapper_->Release();
@@ -291,7 +293,7 @@
   codec_.width = kWidth;
   codec_.height = kHeight;
   codec_.VP8()->numberOfTemporalLayers = 1;
-  rate_allocator_.reset(new SimulcastRateAllocator(codec_));
+  rate_allocator_ = std::make_unique<SimulcastRateAllocator>(env_, codec_);
   if (wrapper_initialized_) {
     fallback_wrapper_->Release();
   }
@@ -514,7 +516,7 @@
     codec_.VP8()->numberOfTemporalLayers = 1;
     codec_.VP8()->automaticResizeOn = true;
     codec_.SetFrameDropEnabled(true);
-    rate_allocator_.reset(new SimulcastRateAllocator(codec_));
+    rate_allocator_ = std::make_unique<SimulcastRateAllocator>(env_, codec_);
   }
 
   void InitEncode(int width, int height) {
diff --git a/media/engine/simulcast_encoder_adapter.cc b/media/engine/simulcast_encoder_adapter.cc
index b4a6486..0872032 100644
--- a/media/engine/simulcast_encoder_adapter.cc
+++ b/media/engine/simulcast_encoder_adapter.cc
@@ -39,12 +39,13 @@
 #include "rtc_base/experiments/rate_control_settings.h"
 #include "rtc_base/logging.h"
 
+namespace webrtc {
 namespace {
 
 // Max qp for lowest spatial resolution when doing simulcast.
 const unsigned int kLowestResMaxQp = 45;
 
-uint32_t SumStreamMaxBitrate(int streams, const webrtc::VideoCodec& codec) {
+uint32_t SumStreamMaxBitrate(int streams, const VideoCodec& codec) {
   uint32_t bitrate_sum = 0;
   for (int i = 0; i < streams; ++i) {
     bitrate_sum += codec.simulcastStream[i].maxBitrate;
@@ -52,7 +53,7 @@
   return bitrate_sum;
 }
 
-int CountAllStreams(const webrtc::VideoCodec& codec) {
+int CountAllStreams(const VideoCodec& codec) {
   int total_streams_count =
       codec.numberOfSimulcastStreams < 1 ? 1 : codec.numberOfSimulcastStreams;
   uint32_t simulcast_max_bitrate =
@@ -63,7 +64,7 @@
   return total_streams_count;
 }
 
-int CountActiveStreams(const webrtc::VideoCodec& codec) {
+int CountActiveStreams(const VideoCodec& codec) {
   if (codec.numberOfSimulcastStreams < 1) {
     return 1;
   }
@@ -77,7 +78,7 @@
   return active_streams_count;
 }
 
-int VerifyCodec(const webrtc::VideoCodec* codec_settings) {
+int VerifyCodec(const VideoCodec* codec_settings) {
   if (codec_settings == nullptr) {
     return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
   }
@@ -100,14 +101,13 @@
   return WEBRTC_VIDEO_CODEC_OK;
 }
 
-bool StreamQualityCompare(const webrtc::SimulcastStream& a,
-                          const webrtc::SimulcastStream& b) {
+bool StreamQualityCompare(const SimulcastStream& a, const SimulcastStream& b) {
   return std::tie(a.height, a.width, a.maxBitrate, a.maxFramerate) <
          std::tie(b.height, b.width, b.maxBitrate, b.maxFramerate);
 }
 
 void GetLowestAndHighestQualityStreamIndixes(
-    rtc::ArrayView<webrtc::SimulcastStream> streams,
+    rtc::ArrayView<const SimulcastStream> streams,
     int* lowest_quality_stream_idx,
     int* highest_quality_stream_idx) {
   const auto lowest_highest_quality_streams =
@@ -118,14 +118,13 @@
       std::distance(streams.begin(), lowest_highest_quality_streams.second);
 }
 
-std::vector<uint32_t> GetStreamStartBitratesKbps(
-    const webrtc::VideoCodec& codec) {
+std::vector<uint32_t> GetStreamStartBitratesKbps(const Environment& env,
+                                                 const VideoCodec& codec) {
   std::vector<uint32_t> start_bitrates;
-  std::unique_ptr<webrtc::VideoBitrateAllocator> rate_allocator =
-      std::make_unique<webrtc::SimulcastRateAllocator>(codec);
-  webrtc::VideoBitrateAllocation allocation =
-      rate_allocator->Allocate(webrtc::VideoBitrateAllocationParameters(
-          codec.startBitrate * 1000, codec.maxFramerate));
+  VideoBitrateAllocation allocation =
+      SimulcastRateAllocator(env, codec)
+          .Allocate(VideoBitrateAllocationParameters(codec.startBitrate * 1000,
+                                                     codec.maxFramerate));
 
   int total_streams_count = CountAllStreams(codec);
   for (int i = 0; i < total_streams_count; ++i) {
@@ -137,8 +136,6 @@
 
 }  // namespace
 
-namespace webrtc {
-
 SimulcastEncoderAdapter::EncoderContext::EncoderContext(
     std::unique_ptr<VideoEncoder> encoder,
     bool prefer_temporal_support,
@@ -377,7 +374,7 @@
 
   // Multi-encoder simulcast or singlecast (deactivated layers).
   std::vector<uint32_t> stream_start_bitrate_kbps =
-      GetStreamStartBitratesKbps(codec_);
+      GetStreamStartBitratesKbps(env_, codec_);
 
   for (int stream_idx = 0; stream_idx < total_streams_count_; ++stream_idx) {
     if (!is_legacy_singlecast && !codec_.simulcastStream[stream_idx].active) {
diff --git a/media/engine/simulcast_encoder_adapter_unittest.cc b/media/engine/simulcast_encoder_adapter_unittest.cc
index b4d6b11..049c78e 100644
--- a/media/engine/simulcast_encoder_adapter_unittest.cc
+++ b/media/engine/simulcast_encoder_adapter_unittest.cc
@@ -447,7 +447,7 @@
 
   void SetUp() override {
     helper_ = std::make_unique<TestSimulcastEncoderAdapterFakeHelper>(
-        CreateEnvironment(&field_trials_), use_fallback_factory_,
+        env_, use_fallback_factory_,
         SdpVideoFormat("VP8", sdp_video_parameters_));
     adapter_ = helper_->CreateMockEncoderAdapter();
     last_encoded_image_width_ = absl::nullopt;
@@ -503,7 +503,7 @@
         codec_.simulcastStream[stream_idx].active = active_streams[stream_idx];
       }
     }
-    rate_allocator_.reset(new SimulcastRateAllocator(codec_));
+    rate_allocator_ = std::make_unique<SimulcastRateAllocator>(env_, codec_);
     EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
     adapter_->RegisterEncodeCompleteCallback(this);
   }
@@ -579,6 +579,8 @@
   }
 
  protected:
+  test::ScopedKeyValueConfig field_trials_;
+  const Environment env_ = CreateEnvironment(&field_trials_);
   std::unique_ptr<TestSimulcastEncoderAdapterFakeHelper> helper_;
   std::unique_ptr<VideoEncoder> adapter_;
   VideoCodec codec_;
@@ -588,7 +590,6 @@
   std::unique_ptr<SimulcastRateAllocator> rate_allocator_;
   bool use_fallback_factory_;
   CodecParameterMap sdp_video_parameters_;
-  test::ScopedKeyValueConfig field_trials_;
 };
 
 TEST_F(TestSimulcastEncoderAdapterFake, InitEncode) {
@@ -662,7 +663,7 @@
   SimulcastTestFixtureImpl::DefaultSettings(
       &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
       kVideoCodecVP8);
-  rate_allocator_.reset(new SimulcastRateAllocator(codec_));
+  rate_allocator_ = std::make_unique<SimulcastRateAllocator>(env_, codec_);
   adapter_->RegisterEncodeCompleteCallback(this);
   const uint32_t target_bitrate =
       1000 * (codec_.simulcastStream[0].targetBitrate +
@@ -913,7 +914,7 @@
   codec_.minBitrate = 50;
   codec_.numberOfSimulcastStreams = 1;
   EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
-  rate_allocator_.reset(new SimulcastRateAllocator(codec_));
+  rate_allocator_ = std::make_unique<SimulcastRateAllocator>(env_, codec_);
 
   // Above min should be respected.
   VideoBitrateAllocation target_bitrate = rate_allocator_->Allocate(
@@ -1110,7 +1111,7 @@
   SimulcastTestFixtureImpl::DefaultSettings(
       &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
       kVideoCodecVP8);
-  rate_allocator_.reset(new SimulcastRateAllocator(codec_));
+  rate_allocator_ = std::make_unique<SimulcastRateAllocator>(env_, codec_);
   adapter_->RegisterEncodeCompleteCallback(this);
 
   // Input data.
@@ -1299,7 +1300,7 @@
   SimulcastTestFixtureImpl::DefaultSettings(
       &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
       kVideoCodecVP8);
-  rate_allocator_.reset(new SimulcastRateAllocator(codec_));
+  rate_allocator_ = std::make_unique<SimulcastRateAllocator>(env_, codec_);
   adapter_->RegisterEncodeCompleteCallback(this);
 
   // Only enough start bitrate for the lowest stream.
@@ -1337,7 +1338,7 @@
   SimulcastTestFixtureImpl::DefaultSettings(
       &codec_, static_cast<const int*>(kTestTemporalLayerProfile),
       kVideoCodecVP8);
-  rate_allocator_.reset(new SimulcastRateAllocator(codec_));
+  rate_allocator_ = std::make_unique<SimulcastRateAllocator>(env_, codec_);
   adapter_->RegisterEncodeCompleteCallback(this);
 
   // Only enough start bitrate for the lowest stream.
@@ -1584,7 +1585,7 @@
   const DataRate bandwidth_allocation =
       target_bitrate + DataRate::KilobitsPerSec(600);
 
-  rate_allocator_.reset(new SimulcastRateAllocator(codec_));
+  rate_allocator_ = std::make_unique<SimulcastRateAllocator>(env_, codec_);
   EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
   adapter_->RegisterEncodeCompleteCallback(this);
 
@@ -1620,7 +1621,7 @@
       kVideoCodecVP8);
   codec_.numberOfSimulcastStreams = 3;
 
-  rate_allocator_.reset(new SimulcastRateAllocator(codec_));
+  rate_allocator_ = std::make_unique<SimulcastRateAllocator>(env_, codec_);
   EXPECT_EQ(0, adapter_->InitEncode(&codec_, kSettings));
   adapter_->RegisterEncodeCompleteCallback(this);
 
diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn
index 1b3a244..c8b3a86 100644
--- a/modules/video_coding/BUILD.gn
+++ b/modules/video_coding/BUILD.gn
@@ -420,9 +420,9 @@
     ":video_codec_interface",
     "../../api:array_view",
     "../../api:field_trials_view",
-    "../../api:field_trials_view",
     "../../api:scoped_refptr",
     "../../api:sequence_checker",
+    "../../api/environment",
     "../../api/units:time_delta",
     "../../api/video:encoded_frame",
     "../../api/video:encoded_image",
@@ -453,7 +453,6 @@
     "../../rtc_base/system:file_wrapper",
     "../../rtc_base/system:no_unique_address",
     "../../rtc_base/task_utils:repeating_task",
-    "../../system_wrappers:field_trial",
     "../rtp_rtcp:rtp_rtcp_format",
     "svc:scalability_mode_util",
   ]
diff --git a/modules/video_coding/codecs/h264/h264_encoder_impl.cc b/modules/video_coding/codecs/h264/h264_encoder_impl.cc
index 5b21d6c..cfd89d1 100644
--- a/modules/video_coding/codecs/h264/h264_encoder_impl.cc
+++ b/modules/video_coding/codecs/h264/h264_encoder_impl.cc
@@ -174,7 +174,8 @@
 
 H264EncoderImpl::H264EncoderImpl(const Environment& env,
                                  H264EncoderSettings settings)
-    : packetization_mode_(settings.packetization_mode),
+    : env_(env),
+      packetization_mode_(settings.packetization_mode),
       max_payload_size_(0),
       number_of_cores_(0),
       encoded_image_callback_(nullptr),
@@ -326,7 +327,7 @@
     }
   }
 
-  SimulcastRateAllocator init_allocator(codec_);
+  SimulcastRateAllocator init_allocator(env_, codec_);
   VideoBitrateAllocation allocation =
       init_allocator.Allocate(VideoBitrateAllocationParameters(
           DataRate::KilobitsPerSec(codec_.startBitrate), codec_.maxFramerate));
diff --git a/modules/video_coding/codecs/h264/h264_encoder_impl.h b/modules/video_coding/codecs/h264/h264_encoder_impl.h
index cfc28d7..2818711 100644
--- a/modules/video_coding/codecs/h264/h264_encoder_impl.h
+++ b/modules/video_coding/codecs/h264/h264_encoder_impl.h
@@ -106,6 +106,7 @@
   absl::InlinedVector<absl::optional<ScalabilityMode>, kMaxSimulcastStreams>
       scalability_modes_;
 
+  const Environment env_;
   VideoCodec codec_;
   H264PacketizationMode packetization_mode_;
   size_t max_payload_size_;
diff --git a/modules/video_coding/codecs/vp8/default_temporal_layers_unittest.cc b/modules/video_coding/codecs/vp8/default_temporal_layers_unittest.cc
index ac9c565..85ec7fe 100644
--- a/modules/video_coding/codecs/vp8/default_temporal_layers_unittest.cc
+++ b/modules/video_coding/codecs/vp8/default_temporal_layers_unittest.cc
@@ -13,6 +13,7 @@
 #include <cstdint>
 #include <memory>
 
+#include "api/environment/environment_factory.h"
 #include "api/video/video_bitrate_allocation.h"
 #include "api/video_codecs/video_codec.h"
 #include "api/video_codecs/vp8_frame_config.h"
@@ -98,7 +99,7 @@
   codec.simulcastStream[0].maxBitrate = target_bitrate_kbps;
   codec.simulcastStream[0].numberOfTemporalLayers = num_temporal_layers;
   codec.simulcastStream[0].active = true;
-  SimulcastRateAllocator allocator(codec);
+  SimulcastRateAllocator allocator(CreateEnvironment(), codec);
   return allocator
       .Allocate(
           VideoBitrateAllocationParameters(target_bitrate_kbps, framerate_fps))
diff --git a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc
index a5036cf..6dcdbfd 100644
--- a/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc
+++ b/modules/video_coding/codecs/vp8/libvpx_vp8_encoder.cc
@@ -678,7 +678,7 @@
   // Note the order we use is different from webm, we have lowest resolution
   // at position 0 and they have highest resolution at position 0.
   const size_t stream_idx_cfg_0 = encoders_.size() - 1;
-  SimulcastRateAllocator init_allocator(codec_);
+  SimulcastRateAllocator init_allocator(env_, codec_);
   VideoBitrateAllocation allocation =
       init_allocator.Allocate(VideoBitrateAllocationParameters(
           inst->startBitrate * 1000, inst->maxFramerate));
diff --git a/modules/video_coding/utility/simulcast_rate_allocator.cc b/modules/video_coding/utility/simulcast_rate_allocator.cc
index 1496934..3ef4d43 100644
--- a/modules/video_coding/utility/simulcast_rate_allocator.cc
+++ b/modules/video_coding/utility/simulcast_rate_allocator.cc
@@ -20,9 +20,9 @@
 #include <tuple>
 #include <vector>
 
+#include "api/environment/environment.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/experiments/rate_control_settings.h"
-#include "system_wrappers/include/field_trial.h"
 
 namespace webrtc {
 namespace {
@@ -64,6 +64,14 @@
       rate_control_settings_(RateControlSettings::ParseFromFieldTrials()),
       legacy_conference_mode_(false) {}
 
+SimulcastRateAllocator::SimulcastRateAllocator(const Environment& env,
+                                               const VideoCodec& codec)
+    : codec_(codec),
+      stable_rate_settings_(StableTargetRateExperiment::ParseFromKeyValueConfig(
+          &env.field_trials())),
+      rate_control_settings_(env.field_trials()),
+      legacy_conference_mode_(false) {}
+
 SimulcastRateAllocator::~SimulcastRateAllocator() = default;
 
 VideoBitrateAllocation SimulcastRateAllocator::Allocate(
diff --git a/modules/video_coding/utility/simulcast_rate_allocator.h b/modules/video_coding/utility/simulcast_rate_allocator.h
index 6f93dbd..60b2018 100644
--- a/modules/video_coding/utility/simulcast_rate_allocator.h
+++ b/modules/video_coding/utility/simulcast_rate_allocator.h
@@ -16,6 +16,7 @@
 
 #include <vector>
 
+#include "api/environment/environment.h"
 #include "api/video/video_bitrate_allocation.h"
 #include "api/video/video_bitrate_allocator.h"
 #include "api/video_codecs/video_codec.h"
@@ -26,7 +27,8 @@
 
 class SimulcastRateAllocator : public VideoBitrateAllocator {
  public:
-  explicit SimulcastRateAllocator(const VideoCodec& codec);
+  [[deprecated]] explicit SimulcastRateAllocator(const VideoCodec& codec);
+  SimulcastRateAllocator(const Environment& env, const VideoCodec& codec);
   ~SimulcastRateAllocator() override;
 
   SimulcastRateAllocator(const SimulcastRateAllocator&) = delete;
diff --git a/modules/video_coding/utility/simulcast_rate_allocator_unittest.cc b/modules/video_coding/utility/simulcast_rate_allocator_unittest.cc
index 24d7c58..528a40f 100644
--- a/modules/video_coding/utility/simulcast_rate_allocator_unittest.cc
+++ b/modules/video_coding/utility/simulcast_rate_allocator_unittest.cc
@@ -15,16 +15,19 @@
 #include <utility>
 #include <vector>
 
+#include "api/environment/environment.h"
+#include "api/environment/environment_factory.h"
 #include "api/video_codecs/vp8_frame_buffer_controller.h"
 #include "api/video_codecs/vp8_frame_config.h"
 #include "api/video_codecs/vp8_temporal_layers.h"
 #include "rtc_base/checks.h"
-#include "test/field_trial.h"
+#include "test/explicit_key_value_config.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 
 namespace webrtc {
 namespace {
+using test::ExplicitKeyValueConfig;
 using ::testing::_;
 
 constexpr uint32_t kFramerateFps = 5;
@@ -90,9 +93,8 @@
     EXPECT_EQ(sum, actual.get_sum_bps());
   }
 
-  void CreateAllocator(bool legacy_conference_mode = false) {
-    allocator_.reset(new SimulcastRateAllocator(codec_));
-    allocator_->SetLegacyConferenceMode(legacy_conference_mode);
+  void CreateAllocator(Environment env = CreateEnvironment()) {
+    allocator_ = std::make_unique<SimulcastRateAllocator>(env, codec_);
   }
 
   void SetupCodec3SL3TL(const std::vector<bool>& active_streams) {
@@ -298,11 +300,11 @@
 }
 
 TEST_F(SimulcastRateAllocatorTest, BaseHeavy3TLTemporalRateAllocation) {
-  test::ScopedFieldTrials field_trials(
+  ExplicitKeyValueConfig field_trials(
       "WebRTC-UseBaseHeavyVP8TL3RateAllocation/Enabled/");
 
   SetupCodec3SL3TL({true, true, true});
-  CreateAllocator();
+  CreateAllocator(CreateEnvironment(&field_trials));
 
   const VideoBitrateAllocation alloc = GetAllocation(kMinBitrateKbps);
   // 60/20/20.
@@ -583,13 +585,13 @@
 }
 
 TEST_F(SimulcastRateAllocatorTest, StableRate) {
-  webrtc::test::ScopedFieldTrials field_trials(
+  ExplicitKeyValueConfig field_trials(
       "WebRTC-StableTargetRate/"
       "enabled:true,"
       "video_hysteresis_factor:1.1/");
 
   SetupCodec3SL3TL({true, true, true});
-  CreateAllocator();
+  CreateAllocator(CreateEnvironment(&field_trials));
 
   // Let the volatile rate always be be enough for all streams, in this test we
   // are only interested in how the stable rate affects enablement.
@@ -685,7 +687,8 @@
 
 TEST_P(ScreenshareRateAllocationTest, ConferenceBitrateBelowTl0) {
   SetupConferenceScreenshare(GetParam());
-  CreateAllocator(true);
+  CreateAllocator();
+  allocator_->SetLegacyConferenceMode(true);
 
   VideoBitrateAllocation allocation =
       allocator_->Allocate(VideoBitrateAllocationParameters(
@@ -700,7 +703,8 @@
 
 TEST_P(ScreenshareRateAllocationTest, ConferenceBitrateAboveTl0) {
   SetupConferenceScreenshare(GetParam());
-  CreateAllocator(true);
+  CreateAllocator();
+  allocator_->SetLegacyConferenceMode(true);
 
   uint32_t target_bitrate_kbps =
       (kLegacyScreenshareTargetBitrateKbps + kLegacyScreenshareMaxBitrateKbps) /
@@ -721,7 +725,8 @@
 TEST_F(ScreenshareRateAllocationTest, ConferenceBitrateAboveTl1) {
   // This test is only for the non-simulcast case.
   SetupConferenceScreenshare(false);
-  CreateAllocator(true);
+  CreateAllocator();
+  allocator_->SetLegacyConferenceMode(true);
 
   VideoBitrateAllocation allocation =
       allocator_->Allocate(VideoBitrateAllocationParameters(
diff --git a/modules/video_coding/utility/simulcast_test_fixture_impl.cc b/modules/video_coding/utility/simulcast_test_fixture_impl.cc
index 4f0bb32..7180993 100644
--- a/modules/video_coding/utility/simulcast_test_fixture_impl.cc
+++ b/modules/video_coding/utility/simulcast_test_fixture_impl.cc
@@ -259,10 +259,10 @@
     std::unique_ptr<VideoEncoderFactory> encoder_factory,
     std::unique_ptr<VideoDecoderFactory> decoder_factory,
     SdpVideoFormat video_format)
-    : codec_type_(PayloadStringToCodecType(video_format.name)) {
-  Environment env = CreateEnvironment();
-  encoder_ = encoder_factory->Create(env, video_format);
-  decoder_ = decoder_factory->Create(env, video_format);
+    : env_(CreateEnvironment()),
+      codec_type_(PayloadStringToCodecType(video_format.name)) {
+  encoder_ = encoder_factory->Create(env_, video_format);
+  decoder_ = decoder_factory->Create(env_, video_format);
   SetUpCodec((codec_type_ == kVideoCodecVP8 || codec_type_ == kVideoCodecH264)
                  ? kDefaultTemporalLayerProfile
                  : kNoTemporalLayerProfile);
@@ -294,7 +294,7 @@
 }
 
 void SimulcastTestFixtureImpl::SetUpRateAllocator() {
-  rate_allocator_.reset(new SimulcastRateAllocator(settings_));
+  rate_allocator_ = std::make_unique<SimulcastRateAllocator>(env_, settings_);
 }
 
 void SimulcastTestFixtureImpl::SetRates(uint32_t bitrate_kbps, uint32_t fps) {
diff --git a/modules/video_coding/utility/simulcast_test_fixture_impl.h b/modules/video_coding/utility/simulcast_test_fixture_impl.h
index f142ab4..e7a500d 100644
--- a/modules/video_coding/utility/simulcast_test_fixture_impl.h
+++ b/modules/video_coding/utility/simulcast_test_fixture_impl.h
@@ -78,6 +78,7 @@
       int num_spatial_layers);
   void SwitchingToOneStream(int width, int height);
 
+  const Environment env_;
   std::unique_ptr<VideoEncoder> encoder_;
   MockEncodedImageCallback encoder_callback_;
   std::unique_ptr<VideoDecoder> decoder_;
diff --git a/video/video_stream_encoder_unittest.cc b/video/video_stream_encoder_unittest.cc
index 267b7d6..38fe5d4 100644
--- a/video/video_stream_encoder_unittest.cc
+++ b/video/video_stream_encoder_unittest.cc
@@ -4781,7 +4781,7 @@
 
   const int kDefaultFps = 30;
   const VideoBitrateAllocation expected_bitrate =
-      SimulcastRateAllocator(fake_encoder_.config())
+      SimulcastRateAllocator(env_, fake_encoder_.config())
           .Allocate(VideoBitrateAllocationParameters(kLowTargetBitrate.bps(),
                                                      kDefaultFps));