diff --git a/libavcodec/h264.c b/libavcodec/h264.c index dd70af32e1..942ba7f20a 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -1781,6 +1781,8 @@ static int output_frame(H264Context *h, AVFrame *dst, H264Picture *srcp) av_dict_set(&dst->metadata, "stereo_mode", ff_h264_sei_stereo_mode(h), 0); + if (srcp->sei_recovery_frame_cnt == 0) + dst->key_frame = 1; if (!srcp->crop) return 0; diff --git a/libavcodec/h264.h b/libavcodec/h264.h index 70539bbd58..76f111ba78 100644 --- a/libavcodec/h264.h +++ b/libavcodec/h264.h @@ -324,6 +324,7 @@ typedef struct H264Picture { int reference; int recovered; ///< picture at IDR or recovery point + recovery count int invalid_gap; + int sei_recovery_frame_cnt; int crop; int crop_left; diff --git a/libavcodec/h264_picture.c b/libavcodec/h264_picture.c index 36028dc45a..61ff862a7a 100644 --- a/libavcodec/h264_picture.c +++ b/libavcodec/h264_picture.c @@ -122,6 +122,7 @@ int ff_h264_ref_picture(H264Context *h, H264Picture *dst, H264Picture *src) dst->crop_top = src->crop_top; dst->recovered = src->recovered; dst->invalid_gap = src->invalid_gap; + dst->sei_recovery_frame_cnt = src->sei_recovery_frame_cnt; return 0; fail: diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index 65e8c73b52..c70814f0c3 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -744,6 +744,7 @@ static int h264_frame_start(H264Context *h) pic->mmco_reset = 0; pic->recovered = 0; pic->invalid_gap = 0; + pic->sei_recovery_frame_cnt = h->sei_recovery_frame_cnt; if ((ret = alloc_picture(h, pic)) < 0) return ret;