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.