From 95e5323510aa9526b7771d20deadc80c19f215eb Mon Sep 17 00:00:00 2001 From: Thorsten Jordan Date: Wed, 13 Feb 2008 14:20:22 +0000 Subject: [PATCH] Remove useless buffering of input data, so that avcodec_decode_audio never returns 0 for a valid frame Patch by Thorsten Jordan (tjordan atay macrosystem otday de) [FFmpeg-devel] Behaviour of liba52 decoder Originally committed as revision 11926 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/liba52.c | 62 +++++++++++++---------------------------------------- 1 file changed, 15 insertions(+), 47 deletions(-) diff --git a/libavcodec/liba52.c b/libavcodec/liba52.c index f366a3f5b1..81dcf6aef0 100644 --- a/libavcodec/liba52.c +++ b/libavcodec/liba52.c @@ -37,9 +37,6 @@ static const char* liba52name = "liba52.so.0"; * released under the GPL license. */ typedef struct AC3DecodeState { - uint8_t inbuf[4096]; /* input buffer */ - uint8_t *inbuf_ptr; - int frame_size; int flags; int channels; a52_state_t* state; @@ -114,8 +111,6 @@ static int a52_decode_init(AVCodecContext *avctx) #endif s->state = s->a52_init(0); /* later use CPU flags */ s->samples = s->a52_samples(s->state); - s->inbuf_ptr = s->inbuf; - s->frame_size = 0; /* allow downmixing to stereo or mono */ if (avctx->channels > 0 && avctx->request_channels > 0 && @@ -150,7 +145,6 @@ static int a52_decode_frame(AVCodecContext *avctx, uint8_t *buf, int buf_size) { AC3DecodeState *s = avctx->priv_data; - uint8_t *buf_ptr; int flags, i, len; int sample_rate, bit_rate; short *out_samples = data; @@ -161,26 +155,19 @@ static int a52_decode_frame(AVCodecContext *avctx, *data_size= 0; - buf_ptr = buf; - while (buf_size > 0) { - len = s->inbuf_ptr - s->inbuf; - if (s->frame_size == 0) { - /* no header seen : find one. We need at least 7 bytes to parse it */ - len = HEADER_SIZE - len; - if (len > buf_size) - len = buf_size; - memcpy(s->inbuf_ptr, buf_ptr, len); - buf_ptr += len; - s->inbuf_ptr += len; - buf_size -= len; - if ((s->inbuf_ptr - s->inbuf) == HEADER_SIZE) { - len = s->a52_syncinfo(s->inbuf, &s->flags, &sample_rate, &bit_rate); + if (buf_size < HEADER_SIZE) { + av_log(avctx, AV_LOG_ERROR, "Error decoding frame, not enough bytes for header\n"); + return -1; + } + len = s->a52_syncinfo(buf, &s->flags, &sample_rate, &bit_rate); if (len == 0) { - /* no sync found : move by one byte (inefficient, but simple!) */ - memcpy(s->inbuf, s->inbuf + 1, HEADER_SIZE - 1); - s->inbuf_ptr--; - } else { - s->frame_size = len; + av_log(avctx, AV_LOG_ERROR, "Error decoding frame, no sync byte at begin\n"); + return -1; + } + if (buf_size < len) { + av_log(avctx, AV_LOG_ERROR, "Error decoding frame, not enough bytes\n"); + return -1; + } /* update codec info */ avctx->sample_rate = sample_rate; s->channels = ac3_channels[s->flags & 7]; @@ -194,18 +181,6 @@ static int a52_decode_frame(AVCodecContext *avctx, avctx->channels = s->channels; } avctx->bit_rate = bit_rate; - } - } - } else if (len < s->frame_size) { - len = s->frame_size - len; - if (len > buf_size) - len = buf_size; - - memcpy(s->inbuf_ptr, buf_ptr, len); - buf_ptr += len; - s->inbuf_ptr += len; - buf_size -= len; - } else { flags = s->flags; if (avctx->channels == 1) flags = A52_MONO; @@ -214,25 +189,18 @@ static int a52_decode_frame(AVCodecContext *avctx, else flags |= A52_ADJUST_LEVEL; level = 1; - if (s->a52_frame(s->state, s->inbuf, &flags, &level, 384)) { + if (s->a52_frame(s->state, buf, &flags, &level, 384)) { fail: av_log(avctx, AV_LOG_ERROR, "Error decoding frame\n"); - s->inbuf_ptr = s->inbuf; - s->frame_size = 0; - continue; + return -1; } for (i = 0; i < 6; i++) { if (s->a52_block(s->state)) goto fail; float_to_int(s->samples, out_samples + i * 256 * avctx->channels, avctx->channels); } - s->inbuf_ptr = s->inbuf; - s->frame_size = 0; *data_size = 6 * avctx->channels * 256 * sizeof(int16_t); - break; - } - } - return buf_ptr - buf; + return len; } static int a52_decode_end(AVCodecContext *avctx) -- 2.11.0