Index: webrtc/modules/video_coding/rtp_frame_reference_finder.cc |
diff --git a/webrtc/modules/video_coding/rtp_frame_reference_finder.cc b/webrtc/modules/video_coding/rtp_frame_reference_finder.cc |
index 2ddfada74e5e7763d5810538d84230894437568f..f313509cf13c0e0565537168ccc2dac0d1f07b9e 100644 |
--- a/webrtc/modules/video_coding/rtp_frame_reference_finder.cc |
+++ b/webrtc/modules/video_coding/rtp_frame_reference_finder.cc |
@@ -69,7 +69,21 @@ void RtpFrameReferenceFinder::RetryStashedFrames() { |
} |
void RtpFrameReferenceFinder::ManageFrameGeneric( |
- std::unique_ptr<RtpFrameObject> frame) { |
+ std::unique_ptr<RtpFrameObject> 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 != -1) { |
pbos-webrtc
2016/06/03 13:26:55
Can't this check kNoPictureId?
philipel
2016/06/03 14:17:14
Done.
|
+ 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,10 @@ void RtpFrameReferenceFinder::ManageFrameVp8( |
if (codec_header.pictureId == kNoPictureId || |
codec_header.temporalIdx == kNoTemporalIdx || |
codec_header.tl0PicIdx == kNoTl0PicIdx) { |
- ManageFrameGeneric(std::move(frame)); |
+ if (codec_header.pictureId != kNoPictureId) |
+ ManageFrameGeneric(std::move(frame), codec_header.pictureId); |
+ else |
+ ManageFrameGeneric(std::move(frame)); |
return; |
} |
@@ -266,8 +283,12 @@ 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) { |
+ if (codec_header.picture_id != kNoPictureId) |
+ ManageFrameGeneric(std::move(frame), codec_header.picture_id); |
+ else |
+ ManageFrameGeneric(std::move(frame)); |
return; |
} |