Use generic video header frame ID as picture ID.

Bug: webrtc:9582
Change-Id: I7b68a66205f704cba3afe1f461cce2c993016056
Reviewed-on: https://webrtc-review.googlesource.com/96501
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Commit-Queue: Sami Kalliomäki <sakal@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24479}
diff --git a/modules/video_coding/frame_object.cc b/modules/video_coding/frame_object.cc
index 57c60ca..a1b4f58 100644
--- a/modules/video_coding/frame_object.cc
+++ b/modules/video_coding/frame_object.cc
@@ -151,12 +151,12 @@
   return times_nacked() > 0;
 }
 
-absl::optional<RTPVideoTypeHeader> RtpFrameObject::GetCodecHeader() const {
+absl::optional<RTPVideoHeader> RtpFrameObject::GetCodecHeader() const {
   rtc::CritScope lock(&packet_buffer_->crit_);
   VCMPacket* packet = packet_buffer_->GetPacket(first_seq_num_);
   if (!packet)
     return absl::nullopt;
-  return packet->video_header.video_type_header;
+  return packet->video_header;
 }
 
 }  // namespace video_coding
diff --git a/modules/video_coding/frame_object.h b/modules/video_coding/frame_object.h
index 6c6480a..2c8ba15 100644
--- a/modules/video_coding/frame_object.h
+++ b/modules/video_coding/frame_object.h
@@ -40,7 +40,7 @@
   int64_t ReceivedTime() const override;
   int64_t RenderTime() const override;
   bool delayed_by_retransmission() const override;
-  absl::optional<RTPVideoTypeHeader> GetCodecHeader() const;
+  absl::optional<RTPVideoHeader> GetCodecHeader() const;
 
  private:
   rtc::scoped_refptr<PacketBuffer> packet_buffer_;
diff --git a/modules/video_coding/rtp_frame_reference_finder.cc b/modules/video_coding/rtp_frame_reference_finder.cc
index 28e8ef8..1251788 100644
--- a/modules/video_coding/rtp_frame_reference_finder.cc
+++ b/modules/video_coding/rtp_frame_reference_finder.cc
@@ -88,8 +88,14 @@
       return ManageFrameVp8(frame);
     case kVideoCodecVP9:
       return ManageFrameVp9(frame);
-    default:
-      return ManageFrameGeneric(frame, kNoPictureId);
+    default: {
+      // Use 15 first bits of frame ID as picture ID if available.
+      absl::optional<RTPVideoHeader> video_header = frame->GetCodecHeader();
+      absl::optional<RTPVideoHeader::GenericDescriptorInfo> generic_info =
+          video_header ? video_header->generic : absl::nullopt;
+      return ManageFrameGeneric(
+          frame, generic_info ? generic_info->frame_id & 0x7fff : kNoPictureId);
+    }
   }
 }
 
@@ -229,15 +235,16 @@
 
 RtpFrameReferenceFinder::FrameDecision RtpFrameReferenceFinder::ManageFrameVp8(
     RtpFrameObject* frame) {
-  absl::optional<RTPVideoTypeHeader> rtp_codec_header = frame->GetCodecHeader();
-  if (!rtp_codec_header) {
+  absl::optional<RTPVideoHeader> video_header = frame->GetCodecHeader();
+  if (!video_header) {
     RTC_LOG(LS_WARNING)
         << "Failed to get codec header from frame, dropping frame.";
     return kDrop;
   }
+  RTPVideoTypeHeader rtp_codec_header = video_header->video_type_header;
 
   const RTPVideoHeaderVP8& codec_header =
-      absl::get<RTPVideoHeaderVP8>(*rtp_codec_header);
+      absl::get<RTPVideoHeaderVP8>(rtp_codec_header);
 
   if (codec_header.pictureId == kNoPictureId ||
       codec_header.temporalIdx == kNoTemporalIdx ||
@@ -381,15 +388,16 @@
 
 RtpFrameReferenceFinder::FrameDecision RtpFrameReferenceFinder::ManageFrameVp9(
     RtpFrameObject* frame) {
-  absl::optional<RTPVideoTypeHeader> rtp_codec_header = frame->GetCodecHeader();
-  if (!rtp_codec_header) {
+  absl::optional<RTPVideoHeader> video_header = frame->GetCodecHeader();
+  if (!video_header) {
     RTC_LOG(LS_WARNING)
         << "Failed to get codec header from frame, dropping frame.";
     return kDrop;
   }
+  RTPVideoTypeHeader rtp_codec_header = video_header->video_type_header;
 
   const RTPVideoHeaderVP9& codec_header =
-      absl::get<RTPVideoHeaderVP9>(*rtp_codec_header);
+      absl::get<RTPVideoHeaderVP9>(rtp_codec_header);
 
   if (codec_header.picture_id == kNoPictureId ||
       codec_header.temporal_idx == kNoTemporalIdx) {