changeset 3097:41fb9bda307d libavcodec

decode adts aac streams
author mru
date Wed, 08 Feb 2006 00:30:58 +0000
parents 966b3f321af0
children eb3d3988aff2
files faad.c
diffstat 1 files changed, 26 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/faad.c	Tue Feb 07 16:10:48 2006 +0000
+++ b/faad.c	Wed Feb 08 00:30:58 2006 +0000
@@ -49,9 +49,8 @@
 typedef struct {
     void* handle;               /* dlopen handle */
     void* faac_handle;          /* FAAD library handle */
-    int frame_size;
     int sample_size;
-    int flags;
+    int init;
 
     /* faad calls */
     faacDecHandle FAADAPI (*faacDecOpen)(void);
@@ -111,17 +110,20 @@
 #endif
     int r = 0;
 
-    if (avctx->extradata)
+    if (avctx->extradata){
         r = s->faacDecInit2(s->faac_handle, (uint8_t*) avctx->extradata,
                             avctx->extradata_size,
                             &samplerate, &channels);
-    // else r = s->faacDecInit(s->faac_handle ... );
-
-    if (r < 0)
-        av_log(avctx, AV_LOG_ERROR, "faacDecInit2 failed r:%d   sr:%ld  ch:%ld  s:%d\n",
-                r, samplerate, (long)channels, avctx->extradata_size);
-    avctx->sample_rate = samplerate;
-    avctx->channels = channels;
+        if (r < 0){
+            av_log(avctx, AV_LOG_ERROR,
+                   "faacDecInit2 failed r:%d   sr:%ld  ch:%ld  s:%d\n",
+                   r, samplerate, (long)channels, avctx->extradata_size);
+        } else {
+            avctx->sample_rate = samplerate;
+            avctx->channels = channels;
+            s->init = 1;
+        }
+    }
 
     return r;
 }
@@ -155,6 +157,20 @@
         ? buf_size : (int)bytesconsumed;
 #else
 
+    if(!s->init){
+        unsigned long srate;
+        unsigned char channels;
+        int r = faacDecInit(s->faac_handle, buf, buf_size, &srate, &channels);
+        if(r < 0){
+            av_log(avctx, AV_LOG_ERROR, "faac: codec init failed: %s\n",
+                   s->faacDecGetErrorMessage(frame_info.error));
+            return 0;
+        }
+        avctx->sample_rate = srate;
+        avctx->channels = channels;
+        s->init = 1;
+    }
+
     out = s->faacDecDecode(s->faac_handle, &frame_info, (unsigned char*)buf, (unsigned long)buf_size);
 
     if (frame_info.error > 0) {