diff src/aac/libfaad2/syntax.c @ 691:e6c5fdae6e88 trunk

[svn] - oh yes, commit mplayer patches as well
author nenolod
date Tue, 20 Feb 2007 06:38:03 -0800
parents 1d8b08df98c3
children f1b6f1b2cdb3
line wrap: on
line diff
--- a/src/aac/libfaad2/syntax.c	Tue Feb 20 06:31:29 2007 -0800
+++ b/src/aac/libfaad2/syntax.c	Tue Feb 20 06:38:03 2007 -0800
@@ -1,6 +1,6 @@
 /*
 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
-** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com
+** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com
 **  
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -19,15 +19,10 @@
 ** Any non-GPL usage of this software or parts of this software is strictly
 ** forbidden.
 **
-** Software using this code must display the following message visibly in or
-** on each copy of the software:
-** "FAAD2 AAC/HE-AAC/HE-AACv2/DRM decoder (c) Nero AG, www.nero.com"
-** in, for example, the about-box or help/startup screen.
+** Commercial non-GPL licensing of this software is possible.
+** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** Commercial non-GPL licensing of this software is possible.
-** For more info contact Nero AG through Mpeg4AAClicense@nero.com.
-**
-** $Id: syntax.c,v 1.87 2006/08/15 19:22:15 menno Exp $
+** $Id: syntax.c,v 1.82 2004/09/04 14:56:29 menno Exp $
 **/
 
 /*
@@ -98,11 +93,9 @@
 static void adts_error_check(adts_header *adts, bitfile *ld);
 static uint8_t dynamic_range_info(bitfile *ld, drc_info *drc);
 static uint8_t excluded_channels(bitfile *ld, drc_info *drc);
-static uint8_t side_info(NeAACDecHandle hDecoder, element *ele,
-                         bitfile *ld, ic_stream *ics, uint8_t scal_flag);
-#ifdef DRM
-static int8_t DRM_aac_scalable_main_header(NeAACDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2,
-                                           bitfile *ld, uint8_t this_layer_stereo);
+#ifdef SCALABLE_DEC
+static int8_t aac_scalable_main_header(NeAACDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2,
+                                       bitfile *ld, uint8_t this_layer_stereo);
 #endif
 
 
@@ -420,7 +413,6 @@
                     bitfile *ld, program_config *pce, drc_info *drc)
 {
     uint8_t id_syn_ele;
-    uint8_t ele_this_frame = 0;
 
     hDecoder->fr_channels = 0;
     hDecoder->fr_ch_ele = 0;
@@ -437,55 +429,36 @@
         {
             switch (id_syn_ele) {
             case ID_SCE:
-                ele_this_frame++;
                 if (hDecoder->first_syn_ele == 25) hDecoder->first_syn_ele = id_syn_ele;
                 decode_sce_lfe(hDecoder, hInfo, ld, id_syn_ele);
                 if (hInfo->error > 0)
                     return;
                 break;
             case ID_CPE:
-                ele_this_frame++;
                 if (hDecoder->first_syn_ele == 25) hDecoder->first_syn_ele = id_syn_ele;
                 decode_cpe(hDecoder, hInfo, ld, id_syn_ele);
                 if (hInfo->error > 0)
                     return;
                 break;
             case ID_LFE:
-#ifdef DRM
-                hInfo->error = 32;
-#else
-                ele_this_frame++;
                 hDecoder->has_lfe++;
                 decode_sce_lfe(hDecoder, hInfo, ld, id_syn_ele);
-#endif
                 if (hInfo->error > 0)
                     return;
                 break;
             case ID_CCE: /* not implemented yet, but skip the bits */
-#ifdef DRM
-                hInfo->error = 32;
-#else
-                ele_this_frame++;
 #ifdef COUPLING_DEC
                 hInfo->error = coupling_channel_element(hDecoder, ld);
 #else
                 hInfo->error = 6;
 #endif
-#endif
                 if (hInfo->error > 0)
                     return;
                 break;
             case ID_DSE:
-                ele_this_frame++;
                 data_stream_element(hDecoder, ld);
                 break;
             case ID_PCE:
-                if (ele_this_frame != 0)
-                {
-                    hInfo->error = 31;
-                    return;
-                }
-                ele_this_frame++;
                 /* 14496-4: 5.6.4.1.2.1.3: */
                 /* program_configuration_element()'s in access units shall be ignored */
                 program_config_element(pce, ld);
@@ -494,7 +467,6 @@
                 //hDecoder->pce_set = 1;
                 break;
             case ID_FIL:
-                ele_this_frame++;
                 /* one sbr_info describes a channel_element not a channel! */
                 /* if we encounter SBR data here: error */
                 /* SBR data will be read directly in the SCE/LFE/CPE element */
@@ -605,10 +577,6 @@
     if (retval > 0)
         return retval;
 
-    /* IS not allowed in single channel */
-    if (ics->is_used)
-        return 32;
-
 #ifdef SBR_DEC
     /* check if next bitstream element is a fill element */
     /* if so, read it now so SBR decoding can be done in case of a file with SBR */
@@ -659,11 +627,6 @@
 
         ics1->ms_mask_present = (uint8_t)faad_getbits(ld, 2
             DEBUGVAR(1,41,"channel_pair_element(): ms_mask_present"));
-        if (ics1->ms_mask_present == 3)
-        {
-            /* bitstream error */
-            return 32;
-        }
         if (ics1->ms_mask_present == 1)
         {
             uint8_t g, sfb;
@@ -767,23 +730,14 @@
                         uint8_t common_window)
 {
     uint8_t retval = 0;
-    uint8_t ics_reserved_bit;
 
-    ics_reserved_bit = faad_get1bit(ld
+    /* ics->ics_reserved_bit = */ faad_get1bit(ld
         DEBUGVAR(1,43,"ics_info(): ics_reserved_bit"));
-    if (ics_reserved_bit != 0)
-        return 32;
     ics->window_sequence = (uint8_t)faad_getbits(ld, 2
         DEBUGVAR(1,44,"ics_info(): window_sequence"));
     ics->window_shape = faad_get1bit(ld
         DEBUGVAR(1,45,"ics_info(): window_shape"));
 
-#ifdef LD_DEC
-    /* No block switching in LD */
-    if ((hDecoder->object_type == LD) && (ics->window_sequence != ONLY_LONG_SEQUENCE))
-        return 32;
-#endif
-
     if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
     {
         ics->max_sfb = (uint8_t)faad_getbits(ld, 4
@@ -799,7 +753,6 @@
     if ((retval = window_grouping_info(hDecoder, ics)) > 0)
         return retval;
 
-
     /* should be an error */
     /* check the range of max_sfb */
     if (ics->max_sfb > ics->num_swb)
@@ -969,10 +922,6 @@
         return result;
     }
 
-    /* IS not allowed in single channel */
-    if (ics->is_used)
-        return 32;
-
     for (c = 1; c < num_gain_element_lists; c++)
     {
         uint8_t cge;
@@ -1080,8 +1029,7 @@
             hDecoder->sbr_present_flag = 1;
 
             /* parse the SBR data */
-            hDecoder->sbr[sbr_ele]->ret = sbr_extension_data(ld, hDecoder->sbr[sbr_ele], count,
-                hDecoder->postSeekResetFlag);
+            hDecoder->sbr[sbr_ele]->ret = sbr_extension_data(ld, hDecoder->sbr[sbr_ele], count);
 
 #if 0
             if (hDecoder->sbr[sbr_ele]->ret > 0)
@@ -1101,14 +1049,10 @@
 #endif
         } else {
 #endif
-#ifndef DRM
             while (count > 0)
             {
                 count -= extension_payload(ld, drc, count);
             }
-#else
-            return 30;
-#endif
 #ifdef SBR_DEC
         }
 #endif
@@ -1213,10 +1157,10 @@
 }
 #endif
 
-#ifdef DRM
+#ifdef SCALABLE_DEC
 /* Table 4.4.13 ASME */
-void DRM_aac_scalable_main_element(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo,
-                                   bitfile *ld, program_config *pce, drc_info *drc)
+void aac_scalable_main_element(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo,
+                               bitfile *ld, program_config *pce, drc_info *drc)
 {
     uint8_t retval = 0;
     uint8_t channels = hDecoder->fr_channels = 0;
@@ -1231,7 +1175,7 @@
 
     hDecoder->fr_ch_ele = 0;
 
-    hInfo->error = DRM_aac_scalable_main_header(hDecoder, ics1, ics2, ld, this_layer_stereo);
+    hInfo->error = aac_scalable_main_header(hDecoder, ics1, ics2, ld, this_layer_stereo);
     if (hInfo->error > 0)
         return;
 
@@ -1245,77 +1189,22 @@
         hDecoder->element_id[0] = ID_SCE;
     }
 
-    if (this_layer_stereo)
+    for (ch = 0; ch < (this_layer_stereo ? 2 : 1); ch++)
     {
-        cpe.channel        = 0;
-        cpe.paired_channel = 1;
-    }
-
-
-    /* Stereo2 / Mono1 */
-    ics1->tns_data_present = faad_get1bit(ld);
+        ic_stream *ics;
+        if (ch == 0)
+        {
+            ics = ics1;
+            spec_data = spec_data1;
+        } else {
+            ics = ics2;
+            spec_data = spec_data2;
+        }
 
-#if defined(LTP_DEC)
-    ics1->ltp.data_present = faad_get1bit(ld);
-#elif defined (DRM)
-    if(faad_get1bit(ld)) {
-         hInfo->error = 26;
-         return;
-    }
-#else
-    faad_get1bit(ld);
-#endif    
-
-    hInfo->error = side_info(hDecoder, &cpe, ld, ics1, 1);
-    if (hInfo->error > 0)
-        return;
-    if (this_layer_stereo)
-    {
-        /* Stereo3 */
-        ics2->tns_data_present = faad_get1bit(ld);
-#ifdef LTP_DEC
-        ics1->ltp.data_present =
-#endif
-            faad_get1bit(ld);
-        hInfo->error = side_info(hDecoder, &cpe, ld, ics2, 1);
+        hInfo->error = individual_channel_stream(hDecoder, &cpe, ld, ics, 1, spec_data);
         if (hInfo->error > 0)
             return;
     }
-    /* Stereo4 / Mono2 */
-    if (ics1->tns_data_present)
-        tns_data(ics1, &(ics1->tns), ld);
-    if (this_layer_stereo)
-    {
-        /* Stereo5 */
-        if (ics2->tns_data_present)
-            tns_data(ics2, &(ics2->tns), ld);
-    }
-
-#ifdef DRM
-    /* CRC check */
-    if (hDecoder->object_type == DRM_ER_LC)
-    {
-        if ((hInfo->error = (uint8_t)faad_check_CRC(ld, (uint16_t)faad_get_processed_bits(ld) - 8)) > 0)
-            return;
-    }
-#endif
-
-    /* Stereo6 / Mono3 */
-    /* error resilient spectral data decoding */
-    if ((hInfo->error = reordered_spectral_data(hDecoder, ics1, ld, spec_data1)) > 0)
-    {
-        return;
-    }
-    if (this_layer_stereo)
-    {
-        /* Stereo7 */
-        /* error resilient spectral data decoding */
-        if ((hInfo->error = reordered_spectral_data(hDecoder, ics2, ld, spec_data2)) > 0)
-        {
-            return;
-        }
-    }
-
 
 #ifdef DRM
 #ifdef SBR_DEC
@@ -1355,7 +1244,6 @@
 
         /* Set SBR data */
         /* consider 8 bits from AAC-CRC */
-        /* SBR buffer size is original buffer size minus AAC buffer size */
         count = (uint16_t)bit2byte(buffer_size*8 - bitsconsumed);
         faad_initbits(&ld_sbr, revbuffer, count);
 
@@ -1364,7 +1252,7 @@
 
         faad_getbits(&ld_sbr, 8); /* Skip 8-bit CRC */
 
-        hDecoder->sbr[0]->ret = sbr_extension_data(&ld_sbr, hDecoder->sbr[0], count, hDecoder->postSeekResetFlag);
+        hDecoder->sbr[0]->ret = sbr_extension_data(&ld_sbr, hDecoder->sbr[0], count);
 #if (defined(PS_DEC) || defined(DRM_PS))
         if (hDecoder->sbr[0]->ps_used)
         {
@@ -1373,11 +1261,6 @@
         }
 #endif
 
-        if (ld_sbr.error)
-        {
-            hDecoder->sbr[0]->ret = 1;
-        }
-
         /* check CRC */
         /* no need to check it if there was already an error */
         if (hDecoder->sbr[0]->ret == 0)
@@ -1386,7 +1269,7 @@
         /* SBR data was corrupted, disable it until the next header */
         if (hDecoder->sbr[0]->ret != 0)
         {
-            hDecoder->sbr[0]->header_count = 0;
+            hDecoder->sbr[0]->header_count = 0;  
         }
 
         faad_endbits(&ld_sbr);
@@ -1425,18 +1308,15 @@
 }
 
 /* Table 4.4.15 */
-static int8_t DRM_aac_scalable_main_header(NeAACDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2,
-                                           bitfile *ld, uint8_t this_layer_stereo)
+static int8_t aac_scalable_main_header(NeAACDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2,
+                                       bitfile *ld, uint8_t this_layer_stereo)
 {
     uint8_t retval = 0;
     uint8_t ch;
     ic_stream *ics;
-    uint8_t ics_reserved_bit;
 
-    ics_reserved_bit = faad_get1bit(ld
+    /* ics1->ics_reserved_bit = */ faad_get1bit(ld
         DEBUGVAR(1,300,"aac_scalable_main_header(): ics_reserved_bits"));
-    if (ics_reserved_bit != 0)
-        return 32;
     ics1->window_sequence = (uint8_t)faad_getbits(ld, 2
         DEBUGVAR(1,301,"aac_scalable_main_header(): window_sequence"));
     ics1->window_shape = faad_get1bit(ld
@@ -1466,11 +1346,6 @@
     {
         ics1->ms_mask_present = (uint8_t)faad_getbits(ld, 2
             DEBUGVAR(1,306,"aac_scalable_main_header(): ms_mask_present"));
-        if (ics1->ms_mask_present == 3)
-        {
-            /* bitstream error */
-            return 32;
-        }
         if (ics1->ms_mask_present == 1)
         {
             uint8_t g, sfb;
@@ -1489,12 +1364,70 @@
         ics1->ms_mask_present = 0;
     }
 
+    if (0)
+    {
+        faad_get1bit(ld
+            DEBUGVAR(1,308,"aac_scalable_main_header(): tns_channel_mono_layer"));
+    }
+
+    for (ch = 0; ch < (this_layer_stereo ? 2 : 1); ch++)
+    {
+        if (ch == 0)
+            ics = ics1;
+        else
+            ics = ics2;
+
+        if ( 1 /*!tvq_layer_pesent || (tns_aac_tvq_en[ch] == 1)*/)
+        {
+            if ((ics->tns_data_present = faad_get1bit(ld
+                DEBUGVAR(1,309,"aac_scalable_main_header(): tns_data_present"))) & 1)
+            {
+#ifdef DRM
+                /* different order of data units in DRM */
+                if (hDecoder->object_type != DRM_ER_LC)
+#endif
+                {
+                    tns_data(ics, &(ics->tns), ld);
+                }
+            }
+        }
+#if 0
+        if (0 /*core_flag || tvq_layer_pesent*/)
+        {
+            if ((ch==0) || ((ch==1) && (core_stereo || tvq_stereo))
+                diff_control_data();
+            if (mono_stereo_flag)
+                diff_control_data_lr();
+        } else {
+#endif
+            if ((
+#ifdef LTP_DEC
+                ics->ltp.data_present =
+#endif
+                faad_get1bit(ld DEBUGVAR(1,310,"aac_scalable_main_header(): ltp.data_present"))) & 1)
+            {
+#ifdef LTP_DEC
+                if ((retval = ltp_data(hDecoder, ics, &(ics->ltp), ld)) > 0)
+                {
+                    return retval;
+                }
+#else
+                return 26;
+#endif
+            }
+#if 0
+        }
+#endif
+    }
+
     return 0;
 }
 #endif
 
-static uint8_t side_info(NeAACDecHandle hDecoder, element *ele,
-                         bitfile *ld, ic_stream *ics, uint8_t scal_flag)
+/* Table 4.4.24 */
+static uint8_t individual_channel_stream(NeAACDecHandle hDecoder, element *ele,
+                                         bitfile *ld, ic_stream *ics, uint8_t scal_flag,
+                                         int16_t *spec_data)
 {
     uint8_t result;
 
@@ -1580,21 +1513,6 @@
         if ((result = rvlc_decode_scale_factors(ics, ld)) > 0)
             return result;
     }
-#endif
-
-    return 0;
-}
-
-/* Table 4.4.24 */
-static uint8_t individual_channel_stream(NeAACDecHandle hDecoder, element *ele,
-                                         bitfile *ld, ic_stream *ics, uint8_t scal_flag,
-                                         int16_t *spec_data)
-{
-    uint8_t result;
-
-    result = side_info(hDecoder, ele, ld, ics, scal_flag);
-    if (result > 0)
-        return result;
 
     if (hDecoder->object_type >= ER_OBJECT_START) 
     {
@@ -1605,13 +1523,10 @@
 #ifdef DRM
     /* CRC check */
     if (hDecoder->object_type == DRM_ER_LC)
-    {
         if ((result = (uint8_t)faad_check_CRC(ld, (uint16_t)faad_get_processed_bits(ld) - 8)) > 0)
             return result;
-    }
 #endif
 
-#ifdef ERROR_RESILIENCE
     if (hDecoder->aacSpectralDataResilienceFlag)
     {
         /* error resilient spectral data decoding */
@@ -1679,7 +1594,7 @@
 
             /* if "faad_getbits" detects error and returns "0", "k" is never
                incremented and we cannot leave the while loop */
-            if (ld->error != 0)
+            if ((ld->error != 0) || (ld->no_more_reading))
                 return 14;
 
 #ifdef ERROR_RESILIENCE
@@ -1690,23 +1605,12 @@
             ics->sect_cb[g][i] = (uint8_t)faad_getbits(ld, sect_cb_bits
                 DEBUGVAR(1,71,"section_data(): sect_cb"));
 
-            if (ics->sect_cb[g][i] == 12)
-                return 32;
-
 #if 0
             printf("%d\n", ics->sect_cb[g][i]);
 #endif
 
-#ifndef DRM
             if (ics->sect_cb[g][i] == NOISE_HCB)
                 ics->noise_used = 1;
-#else
-            /* PNS not allowed in DRM */
-            if (ics->sect_cb[g][i] == NOISE_HCB)
-                return 29;
-#endif
-            if (ics->sect_cb[g][i] == INTENSITY_HCB2 || ics->sect_cb[g][i] == INTENSITY_HCB)
-                ics->is_used = 1;
 
 #ifdef ERROR_RESILIENCE
             if (hDecoder->aacSectionDataResilienceFlag)
@@ -1747,18 +1651,10 @@
             printf("%d\n", ics->sect_end[g][i]);
 #endif
 
-            if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
-            {
-                if (k + sect_len > 8*15)
-                    return 15;
-                if (i >= 8*15)
-                    return 15;
-            } else {
-                if (k + sect_len > MAX_SFB)
-                    return 15;
-                if (i >= MAX_SFB)
-                    return 15;
-            }
+            if (k + sect_len >= 8*15)
+                return 15;
+            if (i >= 8*15)
+                return 15;
 
             for (sfb = k; sfb < k + sect_len; sfb++)
             {
@@ -1779,13 +1675,6 @@
             i++;
         }
         ics->num_sec[g] = i;
-
-        /* the sum of all sect_len_incr elements for a given window
-         * group shall equal max_sfb */
-        if (k != ics->max_sfb)
-        {
-            return 32;
-        }
 #if 0
         printf("%d\n", ics->num_sec[g]);
 #endif
@@ -1846,7 +1735,6 @@
                 break;
             case NOISE_HCB: /* noise books */
 
-#ifndef DRM
                 /* decode noise energy */
                 if (noise_pcm_flag)
                 {
@@ -1862,10 +1750,6 @@
 #ifdef SF_PRINT
                 printf("%d\n", ics->scale_factors[g][sfb]);
 #endif
-#else
-                /* PNS not allowed in DRM */
-                return 29;
-#endif
 
                 break;
             default: /* spectral books */
@@ -2243,7 +2127,7 @@
         n++;
         drc->num_bands += band_incr;
 
-        for (i = 0; i < drc->num_bands; i++)
+        for (i = 0; i < drc->num_bands; i++);
         {
             drc->band_top[i] = (uint8_t)faad_getbits(ld, 8
                 DEBUGVAR(1,97,"dynamic_range_info(): band_top"));