Configure render delay constant via constructor of VCMTiming.

Remove set_render_delay method.

Bug: b/493549134
Change-Id: If9bfbfcda8dda745130faa2c6ff29e14099cb9a4
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/476000
Reviewed-by: Rasmus Brandt <brandtr@webrtc.org>
Commit-Queue: Åsa Persson <asapersson@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#47882}
diff --git a/call/call.cc b/call/call.cc
index 15b8d57..57b582a 100644
--- a/call/call.cc
+++ b/call/call.cc
@@ -1040,6 +1040,8 @@
   env_.event_log().Log(std::make_unique<RtcEventVideoReceiveStreamConfig>(
       CreateRtcLogStreamConfig(configuration)));
 
+  TimeDelta render_delay = TimeDelta::Millis(configuration.render_delay_ms);
+
   // TODO(bugs.webrtc.org/11993): Move the registration between `receive_stream`
   // and `video_receiver_controller_` out of VideoReceiveStream2 construction
   // and set it up asynchronously on the network thread (the registration and
@@ -1049,7 +1051,8 @@
   VideoReceiveStream2* receive_stream = new VideoReceiveStream2(
       env_, this, num_cpu_cores_, transport_send_->packet_router(),
       std::move(configuration), call_stats_.get(),
-      std::make_unique<VCMTiming>(&env_.clock(), env_.field_trials()),
+      std::make_unique<VCMTiming>(&env_.clock(), env_.field_trials(),
+                                  render_delay),
       &nack_periodic_processor_, decode_sync_.get());
   // TODO(bugs.webrtc.org/11993): Set this up asynchronously on the network
   // thread.
diff --git a/modules/video_coding/generic_decoder_unittest.cc b/modules/video_coding/generic_decoder_unittest.cc
index 2a36bbc..ae09726 100644
--- a/modules/video_coding/generic_decoder_unittest.cc
+++ b/modules/video_coding/generic_decoder_unittest.cc
@@ -95,7 +95,9 @@
       : time_controller_(Timestamp::Zero()),
         clock_(time_controller_.GetClock()),
         field_trials_(CreateTestFieldTrials()),
-        timing_(time_controller_.GetClock(), field_trials_),
+        timing_(time_controller_.GetClock(),
+                field_trials_,
+                /*render_delay=*/TimeDelta::Millis(10)),
         decoder_(time_controller_.GetTaskQueueFactory()),
         vcm_callback_(&timing_,
                       time_controller_.GetClock(),
diff --git a/modules/video_coding/timing/timing.cc b/modules/video_coding/timing/timing.cc
index 2d9204b..ae35a70 100644
--- a/modules/video_coding/timing/timing.cc
+++ b/modules/video_coding/timing/timing.cc
@@ -75,12 +75,15 @@
          max_playout_delay <= kLowLatencyStreamMaxPlayoutDelayThreshold;
 }
 
-VCMTiming::VCMTiming(Clock* clock, const FieldTrialsView& field_trials)
+VCMTiming::VCMTiming(Clock* clock,
+                     const FieldTrialsView& field_trials,
+                     TimeDelta render_delay)
     : clock_(clock),
       ts_extrapolator_(
           std::make_unique<TimestampExtrapolator>(clock_->CurrentTime(),
                                                   field_trials)),
-      decode_time_filter_(std::make_unique<DecodeTimePercentileFilter>()) {}
+      decode_time_filter_(std::make_unique<DecodeTimePercentileFilter>()),
+      timings_({.render_delay = render_delay}) {}
 
 void VCMTiming::Reset() {
   MutexLock lock(&mutex_);
@@ -89,11 +92,6 @@
   timings_.Reset();
 }
 
-void VCMTiming::set_render_delay(TimeDelta render_delay) {
-  MutexLock lock(&mutex_);
-  timings_.render_delay = render_delay;
-}
-
 TimeDelta VCMTiming::min_playout_delay() const {
   MutexLock lock(&mutex_);
   return timings_.min_playout_delay;
diff --git a/modules/video_coding/timing/timing.h b/modules/video_coding/timing/timing.h
index 64bfa61..8ae1e82 100644
--- a/modules/video_coding/timing/timing.h
+++ b/modules/video_coding/timing/timing.h
@@ -64,15 +64,14 @@
     TimeDelta current_delay = TimeDelta::Zero();
   };
 
-  VCMTiming(Clock* clock, const FieldTrialsView& field_trials);
+  VCMTiming(Clock* clock,
+            const FieldTrialsView& field_trials,
+            TimeDelta render_delay);
   virtual ~VCMTiming() = default;
 
   // Resets the timing to the initial state.
   void Reset();
 
-  // Sets the amount of time needed to render an image. Defaults to 10 ms.
-  void set_render_delay(TimeDelta render_delay);
-
   // Sets the minimum time the video must be delayed on the receiver to
   // get the desired jitter buffer level.
   void SetMinimumDelay(TimeDelta minimum_delay);
diff --git a/modules/video_coding/timing/timing_unittest.cc b/modules/video_coding/timing/timing_unittest.cc
index bbdd224..c2a5201 100644
--- a/modules/video_coding/timing/timing_unittest.cc
+++ b/modules/video_coding/timing/timing_unittest.cc
@@ -98,7 +98,7 @@
   constexpr auto kStartTime = Timestamp::Millis(1337);
   FieldTrials field_trials = CreateTestFieldTrials();
   SimulatedClock clock(kStartTime);
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
 
   // Provoke a wrap-around. The fifth frame will have wrapped at 25 fps.
   constexpr uint32_t kRtpTicksPerFrame = k90kHz / k25Fps;
@@ -120,7 +120,7 @@
 TEST(VCMTimingTest, UseLowLatencyRenderer) {
   FieldTrials field_trials = CreateTestFieldTrials();
   SimulatedClock clock(0);
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
   // Default is false.
   EXPECT_FALSE(timing.RenderParameters().use_low_latency_rendering);
   // False if min playout delay > 0.
@@ -145,7 +145,7 @@
 TEST(VCMTimingTest, UpdateCurrentDelayCapsWhenOffByMicroseconds) {
   FieldTrials field_trials = CreateTestFieldTrials();
   SimulatedClock clock(0);
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
 
   // Set larger initial current delay.
   timing.set_min_playout_delay(TimeDelta::Millis(200));
@@ -155,8 +155,7 @@
   // rounding, and should reset to the target delay.
   timing.set_min_playout_delay(TimeDelta::Millis(50));
   Timestamp decode_time = Timestamp::Millis(1337);
-  Timestamp render_time =
-      decode_time + TimeDelta::Millis(10) + TimeDelta::Micros(37);
+  Timestamp render_time = decode_time + kRenderDelay + TimeDelta::Micros(37);
   timing.UpdateCurrentDelay(render_time, decode_time);
   EXPECT_EQ(timing.GetTimings().current_delay, timing.TargetVideoDelay());
 
@@ -167,7 +166,7 @@
 TEST(VCMTimingTest, StopDecodeTimerClearsOldEstimates) {
   FieldTrials field_trials = CreateTestFieldTrials();
   SimulatedClock clock(0);
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
 
   UpdateDecodeTimer(timing, clock, kDecodeTime);
   EXPECT_EQ(timing.GetTimings().estimated_max_decode_time, kDecodeTime);
@@ -182,7 +181,7 @@
 TEST(VCMTimingTest, GetMinPlayoutDelay) {
   FieldTrials field_trials = CreateTestFieldTrials();
   SimulatedClock clock(0);
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
 
   timing.set_min_playout_delay(TimeDelta::Millis(123));
   EXPECT_EQ(timing.min_playout_delay(), TimeDelta::Millis(123));
@@ -191,14 +190,13 @@
 TEST(VCMTimingTest, InitialVideoDelayTimings) {
   FieldTrials field_trials = CreateTestFieldTrials();
   SimulatedClock clock(0);
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
 
   VCMTiming::VideoDelayTimings timings = timing.GetTimings();
   EXPECT_EQ(timings.num_decoded_frames, 0u);
   EXPECT_EQ(timings.minimum_delay, TimeDelta::Zero());
   EXPECT_EQ(timings.estimated_max_decode_time, TimeDelta::Zero());
-  EXPECT_EQ(timings.render_delay,
-            VCMTiming::VideoDelayTimings::kDefaultRenderDelay);
+  EXPECT_EQ(timings.render_delay, kRenderDelay);
   EXPECT_EQ(timings.min_playout_delay, TimeDelta::Zero());
   EXPECT_EQ(timings.stats_target_delay, TimeDelta::Zero());
   EXPECT_EQ(timings.current_delay, TimeDelta::Zero());
@@ -208,11 +206,9 @@
 TEST(VCMTimingTest, GetTimings) {
   FieldTrials field_trials = CreateTestFieldTrials();
   SimulatedClock clock(33);
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, /*render_delay=*/TimeDelta::Millis(7));
 
   // Setup.
-  TimeDelta render_delay = TimeDelta::Millis(11);
-  timing.set_render_delay(render_delay);
   TimeDelta min_playout_delay = TimeDelta::Millis(50);
   TimeDelta max_playout_delay = TimeDelta::Millis(500);
   timing.set_playout_delay({min_playout_delay, max_playout_delay});
@@ -236,7 +232,7 @@
   EXPECT_GT(timings.num_decoded_frames, 0u);
   EXPECT_EQ(timings.minimum_delay, minimum_delay);
   EXPECT_EQ(timings.estimated_max_decode_time, kDecodeTime);
-  EXPECT_EQ(timings.render_delay, render_delay);
+  EXPECT_EQ(timings.render_delay, TimeDelta::Millis(7));
   EXPECT_EQ(timings.min_playout_delay, min_playout_delay);
   EXPECT_EQ(timings.max_playout_delay, max_playout_delay);
   EXPECT_EQ(timings.stats_target_delay, minimum_delay);
@@ -247,9 +243,8 @@
 TEST(VCMTimingTest, Reset) {
   FieldTrials field_trials = CreateTestFieldTrials();
   SimulatedClock clock(Timestamp::Millis(33));
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, /*render_delay=*/TimeDelta::Millis(7));
 
-  timing.set_render_delay(TimeDelta::Millis(11));
   TimeDelta min_playout_delay = TimeDelta::Millis(50);
   TimeDelta max_playout_delay = TimeDelta::Millis(500);
   timing.set_playout_delay({min_playout_delay, max_playout_delay});
@@ -283,7 +278,7 @@
 TEST(VCMTimingTest, GetTimingsBeforeAndAfterValidRtpTimestamp) {
   SimulatedClock clock(33);
   FieldTrials field_trials = CreateTestFieldTrials();
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
 
   // Setup.
   TimeDelta min_playout_delay = TimeDelta::Millis(50);
@@ -324,7 +319,7 @@
 TEST(VCMTimingTest, RenderTimeAccountsForCurrentDelay) {
   FieldTrials field_trials = CreateTestFieldTrials();
   SimulatedClock clock(Timestamp::Millis(88));
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
 
   timing.set_playout_delay({TimeDelta::Millis(100), TimeDelta::Millis(200)});
   timing.OnCompleteTemporalUnit(/*rtp_timestamp=*/0, clock.CurrentTime());
@@ -338,7 +333,7 @@
 TEST(VCMTimingTest, RenderTimeRespectsMinPlayoutDelay) {
   FieldTrials field_trials = CreateTestFieldTrials();
   SimulatedClock clock(Timestamp::Millis(88));
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
 
   timing.set_playout_delay({TimeDelta::Millis(100), TimeDelta::Millis(200)});
   timing.OnCompleteTemporalUnit(/*rtp_timestamp=*/0, clock.CurrentTime());
@@ -352,7 +347,7 @@
 TEST(VCMTimingTest, RenderTimeRespectsMaxPlayoutDelay) {
   FieldTrials field_trials = CreateTestFieldTrials();
   SimulatedClock clock(Timestamp::Millis(88));
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
 
   timing.set_playout_delay({TimeDelta::Millis(100), TimeDelta::Millis(200)});
   timing.OnCompleteTemporalUnit(/*rtp_timestamp=*/0, clock.CurrentTime());
@@ -366,9 +361,8 @@
 TEST(VCMTimingTest, IncreasesCurrentDelayWhenFrameIsLate) {
   FieldTrials field_trials = CreateTestFieldTrials();
   SimulatedClock clock(0);
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
   timing.SetMinimumDelay(kMinimumDelay);
-  timing.set_render_delay(kRenderDelay);
 
   // Current delay is initialized to minimum delay.
   EXPECT_EQ(timing.GetTimings().current_delay, kMinimumDelay);
@@ -386,9 +380,8 @@
 TEST(VCMTimingTest, CapsCurrentDelayIncreaseToTarget) {
   FieldTrials field_trials = CreateTestFieldTrials();
   SimulatedClock clock(0);
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
   timing.SetMinimumDelay(kMinimumDelay);
-  timing.set_render_delay(kRenderDelay);
 
   // Current delay is initialized to minimum delay.
   EXPECT_EQ(timing.GetTimings().current_delay, kMinimumDelay);
@@ -406,9 +399,8 @@
 TEST(VCMTimingTest, KeepsCurrentDelayWhenFrameIsEarly) {
   FieldTrials field_trials = CreateTestFieldTrials();
   SimulatedClock clock(0);
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
   timing.SetMinimumDelay(kMinimumDelay);
-  timing.set_render_delay(kRenderDelay);
 
   // Current delay is initialized to minimum delay.
   EXPECT_EQ(timing.GetTimings().current_delay, kMinimumDelay);
@@ -426,9 +418,8 @@
 TEST(VCMTimingTest, IncreasesCurrentDelayWhenFrameIsLateWithDecodeTime) {
   FieldTrials field_trials = CreateTestFieldTrials();
   SimulatedClock clock(0);
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
   timing.SetMinimumDelay(kMinimumDelay);
-  timing.set_render_delay(kRenderDelay);
   UpdateDecodeTimer(timing, clock, kDecodeTime);
 
   // Current delay is initialized to minimum delay.
@@ -448,9 +439,8 @@
 TEST(VCMTimingTest, DecreasesCurrentDelayToTarget) {
   FieldTrials field_trials = CreateTestFieldTrials();
   SimulatedClock clock(0);
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
   timing.SetMinimumDelay(kMinimumDelay);
-  timing.set_render_delay(kRenderDelay);
 
   // Current delay should be increased to target for late frame.
   timing.UpdateCurrentDelay(clock.CurrentTime(),
@@ -471,9 +461,8 @@
 TEST(VCMTimingTest, MinPlayoutDelayUpdatesTargetDelay) {
   FieldTrials field_trials = CreateTestFieldTrials();
   SimulatedClock clock(0);
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
   timing.SetMinimumDelay(kMinimumDelay);
-  timing.set_render_delay(kRenderDelay);
 
   const TimeDelta kMinPlayout =
       kMinimumDelay + kRenderDelay + TimeDelta::Millis(50);
diff --git a/modules/video_coding/video_receiver2_unittest.cc b/modules/video_coding/video_receiver2_unittest.cc
index 59e7a3cd..e9c6291 100644
--- a/modules/video_coding/video_receiver2_unittest.cc
+++ b/modules/video_coding/video_receiver2_unittest.cc
@@ -17,6 +17,7 @@
 
 #include "api/field_trials.h"
 #include "api/test/mock_video_decoder.h"
+#include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
 #include "api/video/encoded_frame.h"
 #include "api/video/video_codec_type.h"
@@ -88,7 +89,8 @@
 
   FieldTrials field_trials_ = CreateTestFieldTrials();
   SimulatedClock clock_{Timestamp::Millis(1337)};
-  VCMTiming timing_{&clock_, field_trials_};
+  VCMTiming timing_{&clock_, field_trials_,
+                    /*render_time=*/TimeDelta::Millis(10)};
   NiceMock<MockVCMReceiveCallback> receive_callback_;
   VideoReceiver2 receiver_{&clock_, &timing_, field_trials_,
                            /*corruption_score_calculator=*/nullptr};
diff --git a/video/frame_decode_timing_unittest.cc b/video/frame_decode_timing_unittest.cc
index 1e75f44..45cb844 100644
--- a/video/frame_decode_timing_unittest.cc
+++ b/video/frame_decode_timing_unittest.cc
@@ -54,9 +54,8 @@
   FrameDecodeTimingTest()
       : field_trials_(CreateTestFieldTrials()),
         clock_(Timestamp::Millis(1000)),
-        timing_(&clock_, field_trials_),
+        timing_(&clock_, field_trials_, /*render_delay=*/TimeDelta::Zero()),
         frame_decode_scheduler_(&clock_, &timing_, field_trials_) {
-    timing_.set_render_delay(TimeDelta::Zero());
     timing_.OnCompleteTemporalUnit(kNextRtp, clock_.CurrentTime());
   }
 
@@ -141,7 +140,7 @@
   constexpr Timestamp kZeroRenderTime = Timestamp::Zero();
   SimulatedClock clock(kStartTimeUs);
   FieldTrials field_trials = CreateTestFieldTrials();
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
   timing.set_playout_delay({TimeDelta::Zero(), TimeDelta::Zero()});
   FrameDecodeTiming decode_timing(&clock, &timing, field_trials);
 
@@ -180,7 +179,7 @@
   constexpr TimeDelta kTimeDelta = 1 / Frequency::Hertz(60);
   constexpr Timestamp kZeroRenderTime = Timestamp::Zero();
   SimulatedClock clock(kStartTimeUs);
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
   FrameDecodeTiming decode_timing(&clock, &timing, field_trials);
 
   // MaxWaitingTime() returns zero for evenly spaced video frames.
@@ -230,7 +229,7 @@
   constexpr int64_t kStartTimeUs = 3.15e13;  // About one year in us.
   const TimeDelta kTimeDelta = TimeDelta::Millis(1000.0 / 60.0);
   SimulatedClock clock(kStartTimeUs);
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
   FrameDecodeTiming decode_timing(&clock, &timing, field_trials);
 
   clock.AdvanceTime(kTimeDelta);
@@ -263,7 +262,7 @@
   const TimeDelta kTimeDelta = TimeDelta::Millis(1000.0 / 60.0);
   constexpr Timestamp kZeroRenderTime = Timestamp::Zero();
   SimulatedClock clock(kStartTimeUs);
-  VCMTiming timing(&clock, field_trials);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
   FrameDecodeTiming decode_timing(&clock, &timing, field_trials);
 
   // MaxWaitingTime() returns zero for evenly spaced video frames.
@@ -294,8 +293,7 @@
 TEST(FrameDecodeTimingMaxWaitingTimeTest, WithVaryingRenderTimes) {
   FieldTrials field_trials = CreateTestFieldTrials();
   SimulatedClock clock(0);
-  VCMTiming timing(&clock, field_trials);
-  timing.set_render_delay(kRenderDelay);
+  VCMTiming timing(&clock, field_trials, kRenderDelay);
   UpdateDecodeTimer(timing, clock, kDecodeTime);
   FrameDecodeTiming decode_timing(&clock, &timing, field_trials);
 
diff --git a/video/timing/simulator/rendering_simulator.cc b/video/timing/simulator/rendering_simulator.cc
index 66b1e48..ca59379 100644
--- a/video/timing/simulator/rendering_simulator.cc
+++ b/video/timing/simulator/rendering_simulator.cc
@@ -183,12 +183,13 @@
                            uint32_t rtx_ssrc,
                            RenderingSimulator::Results* absl_nonnull results)
       : collector_(env, ssrc),
-        tracker_(env,
-                 RenderingTracker::Config{
-                     .ssrc = ssrc,
-                     .render_delay = RenderingSimulator::kRenderDelay},
-                 config.video_timing_factory(env),
-                 &collector_),
+        tracker_(
+            env,
+            RenderingTracker::Config{
+                .ssrc = ssrc,
+                .render_delay = RenderingSimulator::kRenderDelay},
+            config.video_timing_factory(env, RenderingSimulator::kRenderDelay),
+            &collector_),
         assembler_(env, ssrc, &collector_, &tracker_),
         receiver_(env, ssrc, rtx_ssrc, &assembler_),
         results_(*results) {
diff --git a/video/timing/simulator/rendering_simulator.h b/video/timing/simulator/rendering_simulator.h
index 79f8766..aab6109 100644
--- a/video/timing/simulator/rendering_simulator.h
+++ b/video/timing/simulator/rendering_simulator.h
@@ -42,12 +42,14 @@
  public:
   struct Config {
     using VideoTimingFactory =
-        std::function<std::unique_ptr<VCMTiming>(Environment)>;
+        std::function<std::unique_ptr<VCMTiming>(Environment, TimeDelta)>;
 
     std::string name = "";
     std::string field_trials_string = "";
-    VideoTimingFactory video_timing_factory = [](Environment env) {
-      return std::make_unique<VCMTiming>(&env.clock(), env.field_trials());
+    VideoTimingFactory video_timing_factory = [](Environment env,
+                                                 TimeDelta render_delay) {
+      return std::make_unique<VCMTiming>(&env.clock(), env.field_trials(),
+                                         render_delay);
     };
 
     // Whether or not to reset the stream state on newly logged streams with the
diff --git a/video/timing/simulator/rendering_tracker.cc b/video/timing/simulator/rendering_tracker.cc
index 9741c5b..0fc6eb3 100644
--- a/video/timing/simulator/rendering_tracker.cc
+++ b/video/timing/simulator/rendering_tracker.cc
@@ -85,7 +85,6 @@
   RTC_DCHECK(config.render_delay.IsFinite());
   // Setup.
   ResetVideoStreamBufferControllerObserverStats();
-  video_timing_->set_render_delay(config_.render_delay);
   video_stream_buffer_controller_.StartNextDecode(/*keyframe_required=*/true);
 }
 
diff --git a/video/timing/simulator/rendering_tracker_unittest.cc b/video/timing/simulator/rendering_tracker_unittest.cc
index 81e3f05..404559b 100644
--- a/video/timing/simulator/rendering_tracker_unittest.cc
+++ b/video/timing/simulator/rendering_tracker_unittest.cc
@@ -63,10 +63,10 @@
       RTC_DCHECK_RUN_ON(queue_ptr_);
       rendering_tracker_ = std::make_unique<RenderingTracker>(
           env_,
-          RenderingTracker::Config{
-              .ssrc = EncodedFrameBuilderGenerator::kSsrc,
-              .render_delay = TimeDelta::Millis(10)},
-          std::make_unique<VCMTiming>(&env_.clock(), env_.field_trials()),
+          RenderingTracker::Config{.ssrc = EncodedFrameBuilderGenerator::kSsrc,
+                                   .render_delay = TimeDelta::Millis(10)},
+          std::make_unique<VCMTiming>(&env_.clock(), env_.field_trials(),
+                                      /*render_delay=*/TimeDelta::Millis(10)),
           &rendering_tracker_events_);
       rendering_tracker_->SetDecodedFrameIdCallback(&decoded_frame_id_cb_);
     });
diff --git a/video/video_receive_stream2.cc b/video/video_receive_stream2.cc
index bd17704..7c1b81b 100644
--- a/video/video_receive_stream2.cc
+++ b/video/video_receive_stream2.cc
@@ -297,8 +297,6 @@
     decoder_payload_types.insert(decoder.payload_type);
   }
 
-  timing_->set_render_delay(TimeDelta::Millis(config_.render_delay_ms));
-
   if (!config_.rtp.rtx_associated_payload_types.empty()) {
     rtx_receive_stream_ = std::make_unique<RtxReceiveStream>(
         env_, &rtp_video_stream_receiver_,
diff --git a/video/video_receive_stream2_unittest.cc b/video/video_receive_stream2_unittest.cc
index 63ece66..66c92f9 100644
--- a/video/video_receive_stream2_unittest.cc
+++ b/video/video_receive_stream2_unittest.cc
@@ -268,7 +268,8 @@
       video_receive_stream_->UnregisterFromTransport();
       video_receive_stream_ = nullptr;
     }
-    timing_ = new VCMTiming(&env_.clock(), env_.field_trials());
+    timing_ = new VCMTiming(&env_.clock(), env_.field_trials(),
+                            TimeDelta::Millis(config_.render_delay_ms));
     video_receive_stream_ = std::make_unique<internal::VideoReceiveStream2>(
         env_, &fake_call_, kDefaultNumCpuCores, &packet_router_, config_.Copy(),
         &call_stats_, absl::WrapUnique(timing_), &nack_periodic_processor_,
diff --git a/video/video_stream_buffer_controller_unittest.cc b/video/video_stream_buffer_controller_unittest.cc
index 9925644..81e49e6 100644
--- a/video/video_stream_buffer_controller_unittest.cc
+++ b/video/video_stream_buffer_controller_unittest.cc
@@ -140,7 +140,7 @@
         decode_sync_(clock_,
                      &fake_metronome_,
                      time_controller_.GetMainThread()),
-        timing_(clock_, field_trials_),
+        timing_(clock_, field_trials_, /*render_delay=*/TimeDelta::Millis(10)),
         buffer_(std::make_unique<VideoStreamBufferController>(
             clock_,
             time_controller_.GetMainThread(),