Commit 7eae8cd8 authored by Michael Niedermayer's avatar Michael Niedermayer

avcodec/h264: fix frame skip code

Fixes Ticket3475
Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 9025072e
...@@ -1617,14 +1617,7 @@ again: ...@@ -1617,14 +1617,7 @@ again:
ff_vdpau_h264_picture_start(h); ff_vdpau_h264_picture_start(h);
} }
if (hx->redundant_pic_count == 0 && if (hx->redundant_pic_count == 0) {
(avctx->skip_frame < AVDISCARD_NONREF ||
hx->nal_ref_idc) &&
(avctx->skip_frame < AVDISCARD_BIDIR ||
hx->slice_type_nos != AV_PICTURE_TYPE_B) &&
(avctx->skip_frame < AVDISCARD_NONINTRA ||
hx->slice_type_nos == AV_PICTURE_TYPE_I) &&
avctx->skip_frame < AVDISCARD_ALL) {
if (avctx->hwaccel) { if (avctx->hwaccel) {
ret = avctx->hwaccel->decode_slice(avctx, ret = avctx->hwaccel->decode_slice(avctx,
&buf[buf_index - consumed], &buf[buf_index - consumed],
...@@ -1655,7 +1648,7 @@ again: ...@@ -1655,7 +1648,7 @@ again:
hx->intra_gb_ptr = hx->intra_gb_ptr =
hx->inter_gb_ptr = NULL; hx->inter_gb_ptr = NULL;
if ((err = ff_h264_decode_slice_header(hx, h)) < 0) { if ((err = ff_h264_decode_slice_header(hx, h))) {
/* make sure data_partitioning is cleared if it was set /* make sure data_partitioning is cleared if it was set
* before, so we don't try decoding a slice without a valid * before, so we don't try decoding a slice without a valid
* slice header later */ * slice header later */
...@@ -1730,7 +1723,8 @@ again: ...@@ -1730,7 +1723,8 @@ again:
context_count = 0; context_count = 0;
} }
if (err < 0) { if (err < 0 || err == SLICE_SKIPED) {
if (err < 0)
av_log(h->avctx, AV_LOG_ERROR, "decode_slice_header error\n"); av_log(h->avctx, AV_LOG_ERROR, "decode_slice_header error\n");
h->ref_count[0] = h->ref_count[1] = h->list_count = 0; h->ref_count[0] = h->ref_count[1] = h->list_count = 0;
} else if (err == 1) { } else if (err == 1) {
......
...@@ -1098,6 +1098,8 @@ int ff_pred_weight_table(H264Context *h); ...@@ -1098,6 +1098,8 @@ int ff_pred_weight_table(H264Context *h);
int ff_set_ref_count(H264Context *h); int ff_set_ref_count(H264Context *h);
int ff_h264_decode_slice_header(H264Context *h, H264Context *h0); int ff_h264_decode_slice_header(H264Context *h, H264Context *h0);
#define SLICE_SKIPED 2
int ff_h264_execute_decode_slices(H264Context *h, unsigned context_count); int ff_h264_execute_decode_slices(H264Context *h, unsigned context_count);
int ff_h264_update_thread_context(AVCodecContext *dst, int ff_h264_update_thread_context(AVCodecContext *dst,
const AVCodecContext *src); const AVCodecContext *src);
......
...@@ -1321,6 +1321,15 @@ int ff_h264_decode_slice_header(H264Context *h, H264Context *h0) ...@@ -1321,6 +1321,15 @@ int ff_h264_decode_slice_header(H264Context *h, H264Context *h0)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
if (
(h->avctx->skip_frame >= AVDISCARD_NONREF && !h->nal_ref_idc) ||
(h->avctx->skip_frame >= AVDISCARD_BIDIR && h->slice_type_nos == AV_PICTURE_TYPE_B) ||
(h->avctx->skip_frame >= AVDISCARD_NONINTRA && h->slice_type_nos != AV_PICTURE_TYPE_I) ||
(h->avctx->skip_frame >= AVDISCARD_NONKEY && h->nal_unit_type != NAL_IDR_SLICE) ||
h->avctx->skip_frame >= AVDISCARD_ALL) {
return SLICE_SKIPED;
}
// to make a few old functions happy, it's wrong though // to make a few old functions happy, it's wrong though
h->pict_type = h->slice_type; h->pict_type = h->slice_type;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment