Pass Environment into RtcpReceiver

to avoid relying on the global field trials.

Bug: webrtc:362762208
Change-Id: I94e96f0a3f16cfd64f7deb4deb4aaa924ac1bba8
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/361865
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Åsa Persson <asapersson@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42982}
diff --git a/modules/rtp_rtcp/BUILD.gn b/modules/rtp_rtcp/BUILD.gn
index 0b9caef..8297e2e 100644
--- a/modules/rtp_rtcp/BUILD.gn
+++ b/modules/rtp_rtcp/BUILD.gn
@@ -295,7 +295,6 @@
     "../../api/rtc_event_log",
     "../../api/task_queue",
     "../../api/task_queue:pending_task_safety_flag",
-    "../../api/transport:field_trial_based_config",
     "../../api/transport:network_control",
     "../../api/transport/rtp:dependency_descriptor",
     "../../api/transport/rtp:rtp_source",
@@ -728,7 +727,6 @@
       "../../test:mock_transport",
       "../../test:rtp_test_utils",
       "../../test:run_loop",
-      "../../test:scoped_key_value_config",
       "../../test:test_support",
       "../../test/time_controller:time_controller",
       "../video_coding:codec_globals_headers",
diff --git a/modules/rtp_rtcp/source/rtcp_receiver.cc b/modules/rtp_rtcp/source/rtcp_receiver.cc
index 3822247..6116470 100644
--- a/modules/rtp_rtcp/source/rtcp_receiver.cc
+++ b/modules/rtp_rtcp/source/rtcp_receiver.cc
@@ -26,8 +26,9 @@
 #include "absl/algorithm/container.h"
 #include "absl/base/attributes.h"
 #include "api/array_view.h"
+#include "api/environment/environment.h"
+#include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
-#include "api/transport/field_trial_based_config.h"
 #include "api/transport/network_types.h"
 #include "api/units/data_rate.h"
 #include "api/units/time_delta.h"
@@ -157,11 +158,12 @@
   std::unique_ptr<rtcp::LossNotification> loss_notification;
 };
 
-RTCPReceiver::RTCPReceiver(const RtpRtcpInterface::Configuration& config,
+RTCPReceiver::RTCPReceiver(const Environment& env,
+                           const RtpRtcpInterface::Configuration& config,
                            ModuleRtpRtcpImpl2* owner)
-    : clock_(config.clock),
+    : env_(env),
       receiver_only_(config.receiver_only),
-      enable_congestion_controller_feedback_(FieldTrialBasedConfig().IsEnabled(
+      enable_congestion_controller_feedback_(env_.field_trials().IsEnabled(
           "WebRTC-RFC8888CongestionControlFeedback")),
       rtp_rtcp_(owner),
       registered_ssrcs_(false, config),
@@ -182,15 +184,16 @@
       report_block_data_observer_(config.report_block_data_observer),
       packet_type_counter_observer_(config.rtcp_packet_type_counter_observer),
       num_skipped_packets_(0),
-      last_skipped_packets_warning_(clock_->CurrentTime()) {
+      last_skipped_packets_warning_(env_.clock().CurrentTime()) {
   RTC_DCHECK(owner);
 }
 
-RTCPReceiver::RTCPReceiver(const RtpRtcpInterface::Configuration& config,
+RTCPReceiver::RTCPReceiver(const Environment& env,
+                           const RtpRtcpInterface::Configuration& config,
                            ModuleRtpRtcp* owner)
-    : clock_(config.clock),
+    : env_(env),
       receiver_only_(config.receiver_only),
-      enable_congestion_controller_feedback_(FieldTrialBasedConfig().IsEnabled(
+      enable_congestion_controller_feedback_(env_.field_trials().IsEnabled(
           "WebRTC-RFC8888CongestionControlFeedback")),
       rtp_rtcp_(owner),
       registered_ssrcs_(true, config),
@@ -211,7 +214,7 @@
       report_block_data_observer_(config.report_block_data_observer),
       packet_type_counter_observer_(config.rtcp_packet_type_counter_observer),
       num_skipped_packets_(0),
-      last_skipped_packets_warning_(clock_->CurrentTime()) {
+      last_skipped_packets_warning_(env_.clock().CurrentTime()) {
   RTC_DCHECK(owner);
   // Dear reader - if you're here because of this log statement and are
   // wondering what this is about, chances are that you are using an instance
@@ -337,7 +340,7 @@
     }
 
     // Check for expired timers and if so, log and reset.
-    Timestamp now = clock_->CurrentTime();
+    Timestamp now = env_.clock().CurrentTime();
     if (RtcpRrTimeoutLocked(now)) {
       RTC_LOG_F(LS_WARNING) << "Timeout: No RTCP RR received.";
     } else if (RtcpRrSequenceNumberTimeoutLocked(now)) {
@@ -371,7 +374,7 @@
   std::vector<rtcp::ReceiveTimeInfo> last_xr_rtis;
   last_xr_rtis.reserve(last_xr_rtis_size);
 
-  const uint32_t now_ntp = CompactNtp(clock_->CurrentNtpTime());
+  const uint32_t now_ntp = CompactNtp(env_.clock().CurrentNtpTime());
 
   for (size_t i = 0; i < last_xr_rtis_size; ++i) {
     RrtrInformation& rrtr = received_rrtrs_.front();
@@ -497,7 +500,7 @@
   }
 
   if (num_skipped_packets_ > 0) {
-    const Timestamp now = clock_->CurrentTime();
+    const Timestamp now = env_.clock().CurrentTime();
     if (now - last_skipped_packets_warning_ >= kMaxWarningLogInterval) {
       last_skipped_packets_warning_ = now;
       RTC_LOG(LS_WARNING)
@@ -550,7 +553,7 @@
 
     remote_sender_.last_remote_timestamp = sender_report.ntp();
     remote_sender_.last_remote_rtp_timestamp = sender_report.rtp_timestamp();
-    remote_sender_.last_arrival_timestamp = clock_->CurrentNtpTime();
+    remote_sender_.last_arrival_timestamp = env_.clock().CurrentNtpTime();
     remote_sender_.packets_sent = sender_report.sender_packet_count();
     remote_sender_.bytes_sent = sender_report.sender_octet_count();
     remote_sender_.reports_count++;
@@ -605,7 +608,7 @@
   if (!registered_ssrcs_.contains(report_block.source_ssrc()))
     return;
 
-  Timestamp now = clock_->CurrentTime();
+  Timestamp now = env_.clock().CurrentTime();
   last_received_rb_ = now;
 
   ReportBlockData* report_block_data =
@@ -616,7 +619,7 @@
     // the last RR was sent from the remote side.
     last_increased_sequence_number_ = last_received_rb_;
   }
-  NtpTime now_ntp = clock_->ConvertTimestampToNtpTime(now);
+  NtpTime now_ntp = env_.clock().ConvertTimestampToNtpTime(now);
   // Number of seconds since 1900 January 1 00:00 GMT (see
   // https://tools.ietf.org/html/rfc868).
   report_block_data->SetReportBlock(
@@ -653,14 +656,14 @@
   // Create or find receive information.
   TmmbrInformation* tmmbr_info = &tmmbr_infos_[remote_ssrc];
   // Update that this remote is alive.
-  tmmbr_info->last_time_received = clock_->CurrentTime();
+  tmmbr_info->last_time_received = env_.clock().CurrentTime();
   return tmmbr_info;
 }
 
 void RTCPReceiver::UpdateTmmbrRemoteIsAlive(uint32_t remote_ssrc) {
   auto tmmbr_it = tmmbr_infos_.find(remote_ssrc);
   if (tmmbr_it != tmmbr_infos_.end())
-    tmmbr_it->second.last_time_received = clock_->CurrentTime();
+    tmmbr_it->second.last_time_received = env_.clock().CurrentTime();
 }
 
 RTCPReceiver::TmmbrInformation* RTCPReceiver::GetTmmbrInformation(
@@ -677,18 +680,18 @@
 // the worker thread and thus no locking is needed.
 bool RTCPReceiver::RtcpRrTimeout() {
   MutexLock lock(&rtcp_receiver_lock_);
-  return RtcpRrTimeoutLocked(clock_->CurrentTime());
+  return RtcpRrTimeoutLocked(env_.clock().CurrentTime());
 }
 
 bool RTCPReceiver::RtcpRrSequenceNumberTimeout() {
   MutexLock lock(&rtcp_receiver_lock_);
-  return RtcpRrSequenceNumberTimeoutLocked(clock_->CurrentTime());
+  return RtcpRrSequenceNumberTimeoutLocked(env_.clock().CurrentTime());
 }
 
 bool RTCPReceiver::UpdateTmmbrTimers() {
   MutexLock lock(&rtcp_receiver_lock_);
 
-  Timestamp timeout = clock_->CurrentTime() - kTmmbrTimeoutInterval;
+  Timestamp timeout = env_.clock().CurrentTime() - kTmmbrTimeoutInterval;
 
   if (oldest_tmmbr_info_ >= timeout)
     return false;
@@ -846,7 +849,8 @@
 void RTCPReceiver::HandleXrReceiveReferenceTime(uint32_t sender_ssrc,
                                                 const rtcp::Rrtr& rrtr) {
   uint32_t received_remote_mid_ntp_time = CompactNtp(rrtr.ntp());
-  uint32_t local_receive_mid_ntp_time = CompactNtp(clock_->CurrentNtpTime());
+  uint32_t local_receive_mid_ntp_time =
+      CompactNtp(env_.clock().CurrentNtpTime());
 
   auto it = received_rrtrs_ssrc_it_.find(sender_ssrc);
   if (it != received_rrtrs_ssrc_it_.end()) {
@@ -886,7 +890,7 @@
   }
 
   uint32_t delay_ntp = rti.delay_since_last_rr;
-  uint32_t now_ntp = CompactNtp(clock_->CurrentNtpTime());
+  uint32_t now_ntp = CompactNtp(env_.clock().CurrentNtpTime());
 
   uint32_t rtt_ntp = now_ntp - delay_ntp - send_time_ntp;
   TimeDelta rtt = CompactNtpRttToTimeDelta(rtt_ntp);
@@ -1029,7 +1033,7 @@
   if (fir.requests().empty())
     return true;
 
-  const Timestamp now = clock_->CurrentTime();
+  const Timestamp now = env_.clock().CurrentTime();
   for (const rtcp::Fir::Request& fir_request : fir.requests()) {
     // Is it our sender that is requested to generate a new keyframe.
     if (local_media_ssrc() != fir_request.ssrc)
@@ -1100,7 +1104,7 @@
     uint64_t bitrate_bps = TMMBRHelp::CalcMinBitrateBps(bounding);
     if (bitrate_bps < std::numeric_limits<int64_t>::max()) {
       network_link_rtcp_observer_->OnReceiverEstimatedMaxBitrate(
-          clock_->CurrentTime(), DataRate::BitsPerSec(bitrate_bps));
+          env_.clock().CurrentTime(), DataRate::BitsPerSec(bitrate_bps));
     }
   }
 
@@ -1162,7 +1166,7 @@
   }
 
   if (network_link_rtcp_observer_) {
-    Timestamp now = clock_->CurrentTime();
+    Timestamp now = env_.clock().CurrentTime();
     if (packet_information.packet_type_flags & kRtcpRemb) {
       network_link_rtcp_observer_->OnReceiverEstimatedMaxBitrate(
           now, DataRate::BitsPerSec(
@@ -1218,7 +1222,7 @@
   MutexLock lock(&rtcp_receiver_lock_);
   std::vector<rtcp::TmmbItem> candidates;
 
-  Timestamp now = clock_->CurrentTime();
+  Timestamp now = env_.clock().CurrentTime();
 
   for (auto& kv : tmmbr_infos_) {
     for (auto it = kv.second.tmmbr.begin(); it != kv.second.tmmbr.end();) {
diff --git a/modules/rtp_rtcp/source/rtcp_receiver.h b/modules/rtp_rtcp/source/rtcp_receiver.h
index 05b5c54..766a808 100644
--- a/modules/rtp_rtcp/source/rtcp_receiver.h
+++ b/modules/rtp_rtcp/source/rtcp_receiver.h
@@ -20,6 +20,7 @@
 
 #include "absl/container/inlined_vector.h"
 #include "api/array_view.h"
+#include "api/environment/environment.h"
 #include "api/sequence_checker.h"
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
@@ -36,7 +37,6 @@
 #include "rtc_base/synchronization/mutex.h"
 #include "rtc_base/system/no_unique_address.h"
 #include "rtc_base/thread_annotations.h"
-#include "system_wrappers/include/clock.h"
 
 namespace webrtc {
 
@@ -95,10 +95,12 @@
     int round_trip_time_measurements_ = 0;
   };
 
-  RTCPReceiver(const RtpRtcpInterface::Configuration& config,
+  RTCPReceiver(const Environment& env,
+               const RtpRtcpInterface::Configuration& config,
                ModuleRtpRtcp* owner);
 
-  RTCPReceiver(const RtpRtcpInterface::Configuration& config,
+  RTCPReceiver(const Environment& env,
+               const RtpRtcpInterface::Configuration& config,
                ModuleRtpRtcpImpl2* owner);
 
   ~RTCPReceiver();
@@ -356,7 +358,7 @@
   bool RtcpRrSequenceNumberTimeoutLocked(Timestamp now)
       RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
 
-  Clock* const clock_;
+  const Environment env_;
   const bool receiver_only_;
   const bool enable_congestion_controller_feedback_;
   ModuleRtpRtcp* const rtp_rtcp_;
diff --git a/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc b/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
index 7b8a15f..31e5d34 100644
--- a/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
+++ b/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
@@ -10,24 +10,35 @@
 
 #include "modules/rtp_rtcp/source/rtcp_receiver.h"
 
+#include <cstddef>
+#include <cstdint>
 #include <memory>
+#include <optional>
 #include <set>
+#include <string>
 #include <utility>
+#include <vector>
 
+#include "absl/strings/string_view.h"
 #include "api/array_view.h"
+#include "api/environment/environment_factory.h"
+#include "api/units/data_rate.h"
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
 #include "api/video/video_bitrate_allocation.h"
 #include "api/video/video_bitrate_allocator.h"
+#include "api/video/video_codec_constants.h"
 #include "modules/rtp_rtcp/include/report_block_data.h"
+#include "modules/rtp_rtcp/include/rtcp_statistics.h"
+#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
 #include "modules/rtp_rtcp/mocks/mock_network_link_rtcp_observer.h"
 #include "modules/rtp_rtcp/source/byte_io.h"
 #include "modules/rtp_rtcp/source/ntp_time_util.h"
-#include "modules/rtp_rtcp/source/rtcp_packet.h"
 #include "modules/rtp_rtcp/source/rtcp_packet/app.h"
 #include "modules/rtp_rtcp/source/rtcp_packet/bye.h"
 #include "modules/rtp_rtcp/source/rtcp_packet/compound_packet.h"
 #include "modules/rtp_rtcp/source/rtcp_packet/congestion_control_feedback.h"
+#include "modules/rtp_rtcp/source/rtcp_packet/dlrr.h"
 #include "modules/rtp_rtcp/source/rtcp_packet/extended_reports.h"
 #include "modules/rtp_rtcp/source/rtcp_packet/fir.h"
 #include "modules/rtp_rtcp/source/rtcp_packet/nack.h"
@@ -35,17 +46,21 @@
 #include "modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h"
 #include "modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
 #include "modules/rtp_rtcp/source/rtcp_packet/remb.h"
+#include "modules/rtp_rtcp/source/rtcp_packet/rtpfb.h"
 #include "modules/rtp_rtcp/source/rtcp_packet/sdes.h"
 #include "modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
 #include "modules/rtp_rtcp/source/rtcp_packet/tmmbr.h"
 #include "modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
+#include "modules/rtp_rtcp/source/rtp_rtcp_interface.h"
 #include "rtc_base/arraysize.h"
-#include "rtc_base/fake_clock.h"
+#include "rtc_base/buffer.h"
 #include "rtc_base/random.h"
+#include "rtc_base/time_utils.h"
+#include "system_wrappers/include/clock.h"
 #include "system_wrappers/include/ntp_time.h"
+#include "test/explicit_key_value_config.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
-#include "test/scoped_key_value_config.h"
 
 namespace webrtc {
 namespace {
@@ -66,7 +81,7 @@
 using ::testing::StrEq;
 using ::testing::StrictMock;
 using ::testing::UnorderedElementsAre;
-using ::webrtc::test::ScopedKeyValueConfig;
+using ::webrtc::test::ExplicitKeyValueConfig;
 
 class MockRtcpPacketTypeCounterObserver : public RtcpPacketTypeCounterObserver {
  public:
@@ -143,9 +158,8 @@
 }  // namespace
 
 struct ReceiverMocks {
-  ReceiverMocks() : clock(1335900000) {}
-
-  SimulatedClock clock;
+  SimulatedClock clock{1335900000};
+  std::string field_trials;
   // Callbacks to packet_type_counter_observer are frequent but most of the time
   // are not interesting.
   NiceMock<MockRtcpPacketTypeCounterObserver> packet_type_counter_observer;
@@ -154,28 +168,30 @@
   StrictMock<MockVideoBitrateAllocationObserver> bitrate_allocation_observer;
   StrictMock<MockModuleRtpRtcp> rtp_rtcp_impl;
   NiceMock<MockNetworkLinkRtcpObserver> network_link_rtcp_observer;
+
+  RtpRtcpInterface::Configuration config = {
+      .receiver_only = false,
+      .intra_frame_callback = &intra_frame_observer,
+      .rtcp_loss_notification_observer = &rtcp_loss_notification_observer,
+      .network_link_rtcp_observer = &network_link_rtcp_observer,
+      .bitrate_allocation_observer = &bitrate_allocation_observer,
+      .rtcp_packet_type_counter_observer = &packet_type_counter_observer,
+      .rtcp_report_interval_ms = kRtcpIntervalMs,
+      .local_media_ssrc = kReceiverMainSsrc,
+      .rtx_send_ssrc = kReceiverExtraSsrc};
 };
 
-RtpRtcpInterface::Configuration DefaultConfiguration(ReceiverMocks* mocks) {
-  RtpRtcpInterface::Configuration config;
-  config.clock = &mocks->clock;
-  config.receiver_only = false;
-  config.rtcp_packet_type_counter_observer =
-      &mocks->packet_type_counter_observer;
-  config.network_link_rtcp_observer = &mocks->network_link_rtcp_observer;
-  config.intra_frame_callback = &mocks->intra_frame_observer;
-  config.rtcp_loss_notification_observer =
-      &mocks->rtcp_loss_notification_observer;
-  config.bitrate_allocation_observer = &mocks->bitrate_allocation_observer;
-  config.rtcp_report_interval_ms = kRtcpIntervalMs;
-  config.local_media_ssrc = kReceiverMainSsrc;
-  config.rtx_send_ssrc = kReceiverExtraSsrc;
-  return config;
+RTCPReceiver Create(ReceiverMocks& mocks) {
+  return RTCPReceiver(
+      CreateEnvironment(
+          &mocks.clock,
+          std::make_unique<test::ExplicitKeyValueConfig>(mocks.field_trials)),
+      mocks.config, &mocks.rtp_rtcp_impl);
 }
 
 TEST(RtcpReceiverTest, BrokenPacketIsIgnored) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
 
   const uint8_t bad_packet[] = {0, 0, 0, 0};
   EXPECT_CALL(mocks.packet_type_counter_observer, RtcpPacketTypesCounterUpdated)
@@ -185,7 +201,7 @@
 
 TEST(RtcpReceiverTest, InvalidFeedbackPacketIsIgnored) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
 
   // Too short feedback packet.
   const uint8_t bad_packet[] = {0x81, rtcp::Rtpfb::kPacketType, 0, 0};
@@ -197,7 +213,7 @@
 
 TEST(RtcpReceiverTest, InjectSrPacket) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   EXPECT_FALSE(receiver.GetSenderReportStats());
@@ -213,7 +229,7 @@
 
 TEST(RtcpReceiverTest, InjectSrPacketFromUnknownSender) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::SenderReport sr;
@@ -230,7 +246,7 @@
 
 TEST(RtcpReceiverTest, InjectSrPacketCalculatesRTT) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   const TimeDelta kRtt = TimeDelta::Millis(123);
@@ -259,7 +275,7 @@
 
 TEST(RtcpReceiverTest, InjectSrPacketCalculatesNegativeRTTAsOneMs) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   const TimeDelta kRtt = TimeDelta::Millis(-13);
@@ -289,7 +305,7 @@
 
 TEST(RtcpReceiverTest, TwoReportBlocksWithLastOneWithoutLastSrCalculatesRtt) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   const TimeDelta kRtt = TimeDelta::Millis(125);
@@ -317,7 +333,7 @@
 
 TEST(RtcpReceiverTest, InjectRrPacket) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::ReceiverReport rr;
@@ -331,7 +347,7 @@
 
 TEST(RtcpReceiverTest, InjectRrPacketWithReportBlockNotToUsIgnored) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::ReportBlock rb;
@@ -350,7 +366,7 @@
 
 TEST(RtcpReceiverTest, InjectRrPacketWithOneReportBlock) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   Timestamp now = mocks.clock.CurrentTime();
@@ -371,7 +387,7 @@
 
 TEST(RtcpReceiverTest, InjectSrPacketWithOneReportBlock) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   Timestamp now = mocks.clock.CurrentTime();
@@ -395,7 +411,7 @@
   const uint32_t kCumLost[] = {13, 555};
   const uint8_t kFracLost[] = {20, 11};
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   Timestamp now = mocks.clock.CurrentTime();
@@ -473,7 +489,7 @@
   const int32_t kCumLost[] = {13, 555};
   const uint8_t kFracLost[] = {20, 11};
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::ReportBlock rb1;
@@ -525,7 +541,7 @@
 
 TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnReportBlocks) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::ReportBlock rb1;
@@ -559,9 +575,8 @@
   const uint32_t kSentCompactNtp = 0x1234;
   const uint32_t kDelayCompactNtp = 0x222;
   ReceiverMocks mocks;
-  RtpRtcpInterface::Configuration config = DefaultConfiguration(&mocks);
-  config.network_link_rtcp_observer = &mocks.network_link_rtcp_observer;
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  mocks.config.network_link_rtcp_observer = &mocks.network_link_rtcp_observer;
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   // No report block received.
@@ -591,7 +606,7 @@
 // App packets are ignored.
 TEST(RtcpReceiverTest, InjectApp) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::App app;
@@ -606,9 +621,8 @@
 TEST(RtcpReceiverTest, InjectSdesWithOneChunk) {
   ReceiverMocks mocks;
   MockCnameCallbackImpl callback;
-  RtpRtcpInterface::Configuration config = DefaultConfiguration(&mocks);
-  config.rtcp_cname_callback = &callback;
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  mocks.config.rtcp_cname_callback = &callback;
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   const char kCname[] = "alice@host";
@@ -621,7 +635,7 @@
 
 TEST(RtcpReceiverTest, InjectByePacketRemovesReportBlocks) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::ReportBlock rb1;
@@ -655,7 +669,7 @@
 
 TEST(RtcpReceiverTest, InjectByePacketRemovesReferenceTimeInfo) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::ExtendedReports xr;
@@ -674,7 +688,7 @@
 
 TEST(RtcpReceiverTest, InjectPliPacket) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::Pli pli;
@@ -691,7 +705,7 @@
 
 TEST(RtcpReceiverTest, PliPacketNotToUsIgnored) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::Pli pli;
@@ -707,7 +721,7 @@
 
 TEST(RtcpReceiverTest, InjectFirPacket) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::Fir fir;
@@ -724,7 +738,7 @@
 
 TEST(RtcpReceiverTest, FirPacketNotToUsIgnored) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::Fir fir;
@@ -736,7 +750,7 @@
 
 TEST(RtcpReceiverTest, ExtendedReportsPacketWithZeroReportBlocksIgnored) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::ExtendedReports xr;
@@ -747,7 +761,7 @@
 
 TEST(RtcpReceiverTest, InjectExtendedReportsReceiverReferenceTimePacket) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   const NtpTime kNtp(0x10203, 0x40506);
@@ -772,10 +786,9 @@
 
 TEST(RtcpReceiverTest, ExtendedReportsDlrrPacketNotToUsIgnored) {
   ReceiverMocks mocks;
-  auto config = DefaultConfiguration(&mocks);
   // Allow calculate rtt using dlrr/rrtr, simulating media receiver side.
-  config.non_sender_rtt_measurement = true;
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  mocks.config.non_sender_rtt_measurement = true;
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::ExtendedReports xr;
@@ -794,9 +807,8 @@
 
 TEST(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithSubBlock) {
   ReceiverMocks mocks;
-  auto config = DefaultConfiguration(&mocks);
-  config.non_sender_rtt_measurement = true;
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  mocks.config.non_sender_rtt_measurement = true;
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   const uint32_t kLastRR = 0x12345;
@@ -822,9 +834,8 @@
 
 TEST(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithMultipleSubBlocks) {
   ReceiverMocks mocks;
-  auto config = DefaultConfiguration(&mocks);
-  config.non_sender_rtt_measurement = true;
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  mocks.config.non_sender_rtt_measurement = true;
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   const uint32_t kLastRR = 0x12345;
@@ -851,9 +862,8 @@
 
 TEST(RtcpReceiverTest, InjectExtendedReportsPacketWithMultipleReportBlocks) {
   ReceiverMocks mocks;
-  auto config = DefaultConfiguration(&mocks);
-  config.non_sender_rtt_measurement = true;
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  mocks.config.non_sender_rtt_measurement = true;
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::Rrtr rrtr;
@@ -872,9 +882,8 @@
 
 TEST(RtcpReceiverTest, InjectExtendedReportsPacketWithUnknownReportBlock) {
   ReceiverMocks mocks;
-  auto config = DefaultConfiguration(&mocks);
-  config.non_sender_rtt_measurement = true;
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  mocks.config.non_sender_rtt_measurement = true;
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::Rrtr rrtr;
@@ -904,9 +913,8 @@
 
 TEST(RtcpReceiverTest, TestExtendedReportsRrRttInitiallyFalse) {
   ReceiverMocks mocks;
-  auto config = DefaultConfiguration(&mocks);
-  config.non_sender_rtt_measurement = true;
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  mocks.config.non_sender_rtt_measurement = true;
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   EXPECT_FALSE(receiver.GetAndResetXrRrRtt());
@@ -919,9 +927,8 @@
 
 TEST(RtcpReceiverTest, RttCalculatedAfterExtendedReportsDlrr) {
   ReceiverMocks mocks;
-  auto config = DefaultConfiguration(&mocks);
-  config.non_sender_rtt_measurement = true;
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  mocks.config.non_sender_rtt_measurement = true;
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   Random rand(0x0123456789abcdef);
@@ -951,9 +958,8 @@
 // the config struct.
 TEST(RtcpReceiverTest, SetterEnablesReceiverRtt) {
   ReceiverMocks mocks;
-  auto config = DefaultConfiguration(&mocks);
-  config.non_sender_rtt_measurement = false;
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  mocks.config.non_sender_rtt_measurement = false;
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
   receiver.SetNonSenderRttMeasurement(true);
 
@@ -984,9 +990,8 @@
 // the config struct.
 TEST(RtcpReceiverTest, DoesntCalculateRttOnReceivedDlrr) {
   ReceiverMocks mocks;
-  auto config = DefaultConfiguration(&mocks);
-  config.non_sender_rtt_measurement = true;
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  mocks.config.non_sender_rtt_measurement = true;
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
   receiver.SetNonSenderRttMeasurement(false);
 
@@ -1015,9 +1020,8 @@
 
 TEST(RtcpReceiverTest, XrDlrrCalculatesNegativeRttAsOneMillisecond) {
   ReceiverMocks mocks;
-  auto config = DefaultConfiguration(&mocks);
-  config.non_sender_rtt_measurement = true;
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  mocks.config.non_sender_rtt_measurement = true;
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   Random rand(0x0123456789abcdef);
@@ -1046,9 +1050,8 @@
 // Test receiver RTT stats with multiple measurements.
 TEST(RtcpReceiverTest, ReceiverRttWithMultipleMeasurements) {
   ReceiverMocks mocks;
-  auto config = DefaultConfiguration(&mocks);
-  config.non_sender_rtt_measurement = true;
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  mocks.config.non_sender_rtt_measurement = true;
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   Random rand(0x0123456789abcdef);
@@ -1101,9 +1104,8 @@
 // https://www.w3.org/TR/webrtc-stats/#dom-rtcremoteoutboundrtpstreamstats-roundtriptime.
 TEST(RtcpReceiverTest, ReceiverRttResetOnSrWithoutXr) {
   ReceiverMocks mocks;
-  auto config = DefaultConfiguration(&mocks);
-  config.non_sender_rtt_measurement = true;
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  mocks.config.non_sender_rtt_measurement = true;
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   Random rand(0x0123456789abcdef);
@@ -1145,9 +1147,8 @@
 // https://www.w3.org/TR/webrtc-stats/#dom-rtcremoteoutboundrtpstreamstats-roundtriptime.
 TEST(RtcpReceiverTest, ReceiverRttResetOnDlrrWithZeroTimestamp) {
   ReceiverMocks mocks;
-  auto config = DefaultConfiguration(&mocks);
-  config.non_sender_rtt_measurement = true;
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  mocks.config.non_sender_rtt_measurement = true;
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   Random rand(0x0123456789abcdef);
@@ -1184,9 +1185,8 @@
 // Check that the receiver RTT works correctly when the remote SSRC changes.
 TEST(RtcpReceiverTest, ReceiverRttWithMultipleRemoteSsrcs) {
   ReceiverMocks mocks;
-  auto config = DefaultConfiguration(&mocks);
-  config.non_sender_rtt_measurement = false;
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  mocks.config.non_sender_rtt_measurement = false;
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
   receiver.SetNonSenderRttMeasurement(true);
 
@@ -1238,7 +1238,7 @@
 
 TEST(RtcpReceiverTest, ConsumeReceivedXrReferenceTimeInfoInitiallyEmpty) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   EXPECT_THAT(receiver.ConsumeReceivedXrReferenceTimeInfo(), IsEmpty());
@@ -1246,7 +1246,7 @@
 
 TEST(RtcpReceiverTest, ConsumeReceivedXrReferenceTimeInfo) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   const NtpTime kNtp(0x10203, 0x40506);
@@ -1273,7 +1273,7 @@
 TEST(RtcpReceiverTest,
      ReceivedRrtrFromSameSsrcUpdatesReceivedReferenceTimeInfo) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   const NtpTime kNtp1(0x10203, 0x40506);
@@ -1303,7 +1303,7 @@
 
 TEST(RtcpReceiverTest, StoresLastReceivedRrtrPerSsrc) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   const size_t kNumBufferedReports = 1;
@@ -1335,7 +1335,7 @@
 
 TEST(RtcpReceiverTest, ReceiveReportTimeout) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   const uint16_t kSequenceNumber = 1234;
@@ -1407,7 +1407,7 @@
 
 TEST(RtcpReceiverTest, TmmbrReceivedWithNoIncomingPacket) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   EXPECT_THAT(receiver.TmmbrReceived(), IsEmpty());
@@ -1415,7 +1415,7 @@
 
 TEST(RtcpReceiverTest, TmmbrPacketAccepted) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   const DataRate kBitrate = DataRate::BitsPerSec(30'000);
@@ -1443,7 +1443,7 @@
 
 TEST(RtcpReceiverTest, TmmbrPacketNotForUsIgnored) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   const uint32_t kBitrateBps = 30000;
@@ -1467,7 +1467,7 @@
 
 TEST(RtcpReceiverTest, TmmbrPacketZeroRateIgnored) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   auto tmmbr = std::make_unique<rtcp::Tmmbr>();
@@ -1489,7 +1489,7 @@
 
 TEST(RtcpReceiverTest, TmmbrThreeConstraintsTimeOut) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   // Inject 3 packets "from" kSenderSsrc, kSenderSsrc+1, kSenderSsrc+2.
@@ -1531,9 +1531,8 @@
      VerifyBlockAndTimestampObtainedFromReportBlockDataObserver) {
   ReceiverMocks mocks;
   MockReportBlockDataObserverImpl observer;
-  RtpRtcpInterface::Configuration config = DefaultConfiguration(&mocks);
-  config.report_block_data_observer = &observer;
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  mocks.config.report_block_data_observer = &observer;
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   const uint8_t kFractionLoss = 3;
@@ -1574,9 +1573,8 @@
 TEST(RtcpReceiverTest, VerifyRttObtainedFromReportBlockDataObserver) {
   ReceiverMocks mocks;
   MockReportBlockDataObserverImpl observer;
-  RtpRtcpInterface::Configuration config = DefaultConfiguration(&mocks);
-  config.report_block_data_observer = &observer;
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  mocks.config.report_block_data_observer = &observer;
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   // To avoid issues with rounding due to different way to represent time units,
@@ -1620,7 +1618,7 @@
 
 TEST(RtcpReceiverTest, GetReportBlockDataAfterOneReportBlock) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   const uint16_t kSequenceNumber = 1234;
@@ -1644,7 +1642,7 @@
 
 TEST(RtcpReceiverTest, GetReportBlockDataAfterTwoReportBlocksOfSameSsrc) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   const uint16_t kSequenceNumber1 = 1234;
@@ -1682,7 +1680,7 @@
 
 TEST(RtcpReceiverTest, GetReportBlockDataAfterTwoReportBlocksOfDifferentSsrcs) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   const uint16_t kSequenceNumber1 = 1234;
@@ -1722,12 +1720,11 @@
 
 TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnTransportFeedback) {
   ReceiverMocks mocks;
-  RtpRtcpInterface::Configuration config = DefaultConfiguration(&mocks);
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::TransportFeedback packet;
-  packet.SetMediaSsrc(config.local_media_ssrc);
+  packet.SetMediaSsrc(mocks.config.local_media_ssrc);
   packet.SetSenderSsrc(kSenderSsrc);
   packet.SetBase(123, Timestamp::Millis(1));
   packet.AddReceivedPacket(123, Timestamp::Millis(1));
@@ -1744,11 +1741,9 @@
 }
 
 TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnCongestionControlFeedback) {
-  ScopedKeyValueConfig trials(
-      "WebRTC-RFC8888CongestionControlFeedback/Enabled/");
   ReceiverMocks mocks;
-  RtpRtcpInterface::Configuration config = DefaultConfiguration(&mocks);
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  mocks.field_trials = "WebRTC-RFC8888CongestionControlFeedback/Enabled/";
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::CongestionControlFeedback packet({{
@@ -1767,11 +1762,9 @@
 }
 
 TEST(RtcpReceiverTest, HandlesInvalidCongestionControlFeedback) {
-  ScopedKeyValueConfig trials(
-      "WebRTC-RFC8888CongestionControlFeedback/Enabled/");
   ReceiverMocks mocks;
-  RtpRtcpInterface::Configuration config = DefaultConfiguration(&mocks);
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  mocks.field_trials = "WebRTC-RFC8888CongestionControlFeedback/Enabled/";
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::CongestionControlFeedback packet({{
@@ -1794,12 +1787,11 @@
 TEST(RtcpReceiverTest,
      NotifiesNetworkLinkObserverOnTransportFeedbackOnRtxSsrc) {
   ReceiverMocks mocks;
-  RtpRtcpInterface::Configuration config = DefaultConfiguration(&mocks);
-  RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::TransportFeedback packet;
-  packet.SetMediaSsrc(*config.rtx_send_ssrc);
+  packet.SetMediaSsrc(*mocks.config.rtx_send_ssrc);
   packet.SetSenderSsrc(kSenderSsrc);
   packet.SetBase(1, Timestamp::Millis(1));
   packet.AddReceivedPacket(1, Timestamp::Millis(1));
@@ -1811,7 +1803,7 @@
 TEST(RtcpReceiverTest,
      DoesNotNotifyNetworkLinkObserverOnTransportFeedbackForUnregistedSsrc) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::TransportFeedback packet;
@@ -1826,7 +1818,7 @@
 
 TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnRemb) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::Remb remb;
@@ -1841,7 +1833,7 @@
 
 TEST(RtcpReceiverTest, HandlesInvalidTransportFeedback) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   // Send a compound packet with a TransportFeedback followed by something else.
@@ -1875,7 +1867,7 @@
 
 TEST(RtcpReceiverTest, Nack) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   const uint16_t kNackList1[] = {1, 2, 3, 5};
@@ -1930,7 +1922,7 @@
 
 TEST(RtcpReceiverTest, NackNotForUsIgnored) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   const uint16_t kNackList1[] = {1, 2, 3, 5};
@@ -1949,7 +1941,7 @@
 
 TEST(RtcpReceiverTest, ForceSenderReport) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   rtcp::RapidResyncRequest rr;
@@ -1962,7 +1954,7 @@
 
 TEST(RtcpReceiverTest, ReceivesTargetBitrate) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   VideoBitrateAllocation expected_allocation;
@@ -1996,7 +1988,7 @@
 
 TEST(RtcpReceiverTest, HandlesIncorrectTargetBitrate) {
   ReceiverMocks mocks;
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   VideoBitrateAllocation expected_allocation;
@@ -2019,7 +2011,7 @@
 TEST(RtcpReceiverTest, ChangeLocalMediaSsrc) {
   ReceiverMocks mocks;
   // Construct a receiver with `kReceiverMainSsrc` (default) local media ssrc.
-  RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl);
+  RTCPReceiver receiver = Create(mocks);
   receiver.SetRemoteSSRC(kSenderSsrc);
 
   constexpr uint32_t kSecondarySsrc = kReceiverMainSsrc + 1;
diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl.cc b/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
index a2d963a..600230b 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
+++ b/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
@@ -90,7 +90,7 @@
     : env_(env),
       rtcp_sender_(
           RTCPSender::Configuration::FromRtpRtcpConfiguration(configuration)),
-      rtcp_receiver_(configuration, this),
+      rtcp_receiver_(env_, configuration, this),
       last_bitrate_process_time_(env_.clock().TimeInMilliseconds()),
       last_rtt_process_time_(env_.clock().TimeInMilliseconds()),
       packet_overhead_(28),  // IPV4 UDP.
diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl2.cc b/modules/rtp_rtcp/source/rtp_rtcp_impl2.cc
index 43ae7d5..cc61ad4 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl2.cc
+++ b/modules/rtp_rtcp/source/rtp_rtcp_impl2.cc
@@ -116,7 +116,7 @@
           [this](TimeDelta duration) {
             ScheduleRtcpSendEvaluation(duration);
           })),
-      rtcp_receiver_(configuration, this),
+      rtcp_receiver_(env_, configuration, this),
       packet_overhead_(28),  // IPV4 UDP.
       nack_last_time_sent_full_ms_(0),
       nack_last_seq_number_sent_(0),
diff --git a/test/fuzzers/BUILD.gn b/test/fuzzers/BUILD.gn
index 34b765b..09faca4 100644
--- a/test/fuzzers/BUILD.gn
+++ b/test/fuzzers/BUILD.gn
@@ -224,11 +224,14 @@
 webrtc_fuzzer_test("rtcp_receiver_fuzzer") {
   sources = [ "rtcp_receiver_fuzzer.cc" ]
   deps = [
+    "../../api:array_view",
+    "../../api/environment",
+    "../../api/environment:environment_factory",
     "../../modules/rtp_rtcp",
     "../../modules/rtp_rtcp:rtp_rtcp_format",
     "../../rtc_base:checks",
     "../../system_wrappers",
-    "../../system_wrappers:field_trial",
+    "../../test:explicit_key_value_config",
   ]
   seed_corpus = "corpora/rtcp-corpus"
 }
diff --git a/test/fuzzers/rtcp_receiver_fuzzer.cc b/test/fuzzers/rtcp_receiver_fuzzer.cc
index 5dedf58..f498752 100644
--- a/test/fuzzers/rtcp_receiver_fuzzer.cc
+++ b/test/fuzzers/rtcp_receiver_fuzzer.cc
@@ -7,11 +7,19 @@
  *  in the file PATENTS.  All contributing project authors may
  *  be found in the AUTHORS file in the root of the source tree.
  */
+
+#include <cstddef>
+#include <cstdint>
+#include <vector>
+
+#include "api/array_view.h"
+#include "api/environment/environment_factory.h"
+#include "modules/rtp_rtcp/include/report_block_data.h"
 #include "modules/rtp_rtcp/source/rtcp_packet/tmmb_item.h"
 #include "modules/rtp_rtcp/source/rtcp_receiver.h"
 #include "modules/rtp_rtcp/source/rtp_rtcp_interface.h"
 #include "system_wrappers/include/clock.h"
-#include "system_wrappers/include/field_trial.h"
+#include "test/explicit_key_value_config.h"
 
 namespace webrtc {
 namespace {
@@ -37,17 +45,17 @@
   if (size > kMaxInputLenBytes) {
     return;
   }
-  field_trial::InitFieldTrialsFromString(
+  test::ExplicitKeyValueConfig field_trials(
       "WebRTC-RFC8888CongestionControlFeedback/Enabled/");
   NullModuleRtpRtcp rtp_rtcp_module;
   SimulatedClock clock(1234);
 
   RtpRtcpInterface::Configuration config;
-  config.clock = &clock;
   config.rtcp_report_interval_ms = kRtcpIntervalMs;
   config.local_media_ssrc = 1;
 
-  RTCPReceiver receiver(config, &rtp_rtcp_module);
+  RTCPReceiver receiver(CreateEnvironment(&clock, &field_trials), config,
+                        &rtp_rtcp_module);
 
   receiver.IncomingPacket(rtc::MakeArrayView(data, size));
 }