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 - 2013 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):   Daniel Homm
     87    Description:
     88 
     89 ******************************************************************************/
     90 
     91 #include "tpdec_lib.h"
     92 #include "tp_data.h"
     93 
     94 
     95 void CProgramConfig_Reset(CProgramConfig *pPce)
     96 {
     97   pPce->elCounter = 0;
     98 }
     99 
    100 void CProgramConfig_Init(CProgramConfig *pPce)
    101 {
    102   FDKmemclear(pPce, sizeof(CProgramConfig));
    103 #ifdef TP_PCE_ENABLE
    104   pPce->SamplingFrequencyIndex = 0xf;
    105 #endif
    106 }
    107 
    108 int  CProgramConfig_IsValid ( const CProgramConfig *pPce )
    109 {
    110   return ( (pPce->isValid) ? 1 : 0);
    111 }
    112 
    113 #ifdef TP_PCE_ENABLE
    114 void CProgramConfig_Read(
    115                           CProgramConfig *pPce,
    116                           HANDLE_FDK_BITSTREAM bs,
    117                           UINT alignmentAnchor
    118                         )
    119 {
    120   int i;
    121 
    122   pPce->NumEffectiveChannels = 0;
    123   pPce->NumChannels = 0;
    124   pPce->ElementInstanceTag = (UCHAR) FDKreadBits(bs,4);
    125   pPce->Profile = (UCHAR) FDKreadBits(bs,2);
    126   pPce->SamplingFrequencyIndex = (UCHAR) FDKreadBits(bs,4);
    127   pPce->NumFrontChannelElements = (UCHAR) FDKreadBits(bs,4);
    128   pPce->NumSideChannelElements = (UCHAR) FDKreadBits(bs,4);
    129   pPce->NumBackChannelElements = (UCHAR) FDKreadBits(bs,4);
    130   pPce->NumLfeChannelElements = (UCHAR) FDKreadBits(bs,2);
    131   pPce->NumAssocDataElements = (UCHAR) FDKreadBits(bs,3);
    132   pPce->NumValidCcElements = (UCHAR) FDKreadBits(bs,4);
    133 
    134   if ((pPce->MonoMixdownPresent = (UCHAR) FDKreadBits(bs,1)) != 0)
    135   {
    136     pPce->MonoMixdownElementNumber = (UCHAR) FDKreadBits(bs,4);
    137   }
    138 
    139   if ((pPce->StereoMixdownPresent = (UCHAR) FDKreadBits(bs,1)) != 0)
    140   {
    141     pPce->StereoMixdownElementNumber = (UCHAR) FDKreadBits(bs,4);
    142   }
    143 
    144   if ((pPce->MatrixMixdownIndexPresent = (UCHAR) FDKreadBits(bs,1)) != 0)
    145   {
    146     pPce->MatrixMixdownIndex = (UCHAR) FDKreadBits(bs,2);
    147     pPce->PseudoSurroundEnable = (UCHAR) FDKreadBits(bs,1);
    148   }
    149 
    150   for (i=0; i < pPce->NumFrontChannelElements; i++)
    151   {
    152     pPce->FrontElementIsCpe[i] = (UCHAR) FDKreadBits(bs,1);
    153     pPce->FrontElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4);
    154     pPce->NumChannels += pPce->FrontElementIsCpe[i] ? 2 : 1;
    155   }
    156 
    157   for (i=0; i < pPce->NumSideChannelElements; i++)
    158   {
    159     pPce->SideElementIsCpe[i] = (UCHAR) FDKreadBits(bs,1);
    160     pPce->SideElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4);
    161     pPce->NumChannels += pPce->SideElementIsCpe[i] ? 2 : 1;
    162   }
    163 
    164   for (i=0; i < pPce->NumBackChannelElements; i++)
    165   {
    166     pPce->BackElementIsCpe[i] = (UCHAR) FDKreadBits(bs,1);
    167     pPce->BackElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4);
    168     pPce->NumChannels += pPce->BackElementIsCpe[i] ? 2 : 1;
    169   }
    170 
    171   pPce->NumEffectiveChannels = pPce->NumChannels;
    172 
    173   for (i=0; i < pPce->NumLfeChannelElements; i++)
    174   {
    175     pPce->LfeElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4);
    176     pPce->NumChannels += 1;
    177   }
    178 
    179   for (i=0; i < pPce->NumAssocDataElements; i++)
    180   {
    181     pPce->AssocDataElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4);
    182   }
    183 
    184   for (i=0; i < pPce->NumValidCcElements; i++)
    185   {
    186     pPce->CcElementIsIndSw[i] = (UCHAR) FDKreadBits(bs,1);
    187     pPce->ValidCcElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4);
    188   }
    189 
    190   FDKbyteAlign(bs, alignmentAnchor);
    191 
    192   pPce->CommentFieldBytes = (UCHAR) FDKreadBits(bs,8);
    193 
    194   for (i=0; i < pPce->CommentFieldBytes; i++)
    195   {
    196     UCHAR text;
    197 
    198     text = (UCHAR)FDKreadBits(bs,8);
    199 
    200     if (i < PC_COMMENTLENGTH)
    201     {
    202       pPce->Comment[i] = text;
    203     }
    204   }
    205 
    206   pPce->isValid = 1;
    207 }
    208 
    209 /*
    210  * Compare two program configurations.
    211  * Returns the result of the comparison:
    212  *  -1 - completely different
    213  *   0 - completely equal
    214  *   1 - different but same channel configuration
    215  *   2 - different channel configuration but same number of channels
    216  */
    217 int CProgramConfig_Compare ( const CProgramConfig * const pPce1,
    218                              const CProgramConfig * const pPce2 )
    219 {
    220   int result = 0;  /* Innocent until proven false. */
    221 
    222   if (FDKmemcmp(pPce1, pPce2, sizeof(CProgramConfig)) != 0)
    223   { /* Configurations are not completely different.
    224        So look into details and analyse the channel configurations: */
    225     result = -1;
    226 
    227     if (pPce1->NumChannels == pPce2->NumChannels)
    228     { /* Now the logic changes. We first assume to have the same channel configuration
    229          and then prove if this assumption is true. */
    230       result = 1;
    231 
    232       /* Front channels */
    233       if (pPce1->NumFrontChannelElements != pPce2->NumFrontChannelElements) {
    234         result = 2;  /* different number of front channel elements */
    235       } else {
    236         int el, numCh1 = 0, numCh2 = 0;
    237         for (el = 0; el < pPce1->NumFrontChannelElements; el += 1) {
    238           numCh1 += pPce1->FrontElementIsCpe[el] ? 2 : 1;
    239           numCh2 += pPce2->FrontElementIsCpe[el] ? 2 : 1;
    240         }
    241         if (numCh1 != numCh2) {
    242           result = 2;  /* different number of front channels */
    243         }
    244       }
    245       /* Side channels */
    246       if (pPce1->NumSideChannelElements != pPce2->NumSideChannelElements) {
    247         result = 2;  /* different number of side channel elements */
    248       } else {
    249         int el, numCh1 = 0, numCh2 = 0;
    250         for (el = 0; el < pPce1->NumSideChannelElements; el += 1) {
    251           numCh1 += pPce1->SideElementIsCpe[el] ? 2 : 1;
    252           numCh2 += pPce2->SideElementIsCpe[el] ? 2 : 1;
    253         }
    254         if (numCh1 != numCh2) {
    255           result = 2;  /* different number of side channels */
    256         }
    257       }
    258       /* Back channels */
    259       if (pPce1->NumBackChannelElements != pPce2->NumBackChannelElements) {
    260         result = 2;  /* different number of back channel elements */
    261       } else {
    262         int el, numCh1 = 0, numCh2 = 0;
    263         for (el = 0; el < pPce1->NumBackChannelElements; el += 1) {
    264           numCh1 += pPce1->BackElementIsCpe[el] ? 2 : 1;
    265           numCh2 += pPce2->BackElementIsCpe[el] ? 2 : 1;
    266         }
    267         if (numCh1 != numCh2) {
    268           result = 2;  /* different number of back channels */
    269         }
    270       }
    271       /* LFE channels */
    272       if (pPce1->NumLfeChannelElements != pPce2->NumLfeChannelElements) {
    273         result = 2;  /* different number of lfe channels */
    274       }
    275       /* LFEs are always SCEs so we don't need to count the channels. */
    276     }
    277   }
    278 
    279   return result;
    280 }
    281 
    282 void CProgramConfig_GetDefault( CProgramConfig *pPce,
    283                                 const UINT channelConfig )
    284 {
    285   FDK_ASSERT(pPce != NULL);
    286 
    287   /* Init PCE */
    288   CProgramConfig_Init(pPce);
    289   pPce->Profile = 1;  /* Set AAC LC because it is the only supported object type. */
    290 
    291   switch (channelConfig) {
    292   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
    293   case 6:   /* 3/0/2.1ch */
    294     pPce->NumLfeChannelElements   += 1;
    295     pPce->NumChannels             += 1;
    296   case 5:   /* 3/0/2.0ch */
    297   case 4:   /* 3/0/1.0ch */
    298     pPce->NumBackChannelElements  += 1;
    299     pPce->BackElementIsCpe[0]      = (channelConfig>4) ? 1 : 0;
    300     pPce->NumChannels             += (channelConfig>4) ? 2 : 1;
    301     pPce->NumEffectiveChannels    += (channelConfig>4) ? 2 : 1;
    302   case 3:   /* 3/0/0.0ch */
    303     pPce->NumFrontChannelElements += 1;
    304     pPce->FrontElementIsCpe[1]     = 1;
    305     pPce->NumChannels             += 2;
    306     pPce->NumEffectiveChannels    += 2;
    307   case 1:   /* 1/0/0.0ch */
    308     pPce->NumFrontChannelElements += 1;
    309     pPce->FrontElementIsCpe[0]     = 0;
    310     pPce->NumChannels             += 1;
    311     pPce->NumEffectiveChannels    += 1;
    312     pPce->isValid                  = 1;
    313     break;
    314   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
    315   case 2:   /* 2/0/0.ch */
    316     pPce->NumFrontChannelElements  = 1;
    317     pPce->FrontElementIsCpe[0]     = 1;
    318     pPce->NumChannels             += 2;
    319     pPce->NumEffectiveChannels    += 2;
    320     pPce->isValid                  = 1;
    321     break;
    322   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
    323   default:
    324     pPce->isValid                  = 0;   /* To be explicit! */
    325     break;
    326   }
    327 
    328   if (pPce->isValid) {
    329     /* Create valid element instance tags */
    330     int el, elTagSce = 0, elTagCpe = 0;
    331 
    332     for (el = 0; el < pPce->NumFrontChannelElements; el += 1) {
    333       pPce->FrontElementTagSelect[el] = (pPce->FrontElementIsCpe) ? elTagCpe++ : elTagSce++;
    334     }
    335     for (el = 0; el < pPce->NumSideChannelElements; el += 1) {
    336       pPce->SideElementTagSelect[el] = (pPce->SideElementIsCpe) ? elTagCpe++ : elTagSce++;
    337     }
    338     for (el = 0; el < pPce->NumBackChannelElements; el += 1) {
    339       pPce->BackElementTagSelect[el] = (pPce->BackElementIsCpe) ? elTagCpe++ : elTagSce++;
    340     }
    341     elTagSce = 0;
    342     for (el = 0; el < pPce->NumLfeChannelElements; el += 1) {
    343       pPce->LfeElementTagSelect[el] = elTagSce++;
    344     }
    345   }
    346 }
    347 #endif /* TP_PCE_ENABLE */
    348 
    349 /**
    350  * \brief get implicit audio channel type for given channelConfig and MPEG ordered channel index
    351  * \param channelConfig MPEG channelConfiguration from 1 upto 7
    352  * \param index MPEG channel order index
    353  * \return audio channel type.
    354  */
    355 void getImplicitAudioChannelTypeAndIndex(
    356         AUDIO_CHANNEL_TYPE *chType,
    357         UCHAR *chIndex,
    358         UINT channelConfig,
    359         UINT index
    360         )
    361 {
    362   if (index < 3) {
    363     *chType = ACT_FRONT;
    364     *chIndex = index;
    365   } else {
    366     switch (channelConfig) {
    367       case MODE_1_2_1:
    368       case MODE_1_2_2:
    369       case MODE_1_2_2_1:
    370         switch (index) {
    371           case 3:
    372           case 4:
    373             *chType = ACT_BACK;
    374             *chIndex = index - 3;
    375             break;
    376           case 5:
    377             *chType = ACT_LFE;
    378             *chIndex = 0;
    379             break;
    380         }
    381         break;
    382       case MODE_1_2_2_2_1:
    383         switch (index) {
    384           case 3:
    385           case 4:
    386             *chType = ACT_SIDE;
    387             *chIndex = index - 3;
    388             break;
    389           case 5:
    390           case 6:
    391             *chType = ACT_BACK;
    392             *chIndex = index - 5;
    393             break;
    394           case 7:
    395             *chType = ACT_LFE;
    396             *chIndex = 0;
    397             break;
    398         }
    399         break;
    400       default:
    401         *chType = ACT_NONE;
    402         break;
    403     }
    404   }
    405 }
    406 
    407 int CProgramConfig_LookupElement(
    408         CProgramConfig *pPce,
    409         UINT            channelConfig,
    410         const UINT      tag,
    411         const UINT      channelIdx,
    412         UCHAR           chMapping[],
    413         AUDIO_CHANNEL_TYPE chType[],
    414         UCHAR           chIndex[],
    415         UCHAR          *elMapping,
    416         MP4_ELEMENT_ID  elList[],
    417         MP4_ELEMENT_ID  elType
    418        )
    419 {
    420   if (channelConfig > 0)
    421   {
    422     /* Constant channel mapping must have
    423        been set during initialization. */
    424     if ( elType == ID_SCE
    425       || elType == ID_CPE
    426       || elType == ID_LFE )
    427     {
    428       *elMapping = pPce->elCounter;
    429       if (elList[pPce->elCounter] != elType) {
    430         /* Not in the list */
    431         if ( (channelConfig == 2) && (elType == ID_SCE) )
    432         { /* This scenario occurs with HE-AAC v2 streams of buggy encoders.
    433              Due to other decoder implementations decoding of these kind of streams is desired. */
    434           channelConfig = 1;
    435         } else {
    436           return 0;
    437         }
    438       }
    439       /* Assume all front channels */
    440       getImplicitAudioChannelTypeAndIndex(&chType[channelIdx], &chIndex[channelIdx], channelConfig, channelIdx);
    441       if (elType == ID_CPE) {
    442         chType[channelIdx+1] = chType[channelIdx];
    443         chIndex[channelIdx+1] = chIndex[channelIdx]+1;
    444       }
    445       pPce->elCounter++;
    446     }
    447     /* Accept all non-channel elements, too. */
    448     return 1;
    449   }
    450   else
    451   {
    452 #ifdef TP_PCE_ENABLE
    453     if (!pPce->isValid)
    454 #endif /* TP_PCE_ENABLE */
    455     {
    456       /* Implicit channel mapping. */
    457       if ( elType == ID_SCE
    458         || elType == ID_CPE
    459         || elType == ID_LFE )
    460       {
    461         /* Store all channel element IDs */
    462         elList[pPce->elCounter] = elType;
    463         *elMapping = pPce->elCounter++;
    464       }
    465     }
    466 #ifdef  TP_PCE_ENABLE
    467     else {
    468       /* Accept the additional channel(s), only if the tag is in the lists */
    469       int isCpe = 0, i;
    470       int cc = 0, fc = 0, sc = 0, bc = 0, lc = 0, ec = 0; /* Channel and element counters */
    471 
    472       switch (elType)
    473       {
    474       case ID_CPE:
    475         isCpe = 1;
    476       case ID_SCE:
    477         /* search in front channels */
    478         for (i = 0; i < pPce->NumFrontChannelElements; i++) {
    479           if (isCpe == pPce->FrontElementIsCpe[i] && pPce->FrontElementTagSelect[i] == tag) {
    480             chMapping[cc] = channelIdx;
    481             chType[cc] = ACT_FRONT;
    482             chIndex[cc] = fc;
    483             if (isCpe) {
    484               chMapping[cc+1] = channelIdx+1;
    485               chType[cc+1] = ACT_FRONT;
    486               chIndex[cc+1] = fc+1;
    487             }
    488             *elMapping = ec;
    489             return 1;
    490           }
    491           ec++;
    492           if (pPce->FrontElementIsCpe[i]) {
    493             cc+=2; fc+=2;
    494           } else {
    495             cc++; fc++;
    496           }
    497         }
    498         /* search in side channels */
    499         for (i = 0; i < pPce->NumSideChannelElements; i++) {
    500           if (isCpe == pPce->SideElementIsCpe[i] && pPce->SideElementTagSelect[i] == tag) {
    501             chMapping[cc] = channelIdx;
    502             chType[cc] = ACT_SIDE;
    503             chIndex[cc] = sc;
    504             if (isCpe) {
    505               chMapping[cc+1] = channelIdx+1;
    506               chType[cc+1] = ACT_SIDE;
    507               chIndex[cc+1] = sc+1;
    508             }
    509             *elMapping = ec;
    510             return 1;
    511           }
    512           ec++;
    513           if (pPce->SideElementIsCpe[i]) {
    514             cc+=2; sc+=2;
    515           } else {
    516             cc++; sc++;
    517           }
    518         }
    519         /* search in back channels */
    520         for (i = 0; i < pPce->NumBackChannelElements; i++) {
    521           if (isCpe == pPce->BackElementIsCpe[i] && pPce->BackElementTagSelect[i] == tag) {
    522             chMapping[cc] = channelIdx;
    523             chType[cc] = ACT_BACK;
    524             chIndex[cc] = bc;
    525             if (isCpe) {
    526               chMapping[cc+1] = channelIdx+1;
    527               chType[cc+1] = ACT_BACK;
    528               chIndex[cc+1] = bc+1;
    529             }
    530             *elMapping = ec;
    531             return 1;
    532           }
    533           ec++;
    534           if (pPce->BackElementIsCpe[i]) {
    535             cc+=2; bc+=2;
    536           } else {
    537             cc++; bc++;
    538           }
    539         }
    540         break;
    541 
    542       case ID_LFE:
    543         /* Initialize channel counter and element counter */
    544         cc = pPce->NumEffectiveChannels;
    545         ec = pPce->NumFrontChannelElements+ pPce->NumSideChannelElements + pPce->NumBackChannelElements;
    546         /* search in lfe channels */
    547         for (i = 0; i < pPce->NumLfeChannelElements; i++) {
    548           if ( pPce->LfeElementTagSelect[i] == tag ) {
    549             chMapping[cc] = channelIdx;
    550             *elMapping = ec;
    551             chType[cc] = ACT_LFE;
    552             chIndex[cc] = lc;
    553             return 1;
    554           }
    555           ec++;
    556           cc++;
    557           lc++;
    558         }
    559         break;
    560 
    561       /* Non audio elements */
    562       case ID_CCE:
    563         /* search in cce channels */
    564         for (i = 0; i < pPce->NumValidCcElements; i++) {
    565           if (pPce->ValidCcElementTagSelect[i] == tag) {
    566             return 1;
    567           }
    568         }
    569         break;
    570       case ID_DSE:
    571         /* search associated data elements */
    572         for (i = 0; i < pPce->NumAssocDataElements; i++) {
    573           if (pPce->AssocDataElementTagSelect[i] == tag) {
    574             return 1;
    575           }
    576         }
    577         break;
    578       default:
    579         return 0;
    580       }
    581       return 0;  /* not found in any list */
    582     }
    583 #endif /* TP_PCE_ENABLE */
    584   }
    585 
    586   return 1;
    587 }
    588 
    589 #ifdef  TP_PCE_ENABLE
    590 int CProgramConfig_GetElementTable(
    591         const CProgramConfig *pPce,
    592         MP4_ELEMENT_ID  elList[],
    593         const INT elListSize
    594        )
    595 {
    596   int i, el = 0;
    597 
    598   if ( elListSize
    599     < pPce->NumFrontChannelElements + pPce->NumSideChannelElements + pPce->NumBackChannelElements + pPce->NumLfeChannelElements
    600     )
    601   {
    602     return 0;
    603   }
    604 
    605   for (i=0; i < pPce->NumFrontChannelElements; i++)
    606   {
    607     elList[el++] = (pPce->FrontElementIsCpe[i]) ?  ID_CPE : ID_SCE;
    608   }
    609 
    610   for (i=0; i < pPce->NumSideChannelElements; i++)
    611   {
    612     elList[el++] = (pPce->SideElementIsCpe[i]) ?  ID_CPE : ID_SCE;
    613   }
    614 
    615   for (i=0; i < pPce->NumBackChannelElements; i++)
    616   {
    617     elList[el++] = (pPce->BackElementIsCpe[i]) ?  ID_CPE : ID_SCE;
    618   }
    619 
    620   for (i=0; i < pPce->NumLfeChannelElements; i++)
    621   {
    622     elList[el++] = ID_LFE;
    623   }
    624 
    625 
    626   return el;
    627 }
    628 #endif
    629 
    630 static AUDIO_OBJECT_TYPE getAOT(HANDLE_FDK_BITSTREAM bs)
    631 {
    632   int tmp = 0;
    633 
    634   tmp = FDKreadBits(bs,5);
    635   if (tmp == AOT_ESCAPE) {
    636     int tmp2 = FDKreadBits(bs,6);
    637     tmp = 32 + tmp2;
    638   }
    639 
    640   return (AUDIO_OBJECT_TYPE)tmp;
    641 }
    642 
    643 static INT getSampleRate(HANDLE_FDK_BITSTREAM bs, UCHAR *index, int nBits)
    644 {
    645   INT sampleRate;
    646   int idx;
    647 
    648   idx = FDKreadBits(bs, nBits);
    649   if( idx == (1<<nBits)-1 ) {
    650     if(FDKgetValidBits(bs) < 24) {
    651       return 0;
    652     }
    653     sampleRate = FDKreadBits(bs,24);
    654   } else {
    655     sampleRate = SamplingRateTable[idx];
    656   }
    657 
    658   *index = idx;
    659 
    660   return sampleRate;
    661 }
    662 
    663 #ifdef TP_GA_ENABLE
    664 static
    665 TRANSPORTDEC_ERROR GaSpecificConfig_Parse( CSGaSpecificConfig    *self,
    666                                            CSAudioSpecificConfig *asc,
    667                                            HANDLE_FDK_BITSTREAM   bs,
    668                                            UINT                   ascStartAnchor )
    669 {
    670   TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
    671 
    672   self->m_frameLengthFlag = FDKreadBits(bs,1);
    673 
    674   self->m_dependsOnCoreCoder = FDKreadBits(bs,1);
    675 
    676   if( self->m_dependsOnCoreCoder )
    677     self->m_coreCoderDelay = FDKreadBits(bs,14);
    678 
    679   self->m_extensionFlag = FDKreadBits(bs,1);
    680 
    681   if( asc->m_channelConfiguration == 0 ) {
    682     CProgramConfig_Read(&asc->m_progrConfigElement, bs, ascStartAnchor);
    683   }
    684 
    685   if ((asc->m_aot == AOT_AAC_SCAL) || (asc->m_aot == AOT_ER_AAC_SCAL)) {
    686     self->m_layer = FDKreadBits(bs,3);
    687   }
    688 
    689   if (self->m_extensionFlag) {
    690     if (asc->m_aot == AOT_ER_BSAC) {
    691       self->m_numOfSubFrame = FDKreadBits(bs,5);
    692       self->m_layerLength   = FDKreadBits(bs,11);
    693     }
    694 
    695     if ((asc->m_aot == AOT_ER_AAC_LC)   || (asc->m_aot == AOT_ER_AAC_LTP)  ||
    696         (asc->m_aot == AOT_ER_AAC_SCAL) || (asc->m_aot == AOT_ER_AAC_LD))
    697     {
    698       asc->m_vcb11Flag = FDKreadBits(bs,1); /* aacSectionDataResilienceFlag */
    699       asc->m_rvlcFlag  = FDKreadBits(bs,1); /* aacScalefactorDataResilienceFlag */
    700       asc->m_hcrFlag   = FDKreadBits(bs,1); /* aacSpectralDataResilienceFlag */
    701     }
    702 
    703     self->m_extensionFlag3 = FDKreadBits(bs,1);
    704 
    705   }
    706   return (ErrorStatus);
    707 }
    708 #endif /* TP_GA_ENABLE */
    709 
    710 
    711 
    712 
    713 
    714 #ifdef TP_ELD_ENABLE
    715 
    716 static INT ld_sbr_header( const CSAudioSpecificConfig *asc,
    717                            HANDLE_FDK_BITSTREAM hBs,
    718                            CSTpCallBacks *cb )
    719 {
    720   const int channelConfiguration = asc->m_channelConfiguration;
    721   int i = 0;
    722   INT error = 0;
    723 
    724   if (channelConfiguration == 2) {
    725     error = cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++);
    726   } else {
    727     error = cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_SCE, i++);
    728   }
    729 
    730   switch ( channelConfiguration ) {
    731     case 7:
    732       error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++);
    733     case 6:
    734     case 5:
    735       error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++);
    736     case 3:
    737       error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++);
    738       break;
    739 
    740     case 4:
    741       error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++);
    742       error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_SCE, i++);
    743       break;
    744   }
    745 
    746   return error;
    747 }
    748 
    749 static
    750 TRANSPORTDEC_ERROR EldSpecificConfig_Parse(
    751         CSAudioSpecificConfig *asc,
    752         HANDLE_FDK_BITSTREAM hBs,
    753         CSTpCallBacks *cb
    754         )
    755 {
    756   TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
    757   CSEldSpecificConfig *esc = &asc->m_sc.m_eldSpecificConfig;
    758   ASC_ELD_EXT_TYPE eldExtType;
    759   int eldExtLen, len, cnt;
    760 
    761   FDKmemclear(esc, sizeof(CSEldSpecificConfig));
    762 
    763   esc->m_frameLengthFlag = FDKreadBits(hBs, 1 );
    764   if (esc->m_frameLengthFlag) {
    765     asc->m_samplesPerFrame = 480;
    766   } else {
    767     asc->m_samplesPerFrame = 512;
    768   }
    769 
    770   asc->m_vcb11Flag = FDKreadBits(hBs, 1 );
    771   asc->m_rvlcFlag  = FDKreadBits(hBs, 1 );
    772   asc->m_hcrFlag   = FDKreadBits(hBs, 1 );
    773 
    774   esc->m_sbrPresentFlag     = FDKreadBits(hBs, 1 );
    775 
    776   if (esc->m_sbrPresentFlag == 1) {
    777     esc->m_sbrSamplingRate    = FDKreadBits(hBs, 1 ); /* 0: single rate, 1: dual rate */
    778     esc->m_sbrCrcFlag         = FDKreadBits(hBs, 1 );
    779 
    780     asc->m_extensionSamplingFrequency = asc->m_samplingFrequency << esc->m_sbrSamplingRate;
    781 
    782     if (cb->cbSbr != NULL){
    783       if ( 0 != ld_sbr_header(asc, hBs, cb) ) {
    784         return TRANSPORTDEC_PARSE_ERROR;
    785       }
    786     }
    787   }
    788   esc->m_useLdQmfTimeAlign = 0;
    789 
    790   /* new ELD syntax */
    791   /* parse ExtTypeConfigData */
    792   while ((eldExtType = (ASC_ELD_EXT_TYPE)FDKreadBits(hBs, 4 )) != ELDEXT_TERM) {
    793     eldExtLen = len = FDKreadBits(hBs, 4 );
    794     if ( len == 0xf ) {
    795       len = FDKreadBits(hBs, 8 );
    796       eldExtLen += len;
    797 
    798       if ( len == 0xff ) {
    799         len = FDKreadBits(hBs, 16 );
    800         eldExtLen += len;
    801       }
    802     }
    803 
    804     switch (eldExtType) {
    805       case ELDEXT_LDSAC:
    806         esc->m_useLdQmfTimeAlign = 1;
    807         if (cb->cbSsc != NULL) {
    808           ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbSsc(
    809                   cb->cbSscData,
    810                   hBs,
    811                   asc->m_aot,
    812                   asc->m_samplingFrequency,
    813                   1,  /* muxMode */
    814                   len
    815                   );
    816         } else {
    817           ErrorStatus = TRANSPORTDEC_UNSUPPORTED_FORMAT;
    818         }
    819         if (ErrorStatus != TRANSPORTDEC_OK) {
    820           goto bail;
    821         }
    822         break;
    823       default:
    824         for(cnt=0; cnt<len; cnt++) {
    825           FDKreadBits(hBs, 8 );
    826         }
    827         break;
    828       /* add future eld extension configs here */
    829     }
    830   }
    831 bail:
    832   return (ErrorStatus);
    833 }
    834 #endif /* TP_ELD_ENABLE */
    835 
    836 
    837 static
    838 TRANSPORTDEC_ERROR AudioSpecificConfig_ExtensionParse(CSAudioSpecificConfig *self, HANDLE_FDK_BITSTREAM bs, CSTpCallBacks *cb)
    839 {
    840   TP_ASC_EXTENSION_ID  lastAscExt, ascExtId = ASCEXT_UNKOWN;
    841   INT  bitsAvailable = (INT)FDKgetValidBits(bs);
    842 
    843   while (bitsAvailable >= 11)
    844   {
    845     lastAscExt = ascExtId;
    846     ascExtId   = (TP_ASC_EXTENSION_ID)FDKreadBits(bs, 11);
    847     bitsAvailable -= 11;
    848 
    849     switch (ascExtId) {
    850     case ASCEXT_SBR:    /* 0x2b7 */
    851       if ( (self->m_extensionAudioObjectType != AOT_SBR) && (bitsAvailable >= 5) ) {
    852         self->m_extensionAudioObjectType = getAOT(bs);
    853 
    854         if ( (self->m_extensionAudioObjectType == AOT_SBR)
    855           || (self->m_extensionAudioObjectType == AOT_ER_BSAC) )
    856         { /* Get SBR extension configuration */
    857           self->m_sbrPresentFlag = FDKreadBits(bs, 1);
    858           bitsAvailable -= 1;
    859 
    860           if ( self->m_sbrPresentFlag == 1 ) {
    861             self->m_extensionSamplingFrequency = getSampleRate(bs, &self->m_extensionSamplingFrequencyIndex, 4);
    862 
    863             if ((INT)self->m_extensionSamplingFrequency <= 0) {
    864               return TRANSPORTDEC_PARSE_ERROR;
    865             }
    866           }
    867           if ( self->m_extensionAudioObjectType == AOT_ER_BSAC ) {
    868             self->m_extensionChannelConfiguration = FDKreadBits(bs, 4);
    869             bitsAvailable -= 4;
    870           }
    871         }
    872         /* Update counter because of variable length fields (AOT and sampling rate) */
    873         bitsAvailable = (INT)FDKgetValidBits(bs);
    874       }
    875       break;
    876     case ASCEXT_PS:     /* 0x548 */
    877       if ( (lastAscExt == ASCEXT_SBR)
    878         && (self->m_extensionAudioObjectType == AOT_SBR)
    879         && (bitsAvailable > 0) )
    880       { /* Get PS extension configuration */
    881         self->m_psPresentFlag = FDKreadBits(bs, 1);
    882         bitsAvailable -= 1;
    883       }
    884       break;
    885     default:
    886       /* Just ignore anything. */
    887       return TRANSPORTDEC_OK;
    888     }
    889   }
    890 
    891   return TRANSPORTDEC_OK;
    892 }
    893 
    894 /*
    895  * API Functions
    896  */
    897 
    898 void AudioSpecificConfig_Init(CSAudioSpecificConfig *asc)
    899 {
    900   FDKmemclear(asc, sizeof(CSAudioSpecificConfig));
    901 
    902   /* Init all values that should not be zero. */
    903   asc->m_aot                    = AOT_NONE;
    904   asc->m_samplingFrequencyIndex = 0xf;
    905   asc->m_epConfig               = -1;
    906   asc->m_extensionAudioObjectType        = AOT_NULL_OBJECT;
    907 #ifdef TP_PCE_ENABLE
    908   CProgramConfig_Init(&asc->m_progrConfigElement);
    909 #endif
    910 }
    911 
    912 TRANSPORTDEC_ERROR AudioSpecificConfig_Parse(
    913         CSAudioSpecificConfig *self,
    914         HANDLE_FDK_BITSTREAM   bs,
    915         int                    fExplicitBackwardCompatible,
    916         CSTpCallBacks      *cb
    917         )
    918 {
    919   TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
    920   UINT ascStartAnchor = FDKgetValidBits(bs);
    921   int frameLengthFlag = -1;
    922 
    923   AudioSpecificConfig_Init(self);
    924 
    925   self->m_aot = getAOT(bs);
    926   self->m_samplingFrequency = getSampleRate(bs, &self->m_samplingFrequencyIndex, 4);
    927   if (self->m_samplingFrequency <= 0) {
    928     return TRANSPORTDEC_PARSE_ERROR;
    929   }
    930 
    931   self->m_channelConfiguration = FDKreadBits(bs,4);
    932 
    933   /* SBR extension ( explicit non-backwards compatible mode ) */
    934   self->m_sbrPresentFlag = 0;
    935   self->m_psPresentFlag  = 0;
    936 
    937   if ( self->m_aot == AOT_SBR || self->m_aot == AOT_PS ) {
    938     self->m_extensionAudioObjectType = AOT_SBR;
    939 
    940     self->m_sbrPresentFlag = 1;
    941     if ( self->m_aot == AOT_PS ) {
    942       self->m_psPresentFlag = 1;
    943     }
    944 
    945     self->m_extensionSamplingFrequency = getSampleRate(bs, &self->m_extensionSamplingFrequencyIndex, 4);
    946     self->m_aot = getAOT(bs);
    947 
    948   } else {
    949     self->m_extensionAudioObjectType = AOT_NULL_OBJECT;
    950   }
    951 
    952   /* Parse whatever specific configs */
    953   switch (self->m_aot)
    954   {
    955 #ifdef TP_GA_ENABLE
    956     case AOT_AAC_LC:
    957     case AOT_ER_AAC_LC:
    958     case AOT_ER_AAC_LD:
    959     case AOT_ER_AAC_SCAL:
    960     case AOT_ER_BSAC:
    961       if ((ErrorStatus = GaSpecificConfig_Parse(&self->m_sc.m_gaSpecificConfig, self, bs, ascStartAnchor)) != TRANSPORTDEC_OK ) {
    962         return (ErrorStatus);
    963       }
    964       frameLengthFlag = self->m_sc.m_gaSpecificConfig.m_frameLengthFlag;
    965       break;
    966 #endif /* TP_GA_ENABLE */
    967     case AOT_MPEGS:
    968       if (cb->cbSsc != NULL) {
    969         cb->cbSsc(
    970                 cb->cbSscData,
    971                 bs,
    972                 self->m_aot,
    973                 self->m_samplingFrequency,
    974                 1,
    975                 0  /* don't know the length */
    976                 );
    977       } else {
    978         return TRANSPORTDEC_UNSUPPORTED_FORMAT;
    979       }
    980       break;
    981 #ifdef TP_ELD_ENABLE
    982     case AOT_ER_AAC_ELD:
    983       if ((ErrorStatus = EldSpecificConfig_Parse(self, bs, cb)) != TRANSPORTDEC_OK ) {
    984         return (ErrorStatus);
    985       }
    986       frameLengthFlag = self->m_sc.m_eldSpecificConfig.m_frameLengthFlag;
    987       self->m_sbrPresentFlag = self->m_sc.m_eldSpecificConfig.m_sbrPresentFlag;
    988       self->m_extensionSamplingFrequency = (self->m_sc.m_eldSpecificConfig.m_sbrSamplingRate+1) * self->m_samplingFrequency;
    989       break;
    990 #endif /* TP_ELD_ENABLE */
    991 
    992     default:
    993       return TRANSPORTDEC_UNSUPPORTED_FORMAT;
    994       break;
    995   }
    996 
    997   /* Frame length */
    998   switch (self->m_aot)
    999   {
   1000 #if defined(TP_GA_ENABLE) || defined(TP_USAC_ENABLE)
   1001     case AOT_AAC_LC:
   1002     case AOT_ER_AAC_LC:
   1003     case AOT_ER_AAC_SCAL:
   1004     case AOT_ER_BSAC:
   1005     /*case AOT_USAC:*/
   1006       if (!frameLengthFlag)
   1007         self->m_samplesPerFrame = 1024;
   1008       else
   1009         self->m_samplesPerFrame = 960;
   1010       break;
   1011 #endif /* TP_GA_ENABLE */
   1012 #if defined(TP_GA_ENABLE)
   1013     case AOT_ER_AAC_LD:
   1014       if (!frameLengthFlag)
   1015         self->m_samplesPerFrame = 512;
   1016       else
   1017         self->m_samplesPerFrame = 480;
   1018       break;
   1019 #endif /* defined(TP_GA_ENABLE) */
   1020     default:
   1021       break;
   1022   }
   1023 
   1024   switch (self->m_aot)
   1025   {
   1026     case AOT_ER_AAC_LC:
   1027     case AOT_ER_AAC_LD:
   1028     case AOT_ER_AAC_ELD:
   1029     case AOT_ER_AAC_SCAL:
   1030     case AOT_ER_CELP:
   1031     case AOT_ER_HVXC:
   1032     case AOT_ER_BSAC:
   1033       self->m_epConfig = FDKreadBits(bs,2);
   1034 
   1035       if (self->m_epConfig > 1) {
   1036         return TRANSPORTDEC_UNSUPPORTED_FORMAT; // EPCONFIG;
   1037       }
   1038       break;
   1039     default:
   1040       break;
   1041   }
   1042 
   1043   if (fExplicitBackwardCompatible) {
   1044     ErrorStatus = AudioSpecificConfig_ExtensionParse(self, bs, cb);
   1045   }
   1046 
   1047   return (ErrorStatus);
   1048 }
   1049 
   1050 
   1051