diff --git a/modules/video_coding/frame_object.cc b/modules/video_coding/frame_object.cc index 57c60ca441..a1b4f58666 100644 --- a/modules/video_coding/frame_object.cc +++ b/modules/video_coding/frame_object.cc @@ -151,12 +151,12 @@ bool RtpFrameObject::delayed_by_retransmission() const { return times_nacked() > 0; } -absl::optional RtpFrameObject::GetCodecHeader() const { +absl::optional 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 6c6480a867..2c8ba15fb1 100644 --- a/modules/video_coding/frame_object.h +++ b/modules/video_coding/frame_object.h @@ -40,7 +40,7 @@ class RtpFrameObject : public EncodedFrame { int64_t ReceivedTime() const override; int64_t RenderTime() const override; bool delayed_by_retransmission() const override; - absl::optional GetCodecHeader() const; + absl::optional GetCodecHeader() const; private: rtc::scoped_refptr packet_buffer_; diff --git a/modules/video_coding/rtp_frame_reference_finder.cc b/modules/video_coding/rtp_frame_reference_finder.cc index 28e8ef86b2..12517885a4 100644 --- a/modules/video_coding/rtp_frame_reference_finder.cc +++ b/modules/video_coding/rtp_frame_reference_finder.cc @@ -88,8 +88,14 @@ RtpFrameReferenceFinder::ManageFrameInternal(RtpFrameObject* frame) { 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 video_header = frame->GetCodecHeader(); + absl::optional 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::ManageFrameGeneric(RtpFrameObject* frame, RtpFrameReferenceFinder::FrameDecision RtpFrameReferenceFinder::ManageFrameVp8( RtpFrameObject* frame) { - absl::optional rtp_codec_header = frame->GetCodecHeader(); - if (!rtp_codec_header) { + absl::optional 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(*rtp_codec_header); + absl::get(rtp_codec_header); if (codec_header.pictureId == kNoPictureId || codec_header.temporalIdx == kNoTemporalIdx || @@ -381,15 +388,16 @@ void RtpFrameReferenceFinder::UpdateLayerInfoVp8(RtpFrameObject* frame, RtpFrameReferenceFinder::FrameDecision RtpFrameReferenceFinder::ManageFrameVp9( RtpFrameObject* frame) { - absl::optional rtp_codec_header = frame->GetCodecHeader(); - if (!rtp_codec_header) { + absl::optional 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(*rtp_codec_header); + absl::get(rtp_codec_header); if (codec_header.picture_id == kNoPictureId || codec_header.temporal_idx == kNoTemporalIdx) {