[mythtv] Best way to submit code?

Jean-Yves Avenard jyavenard at gmail.com
Sun Mar 9 01:04:09 UTC 2008


Hi

On Sat, Mar 8, 2008 at 4:45 PM, Mark Spieth <mark at digivation.com.au> wrote:
>  send me the patch to that file and Ill double check it. not that its used
>  anyway these days
>

Not sure it will help as this must work against the latest revision of
ffmpeg ...

>svn diff liba52.c
Index: liba52.c
===================================================================
--- liba52.c	(revision 16422)
+++ liba52.c	(working copy)
@@ -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,9 +111,14 @@
 #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 &&
+            avctx->request_channels < avctx->channels &&
+            avctx->request_channels <= 2) {
+        avctx->channels = avctx->request_channels;
+    }
+
     return 0;
 }

@@ -318,7 +320,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;
@@ -329,90 +330,52 @@

     *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];
                     if (s->flags & A52_LFE)
                         s->channels++;
-                    if (avctx->request_channels > 0)
-                    {
-                        avctx->channels = s->channels;
-                        if (s->channels > avctx->channels)
+    if (avctx->request_channels > 0 &&
+        avctx->request_channels <= 2 &&
+        avctx->request_channels < s->channels) {
                             avctx->channels = avctx->request_channels;
-                    }
-                    if (avctx->channels == 0)
-                        /* No specific number of channel requested */
+    } else {
                         avctx->channels = s->channels;
-                    else if (s->channels < avctx->channels) {
-                        av_log(avctx, AV_LOG_ERROR, "ac3dec: AC3
Source channels are less than specified: output to %d channels..
(frmsize: %d)\n", s->channels, len);
-                        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 {
-            int chans;
             flags = s->flags;
             if (avctx->channels == 1)
                 flags = A52_MONO;
-            else if (avctx->channels == 2) {
-                if (s->channels>2)
-                    flags = A52_DOLBY;
-                else
+    else if (avctx->channels == 2)
                     flags = A52_STEREO;
-            }
             else
                 flags |= A52_ADJUST_LEVEL;
             level = 1;
-            chans = channels_multi(flags);
-            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;
                 float2s16_multi(s->samples, out_samples + i * 256 *
chans, flags);
             }
-            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)


More information about the mythtv-dev mailing list