diff --git a/webrtc/modules/video_coding/rtp_frame_reference_finder.cc b/webrtc/modules/video_coding/rtp_frame_reference_finder.cc index 2ddfada74e..7e87d3812b 100644 --- a/webrtc/modules/video_coding/rtp_frame_reference_finder.cc +++ b/webrtc/modules/video_coding/rtp_frame_reference_finder.cc @@ -46,7 +46,7 @@ void RtpFrameReferenceFinder::ManageFrame( case kVideoCodecH264: case kVideoCodecI420: case kVideoCodecGeneric: - ManageFrameGeneric(std::move(frame)); + ManageFrameGeneric(std::move(frame), kNoPictureId); break; } } @@ -69,7 +69,21 @@ void RtpFrameReferenceFinder::RetryStashedFrames() { } void RtpFrameReferenceFinder::ManageFrameGeneric( - std::unique_ptr frame) { + std::unique_ptr frame, + int picture_id) { + // If |picture_id| is specified then we use that to set the frame references, + // otherwise we use sequence number. + if (picture_id != kNoPictureId) { + if (last_unwrap_ == -1) + last_unwrap_ = picture_id; + + frame->picture_id = UnwrapPictureId(picture_id % kPicIdLength); + frame->num_references = frame->frame_type() == kVideoFrameKey ? 0 : 1; + frame->references[0] = frame->picture_id - 1; + frame_callback_->OnCompleteFrame(std::move(frame)); + return; + } + if (frame->frame_type() == kVideoFrameKey) last_seq_num_gop_[frame->last_seq_num()] = frame->last_seq_num(); @@ -125,7 +139,7 @@ void RtpFrameReferenceFinder::ManageFrameVp8( if (codec_header.pictureId == kNoPictureId || codec_header.temporalIdx == kNoTemporalIdx || codec_header.tl0PicIdx == kNoTl0PicIdx) { - ManageFrameGeneric(std::move(frame)); + ManageFrameGeneric(std::move(frame), codec_header.pictureId); return; } @@ -266,8 +280,9 @@ void RtpFrameReferenceFinder::ManageFrameVp9( const RTPVideoHeaderVP9& codec_header = rtp_codec_header->VP9; - if (codec_header.picture_id == kNoPictureId) { - ManageFrameGeneric(std::move(frame)); + if (codec_header.picture_id == kNoPictureId || + codec_header.temporal_idx == kNoTemporalIdx) { + ManageFrameGeneric(std::move(frame), codec_header.picture_id); return; } diff --git a/webrtc/modules/video_coding/rtp_frame_reference_finder.h b/webrtc/modules/video_coding/rtp_frame_reference_finder.h index 7289b803bd..5fd67ab2a4 100644 --- a/webrtc/modules/video_coding/rtp_frame_reference_finder.h +++ b/webrtc/modules/video_coding/rtp_frame_reference_finder.h @@ -48,9 +48,11 @@ class RtpFrameReferenceFinder { // all information needed. void RetryStashedFrames() EXCLUSIVE_LOCKS_REQUIRED(crit_); - // Find references for generic frames. - void ManageFrameGeneric(std::unique_ptr frame) - EXCLUSIVE_LOCKS_REQUIRED(crit_); + // Find references for generic frames. If |picture_id| is unspecified + // then packet sequence numbers will be used to determine the references + // of the frames. + void ManageFrameGeneric(std::unique_ptr frame, + int picture_id) EXCLUSIVE_LOCKS_REQUIRED(crit_); // Find references for Vp8 frames void ManageFrameVp8(std::unique_ptr frame)