Use fake clock for codecs in VideoCodecTester.

When running in non-realtime mode, use a simulated clock insde the
encoder/decoders to avoid potential flakiness for implementations that
use real-time adaptive speed.

Bug: webrtc:443906251
Change-Id: If0f8b6052cbfc64bbd39c7654dc8825a3e0d513c
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/475760
Commit-Queue: Sergey Silkin <ssilkin@webrtc.org>
Reviewed-by: Sergey Silkin <ssilkin@webrtc.org>
Auto-Submit: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#47803}
diff --git a/test/BUILD.gn b/test/BUILD.gn
index e16a10a..b03d019 100644
--- a/test/BUILD.gn
+++ b/test/BUILD.gn
@@ -1490,6 +1490,7 @@
     "../api:make_ref_counted",
     "../api:scoped_refptr",
     "../api/environment",
+    "../api/environment:environment_factory",
     "../api/numerics",
     "../api/test/metrics:metric",
     "../api/test/metrics:metrics_logger",
diff --git a/test/video_codec_tester.cc b/test/video_codec_tester.cc
index a2e9439..86f25b6 100644
--- a/test/video_codec_tester.cc
+++ b/test/video_codec_tester.cc
@@ -33,6 +33,7 @@
 #include "absl/strings/match.h"
 #include "absl/strings/string_view.h"
 #include "api/environment/environment.h"
+#include "api/environment/environment_factory.h"
 #include "api/field_trials_view.h"
 #include "api/make_ref_counted.h"
 #include "api/numerics/samples_stats_counter.h"
@@ -865,6 +866,10 @@
           const DecoderSettings& decoder_settings,
           VideoCodecAnalyzer* analyzer)
       : env_(env),
+        decoder_clock_(
+            decoder_settings.pacing_settings.mode == PacingMode::kRealTime
+                ? nullptr
+                : std::make_unique<SimulatedClock>(env.clock().CurrentTime())),
         decoder_factory_(decoder_factory),
         decoder_settings_(decoder_settings),
         analyzer_(analyzer),
@@ -884,7 +889,11 @@
   }
 
   void Initialize(const SdpVideoFormat& sdp_video_format) {
-    decoder_ = decoder_factory_->Create(env_, sdp_video_format);
+    Environment codec_env = env_;
+    if (decoder_clock_) {
+      codec_env = CreateEnvironment(&env_.field_trials(), decoder_clock_.get());
+    }
+    decoder_ = decoder_factory_->Create(codec_env, sdp_video_format);
     RTC_CHECK(decoder_) << "Could not create decoder for video format "
                         << sdp_video_format.ToString();
 
@@ -923,6 +932,13 @@
 
     task_queue_.PostScheduledTask(
         [this, encoded_frame] {
+          if (decoder_clock_) {
+            Timestamp pts =
+                Timestamp::Micros((encoded_frame.RtpTimestamp() / k90kHz).us());
+            if (pts >= decoder_clock_->CurrentTime()) {
+              decoder_clock_->AdvanceTime(pts - decoder_clock_->CurrentTime());
+            }
+          }
           analyzer_->StartDecode(encoded_frame);
           int error = decoder_->Decode(encoded_frame, /*render_time_ms*/ 0);
           if (error != 0) {
@@ -969,6 +985,7 @@
   }
 
   const Environment env_;
+  std::unique_ptr<SimulatedClock> decoder_clock_;
   VideoDecoderFactory* decoder_factory_;
   const DecoderSettings decoder_settings_;
   std::unique_ptr<VideoDecoder> decoder_;
@@ -993,6 +1010,10 @@
           const EncoderSettings& encoder_settings,
           VideoCodecAnalyzer* analyzer)
       : env_(env),
+        encoder_clock_(
+            encoder_settings.pacing_settings.mode == PacingMode::kRealTime
+                ? nullptr
+                : std::make_unique<SimulatedClock>(env.clock().CurrentTime())),
         encoder_factory_(encoder_factory),
         encoder_settings_(encoder_settings),
         analyzer_(analyzer),
@@ -1012,8 +1033,12 @@
   }
 
   void Initialize(const EncodingSettings& encoding_settings) {
+    Environment codec_env = env_;
+    if (encoder_clock_) {
+      codec_env = CreateEnvironment(&env_.field_trials(), encoder_clock_.get());
+    }
     encoder_ =
-        encoder_factory_->Create(env_, encoding_settings.sdp_video_format);
+        encoder_factory_->Create(codec_env, encoding_settings.sdp_video_format);
     RTC_CHECK(encoder_) << "Could not create encoder for video format "
                         << encoding_settings.sdp_video_format.ToString();
 
@@ -1040,6 +1065,13 @@
 
     task_queue_.PostScheduledTask(
         [this, input_frame, encoding_settings] {
+          if (encoder_clock_) {
+            Timestamp pts =
+                Timestamp::Micros((input_frame.rtp_timestamp() / k90kHz).us());
+            if (pts >= encoder_clock_->CurrentTime()) {
+              encoder_clock_->AdvanceTime(pts - encoder_clock_->CurrentTime());
+            }
+          }
           analyzer_->StartEncode(input_frame, encoding_settings);
 
           if (!last_encoding_settings_ ||
@@ -1335,6 +1367,7 @@
   }
 
   const Environment env_;
+  std::unique_ptr<SimulatedClock> encoder_clock_;
   VideoEncoderFactory* const encoder_factory_;
   const EncoderSettings encoder_settings_;
   std::unique_ptr<VideoEncoder> encoder_;