In RtpPayloadParams seed random with propagated clock

To reduce usage of global clock.

Bug: webrtc:42223992
Change-Id: I1bd634685edb0d581b1f1875860793674f206de8
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/410441
Auto-Submit: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Evan Shrubsole <eshr@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#45979}
diff --git a/call/BUILD.gn b/call/BUILD.gn
index ab59e5b..1d4d1bb 100644
--- a/call/BUILD.gn
+++ b/call/BUILD.gn
@@ -231,7 +231,6 @@
     "../rtc_base:random",
     "../rtc_base:rate_limiter",
     "../rtc_base:safe_conversions",
-    "../rtc_base:timeutils",
     "../rtc_base/experiments:field_trial_parser",
     "../rtc_base/network:sent_packet",
     "../rtc_base/synchronization:mutex",
@@ -575,6 +574,7 @@
         "../rtc_base:timeutils",
         "../rtc_base/synchronization:mutex",
         "../test:audio_codec_mocks",
+        "../test:create_test_environment",
         "../test:create_test_field_trials",
         "../test:encoder_settings",
         "../test:fake_video_codecs",
diff --git a/call/rtp_payload_params.cc b/call/rtp_payload_params.cc
index 4840f6d..ee3c6e2 100644
--- a/call/rtp_payload_params.cc
+++ b/call/rtp_payload_params.cc
@@ -17,6 +17,7 @@
 #include <optional>
 
 #include "absl/container/inlined_vector.h"
+#include "api/environment/environment.h"
 #include "api/field_trials_view.h"
 #include "api/transport/rtp/dependency_descriptor.h"
 #include "api/video/encoded_image.h"
@@ -38,7 +39,6 @@
 #include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
 #include "rtc_base/random.h"
-#include "rtc_base/time_utils.h"
 
 namespace webrtc {
 namespace {
@@ -179,21 +179,21 @@
 }
 }  // namespace
 
-RtpPayloadParams::RtpPayloadParams(const uint32_t ssrc,
-                                   const RtpPayloadState* state,
-                                   const FieldTrialsView& trials)
+RtpPayloadParams::RtpPayloadParams(const Environment& env,
+                                   const uint32_t ssrc,
+                                   const RtpPayloadState* state)
     : ssrc_(ssrc),
       generic_picture_id_experiment_(
-          trials.IsEnabled("WebRTC-GenericPictureId")),
-      simulate_generic_structure_(
-          trials.IsEnabled("WebRTC-GenericCodecDependencyDescriptor")) {
+          env.field_trials().IsEnabled("WebRTC-GenericPictureId")),
+      simulate_generic_structure_(env.field_trials().IsEnabled(
+          "WebRTC-GenericCodecDependencyDescriptor")) {
   for (auto& spatial_layer : last_frame_id_)
     spatial_layer.fill(-1);
 
   chain_last_frame_id_.fill(-1);
   buffer_id_to_frame_id_.fill(-1);
 
-  Random random(TimeMicros());
+  Random random(env.clock().TimeInMicroseconds());
   state_.picture_id =
       state ? state->picture_id : (random.Rand<int16_t>() & 0x7FFF);
   state_.tl0_pic_idx = state ? state->tl0_pic_idx : (random.Rand<uint8_t>());
diff --git a/call/rtp_payload_params.h b/call/rtp_payload_params.h
index ea585c0..e42f5b6b 100644
--- a/call/rtp_payload_params.h
+++ b/call/rtp_payload_params.h
@@ -17,7 +17,7 @@
 #include <optional>
 #include <vector>
 
-#include "api/field_trials_view.h"
+#include "api/environment/environment.h"
 #include "api/transport/rtp/dependency_descriptor.h"
 #include "api/video/encoded_image.h"
 #include "api/video_codecs/video_encoder.h"
@@ -35,9 +35,9 @@
 // TODO(nisse): Make these properties not codec specific.
 class RtpPayloadParams final {
  public:
-  RtpPayloadParams(uint32_t ssrc,
-                   const RtpPayloadState* state,
-                   const FieldTrialsView& trials);
+  RtpPayloadParams(const Environment& env,
+                   uint32_t ssrc,
+                   const RtpPayloadState* state);
   RtpPayloadParams(const RtpPayloadParams& other);
   ~RtpPayloadParams();
 
diff --git a/call/rtp_payload_params_unittest.cc b/call/rtp_payload_params_unittest.cc
index 377a0e2..a72826c 100644
--- a/call/rtp_payload_params_unittest.cc
+++ b/call/rtp_payload_params_unittest.cc
@@ -18,7 +18,6 @@
 #include <vector>
 
 #include "absl/container/inlined_vector.h"
-#include "api/field_trials.h"
 #include "api/transport/rtp/dependency_descriptor.h"
 #include "api/video/color_space.h"
 #include "api/video/encoded_image.h"
@@ -35,7 +34,7 @@
 #include "modules/video_coding/codecs/vp8/include/vp8_globals.h"
 #include "modules/video_coding/codecs/vp9/include/vp9_globals.h"
 #include "modules/video_coding/include/video_codec_interface.h"
-#include "test/create_test_field_trials.h"
+#include "test/create_test_environment.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 
@@ -69,7 +68,7 @@
   state2.tl0_pic_idx = kTl0PicIdx;
   std::map<uint32_t, RtpPayloadState> states = {{kSsrc2, state2}};
 
-  RtpPayloadParams params(kSsrc2, &state2, CreateTestFieldTrials());
+  RtpPayloadParams params(CreateTestEnvironment(), kSsrc2, &state2);
   EncodedImage encoded_image;
   encoded_image.rotation_ = kVideoRotation_90;
   encoded_image.content_type_ = VideoContentType::SCREENSHARE;
@@ -109,7 +108,7 @@
   RtpPayloadState state;
   state.picture_id = kPictureId;
   state.tl0_pic_idx = kTl0PicIdx;
-  RtpPayloadParams params(kSsrc1, &state, CreateTestFieldTrials());
+  RtpPayloadParams params(CreateTestEnvironment(), kSsrc1, &state);
 
   EncodedImage encoded_image;
   encoded_image.rotation_ = kVideoRotation_90;
@@ -172,7 +171,7 @@
   CodecSpecificInfo codec_info;
   codec_info.codecType = kVideoCodecVP8;
 
-  RtpPayloadParams params(kSsrc1, &state, CreateTestFieldTrials());
+  RtpPayloadParams params(CreateTestEnvironment(), kSsrc1, &state);
   RTPVideoHeader header =
       params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
   EXPECT_EQ(kVideoCodecVP8, header.codec);
@@ -195,7 +194,7 @@
   codec_info.codecType = kVideoCodecVP8;
   codec_info.codecSpecific.VP8.temporalIdx = kNoTemporalIdx;
 
-  RtpPayloadParams params(kSsrc1, &state, CreateTestFieldTrials());
+  RtpPayloadParams params(CreateTestEnvironment(), kSsrc1, &state);
   RTPVideoHeader header =
       params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
   EXPECT_EQ(kVideoCodecVP8, header.codec);
@@ -211,7 +210,7 @@
   constexpr auto kNotPresent = DecodeTargetIndication::kNotPresent;
 
   RtpPayloadState state;
-  RtpPayloadParams params(kSsrc1, &state, CreateTestFieldTrials());
+  RtpPayloadParams params(CreateTestEnvironment(), kSsrc1, &state);
 
   EncodedImage key_frame_image;
   key_frame_image._frameType = VideoFrameType::kVideoFrameKey;
@@ -299,7 +298,7 @@
   codec_info.codecType = kVideoCodecVP8;
   codec_info.codecSpecific.VP8.temporalIdx = 1;
 
-  RtpPayloadParams params(kSsrc1, &state, CreateTestFieldTrials());
+  RtpPayloadParams params(CreateTestEnvironment(), kSsrc1, &state);
   RTPVideoHeader header =
       params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
 
@@ -335,7 +334,7 @@
   codec_info.codecSpecific.VP9.temporal_idx = 1;
   codec_info.codecSpecific.VP9.first_frame_in_picture = true;
 
-  RtpPayloadParams params(kSsrc1, &state, CreateTestFieldTrials());
+  RtpPayloadParams params(CreateTestEnvironment(), kSsrc1, &state);
   RTPVideoHeader header =
       params.GetRtpVideoHeader(encoded_image, &codec_info, kDontCare);
 
@@ -377,7 +376,7 @@
   CodecSpecificInfo codec_info;
   codec_info.codecType = kVideoCodecGeneric;
 
-  RtpPayloadParams params(kSsrc1, &state, CreateTestFieldTrials());
+  RtpPayloadParams params(CreateTestEnvironment(), kSsrc1, &state);
   RTPVideoHeader header =
       params.GetRtpVideoHeader(encoded_image, &codec_info, std::nullopt);
 
@@ -393,8 +392,6 @@
 }
 
 TEST(RtpPayloadParamsTest, PictureIdForOldGenericFormat) {
-  FieldTrials field_trials =
-      CreateTestFieldTrials("WebRTC-GenericPictureId/Enabled/");
   RtpPayloadState state{};
 
   EncodedImage encoded_image;
@@ -402,7 +399,10 @@
   codec_info.codecType = kVideoCodecGeneric;
   encoded_image._frameType = VideoFrameType::kVideoFrameKey;
 
-  RtpPayloadParams params(kSsrc1, &state, field_trials);
+  RtpPayloadParams params(
+      CreateTestEnvironment(
+          {.field_trials = "WebRTC-GenericPictureId/Enabled/"}),
+      kSsrc1, &state);
   RTPVideoHeader header =
       params.GetRtpVideoHeader(encoded_image, &codec_info, 10);
 
@@ -427,7 +427,7 @@
   CodecSpecificInfo codec_info;
   codec_info.codecType = kVideoCodecGeneric;
 
-  RtpPayloadParams params(kSsrc1, &state, CreateTestFieldTrials());
+  RtpPayloadParams params(CreateTestEnvironment(), kSsrc1, &state);
   RTPVideoHeader header =
       params.GetRtpVideoHeader(encoded_image, &codec_info, 0);
 
@@ -459,7 +459,7 @@
   EncodedImage encoded_image;
   CodecSpecificInfo codec_info;
 
-  RtpPayloadParams params(kSsrc1, &state, CreateTestFieldTrials());
+  RtpPayloadParams params(CreateTestEnvironment(), kSsrc1, &state);
 
   encoded_image._frameType = VideoFrameType::kVideoFrameKey;
   codec_info.generic_frame_info =
@@ -503,7 +503,7 @@
   enum LayerSync { kNoSync, kSync };
 
   RtpPayloadParamsVp8ToGenericTest()
-      : state_(), params_(123, &state_, CreateTestFieldTrials()) {}
+      : state_(), params_(CreateTestEnvironment(), 123, &state_) {}
 
   void ConvertAndCheck(int temporal_index,
                        int64_t shared_frame_id,
@@ -593,7 +593,7 @@
 
 TEST(RtpPayloadParamsVp9ToGenericTest, NoScalability) {
   RtpPayloadState state;
-  RtpPayloadParams params(/*ssrc=*/123, &state, CreateTestFieldTrials());
+  RtpPayloadParams params(CreateTestEnvironment(), /*ssrc=*/123, &state);
 
   EncodedImage encoded_image;
   CodecSpecificInfo codec_info;
@@ -645,7 +645,7 @@
 
 TEST(RtpPayloadParamsVp9ToGenericTest, NoScalabilityNonFlexibleMode) {
   RtpPayloadState state;
-  RtpPayloadParams params(/*ssrc=*/123, &state, CreateTestFieldTrials());
+  RtpPayloadParams params(CreateTestEnvironment(), /*ssrc=*/123, &state);
 
   EncodedImage encoded_image;
   CodecSpecificInfo codec_info;
@@ -698,7 +698,7 @@
   //   /   /   /   ...
   //  0---2---4---
   RtpPayloadState state;
-  RtpPayloadParams params(/*ssrc=*/123, &state, CreateTestFieldTrials());
+  RtpPayloadParams params(CreateTestEnvironment(), /*ssrc=*/123, &state);
 
   EncodedImage image;
   CodecSpecificInfo info;
@@ -809,7 +809,7 @@
   // Test with 3 temporal layers structure that is not used by webrtc, but used
   // by chromium: https://imgur.com/pURAGvp
   RtpPayloadState state;
-  RtpPayloadParams params(/*ssrc=*/123, &state, CreateTestFieldTrials());
+  RtpPayloadParams params(CreateTestEnvironment(), /*ssrc=*/123, &state);
 
   EncodedImage image;
   CodecSpecificInfo info;
@@ -963,7 +963,7 @@
   //  |     ...
   //  0---2--
   RtpPayloadState state;
-  RtpPayloadParams params(/*ssrc=*/123, &state, CreateTestFieldTrials());
+  RtpPayloadParams params(CreateTestEnvironment(), /*ssrc=*/123, &state);
 
   EncodedImage image;
   CodecSpecificInfo info;
@@ -1072,7 +1072,7 @@
   //        | ...
   // S0 1---3--
   RtpPayloadState state;
-  RtpPayloadParams params(/*ssrc=*/123, &state, CreateTestFieldTrials());
+  RtpPayloadParams params(CreateTestEnvironment(), /*ssrc=*/123, &state);
 
   EncodedImage image;
   CodecSpecificInfo info;
@@ -1174,7 +1174,7 @@
   //
   // S0 0---2           6
   RtpPayloadState state;
-  RtpPayloadParams params(/*ssrc=*/123, &state, CreateTestFieldTrials());
+  RtpPayloadParams params(CreateTestEnvironment(), /*ssrc=*/123, &state);
 
   EncodedImage image;
   CodecSpecificInfo info;
@@ -1336,7 +1336,7 @@
   enum LayerSync { kNoSync, kSync };
 
   RtpPayloadParamsH264ToGenericTest()
-      : state_(), params_(123, &state_, CreateTestFieldTrials()) {}
+      : state_(), params_(CreateTestEnvironment(), 123, &state_) {}
 
   void ConvertAndCheck(int temporal_index,
                        int64_t shared_frame_id,
diff --git a/call/rtp_video_sender.cc b/call/rtp_video_sender.cc
index a37db72..8a09f25 100644
--- a/call/rtp_video_sender.cc
+++ b/call/rtp_video_sender.cc
@@ -440,7 +440,7 @@
       state = &it->second;
       shared_frame_id_ = std::max(shared_frame_id_, state->shared_frame_id);
     }
-    params_.push_back(RtpPayloadParams(ssrc, state, env.field_trials()));
+    params_.push_back(RtpPayloadParams(env, ssrc, state));
   }
 
   // RTP/RTCP initialization.