From 6b0c3fa7139d5bb3cc18ce4f2018b6f39a1c9901 Mon Sep 17 00:00:00 2001 From: michael Date: Thu, 16 Apr 2009 04:46:44 +0000 Subject: [PATCH] Support broken avc nal encapsulation. Fixes issue987. git-svn-id: file:///var/local/repositories/ffmpeg/trunk@18533 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b --- libavcodec/h264.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libavcodec/h264.c b/libavcodec/h264.c index e0250a99d..b45a249f5 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -7461,6 +7461,7 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){ int buf_index=0; H264Context *hx; ///< thread context int context_count = 0; + int next_avc= h->is_avc ? 0 : buf_size; h->max_contexts = avctx->thread_count; #if 0 @@ -7484,7 +7485,7 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){ int i, nalsize = 0; int err; - if(h->is_avc) { + if(buf_index >= next_avc) { if(buf_index >= buf_size) break; nalsize = 0; for(i = 0; i < h->nal_length_size; i++) @@ -7498,6 +7499,7 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){ break; } } + next_avc= buf_index + nalsize; } else { // start code prefix search for(; buf_index + 3 < buf_size; buf_index++){ @@ -7513,7 +7515,7 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){ hx = h->thread_context[context_count]; - ptr= ff_h264_decode_nal(hx, buf + buf_index, &dst_length, &consumed, h->is_avc ? nalsize : buf_size - buf_index); + ptr= ff_h264_decode_nal(hx, buf + buf_index, &dst_length, &consumed, next_avc - buf_index); if (ptr==NULL || dst_length < 0){ return -1; } @@ -7525,13 +7527,12 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){ av_log(h->s.avctx, AV_LOG_DEBUG, "NAL %d at %d/%d length %d\n", hx->nal_unit_type, buf_index, buf_size, dst_length); } - if (h->is_avc && (nalsize != consumed)){ + if (h->is_avc && (nalsize != consumed) && nalsize){ int i, debug_level = AV_LOG_DEBUG; for (i = consumed; i < nalsize; i++) if (buf[buf_index+i]) debug_level = AV_LOG_ERROR; av_log(h->s.avctx, debug_level, "AVC: Consumed only %d bytes instead of %d\n", consumed, nalsize); - consumed= nalsize; } buf_index += consumed; -- 2.39.2