[cleanup] Return struct from VCMTiming::GetTimings

Cleans callers having to initialize TimeDeltas.

Change-Id: Ib00a59bedf05fb82c9fde1d9fdd1e341e2132cb8
Bug: None
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/256360
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Commit-Queue: Evan Shrubsole <eshr@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#36292}
diff --git a/modules/video_coding/frame_buffer2.cc b/modules/video_coding/frame_buffer2.cc
index de23981..b4b9c11 100644
--- a/modules/video_coding/frame_buffer2.cc
+++ b/modules/video_coding/frame_buffer2.cc
@@ -596,17 +596,12 @@
   if (!stats_callback_)
     return;
 
-  TimeDelta max_decode = TimeDelta::Zero();
-  TimeDelta current_delay = TimeDelta::Zero();
-  TimeDelta target_delay = TimeDelta::Zero();
-  TimeDelta jitter_buffer = TimeDelta::Zero();
-  TimeDelta min_playout_delay = TimeDelta::Zero();
-  TimeDelta render_delay = TimeDelta::Zero();
-  if (timing_->GetTimings(&max_decode, &current_delay, &target_delay,
-                          &jitter_buffer, &min_playout_delay, &render_delay)) {
+  auto timings = timing_->GetTimings();
+  if (timings.num_decoded_frames > 0) {
     stats_callback_->OnFrameBufferTimingsUpdated(
-        max_decode.ms(), current_delay.ms(), target_delay.ms(),
-        jitter_buffer.ms(), min_playout_delay.ms(), render_delay.ms());
+        timings.max_decode_duration.ms(), timings.current_delay.ms(),
+        timings.target_delay.ms(), timings.jitter_buffer_delay.ms(),
+        timings.min_playout_delay.ms(), timings.render_delay.ms());
   }
 }
 
diff --git a/modules/video_coding/frame_buffer2_unittest.cc b/modules/video_coding/frame_buffer2_unittest.cc
index 4811635..d8ba863 100644
--- a/modules/video_coding/frame_buffer2_unittest.cc
+++ b/modules/video_coding/frame_buffer2_unittest.cc
@@ -65,25 +65,8 @@
     return render_time - now - kDecodeTime;
   }
 
-  bool GetTimings(TimeDelta* max_decode,
-                  TimeDelta* current_delay,
-                  TimeDelta* target_delay,
-                  TimeDelta* jitter_buffer,
-                  TimeDelta* min_playout_delay,
-                  TimeDelta* render_delay) const override {
-    return true;
-  }
-
   TimeDelta GetCurrentJitter() {
-    TimeDelta max_decode = TimeDelta::Zero();
-    TimeDelta current_delay = TimeDelta::Zero();
-    TimeDelta target_delay = TimeDelta::Zero();
-    TimeDelta jitter_buffer = TimeDelta::Zero();
-    TimeDelta min_playout_delay = TimeDelta::Zero();
-    TimeDelta render_delay = TimeDelta::Zero();
-    VCMTiming::GetTimings(&max_decode, &current_delay, &target_delay,
-                          &jitter_buffer, &min_playout_delay, &render_delay);
-    return jitter_buffer;
+    return VCMTiming::GetTimings().jitter_buffer_delay;
   }
 
  private:
@@ -538,6 +521,8 @@
   EXPECT_CALL(stats_callback_,
               OnCompleteFrame(true, kFrameSize, VideoContentType::UNSPECIFIED));
   EXPECT_CALL(stats_callback_, OnFrameBufferTimingsUpdated(_, _, _, _, _, _));
+  // Stats callback requires a previously decoded frame.
+  timing_.StopDecodeTimer(TimeDelta::Millis(1), Timestamp::Zero());
 
   {
     std::unique_ptr<FrameObjectFake> frame(new FrameObjectFake());
diff --git a/modules/video_coding/receiver_unittest.cc b/modules/video_coding/receiver_unittest.cc
index 73c88a5..e38f9c5 100644
--- a/modules/video_coding/receiver_unittest.cc
+++ b/modules/video_coding/receiver_unittest.cc
@@ -448,11 +448,9 @@
   int64_t arrive_timestamps[kNumFrames];
   int64_t render_timestamps[kNumFrames];
 
-  TimeDelta render_delay_ms = TimeDelta::Zero();
-  TimeDelta max_decode_ms = TimeDelta::Zero();
-  TimeDelta dummy = TimeDelta::Zero();
-  timing_.GetTimings(&max_decode_ms, &dummy, &dummy, &dummy, &dummy,
-                     &render_delay_ms);
+  auto timings = timing_.GetTimings();
+  TimeDelta render_delay = timings.render_delay;
+  TimeDelta max_decode = timings.max_decode_duration;
 
   // Construct test samples.
   // render_timestamps are the timestamps stored in the Frame;
@@ -479,9 +477,8 @@
         receiver_.FrameForDecoding(kMaxWaitTime, prefer_late_decoding);
     int64_t end_time = clock_.TimeInMilliseconds();
     if (frame) {
-      EXPECT_EQ(
-          frame->RenderTimeMs() - max_decode_ms.ms() - render_delay_ms.ms(),
-          end_time);
+      EXPECT_EQ(frame->RenderTimeMs() - max_decode.ms() - render_delay.ms(),
+                end_time);
       receiver_.ReleaseFrame(frame);
       ++num_frames_return;
     } else {
diff --git a/modules/video_coding/timing.cc b/modules/video_coding/timing.cc
index 89159f6..390a499 100644
--- a/modules/video_coding/timing.cc
+++ b/modules/video_coding/timing.cc
@@ -238,20 +238,15 @@
                   jitter_delay_ + RequiredDecodeTime() + render_delay_);
 }
 
-bool VCMTiming::GetTimings(TimeDelta* max_decode,
-                           TimeDelta* current_delay,
-                           TimeDelta* target_delay,
-                           TimeDelta* jitter_buffer,
-                           TimeDelta* min_playout_delay,
-                           TimeDelta* render_delay) const {
+VCMTiming::VideoDelayTimings VCMTiming::GetTimings() const {
   MutexLock lock(&mutex_);
-  *max_decode = RequiredDecodeTime();
-  *current_delay = current_delay_;
-  *target_delay = TargetDelayInternal();
-  *jitter_buffer = jitter_delay_;
-  *min_playout_delay = min_playout_delay_;
-  *render_delay = render_delay_;
-  return (num_decoded_frames_ > 0);
+  return VideoDelayTimings{.max_decode_duration = RequiredDecodeTime(),
+                           .current_delay = current_delay_,
+                           .target_delay = TargetDelayInternal(),
+                           .jitter_buffer_delay = jitter_delay_,
+                           .min_playout_delay = min_playout_delay_,
+                           .render_delay = render_delay_,
+                           .num_decoded_frames = num_decoded_frames_};
 }
 
 void VCMTiming::SetTimingFrameInfo(const TimingFrameInfo& info) {
diff --git a/modules/video_coding/timing.h b/modules/video_coding/timing.h
index 8ab2f68..af3974a 100644
--- a/modules/video_coding/timing.h
+++ b/modules/video_coding/timing.h
@@ -94,12 +94,16 @@
 
   // Return current timing information. Returns true if the first frame has been
   // decoded, false otherwise.
-  virtual bool GetTimings(TimeDelta* max_decode,
-                          TimeDelta* current_delay,
-                          TimeDelta* target_delay,
-                          TimeDelta* jitter_buffer,
-                          TimeDelta* min_playout_delay,
-                          TimeDelta* render_delay) const;
+  struct VideoDelayTimings {
+    TimeDelta max_decode_duration;
+    TimeDelta current_delay;
+    TimeDelta target_delay;
+    TimeDelta jitter_buffer_delay;
+    TimeDelta min_playout_delay;
+    TimeDelta render_delay;
+    size_t num_decoded_frames;
+  };
+  VideoDelayTimings GetTimings() const;
 
   void SetTimingFrameInfo(const TimingFrameInfo& info);
   absl::optional<TimingFrameInfo> GetTimingFrameInfo();