From 58640fe89ec4f2a3d67c0a2585fca8de34440857 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Fri, 20 May 2016 12:42:23 +0200 Subject: [PATCH] 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. --- 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 491039626e..2b7e0885db 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 38ecc9477f..a148825d1e 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);