Make VideoJitterTimingFactory injectable through PeerConnectionFactoryDependencies.

Bug: b/493549134
Change-Id: Ida2c39fdc425eb5de195e11e45fc465695f5d471
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/484960
Reviewed-by: Rasmus Brandt <brandtr@webrtc.org>
Reviewed-by: Per Kjellander <perkj@webrtc.org>
Commit-Queue: Åsa Persson <asapersson@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#48084}
diff --git a/api/BUILD.gn b/api/BUILD.gn
index 2030900..ac60d88 100644
--- a/api/BUILD.gn
+++ b/api/BUILD.gn
@@ -491,6 +491,7 @@
     "transport:sctp_transport_factory_interface",
     "units:time_delta",
     "video:video_bitrate_allocator_factory",
+    "video/timing:video_jitter_timing_factory",
     "video_codecs:video_codecs_api",
     "//third_party/abseil-cpp/absl/base:core_headers",
     "//third_party/abseil-cpp/absl/strings:string_view",
diff --git a/api/peer_connection_interface.h b/api/peer_connection_interface.h
index e1ba0a6..c662758 100644
--- a/api/peer_connection_interface.h
+++ b/api/peer_connection_interface.h
@@ -122,6 +122,7 @@
 #include "api/transport/network_control.h"
 #include "api/transport/sctp_transport_factory_interface.h"
 #include "api/turn_customizer.h"
+#include "api/video/timing/video_jitter_timing_factory.h"
 #include "api/video/video_bitrate_allocator_factory.h"
 #include "api/video_codecs/video_decoder_factory.h"
 #include "api/video_codecs/video_encoder_factory.h"
@@ -1460,6 +1461,9 @@
   // called without a `port_allocator`, and the above `network_manager' is null.
   std::unique_ptr<NetworkMonitorFactory> network_monitor_factory;
   std::unique_ptr<NetEqFactory> neteq_factory;
+  // Factory for creating VideoJitterTiming instances, used to track and
+  // manage video frame timing for rendering.
+  std::unique_ptr<VideoJitterTimingFactory> video_jitter_timing_factory;
   std::unique_ptr<SctpTransportFactoryInterface> sctp_factory;
   // Metronome used for decoding, must be called on the worker thread.
   std::unique_ptr<Metronome> decode_metronome;
diff --git a/call/BUILD.gn b/call/BUILD.gn
index 743bc44..7c65219 100644
--- a/call/BUILD.gn
+++ b/call/BUILD.gn
@@ -69,6 +69,7 @@
     "../api/units:time_delta",
     "../api/units:timestamp",
     "../api/video:video_stream_encoder",
+    "../api/video/timing:video_jitter_timing_factory",
     "../modules/async_audio_processing",
     "../modules/congestion_controller/rtp:congestion_controller_feedback_stats",
     "../modules/rtp_rtcp",
@@ -329,6 +330,8 @@
     "../api/units:time_delta",
     "../api/units:timestamp",
     "../api/video:video_stream_encoder",
+    "../api/video/timing:video_jitter_timing_factory",
+    "../api/video/timing:video_jitter_timing_interface",
     "../audio",
     "../logging:rtc_event_audio",
     "../logging:rtc_event_rtp_rtcp",
diff --git a/call/call.cc b/call/call.cc
index 93faed95..dd50675 100644
--- a/call/call.cc
+++ b/call/call.cc
@@ -44,6 +44,8 @@
 #include "api/units/data_size.h"
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
+#include "api/video/timing/video_jitter_timing_factory.h"
+#include "api/video/timing/video_jitter_timing_interface.h"
 #include "api/video/video_stream_encoder_settings.h"
 #include "audio/audio_receive_stream.h"
 #include "audio/audio_send_stream.h"
@@ -149,6 +151,15 @@
   return rtclog_config;
 }
 
+std::unique_ptr<VideoJitterTimingInterface> MaybeCreateVideoJitterTiming(
+    const Environment& env,
+    VideoJitterTimingFactory* video_timing_factory) {
+  if (video_timing_factory) {
+    return video_timing_factory->Create(env);
+  }
+  return nullptr;  // DefaultVideoJitterTiming will be used.
+}
+
 }  // namespace
 
 namespace internal {
@@ -1042,8 +1053,10 @@
   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(),
-                                  render_delay),
+      std::make_unique<VCMTiming>(
+          &env_.clock(), env_.field_trials(), render_delay,
+          MaybeCreateVideoJitterTiming(env_,
+                                       config_.video_jitter_timing_factory)),
       &nack_periodic_processor_, decode_sync_.get());
   // TODO(bugs.webrtc.org/11993): Set this up asynchronously on the network
   // thread.
diff --git a/call/call_config.h b/call/call_config.h
index aefa35f..4a67c7e 100644
--- a/call/call_config.h
+++ b/call/call_config.h
@@ -24,6 +24,7 @@
 #include "api/transport/bitrate_settings.h"
 #include "api/transport/network_control.h"
 #include "api/units/time_delta.h"
+#include "api/video/timing/video_jitter_timing_factory.h"
 #include "call/audio_state.h"
 #include "call/rtp_transport_config.h"
 
@@ -90,6 +91,8 @@
   // NetEq factory to use for this call.
   NetEqFactory* neteq_factory = nullptr;
 
+  VideoJitterTimingFactory* video_jitter_timing_factory = nullptr;
+
   TaskQueueBase* network_task_queue_ = nullptr;
   TaskQueueBase* worker_task_queue = nullptr;
 
diff --git a/pc/BUILD.gn b/pc/BUILD.gn
index edacdda..c5eacce 100644
--- a/pc/BUILD.gn
+++ b/pc/BUILD.gn
@@ -1655,6 +1655,7 @@
     "../api/transport:network_control",
     "../api/transport:sctp_transport_factory_interface",
     "../api/units:data_rate",
+    "../api/video/timing:video_jitter_timing_factory",
     "../call:call_interfaces",
     "../media:codec",
     "../media:media_engine",
diff --git a/pc/peer_connection_factory.cc b/pc/peer_connection_factory.cc
index 5c7c50e..c63b6b0 100644
--- a/pc/peer_connection_factory.cc
+++ b/pc/peer_connection_factory.cc
@@ -109,6 +109,8 @@
       injected_network_controller_factory_(
           std::move(dependencies->network_controller_factory)),
       neteq_factory_(std::move(dependencies->neteq_factory)),
+      video_jitter_timing_factory_(
+          std::move(dependencies->video_jitter_timing_factory)),
       decode_metronome_(std::move(dependencies->decode_metronome)),
       encode_metronome_(std::move(dependencies->encode_metronome)) {}
 
@@ -396,6 +398,7 @@
   call_config.network_state_predictor_factory =
       network_state_predictor_factory_.get();
   call_config.neteq_factory = neteq_factory_.get();
+  call_config.video_jitter_timing_factory = video_jitter_timing_factory_.get();
 
   if (field_trials().IsEnabled("WebRTC-Bwe-InjectedCongestionController")) {
     RTC_LOG(LS_INFO) << "Using pcf injected network controller factory";
diff --git a/pc/peer_connection_factory.h b/pc/peer_connection_factory.h
index 723baab..983106c 100644
--- a/pc/peer_connection_factory.h
+++ b/pc/peer_connection_factory.h
@@ -36,6 +36,7 @@
 #include "api/sequence_checker.h"
 #include "api/transport/network_control.h"
 #include "api/transport/sctp_transport_factory_interface.h"
+#include "api/video/timing/video_jitter_timing_factory.h"
 #include "call/call.h"
 #include "media/base/media_engine.h"
 #include "pc/codec_vendor.h"
@@ -139,6 +140,7 @@
   std::unique_ptr<NetworkControllerFactoryInterface>
       injected_network_controller_factory_;
   std::unique_ptr<NetEqFactory> neteq_factory_;
+  std::unique_ptr<VideoJitterTimingFactory> video_jitter_timing_factory_;
   std::unique_ptr<Metronome> decode_metronome_
       RTC_GUARDED_BY(signaling_thread());
   std::unique_ptr<Metronome> encode_metronome_