summaryrefslogtreecommitdiff
path: root/libavcodec/h264dec.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2017-01-23 22:33:27 +0100
committerMichael Niedermayer <michael@niedermayer.cc>2017-01-24 12:13:59 +0100
commit25f4f08ba5b4d928f8b02ca388e1aa8d37d8e24e (patch)
treec9a1b09bffd0cc8df88f8a8a778bcab9afb60d9a /libavcodec/h264dec.c
parent08e5732318a46fd1fe9a406ff829838483dc1358 (diff)
downloadffmpeg-25f4f08ba5b4d928f8b02ca388e1aa8d37d8e24e.tar.gz
avcodec/h264dec: Fix regression with "make fate-h264-attachment-631 THREADS=8"
This treats the case of no slices like no frames which it basically is. The field is added to the context as other nal related fields are also there and passing the has_slices field per *arguments is ugly and not consistent Found-by: ubitux Approved-by: ubitux Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavcodec/h264dec.c')
-rw-r--r--libavcodec/h264dec.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c
index 4ecaec267c..41e6ce458c 100644
--- a/libavcodec/h264dec.c
+++ b/libavcodec/h264dec.c
@@ -607,6 +607,7 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size)
int idr_cleared=0;
int i, ret = 0;
+ h->has_slice = 0;
h->nal_unit_type= 0;
h->max_contexts = h->nb_slice_ctx;
@@ -672,6 +673,7 @@ again:
h->has_recovery_point = 1;
case H264_NAL_SLICE:
sl->gb = nal->gb;
+ h->has_slice = 1;
if ((err = ff_h264_decode_slice_header(h, sl, nal)))
break;
@@ -839,7 +841,7 @@ end:
}
#endif /* CONFIG_ERROR_RESILIENCE */
/* clean up */
- if (h->cur_pic_ptr && !h->droppable) {
+ if (h->cur_pic_ptr && !h->droppable && h->has_slice) {
ff_thread_report_progress(&h->cur_pic_ptr->tf, INT_MAX,
h->picture_structure == PICT_BOTTOM_FIELD);
}
@@ -1055,7 +1057,7 @@ static int h264_decode_frame(AVCodecContext *avctx, void *data,
return send_next_delayed_frame(h, pict, got_frame, buf_index);
}
- if (!(avctx->flags2 & AV_CODEC_FLAG2_CHUNKS) && !h->cur_pic_ptr) {
+ if (!(avctx->flags2 & AV_CODEC_FLAG2_CHUNKS) && (!h->cur_pic_ptr || !h->has_slice)) {
if (avctx->skip_frame >= AVDISCARD_NONREF ||
buf_size >= 4 && !memcmp("Q264", buf, 4))
return buf_size;