]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - aacdec.c
First version of the aac audio format handler that kinda works.
[paraslash.git] / aacdec.c
index 7ea7856fc899f3433e38acb52f5c4a82f25deb62..c41a5ac887e4ff6408e257d1423a74436cf5c491 100644 (file)
--- a/aacdec.c
+++ b/aacdec.c
@@ -106,7 +106,7 @@ static ssize_t mp4dec(char *inbuffer, size_t len, struct filter_node *fn)
        struct filter_chain_info *fci = fn->fci;
        unsigned long rate = 0;
        unsigned char channels = 0;
-       int i, ret, nbytes;
+       int i, ret, nbytes, skip;
        unsigned char *p, *outbuffer;
 
        if (fn->loaded > fn->bufsize * 4 / 5)
@@ -118,21 +118,22 @@ static ssize_t mp4dec(char *inbuffer, size_t len, struct filter_node *fn)
        padd->inbuf_len = len;
 
        if (!padd->initialized) {
-               int skip;
                padd->decoder_length = aac_find_esds(padd->inbuf, padd->inbuf_len,
                        &skip);
+               PARA_INFO_LOG("decoder len: %d\n", padd->decoder_length);
                if (padd->decoder_length < 0) {
                        ret = NeAACDecInit(padd->decoder, padd->inbuf,
                                padd->inbuf_len, &rate, &channels);
+                       PARA_INFO_LOG("decoder init: %d\n", ret);
                        if (ret < 0) {
-                               ret = E_AACDEC_INIT;
+                               ret = -E_AACDEC_INIT;
                                goto out;
                        }
                        padd->consumed = ret;
                } else {
                        padd->consumed += skip;
                        p = padd->inbuf + padd->consumed;
-                       ret = E_AACDEC_INIT;
+                       ret = -E_AACDEC_INIT;
                        if (NeAACDecInit2(padd->decoder, p,
                                        padd->decoder_length, &rate,
                                        &channels) < 0)
@@ -140,16 +141,22 @@ static ssize_t mp4dec(char *inbuffer, size_t len, struct filter_node *fn)
                }
                fci->samplerate = rate;
                fci->channels = channels;
-               PARA_INFO_LOG("rate: %u, channels: %d\n", fci->samplerate,
-                       fci->channels);
+               PARA_INFO_LOG("rate: %u, channels: %d\n",
+                       fci->samplerate, fci->channels);
                padd->initialized = 1;
        }
        if (padd->decoder_length > 0) {
                padd->consumed = 0;
                if (!padd->offset_pos) {
-                       ret = len;
-                       if (find_stco(padd) < 0)
+                       ret = aac_find_stco(padd->inbuf + padd->consumed,
+                               padd->inbuf_len - padd->consumed, &skip);
+                       if (ret < 0) {
+                               ret = len;
                                goto out;
+                       }
+                       padd->noffsets = ret;
+                       padd->offset = para_malloc(padd->noffsets * sizeof(int));
+                       padd->consumed += skip;
                }
                if (padd->offset_pos < padd->noffsets) {
                        fill_offset_table(padd);