Pass Environment into FlexfecSender

To make it available for FEC to use field trials in follow ups

Bug: webrtc:355577231
Change-Id: Ie0b7761915696e6ee7453df3d0531b0f7ad30ee1
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/358240
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Åsa Persson <asapersson@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42732}
diff --git a/call/rtp_video_sender.cc b/call/rtp_video_sender.cc
index 0eb6395..5d8c4bf 100644
--- a/call/rtp_video_sender.cc
+++ b/call/rtp_video_sender.cc
@@ -168,9 +168,9 @@
 
     RTC_DCHECK_EQ(1U, rtp.flexfec.protected_media_ssrcs.size());
     return std::make_unique<FlexfecSender>(
-        rtp.flexfec.payload_type, rtp.flexfec.ssrc,
+        env, rtp.flexfec.payload_type, rtp.flexfec.ssrc,
         rtp.flexfec.protected_media_ssrcs[0], rtp.mid, rtp.extensions,
-        RTPSender::FecExtensionSizes(), rtp_state, &env.clock());
+        RTPSender::FecExtensionSizes(), rtp_state);
   } else if (rtp.ulpfec.red_payload_type >= 0 &&
              rtp.ulpfec.ulpfec_payload_type >= 0 &&
              !ShouldDisableRedAndUlpfec(/*flexfec_enabled=*/false, rtp,
diff --git a/modules/rtp_rtcp/BUILD.gn b/modules/rtp_rtcp/BUILD.gn
index a1f563b..0892a32 100644
--- a/modules/rtp_rtcp/BUILD.gn
+++ b/modules/rtp_rtcp/BUILD.gn
@@ -288,6 +288,7 @@
     "../../api:transport_api",
     "../../api/audio_codecs:audio_codecs_api",
     "../../api/crypto:frame_encryptor_interface",
+    "../../api/environment:environment",
     "../../api/rtc_event_log",
     "../../api/task_queue:pending_task_safety_flag",
     "../../api/task_queue:task_queue",
@@ -677,6 +678,8 @@
       "../../api:scoped_refptr",
       "../../api:time_controller",
       "../../api:transport_api",
+      "../../api/environment:environment",
+      "../../api/environment:environment_factory",
       "../../api/rtc_event_log",
       "../../api/task_queue",
       "../../api/transport/rtp:dependency_descriptor",
diff --git a/modules/rtp_rtcp/include/flexfec_sender.h b/modules/rtp_rtcp/include/flexfec_sender.h
index 8f21ab7..65ac0e9 100644
--- a/modules/rtp_rtcp/include/flexfec_sender.h
+++ b/modules/rtp_rtcp/include/flexfec_sender.h
@@ -17,6 +17,7 @@
 
 #include "absl/strings/string_view.h"
 #include "api/array_view.h"
+#include "api/environment/environment.h"
 #include "api/rtp_parameters.h"
 #include "api/units/timestamp.h"
 #include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
@@ -30,7 +31,6 @@
 
 namespace webrtc {
 
-class Clock;
 class RtpPacketToSend;
 
 // Note that this class is not thread safe, and thus requires external
@@ -38,14 +38,14 @@
 
 class FlexfecSender : public VideoFecGenerator {
  public:
-  FlexfecSender(int payload_type,
+  FlexfecSender(const Environment& env,
+                int payload_type,
                 uint32_t ssrc,
                 uint32_t protected_media_ssrc,
                 absl::string_view mid,
                 const std::vector<RtpExtension>& rtp_header_extensions,
                 rtc::ArrayView<const RtpExtensionSize> extension_sizes,
-                const RtpState* rtp_state,
-                Clock* clock);
+                const RtpState* rtp_state);
   ~FlexfecSender();
 
   FecType GetFecType() const override {
@@ -76,7 +76,7 @@
 
  private:
   // Utility.
-  Clock* const clock_;
+  const Environment env_;
   Random random_;
   Timestamp last_generated_packet_ = Timestamp::MinusInfinity();
 
diff --git a/modules/rtp_rtcp/source/flexfec_sender.cc b/modules/rtp_rtcp/source/flexfec_sender.cc
index 3a98778..d44b3bc 100644
--- a/modules/rtp_rtcp/source/flexfec_sender.cc
+++ b/modules/rtp_rtcp/source/flexfec_sender.cc
@@ -16,6 +16,7 @@
 #include <utility>
 
 #include "absl/strings/string_view.h"
+#include "api/environment/environment.h"
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
@@ -71,16 +72,16 @@
 }  // namespace
 
 FlexfecSender::FlexfecSender(
+    const Environment& env,
     int payload_type,
     uint32_t ssrc,
     uint32_t protected_media_ssrc,
     absl::string_view mid,
     const std::vector<RtpExtension>& rtp_header_extensions,
     rtc::ArrayView<const RtpExtensionSize> extension_sizes,
-    const RtpState* rtp_state,
-    Clock* clock)
-    : clock_(clock),
-      random_(clock_->TimeInMicroseconds()),
+    const RtpState* rtp_state)
+    : env_(env),
+      random_(env_.clock().TimeInMicroseconds()),
       payload_type_(payload_type),
       // Reset RTP state if this is not the first time we are operating.
       // Otherwise, randomize the initial timestamp offset and RTP sequence
@@ -94,7 +95,7 @@
                          : random_.Rand(1, kMaxInitRtpSeqNumber)),
       ulpfec_generator_(
           ForwardErrorCorrection::CreateFlexfec(ssrc, protected_media_ssrc),
-          clock_),
+          &env_.clock()),
       rtp_header_extension_map_(
           RegisterSupportedExtensions(rtp_header_extensions)),
       header_extensions_size_(
@@ -141,10 +142,10 @@
     fec_packet_to_send->SetTimestamp(
         timestamp_offset_ +
         static_cast<uint32_t>(kMsToRtpTimestamp *
-                              clock_->TimeInMilliseconds()));
+                              env_.clock().TimeInMilliseconds()));
     // Set "capture time" so that the TransmissionOffset header extension
     // can be set by the RTPSender.
-    fec_packet_to_send->set_capture_time(clock_->CurrentTime());
+    fec_packet_to_send->set_capture_time(env_.clock().CurrentTime());
     fec_packet_to_send->SetSsrc(ssrc_);
     // Reserve extensions, if registered. These will be set by the RTPSender.
     fec_packet_to_send->ReserveExtension<AbsoluteSendTime>();
@@ -169,7 +170,7 @@
     ulpfec_generator_.ResetState();
   }
 
-  Timestamp now = clock_->CurrentTime();
+  Timestamp now = env_.clock().CurrentTime();
   if (!fec_packets_to_send.empty() &&
       now - last_generated_packet_ > kPacketLogInterval) {
     RTC_LOG(LS_VERBOSE) << "Generated " << fec_packets_to_send.size()
@@ -191,7 +192,8 @@
 
 DataRate FlexfecSender::CurrentFecRate() const {
   MutexLock lock(&mutex_);
-  return fec_bitrate_.Rate(clock_->CurrentTime()).value_or(DataRate::Zero());
+  return fec_bitrate_.Rate(env_.clock().CurrentTime())
+      .value_or(DataRate::Zero());
 }
 
 absl::optional<RtpState> FlexfecSender::GetRtpState() {
diff --git a/modules/rtp_rtcp/source/flexfec_sender_unittest.cc b/modules/rtp_rtcp/source/flexfec_sender_unittest.cc
index 19614d2..3d46ee3 100644
--- a/modules/rtp_rtcp/source/flexfec_sender_unittest.cc
+++ b/modules/rtp_rtcp/source/flexfec_sender_unittest.cc
@@ -12,6 +12,8 @@
 
 #include <vector>
 
+#include "api/environment/environment.h"
+#include "api/environment/environment_factory.h"
 #include "api/rtp_parameters.h"
 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
 #include "modules/rtp_rtcp/source/fec_test_helper.h"
@@ -83,27 +85,30 @@
 
 TEST(FlexfecSenderTest, Ssrc) {
   SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
-                       kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
+  const Environment env = CreateEnvironment(&clock);
+  FlexfecSender sender(env, kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
+                       kNoMid, kNoRtpHeaderExtensions,
+                       kNoRtpHeaderExtensionSizes, nullptr /* rtp_state */);
 
   EXPECT_EQ(kFlexfecSsrc, sender.FecSsrc());
 }
 
 TEST(FlexfecSenderTest, NoFecAvailableBeforeMediaAdded) {
   SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
-                       kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
+  const Environment env = CreateEnvironment(&clock);
+  FlexfecSender sender(env, kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
+                       kNoMid, kNoRtpHeaderExtensions,
+                       kNoRtpHeaderExtensionSizes, nullptr /* rtp_state */);
 
   EXPECT_TRUE(sender.GetFecPackets().empty());
 }
 
 TEST(FlexfecSenderTest, ProtectOneFrameWithOneFecPacket) {
   SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
-                       kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
+  const Environment env = CreateEnvironment(&clock);
+  FlexfecSender sender(env, kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
+                       kNoMid, kNoRtpHeaderExtensions,
+                       kNoRtpHeaderExtensionSizes, nullptr /* rtp_state */);
   auto fec_packet = GenerateSingleFlexfecPacket(&sender);
 
   EXPECT_EQ(kRtpHeaderSize, fec_packet->headers_size());
@@ -116,6 +121,8 @@
 }
 
 TEST(FlexfecSenderTest, ProtectTwoFramesWithOneFecPacket) {
+  SimulatedClock clock(kInitialSimulatedClockTime);
+  const Environment env = CreateEnvironment(&clock);
   // FEC parameters selected to generate a single FEC packet per frame.
   FecProtectionParams params;
   params.fec_rate = 15;
@@ -123,10 +130,9 @@
   params.fec_mask_type = kFecMaskRandom;
   constexpr size_t kNumFrames = 2;
   constexpr size_t kNumPacketsPerFrame = 2;
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
-                       kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
+  FlexfecSender sender(env, kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
+                       kNoMid, kNoRtpHeaderExtensions,
+                       kNoRtpHeaderExtensionSizes, nullptr /* rtp_state */);
   sender.SetProtectionParameters(params, params);
 
   AugmentedPacketGenerator packet_generator(kMediaSsrc);
@@ -155,6 +161,8 @@
 }
 
 TEST(FlexfecSenderTest, ProtectTwoFramesWithTwoFecPackets) {
+  SimulatedClock clock(kInitialSimulatedClockTime);
+  const Environment env = CreateEnvironment(&clock);
   // FEC parameters selected to generate a single FEC packet per frame.
   FecProtectionParams params;
   params.fec_rate = 30;
@@ -162,10 +170,9 @@
   params.fec_mask_type = kFecMaskRandom;
   constexpr size_t kNumFrames = 2;
   constexpr size_t kNumPacketsPerFrame = 2;
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
-                       kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
+  FlexfecSender sender(env, kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
+                       kNoMid, kNoRtpHeaderExtensions,
+                       kNoRtpHeaderExtensionSizes, nullptr /* rtp_state */);
   sender.SetProtectionParameters(params, params);
 
   AugmentedPacketGenerator packet_generator(kMediaSsrc);
@@ -196,11 +203,12 @@
 
 // In the tests, we only consider RTP header extensions that are useful for BWE.
 TEST(FlexfecSenderTest, NoRtpHeaderExtensionsForBweByDefault) {
-  const std::vector<RtpExtension> kRtpHeaderExtensions{};
   SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
-                       kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
+  const Environment env = CreateEnvironment(&clock);
+  const std::vector<RtpExtension> kRtpHeaderExtensions{};
+  FlexfecSender sender(env, kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
+                       kNoMid, kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
+                       nullptr /* rtp_state */);
   auto fec_packet = GenerateSingleFlexfecPacket(&sender);
 
   EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>());
@@ -209,12 +217,13 @@
 }
 
 TEST(FlexfecSenderTest, RegisterAbsoluteSendTimeRtpHeaderExtension) {
+  SimulatedClock clock(kInitialSimulatedClockTime);
+  const Environment env = CreateEnvironment(&clock);
   const std::vector<RtpExtension> kRtpHeaderExtensions{
       {RtpExtension::kAbsSendTimeUri, 1}};
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
-                       kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
+  FlexfecSender sender(env, kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
+                       kNoMid, kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
+                       nullptr /* rtp_state */);
   auto fec_packet = GenerateSingleFlexfecPacket(&sender);
 
   EXPECT_TRUE(fec_packet->HasExtension<AbsoluteSendTime>());
@@ -223,12 +232,13 @@
 }
 
 TEST(FlexfecSenderTest, RegisterTransmissionOffsetRtpHeaderExtension) {
+  SimulatedClock clock(kInitialSimulatedClockTime);
+  const Environment env = CreateEnvironment(&clock);
   const std::vector<RtpExtension> kRtpHeaderExtensions{
       {RtpExtension::kTimestampOffsetUri, 1}};
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
-                       kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
+  FlexfecSender sender(env, kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
+                       kNoMid, kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
+                       nullptr /* rtp_state */);
   auto fec_packet = GenerateSingleFlexfecPacket(&sender);
 
   EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>());
@@ -237,12 +247,13 @@
 }
 
 TEST(FlexfecSenderTest, RegisterTransportSequenceNumberRtpHeaderExtension) {
+  SimulatedClock clock(kInitialSimulatedClockTime);
+  const Environment env = CreateEnvironment(&clock);
   const std::vector<RtpExtension> kRtpHeaderExtensions{
       {RtpExtension::kTransportSequenceNumberUri, 1}};
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
-                       kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
+  FlexfecSender sender(env, kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
+                       kNoMid, kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
+                       nullptr /* rtp_state */);
   auto fec_packet = GenerateSingleFlexfecPacket(&sender);
 
   EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>());
@@ -251,14 +262,15 @@
 }
 
 TEST(FlexfecSenderTest, RegisterAllRtpHeaderExtensionsForBwe) {
+  SimulatedClock clock(kInitialSimulatedClockTime);
+  const Environment env = CreateEnvironment(&clock);
   const std::vector<RtpExtension> kRtpHeaderExtensions{
       {RtpExtension::kAbsSendTimeUri, 1},
       {RtpExtension::kTimestampOffsetUri, 2},
       {RtpExtension::kTransportSequenceNumberUri, 3}};
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
-                       kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
+  FlexfecSender sender(env, kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
+                       kNoMid, kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
+                       nullptr /* rtp_state */);
   auto fec_packet = GenerateSingleFlexfecPacket(&sender);
 
   EXPECT_TRUE(fec_packet->HasExtension<AbsoluteSendTime>());
@@ -268,19 +280,21 @@
 
 TEST(FlexfecSenderTest, MaxPacketOverhead) {
   SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
-                       kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
+  const Environment env = CreateEnvironment(&clock);
+  FlexfecSender sender(env, kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
+                       kNoMid, kNoRtpHeaderExtensions,
+                       kNoRtpHeaderExtensionSizes, nullptr /* rtp_state */);
 
   EXPECT_EQ(kFlexfecMaxHeaderSize, sender.MaxPacketOverhead());
 }
 
 TEST(FlexfecSenderTest, MaxPacketOverheadWithExtensions) {
+  SimulatedClock clock(kInitialSimulatedClockTime);
+  const Environment env = CreateEnvironment(&clock);
   const std::vector<RtpExtension> kRtpHeaderExtensions{
       {RtpExtension::kAbsSendTimeUri, 1},
       {RtpExtension::kTimestampOffsetUri, 2},
       {RtpExtension::kTransportSequenceNumberUri, 3}};
-  SimulatedClock clock(kInitialSimulatedClockTime);
   const size_t kExtensionHeaderLength = 1;
   const size_t kRtpOneByteHeaderLength = 4;
   const size_t kExtensionsTotalSize =
@@ -288,22 +302,23 @@
                   AbsoluteSendTime::kValueSizeBytes + kExtensionHeaderLength +
                   TransmissionOffset::kValueSizeBytes + kExtensionHeaderLength +
                   TransportSequenceNumber::kValueSizeBytes);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
-                       kRtpHeaderExtensions, RTPSender::FecExtensionSizes(),
-                       nullptr /* rtp_state */, &clock);
+  FlexfecSender sender(env, kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
+                       kNoMid, kRtpHeaderExtensions,
+                       RTPSender::FecExtensionSizes(), nullptr /* rtp_state */);
 
   EXPECT_EQ(kExtensionsTotalSize + kFlexfecMaxHeaderSize,
             sender.MaxPacketOverhead());
 }
 
 TEST(FlexfecSenderTest, MidIncludedInPacketsWhenSet) {
+  SimulatedClock clock(kInitialSimulatedClockTime);
+  const Environment env = CreateEnvironment(&clock);
   const std::vector<RtpExtension> kRtpHeaderExtensions{
       {RtpExtension::kMidUri, 1}};
   const char kMid[] = "mid";
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kMid,
+  FlexfecSender sender(env, kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kMid,
                        kRtpHeaderExtensions, RTPSender::FecExtensionSizes(),
-                       nullptr /* rtp_state */, &clock);
+                       nullptr /* rtp_state */);
 
   auto fec_packet = GenerateSingleFlexfecPacket(&sender);
 
@@ -313,13 +328,14 @@
 }
 
 TEST(FlexfecSenderTest, SetsAndGetsRtpState) {
+  SimulatedClock clock(kInitialSimulatedClockTime);
+  const Environment env = CreateEnvironment(&clock);
   RtpState initial_rtp_state;
   initial_rtp_state.sequence_number = 100;
   initial_rtp_state.start_timestamp = 200;
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
-                       kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       &initial_rtp_state, &clock);
+  FlexfecSender sender(env, kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
+                       kNoMid, kNoRtpHeaderExtensions,
+                       kNoRtpHeaderExtensionSizes, &initial_rtp_state);
 
   auto fec_packet = GenerateSingleFlexfecPacket(&sender);
   EXPECT_EQ(initial_rtp_state.sequence_number, fec_packet->SequenceNumber());
diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc b/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc
index 6dd6ae8..d8085c2 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc
@@ -17,6 +17,8 @@
 #include <utility>
 
 #include "absl/types/optional.h"
+#include "api/environment/environment.h"
+#include "api/environment/environment_factory.h"
 #include "api/field_trials_registry.h"
 #include "api/units/time_delta.h"
 #include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
@@ -30,7 +32,6 @@
 #include "rtc_base/logging.h"
 #include "rtc_base/rate_limiter.h"
 #include "rtc_base/strings/string_builder.h"
-#include "test/explicit_key_value_config.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 #include "test/rtcp_packet_parser.h"
@@ -46,8 +47,6 @@
 using ::testing::Optional;
 using ::testing::SizeIs;
 
-using webrtc::test::ExplicitKeyValueConfig;
-
 namespace webrtc {
 namespace {
 constexpr uint32_t kSenderSsrc = 0x12345;
@@ -170,21 +169,18 @@
     uint32_t ssrc;
   };
 
-  RtpRtcpModule(GlobalSimulatedTimeController* time_controller,
-                bool is_sender,
-                const FieldTrialsRegistry& trials)
-      : time_controller_(time_controller),
+  RtpRtcpModule(const Environment& env,
+                GlobalSimulatedTimeController* time_controller,
+                bool is_sender)
+      : env_(env),
         is_sender_(is_sender),
-        trials_(trials),
-        receive_statistics_(
-            ReceiveStatistics::Create(time_controller->GetClock())),
+        receive_statistics_(ReceiveStatistics::Create(&env.clock())),
         transport_(kOneWayNetworkDelay, time_controller) {
     CreateModuleImpl();
   }
 
-  TimeController* const time_controller_;
+  const Environment env_;
   const bool is_sender_;
-  const FieldTrialsRegistry& trials_;
   RtcpPacketTypeCounter packets_sent_;
   RtcpPacketTypeCounter packets_received_;
   std::unique_ptr<ReceiveStatistics> receive_statistics_;
@@ -242,7 +238,7 @@
   void CreateModuleImpl() {
     RtpRtcpInterface::Configuration config;
     config.audio = false;
-    config.clock = time_controller_->GetClock();
+    config.clock = &env_.clock();
     config.outgoing_transport = &transport_;
     config.receive_statistics = receive_statistics_.get();
     config.rtcp_packet_type_counter_observer = this;
@@ -253,7 +249,7 @@
         is_sender_ ? absl::make_optional(kRtxSenderSsrc) : absl::nullopt;
     config.need_rtp_packet_infos = true;
     config.non_sender_rtt_measurement = true;
-    config.field_trials = &trials_;
+    config.field_trials = &env_.field_trials();
     config.send_packet_observer = this;
     config.fec_generator = fec_generator_;
     impl_.reset(new ModuleRtpRtcpImpl2(config));
@@ -273,13 +269,14 @@
  protected:
   RtpRtcpImpl2Test()
       : time_controller_(Timestamp::Micros(133590000000000)),
-        field_trials_(""),
-        sender_(&time_controller_,
-                /*is_sender=*/true,
-                field_trials_),
-        receiver_(&time_controller_,
-                  /*is_sender=*/false,
-                  field_trials_) {}
+        env_(CreateEnvironment(time_controller_.GetClock(),
+                               time_controller_.CreateTaskQueueFactory())),
+        sender_(env_,
+                &time_controller_,
+                /*is_sender=*/true),
+        receiver_(env_,
+                  &time_controller_,
+                  /*is_sender=*/false) {}
 
   void SetUp() override {
     // Send module.
@@ -291,7 +288,7 @@
     RTPSenderVideo::Config video_config;
     video_config.clock = time_controller_.GetClock();
     video_config.rtp_sender = sender_.impl_->RtpSender();
-    video_config.field_trials = &field_trials_;
+    video_config.field_trials = &env_.field_trials();
     sender_video_ = std::make_unique<RTPSenderVideo>(video_config);
 
     // Receive module.
@@ -318,7 +315,7 @@
     RTPSenderVideo::Config video_config;
     video_config.clock = time_controller_.GetClock();
     video_config.rtp_sender = sender_.impl_->RtpSender();
-    video_config.field_trials = &field_trials_;
+    video_config.field_trials = &env_.field_trials();
     video_config.fec_overhead_bytes = fec_generator->MaxPacketOverhead();
     video_config.fec_type = fec_generator->GetFecType();
     video_config.red_payload_type = red_payload_type;
@@ -326,7 +323,7 @@
   }
 
   GlobalSimulatedTimeController time_controller_;
-  test::ExplicitKeyValueConfig field_trials_;
+  const Environment env_;
   RtpRtcpModule sender_;
   std::unique_ptr<RTPSenderVideo> sender_video_;
   RtpRtcpModule receiver_;
@@ -1008,9 +1005,9 @@
   const uint16_t fec_start_seq = sender_.impl_->SequenceNumber() + 100;
   RtpState start_state;
   start_state.sequence_number = fec_start_seq;
-  FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexfecSsrc, kSenderSsrc,
-                               kNoMid, kNoRtpExtensions, kNoRtpExtensionSizes,
-                               &start_state, time_controller_.GetClock());
+  FlexfecSender flexfec_sender(env_, kFlexfecPayloadType, kFlexfecSsrc,
+                               kSenderSsrc, kNoMid, kNoRtpExtensions,
+                               kNoRtpExtensionSizes, &start_state);
   ReinitWithFec(&flexfec_sender, /*red_payload_type=*/absl::nullopt);
 
   // Parameters selected to generate a single FEC packet per media packet.
diff --git a/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc
index b833b65..1835627 100644
--- a/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc
@@ -16,6 +16,8 @@
 #include "absl/types/optional.h"
 #include "api/array_view.h"
 #include "api/call/transport.h"
+#include "api/environment/environment.h"
+#include "api/environment/environment_factory.h"
 #include "api/field_trials_registry.h"
 #include "api/units/data_size.h"
 #include "api/units/timestamp.h"
@@ -27,7 +29,6 @@
 #include "modules/rtp_rtcp/source/rtp_packet_history.h"
 #include "modules/rtp_rtcp/source/rtp_packet_received.h"
 #include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "test/explicit_key_value_config.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 #include "test/time_controller/simulated_time_controller.h"
@@ -115,11 +116,11 @@
  protected:
   RtpSenderEgressTest()
       : time_controller_(kStartTime),
+        env_(CreateEnvironment(time_controller_.GetClock())),
         clock_(time_controller_.GetClock()),
         transport_(&header_extensions_),
         packet_history_(clock_,
                         RtpPacketHistory::PaddingMode::kRecentLargePacket),
-        trials_(""),
         sequence_number_(kStartSequenceNumber) {}
 
   std::unique_ptr<RtpSenderEgress> CreateRtpSenderEgress() {
@@ -138,7 +139,7 @@
     config.send_packet_observer = &send_packet_observer_;
     config.rtp_stats_callback = &mock_rtp_stats_callback_;
     config.populate_network2_timestamp = false;
-    config.field_trials = &trials_;
+    config.field_trials = &env_.field_trials();
     return config;
   }
 
@@ -164,6 +165,7 @@
   }
 
   GlobalSimulatedTimeController time_controller_;
+  const Environment env_;
   Clock* const clock_;
   NiceMock<MockRtcEventLog> mock_rtc_event_log_;
   NiceMock<MockStreamDataCountersCallback> mock_rtp_stats_callback_;
@@ -171,7 +173,6 @@
   RtpHeaderExtensionMap header_extensions_;
   NiceMock<TestTransport> transport_;
   RtpPacketHistory packet_history_;
-  test::ExplicitKeyValueConfig trials_;
   uint16_t sequence_number_;
 };
 
@@ -837,9 +838,10 @@
   const size_t kPayloadSize = 1000;
 
   const rtc::ArrayView<const RtpExtensionSize> kNoRtpHeaderExtensionSizes;
-  FlexfecSender flexfec(kFlexfectPayloadType, kFlexFecSsrc, kSsrc, /*mid=*/"",
+  FlexfecSender flexfec(env_, kFlexfectPayloadType, kFlexFecSsrc, kSsrc,
+                        /*mid=*/"",
                         /*header_extensions=*/{}, kNoRtpHeaderExtensionSizes,
-                        /*rtp_state=*/nullptr, time_controller_.GetClock());
+                        /*rtp_state=*/nullptr);
   RtpRtcpInterface::Configuration config = DefaultConfig();
   config.fec_generator = &flexfec;
   auto sender = std::make_unique<RtpSenderEgress>(config, &packet_history_);
diff --git a/modules/rtp_rtcp/source/rtp_sender_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_unittest.cc
index 8586f4b..80ca319 100644
--- a/modules/rtp_rtcp/source/rtp_sender_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_unittest.cc
@@ -14,6 +14,8 @@
 #include <vector>
 
 #include "absl/strings/string_view.h"
+#include "api/environment/environment.h"
+#include "api/environment/environment_factory.h"
 #include "api/rtc_event_log/rtc_event.h"
 #include "api/rtp_packet_sender.h"
 #include "api/units/frequency.h"
@@ -38,7 +40,6 @@
 #include "rtc_base/logging.h"
 #include "rtc_base/rate_limiter.h"
 #include "rtc_base/strings/string_builder.h"
-#include "test/explicit_key_value_config.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 #include "test/mock_transport.h"
@@ -116,16 +117,16 @@
  protected:
   RtpSenderTest()
       : time_controller_(Timestamp::Millis(kStartTime)),
-        clock_(time_controller_.GetClock()),
-        retransmission_rate_limiter_(clock_, 1000),
-        flexfec_sender_(0,
+        env_(CreateEnvironment(time_controller_.GetClock())),
+        retransmission_rate_limiter_(&env_.clock(), 1000),
+        flexfec_sender_(env_,
+                        0,
                         kFlexFecSsrc,
                         kSsrc,
                         "",
                         std::vector<RtpExtension>(),
                         std::vector<RtpExtensionSize>(),
-                        nullptr,
-                        clock_) {}
+                        nullptr) {}
 
   void SetUp() override { SetUpRtpSender(true, false, nullptr); }
 
@@ -141,13 +142,13 @@
 
   RtpRtcpInterface::Configuration GetDefaultConfig() {
     RtpRtcpInterface::Configuration config;
-    config.clock = clock_;
+    config.clock = &env_.clock();
     config.local_media_ssrc = kSsrc;
     config.rtx_send_ssrc = kRtxSsrc;
     config.event_log = &mock_rtc_event_log_;
     config.retransmission_rate_limiter = &retransmission_rate_limiter_;
     config.paced_sender = &mock_paced_sender_;
-    config.field_trials = &field_trials_;
+    config.field_trials = &env_.field_trials();
     // Configure rid unconditionally, it has effect only if
     // corresponding header extension is enabled.
     config.rid = std::string(kRid);
@@ -159,7 +160,7 @@
         config.clock, RtpPacketHistory::PaddingMode::kRecentLargePacket);
     sequencer_.emplace(kSsrc, kRtxSsrc,
                        /*require_marker_before_media_padding=*/!config.audio,
-                       clock_);
+                       &env_.clock());
     rtp_sender_ = std::make_unique<RTPSender>(config, packet_history_.get(),
                                               config.paced_sender);
     sequencer_->set_media_sequence_number(kSeqNum);
@@ -167,7 +168,7 @@
   }
 
   GlobalSimulatedTimeController time_controller_;
-  Clock* const clock_;
+  const Environment env_;
   NiceMock<MockRtcEventLog> mock_rtc_event_log_;
   MockRtpPacketPacer mock_paced_sender_;
   RateLimiter retransmission_rate_limiter_;
@@ -177,8 +178,6 @@
   std::unique_ptr<RtpPacketHistory> packet_history_;
   std::unique_ptr<RTPSender> rtp_sender_;
 
-  const test::ExplicitKeyValueConfig field_trials_{""};
-
   std::unique_ptr<RtpPacketToSend> BuildRtpPacket(int payload_type,
                                                   bool marker_bit,
                                                   uint32_t rtp_timestamp,
@@ -211,7 +210,7 @@
     // Use maximum allowed size to catch corner cases when packet is dropped
     // because of lack of capacity for the media packet, or for an rtx packet
     // containing the media packet.
-    return SendPacket(/*capture_time=*/clock_->CurrentTime(),
+    return SendPacket(/*capture_time=*/env_.clock().CurrentTime(),
                       /*payload_length=*/rtp_sender_->MaxRtpPacketSize() -
                           rtp_sender_->ExpectedPerPacketOverhead());
   }
@@ -345,7 +344,7 @@
   std::vector<std::unique_ptr<RtpPacketToSend>> packets(1);
   packets[0] =
       BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, Timestamp::Zero());
-  Timestamp now = clock_->CurrentTime();
+  Timestamp now = env_.clock().CurrentTime();
 
   EXPECT_CALL(mock_paced_sender_,
               EnqueuePackets(ElementsAre(AllOf(
@@ -358,7 +357,7 @@
 TEST_F(RtpSenderTest, ReSendPacketForwardsPacketsToPacer) {
   packet_history_->SetStorePacketsStatus(
       RtpPacketHistory::StorageMode::kStoreAndCull, 10);
-  Timestamp now = clock_->CurrentTime();
+  Timestamp now = env_.clock().CurrentTime();
   auto packet = BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, now);
   packet->SetSequenceNumber(kSeqNum);
   packet->set_allow_retransmission(true);
@@ -380,7 +379,7 @@
   constexpr int kNumPaddingPackets = 4;
   EXPECT_CALL(mock_paced_sender_, EnqueuePackets);
   std::unique_ptr<RtpPacketToSend> media_packet =
-      SendPacket(/*capture_time=*/clock_->CurrentTime(),
+      SendPacket(/*capture_time=*/env_.clock().CurrentTime(),
                  /*payload_size=*/100);
   sequencer_->Sequence(*media_packet);
 
@@ -413,7 +412,7 @@
           &RtpPacketToSend::Timestamp, Gt(media_packet->Timestamp()))))));
 
   std::unique_ptr<RtpPacketToSend> next_media_packet =
-      SendPacket(/*capture_time=*/clock_->CurrentTime(),
+      SendPacket(/*capture_time=*/env_.clock().CurrentTime(),
                  /*payload_size=*/100);
 }
 
@@ -511,7 +510,7 @@
 TEST_F(RtpSenderTest, UpdatesTimestampsOnPlainRtxPadding) {
   EnableRtx();
   // Timestamps as set based on capture time in RtpSenderTest.
-  const Timestamp start_time = clock_->CurrentTime();
+  const Timestamp start_time = env_.clock().CurrentTime();
   const uint32_t start_timestamp = ToRtpTimestamp(start_time);
 
   // Start by sending one media packet.
@@ -544,7 +543,7 @@
       TransportSequenceNumber::Uri(), kTransportSequenceNumberExtensionId));
   EnableRtx();
   // Timestamps as set based on capture time in RtpSenderTest.
-  const Timestamp start_time = clock_->CurrentTime();
+  const Timestamp start_time = env_.clock().CurrentTime();
   const uint32_t start_timestamp = ToRtpTimestamp(start_time);
   const size_t kPayloadSize = 200;
   const size_t kRtxHeaderSize = 2;
@@ -610,7 +609,7 @@
       .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
         sequencer_->Sequence(*packets[0]);
         packet_history_->PutRtpPacket(std::move(packets[0]),
-                                      clock_->CurrentTime());
+                                      env_.clock().CurrentTime());
       });
   SendGenericPacket();
 
@@ -681,7 +680,7 @@
   EXPECT_CALL(mock_paced_sender_, EnqueuePackets(SizeIs(1)))
       .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
         packet_history_->PutRtpPacket(std::move(packets[0]),
-                                      clock_->CurrentTime());
+                                      env_.clock().CurrentTime());
       });
   auto second_built_packet = SendGenericPacket();
 
@@ -707,7 +706,7 @@
   sequencer_->Sequence(*first_built_packet);
   packet_history_->PutRtpPacket(
       std::make_unique<RtpPacketToSend>(*first_built_packet),
-      /*send_time=*/clock_->CurrentTime());
+      /*send_time=*/env_.clock().CurrentTime());
   rtp_sender_->OnReceivedAckOnSsrc(first_built_packet->SequenceNumber());
 
   // The second packet will include neither since an ack was received.
@@ -715,7 +714,7 @@
   sequencer_->Sequence(*second_built_packet);
   packet_history_->PutRtpPacket(
       std::make_unique<RtpPacketToSend>(*second_built_packet),
-      /*send_time=*/clock_->CurrentTime());
+      /*send_time=*/env_.clock().CurrentTime());
 
   // The first RTX packet will include MID and RRID.
   EXPECT_CALL(mock_paced_sender_, EnqueuePackets(SizeIs(1)))
@@ -753,7 +752,7 @@
       .WillRepeatedly(
           [&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
             packet_history_->PutRtpPacket(std::move(packets[0]),
-                                          clock_->CurrentTime());
+                                          env_.clock().CurrentTime());
           });
   auto media_packet1 = SendGenericPacket();
   rtp_sender_->OnReceivedAckOnSsrc(media_packet1->SequenceNumber());
@@ -815,7 +814,7 @@
   EXPECT_CALL(mock_paced_sender_, EnqueuePackets(SizeIs(1)))
       .WillOnce([&](std::vector<std::unique_ptr<RtpPacketToSend>> packets) {
         packet_history_->PutRtpPacket(std::move(packets[0]),
-                                      clock_->CurrentTime());
+                                      env_.clock().CurrentTime());
       });
   auto built_packet = SendGenericPacket();
 
@@ -837,12 +836,12 @@
   for (int32_t i = 0; i < kNumPackets; ++i) {
     std::unique_ptr<RtpPacketToSend> packet =
         BuildRtpPacket(kPayload, /*marker_bit=*/true, /*rtp_timestamp=*/0,
-                       /*capture_time=*/clock_->CurrentTime());
+                       /*capture_time=*/env_.clock().CurrentTime());
     packet->set_allow_retransmission(true);
     sequencer_->Sequence(*packet);
     sequence_numbers.push_back(packet->SequenceNumber());
     packet_history_->PutRtpPacket(std::move(packet),
-                                  /*send_time=*/clock_->CurrentTime());
+                                  /*send_time=*/env_.clock().CurrentTime());
     time_controller_.AdvanceTime(TimeDelta::Millis(1));
   }
 
@@ -989,10 +988,10 @@
 
   // Build a media packet and put in the packet history.
   std::unique_ptr<RtpPacketToSend> packet =
-      BuildRtpPacket(kPayload, true, 0, clock_->CurrentTime());
+      BuildRtpPacket(kPayload, true, 0, env_.clock().CurrentTime());
   const uint16_t media_sequence_number = packet->SequenceNumber();
   packet->set_allow_retransmission(true);
-  packet_history_->PutRtpPacket(std::move(packet), clock_->CurrentTime());
+  packet_history_->PutRtpPacket(std::move(packet), env_.clock().CurrentTime());
 
   // Simulate successful retransmission request.
   time_controller_.AdvanceTime(TimeDelta::Millis(30));
@@ -1016,13 +1015,13 @@
 
   // Build a media packet and put in the packet history.
   std::unique_ptr<RtpPacketToSend> packet =
-      BuildRtpPacket(kPayload, true, 0, clock_->CurrentTime());
+      BuildRtpPacket(kPayload, true, 0, env_.clock().CurrentTime());
   const uint32_t kMediaSsrc = 567;
   const uint16_t kMediaSequenceNumber = 123;
   packet->SetSsrc(kMediaSsrc);
   packet->SetSequenceNumber(kMediaSequenceNumber);
   packet->set_allow_retransmission(true);
-  packet_history_->PutRtpPacket(std::move(packet), clock_->CurrentTime());
+  packet_history_->PutRtpPacket(std::move(packet), env_.clock().CurrentTime());
 
   // Expect a retransmission packet marked with which packet it is a
   // retransmit of.
@@ -1051,11 +1050,11 @@
 
   // Put a packet in the history, in order to facilitate payload padding.
   std::unique_ptr<RtpPacketToSend> packet =
-      BuildRtpPacket(kPayload, true, 0, clock_->CurrentTime());
+      BuildRtpPacket(kPayload, true, 0, env_.clock().CurrentTime());
   packet->set_allow_retransmission(true);
   packet->SetPayloadSize(kMinPaddingSize);
   packet->set_packet_type(RtpPacketMediaType::kVideo);
-  packet_history_->PutRtpPacket(std::move(packet), clock_->CurrentTime());
+  packet_history_->PutRtpPacket(std::move(packet), env_.clock().CurrentTime());
 
   // Generate a plain padding packet, check that extensions are registered.
   std::vector<std::unique_ptr<RtpPacketToSend>> generated_packets =
@@ -1093,11 +1092,11 @@
 
   const size_t kPayloadPacketSize = kMinPaddingSize;
   std::unique_ptr<RtpPacketToSend> packet =
-      BuildRtpPacket(kPayload, true, 0, clock_->CurrentTime());
+      BuildRtpPacket(kPayload, true, 0, env_.clock().CurrentTime());
   packet->set_allow_retransmission(true);
   packet->SetPayloadSize(kPayloadPacketSize);
   packet->set_packet_type(RtpPacketMediaType::kVideo);
-  packet_history_->PutRtpPacket(std::move(packet), clock_->CurrentTime());
+  packet_history_->PutRtpPacket(std::move(packet), env_.clock().CurrentTime());
 
   // Generated padding has large enough budget that the video packet should be
   // retransmitted as padding.
@@ -1142,11 +1141,11 @@
   // Send a dummy video packet so it ends up in the packet history.
   const size_t kPayloadPacketSize = 1234u;
   std::unique_ptr<RtpPacketToSend> packet =
-      BuildRtpPacket(kPayload, true, 0, clock_->CurrentTime());
+      BuildRtpPacket(kPayload, true, 0, env_.clock().CurrentTime());
   packet->set_allow_retransmission(true);
   packet->SetPayloadSize(kPayloadPacketSize);
   packet->set_packet_type(RtpPacketMediaType::kVideo);
-  packet_history_->PutRtpPacket(std::move(packet), clock_->CurrentTime());
+  packet_history_->PutRtpPacket(std::move(packet), env_.clock().CurrentTime());
 
   // Smallest target size that will result in the sent packet being returned as
   // padding.
@@ -1182,12 +1181,12 @@
   // Send a dummy video packet so it ends up in the packet history. Since we
   // are not using RTX, it should never be used as padding.
   std::unique_ptr<RtpPacketToSend> packet =
-      BuildRtpPacket(kPayload, true, 0, clock_->CurrentTime());
+      BuildRtpPacket(kPayload, true, 0, env_.clock().CurrentTime());
   packet->set_allow_retransmission(true);
   packet->SetPayloadSize(kPayloadPacketSize);
   packet->set_packet_type(RtpPacketMediaType::kVideo);
   sequencer_->Sequence(*packet);
-  packet_history_->PutRtpPacket(std::move(packet), clock_->CurrentTime());
+  packet_history_->PutRtpPacket(std::move(packet), env_.clock().CurrentTime());
 
   // Payload padding not available without RTX, only generate plain padding on
   // the media SSRC.
@@ -1258,7 +1257,7 @@
   EnableRtx();
 
   // Put a packet in the packet history, with current time as capture time.
-  const Timestamp start_time = clock_->CurrentTime();
+  const Timestamp start_time = env_.clock().CurrentTime();
   std::unique_ptr<RtpPacketToSend> packet =
       BuildRtpPacket(kPayload, kMarkerBit, /*rtp_timestamp=*/0,
                      /*capture_time=*/start_time);
@@ -1283,7 +1282,7 @@
   packet_history_->SetRtt(kRtt);
 
   // Put a packet in the history.
-  const Timestamp start_time = clock_->CurrentTime();
+  const Timestamp start_time = env_.clock().CurrentTime();
   std::unique_ptr<RtpPacketToSend> packet =
       BuildRtpPacket(kPayload, kMarkerBit, 0, /*capture_time=*/start_time);
   packet->set_allow_retransmission(true);
@@ -1307,7 +1306,7 @@
   packet_history_->SetRtt(kRtt);
 
   // Put a fec protected packet in the history.
-  const Timestamp start_time = clock_->CurrentTime();
+  const Timestamp start_time = env_.clock().CurrentTime();
   std::unique_ptr<RtpPacketToSend> packet =
       BuildRtpPacket(kPayload, kMarkerBit, 0, start_time);
   packet->set_allow_retransmission(true);
@@ -1327,9 +1326,9 @@
 
 TEST_F(RtpSenderTest, MarksPacketsWithKeyframeStatus) {
   RTPSenderVideo::Config video_config;
-  video_config.clock = clock_;
+  video_config.clock = &env_.clock();
   video_config.rtp_sender = rtp_sender_.get();
-  video_config.field_trials = &field_trials_;
+  video_config.field_trials = &env_.field_trials();
   RTPSenderVideo rtp_sender_video(video_config);
 
   const uint8_t kPayloadType = 127;
@@ -1345,7 +1344,7 @@
         .Times(AtLeast(1));
     RTPVideoHeader video_header;
     video_header.frame_type = VideoFrameType::kVideoFrameKey;
-    Timestamp capture_time = clock_->CurrentTime();
+    Timestamp capture_time = env_.clock().CurrentTime();
     EXPECT_TRUE(rtp_sender_video.SendVideo(
         kPayloadType, kCodecType,
         capture_time.ms() * kCaptureTimeMsToRtpTimestamp, capture_time,
@@ -1362,7 +1361,7 @@
         .Times(AtLeast(1));
     RTPVideoHeader video_header;
     video_header.frame_type = VideoFrameType::kVideoFrameDelta;
-    Timestamp capture_time = clock_->CurrentTime();
+    Timestamp capture_time = env_.clock().CurrentTime();
     EXPECT_TRUE(rtp_sender_video.SendVideo(
         kPayloadType, kCodecType,
         capture_time.ms() * kCaptureTimeMsToRtpTimestamp, capture_time,
diff --git a/test/fuzzers/BUILD.gn b/test/fuzzers/BUILD.gn
index 16c7917..7dbd9a1 100644
--- a/test/fuzzers/BUILD.gn
+++ b/test/fuzzers/BUILD.gn
@@ -163,6 +163,8 @@
 webrtc_fuzzer_test("flexfec_sender_fuzzer") {
   sources = [ "flexfec_sender_fuzzer.cc" ]
   deps = [
+    "../../api/environment",
+    "../../api/environment:environment_factory",
     "../../modules/rtp_rtcp",
     "../../modules/rtp_rtcp:rtp_rtcp_format",
     "../../system_wrappers",
diff --git a/test/fuzzers/flexfec_sender_fuzzer.cc b/test/fuzzers/flexfec_sender_fuzzer.cc
index 8ddd1c0..2c07fdf 100644
--- a/test/fuzzers/flexfec_sender_fuzzer.cc
+++ b/test/fuzzers/flexfec_sender_fuzzer.cc
@@ -10,6 +10,8 @@
 
 #include <memory>
 
+#include "api/environment/environment.h"
+#include "api/environment/environment_factory.h"
 #include "modules/rtp_rtcp/include/flexfec_sender.h"
 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
 #include "modules/rtp_rtcp/source/byte_io.h"
@@ -30,14 +32,21 @@
 }  // namespace
 
 void FuzzOneInput(const uint8_t* data, size_t size) {
+  // Create Environment once because creating it for each input noticably
+  // reduces the speed of the fuzzer.
+  static SimulatedClock* const clock = new SimulatedClock(1);
+  static const Environment* const env =
+      new Environment(CreateEnvironment(clock));
+
   size_t i = 0;
   if (size < 5 || size > 200) {
     return;
   }
-  SimulatedClock clock(1 + data[i++]);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc, kNoMid,
-                       kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
+  // Set time to (1 + data[i++]);
+  clock->AdvanceTimeMicroseconds(1 + data[i++] - clock->TimeInMicroseconds());
+  FlexfecSender sender(*env, kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
+                       kNoMid, kNoRtpHeaderExtensions,
+                       kNoRtpHeaderExtensionSizes, nullptr /* rtp_state */);
   FecProtectionParams params = {
       data[i++], static_cast<int>(data[i++] % 100),
       data[i++] <= 127 ? kFecMaskRandom : kFecMaskBursty};