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)