diff options
author | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2010-11-23 04:16:37 +0300 |
---|---|---|
committer | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2010-11-23 04:16:37 +0300 |
commit | 9d252137e502c5de20b10206f84f30917d6ebab8 (patch) | |
tree | 42f7e84a07f9b5513d56111ba4f00a9b491260b7 /libavcodec/h264.c | |
parent | 8ee764b02062c85972d207a0bbbf1a0f164f5b24 (diff) |
In h264 decoder, fix decoding when nal end sequence is present
Originally committed as revision 25809 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/h264.c')
-rw-r--r-- | libavcodec/h264.c | 17 |
1 files changed, 9 insertions, 8 deletions
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"); |