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 - 2015 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 /*!
     85   \file
     86   \brief  Envelope extraction
     87   The functions provided by this module are mostly called by applySBR(). After it is
     88   determined that there is valid SBR data, sbrGetHeaderData() might be called if the current
     89   SBR data contains an \ref SBR_HEADER_ELEMENT as opposed to a \ref SBR_STANDARD_ELEMENT. This function
     90   may return various error codes as defined in #SBR_HEADER_STATUS . Most importantly it returns HEADER_RESET when decoder
     91   settings need to be recalculated according to the SBR specifications. In that case applySBR()
     92   will initiatite the required re-configuration.
     93 
     94   The header data is stored in a #SBR_HEADER_DATA structure.
     95 
     96   The actual SBR data for the current frame is decoded into SBR_FRAME_DATA stuctures by sbrGetChannelPairElement()
     97   [for stereo streams] and sbrGetSingleChannelElement() [for mono streams]. There is no fractional arithmetic involved.
     98 
     99   Once the information is extracted, the data needs to be further prepared before the actual decoding process.
    100   This is done in decodeSbrData().
    101 
    102   \sa Description of buffer management in applySBR(). \ref documentationOverview
    103 
    104   <h1>About the SBR data format:</h1>
    105 
    106   Each frame includes SBR data (side chain information), and can be either the \ref SBR_HEADER_ELEMENT or the \ref SBR_STANDARD_ELEMENT.
    107   Parts of the data can be protected by a CRC checksum.
    108 
    109   \anchor SBR_HEADER_ELEMENT <h2>The SBR_HEADER_ELEMENT</h2>
    110 
    111   The SBR_HEADER_ELEMENT can be transmitted with every frame, however, it typically is send every second or so. It contains fundamental
    112   information such as SBR sampling frequency and frequency range as well as control signals that do not require frequent changes. It also
    113   includes the \ref SBR_STANDARD_ELEMENT.
    114 
    115   Depending on the changes between the information in a current SBR_HEADER_ELEMENT and the previous SBR_HEADER_ELEMENT, the SBR decoder might need
    116   to be reset and reconfigured (e.g. new tables need to be calculated).
    117 
    118   \anchor SBR_STANDARD_ELEMENT <h2>The SBR_STANDARD_ELEMENT</h2>
    119 
    120   This data can be subdivided into "side info" and "raw data", where side info is defined as signals needed to decode the raw data
    121   and some decoder tuning signals. Raw data is referred to as PCM and Huffman coded envelope and noise floor estimates. The side info also
    122   includes information about the time-frequency grid for the current frame.
    123 
    124   \sa \ref documentationOverview
    125 */
    126 
    127 #include "env_extr.h"
    128 
    129 #include "sbr_ram.h"
    130 #include "sbr_rom.h"
    131 #include "huff_dec.h"
    132 
    133 
    134 #include "psbitdec.h"
    135 
    136 #define DRM_PARAMETRIC_STEREO   0
    137 #define EXTENSION_ID_PS_CODING  2
    138 
    139 
    140 static int extractFrameInfo (HANDLE_FDK_BITSTREAM   hBs,
    141                              HANDLE_SBR_HEADER_DATA hHeaderData,
    142                              HANDLE_SBR_FRAME_DATA  h_frame_data,
    143                              const UINT             nrOfChannels,
    144                              const UINT             flags
    145                             );
    146 
    147 
    148 static int sbrGetEnvelope (HANDLE_SBR_HEADER_DATA hHeaderData,
    149                            HANDLE_SBR_FRAME_DATA  h_frame_data,
    150                            HANDLE_FDK_BITSTREAM   hBs,
    151                            const UINT flags);
    152 
    153 static void sbrGetDirectionControlData (HANDLE_SBR_FRAME_DATA hFrameData,
    154                                         HANDLE_FDK_BITSTREAM hBs);
    155 
    156 static void sbrGetNoiseFloorData (HANDLE_SBR_HEADER_DATA hHeaderData,
    157                                   HANDLE_SBR_FRAME_DATA  h_frame_data,
    158                                   HANDLE_FDK_BITSTREAM   hBs);
    159 
    160 static int checkFrameInfo (FRAME_INFO *pFrameInfo, int numberOfTimeSlots, int overlap, int timeStep);
    161 
    162 SBR_ERROR
    163 initHeaderData (
    164         HANDLE_SBR_HEADER_DATA  hHeaderData,
    165         const int               sampleRateIn,
    166         const int               sampleRateOut,
    167         const int               samplesPerFrame,
    168         const UINT              flags
    169         )
    170 {
    171   HANDLE_FREQ_BAND_DATA hFreq = &hHeaderData->freqBandData;
    172   SBR_ERROR sbrError = SBRDEC_OK;
    173   int numAnalysisBands;
    174 
    175   if ( sampleRateIn == sampleRateOut ) {
    176     hHeaderData->sbrProcSmplRate = sampleRateOut<<1;
    177     numAnalysisBands = 32;
    178   } else {
    179     hHeaderData->sbrProcSmplRate = sampleRateOut;
    180     if ( (sampleRateOut>>1) == sampleRateIn) {
    181       /* 1:2 */
    182       numAnalysisBands = 32;
    183     } else if ( (sampleRateOut>>2) == sampleRateIn ) {
    184       /* 1:4 */
    185       numAnalysisBands = 32;
    186     } else if ( (sampleRateOut*3)>>3 == (sampleRateIn*8)>>3 ) {
    187       /* 3:8, 3/4 core frame length */
    188       numAnalysisBands = 24;
    189     } else {
    190       sbrError = SBRDEC_UNSUPPORTED_CONFIG;
    191       goto bail;
    192     }
    193   }
    194 
    195   /* Fill in default values first */
    196   hHeaderData->syncState          = SBR_NOT_INITIALIZED;
    197   hHeaderData->status             = 0;
    198   hHeaderData->frameErrorFlag     = 0;
    199 
    200   hHeaderData->bs_info.ampResolution     = 1;
    201   hHeaderData->bs_info.xover_band        = 0;
    202   hHeaderData->bs_info.sbr_preprocessing = 0;
    203 
    204   hHeaderData->bs_data.startFreq       = 5;
    205   hHeaderData->bs_data.stopFreq        = 0;
    206   hHeaderData->bs_data.freqScale       = 2;
    207   hHeaderData->bs_data.alterScale      = 1;
    208   hHeaderData->bs_data.noise_bands     = 2;
    209   hHeaderData->bs_data.limiterBands    = 2;
    210   hHeaderData->bs_data.limiterGains    = 2;
    211   hHeaderData->bs_data.interpolFreq    = 1;
    212   hHeaderData->bs_data.smoothingLength = 1;
    213 
    214   hHeaderData->timeStep = (flags & SBRDEC_ELD_GRID) ? 1 : 2;
    215 
    216   /* Setup pointers to frequency band tables */
    217   hFreq->freqBandTable[0]  = hFreq->freqBandTableLo;
    218   hFreq->freqBandTable[1] = hFreq->freqBandTableHi;
    219 
    220   /* Patch some entries */
    221   if (sampleRateOut > 24000) {    /* Trigger an error if SBR is going to be processed without     */
    222     hHeaderData->bs_data.startFreq = 7;   /*   having read these frequency values from bit stream before. */
    223     hHeaderData->bs_data.stopFreq  = 3;
    224   }
    225 
    226   /* One SBR timeslot corresponds to the amount of samples equal to the amount of analysis bands, divided by the timestep. */
    227   hHeaderData->numberTimeSlots = (samplesPerFrame/numAnalysisBands) >> (hHeaderData->timeStep - 1);
    228   if (hHeaderData->numberTimeSlots > (16)) {
    229     sbrError = SBRDEC_UNSUPPORTED_CONFIG;
    230   }
    231 
    232   hHeaderData->numberOfAnalysisBands = numAnalysisBands;
    233 
    234 bail:
    235   return sbrError;
    236 }
    237 
    238 
    239 /*!
    240   \brief   Initialize the SBR_PREV_FRAME_DATA struct
    241 */
    242 void
    243 initSbrPrevFrameData (HANDLE_SBR_PREV_FRAME_DATA h_prev_data, /*!< handle to struct SBR_PREV_FRAME_DATA */
    244                       int timeSlots)                          /*!< Framelength in SBR-timeslots */
    245 {
    246   int i;
    247 
    248   /* Set previous energy and noise levels to 0 for the case
    249      that decoding starts in the middle of a bitstream */
    250   for (i=0; i < MAX_FREQ_COEFFS; i++)
    251     h_prev_data->sfb_nrg_prev[i] = (FIXP_DBL)0;
    252   for (i=0; i < MAX_NOISE_COEFFS; i++)
    253     h_prev_data->prevNoiseLevel[i] = (FIXP_DBL)0;
    254   for (i=0; i < MAX_INVF_BANDS; i++)
    255     h_prev_data->sbr_invf_mode[i] = INVF_OFF;
    256 
    257   h_prev_data->stopPos = timeSlots;
    258   h_prev_data->coupling = COUPLING_OFF;
    259   h_prev_data->ampRes = 0;
    260 }
    261 
    262 
    263 /*!
    264   \brief   Read header data from bitstream
    265 
    266   \return  error status - 0 if ok
    267 */
    268 SBR_HEADER_STATUS
    269 sbrGetHeaderData (HANDLE_SBR_HEADER_DATA hHeaderData,
    270                   HANDLE_FDK_BITSTREAM   hBs,
    271                   const UINT             flags,
    272                   const int              fIsSbrData)
    273 {
    274   SBR_HEADER_DATA_BS *pBsData;
    275   SBR_HEADER_DATA_BS lastHeader;
    276   SBR_HEADER_DATA_BS_INFO lastInfo;
    277   int headerExtra1=0, headerExtra2=0;
    278 
    279   /* Copy SBR bit stream header to temporary header */
    280   lastHeader = hHeaderData->bs_data;
    281   lastInfo   = hHeaderData->bs_info;
    282 
    283   /* Read new header from bitstream */
    284   {
    285     pBsData = &hHeaderData->bs_data;
    286   }
    287 
    288   {
    289     hHeaderData->bs_info.ampResolution = FDKreadBits (hBs, 1);
    290   }
    291 
    292   pBsData->startFreq = FDKreadBits (hBs, 4);
    293   pBsData->stopFreq = FDKreadBits (hBs, 4);
    294 
    295   {
    296     hHeaderData->bs_info.xover_band = FDKreadBits (hBs, 3);
    297     FDKreadBits (hBs, 2);
    298   }
    299 
    300   headerExtra1 = FDKreadBits (hBs, 1);
    301   headerExtra2 = FDKreadBits (hBs, 1);
    302 
    303   /* Handle extra header information */
    304   if( headerExtra1)
    305   {
    306     pBsData->freqScale = FDKreadBits (hBs, 2);
    307     pBsData->alterScale = FDKreadBits (hBs, 1);
    308     pBsData->noise_bands = FDKreadBits (hBs, 2);
    309   }
    310   else {
    311     pBsData->freqScale   = 2;
    312     pBsData->alterScale  = 1;
    313     pBsData->noise_bands = 2;
    314   }
    315 
    316   if (headerExtra2) {
    317     pBsData->limiterBands = FDKreadBits (hBs, 2);
    318     pBsData->limiterGains = FDKreadBits (hBs, 2);
    319     pBsData->interpolFreq = FDKreadBits (hBs, 1);
    320     pBsData->smoothingLength = FDKreadBits (hBs, 1);
    321   }
    322   else {
    323     pBsData->limiterBands    = 2;
    324     pBsData->limiterGains    = 2;
    325     pBsData->interpolFreq    = 1;
    326     pBsData->smoothingLength = 1;
    327   }
    328 
    329   /* Look for new settings. IEC 14496-3, 4.6.18.3.1 */
    330   if(hHeaderData->syncState < SBR_HEADER ||
    331      lastHeader.startFreq   != pBsData->startFreq   ||
    332      lastHeader.stopFreq    != pBsData->stopFreq    ||
    333      lastHeader.freqScale   != pBsData->freqScale   ||
    334      lastHeader.alterScale  != pBsData->alterScale  ||
    335      lastHeader.noise_bands != pBsData->noise_bands ||
    336      lastInfo.xover_band    != hHeaderData->bs_info.xover_band) {
    337     return HEADER_RESET; /* New settings */
    338   }
    339 
    340   return HEADER_OK;
    341 }
    342 
    343 /*!
    344   \brief   Get missing harmonics parameters (only used for AAC+SBR)
    345 
    346   \return  error status - 0 if ok
    347 */
    348 int
    349 sbrGetSyntheticCodedData(HANDLE_SBR_HEADER_DATA hHeaderData,
    350                          HANDLE_SBR_FRAME_DATA  hFrameData,
    351                          HANDLE_FDK_BITSTREAM   hBs)
    352 {
    353   int i, bitsRead = 0;
    354 
    355   int flag = FDKreadBits(hBs,1);
    356   bitsRead++;
    357 
    358   if(flag){
    359     for(i=0;i<hHeaderData->freqBandData.nSfb[1];i++){
    360       hFrameData->addHarmonics[i]  = FDKreadBits (hBs, 1 );
    361       bitsRead++;
    362     }
    363   }
    364   else {
    365     for(i=0; i<MAX_FREQ_COEFFS; i++)
    366       hFrameData->addHarmonics[i]  = 0;
    367   }
    368   return(bitsRead);
    369 }
    370 
    371 /*!
    372   \brief      Reads extension data from the bitstream
    373 
    374   The bitstream format allows up to 4 kinds of extended data element.
    375   Extended data may contain several elements, each identified by a 2-bit-ID.
    376   So far, no extended data elements are defined hence the first 2 parameters
    377   are unused. The data should be skipped in order to update the number
    378   of read bits for the consistency check in applySBR().
    379 */
    380 static int  extractExtendedData(
    381                                 HANDLE_SBR_HEADER_DATA hHeaderData,    /*!< handle to SBR header */
    382                                 HANDLE_FDK_BITSTREAM   hBs             /*!< Handle to the bit buffer */
    383                                ,HANDLE_PS_DEC hParametricStereoDec     /*!< Parametric Stereo Decoder */
    384                                 ) {
    385   INT nBitsLeft;
    386   int extended_data;
    387   int i, frameOk = 1;
    388 
    389 
    390   extended_data = FDKreadBits(hBs, 1);
    391 
    392   if (extended_data) {
    393     int cnt;
    394     int bPsRead = 0;
    395 
    396     cnt = FDKreadBits(hBs, 4);
    397     if (cnt == (1<<4)-1)
    398       cnt += FDKreadBits(hBs, 8);
    399 
    400 
    401     nBitsLeft = 8 * cnt;
    402 
    403     /* sanity check for cnt */
    404     if (nBitsLeft > (INT)FDKgetValidBits(hBs)) {
    405       /* limit nBitsLeft */
    406       nBitsLeft = (INT)FDKgetValidBits(hBs);
    407       /* set frame error */
    408       frameOk = 0;
    409     }
    410 
    411     while (nBitsLeft > 7) {
    412       int extension_id = FDKreadBits(hBs, 2);
    413       nBitsLeft -= 2;
    414 
    415       switch(extension_id) {
    416 
    417 
    418 
    419         case EXTENSION_ID_PS_CODING:
    420 
    421         /* Read PS data from bitstream */
    422 
    423         if (hParametricStereoDec != NULL) {
    424           if(bPsRead && !hParametricStereoDec->bsData[hParametricStereoDec->bsReadSlot].mpeg.bPsHeaderValid) {
    425             cnt = nBitsLeft >> 3; /* number of remaining bytes */
    426             for (i=0; i<cnt; i++)
    427               FDKreadBits(hBs, 8);
    428             nBitsLeft -= cnt * 8;
    429           } else {
    430             nBitsLeft -= ReadPsData(hParametricStereoDec, hBs, nBitsLeft);
    431             bPsRead = 1;
    432           }
    433         }
    434 
    435           /* parametric stereo detected, could set channelMode accordingly here  */
    436           /*                                                                     */
    437           /* "The usage of this parametric stereo extension to HE-AAC is         */
    438           /* signalled implicitly in the bitstream. Hence, if an sbr_extension() */
    439           /* with bs_extension_id==EXTENSION_ID_PS is found in the SBR part of   */
    440           /* the bitstream, a decoder supporting the combination of SBR and PS   */
    441           /* shall operate the PS tool to generate a stereo output signal."      */
    442           /* source: ISO/IEC 14496-3:2001/FDAM 2:2004(E)                         */
    443 
    444         break;
    445 
    446 
    447       default:
    448         cnt = nBitsLeft >> 3; /* number of remaining bytes */
    449         for (i=0; i<cnt; i++)
    450           FDKreadBits(hBs, 8);
    451         nBitsLeft -= cnt * 8;
    452         break;
    453       }
    454     }
    455 
    456     if (nBitsLeft < 0) {
    457       frameOk = 0;
    458       goto bail;
    459     }
    460     else {
    461       /* Read fill bits for byte alignment */
    462       FDKreadBits(hBs, nBitsLeft);
    463     }
    464   }
    465 
    466 bail:
    467   return (frameOk);
    468 }
    469 
    470 
    471 /*!
    472   \brief   Read bitstream elements of one channel
    473 
    474   \return  SbrFrameOK:  1=ok, 0=error
    475 */
    476 int
    477 sbrGetSingleChannelElement (HANDLE_SBR_HEADER_DATA hHeaderData,          /*!< Static control data */
    478                             HANDLE_SBR_FRAME_DATA  hFrameData,           /*!< Control data of current frame */
    479                             HANDLE_FDK_BITSTREAM   hBs,                  /*!< Handle to struct BIT_BUF */
    480                             HANDLE_PS_DEC          hParametricStereoDec, /*!< Handle to PS decoder */
    481                             const UINT             flags,
    482                             const int              overlap
    483                            )
    484 {
    485   int i;
    486 
    487 
    488   hFrameData->coupling = COUPLING_OFF;
    489 
    490   {
    491     /* Reserved bits */
    492     if (FDKreadBits(hBs, 1)) {  /* bs_data_extra */
    493       FDKreadBits(hBs, 4);
    494       if (flags & SBRDEC_SYNTAX_SCAL) {
    495         FDKreadBits(hBs, 4);
    496       }
    497     }
    498   }
    499 
    500   if (flags & SBRDEC_SYNTAX_SCAL) {
    501     FDKreadBits (hBs, 1);     /* bs_coupling */
    502   }
    503 
    504   /*
    505     Grid control
    506   */
    507   if ( !extractFrameInfo ( hBs, hHeaderData, hFrameData, 1, flags) )
    508    return 0;
    509 
    510   if ( !checkFrameInfo (&hFrameData->frameInfo, hHeaderData->numberTimeSlots, overlap, hHeaderData->timeStep) )
    511     return 0;
    512 
    513 
    514   /*
    515     Fetch domain vectors (time or frequency direction for delta-coding)
    516   */
    517   sbrGetDirectionControlData (hFrameData, hBs);
    518 
    519   for (i=0; i<hHeaderData->freqBandData.nInvfBands; i++) {
    520     hFrameData->sbr_invf_mode[i] =
    521       (INVF_MODE) FDKreadBits (hBs, 2);
    522   }
    523 
    524 
    525 
    526   /* raw data */
    527   if ( !sbrGetEnvelope (hHeaderData, hFrameData, hBs, flags) )
    528     return 0;
    529 
    530 
    531   sbrGetNoiseFloorData (hHeaderData, hFrameData, hBs);
    532 
    533   sbrGetSyntheticCodedData(hHeaderData, hFrameData, hBs);
    534 
    535   {
    536     /* sbr extended data */
    537     if (! extractExtendedData(
    538                                hHeaderData,
    539                                hBs
    540                               ,hParametricStereoDec
    541                                )) {
    542       return 0;
    543     }
    544   }
    545 
    546   return 1;
    547 }
    548 
    549 
    550 
    551 /*!
    552   \brief      Read bitstream elements of a channel pair
    553   \return     SbrFrameOK
    554 */
    555 int
    556 sbrGetChannelPairElement (HANDLE_SBR_HEADER_DATA hHeaderData,    /*!< Static control data */
    557                           HANDLE_SBR_FRAME_DATA  hFrameDataLeft, /*!< Dynamic control data for first channel */
    558                           HANDLE_SBR_FRAME_DATA  hFrameDataRight,/*!< Dynamic control data for second channel */
    559                           HANDLE_FDK_BITSTREAM   hBs,            /*!< handle to struct BIT_BUF */
    560                           const UINT flags,
    561                           const int overlap )
    562 {
    563   int i, bit;
    564 
    565 
    566   /* Reserved bits */
    567   if (FDKreadBits(hBs, 1)) {  /* bs_data_extra */
    568     FDKreadBits(hBs, 4);
    569     FDKreadBits(hBs, 4);
    570   }
    571 
    572   /* Read coupling flag */
    573   bit = FDKreadBits (hBs, 1);
    574 
    575   if (bit) {
    576     hFrameDataLeft->coupling = COUPLING_LEVEL;
    577     hFrameDataRight->coupling = COUPLING_BAL;
    578   }
    579   else {
    580     hFrameDataLeft->coupling = COUPLING_OFF;
    581     hFrameDataRight->coupling = COUPLING_OFF;
    582   }
    583 
    584 
    585   /*
    586     Grid control
    587   */
    588   if ( !extractFrameInfo (hBs, hHeaderData, hFrameDataLeft, 2, flags) )
    589     return 0;
    590 
    591   if ( !checkFrameInfo (&hFrameDataLeft->frameInfo, hHeaderData->numberTimeSlots, overlap, hHeaderData->timeStep) )
    592     return 0;
    593 
    594   if (hFrameDataLeft->coupling) {
    595     FDKmemcpy (&hFrameDataRight->frameInfo, &hFrameDataLeft->frameInfo, sizeof(FRAME_INFO));
    596     hFrameDataRight->ampResolutionCurrentFrame = hFrameDataLeft->ampResolutionCurrentFrame;
    597   }
    598   else {
    599     if ( !extractFrameInfo (hBs, hHeaderData, hFrameDataRight, 2, flags) )
    600       return 0;
    601 
    602     if ( !checkFrameInfo (&hFrameDataRight->frameInfo, hHeaderData->numberTimeSlots, overlap, hHeaderData->timeStep) )
    603       return 0;
    604   }
    605 
    606   /*
    607     Fetch domain vectors (time or frequency direction for delta-coding)
    608   */
    609   sbrGetDirectionControlData (hFrameDataLeft, hBs);
    610   sbrGetDirectionControlData (hFrameDataRight, hBs);
    611 
    612   for (i=0; i<hHeaderData->freqBandData.nInvfBands; i++) {
    613     hFrameDataLeft->sbr_invf_mode[i] = (INVF_MODE) FDKreadBits (hBs, 2);
    614   }
    615 
    616   if (hFrameDataLeft->coupling) {
    617     for (i=0; i<hHeaderData->freqBandData.nInvfBands; i++) {
    618       hFrameDataRight->sbr_invf_mode[i] = hFrameDataLeft->sbr_invf_mode[i];
    619     }
    620 
    621 
    622     if ( !sbrGetEnvelope (hHeaderData, hFrameDataLeft, hBs, flags) ) {
    623       return 0;
    624     }
    625 
    626     sbrGetNoiseFloorData (hHeaderData, hFrameDataLeft, hBs);
    627 
    628     if ( !sbrGetEnvelope (hHeaderData, hFrameDataRight, hBs, flags) ) {
    629       return 0;
    630     }
    631   }
    632   else {
    633 
    634     for (i=0; i<hHeaderData->freqBandData.nInvfBands; i++) {
    635       hFrameDataRight->sbr_invf_mode[i] = (INVF_MODE) FDKreadBits (hBs, 2);
    636     }
    637 
    638 
    639 
    640     if ( !sbrGetEnvelope (hHeaderData, hFrameDataLeft, hBs, flags) )
    641       return 0;
    642 
    643     if ( !sbrGetEnvelope (hHeaderData, hFrameDataRight, hBs, flags) )
    644       return 0;
    645 
    646     sbrGetNoiseFloorData (hHeaderData, hFrameDataLeft, hBs);
    647 
    648   }
    649   sbrGetNoiseFloorData (hHeaderData, hFrameDataRight, hBs);
    650 
    651   sbrGetSyntheticCodedData(hHeaderData, hFrameDataLeft, hBs);
    652   sbrGetSyntheticCodedData(hHeaderData, hFrameDataRight, hBs);
    653 
    654   {
    655     if (! extractExtendedData(
    656                                hHeaderData,
    657                                hBs
    658                               ,NULL
    659                              ) ) {
    660       return 0;
    661     }
    662   }
    663 
    664   return 1;
    665 }
    666 
    667 
    668 
    669 
    670 /*!
    671   \brief   Read direction control data from bitstream
    672 */
    673 void
    674 sbrGetDirectionControlData (HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */
    675                             HANDLE_FDK_BITSTREAM  hBs)          /*!< handle to struct BIT_BUF */
    676 {
    677   int i;
    678 
    679   for (i = 0; i < h_frame_data->frameInfo.nEnvelopes; i++) {
    680     h_frame_data->domain_vec[i] = FDKreadBits (hBs, 1);
    681   }
    682 
    683   for (i = 0; i < h_frame_data->frameInfo.nNoiseEnvelopes; i++) {
    684     h_frame_data->domain_vec_noise[i] = FDKreadBits (hBs, 1);
    685   }
    686 }
    687 
    688 
    689 
    690 /*!
    691   \brief   Read noise-floor-level data from bitstream
    692 */
    693 void
    694 sbrGetNoiseFloorData (HANDLE_SBR_HEADER_DATA hHeaderData,  /*!< Static control data */
    695                       HANDLE_SBR_FRAME_DATA  h_frame_data, /*!< handle to struct SBR_FRAME_DATA */
    696                       HANDLE_FDK_BITSTREAM   hBs)          /*!< handle to struct BIT_BUF */
    697 {
    698   int i,j;
    699   int delta;
    700   COUPLING_MODE coupling;
    701   int noNoiseBands = hHeaderData->freqBandData.nNfb;
    702 
    703   Huffman hcb_noiseF;
    704   Huffman hcb_noise;
    705   int envDataTableCompFactor;
    706 
    707   coupling = h_frame_data->coupling;
    708 
    709 
    710   /*
    711     Select huffman codebook depending on coupling mode
    712   */
    713   if (coupling == COUPLING_BAL) {
    714     hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseBalance11T;
    715     hcb_noiseF = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F;  /* "sbr_huffBook_NoiseBalance11F" */
    716     envDataTableCompFactor = 1;
    717   }
    718   else {
    719     hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseLevel11T;
    720     hcb_noiseF = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F;    /* "sbr_huffBook_NoiseLevel11F" */
    721     envDataTableCompFactor = 0;
    722   }
    723 
    724   /*
    725     Read raw noise-envelope data
    726   */
    727   for (i=0; i<h_frame_data->frameInfo.nNoiseEnvelopes; i++) {
    728 
    729 
    730     if (h_frame_data->domain_vec_noise[i] == 0) {
    731       if (coupling == COUPLING_BAL) {
    732         h_frame_data->sbrNoiseFloorLevel[i*noNoiseBands] =
    733           (FIXP_SGL) (((int)FDKreadBits (hBs, 5)) << envDataTableCompFactor);
    734       }
    735       else {
    736         h_frame_data->sbrNoiseFloorLevel[i*noNoiseBands] =
    737           (FIXP_SGL) (int)FDKreadBits (hBs, 5);
    738       }
    739 
    740       for (j = 1; j < noNoiseBands; j++) {
    741         delta = DecodeHuffmanCW(hcb_noiseF, hBs);
    742         h_frame_data->sbrNoiseFloorLevel[i*noNoiseBands+j] = (FIXP_SGL) (delta << envDataTableCompFactor);
    743       }
    744     }
    745     else {
    746       for (j = 0; j < noNoiseBands; j++) {
    747         delta = DecodeHuffmanCW(hcb_noise, hBs);
    748         h_frame_data->sbrNoiseFloorLevel[i*noNoiseBands+j] = (FIXP_SGL) (delta << envDataTableCompFactor);
    749       }
    750     }
    751   }
    752 }
    753 
    754 
    755 /*!
    756   \brief   Read envelope data from bitstream
    757 */
    758 static int
    759 sbrGetEnvelope (HANDLE_SBR_HEADER_DATA hHeaderData,  /*!< Static control data */
    760                 HANDLE_SBR_FRAME_DATA  h_frame_data, /*!< handle to struct SBR_FRAME_DATA */
    761                 HANDLE_FDK_BITSTREAM   hBs,          /*!< handle to struct BIT_BUF */
    762                 const UINT             flags)
    763 {
    764   int i, j;
    765   UCHAR no_band[MAX_ENVELOPES];
    766   int delta = 0;
    767   int offset = 0;
    768   COUPLING_MODE coupling = h_frame_data->coupling;
    769   int ampRes = hHeaderData->bs_info.ampResolution;
    770   int nEnvelopes = h_frame_data->frameInfo.nEnvelopes;
    771   int envDataTableCompFactor;
    772   int start_bits, start_bits_balance;
    773   Huffman hcb_t, hcb_f;
    774 
    775   h_frame_data->nScaleFactors = 0;
    776 
    777   if ( (h_frame_data->frameInfo.frameClass == 0) && (nEnvelopes == 1) ) {
    778     if (flags & SBRDEC_ELD_GRID)
    779       ampRes = h_frame_data->ampResolutionCurrentFrame;
    780     else
    781       ampRes = 0;
    782   }
    783   h_frame_data->ampResolutionCurrentFrame = ampRes;
    784 
    785   /*
    786     Set number of bits for first value depending on amplitude resolution
    787   */
    788   if(ampRes == 1)
    789   {
    790     start_bits = 6;
    791     start_bits_balance = 5;
    792   }
    793   else
    794   {
    795     start_bits = 7;
    796     start_bits_balance = 6;
    797   }
    798 
    799   /*
    800     Calculate number of values for each envelope and alltogether
    801   */
    802   for (i = 0; i < nEnvelopes; i++) {
    803     no_band[i] = hHeaderData->freqBandData.nSfb[h_frame_data->frameInfo.freqRes[i]];
    804     h_frame_data->nScaleFactors += no_band[i];
    805   }
    806   if (h_frame_data->nScaleFactors > MAX_NUM_ENVELOPE_VALUES)
    807     return 0;
    808 
    809   /*
    810     Select Huffman codebook depending on coupling mode and amplitude resolution
    811   */
    812   if (coupling == COUPLING_BAL) {
    813     envDataTableCompFactor = 1;
    814     if (ampRes == 0) {
    815       hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10T;
    816       hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10F;
    817     }
    818     else {
    819       hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11T;
    820       hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F;
    821     }
    822   }
    823   else {
    824     envDataTableCompFactor = 0;
    825     if (ampRes == 0) {
    826       hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10T;
    827       hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10F;
    828     }
    829     else {
    830       hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11T;
    831       hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F;
    832     }
    833   }
    834 
    835   /*
    836     Now read raw envelope data
    837   */
    838   for (j = 0, offset = 0; j < nEnvelopes; j++) {
    839 
    840 
    841     if (h_frame_data->domain_vec[j] == 0) {
    842       if (coupling == COUPLING_BAL) {
    843         h_frame_data->iEnvelope[offset] =
    844           (FIXP_SGL) (( (int)FDKreadBits(hBs, start_bits_balance)) << envDataTableCompFactor);
    845       }
    846       else {
    847         h_frame_data->iEnvelope[offset] =
    848           (FIXP_SGL) (int)FDKreadBits (hBs, start_bits);
    849       }
    850     }
    851 
    852     for (i = (1 - h_frame_data->domain_vec[j]); i < no_band[j]; i++) {
    853 
    854       if (h_frame_data->domain_vec[j] == 0) {
    855         delta = DecodeHuffmanCW(hcb_f, hBs);
    856       }
    857       else {
    858         delta = DecodeHuffmanCW(hcb_t, hBs);
    859       }
    860 
    861       h_frame_data->iEnvelope[offset + i] = (FIXP_SGL) (delta << envDataTableCompFactor);
    862     }
    863     offset += no_band[j];
    864   }
    865 
    866 #if ENV_EXP_FRACT
    867   /* Convert from int to scaled fract (ENV_EXP_FRACT bits for the fractional part) */
    868   for (i = 0; i < h_frame_data->nScaleFactors; i++) {
    869     h_frame_data->iEnvelope[i] <<= ENV_EXP_FRACT;
    870   }
    871 #endif
    872 
    873   return 1;
    874 }
    875 
    876 
    877 //static const FRAME_INFO v_frame_info1_8 = { 0, 1, {0, 8}, {1}, -1, 1, {0, 8} };
    878 static const FRAME_INFO v_frame_info2_8 = { 0, 2, {0, 4, 8}, {1, 1}, -1, 2, {0, 4, 8} };
    879 static const FRAME_INFO v_frame_info4_8 = { 0, 4, {0, 2, 4, 6, 8}, {1, 1, 1, 1}, -1, 2, {0, 4, 8} };
    880 
    881 /***************************************************************************/
    882 /*!
    883   \brief    Generates frame info for FIXFIXonly frame class used for low delay version
    884 
    885   \return   nothing
    886  ****************************************************************************/
    887  static void generateFixFixOnly ( FRAME_INFO *hSbrFrameInfo,
    888                                   int tranPosInternal,
    889                                   int numberTimeSlots
    890                                 )
    891 {
    892     int nEnv, i, tranIdx;
    893     const int *pTable;
    894 
    895     switch (numberTimeSlots) {
    896         case 8:
    897             pTable = FDK_sbrDecoder_envelopeTable_8[tranPosInternal];
    898             break;
    899         case 15:
    900             pTable = FDK_sbrDecoder_envelopeTable_15[tranPosInternal];
    901             break;
    902         case 16:
    903             pTable = FDK_sbrDecoder_envelopeTable_16[tranPosInternal];
    904             break;
    905         default:
    906             FDK_ASSERT(0);
    907             /* in case assertion checks are disabled, force a definite memory fault at first access */
    908             pTable = NULL;
    909             break;
    910     }
    911 
    912     /* look number of envelopes in table */
    913     nEnv = pTable[0];
    914     /* look up envelope distribution in table */
    915     for (i=1; i<nEnv; i++)
    916         hSbrFrameInfo->borders[i] = pTable[i+2];
    917     /* open and close frame border */
    918     hSbrFrameInfo->borders[0]    = 0;
    919     hSbrFrameInfo->borders[nEnv] = numberTimeSlots;
    920     hSbrFrameInfo->nEnvelopes = nEnv;
    921 
    922    /* transient idx */
    923     tranIdx = hSbrFrameInfo->tranEnv = pTable[1];
    924 
    925     /* add noise floors */
    926     hSbrFrameInfo->bordersNoise[0] = 0;
    927     hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[tranIdx?tranIdx:1];
    928     hSbrFrameInfo->bordersNoise[2] = numberTimeSlots;
    929     /* nEnv is always > 1, so nNoiseEnvelopes is always 2 (IEC 14496-3 4.6.19.3.2) */
    930     hSbrFrameInfo->nNoiseEnvelopes = 2;
    931 }
    932 
    933 /*!
    934   \brief  Extracts LowDelaySBR control data from the bitstream.
    935 
    936   \return zero for bitstream error, one for correct.
    937 */
    938 static int
    939 extractLowDelayGrid (HANDLE_FDK_BITSTREAM hBitBuf,          /*!< bitbuffer handle */
    940                      HANDLE_SBR_HEADER_DATA hHeaderData,
    941                      HANDLE_SBR_FRAME_DATA h_frame_data, /*!< contains the FRAME_INFO struct to be filled */
    942                      int timeSlots
    943                     )
    944 {
    945   FRAME_INFO * pFrameInfo = &h_frame_data->frameInfo;
    946   INT numberTimeSlots = hHeaderData->numberTimeSlots;
    947   INT temp = 0, k;
    948 
    949       /* FIXFIXonly framing case */
    950       h_frame_data->frameInfo.frameClass = 0;
    951 
    952       /* get the transient position from the bitstream */
    953       switch (timeSlots){
    954         case 8:
    955           /* 3bit transient position (temp={0;..;7}) */
    956           temp = FDKreadBits( hBitBuf, 3);
    957           break;
    958 
    959         case 16:
    960         case 15:
    961           /* 4bit transient position (temp={0;..;15}) */
    962           temp = FDKreadBits( hBitBuf, 4);
    963           break;
    964 
    965         default:
    966           return 0;
    967       }
    968 
    969       /* calculate borders according to the transient position */
    970       generateFixFixOnly ( pFrameInfo,
    971                            temp,
    972                            numberTimeSlots
    973                          );
    974 
    975       /* decode freq res: */
    976       for (k = 0; k < pFrameInfo->nEnvelopes; k++) {
    977           pFrameInfo->freqRes[k] = (UCHAR) FDKreadBits (hBitBuf, 1); /* f = F [1 bits] */
    978       }
    979 
    980 
    981   return 1;
    982 }
    983 
    984 /*!
    985   \brief   Extract the frame information (structure FRAME_INFO) from the bitstream
    986   \return  Zero for bitstream error, one for correct.
    987 */
    988 int
    989 extractFrameInfo ( HANDLE_FDK_BITSTREAM   hBs,          /*!< bitbuffer handle */
    990                    HANDLE_SBR_HEADER_DATA hHeaderData,  /*!< Static control data */
    991                    HANDLE_SBR_FRAME_DATA  h_frame_data, /*!< pointer to memory where the frame-info will be stored */
    992                    const UINT             nrOfChannels,
    993                    const UINT             flags
    994                  )
    995 {
    996   FRAME_INFO * pFrameInfo = &h_frame_data->frameInfo;
    997   int numberTimeSlots = hHeaderData->numberTimeSlots;
    998   int pointer_bits = 0, nEnv = 0, b = 0, border, i, n = 0,
    999     k, p, aL, aR, nL, nR,
   1000     temp = 0, staticFreqRes;
   1001   UCHAR frameClass;
   1002 
   1003   if (flags & SBRDEC_ELD_GRID) {
   1004       /* CODEC_AACLD (LD+SBR) only uses the normal 0 Grid for non-transient Frames and the LowDelayGrid for transient Frames */
   1005       frameClass = FDKreadBits (hBs, 1); /* frameClass = [1 bit] */
   1006       if ( frameClass == 1 ) {
   1007         /* if frameClass == 1, extract LowDelaySbrGrid, otherwise extract normal SBR-Grid for FIXIFX */
   1008         /* extract the AACLD-Sbr-Grid */
   1009         pFrameInfo->frameClass = frameClass;
   1010         extractLowDelayGrid (hBs, hHeaderData, h_frame_data, numberTimeSlots);
   1011         return 1;
   1012       }
   1013   } else
   1014   {
   1015     frameClass = FDKreadBits (hBs, 2); /* frameClass = C [2 bits] */
   1016   }
   1017 
   1018 
   1019   switch (frameClass) {
   1020   case 0:
   1021     temp = FDKreadBits (hBs, 2);     /* E [2 bits ] */
   1022     nEnv = (int) (1 << temp);    /* E -> e */
   1023 
   1024     if ((flags & SBRDEC_ELD_GRID) && (nEnv == 1))
   1025       h_frame_data->ampResolutionCurrentFrame = FDKreadBits( hBs, 1); /* new ELD Syntax 07-11-09 */
   1026 
   1027     staticFreqRes = FDKreadBits (hBs, 1);
   1028 
   1029     {
   1030       if (nEnv > MAX_ENVELOPES_HEAAC)
   1031         return 0;
   1032     }
   1033 
   1034     b = nEnv + 1;
   1035     switch (nEnv) {
   1036     case 1:
   1037       switch (numberTimeSlots) {
   1038         case 15:
   1039           FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_15, sizeof(FRAME_INFO));
   1040           break;
   1041         case 16:
   1042           FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_16, sizeof(FRAME_INFO));
   1043           break;
   1044         default:
   1045           FDK_ASSERT(0);
   1046       }
   1047       break;
   1048     case 2:
   1049       switch (numberTimeSlots) {
   1050         case 15:
   1051           FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_15, sizeof(FRAME_INFO));
   1052           break;
   1053         case 16:
   1054           FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_16, sizeof(FRAME_INFO));
   1055           break;
   1056         default:
   1057           FDK_ASSERT(0);
   1058       }
   1059       break;
   1060     case 4:
   1061       switch (numberTimeSlots) {
   1062         case 15:
   1063           FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_15, sizeof(FRAME_INFO));
   1064           break;
   1065         case 16:
   1066           FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_16, sizeof(FRAME_INFO));
   1067           break;
   1068         default:
   1069           FDK_ASSERT(0);
   1070       }
   1071       break;
   1072     case 8:
   1073 #if (MAX_ENVELOPES >= 8)
   1074       switch (numberTimeSlots) {
   1075         case 15:
   1076           FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_15, sizeof(FRAME_INFO));
   1077           break;
   1078         case 16:
   1079           FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_16, sizeof(FRAME_INFO));
   1080           break;
   1081         default:
   1082           FDK_ASSERT(0);
   1083       }
   1084       break;
   1085 #else
   1086       return 0;
   1087 #endif
   1088     }
   1089     /* Apply correct freqRes (High is default) */
   1090     if (!staticFreqRes) {
   1091       for (i = 0; i < nEnv ; i++)
   1092         pFrameInfo->freqRes[i] = 0;
   1093     }
   1094 
   1095     break;
   1096   case 1:
   1097   case 2:
   1098     temp = FDKreadBits (hBs, 2);  /* A [2 bits] */
   1099 
   1100     n    = FDKreadBits (hBs, 2);  /* n = N [2 bits] */
   1101 
   1102     nEnv = n + 1;                             /* # envelopes */
   1103     b = nEnv + 1;                             /* # borders   */
   1104 
   1105     break;
   1106   }
   1107 
   1108   switch (frameClass) {
   1109   case 1:
   1110     /* Decode borders: */
   1111     pFrameInfo->borders[0] = 0;               /* first border          */
   1112     border = temp + numberTimeSlots;          /* A -> aR               */
   1113     i = b-1;                                  /* frame info index for last border */
   1114     pFrameInfo->borders[i] = border;          /* last border                      */
   1115 
   1116     for (k = 0; k < n; k++) {
   1117       temp = FDKreadBits (hBs, 2);/* R [2 bits] */
   1118       border -= (2 * temp + 2);               /* R -> r                */
   1119       pFrameInfo->borders[--i] = border;
   1120     }
   1121 
   1122 
   1123     /* Decode pointer: */
   1124     pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n+1));
   1125     p = FDKreadBits (hBs, pointer_bits);     /* p = P [pointer_bits bits] */
   1126 
   1127     if (p > n+1)
   1128       return 0;
   1129 
   1130     pFrameInfo->tranEnv = p ? n + 2 - p : -1;
   1131 
   1132 
   1133     /* Decode freq res: */
   1134     for (k = n; k >= 0; k--) {
   1135       pFrameInfo->freqRes[k] = FDKreadBits (hBs, 1); /* f = F [1 bits] */
   1136     }
   1137 
   1138 
   1139     /* Calculate noise floor middle border: */
   1140     if (p == 0 || p == 1)
   1141       pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n];
   1142     else
   1143       pFrameInfo->bordersNoise[1] = pFrameInfo->borders[pFrameInfo->tranEnv];
   1144 
   1145     break;
   1146 
   1147   case 2:
   1148     /* Decode borders: */
   1149     border = temp;                            /* A -> aL */
   1150     pFrameInfo->borders[0] = border;          /* first border */
   1151 
   1152     for (k = 1; k <= n; k++) {
   1153       temp = FDKreadBits (hBs, 2);/* R [2 bits] */
   1154       border += (2 * temp + 2);               /* R -> r                */
   1155       pFrameInfo->borders[k] = border;
   1156     }
   1157     pFrameInfo->borders[k] = numberTimeSlots; /* last border */
   1158 
   1159 
   1160     /* Decode pointer: */
   1161     pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n+1));
   1162     p = FDKreadBits (hBs, pointer_bits);     /* p = P [pointer_bits bits] */
   1163     if (p > n+1)
   1164       return 0;
   1165 
   1166     if (p == 0 || p == 1)
   1167       pFrameInfo->tranEnv = -1;
   1168     else
   1169       pFrameInfo->tranEnv = p - 1;
   1170 
   1171 
   1172 
   1173     /* Decode freq res: */
   1174     for (k = 0; k <= n; k++) {
   1175       pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */
   1176     }
   1177 
   1178 
   1179 
   1180     /* Calculate noise floor middle border: */
   1181     switch (p) {
   1182     case 0:
   1183       pFrameInfo->bordersNoise[1] = pFrameInfo->borders[1];
   1184       break;
   1185     case 1:
   1186       pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n];
   1187       break;
   1188     default:
   1189       pFrameInfo->bordersNoise[1] = pFrameInfo->borders[pFrameInfo->tranEnv];
   1190       break;
   1191     }
   1192 
   1193     break;
   1194 
   1195   case 3:
   1196     /* v_ctrlSignal = [frameClass,aL,aR,nL,nR,v_rL,v_rR,p,v_fLR]; */
   1197 
   1198     aL = FDKreadBits (hBs, 2);       /* AL [2 bits], AL -> aL */
   1199 
   1200     aR = FDKreadBits (hBs, 2) + numberTimeSlots;     /* AR [2 bits], AR -> aR */
   1201 
   1202     nL = FDKreadBits (hBs, 2);       /* nL = NL [2 bits] */
   1203 
   1204     nR = FDKreadBits (hBs, 2);       /* nR = NR [2 bits] */
   1205 
   1206 
   1207 
   1208     /*-------------------------------------------------------------------------
   1209       Calculate help variables
   1210       --------------------------------------------------------------------------*/
   1211 
   1212     /* general: */
   1213     nEnv = nL + nR + 1;            /* # envelopes */
   1214     if (nEnv > MAX_ENVELOPES)
   1215       return 0;
   1216     b = nEnv + 1;                  /* # borders   */
   1217 
   1218 
   1219 
   1220     /*-------------------------------------------------------------------------
   1221       Decode envelopes
   1222       --------------------------------------------------------------------------*/
   1223 
   1224 
   1225     /* L-borders:   */
   1226     border            = aL;                   /* first border */
   1227     pFrameInfo->borders[0] = border;
   1228 
   1229     for (k = 1; k <= nL; k++) {
   1230       temp = FDKreadBits (hBs, 2);/* R [2 bits] */
   1231       border += (2 * temp + 2);               /* R -> r                */
   1232       pFrameInfo->borders[k] = border;
   1233     }
   1234 
   1235 
   1236     /* R-borders:  */
   1237     border = aR;                              /* last border */
   1238     i      = nEnv;
   1239 
   1240     pFrameInfo->borders[i] = border;
   1241 
   1242     for (k = 0; k < nR; k++) {
   1243       temp = FDKreadBits (hBs, 2);/* R [2 bits] */
   1244       border -= (2 * temp + 2);               /* R -> r                */
   1245       pFrameInfo->borders[--i] = border;
   1246     }
   1247 
   1248 
   1249     /* decode pointer: */
   1250     pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(nL+nR+1));
   1251     p = FDKreadBits (hBs, pointer_bits);     /* p = P [pointer_bits bits] */
   1252 
   1253     if (p > nL+nR+1)
   1254       return 0;
   1255 
   1256     pFrameInfo->tranEnv = p ? b - p : -1;
   1257 
   1258 
   1259 
   1260     /* decode freq res: */
   1261     for (k = 0; k < nEnv; k++) {
   1262       pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */
   1263     }
   1264 
   1265 
   1266 
   1267     /*-------------------------------------------------------------------------
   1268       Decode noise floors
   1269       --------------------------------------------------------------------------*/
   1270     pFrameInfo->bordersNoise[0] = aL;
   1271 
   1272     if (nEnv == 1) {
   1273       /* 1 noise floor envelope: */
   1274       pFrameInfo->bordersNoise[1] = aR;
   1275     }
   1276     else {
   1277       /* 2 noise floor envelopes */
   1278       if (p == 0 || p == 1)
   1279         pFrameInfo->bordersNoise[1] = pFrameInfo->borders[nEnv - 1];
   1280       else
   1281         pFrameInfo->bordersNoise[1] = pFrameInfo->borders[pFrameInfo->tranEnv];
   1282       pFrameInfo->bordersNoise[2] = aR;
   1283     }
   1284     break;
   1285   }
   1286 
   1287 
   1288   /*
   1289     Store number of envelopes, noise floor envelopes and frame class
   1290   */
   1291   pFrameInfo->nEnvelopes = nEnv;
   1292 
   1293   if (nEnv == 1)
   1294     pFrameInfo->nNoiseEnvelopes = 1;
   1295   else
   1296     pFrameInfo->nNoiseEnvelopes = 2;
   1297 
   1298   pFrameInfo->frameClass = frameClass;
   1299 
   1300   if (pFrameInfo->frameClass == 2 || pFrameInfo->frameClass == 1) {
   1301     /* calculate noise floor first and last borders: */
   1302     pFrameInfo->bordersNoise[0] = pFrameInfo->borders[0];
   1303     pFrameInfo->bordersNoise[pFrameInfo->nNoiseEnvelopes] = pFrameInfo->borders[nEnv];
   1304   }
   1305 
   1306 
   1307   return 1;
   1308 }
   1309 
   1310 
   1311 /*!
   1312   \brief   Check if the frameInfo vector has reasonable values.
   1313   \return  Zero for error, one for correct
   1314 */
   1315 static int
   1316 checkFrameInfo (FRAME_INFO * pFrameInfo, /*!< pointer to frameInfo */
   1317                 int numberOfTimeSlots,   /*!< QMF time slots per frame */
   1318                 int overlap,             /*!< Amount of overlap QMF time slots */
   1319                 int timeStep)            /*!< QMF slots to SBR slots step factor */
   1320 {
   1321   int maxPos,i,j;
   1322   int startPos;
   1323   int stopPos;
   1324   int tranEnv;
   1325   int startPosNoise;
   1326   int stopPosNoise;
   1327   int nEnvelopes = pFrameInfo->nEnvelopes;
   1328   int nNoiseEnvelopes = pFrameInfo->nNoiseEnvelopes;
   1329 
   1330   if(nEnvelopes < 1 || nEnvelopes > MAX_ENVELOPES)
   1331     return 0;
   1332 
   1333   if(nNoiseEnvelopes > MAX_NOISE_ENVELOPES)
   1334     return 0;
   1335 
   1336   startPos        = pFrameInfo->borders[0];
   1337   stopPos         = pFrameInfo->borders[nEnvelopes];
   1338   tranEnv         = pFrameInfo->tranEnv;
   1339   startPosNoise   = pFrameInfo->bordersNoise[0];
   1340   stopPosNoise    = pFrameInfo->bordersNoise[nNoiseEnvelopes];
   1341 
   1342   if (overlap < 0 || overlap > (6)) {
   1343     return 0;
   1344   }
   1345   if (timeStep < 1 || timeStep > 2) {
   1346     return 0;
   1347   }
   1348   maxPos = numberOfTimeSlots + (overlap/timeStep);
   1349 
   1350   /* Check that the start and stop positions of the frame are reasonable values. */
   1351   if( (startPos < 0) || (startPos >= stopPos) )
   1352     return 0;
   1353   if( startPos > maxPos-numberOfTimeSlots ) /* First env. must start in or directly after the overlap buffer */
   1354     return 0;
   1355   if( stopPos < numberOfTimeSlots ) /* One complete frame must be ready for output after processing */
   1356     return 0;
   1357   if(stopPos > maxPos)
   1358     return 0;
   1359 
   1360   /* Check that the  start border for every envelope is strictly later in time */
   1361   for(i=0;i<nEnvelopes;i++) {
   1362     if(pFrameInfo->borders[i] >= pFrameInfo->borders[i+1])
   1363       return 0;
   1364   }
   1365 
   1366   /* Check that the envelope to be shortened is actually among the envelopes */
   1367   if(tranEnv>nEnvelopes)
   1368     return 0;
   1369 
   1370 
   1371   /* Check the noise borders */
   1372   if(nEnvelopes==1 && nNoiseEnvelopes>1)
   1373     return 0;
   1374 
   1375   if(startPos != startPosNoise || stopPos != stopPosNoise)
   1376     return 0;
   1377 
   1378 
   1379   /* Check that the  start border for every noise-envelope is strictly later in time*/
   1380   for(i=0; i<nNoiseEnvelopes; i++) {
   1381     if(pFrameInfo->bordersNoise[i] >= pFrameInfo->bordersNoise[i+1])
   1382       return 0;
   1383   }
   1384 
   1385   /* Check that every noise border is the same as an envelope border*/
   1386   for(i=0; i<nNoiseEnvelopes; i++) {
   1387     startPosNoise = pFrameInfo->bordersNoise[i];
   1388 
   1389     for(j=0; j<nEnvelopes; j++) {
   1390       if(pFrameInfo->borders[j] == startPosNoise)
   1391         break;
   1392     }
   1393     if(j==nEnvelopes)
   1394       return 0;
   1395   }
   1396 
   1397   return 1;
   1398 }
   1399