Home | History | Annotate | Download | only in src
      1 
      2 /* -----------------------------------------------------------------------------------------------------------
      3 Software License for The Fraunhofer FDK AAC Codec Library for Android
      4 
      5  Copyright  1995 - 2012 Fraunhofer-Gesellschaft zur Frderung der angewandten Forschung e.V.
      6   All rights reserved.
      7 
      8  1.    INTRODUCTION
      9 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
     10 the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
     11 This FDK AAC Codec software is intended to be used on a wide variety of Android devices.
     12 
     13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
     14 audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
     15 independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
     16 of the MPEG specifications.
     17 
     18 Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
     19 may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
     20 individually for the purpose of encoding or decoding bit streams in products that are compliant with
     21 the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
     22 these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
     23 software may already be covered under those patent licenses when it is used for those licensed purposes only.
     24 
     25 Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
     26 are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
     27 applications information and documentation.
     28 
     29 2.    COPYRIGHT LICENSE
     30 
     31 Redistribution and use in source and binary forms, with or without modification, are permitted without
     32 payment of copyright license fees provided that you satisfy the following conditions:
     33 
     34 You must retain the complete text of this software license in redistributions of the FDK AAC Codec or
     35 your modifications thereto in source code form.
     36 
     37 You must retain the complete text of this software license in the documentation and/or other materials
     38 provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
     39 You must make available free of charge copies of the complete source code of the FDK AAC Codec and your
     40 modifications thereto to recipients of copies in binary form.
     41 
     42 The name of Fraunhofer may not be used to endorse or promote products derived from this library without
     43 prior written permission.
     44 
     45 You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
     46 software or your modifications thereto.
     47 
     48 Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
     49 and the date of any change. For modified versions of the FDK AAC Codec, the term
     50 "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
     51 "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
     52 
     53 3.    NO PATENT LICENSE
     54 
     55 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
     56 ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
     57 respect to this software.
     58 
     59 You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
     60 by appropriate patent licenses.
     61 
     62 4.    DISCLAIMER
     63 
     64 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
     65 "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
     66 of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
     67 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
     68 including but not limited to procurement of substitute goods or services; loss of use, data, or profits,
     69 or business interruption, however caused and on any theory of liability, whether in contract, strict
     70 liability, or tort (including negligence), arising in any way out of the use of this software, even if
     71 advised of the possibility of such damage.
     72 
     73 5.    CONTACT INFORMATION
     74 
     75 Fraunhofer Institute for Integrated Circuits IIS
     76 Attention: Audio and Multimedia Departments - FDK AAC LL
     77 Am Wolfsmantel 33
     78 91058 Erlangen, Germany
     79 
     80 www.iis.fraunhofer.de/amm
     81 amm-info (at) iis.fraunhofer.de
     82 ----------------------------------------------------------------------------------------------------------- */
     83 
     84 /*****************************  MPEG-4 AAC Decoder  **************************
     85 
     86    Author(s):   Josef Hoepfl
     87    Description:
     88 
     89 ******************************************************************************/
     90 
     91 
     92 /*!
     93   \page default General Overview of the AAC Decoder Implementation
     94 
     95   The main entry point to decode a AAC frame is CAacDecoder_DecodeFrame(). It handles the different
     96   transport multiplexes and bitstream formats supported by this implementation. It extracts the
     97   AAC_raw_data_blocks from these bitstreams to further process then in the actual decoding stages.
     98 
     99   Note: Click on a function of file in the above image to see details about the function. Also note, that
    100   this is just an overview of the most important functions and not a complete call graph.
    101 
    102   <h2>1 Bitstream deformatter</h2>
    103   The basic bit stream parser function CChannelElement_Read() is called. It uses other subcalls in order
    104   to parse and unpack the bitstreams. Note, that this includes huffmann decoding of the coded spectral data.
    105   This operation can be computational significant specifically at higher bitrates. Optimization is likely in
    106   CBlock_ReadSpectralData().
    107 
    108   The bitstream deformatter also includes many bitfield operations. Profiling on the target will determine
    109   required optimizations.
    110 
    111   <h2>2 Actual decoding to retain the time domain output</h2>
    112   The basic bitstream deformatter function CChannelElement_Decode() for CPE elements and SCE elements are called.
    113   Except for the stereo processing (2.1) which is only used for CPE elements, the function calls for CPE or SCE
    114   are similar, except that CPE always processes to independent channels while SCE only processes one channel.
    115 
    116   Often there is the distinction between long blocks and short blocks. However, computational expensive functions
    117   that ususally require optimization are being shared by these two groups,
    118 
    119   <h3>2.1 Stereo processing for CPE elements</h3>
    120   CChannelPairElement_Decode() first calles the joint stereo  tools in stereo.cpp when required.
    121 
    122   <h3>2.2 Scaling of spectral data</h3>
    123   CBlock_ScaleSpectralData().
    124 
    125   <h3>2.3 Apply additional coding tools</h3>
    126   ApplyTools() calles the PNS tools in case of MPEG-4 bitstreams, and TNS filtering CTns_Apply() for MPEG-2 and MPEG-4 bitstreams.
    127   The function TnsFilterIIR() which is called by CTns_Apply() (2.3.1) might require some optimization.
    128 
    129   <h2>3 Frequency-To-Time conversion</h3>
    130   The filterbank is called using CBlock_FrequencyToTime() using the MDCT module from the FDK Tools
    131 
    132 */
    133 
    134 
    135 
    136 #include "aacdecoder.h"
    137 
    138 #include "aac_rom.h"
    139 #include "aac_ram.h"
    140 #include "channel.h"
    141 #include "FDK_audio.h"
    142 
    143 #include "FDK_tools_rom.h"
    144 
    145   #include "aacdec_pns.h"
    146 
    147   #include "sbrdecoder.h"
    148 
    149 
    150 
    151 
    152   #include "aacdec_hcr.h"
    153   #include "rvlc.h"
    154 
    155 
    156 #include "tpdec_lib.h"
    157 
    158 #include "conceal.h"
    159 
    160 
    161 
    162 #define CAN_DO_PS(aot) \
    163   ((aot) == AOT_AAC_LC \
    164 || (aot) == AOT_SBR \
    165 || (aot) == AOT_PS \
    166 || (aot) == AOT_ER_BSAC \
    167 || (aot) == AOT_DRM_AAC)
    168 
    169 #define IS_USAC(aot) \
    170   ((aot) == AOT_USAC \
    171 || (aot) == AOT_RSVD50)
    172 
    173 #define IS_LOWDELAY(aot) \
    174   ((aot) == AOT_ER_AAC_LD \
    175 || (aot) == AOT_ER_AAC_ELD)
    176 
    177 void CAacDecoder_SyncQmfMode(HANDLE_AACDECODER self)
    178 {
    179 
    180   /* Assign user requested mode */
    181   self->qmfModeCurr = self->qmfModeUser;
    182 
    183   if ( self->qmfModeCurr == NOT_DEFINED )
    184   {
    185     if ( (IS_LOWDELAY(self->streamInfo.aot) && (self->flags & AC_MPS_PRESENT))
    186       || ( (self->ascChannels == 1)
    187         && ( (CAN_DO_PS(self->streamInfo.aot) && !(self->flags & AC_MPS_PRESENT))
    188           || (  IS_USAC(self->streamInfo.aot) &&  (self->flags & AC_MPS_PRESENT)) ) ) )
    189     {
    190       self->qmfModeCurr = MODE_HQ;
    191     } else {
    192       self->qmfModeCurr = MODE_LP;
    193     }
    194   }
    195 
    196 
    197   /* Set SBR to current QMF mode. Error does not matter. */
    198   sbrDecoder_SetParam(self->hSbrDecoder, SBR_QMF_MODE, (self->qmfModeCurr == MODE_LP));
    199   self->psPossible = ((CAN_DO_PS(self->streamInfo.aot) && self->aacChannels == 1 && ! (self->flags & AC_MPS_PRESENT))) && self->qmfModeCurr == MODE_HQ ;
    200   FDK_ASSERT( ! ( (self->flags & AC_MPS_PRESENT) && self->psPossible ) );
    201 }
    202 
    203 void CAacDecoder_SignalInterruption(HANDLE_AACDECODER self)
    204 {
    205 }
    206 
    207 /*!
    208   \brief Reset ancillary data struct. Call before parsing a new frame.
    209 
    210   \ancData Pointer to ancillary data structure
    211 
    212   \return  Error code
    213 */
    214 static AAC_DECODER_ERROR CAacDecoder_AncDataReset(CAncData *ancData)
    215 {
    216   int i;
    217   for (i=0; i<8; i++)
    218   {
    219     ancData->offset[i] = 0;
    220   }
    221   ancData->nrElements = 0;
    222 
    223   return AAC_DEC_OK;
    224 }
    225 
    226 /*!
    227   \brief Initialize ancillary buffer
    228 
    229   \ancData Pointer to ancillary data structure
    230   \buffer Pointer to (external) anc data buffer
    231   \size Size of the buffer pointed on by buffer in bytes
    232 
    233   \return  Error code
    234 */
    235 AAC_DECODER_ERROR CAacDecoder_AncDataInit(CAncData *ancData, unsigned char *buffer, int size)
    236 {
    237   if (size >= 0) {
    238     ancData->buffer = buffer;
    239     ancData->bufferSize = size;
    240 
    241     CAacDecoder_AncDataReset(ancData);
    242 
    243     return AAC_DEC_OK;
    244   }
    245 
    246   return AAC_DEC_ANC_DATA_ERROR;
    247 }
    248 
    249 /*!
    250   \brief Get one ancillary data element
    251 
    252   \ancData Pointer to ancillary data structure
    253   \index Index of the anc data element to get
    254   \ptr Pointer to a buffer receiving a pointer to the requested anc data element
    255   \size Pointer to a buffer receiving the length of the requested anc data element in bytes
    256 
    257   \return  Error code
    258 */
    259 AAC_DECODER_ERROR CAacDecoder_AncDataGet(CAncData *ancData, int index, unsigned char **ptr, int *size)
    260 {
    261   AAC_DECODER_ERROR error = AAC_DEC_OK;
    262 
    263   *ptr  = NULL;
    264   *size = 0;
    265 
    266   if (index >= 0 && index < 8 && index < ancData->nrElements)
    267   {
    268     *ptr  = &ancData->buffer[ancData->offset[index]];
    269     *size = ancData->offset[index+1] - ancData->offset[index];
    270   }
    271 
    272   return error;
    273 }
    274 
    275 
    276 /*!
    277   \brief Parse ancillary data
    278 
    279   \ancData Pointer to ancillary data structure
    280   \hBs Handle to FDK bitstream
    281   \ancBytes Length of ancillary data to read from the bitstream
    282 
    283   \return  Error code
    284 */
    285 static
    286 AAC_DECODER_ERROR CAacDecoder_AncDataParse (
    287                                              CAncData *ancData,
    288                                              HANDLE_FDK_BITSTREAM hBs,
    289                                              const int ancBytes )
    290 {
    291   AAC_DECODER_ERROR error = AAC_DEC_OK;
    292   int readBytes = 0;
    293 
    294   if (ancData->buffer != NULL)
    295   {
    296     if (ancBytes > 0) {
    297       /* write ancillary data to external buffer */
    298       int offset = ancData->offset[ancData->nrElements];
    299 
    300       if ((offset + ancBytes) > ancData->bufferSize)
    301       {
    302         error = AAC_DEC_TOO_SMALL_ANC_BUFFER;
    303       }
    304       else if (ancData->nrElements >= 8-1)
    305       {
    306         error = AAC_DEC_TOO_MANY_ANC_ELEMENTS;
    307       }
    308       else
    309       {
    310         int i;
    311 
    312         for (i = 0; i < ancBytes; i++) {
    313           ancData->buffer[i+offset] = FDKreadBits(hBs, 8);
    314           readBytes++;
    315         }
    316 
    317         ancData->nrElements++;
    318         ancData->offset[ancData->nrElements] = ancBytes + ancData->offset[ancData->nrElements-1];
    319       }
    320     }
    321   }
    322 
    323   readBytes = ancBytes - readBytes;
    324 
    325   if (readBytes > 0) {
    326     /* skip data */
    327     FDKpushFor(hBs, readBytes<<3);
    328   }
    329 
    330   return error;
    331 }
    332 
    333 /*!
    334   \brief Read Stream Data Element
    335 
    336   \bs Bitstream Handle
    337 
    338   \return  Error code
    339 */
    340 static AAC_DECODER_ERROR CDataStreamElement_Read (
    341                                                   HANDLE_FDK_BITSTREAM bs,
    342                                                   CAncData *ancData,
    343                                                   HANDLE_AAC_DRC hDrcInfo,
    344                                                   HANDLE_TRANSPORTDEC pTp,
    345                                                   UCHAR    *elementInstanceTag,
    346                                                   UINT      alignmentAnchor )
    347 {
    348   AAC_DECODER_ERROR error = AAC_DEC_OK;
    349   UINT dataStart;
    350   int dataByteAlignFlag, count;
    351 
    352   int crcReg = transportDec_CrcStartReg(pTp, 0);
    353 
    354   /* Element Instance Tag */
    355   *elementInstanceTag = FDKreadBits(bs,4);
    356   /* Data Byte Align Flag */
    357   dataByteAlignFlag = FDKreadBits(bs,1);
    358 
    359   count = FDKreadBits(bs,8);
    360 
    361   if (count == 255) {
    362     count += FDKreadBits(bs,8); /* EscCount */
    363   }
    364 
    365   if (dataByteAlignFlag) {
    366     FDKbyteAlign(bs, alignmentAnchor);
    367   }
    368 
    369   dataStart = FDKgetValidBits(bs);
    370 
    371   error = CAacDecoder_AncDataParse(ancData, bs, count);
    372   transportDec_CrcEndReg(pTp, crcReg);
    373 
    374   {
    375     INT readBits, dataBits = count<<3;
    376 
    377     /* Move to the beginning of the data junk */
    378     FDKpushBack(bs, dataStart-FDKgetValidBits(bs));
    379 
    380     /* Read Anc data if available */
    381     readBits = aacDecoder_drcMarkPayload( hDrcInfo, bs, DVB_DRC_ANC_DATA );
    382 
    383     if (readBits != dataBits) {
    384       /* Move to the end again. */
    385       FDKpushBiDirectional(bs, FDKgetValidBits(bs)-dataStart+dataBits);
    386     }
    387   }
    388 
    389   return error;
    390 }
    391 
    392 #ifdef TP_PCE_ENABLE
    393 /*!
    394   \brief Read Program Config Element
    395 
    396   \bs Bitstream Handle
    397   \count Pointer to program config element.
    398 
    399   \return  Error code
    400 */
    401 static AAC_DECODER_ERROR CProgramConfigElement_Read (
    402     HANDLE_FDK_BITSTREAM bs,
    403     HANDLE_TRANSPORTDEC  pTp,
    404     CProgramConfig      *pce,
    405     UINT                 channelConfig,
    406     UINT                 alignAnchor )
    407 {
    408   AAC_DECODER_ERROR error = AAC_DEC_OK;
    409   int crcReg;
    410 
    411   /* read PCE to temporal buffer first */
    412   C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1);
    413 
    414   CProgramConfig_Init(tmpPce);
    415   CProgramConfig_Reset(tmpPce);
    416 
    417   crcReg = transportDec_CrcStartReg(pTp, 0);
    418 
    419   CProgramConfig_Read(tmpPce, bs, alignAnchor);
    420 
    421   transportDec_CrcEndReg(pTp, crcReg);
    422 
    423   if (  CProgramConfig_IsValid(tmpPce)
    424     && ( (channelConfig == 6 && (tmpPce->NumChannels == 6))
    425       || (channelConfig == 5 && (tmpPce->NumChannels == 5))
    426       || (channelConfig == 0 && (tmpPce->NumChannels == pce->NumChannels)) )
    427     && (tmpPce->NumFrontChannelElements == 2)
    428     && (tmpPce->NumSideChannelElements  == 0)
    429     && (tmpPce->NumBackChannelElements  == 1)
    430     && (tmpPce->Profile == 1) )
    431   { /* Copy the complete PCE including metadata. */
    432     FDKmemcpy(pce, tmpPce, sizeof(CProgramConfig));
    433   }
    434 
    435   C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1);
    436 
    437   return error;
    438 }
    439 #endif
    440 
    441 /*!
    442   \brief Parse Extension Payload
    443 
    444   \self Handle of AAC decoder
    445   \count Pointer to bit counter.
    446   \previous_element ID of previous element (required by some extension payloads)
    447 
    448   \return  Error code
    449 */
    450 static
    451 AAC_DECODER_ERROR CAacDecoder_ExtPayloadParse (HANDLE_AACDECODER self,
    452                                                HANDLE_FDK_BITSTREAM hBs,
    453                                                int *count,
    454                                                MP4_ELEMENT_ID previous_element,
    455                                                int elIndex,
    456                                                int fIsFillElement)
    457 {
    458   AAC_DECODER_ERROR error = AAC_DEC_OK;
    459   EXT_PAYLOAD_TYPE extension_type;
    460   int bytes = (*count) >> 3;
    461   int crcFlag = 0;
    462 
    463   if (*count < 4) {
    464     return AAC_DEC_PARSE_ERROR;
    465   } else if ((INT)FDKgetValidBits(hBs) < *count) {
    466     return AAC_DEC_DECODE_FRAME_ERROR;
    467   }
    468 
    469   extension_type = (EXT_PAYLOAD_TYPE) FDKreadBits(hBs, 4);    /* bs_extension_type */
    470   *count -= 4;
    471 
    472   switch (extension_type)
    473   {
    474   case EXT_DYNAMIC_RANGE:
    475     {
    476       INT readBits = aacDecoder_drcMarkPayload( self->hDrcInfo, hBs, MPEG_DRC_EXT_DATA );
    477 
    478       if (readBits > *count)
    479       { /* Read too much. Something went wrong! */
    480         error = AAC_DEC_PARSE_ERROR;
    481       }
    482       *count -= readBits;
    483     }
    484     break;
    485 
    486 
    487   case EXT_SBR_DATA_CRC:
    488     crcFlag = 1;
    489   case EXT_SBR_DATA:
    490     if (IS_CHANNEL_ELEMENT(previous_element)) {
    491       SBR_ERROR sbrError;
    492 
    493       CAacDecoder_SyncQmfMode(self);
    494 
    495       sbrError = sbrDecoder_InitElement(
    496               self->hSbrDecoder,
    497               self->streamInfo.aacSampleRate,
    498               self->streamInfo.extSamplingRate,
    499               self->streamInfo.aacSamplesPerFrame,
    500               self->streamInfo.aot,
    501               previous_element,
    502               elIndex
    503               );
    504 
    505       if (sbrError == SBRDEC_OK) {
    506         sbrError = sbrDecoder_Parse (
    507                 self->hSbrDecoder,
    508                 hBs,
    509                 count,
    510                *count,
    511                 crcFlag,
    512                 previous_element,
    513                 elIndex,
    514                 self->flags & AC_INDEP );
    515         /* Enable SBR for implicit SBR signalling. */
    516         if (sbrError == SBRDEC_OK) {
    517           self->sbrEnabled = 1;
    518         }
    519       } else {
    520         /* Do not try to apply SBR because initializing the element failed. */
    521         self->sbrEnabled = 0;
    522       }
    523       /* Citation from ISO/IEC 14496-3 chapter 4.5.2.1.5.2
    524       Fill elements containing an extension_payload() with an extension_type of EXT_SBR_DATA
    525       or EXT_SBR_DATA_CRC shall not contain any other extension_payload of any other extension_type.
    526       */
    527       if (fIsFillElement) {
    528         FDKpushBiDirectional(hBs, *count);
    529         *count = 0;
    530       } else {
    531         /* If this is not a fill element with a known length, we are screwed an no further parsing makes sense. */
    532         if (sbrError != SBRDEC_OK) {
    533           self->frameOK = 0;
    534         }
    535       }
    536     } else {
    537       error = AAC_DEC_PARSE_ERROR;
    538     }
    539     break;
    540 
    541   case EXT_FILL_DATA:
    542     {
    543       int temp;
    544 
    545       temp = FDKreadBits(hBs,4);
    546       bytes--;
    547       if (temp != 0) {
    548         error = AAC_DEC_PARSE_ERROR;
    549         break;
    550       }
    551       while (bytes > 0) {
    552         temp = FDKreadBits(hBs,8);
    553         bytes--;
    554         if (temp != 0xa5) {
    555           error = AAC_DEC_PARSE_ERROR;
    556           break;
    557         }
    558       }
    559       *count = bytes<<3;
    560     }
    561     break;
    562 
    563   case EXT_DATA_ELEMENT:
    564     {
    565       int dataElementVersion;
    566 
    567       dataElementVersion = FDKreadBits(hBs,4);
    568       *count -= 4;
    569       if (dataElementVersion == 0) /* ANC_DATA */
    570       {
    571         int temp, dataElementLength = 0;
    572         do {
    573           temp = FDKreadBits(hBs,8);
    574           *count -= 8;
    575           dataElementLength += temp;
    576         } while (temp == 255 );
    577 
    578         CAacDecoder_AncDataParse(&self->ancData, hBs, dataElementLength);
    579         *count -= (dataElementLength<<3);
    580       } else {
    581         /* align = 0 */
    582         error = AAC_DEC_PARSE_ERROR;
    583         goto bail;
    584       }
    585     }
    586     break;
    587 
    588   case EXT_DATA_LENGTH:
    589     if ( !fIsFillElement          /* Makes no sens to have an additional length in a fill ...   */
    590       && (self->flags & AC_ER) )  /* ... element because this extension payload type was ...    */
    591     {                             /* ... created to circumvent the missing length in ER-Syntax. */
    592       int bitCnt, len = FDKreadBits(hBs, 4);
    593       *count -= 4;
    594 
    595       if (len == 15) {
    596         int add_len = FDKreadBits(hBs, 8);
    597         *count -= 8;
    598         len += add_len;
    599 
    600         if (add_len == 255) {
    601           len += FDKreadBits(hBs, 16);
    602           *count -= 16;
    603         }
    604       }
    605       len <<= 3;
    606       bitCnt = len;
    607 
    608       if ( (EXT_PAYLOAD_TYPE)FDKreadBits(hBs, 4) == EXT_DATA_LENGTH ) {
    609         /* Check NOTE 2: The extension_payload() included here must
    610                          not have extension_type == EXT_DATA_LENGTH. */
    611         error = AAC_DEC_PARSE_ERROR;
    612         goto bail;
    613       }
    614       else {
    615         /* rewind and call myself again. */
    616         FDKpushBack(hBs, 4);
    617 
    618         error =
    619           CAacDecoder_ExtPayloadParse (
    620                   self,
    621                   hBs,
    622                  &bitCnt,
    623                   previous_element,
    624                   elIndex,
    625                   1 );      /* Treat same as fill element */
    626 
    627         *count -= len - bitCnt;
    628       }
    629       /* Note: the fall through in case the if statement above is not taken is intentional. */
    630       break;
    631     }
    632 
    633   case EXT_FIL:
    634 
    635   default:
    636     /* align = 4 */
    637     FDKpushFor(hBs, *count);
    638     *count = 0;
    639     break;
    640   }
    641 
    642 bail:
    643   if ( (error != AAC_DEC_OK)
    644     && fIsFillElement )
    645   { /* Skip the remaining extension bytes */
    646     FDKpushBiDirectional(hBs, *count);
    647     *count = 0;
    648     /* Patch error code because decoding can go on. */
    649     error = AAC_DEC_OK;
    650     /* Be sure that parsing errors have been stored. */
    651   }
    652   return error;
    653 }
    654 
    655 /*  Stream Configuration and Information.
    656 
    657     This class holds configuration and information data for a stream to be decoded. It
    658     provides the calling application as well as the decoder with substantial information,
    659     e.g. profile, sampling rate, number of channels found in the bitstream etc.
    660 */
    661 static
    662 void CStreamInfoInit(CStreamInfo *pStreamInfo)
    663 {
    664   pStreamInfo->aacSampleRate = 0;
    665   pStreamInfo->profile = -1;
    666   pStreamInfo->aot = AOT_NONE;
    667 
    668   pStreamInfo->channelConfig = -1;
    669   pStreamInfo->bitRate = 0;
    670   pStreamInfo->aacSamplesPerFrame = 0;
    671 
    672   pStreamInfo->extAot  = AOT_NONE;
    673   pStreamInfo->extSamplingRate = 0;
    674 
    675   pStreamInfo->flags = 0;
    676 
    677   pStreamInfo->epConfig = -1;   /* default is no ER */
    678 
    679   pStreamInfo->numChannels = 0;
    680   pStreamInfo->sampleRate = 0;
    681   pStreamInfo->frameSize = 0;
    682 }
    683 
    684 /*!
    685   \brief Initialization of AacDecoderChannelInfo
    686 
    687   The function initializes the pointers to AacDecoderChannelInfo for each channel,
    688   set the start values for window shape and window sequence of overlap&add to zero,
    689   set the overlap buffer to zero and initializes the pointers to the window coefficients.
    690   \param bsFormat is the format of the AAC bitstream
    691 
    692   \return  AACDECODER instance
    693 */
    694 LINKSPEC_CPP HANDLE_AACDECODER CAacDecoder_Open(TRANSPORT_TYPE bsFormat)    /*!< bitstream format (adif,adts,loas,...). */
    695 {
    696   HANDLE_AACDECODER self;
    697 
    698   self = GetAacDecoder();
    699   if (self == NULL) {
    700     goto bail;
    701   }
    702 
    703   /* Assign channel mapping info arrays (doing so removes dependency of settings header in API header). */
    704   self->streamInfo.pChannelIndices = self->channelIndices;
    705   self->streamInfo.pChannelType = self->channelType;
    706 
    707   /* set default output mode */
    708   self->outputInterleaved = 1;  /* interleaved */
    709 
    710   /* initialize anc data */
    711   CAacDecoder_AncDataInit(&self->ancData, NULL, 0);
    712 
    713   /* initialize stream info */
    714   CStreamInfoInit(&self->streamInfo);
    715 
    716   /* initialize error concealment common data */
    717   CConcealment_InitCommonData(&self->concealCommonData);
    718 
    719   self->hDrcInfo = GetDrcInfo();
    720   if (self->hDrcInfo == NULL) {
    721     goto bail;
    722   }
    723   /* Init common DRC structure */
    724   aacDecoder_drcInit( self->hDrcInfo );
    725   /* Set default frame delay */
    726   aacDecoder_drcSetParam (
    727           self->hDrcInfo,
    728           DRC_BS_DELAY,
    729           CConcealment_GetDelay(&self->concealCommonData)
    730         );
    731 
    732 
    733   self->aacCommonData.workBufferCore1 = GetWorkBufferCore1();
    734   self->aacCommonData.workBufferCore2 = GetWorkBufferCore2();
    735   if (self->aacCommonData.workBufferCore1 == NULL
    736     ||self->aacCommonData.workBufferCore2 == NULL )
    737     goto bail;
    738 
    739   return self;
    740 
    741 bail:
    742   CAacDecoder_Close( self );
    743 
    744   return NULL;
    745 }
    746 
    747 /* Destroy aac decoder */
    748 LINKSPEC_CPP void CAacDecoder_Close(HANDLE_AACDECODER self)
    749 {
    750   int ch;
    751 
    752   if (self == NULL)
    753     return;
    754 
    755   for (ch=0; ch<(6); ch++) {
    756     if (self->pAacDecoderStaticChannelInfo[ch] != NULL) {
    757       FreeOverlapBuffer (&self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer);
    758       FreeAacDecoderStaticChannelInfo (&self->pAacDecoderStaticChannelInfo[ch]);
    759     }
    760     if (self->pAacDecoderChannelInfo[ch] != NULL) {
    761       FreeAacDecoderChannelInfo (&self->pAacDecoderChannelInfo[ch]);
    762     }
    763   }
    764 
    765   self->aacChannels = 0;
    766 
    767   if (self->hDrcInfo) {
    768     FreeDrcInfo(&self->hDrcInfo);
    769   }
    770 
    771   FreeWorkBufferCore1 (&self->aacCommonData.workBufferCore1);
    772   FreeWorkBufferCore2 (&self->aacCommonData.workBufferCore2);
    773 
    774   FreeAacDecoder ( &self);
    775 }
    776 
    777 
    778 /*!
    779   \brief Initialization of decoder instance
    780 
    781   The function initializes the decoder.
    782 
    783   \return  error status: 0 for success, <>0 for unsupported configurations
    784 */
    785 LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc)
    786 {
    787   AAC_DECODER_ERROR err = AAC_DEC_OK;
    788   INT ascChannels, ch, ascChanged = 0;
    789 
    790   if (!self)
    791     return AAC_DEC_INVALID_HANDLE;
    792 
    793   // set profile and check for supported aot
    794   // leave profile on default (=-1) for all other supported MPEG-4 aot's except aot=2 (=AAC-LC)
    795   switch (asc->m_aot) {
    796   case AOT_AAC_LC:
    797     self->streamInfo.profile = 1;
    798     break;
    799 
    800   case AOT_SBR:
    801   case AOT_PS:
    802   case AOT_ER_AAC_LD:
    803   case AOT_ER_AAC_ELD:
    804     break;
    805 
    806   default:
    807     return AAC_DEC_UNSUPPORTED_AOT;
    808   }
    809 
    810   CProgramConfig_Init(&self->pce);
    811 
    812   /* set channels */
    813   switch (asc->m_channelConfiguration) {
    814   case 0:
    815 #ifdef TP_PCE_ENABLE
    816     /* get channels from program config (ASC) */
    817     if (CProgramConfig_IsValid(&asc->m_progrConfigElement)) {
    818       ascChannels = asc->m_progrConfigElement.NumChannels;
    819       if (ascChannels > 0) {
    820         int el;
    821         /* valid number of channels -> copy program config element (PCE) from ASC */
    822         FDKmemcpy(&self->pce, &asc->m_progrConfigElement, sizeof(CProgramConfig));
    823         /* Built element table */
    824         el = CProgramConfig_GetElementTable(&asc->m_progrConfigElement, self->elements, 7);
    825         for (; el<7; el++) {
    826           self->elements[el] = ID_NONE;
    827         }
    828       } else {
    829         return AAC_DEC_UNSUPPORTED_CHANNELCONFIG;
    830       }
    831     } else {
    832       if (transportDec_GetFormat(self->hInput) == TT_MP4_ADTS) {
    833         /* set default max_channels for memory allocation because in implicit channel mapping mode
    834            we don't know the actual number of channels until we processed at least one raw_data_block(). */
    835         ascChannels = (6);
    836       } else {
    837         return AAC_DEC_UNSUPPORTED_CHANNELCONFIG;
    838       }
    839     }
    840 #else /* TP_PCE_ENABLE */
    841     return AAC_DEC_UNSUPPORTED_CHANNELCONFIG;
    842 #endif /* TP_PCE_ENABLE */
    843     break;
    844   case 1: case 2: case 3: case 4: case 5: case 6:
    845     ascChannels = asc->m_channelConfiguration;
    846     break;
    847   case 7:
    848     ascChannels = 8;
    849     break;
    850   default:
    851     return AAC_DEC_UNSUPPORTED_CHANNELCONFIG;
    852   }
    853 
    854   /* Initialize constant mappings for channel config 1-7 */
    855   if (asc->m_channelConfiguration > 0) {
    856     int el;
    857     FDKmemcpy(self->elements, elementsTab[asc->m_channelConfiguration-1], sizeof(MP4_ELEMENT_ID)*FDKmin(7,7));
    858     for (el=7; el<7; el++) {
    859       self->elements[el] = ID_NONE;
    860     }
    861     for (ch=0; ch<ascChannels; ch++) {
    862       self->chMapping[ch] = ch;
    863     }
    864     for (; ch<(6); ch++) {
    865       self->chMapping[ch] = 255;
    866     }
    867   }
    868 
    869   self->streamInfo.channelConfig = asc->m_channelConfiguration;
    870 
    871   if (ascChannels > (6)) {
    872     return AAC_DEC_UNSUPPORTED_CHANNELCONFIG;
    873   }
    874   if (self->streamInfo.aot != asc->m_aot) {
    875     self->streamInfo.aot = asc->m_aot;
    876     ascChanged = 1;
    877   }
    878 
    879   if (self->streamInfo.aacSamplesPerFrame != (INT)asc->m_samplesPerFrame) {
    880     self->streamInfo.aacSamplesPerFrame = asc->m_samplesPerFrame;
    881     ascChanged = 1;
    882   }
    883 
    884   self->streamInfo.bitRate            = 0;
    885 
    886   /* Set syntax flags */
    887   self->flags = 0;
    888 
    889   self->streamInfo.extAot               = asc->m_extensionAudioObjectType;
    890   self->streamInfo.extSamplingRate      = asc->m_extensionSamplingFrequency;
    891   self->flags |= (asc->m_sbrPresentFlag) ? AC_SBR_PRESENT : 0;
    892   self->flags |= (asc->m_psPresentFlag) ? AC_PS_PRESENT : 0;
    893   self->sbrEnabled = 0;
    894 
    895   /* --------- vcb11 ------------ */
    896   self->flags |= (asc->m_vcb11Flag) ? AC_ER_VCB11 : 0;
    897 
    898   /* ---------- rvlc ------------ */
    899   self->flags |= (asc->m_rvlcFlag) ? AC_ER_RVLC : 0;
    900 
    901   /* ----------- hcr ------------ */
    902   self->flags |= (asc->m_hcrFlag) ? AC_ER_HCR : 0;
    903 
    904   if (asc->m_aot == AOT_ER_AAC_ELD) {
    905     self->flags |=  AC_ELD;
    906     self->flags |= (asc->m_sc.m_eldSpecificConfig.m_sbrCrcFlag) ? AC_SBRCRC : 0;
    907     self->flags |= (asc->m_sc.m_eldSpecificConfig.m_useLdQmfTimeAlign) ? AC_LD_MPS : 0;
    908   }
    909   self->flags |= (asc->m_aot == AOT_ER_AAC_LD) ? AC_LD : 0;
    910   self->flags |= (asc->m_epConfig >= 0) ? AC_ER : 0;
    911 
    912 
    913   if (asc->m_sbrPresentFlag) {
    914     self->sbrEnabled = 1;
    915     self->sbrEnabledPrev = 1;
    916   }
    917   if (asc->m_psPresentFlag) {
    918     self->flags |= AC_PS_PRESENT;
    919   }
    920 
    921   if ( (asc->m_epConfig >= 0)
    922     && (asc->m_channelConfiguration <= 0) ) {
    923     /* we have to know the number of channels otherwise no decoding is possible */
    924     return AAC_DEC_UNSUPPORTED_ER_FORMAT;
    925   }
    926 
    927   self->streamInfo.epConfig = asc->m_epConfig;
    928   /* self->hInput->asc.m_epConfig = asc->m_epConfig; */
    929 
    930   if (asc->m_epConfig > 1)
    931     return AAC_DEC_UNSUPPORTED_ER_FORMAT;
    932 
    933   /* Check if samplerate changed. */
    934   if (self->streamInfo.aacSampleRate != (INT)asc->m_samplingFrequency) {
    935     AAC_DECODER_ERROR error;
    936 
    937     ascChanged = 1;
    938 
    939     /* Update samplerate info. */
    940     error = getSamplingRateInfo(&self->samplingRateInfo, asc->m_samplesPerFrame, asc->m_samplingFrequencyIndex, asc->m_samplingFrequency);
    941     if (error != AAC_DEC_OK) {
    942       return error;
    943     }
    944     self->streamInfo.aacSampleRate = self->samplingRateInfo.samplingRate;
    945   }
    946 
    947   /* Check if amount of channels has changed. */
    948   if (self->ascChannels != ascChannels)
    949   {
    950      ascChanged = 1;
    951 
    952      /* Allocate all memory structures for each channel */
    953      {
    954        for (ch = 0; ch < ascChannels; ch++) {
    955          CAacDecoderDynamicData *aacDecoderDynamicData = &self->aacCommonData.workBufferCore1->pAacDecoderDynamicData[ch%2];
    956 
    957          /* initialize pointer to CAacDecoderChannelInfo */
    958          if (self->pAacDecoderChannelInfo[ch] == NULL) {
    959            self->pAacDecoderChannelInfo[ch] = GetAacDecoderChannelInfo(ch);
    960            /* This is temporary until the DynamicData is split into two or more regions!
    961               The memory could be reused after completed core decoding. */
    962            if (self->pAacDecoderChannelInfo[ch] == NULL) {
    963              goto bail;
    964            }
    965            /* Hook shared work memory into channel data structure */
    966            self->pAacDecoderChannelInfo[ch]->pDynData =  aacDecoderDynamicData;
    967            self->pAacDecoderChannelInfo[ch]->pComData = &self->aacCommonData;
    968          }
    969 
    970          /* Allocate persistent channel memory */
    971          if (self->pAacDecoderStaticChannelInfo[ch] == NULL) {
    972            self->pAacDecoderStaticChannelInfo[ch] = GetAacDecoderStaticChannelInfo(ch);
    973            if (self->pAacDecoderStaticChannelInfo[ch] == NULL) {
    974              goto bail;
    975            }
    976            self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer = GetOverlapBuffer(ch); /* This area size depends on the AOT */
    977            if (self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer == NULL) {
    978              goto bail;
    979            }
    980            self->pAacDecoderChannelInfo[ch]->pSpectralCoefficient = (SPECTRAL_PTR) &self->aacCommonData.workBufferCore2[ch*1024];
    981 
    982          }
    983          CPns_InitPns(&self->pAacDecoderChannelInfo[ch]->data.aac.PnsData, &self->aacCommonData.pnsInterChannelData, &self->aacCommonData.pnsCurrentSeed, self->aacCommonData.pnsRandomSeed);
    984        }
    985 
    986 
    987        HcrInitRom(&self->aacCommonData.overlay.aac.erHcrInfo);
    988        setHcrType(&self->aacCommonData.overlay.aac.erHcrInfo, ID_SCE);
    989 
    990        /* Make allocated channel count persistent in decoder context. */
    991        self->aacChannels = ascChannels;
    992     }
    993 
    994     /* Make amount of signalled channels persistent in decoder context. */
    995     self->ascChannels = ascChannels;
    996   }
    997 
    998   /* Update structures */
    999   if (ascChanged) {
   1000 
   1001      /* Things to be done for each channel, which do not involved allocating memory. */
   1002      for (ch = 0; ch < ascChannels; ch++) {
   1003        switch (self->streamInfo.aot) {
   1004          case AOT_ER_AAC_ELD:
   1005          case AOT_ER_AAC_LD:
   1006            self->pAacDecoderChannelInfo[ch]->granuleLength = self->streamInfo.aacSamplesPerFrame;
   1007            break;
   1008          default:
   1009            self->pAacDecoderChannelInfo[ch]->granuleLength = self->streamInfo.aacSamplesPerFrame / 8;
   1010            break;
   1011        }
   1012        mdct_init( &self->pAacDecoderStaticChannelInfo[ch]->IMdct,
   1013                    self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer,
   1014                    OverlapBufferSize );
   1015 
   1016 
   1017         /* Reset DRC control data for this channel */
   1018         aacDecoder_drcInitChannelData ( &self->pAacDecoderStaticChannelInfo[ch]->drcData );
   1019 
   1020        /* Reset concealment only if ASC changed. Otherwise it will be done with any config callback.
   1021           E.g. every time the LATM SMC is present. */
   1022        CConcealment_InitChannelData(&self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo,
   1023                                     &self->concealCommonData,
   1024                                      self->streamInfo.aacSamplesPerFrame );
   1025      }
   1026   }
   1027 
   1028   /* Update externally visible copy of flags */
   1029   self->streamInfo.flags = self->flags;
   1030 
   1031   return err;
   1032 
   1033 bail:
   1034   aacDecoder_Close( self );
   1035   return AAC_DEC_OUT_OF_MEMORY;
   1036 }
   1037 
   1038 
   1039 LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame(
   1040         HANDLE_AACDECODER self,
   1041         const UINT flags,
   1042         INT_PCM *pTimeData,
   1043         const INT  timeDataSize,
   1044         const INT interleaved
   1045         )
   1046 {
   1047   AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK;
   1048 
   1049   CProgramConfig *pce;
   1050   HANDLE_FDK_BITSTREAM bs = transportDec_GetBitstream(self->hInput, 0);
   1051 
   1052   MP4_ELEMENT_ID type = ID_NONE;            /* Current element type */
   1053   INT aacChannels=0;                        /* Channel counter for channels found in the bitstream */
   1054 
   1055   INT auStartAnchor = (INT)FDKgetValidBits(bs);  /* AU start bit buffer position for AU byte alignment */
   1056 
   1057   self->frameOK = 1;
   1058 
   1059   /* Any supported base layer valid AU will require more than 16 bits. */
   1060   if ( (transportDec_GetAuBitsRemaining(self->hInput, 0) < 15) && (flags & (AACDEC_CONCEAL|AACDEC_FLUSH)) == 0) {
   1061     self->frameOK = 0;
   1062     ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR;
   1063   }
   1064 
   1065 
   1066   /* Reset Program Config structure */
   1067   pce = &self->pce;
   1068   CProgramConfig_Reset(pce);
   1069 
   1070   CAacDecoder_AncDataReset(&self->ancData);
   1071 
   1072   {
   1073     int ch;
   1074 
   1075     if (self->streamInfo.channelConfig == 0) {
   1076       /* Init Channel/Element mapping table */
   1077       for (ch=0; ch<(6); ch++) {
   1078         self->chMapping[ch] = 255;
   1079       }
   1080       if (!CProgramConfig_IsValid(pce)) {
   1081         int el;
   1082         for (el=0; el<7; el++) {
   1083           self->elements[el] = ID_NONE;
   1084         }
   1085       }
   1086     }
   1087   }
   1088 
   1089   /* Check sampling frequency  */
   1090   switch ( self->streamInfo.aacSampleRate ) {
   1091     case 16000:
   1092     case 12000:
   1093    case 11025:
   1094    case  8000:
   1095     case  7350:
   1096     case 48000:
   1097     case 44100:
   1098     case 32000:
   1099     case 24000:
   1100     case 22050:
   1101       break;
   1102     default:
   1103       if ( ! (self->flags & (AC_USAC|AC_RSVD50)) ) {
   1104         return AAC_DEC_UNSUPPORTED_SAMPLINGRATE;
   1105       }
   1106       break;
   1107   }
   1108 
   1109 
   1110   if ( flags & AACDEC_CLRHIST )
   1111   {
   1112     int ch;
   1113     /* Clear history */
   1114     for (ch = 0; ch < self->aacChannels; ch++) {
   1115       /* Reset concealment */
   1116       CConcealment_InitChannelData(&self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo,
   1117                                    &self->concealCommonData,
   1118                                     self->streamInfo.aacSamplesPerFrame );
   1119       /* Clear concealment buffers to get rid of the complete history */
   1120       FDKmemclear(self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo.spectralCoefficient, 1024 * sizeof(FIXP_CNCL));
   1121       FDKmemclear(self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo.specScale, 8 * sizeof(SHORT));
   1122       /* Clear overlap-add buffers to avoid clicks. */
   1123       FDKmemclear(self->pAacDecoderStaticChannelInfo[ch]->IMdct.overlap.freq, OverlapBufferSize*sizeof(FIXP_DBL));
   1124      }
   1125   }
   1126 
   1127 
   1128 
   1129 #ifdef TP_PCE_ENABLE
   1130   int pceRead = 0;                          /* Flag indicating a PCE in the current raw_data_block() */
   1131 #endif
   1132 
   1133 
   1134   INT hdaacDecoded = 0;
   1135   MP4_ELEMENT_ID previous_element = ID_END; /* Last element ID (required for extension payload mapping */
   1136   UCHAR previous_element_index = 0;         /* Canonical index of last element */
   1137   int element_count = 0;                    /* Element counter for elements found in the bitstream */
   1138   int el_cnt[ID_LAST] = { 0 };              /* element counter ( robustness ) */
   1139 
   1140   while ( (type != ID_END) && (! (flags & (AACDEC_CONCEAL | AACDEC_FLUSH))) && self->frameOK )
   1141   {
   1142     int el_channels;
   1143 
   1144     if (! (self->flags & (AC_USAC|AC_RSVD50|AC_ELD|AC_SCALABLE|AC_ER)))
   1145       type = (MP4_ELEMENT_ID) FDKreadBits(bs,3);
   1146     else
   1147       type = self->elements[element_count];
   1148 
   1149     setHcrType(&self->aacCommonData.overlay.aac.erHcrInfo, type);
   1150 
   1151 
   1152     if ((INT)FDKgetValidBits(bs) < 0)
   1153       self->frameOK = 0;
   1154 
   1155     switch (type)
   1156     {
   1157       case ID_SCE:
   1158       case ID_CPE:
   1159       case ID_LFE:
   1160         /*
   1161           Consistency check
   1162         */
   1163 
   1164         if (type == ID_CPE) {
   1165           el_channels = 2;
   1166         } else {
   1167           el_channels = 1;
   1168         }
   1169 
   1170         if ( (el_cnt[type] >= (self->ascChannels>>(el_channels-1))) || (aacChannels > (self->ascChannels-el_channels)) ) {
   1171           ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR;
   1172           self->frameOK = 0;
   1173           break;
   1174         }
   1175 
   1176         if ( !(self->flags & (AC_USAC|AC_RSVD50)) ) {
   1177           int ch;
   1178           for (ch=0; ch < el_channels; ch+=1) {
   1179             CPns_ResetData(&self->pAacDecoderChannelInfo[aacChannels+ch]->data.aac.PnsData,
   1180                            &self->pAacDecoderChannelInfo[aacChannels+ch]->pComData->pnsInterChannelData);
   1181           }
   1182         }
   1183 
   1184         if(self->frameOK) {
   1185           ErrorStatus = CChannelElement_Read( bs,
   1186                                              &self->pAacDecoderChannelInfo[aacChannels],
   1187                                              &self->pAacDecoderStaticChannelInfo[aacChannels],
   1188                                               self->streamInfo.aot,
   1189                                              &self->samplingRateInfo,
   1190                                               self->flags,
   1191                                               self->streamInfo.aacSamplesPerFrame,
   1192                                               el_channels,
   1193                                               self->streamInfo.epConfig,
   1194                                               self->hInput
   1195                                               );
   1196           if (ErrorStatus) {
   1197             self->frameOK = 0;
   1198           }
   1199         }
   1200 
   1201 
   1202         if ( self->frameOK) {
   1203           /* Lookup the element and decode it only if it belongs to the current program */
   1204           if ( CProgramConfig_LookupElement(
   1205                   pce,
   1206                   self->streamInfo.channelConfig,
   1207                   self->pAacDecoderChannelInfo[aacChannels]->ElementInstanceTag,
   1208                   aacChannels,
   1209                   self->chMapping,
   1210                   self->channelType,
   1211                   self->channelIndices,
   1212                  &previous_element_index,
   1213                   self->elements,
   1214                   type) )
   1215           {
   1216             if ( !hdaacDecoded ) {
   1217               CChannelElement_Decode(
   1218                      &self->pAacDecoderChannelInfo[aacChannels],
   1219                      &self->pAacDecoderStaticChannelInfo[aacChannels],
   1220                      &self->samplingRateInfo,
   1221                       self->flags,
   1222                       el_channels
   1223                       );
   1224             }
   1225             aacChannels += 1;
   1226             if (type == ID_CPE) {
   1227               aacChannels += 1;
   1228             }
   1229           }
   1230           else {
   1231             self->frameOK = 0;
   1232           }
   1233           /* Create SBR element for SBR for upsampling. */
   1234           if ( (type == ID_LFE)
   1235             && ( (self->flags & AC_SBR_PRESENT)
   1236               || (self->sbrEnabled == 1) ) )
   1237           {
   1238             SBR_ERROR sbrError;
   1239 
   1240             sbrError = sbrDecoder_InitElement(
   1241                     self->hSbrDecoder,
   1242                     self->streamInfo.aacSampleRate,
   1243                     self->streamInfo.extSamplingRate,
   1244                     self->streamInfo.aacSamplesPerFrame,
   1245                     self->streamInfo.aot,
   1246                     ID_LFE,
   1247                     previous_element_index
   1248                     );
   1249             if (sbrError != SBRDEC_OK) {
   1250               /* Do not try to apply SBR because initializing the element failed. */
   1251               self->sbrEnabled = 0;
   1252             }
   1253           }
   1254         }
   1255 
   1256         el_cnt[type]++;
   1257         break;
   1258 
   1259       case ID_CCE:
   1260         /*
   1261           Consistency check
   1262         */
   1263         if ( el_cnt[type] > self->ascChannels ) {
   1264           ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR;
   1265           self->frameOK = 0;
   1266           break;
   1267         }
   1268 
   1269         if (self->frameOK)
   1270         {
   1271           /* memory for spectral lines temporal on scratch */
   1272           C_ALLOC_SCRATCH_START(mdctSpec, FIXP_DBL, 1024);
   1273 
   1274           /* create dummy channel for CCE parsing on stack */
   1275           CAacDecoderChannelInfo  tmpAacDecoderChannelInfo, *pTmpAacDecoderChannelInfo;
   1276 
   1277           FDKmemclear(mdctSpec, 1024*sizeof(FIXP_DBL));
   1278 
   1279           tmpAacDecoderChannelInfo.pDynData =   self->aacCommonData.workBufferCore1->pAacDecoderDynamicData;
   1280           tmpAacDecoderChannelInfo.pComData =  &self->aacCommonData;
   1281           tmpAacDecoderChannelInfo.pSpectralCoefficient  = (SPECTRAL_PTR)mdctSpec;
   1282           /* Assume AAC-LC */
   1283           tmpAacDecoderChannelInfo.granuleLength = self->streamInfo.aacSamplesPerFrame / 8;
   1284 
   1285           /* Reset PNS data. */
   1286           CPns_ResetData(&tmpAacDecoderChannelInfo.data.aac.PnsData, &tmpAacDecoderChannelInfo.pComData->pnsInterChannelData);
   1287 
   1288           pTmpAacDecoderChannelInfo = &tmpAacDecoderChannelInfo;
   1289           /* do CCE parsing */
   1290           ErrorStatus = CChannelElement_Read( bs,
   1291                                              &pTmpAacDecoderChannelInfo,
   1292                                               NULL,
   1293                                               self->streamInfo.aot,
   1294                                              &self->samplingRateInfo,
   1295                                               self->flags,
   1296                                               self->streamInfo.aacSamplesPerFrame,
   1297                                               1,
   1298                                               self->streamInfo.epConfig,
   1299                                               self->hInput
   1300                                              );
   1301 
   1302           C_ALLOC_SCRATCH_END(mdctSpec, FIXP_DBL, 1024);
   1303 
   1304           if (ErrorStatus) {
   1305             self->frameOK = 0;
   1306           }
   1307 
   1308           if (self->frameOK) {
   1309             /* Lookup the element and decode it only if it belongs to the current program */
   1310             if (CProgramConfig_LookupElement(
   1311                     pce,
   1312                     self->streamInfo.channelConfig,
   1313                     pTmpAacDecoderChannelInfo->ElementInstanceTag,
   1314                     0,
   1315                     self->chMapping,
   1316                     self->channelType,
   1317                     self->channelIndices,
   1318                    &previous_element_index,
   1319                     self->elements,
   1320                     type) )
   1321             {
   1322               /* decoding of CCE not supported */
   1323             }
   1324             else {
   1325               self->frameOK = 0;
   1326             }
   1327           }
   1328         }
   1329         el_cnt[type]++;
   1330         break;
   1331 
   1332       case ID_DSE:
   1333         {
   1334           UCHAR element_instance_tag;
   1335 
   1336           CDataStreamElement_Read( bs,
   1337                                   &self->ancData,
   1338                                    self->hDrcInfo,
   1339                                    self->hInput,
   1340                                   &element_instance_tag,
   1341                                    auStartAnchor );
   1342 
   1343           if (!CProgramConfig_LookupElement(
   1344                    pce,
   1345                    self->streamInfo.channelConfig,
   1346                    element_instance_tag,
   1347                    0,
   1348                    self->chMapping,
   1349                    self->channelType,
   1350                    self->channelIndices,
   1351                   &previous_element_index,
   1352                    self->elements,
   1353                    type) )
   1354           {
   1355             /* most likely an error in bitstream occured */
   1356             //self->frameOK = 0;
   1357           }
   1358         }
   1359 
   1360         {
   1361           UCHAR *pDvbAncData = NULL;
   1362           AAC_DECODER_ERROR ancErr;
   1363           int ancIndex;
   1364           int dvbAncDataSize = 0;
   1365 
   1366           /* Ask how many anc data elements are in buffer */
   1367           ancIndex = self->ancData.nrElements - 1;
   1368           /* Get the last one (if available) */
   1369           ancErr   = CAacDecoder_AncDataGet( &self->ancData,
   1370                                               ancIndex,
   1371                                              &pDvbAncData,
   1372                                              &dvbAncDataSize );
   1373 
   1374           if (ancErr == AAC_DEC_OK) {
   1375             pcmDmx_ReadDvbAncData (
   1376                   self->hPcmUtils,
   1377                   pDvbAncData,
   1378                   dvbAncDataSize,
   1379                   0 /* not mpeg2 */ );
   1380           }
   1381         }
   1382         break;
   1383 
   1384 #ifdef TP_PCE_ENABLE
   1385       case ID_PCE:
   1386 
   1387         if ( CProgramConfigElement_Read( bs,
   1388                                     self->hInput,
   1389                                     pce,
   1390                                     self->streamInfo.channelConfig,
   1391                                     auStartAnchor ) )
   1392         { /* Built element table */
   1393           int elIdx = CProgramConfig_GetElementTable(pce, self->elements, 7);
   1394           /* Reset the remaining tabs */
   1395           for ( ; elIdx<7; elIdx++) {
   1396             self->elements[elIdx] = ID_NONE;
   1397           }
   1398           /* Make new number of channel persistant */
   1399           self->ascChannels = pce->NumChannels;
   1400           /* If PCE is not first element conceal this frame to avoid inconsistencies */
   1401           if ( element_count != 0 ) {
   1402             self->frameOK = 0;
   1403           }
   1404         }
   1405         pceRead = 1;
   1406         break;
   1407 #endif /* TP_PCE_ENABLE */
   1408 
   1409       case ID_FIL:
   1410         {
   1411           int bitCnt = FDKreadBits(bs,4);           /* bs_count */
   1412 
   1413           if (bitCnt == 15)
   1414           {
   1415             int esc_count = FDKreadBits(bs,8);     /* bs_esc_count */
   1416             bitCnt =  esc_count + 14;
   1417           }
   1418 
   1419           /* Convert to bits */
   1420           bitCnt <<= 3;
   1421 
   1422           while (bitCnt > 0) {
   1423             ErrorStatus = CAacDecoder_ExtPayloadParse(self, bs, &bitCnt, previous_element, previous_element_index, 1);
   1424             if (ErrorStatus != AAC_DEC_OK) {
   1425               self->frameOK = 0;
   1426               break;
   1427             }
   1428           }
   1429         }
   1430         break;
   1431 
   1432       case ID_EXT:
   1433         {
   1434           INT bitCnt = 0;
   1435 
   1436           /* get the remaining bits of this frame */
   1437           bitCnt = transportDec_GetAuBitsRemaining(self->hInput, 0);
   1438 
   1439           if ( (bitCnt > 0) && (self->flags & AC_SBR_PRESENT) && (self->flags & (AC_USAC|AC_RSVD50|AC_ELD)) )
   1440           {
   1441             SBR_ERROR err = SBRDEC_OK;
   1442             int  elIdx, numChElements = el_cnt[ID_SCE] + el_cnt[ID_CPE];
   1443 
   1444             for (elIdx = 0; elIdx < numChElements; elIdx += 1)
   1445             {
   1446               err = sbrDecoder_Parse (
   1447                     self->hSbrDecoder,
   1448                     bs,
   1449                    &bitCnt,
   1450                     -1,
   1451                     self->flags & AC_SBRCRC,
   1452                     self->elements[elIdx],
   1453                     elIdx,
   1454                     self->flags & AC_INDEP );
   1455 
   1456               if (err != SBRDEC_OK) {
   1457                 break;
   1458               }
   1459             }
   1460             if (err == SBRDEC_OK) {
   1461               self->sbrEnabled = 1;
   1462             } else {
   1463               self->frameOK = 0;
   1464             }
   1465           }
   1466 
   1467 
   1468           if ( ! (self->flags & (AC_USAC|AC_RSVD50|AC_DRM)) )
   1469           {
   1470             while ( bitCnt > 7 ) {
   1471               ErrorStatus = CAacDecoder_ExtPayloadParse(self, bs, &bitCnt, previous_element, previous_element_index, 0);
   1472               if (ErrorStatus != AAC_DEC_OK) {
   1473                 self->frameOK = 0;
   1474                 ErrorStatus = AAC_DEC_PARSE_ERROR;
   1475                 break;
   1476               }
   1477             }
   1478           }
   1479         }
   1480         break;
   1481 
   1482       case ID_END:
   1483         break;
   1484 
   1485       default:
   1486         ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR;
   1487         self->frameOK = 0;
   1488         break;
   1489     }
   1490 
   1491     previous_element = type;
   1492     element_count++;
   1493 
   1494   }   /* while ( (type != ID_END) ... ) */
   1495 
   1496   if ( !(flags & (AACDEC_CONCEAL|AACDEC_FLUSH)) )
   1497   {
   1498     /* Byte alignment with respect to the first bit of the raw_data_block(). */
   1499     {
   1500       FDKbyteAlign(bs, auStartAnchor);
   1501     }
   1502 
   1503     /* Check if all bits of the raw_data_block() have been read. */
   1504     if ( transportDec_GetAuBitsTotal(self->hInput, 0) > 0 ) {
   1505       INT unreadBits = transportDec_GetAuBitsRemaining(self->hInput, 0);
   1506       if ( unreadBits != 0 ) {
   1507 
   1508         self->frameOK = 0;
   1509         /* Do not overwrite current error */
   1510         if (ErrorStatus == AAC_DEC_OK && self->frameOK == 0) {
   1511           ErrorStatus = AAC_DEC_PARSE_ERROR;
   1512         }
   1513         /* Always put the bitbuffer at the right position after the current Access Unit. */
   1514         FDKpushBiDirectional(bs, unreadBits);
   1515       }
   1516     }
   1517 
   1518     /* Check the last element. The terminator (ID_END) has to be the last one (even if ER syntax is used). */
   1519     if ( self->frameOK && type != ID_END ) {
   1520       /* Do not overwrite current error */
   1521       if (ErrorStatus == AAC_DEC_OK) {
   1522         ErrorStatus = AAC_DEC_PARSE_ERROR;
   1523       }
   1524       self->frameOK = 0;
   1525     }
   1526   }
   1527 
   1528   /* More AAC channels than specified by the ASC not allowed. */
   1529   if ( (aacChannels == 0 || aacChannels > self->aacChannels) && !(flags & (AACDEC_CONCEAL|AACDEC_FLUSH)) ) {
   1530     {
   1531       /* Do not overwrite current error */
   1532       if (ErrorStatus == AAC_DEC_OK) {
   1533         ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR;
   1534       }
   1535       self->frameOK = 0;
   1536     }
   1537     aacChannels = 0;
   1538   }
   1539   else if ( aacChannels > self->ascChannels ) {
   1540     /* Do not overwrite current error */
   1541     if (ErrorStatus == AAC_DEC_OK) {
   1542       ErrorStatus = AAC_DEC_UNSUPPORTED_FORMAT;
   1543     }
   1544     self->frameOK = 0;
   1545     aacChannels = 0;
   1546   }
   1547 
   1548   if ( TRANSPORTDEC_OK != transportDec_CrcCheck(self->hInput) )
   1549   {
   1550     self->frameOK=0;
   1551   }
   1552 
   1553   /* store or restore the number of channels */
   1554   if ( self->frameOK && !(flags &(AACDEC_CONCEAL|AACDEC_FLUSH)) ) {
   1555     self->concealChannels = aacChannels;  /* store */
   1556     self->sbrEnabledPrev = self->sbrEnabled;
   1557   } else {
   1558     if (self->aacChannels > 0) {
   1559       aacChannels = self->concealChannels;  /* restore */
   1560       self->sbrEnabled = self->sbrEnabledPrev;
   1561      }
   1562   }
   1563 
   1564   /* Update number of output channels */
   1565   self->streamInfo.numChannels = aacChannels;
   1566 
   1567  #ifdef TP_PCE_ENABLE
   1568   if (pceRead == 1 || CProgramConfig_IsValid(pce)) {
   1569     /* Set matrix mixdown infos if available from PCE. */
   1570     pcmDmx_SetMatrixMixdownFromPce ( self->hPcmUtils,
   1571                                      pce->MatrixMixdownIndexPresent,
   1572                                      pce->MatrixMixdownIndex,
   1573                                      pce->PseudoSurroundEnable );
   1574   }
   1575  #endif
   1576 
   1577   /* If there is no valid data to transfrom into time domain, return. */
   1578   if ( ! IS_OUTPUT_VALID(ErrorStatus) ) {
   1579     return ErrorStatus;
   1580   }
   1581 
   1582   /*
   1583     Inverse transform
   1584   */
   1585   {
   1586     int stride, offset, c;
   1587 
   1588     /* Extract DRC control data and map it to channels (without bitstream delay) */
   1589     aacDecoder_drcProlog (
   1590             self->hDrcInfo,
   1591             bs,
   1592             self->pAacDecoderStaticChannelInfo,
   1593             self->pce.ElementInstanceTag,
   1594             self->chMapping,
   1595             aacChannels
   1596           );
   1597 
   1598     /* "c" iterates in canonical MPEG channel order */
   1599     for (c=0; c < aacChannels; c++)
   1600     {
   1601       CAacDecoderChannelInfo *pAacDecoderChannelInfo;
   1602 
   1603       /* Select correct pAacDecoderChannelInfo for current channel */
   1604       if (self->chMapping[c] >= aacChannels) {
   1605         pAacDecoderChannelInfo = self->pAacDecoderChannelInfo[c];
   1606       } else {
   1607         pAacDecoderChannelInfo = self->pAacDecoderChannelInfo[self->chMapping[c]];
   1608       }
   1609 
   1610       /* Setup offset and stride for time buffer traversal. */
   1611       if (interleaved) {
   1612         stride = aacChannels;
   1613         offset = self->channelOutputMapping[aacChannels-1][c];
   1614       } else {
   1615         stride = 1;
   1616         offset = self->channelOutputMapping[aacChannels-1][c] * self->streamInfo.aacSamplesPerFrame;
   1617       }
   1618 
   1619 
   1620       /*
   1621         Conceal defective spectral data
   1622       */
   1623       CConcealment_Apply(&self->pAacDecoderStaticChannelInfo[c]->concealmentInfo,
   1624                           pAacDecoderChannelInfo,
   1625                           self->pAacDecoderStaticChannelInfo[c],
   1626                          &self->samplingRateInfo,
   1627                           self->streamInfo.aacSamplesPerFrame,
   1628                           0,
   1629                           (self->frameOK && !(flags&AACDEC_CONCEAL)),
   1630                           self->flags
   1631                         );
   1632 
   1633 
   1634       if (flags & (AACDEC_INTR|AACDEC_CLRHIST)) {
   1635         /* Reset DRC control data for this channel */
   1636         aacDecoder_drcInitChannelData ( &self->pAacDecoderStaticChannelInfo[c]->drcData );
   1637       }
   1638       /* DRC processing */
   1639       aacDecoder_drcApply (
   1640               self->hDrcInfo,
   1641               self->hSbrDecoder,
   1642               pAacDecoderChannelInfo,
   1643              &self->pAacDecoderStaticChannelInfo[c]->drcData,
   1644               c,
   1645               self->streamInfo.aacSamplesPerFrame,
   1646               self->sbrEnabled
   1647             );
   1648 
   1649       if ( flags&AACDEC_FLUSH ) {
   1650         FDKmemclear(pAacDecoderChannelInfo->pSpectralCoefficient, sizeof(FIXP_DBL)*self->streamInfo.aacSamplesPerFrame);
   1651       }
   1652 
   1653       switch (pAacDecoderChannelInfo->renderMode)
   1654       {
   1655         case AACDEC_RENDER_IMDCT:
   1656           CBlock_FrequencyToTime(
   1657                   self->pAacDecoderStaticChannelInfo[c],
   1658                   pAacDecoderChannelInfo,
   1659                   pTimeData + offset,
   1660                   self->streamInfo.aacSamplesPerFrame,
   1661                   stride,
   1662                   (self->frameOK && !(flags&AACDEC_CONCEAL)),
   1663                   self->aacCommonData.workBufferCore1->mdctOutTemp
   1664                   );
   1665           break;
   1666         case AACDEC_RENDER_ELDFB:
   1667           CBlock_FrequencyToTimeLowDelay(
   1668                   self->pAacDecoderStaticChannelInfo[c],
   1669                   pAacDecoderChannelInfo,
   1670                   pTimeData + offset,
   1671                   self->streamInfo.aacSamplesPerFrame,
   1672                   stride
   1673                   );
   1674           break;
   1675         default:
   1676           ErrorStatus = AAC_DEC_UNKNOWN;
   1677           break;
   1678       }
   1679       if ( flags&AACDEC_FLUSH ) {
   1680         FDKmemclear(self->pAacDecoderStaticChannelInfo[c]->pOverlapBuffer, OverlapBufferSize*sizeof(FIXP_DBL));
   1681       }
   1682     }
   1683 
   1684 
   1685     /* Extract DRC control data and map it to channels (with bitstream delay) */
   1686     aacDecoder_drcEpilog (
   1687             self->hDrcInfo,
   1688             bs,
   1689             self->pAacDecoderStaticChannelInfo,
   1690             self->pce.ElementInstanceTag,
   1691             self->chMapping,
   1692             aacChannels
   1693           );
   1694   }
   1695 
   1696 
   1697   /* Reorder channel type information tables.  */
   1698   {
   1699     AUDIO_CHANNEL_TYPE types[(6)];
   1700     UCHAR idx[(6)];
   1701     int c;
   1702 
   1703     FDK_ASSERT(sizeof(self->channelType) == sizeof(types));
   1704     FDK_ASSERT(sizeof(self->channelIndices) == sizeof(idx));
   1705 
   1706     FDKmemcpy(types, self->channelType, sizeof(types));
   1707     FDKmemcpy(idx, self->channelIndices, sizeof(idx));
   1708 
   1709     for (c=0; c<aacChannels; c++) {
   1710       self->channelType[self->channelOutputMapping[aacChannels-1][c]] = types[c];
   1711       self->channelIndices[self->channelOutputMapping[aacChannels-1][c]] = idx[c];
   1712     }
   1713   }
   1714 
   1715   self->blockNumber++;
   1716 
   1717   return ErrorStatus;
   1718 }
   1719 
   1720 /*!
   1721   \brief returns the streaminfo pointer
   1722 
   1723   The function hands back a pointer to the streaminfo structure
   1724 
   1725   \return pointer to the struct
   1726 */
   1727 LINKSPEC_CPP CStreamInfo* CAacDecoder_GetStreamInfo ( HANDLE_AACDECODER self )
   1728 {
   1729   if (!self) {
   1730     return NULL;
   1731   }
   1732   return &self->streamInfo;
   1733 }
   1734 
   1735 
   1736 
   1737 
   1738