From 9d252137e502c5de20b10206f84f30917d6ebab8 Mon Sep 17 00:00:00 2001 From: Baptiste Coudurier Date: Tue, 23 Nov 2010 01:16:37 +0000 Subject: In h264 decoder, fix decoding when nal end sequence is present Originally committed as revision 25809 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/h264.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'libavcodec/h264.c') diff --git a/libavcodec/h264.c b/libavcodec/h264.c index f99f7ea6ad..9198d7cb50 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -2783,14 +2783,9 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){ nalsize = 0; for(i = 0; i < h->nal_length_size; i++) nalsize = (nalsize << 8) | buf[buf_index++]; - if(nalsize <= 1 || nalsize > buf_size - buf_index){ - if(nalsize == 1){ - buf_index++; - continue; - }else{ - av_log(h->s.avctx, AV_LOG_ERROR, "AVC: nal size %d\n", nalsize); - break; - } + if(nalsize <= 0 || nalsize > buf_size - buf_index){ + av_log(h->s.avctx, AV_LOG_ERROR, "AVC: nal size %d\n", nalsize); + break; } next_avc= buf_index + nalsize; } else { @@ -2990,6 +2985,7 @@ static int decode_frame(AVCodecContext *avctx, s->flags2= avctx->flags2; /* end of stream, output what is still in the buffers */ + out: if (buf_size == 0) { Picture *out; int i, out_idx; @@ -3018,6 +3014,11 @@ static int decode_frame(AVCodecContext *avctx, if(buf_index < 0) return -1; + if (!s->current_picture_ptr && h->nal_unit_type == NAL_END_SEQUENCE) { + buf_size = 0; + goto out; + } + if(!(s->flags2 & CODEC_FLAG2_CHUNKS) && !s->current_picture_ptr){ if (avctx->skip_frame >= AVDISCARD_NONREF || s->hurry_up) return 0; av_log(avctx, AV_LOG_ERROR, "no frame!\n"); -- cgit v1.2.3