summaryrefslogtreecommitdiff
path: root/libavcodec/h264.c
diff options
context:
space:
mode:
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>2010-11-23 01:16:37 +0000
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>2010-11-23 01:16:37 +0000
commit9d252137e502c5de20b10206f84f30917d6ebab8 (patch)
tree42f7e84a07f9b5513d56111ba4f00a9b491260b7 /libavcodec/h264.c
parent8ee764b02062c85972d207a0bbbf1a0f164f5b24 (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.c17
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");