[FFmpeg-cvslog] h264: handle frame recovery in h264_field_start()
Anton Khirnov
git at videolan.org
Thu Aug 4 21:17:00 EEST 2016
ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Fri May 20 12:42:23 2016 +0200| [58640fe89ec4f2a3d67c0a2585fca8de34440857] | committer: Anton Khirnov
h264: handle frame recovery in h264_field_start()
This is a more appropriate place for this. H264Context.recovery_frame is
shared between frame threads, so modifying it where it is right now is
invalid.
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=58640fe89ec4f2a3d67c0a2585fca8de34440857
---
libavcodec/h264_slice.c | 18 ++++++++++++++++++
libavcodec/h264dec.c | 18 ------------------
2 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index 4910396..2b7e088 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -1335,6 +1335,24 @@ static int h264_field_start(H264Context *h, const H264SliceContext *sl,
h->picture_idr = nal->type == H264_NAL_IDR_SLICE;
+ if (h->sei.recovery_point.recovery_frame_cnt >= 0 && h->recovery_frame < 0) {
+ h->recovery_frame = (h->poc.frame_num + h->sei.recovery_point.recovery_frame_cnt) &
+ ((1 << h->ps.sps->log2_max_frame_num) - 1);
+ }
+
+ h->cur_pic_ptr->f->key_frame |= (nal->type == H264_NAL_IDR_SLICE) ||
+ (h->sei.recovery_point.recovery_frame_cnt >= 0);
+
+ if (nal->type == H264_NAL_IDR_SLICE || h->recovery_frame == h->poc.frame_num) {
+ h->recovery_frame = -1;
+ h->cur_pic_ptr->recovered = 1;
+ }
+ // If we have an IDR, all frames after it in decoded order are
+ // "recovered".
+ if (nal->type == H264_NAL_IDR_SLICE)
+ h->frame_recovered |= FRAME_RECOVERED_IDR;
+ h->cur_pic_ptr->recovered |= !!(h->frame_recovered & FRAME_RECOVERED_IDR);
+
/* Set the frame properties/side data. Only done for the second field in
* field coded frames, since some SEI information is present for each field
* and is merged by the SEI parsing code. */
diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c
index 38ecc94..a148825 100644
--- a/libavcodec/h264dec.c
+++ b/libavcodec/h264dec.c
@@ -704,24 +704,6 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size)
if (sl->redundant_pic_count > 0)
break;
- if (h->sei.recovery_point.recovery_frame_cnt >= 0 && h->recovery_frame < 0) {
- h->recovery_frame = (h->poc.frame_num + h->sei.recovery_point.recovery_frame_cnt) &
- ((1 << h->ps.sps->log2_max_frame_num) - 1);
- }
-
- h->cur_pic_ptr->f->key_frame |=
- (nal->type == H264_NAL_IDR_SLICE) || (h->sei.recovery_point.recovery_frame_cnt >= 0);
-
- if (nal->type == H264_NAL_IDR_SLICE || h->recovery_frame == h->poc.frame_num) {
- h->recovery_frame = -1;
- h->cur_pic_ptr->recovered = 1;
- }
- // If we have an IDR, all frames after it in decoded order are
- // "recovered".
- if (nal->type == H264_NAL_IDR_SLICE)
- h->frame_recovered |= FRAME_RECOVERED_IDR;
- h->cur_pic_ptr->recovered |= !!(h->frame_recovered & FRAME_RECOVERED_IDR);
-
if (h->current_slice == 1) {
if (!(avctx->flags2 & AV_CODEC_FLAG2_CHUNKS))
decode_postinit(h, i >= nals_needed);
More information about the ffmpeg-cvslog
mailing list