Add a FrameToRender argument struct as input to FrameToRender

This is to make it easier to add new arguments to the method in the
future. We will remove the already existing method accordingly to WebRTCs deprecation rules.

Bug: webrtc:358039777
Change-Id: Id0706de5216fbd0182cac80ebfccfc4a6a055ee8
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/364642
Commit-Queue: Fanny Linderborg <linderborg@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Auto-Submit: Fanny Linderborg <linderborg@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#43181}
diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn
index 82177ad..b79e0de 100644
--- a/modules/video_coding/BUILD.gn
+++ b/modules/video_coding/BUILD.gn
@@ -288,7 +288,9 @@
   ]
   deps = [
     ":codec_globals_headers",
+    "../../api/units:time_delta",
     "../../api/video:video_frame",
+    "../../api/video:video_frame_type",
     "../../api/video:video_rtp_headers",
     "../../api/video_codecs:scalability_mode",
     "../../api/video_codecs:video_codecs_api",
diff --git a/modules/video_coding/generic_decoder.cc b/modules/video_coding/generic_decoder.cc
index 1f2c600..1568c29 100644
--- a/modules/video_coding/generic_decoder.cc
+++ b/modules/video_coding/generic_decoder.cc
@@ -220,9 +220,11 @@
 
   decodedImage.set_timestamp_us(
       frame_info->render_time ? frame_info->render_time->us() : -1);
-  _receiveCallback->FrameToRender(decodedImage, qp, decode_time,
-                                  frame_info->content_type,
-                                  frame_info->frame_type);
+  _receiveCallback->FrameToRender({.video_frame = decodedImage,
+                                   .qp = qp,
+                                   .decode_time = decode_time,
+                                   .content_type = frame_info->content_type,
+                                   .frame_type = frame_info->frame_type});
 }
 
 void VCMDecodedFrameCallback::OnDecoderInfoChanged(
diff --git a/modules/video_coding/generic_decoder_unittest.cc b/modules/video_coding/generic_decoder_unittest.cc
index 7edc961..fef8083 100644
--- a/modules/video_coding/generic_decoder_unittest.cc
+++ b/modules/video_coding/generic_decoder_unittest.cc
@@ -17,6 +17,10 @@
 
 #include "api/array_view.h"
 #include "api/rtp_packet_infos.h"
+#include "api/units/time_delta.h"
+#include "api/video/video_content_type.h"
+#include "api/video/video_frame.h"
+#include "api/video/video_frame_type.h"
 #include "api/video_codecs/video_decoder.h"
 #include "common_video/test/utilities.h"
 #include "modules/video_coding/timing/timing.h"
@@ -37,7 +41,15 @@
                         TimeDelta decode_time,
                         VideoContentType content_type,
                         VideoFrameType frame_type) override {
-    frames_.push_back(frame);
+    return FrameToRender({.video_frame = frame,
+                          .qp = qp,
+                          .decode_time = decode_time,
+                          .content_type = content_type,
+                          .frame_type = frame_type});
+  }
+
+  int32_t FrameToRender(const struct FrameToRender& arguments) override {
+    frames_.push_back(arguments.video_frame);
     return 0;
   }
 
diff --git a/modules/video_coding/include/video_coding_defines.h b/modules/video_coding/include/video_coding_defines.h
index 4821d5e..eb8e728 100644
--- a/modules/video_coding/include/video_coding_defines.h
+++ b/modules/video_coding/include/video_coding_defines.h
@@ -16,8 +16,10 @@
 
 #include <optional>
 
+#include "api/units/time_delta.h"
 #include "api/video/video_content_type.h"
 #include "api/video/video_frame.h"
+#include "api/video/video_frame_type.h"
 #include "api/video/video_timing.h"
 #include "api/video_codecs/video_decoder.h"
 
@@ -51,11 +53,25 @@
 // rendered.
 class VCMReceiveCallback {
  public:
+  struct FrameToRender {
+    VideoFrame& video_frame;
+    std::optional<uint8_t> qp;
+    TimeDelta decode_time;
+    VideoContentType content_type;
+    VideoFrameType frame_type;
+  };
+
+  // TODO: bugs.webrtc.org/358039777 - Delete this function.
+  [[deprecated("Use FrameToRender(FrameToRender) instead.")]]
   virtual int32_t FrameToRender(VideoFrame& videoFrame,  // NOLINT
                                 std::optional<uint8_t> qp,
                                 TimeDelta decode_time,
                                 VideoContentType content_type,
                                 VideoFrameType frame_type) = 0;
+  // TODO: bugs.webrtc.org/358039777 - Make this pure virtual.
+  virtual int32_t FrameToRender(const struct FrameToRender& arguments) {
+    return 0;
+  }
 
   virtual void OnDroppedFrames(uint32_t frames_dropped);
 
diff --git a/modules/video_coding/video_receiver2_unittest.cc b/modules/video_coding/video_receiver2_unittest.cc
index 48ae8af..8cdd8ab 100644
--- a/modules/video_coding/video_receiver2_unittest.cc
+++ b/modules/video_coding/video_receiver2_unittest.cc
@@ -10,12 +10,18 @@
 
 #include "modules/video_coding/video_receiver2.h"
 
+#include <cstdint>
 #include <memory>
+#include <optional>
 #include <utility>
 
 #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_content_type.h"
+#include "api/video/video_frame.h"
+#include "api/video/video_frame_type.h"
 #include "common_video/test/utilities.h"
 #include "modules/video_coding/decoder_database.h"
 #include "modules/video_coding/timing/timing.h"
@@ -43,6 +49,10 @@
                VideoContentType,
                VideoFrameType),
               (override));
+  MOCK_METHOD(int32_t,
+              FrameToRender,
+              (const struct FrameToRender&),
+              (override));
   MOCK_METHOD(void, OnIncomingPayloadType, (int), (override));
   MOCK_METHOD(void,
               OnDecoderInfoChanged,
diff --git a/modules/video_coding/video_receiver_unittest.cc b/modules/video_coding/video_receiver_unittest.cc
index 7a04826..7e21a5c 100644
--- a/modules/video_coding/video_receiver_unittest.cc
+++ b/modules/video_coding/video_receiver_unittest.cc
@@ -8,12 +8,20 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
+#include <cstdint>
+#include <optional>
+
 #include "api/test/mock_video_decoder.h"
+#include "api/units/time_delta.h"
+#include "api/video/video_content_type.h"
+#include "api/video/video_frame.h"
+#include "api/video/video_frame_type.h"
 #include "api/video_codecs/video_decoder.h"
 #include "modules/video_coding/include/video_coding.h"
 #include "modules/video_coding/timing/timing.h"
 #include "modules/video_coding/video_coding_impl.h"
 #include "system_wrappers/include/clock.h"
+#include "test/gmock.h"
 #include "test/gtest.h"
 #include "test/scoped_key_value_config.h"
 
@@ -46,6 +54,10 @@
                VideoContentType,
                VideoFrameType),
               (override));
+  MOCK_METHOD(int32_t,
+              FrameToRender,
+              (const struct FrameToRender&),
+              (override));
   MOCK_METHOD(void, OnIncomingPayloadType, (int), (override));
   MOCK_METHOD(void,
               OnDecoderInfoChanged,
diff --git a/video/video_stream_decoder2.cc b/video/video_stream_decoder2.cc
index df4f3530..1f5ef42 100644
--- a/video/video_stream_decoder2.cc
+++ b/video/video_stream_decoder2.cc
@@ -10,6 +10,13 @@
 
 #include "video/video_stream_decoder2.h"
 
+#include <cstdint>
+#include <optional>
+
+#include "api/units/time_delta.h"
+#include "api/video/video_content_type.h"
+#include "api/video/video_frame.h"
+#include "api/video/video_frame_type.h"
 #include "api/video_codecs/video_decoder.h"
 #include "modules/video_coding/video_receiver2.h"
 #include "rtc_base/checks.h"
@@ -48,9 +55,18 @@
                                           TimeDelta decode_time,
                                           VideoContentType content_type,
                                           VideoFrameType frame_type) {
-  receive_stats_callback_->OnDecodedFrame(video_frame, qp, decode_time,
-                                          content_type, frame_type);
-  incoming_video_stream_->OnFrame(video_frame);
+  return FrameToRender({.video_frame = video_frame,
+                        .qp = qp,
+                        .decode_time = decode_time,
+                        .content_type = content_type,
+                        .frame_type = frame_type});
+}
+int32_t VideoStreamDecoder::FrameToRender(
+    const struct FrameToRender& arguments) {
+  receive_stats_callback_->OnDecodedFrame(
+      arguments.video_frame, arguments.qp, arguments.decode_time,
+      arguments.content_type, arguments.frame_type);
+  incoming_video_stream_->OnFrame(arguments.video_frame);
   return 0;
 }
 
diff --git a/video/video_stream_decoder2.h b/video/video_stream_decoder2.h
index 7847025..8a89e32 100644
--- a/video/video_stream_decoder2.h
+++ b/video/video_stream_decoder2.h
@@ -11,12 +11,18 @@
 #ifndef VIDEO_VIDEO_STREAM_DECODER2_H_
 #define VIDEO_VIDEO_STREAM_DECODER2_H_
 
+#include <cstdint>
 #include <list>
 #include <map>
 #include <memory>
+#include <optional>
 #include <vector>
 
 #include "api/scoped_refptr.h"
+#include "api/units/time_delta.h"
+#include "api/video/video_content_type.h"
+#include "api/video/video_frame.h"
+#include "api/video/video_frame_type.h"
 #include "api/video/video_sink_interface.h"
 #include "api/video_codecs/video_decoder.h"
 #include "modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
@@ -45,6 +51,7 @@
                         TimeDelta decode_time,
                         VideoContentType content_type,
                         VideoFrameType frame_type) override;
+  int32_t FrameToRender(const struct FrameToRender& arguments) override;
   void OnDroppedFrames(uint32_t frames_dropped) override;
   void OnIncomingPayloadType(int payload_type) override;
   void OnDecoderInfoChanged(