diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index c2490cbd45..c6f40e59c5 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -1738,6 +1738,10 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl, if (ret < 0) return ret; + // discard redundant pictures + if (sl->redundant_pic_count > 0) + return 0; + if (sl->first_mb_addr == 0 || !h->current_slice) { if (h->setup_finished) { av_log(h->avctx, AV_LOG_ERROR, "Too many fields\n"); diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c index 977977431e..c72a7fcc16 100644 --- a/libavcodec/h264dec.c +++ b/libavcodec/h264dec.c @@ -799,6 +799,9 @@ again: if ((err = ff_h264_decode_slice_header(h, sl, nal))) break; + if (sl->redundant_pic_count > 0) + break; + if (h->sei.recovery_point.recovery_frame_cnt >= 0) { const int sei_recovery_frame_cnt = h->sei.recovery_point.recovery_frame_cnt; @@ -845,7 +848,6 @@ again: #endif } - if (sl->redundant_pic_count == 0) { if (avctx->hwaccel) { ret = avctx->hwaccel->decode_slice(avctx, nal->raw_data, @@ -864,7 +866,6 @@ again: #endif } else context_count++; - } break; case H264_NAL_DPA: case H264_NAL_DPB: