Pass explicit frame dependency information to RtpPayloadParams

Prior to this CL, RtpPayloadParams had code that assumed
dependency patterns in VP8, in order to write that information
into the [Generic Frame Descriptor] RTP extension.

This CL starts moving that code out of RtpPayloadParams.
Upcoming CLs will migrate additional encoder-wrappers to
the new scheme, then remove the deprecated code.

Bug: webrtc:10249
Change-Id: I5fc84aedf8e11f79d52b989ff8b7ce9568b6cf32
Reviewed-on: https://webrtc-review.googlesource.com/c/119958
Reviewed-by: Stefan Holmer <stefan@webrtc.org>
Reviewed-by: Sergey Silkin <ssilkin@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Elad Alon <eladalon@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26438}
diff --git a/modules/video_coding/include/video_codec_interface.h b/modules/video_coding/include/video_codec_interface.h
index d6e696d..052963c 100644
--- a/modules/video_coding/include/video_codec_interface.h
+++ b/modules/video_coding/include/video_codec_interface.h
@@ -24,15 +24,33 @@
 
 class RTPFragmentationHeader;  // forward declaration
 
-// Note: if any pointers are added to this struct, it must be fitted
+// Note: If any pointers are added to this struct, it must be fitted
 // with a copy-constructor. See below.
+// Hack alert - the code assumes that thisstruct is memset when constructed.
 struct CodecSpecificInfoVP8 {
   bool nonReference;
   uint8_t temporalIdx;
   bool layerSync;
   int8_t keyIdx;  // Negative value to skip keyIdx.
-};
 
+  // Used to generate the list of dependency frames.
+  // |referencedBuffers| and |updatedBuffers| contain buffer IDs.
+  // Note that the buffer IDs here have a one-to-one mapping with the actual
+  // codec buffers, but the exact mapping (i.e. whether 0 refers to Last,
+  // to Golden or to Arf) is not pre-determined.
+  // More references may be specified than are strictly necessary, but not less.
+  // TODO(bugs.webrtc.org/10242): Remove |useExplicitDependencies| once all
+  // encoder-wrappers are updated.
+  bool useExplicitDependencies;
+  static constexpr size_t kBuffersCount = 3;
+  size_t referencedBuffers[kBuffersCount];
+  size_t referencedBuffersCount;
+  size_t updatedBuffers[kBuffersCount];
+  size_t updatedBuffersCount;
+};
+static_assert(std::is_pod<CodecSpecificInfoVP8>::value, "");
+
+// Hack alert - the code assumes that thisstruct is memset when constructed.
 struct CodecSpecificInfoVP9 {
   bool first_frame_in_picture;  // First frame, increment picture_id.
   bool inter_pic_predicted;     // This layer frame is dependent on previously
@@ -60,18 +78,22 @@
 
   bool end_of_picture;
 };
+static_assert(std::is_pod<CodecSpecificInfoVP9>::value, "");
 
+// Hack alert - the code assumes that thisstruct is memset when constructed.
 struct CodecSpecificInfoH264 {
   H264PacketizationMode packetization_mode;
 };
+static_assert(std::is_pod<CodecSpecificInfoH264>::value, "");
 
 union CodecSpecificInfoUnion {
   CodecSpecificInfoVP8 VP8;
   CodecSpecificInfoVP9 VP9;
   CodecSpecificInfoH264 H264;
 };
+static_assert(std::is_pod<CodecSpecificInfoUnion>::value, "");
 
-// Note: if any pointers are added to this struct or its sub-structs, it
+// Note: If any pointers are added to this struct or its sub-structs, it
 // must be fitted with a copy-constructor. This is because it is copied
 // in the copy-constructor of VCMEncodedFrame.
 struct CodecSpecificInfo {