Mercurial > libavcodec.hg
changeset 6351:b568fe642948 libavcodec
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
author | superdump |
---|---|
date | Wed, 13 Feb 2008 14:20:22 +0000 |
parents | 8e63d869a904 |
children | a14abb3d08aa |
files | liba52.c |
diffstat | 1 files changed, 15 insertions(+), 47 deletions(-) [+] |
line wrap: on
line diff
--- a/liba52.c Wed Feb 13 09:26:10 2008 +0000 +++ b/liba52.c Wed Feb 13 14:20:22 2008 +0000 @@ -37,9 +37,6 @@ * 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 @@ #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 @@ 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 @@ *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 @@ 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 @@ 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)