Home | History | Annotate | Download | only in src
      1 /* -----------------------------------------------------------------------------
      2 Software License for The Fraunhofer FDK AAC Codec Library for Android
      3 
      4  Copyright  1995 - 2018 Fraunhofer-Gesellschaft zur Frderung der angewandten
      5 Forschung e.V. All rights reserved.
      6 
      7  1.    INTRODUCTION
      8 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
      9 that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
     10 scheme for digital audio. This FDK AAC Codec software is intended to be used on
     11 a wide variety of Android devices.
     12 
     13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
     14 general perceptual audio codecs. AAC-ELD is considered the best-performing
     15 full-bandwidth communications codec by independent studies and is widely
     16 deployed. AAC has been standardized by ISO and IEC as part of the MPEG
     17 specifications.
     18 
     19 Patent licenses for necessary patent claims for the FDK AAC Codec (including
     20 those of Fraunhofer) may be obtained through Via Licensing
     21 (www.vialicensing.com) or through the respective patent owners individually for
     22 the purpose of encoding or decoding bit streams in products that are compliant
     23 with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
     24 Android devices already license these patent claims through Via Licensing or
     25 directly from the patent owners, and therefore FDK AAC Codec software may
     26 already be covered under those patent licenses when it is used for those
     27 licensed purposes only.
     28 
     29 Commercially-licensed AAC software libraries, including floating-point versions
     30 with enhanced sound quality, are also available from Fraunhofer. Users are
     31 encouraged to check the Fraunhofer website for additional applications
     32 information and documentation.
     33 
     34 2.    COPYRIGHT LICENSE
     35 
     36 Redistribution and use in source and binary forms, with or without modification,
     37 are permitted without payment of copyright license fees provided that you
     38 satisfy the following conditions:
     39 
     40 You must retain the complete text of this software license in redistributions of
     41 the FDK AAC Codec or your modifications thereto in source code form.
     42 
     43 You must retain the complete text of this software license in the documentation
     44 and/or other materials provided with redistributions of the FDK AAC Codec or
     45 your modifications thereto in binary form. You must make available free of
     46 charge copies of the complete source code of the FDK AAC Codec and your
     47 modifications thereto to recipients of copies in binary form.
     48 
     49 The name of Fraunhofer may not be used to endorse or promote products derived
     50 from this library without prior written permission.
     51 
     52 You may not charge copyright license fees for anyone to use, copy or distribute
     53 the FDK AAC Codec software or your modifications thereto.
     54 
     55 Your modified versions of the FDK AAC Codec must carry prominent notices stating
     56 that you changed the software and the date of any change. For modified versions
     57 of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
     58 must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
     59 AAC Codec Library for Android."
     60 
     61 3.    NO PATENT LICENSE
     62 
     63 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
     64 limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
     65 Fraunhofer provides no warranty of patent non-infringement with respect to this
     66 software.
     67 
     68 You may use this FDK AAC Codec software or modifications thereto only for
     69 purposes that are authorized by appropriate patent licenses.
     70 
     71 4.    DISCLAIMER
     72 
     73 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
     74 holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
     75 including but not limited to the implied warranties of merchantability and
     76 fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
     77 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
     78 or consequential damages, including but not limited to procurement of substitute
     79 goods or services; loss of use, data, or profits, or business interruption,
     80 however caused and on any theory of liability, whether in contract, strict
     81 liability, or tort (including negligence), arising in any way out of the use of
     82 this software, even if advised of the possibility of such damage.
     83 
     84 5.    CONTACT INFORMATION
     85 
     86 Fraunhofer Institute for Integrated Circuits IIS
     87 Attention: Audio and Multimedia Departments - FDK AAC LL
     88 Am Wolfsmantel 33
     89 91058 Erlangen, Germany
     90 
     91 www.iis.fraunhofer.de/amm
     92 amm-info (at) iis.fraunhofer.de
     93 ----------------------------------------------------------------------------- */
     94 
     95 /**************************** SBR decoder library ******************************
     96 
     97    Author(s):
     98 
     99    Description:
    100 
    101 *******************************************************************************/
    102 
    103 /*!
    104   \file
    105   \brief  Envelope extraction
    106   The functions provided by this module are mostly called by applySBR(). After
    107   it is determined that there is valid SBR data, sbrGetHeaderData() might be
    108   called if the current SBR data contains an \ref SBR_HEADER_ELEMENT as opposed
    109   to a \ref SBR_STANDARD_ELEMENT. This function may return various error codes
    110   as defined in #SBR_HEADER_STATUS . Most importantly it returns HEADER_RESET
    111   when decoder settings need to be recalculated according to the SBR
    112   specifications. In that case applySBR() will initiatite the required
    113   re-configuration.
    114 
    115   The header data is stored in a #SBR_HEADER_DATA structure.
    116 
    117   The actual SBR data for the current frame is decoded into SBR_FRAME_DATA
    118   stuctures by sbrGetChannelPairElement() [for stereo streams] and
    119   sbrGetSingleChannelElement() [for mono streams]. There is no fractional
    120   arithmetic involved.
    121 
    122   Once the information is extracted, the data needs to be further prepared
    123   before the actual decoding process. This is done in decodeSbrData().
    124 
    125   \sa Description of buffer management in applySBR(). \ref documentationOverview
    126 
    127   <h1>About the SBR data format:</h1>
    128 
    129   Each frame includes SBR data (side chain information), and can be either the
    130   \ref SBR_HEADER_ELEMENT or the \ref SBR_STANDARD_ELEMENT. Parts of the data
    131   can be protected by a CRC checksum.
    132 
    133   \anchor SBR_HEADER_ELEMENT <h2>The SBR_HEADER_ELEMENT</h2>
    134 
    135   The SBR_HEADER_ELEMENT can be transmitted with every frame, however, it
    136   typically is send every second or so. It contains fundamental information such
    137   as SBR sampling frequency and frequency range as well as control signals that
    138   do not require frequent changes. It also includes the \ref
    139   SBR_STANDARD_ELEMENT.
    140 
    141   Depending on the changes between the information in a current
    142   SBR_HEADER_ELEMENT and the previous SBR_HEADER_ELEMENT, the SBR decoder might
    143   need to be reset and reconfigured (e.g. new tables need to be calculated).
    144 
    145   \anchor SBR_STANDARD_ELEMENT <h2>The SBR_STANDARD_ELEMENT</h2>
    146 
    147   This data can be subdivided into "side info" and "raw data", where side info
    148   is defined as signals needed to decode the raw data and some decoder tuning
    149   signals. Raw data is referred to as PCM and Huffman coded envelope and noise
    150   floor estimates. The side info also includes information about the
    151   time-frequency grid for the current frame.
    152 
    153   \sa \ref documentationOverview
    154 */
    155 
    156 #include "env_extr.h"
    157 
    158 #include "sbr_ram.h"
    159 #include "sbr_rom.h"
    160 #include "huff_dec.h"
    161 
    162 #include "psbitdec.h"
    163 
    164 #define DRM_PARAMETRIC_STEREO 0
    165 #define EXTENSION_ID_PS_CODING 2
    166 
    167 static int extractPvcFrameInfo(
    168     HANDLE_FDK_BITSTREAM hBs,           /*!< bitbuffer handle */
    169     HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
    170     HANDLE_SBR_FRAME_DATA h_frame_data, /*!< pointer to memory where the
    171                                            frame-info will be stored */
    172     HANDLE_SBR_PREV_FRAME_DATA h_prev_frame_data, /*!< pointer to memory where
    173                                                      the previous frame-info
    174                                                      will be stored */
    175     UCHAR pvc_mode_last,                          /**< PVC mode of last frame */
    176     const UINT flags);
    177 static int extractFrameInfo(HANDLE_FDK_BITSTREAM hBs,
    178                             HANDLE_SBR_HEADER_DATA hHeaderData,
    179                             HANDLE_SBR_FRAME_DATA h_frame_data,
    180                             const UINT nrOfChannels, const UINT flags);
    181 
    182 static int sbrGetPvcEnvelope(HANDLE_SBR_HEADER_DATA hHeaderData,
    183                              HANDLE_SBR_FRAME_DATA h_frame_data,
    184                              HANDLE_FDK_BITSTREAM hBs, const UINT flags,
    185                              const UINT pvcMode);
    186 static int sbrGetEnvelope(HANDLE_SBR_HEADER_DATA hHeaderData,
    187                           HANDLE_SBR_FRAME_DATA h_frame_data,
    188                           HANDLE_FDK_BITSTREAM hBs, const UINT flags);
    189 
    190 static void sbrGetDirectionControlData(HANDLE_SBR_FRAME_DATA hFrameData,
    191                                        HANDLE_FDK_BITSTREAM hBs,
    192                                        const UINT flags, const int bs_pvc_mode);
    193 
    194 static void sbrGetNoiseFloorData(HANDLE_SBR_HEADER_DATA hHeaderData,
    195                                  HANDLE_SBR_FRAME_DATA h_frame_data,
    196                                  HANDLE_FDK_BITSTREAM hBs);
    197 
    198 static int checkFrameInfo(FRAME_INFO *pFrameInfo, int numberOfTimeSlots,
    199                           int overlap, int timeStep);
    200 
    201 /* Mapping to std samplerate table according to 14496-3 (4.6.18.2.6) */
    202 typedef struct SR_MAPPING {
    203   UINT fsRangeLo; /* If fsRangeLo(n+1)>fs>=fsRangeLo(n), it will be mapped to...
    204                    */
    205   UINT fsMapped;  /* fsMapped. */
    206 } SR_MAPPING;
    207 
    208 static const SR_MAPPING stdSampleRatesMapping[] = {
    209     {0, 8000},      {9391, 11025},  {11502, 12000}, {13856, 16000},
    210     {18783, 22050}, {23004, 24000}, {27713, 32000}, {37566, 44100},
    211     {46009, 48000}, {55426, 64000}, {75132, 88200}, {92017, 96000}};
    212 static const SR_MAPPING stdSampleRatesMappingUsac[] = {
    213     {0, 16000},     {18783, 22050}, {23004, 24000}, {27713, 32000},
    214     {35777, 40000}, {42000, 44100}, {46009, 48000}, {55426, 64000},
    215     {75132, 88200}, {92017, 96000}};
    216 
    217 UINT sbrdec_mapToStdSampleRate(UINT fs,
    218                                UINT isUsac) /*!< Output sampling frequency */
    219 {
    220   UINT fsMapped = fs, tableSize = 0;
    221   const SR_MAPPING *mappingTable;
    222   int i;
    223 
    224   if (!isUsac) {
    225     mappingTable = stdSampleRatesMapping;
    226     tableSize = sizeof(stdSampleRatesMapping) / sizeof(SR_MAPPING);
    227   } else {
    228     mappingTable = stdSampleRatesMappingUsac;
    229     tableSize = sizeof(stdSampleRatesMappingUsac) / sizeof(SR_MAPPING);
    230   }
    231 
    232   for (i = tableSize - 1; i >= 0; i--) {
    233     if (fs >= mappingTable[i].fsRangeLo) {
    234       fsMapped = mappingTable[i].fsMapped;
    235       break;
    236     }
    237   }
    238 
    239   return (fsMapped);
    240 }
    241 
    242 SBR_ERROR
    243 initHeaderData(HANDLE_SBR_HEADER_DATA hHeaderData, const int sampleRateIn,
    244                const int sampleRateOut, const INT downscaleFactor,
    245                const int samplesPerFrame, const UINT flags,
    246                const int setDefaultHdr) {
    247   HANDLE_FREQ_BAND_DATA hFreq = &hHeaderData->freqBandData;
    248   SBR_ERROR sbrError = SBRDEC_OK;
    249   int numAnalysisBands;
    250   int sampleRateProc;
    251 
    252   if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) {
    253     sampleRateProc =
    254         sbrdec_mapToStdSampleRate(sampleRateOut * downscaleFactor, 0);
    255   } else {
    256     sampleRateProc = sampleRateOut * downscaleFactor;
    257   }
    258 
    259   if (sampleRateIn == sampleRateOut) {
    260     hHeaderData->sbrProcSmplRate = sampleRateProc << 1;
    261     numAnalysisBands = 32;
    262   } else {
    263     hHeaderData->sbrProcSmplRate = sampleRateProc;
    264     if ((sampleRateOut >> 1) == sampleRateIn) {
    265       /* 1:2 */
    266       numAnalysisBands = 32;
    267     } else if ((sampleRateOut >> 2) == sampleRateIn) {
    268       /* 1:4 */
    269       numAnalysisBands = 16;
    270     } else if ((sampleRateOut * 3) >> 3 == (sampleRateIn * 8) >> 3) {
    271       /* 3:8, 3/4 core frame length */
    272       numAnalysisBands = 24;
    273     } else {
    274       sbrError = SBRDEC_UNSUPPORTED_CONFIG;
    275       goto bail;
    276     }
    277   }
    278   numAnalysisBands /= downscaleFactor;
    279 
    280   if (setDefaultHdr) {
    281     /* Fill in default values first */
    282     hHeaderData->syncState = SBR_NOT_INITIALIZED;
    283     hHeaderData->status = 0;
    284     hHeaderData->frameErrorFlag = 0;
    285 
    286     hHeaderData->bs_info.ampResolution = 1;
    287     hHeaderData->bs_info.xover_band = 0;
    288     hHeaderData->bs_info.sbr_preprocessing = 0;
    289     hHeaderData->bs_info.pvc_mode = 0;
    290 
    291     hHeaderData->bs_data.startFreq = 5;
    292     hHeaderData->bs_data.stopFreq = 0;
    293     hHeaderData->bs_data.freqScale =
    294         0; /* previously 2; for ELD reduced delay bitstreams
    295            /samplerates initializing of the sbr decoder instance fails if
    296            freqScale is set to 2 because no master table can be generated; in
    297            ELD reduced delay bitstreams this value is always 0; gets overwritten
    298            when header is read */
    299     hHeaderData->bs_data.alterScale = 1;
    300     hHeaderData->bs_data.noise_bands = 2;
    301     hHeaderData->bs_data.limiterBands = 2;
    302     hHeaderData->bs_data.limiterGains = 2;
    303     hHeaderData->bs_data.interpolFreq = 1;
    304     hHeaderData->bs_data.smoothingLength = 1;
    305 
    306     /* Patch some entries */
    307     if (sampleRateOut * downscaleFactor >= 96000) {
    308       hHeaderData->bs_data.startFreq =
    309           4; /*   having read these frequency values from bit stream before. */
    310       hHeaderData->bs_data.stopFreq = 3;
    311     } else if (sampleRateOut * downscaleFactor >
    312                24000) { /* Trigger an error if SBR is going to be processed
    313                            without     */
    314       hHeaderData->bs_data.startFreq =
    315           7; /*   having read these frequency values from bit stream before. */
    316       hHeaderData->bs_data.stopFreq = 3;
    317     }
    318   }
    319 
    320   if ((sampleRateOut >> 2) == sampleRateIn) {
    321     hHeaderData->timeStep = 4;
    322   } else {
    323     hHeaderData->timeStep = (flags & SBRDEC_ELD_GRID) ? 1 : 2;
    324   }
    325 
    326   /* Setup pointers to frequency band tables */
    327   hFreq->freqBandTable[0] = hFreq->freqBandTableLo;
    328   hFreq->freqBandTable[1] = hFreq->freqBandTableHi;
    329 
    330   /* One SBR timeslot corresponds to the amount of samples equal to the amount
    331    * of analysis bands, divided by the timestep. */
    332   hHeaderData->numberTimeSlots =
    333       (samplesPerFrame / numAnalysisBands) >> (hHeaderData->timeStep - 1);
    334   if (hHeaderData->numberTimeSlots > (16)) {
    335     sbrError = SBRDEC_UNSUPPORTED_CONFIG;
    336   }
    337 
    338   hHeaderData->numberOfAnalysisBands = numAnalysisBands;
    339   if ((sampleRateOut >> 2) == sampleRateIn) {
    340     hHeaderData->numberTimeSlots <<= 1;
    341   }
    342 
    343 bail:
    344   return sbrError;
    345 }
    346 
    347 /*!
    348   \brief   Initialize the SBR_PREV_FRAME_DATA struct
    349 */
    350 void initSbrPrevFrameData(
    351     HANDLE_SBR_PREV_FRAME_DATA
    352         h_prev_data, /*!< handle to struct SBR_PREV_FRAME_DATA */
    353     int timeSlots)   /*!< Framelength in SBR-timeslots */
    354 {
    355   int i;
    356 
    357   /* Set previous energy and noise levels to 0 for the case
    358      that decoding starts in the middle of a bitstream */
    359   for (i = 0; i < MAX_FREQ_COEFFS; i++)
    360     h_prev_data->sfb_nrg_prev[i] = (FIXP_DBL)0;
    361   for (i = 0; i < MAX_NOISE_COEFFS; i++)
    362     h_prev_data->prevNoiseLevel[i] = (FIXP_DBL)0;
    363   for (i = 0; i < MAX_INVF_BANDS; i++) h_prev_data->sbr_invf_mode[i] = INVF_OFF;
    364 
    365   h_prev_data->stopPos = timeSlots;
    366   h_prev_data->coupling = COUPLING_OFF;
    367   h_prev_data->ampRes = 0;
    368 
    369   FDKmemclear(&h_prev_data->prevFrameInfo, sizeof(h_prev_data->prevFrameInfo));
    370 }
    371 
    372 /*!
    373   \brief   Read header data from bitstream
    374 
    375   \return  error status - 0 if ok
    376 */
    377 SBR_HEADER_STATUS
    378 sbrGetHeaderData(HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_FDK_BITSTREAM hBs,
    379                  const UINT flags, const int fIsSbrData,
    380                  const UCHAR configMode) {
    381   SBR_HEADER_DATA_BS *pBsData;
    382   SBR_HEADER_DATA_BS lastHeader;
    383   SBR_HEADER_DATA_BS_INFO lastInfo;
    384   int headerExtra1 = 0, headerExtra2 = 0;
    385 
    386   /* Read and discard new header in config change detection mode */
    387   if (configMode & AC_CM_DET_CFG_CHANGE) {
    388     if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) {
    389       /* ampResolution */
    390       FDKreadBits(hBs, 1);
    391     }
    392     /* startFreq, stopFreq */
    393     FDKpushFor(hBs, 8);
    394     if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) {
    395       /* xover_band */
    396       FDKreadBits(hBs, 3);
    397       /* reserved bits */
    398       FDKreadBits(hBs, 2);
    399     }
    400     headerExtra1 = FDKreadBit(hBs);
    401     headerExtra2 = FDKreadBit(hBs);
    402     FDKpushFor(hBs, 5 * headerExtra1 + 6 * headerExtra2);
    403 
    404     return HEADER_OK;
    405   }
    406 
    407   /* Copy SBR bit stream header to temporary header */
    408   lastHeader = hHeaderData->bs_data;
    409   lastInfo = hHeaderData->bs_info;
    410 
    411   /* Read new header from bitstream */
    412   if ((flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC)) && !fIsSbrData) {
    413     pBsData = &hHeaderData->bs_dflt;
    414   } else {
    415     pBsData = &hHeaderData->bs_data;
    416   }
    417 
    418   if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) {
    419     hHeaderData->bs_info.ampResolution = FDKreadBits(hBs, 1);
    420   }
    421 
    422   pBsData->startFreq = FDKreadBits(hBs, 4);
    423   pBsData->stopFreq = FDKreadBits(hBs, 4);
    424 
    425   if (!(flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC))) {
    426     hHeaderData->bs_info.xover_band = FDKreadBits(hBs, 3);
    427     FDKreadBits(hBs, 2);
    428   }
    429 
    430   headerExtra1 = FDKreadBits(hBs, 1);
    431   headerExtra2 = FDKreadBits(hBs, 1);
    432 
    433   /* Handle extra header information */
    434   if (headerExtra1) {
    435     pBsData->freqScale = FDKreadBits(hBs, 2);
    436     pBsData->alterScale = FDKreadBits(hBs, 1);
    437     pBsData->noise_bands = FDKreadBits(hBs, 2);
    438   } else {
    439     pBsData->freqScale = 2;
    440     pBsData->alterScale = 1;
    441     pBsData->noise_bands = 2;
    442   }
    443 
    444   if (headerExtra2) {
    445     pBsData->limiterBands = FDKreadBits(hBs, 2);
    446     pBsData->limiterGains = FDKreadBits(hBs, 2);
    447     pBsData->interpolFreq = FDKreadBits(hBs, 1);
    448     pBsData->smoothingLength = FDKreadBits(hBs, 1);
    449   } else {
    450     pBsData->limiterBands = 2;
    451     pBsData->limiterGains = 2;
    452     pBsData->interpolFreq = 1;
    453     pBsData->smoothingLength = 1;
    454   }
    455 
    456   /* Look for new settings. IEC 14496-3, 4.6.18.3.1 */
    457   if (hHeaderData->syncState < SBR_HEADER ||
    458       lastHeader.startFreq != pBsData->startFreq ||
    459       lastHeader.stopFreq != pBsData->stopFreq ||
    460       lastHeader.freqScale != pBsData->freqScale ||
    461       lastHeader.alterScale != pBsData->alterScale ||
    462       lastHeader.noise_bands != pBsData->noise_bands ||
    463       lastInfo.xover_band != hHeaderData->bs_info.xover_band) {
    464     return HEADER_RESET; /* New settings */
    465   }
    466 
    467   return HEADER_OK;
    468 }
    469 
    470 /*!
    471   \brief   Get missing harmonics parameters (only used for AAC+SBR)
    472 
    473   \return  error status - 0 if ok
    474 */
    475 int sbrGetSyntheticCodedData(HANDLE_SBR_HEADER_DATA hHeaderData,
    476                              HANDLE_SBR_FRAME_DATA hFrameData,
    477                              HANDLE_FDK_BITSTREAM hBs, const UINT flags) {
    478   int i, bitsRead = 0;
    479 
    480   int add_harmonic_flag = FDKreadBits(hBs, 1);
    481   bitsRead++;
    482 
    483   if (add_harmonic_flag) {
    484     int nSfb = hHeaderData->freqBandData.nSfb[1];
    485     for (i = 0; i < ADD_HARMONICS_FLAGS_SIZE; i++) {
    486       /* read maximum 32 bits and align them to the MSB */
    487       int readBits = fMin(32, nSfb);
    488       nSfb -= readBits;
    489       if (readBits > 0) {
    490         hFrameData->addHarmonics[i] = FDKreadBits(hBs, readBits)
    491                                       << (32 - readBits);
    492       } else {
    493         hFrameData->addHarmonics[i] = 0;
    494       }
    495 
    496       bitsRead += readBits;
    497     }
    498     /* bs_pvc_mode = 0 for Rsvd50 */
    499     if (flags & SBRDEC_SYNTAX_USAC) {
    500       if (hHeaderData->bs_info.pvc_mode) {
    501         int bs_sinusoidal_position = 31;
    502         if (FDKreadBit(hBs) /* bs_sinusoidal_position_flag */) {
    503           bs_sinusoidal_position = FDKreadBits(hBs, 5);
    504         }
    505         hFrameData->sinusoidal_position = bs_sinusoidal_position;
    506       }
    507     }
    508   } else {
    509     for (i = 0; i < ADD_HARMONICS_FLAGS_SIZE; i++)
    510       hFrameData->addHarmonics[i] = 0;
    511   }
    512 
    513   return (bitsRead);
    514 }
    515 
    516 /*!
    517   \brief      Reads extension data from the bitstream
    518 
    519   The bitstream format allows up to 4 kinds of extended data element.
    520   Extended data may contain several elements, each identified by a 2-bit-ID.
    521   So far, no extended data elements are defined hence the first 2 parameters
    522   are unused. The data should be skipped in order to update the number
    523   of read bits for the consistency check in applySBR().
    524 */
    525 static int extractExtendedData(
    526     HANDLE_SBR_HEADER_DATA hHeaderData, /*!< handle to SBR header */
    527     HANDLE_FDK_BITSTREAM hBs            /*!< Handle to the bit buffer */
    528     ,
    529     HANDLE_PS_DEC hParametricStereoDec /*!< Parametric Stereo Decoder */
    530 ) {
    531   INT nBitsLeft;
    532   int extended_data;
    533   int i, frameOk = 1;
    534 
    535   extended_data = FDKreadBits(hBs, 1);
    536 
    537   if (extended_data) {
    538     int cnt;
    539     int bPsRead = 0;
    540 
    541     cnt = FDKreadBits(hBs, 4);
    542     if (cnt == (1 << 4) - 1) cnt += FDKreadBits(hBs, 8);
    543 
    544     nBitsLeft = 8 * cnt;
    545 
    546     /* sanity check for cnt */
    547     if (nBitsLeft > (INT)FDKgetValidBits(hBs)) {
    548       /* limit nBitsLeft */
    549       nBitsLeft = (INT)FDKgetValidBits(hBs);
    550       /* set frame error */
    551       frameOk = 0;
    552     }
    553 
    554     while (nBitsLeft > 7) {
    555       int extension_id = FDKreadBits(hBs, 2);
    556       nBitsLeft -= 2;
    557 
    558       switch (extension_id) {
    559         case EXTENSION_ID_PS_CODING:
    560 
    561           /* Read PS data from bitstream */
    562 
    563           if (hParametricStereoDec != NULL) {
    564             if (bPsRead &&
    565                 !hParametricStereoDec->bsData[hParametricStereoDec->bsReadSlot]
    566                      .mpeg.bPsHeaderValid) {
    567               cnt = nBitsLeft >> 3; /* number of remaining bytes */
    568               for (i = 0; i < cnt; i++) FDKreadBits(hBs, 8);
    569               nBitsLeft -= cnt * 8;
    570             } else {
    571               nBitsLeft -=
    572                   (INT)ReadPsData(hParametricStereoDec, hBs, nBitsLeft);
    573               bPsRead = 1;
    574             }
    575           }
    576 
    577           /* parametric stereo detected, could set channelMode accordingly here
    578            */
    579           /*                                                                     */
    580           /* "The usage of this parametric stereo extension to HE-AAC is */
    581           /* signalled implicitly in the bitstream. Hence, if an sbr_extension()
    582            */
    583           /* with bs_extension_id==EXTENSION_ID_PS is found in the SBR part of
    584            */
    585           /* the bitstream, a decoder supporting the combination of SBR and PS
    586            */
    587           /* shall operate the PS tool to generate a stereo output signal." */
    588           /* source: ISO/IEC 14496-3:2001/FDAM 2:2004(E) */
    589 
    590           break;
    591 
    592         default:
    593           cnt = nBitsLeft >> 3; /* number of remaining bytes */
    594           for (i = 0; i < cnt; i++) FDKreadBits(hBs, 8);
    595           nBitsLeft -= cnt * 8;
    596           break;
    597       }
    598     }
    599 
    600     if (nBitsLeft < 0) {
    601       frameOk = 0;
    602       goto bail;
    603     } else {
    604       /* Read fill bits for byte alignment */
    605       FDKreadBits(hBs, nBitsLeft);
    606     }
    607   }
    608 
    609 bail:
    610   return (frameOk);
    611 }
    612 
    613 /*!
    614   \brief      Read bitstream elements of a SBR channel element
    615   \return     SbrFrameOK
    616 */
    617 int sbrGetChannelElement(HANDLE_SBR_HEADER_DATA hHeaderData,
    618                          HANDLE_SBR_FRAME_DATA hFrameDataLeft,
    619                          HANDLE_SBR_FRAME_DATA hFrameDataRight,
    620                          HANDLE_SBR_PREV_FRAME_DATA hFrameDataLeftPrev,
    621                          UCHAR pvc_mode_last, HANDLE_FDK_BITSTREAM hBs,
    622                          HANDLE_PS_DEC hParametricStereoDec, const UINT flags,
    623                          const int overlap) {
    624   int i, bs_coupling = COUPLING_OFF;
    625   const int nCh = (hFrameDataRight == NULL) ? 1 : 2;
    626 
    627   if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) {
    628     /* Reserved bits */
    629     if (FDKreadBits(hBs, 1)) { /* bs_data_extra */
    630       FDKreadBits(hBs, 4);
    631       if ((flags & SBRDEC_SYNTAX_SCAL) || (nCh == 2)) {
    632         FDKreadBits(hBs, 4);
    633       }
    634     }
    635   }
    636 
    637   if (nCh == 2) {
    638     /* Read coupling flag */
    639     bs_coupling = FDKreadBits(hBs, 1);
    640     if (bs_coupling) {
    641       hFrameDataLeft->coupling = COUPLING_LEVEL;
    642       hFrameDataRight->coupling = COUPLING_BAL;
    643     } else {
    644       hFrameDataLeft->coupling = COUPLING_OFF;
    645       hFrameDataRight->coupling = COUPLING_OFF;
    646     }
    647   } else {
    648     if (flags & SBRDEC_SYNTAX_SCAL) {
    649       FDKreadBits(hBs, 1); /* bs_coupling */
    650     }
    651     hFrameDataLeft->coupling = COUPLING_OFF;
    652   }
    653 
    654   if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) {
    655     if (flags & SBRDEC_USAC_HARMONICSBR) {
    656       hFrameDataLeft->sbrPatchingMode = FDKreadBit(hBs);
    657       if (hFrameDataLeft->sbrPatchingMode == 0) {
    658         hFrameDataLeft->sbrOversamplingFlag = FDKreadBit(hBs);
    659         if (FDKreadBit(hBs)) { /* sbrPitchInBinsFlag */
    660           hFrameDataLeft->sbrPitchInBins = FDKreadBits(hBs, 7);
    661         } else {
    662           hFrameDataLeft->sbrPitchInBins = 0;
    663         }
    664       } else {
    665         hFrameDataLeft->sbrOversamplingFlag = 0;
    666         hFrameDataLeft->sbrPitchInBins = 0;
    667       }
    668 
    669       if (nCh == 2) {
    670         if (bs_coupling) {
    671           hFrameDataRight->sbrPatchingMode = hFrameDataLeft->sbrPatchingMode;
    672           hFrameDataRight->sbrOversamplingFlag =
    673               hFrameDataLeft->sbrOversamplingFlag;
    674           hFrameDataRight->sbrPitchInBins = hFrameDataLeft->sbrPitchInBins;
    675         } else {
    676           hFrameDataRight->sbrPatchingMode = FDKreadBit(hBs);
    677           if (hFrameDataRight->sbrPatchingMode == 0) {
    678             hFrameDataRight->sbrOversamplingFlag = FDKreadBit(hBs);
    679             if (FDKreadBit(hBs)) { /* sbrPitchInBinsFlag */
    680               hFrameDataRight->sbrPitchInBins = FDKreadBits(hBs, 7);
    681             } else {
    682               hFrameDataRight->sbrPitchInBins = 0;
    683             }
    684           } else {
    685             hFrameDataRight->sbrOversamplingFlag = 0;
    686             hFrameDataRight->sbrPitchInBins = 0;
    687           }
    688         }
    689       }
    690     } else {
    691       if (nCh == 2) {
    692         hFrameDataRight->sbrPatchingMode = 1;
    693         hFrameDataRight->sbrOversamplingFlag = 0;
    694         hFrameDataRight->sbrPitchInBins = 0;
    695       }
    696 
    697       hFrameDataLeft->sbrPatchingMode = 1;
    698       hFrameDataLeft->sbrOversamplingFlag = 0;
    699       hFrameDataLeft->sbrPitchInBins = 0;
    700     }
    701   } else {
    702     if (nCh == 2) {
    703       hFrameDataRight->sbrPatchingMode = 1;
    704       hFrameDataRight->sbrOversamplingFlag = 0;
    705       hFrameDataRight->sbrPitchInBins = 0;
    706     }
    707 
    708     hFrameDataLeft->sbrPatchingMode = 1;
    709     hFrameDataLeft->sbrOversamplingFlag = 0;
    710     hFrameDataLeft->sbrPitchInBins = 0;
    711   }
    712 
    713   /*
    714     sbr_grid(): Grid control
    715   */
    716   if (hHeaderData->bs_info.pvc_mode) {
    717     FDK_ASSERT(nCh == 1); /* PVC not possible for CPE */
    718     if (!extractPvcFrameInfo(hBs, hHeaderData, hFrameDataLeft,
    719                              hFrameDataLeftPrev, pvc_mode_last, flags))
    720       return 0;
    721 
    722     if (!checkFrameInfo(&hFrameDataLeft->frameInfo,
    723                         hHeaderData->numberTimeSlots, overlap,
    724                         hHeaderData->timeStep))
    725       return 0;
    726   } else {
    727     if (!extractFrameInfo(hBs, hHeaderData, hFrameDataLeft, 1, flags)) return 0;
    728 
    729     if (!checkFrameInfo(&hFrameDataLeft->frameInfo,
    730                         hHeaderData->numberTimeSlots, overlap,
    731                         hHeaderData->timeStep))
    732       return 0;
    733   }
    734   if (nCh == 2) {
    735     if (hFrameDataLeft->coupling) {
    736       FDKmemcpy(&hFrameDataRight->frameInfo, &hFrameDataLeft->frameInfo,
    737                 sizeof(FRAME_INFO));
    738       hFrameDataRight->ampResolutionCurrentFrame =
    739           hFrameDataLeft->ampResolutionCurrentFrame;
    740     } else {
    741       if (!extractFrameInfo(hBs, hHeaderData, hFrameDataRight, 2, flags))
    742         return 0;
    743 
    744       if (!checkFrameInfo(&hFrameDataRight->frameInfo,
    745                           hHeaderData->numberTimeSlots, overlap,
    746                           hHeaderData->timeStep))
    747         return 0;
    748     }
    749   }
    750 
    751   /*
    752     sbr_dtdf(): Fetch domain vectors (time or frequency direction for
    753     delta-coding)
    754   */
    755   sbrGetDirectionControlData(hFrameDataLeft, hBs, flags,
    756                              hHeaderData->bs_info.pvc_mode);
    757   if (nCh == 2) {
    758     sbrGetDirectionControlData(hFrameDataRight, hBs, flags, 0);
    759   }
    760 
    761   /* sbr_invf() */
    762   for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) {
    763     hFrameDataLeft->sbr_invf_mode[i] = (INVF_MODE)FDKreadBits(hBs, 2);
    764   }
    765   if (nCh == 2) {
    766     if (hFrameDataLeft->coupling) {
    767       for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) {
    768         hFrameDataRight->sbr_invf_mode[i] = hFrameDataLeft->sbr_invf_mode[i];
    769       }
    770     } else {
    771       for (i = 0; i < hHeaderData->freqBandData.nInvfBands; i++) {
    772         hFrameDataRight->sbr_invf_mode[i] = (INVF_MODE)FDKreadBits(hBs, 2);
    773       }
    774     }
    775   }
    776 
    777   if (nCh == 1) {
    778     if (hHeaderData->bs_info.pvc_mode) {
    779       if (!sbrGetPvcEnvelope(hHeaderData, hFrameDataLeft, hBs, flags,
    780                              hHeaderData->bs_info.pvc_mode))
    781         return 0;
    782     } else if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags))
    783       return 0;
    784 
    785     sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs);
    786   } else if (hFrameDataLeft->coupling) {
    787     if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags)) {
    788       return 0;
    789     }
    790 
    791     sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs);
    792 
    793     if (!sbrGetEnvelope(hHeaderData, hFrameDataRight, hBs, flags)) {
    794       return 0;
    795     }
    796     sbrGetNoiseFloorData(hHeaderData, hFrameDataRight, hBs);
    797   } else { /* nCh == 2 && no coupling */
    798 
    799     if (!sbrGetEnvelope(hHeaderData, hFrameDataLeft, hBs, flags)) return 0;
    800 
    801     if (!sbrGetEnvelope(hHeaderData, hFrameDataRight, hBs, flags)) return 0;
    802 
    803     sbrGetNoiseFloorData(hHeaderData, hFrameDataLeft, hBs);
    804 
    805     sbrGetNoiseFloorData(hHeaderData, hFrameDataRight, hBs);
    806   }
    807 
    808   sbrGetSyntheticCodedData(hHeaderData, hFrameDataLeft, hBs, flags);
    809   if (nCh == 2) {
    810     sbrGetSyntheticCodedData(hHeaderData, hFrameDataRight, hBs, flags);
    811   }
    812 
    813   if (!(flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50))) {
    814     if (!extractExtendedData(hHeaderData, hBs, hParametricStereoDec)) {
    815       return 0;
    816     }
    817   }
    818 
    819   return 1;
    820 }
    821 
    822 /*!
    823   \brief   Read direction control data from bitstream
    824 */
    825 void sbrGetDirectionControlData(
    826     HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */
    827     HANDLE_FDK_BITSTREAM hBs,           /*!< handle to struct BIT_BUF */
    828     const UINT flags, const int bs_pvc_mode)
    829 
    830 {
    831   int i;
    832   int indepFlag = 0;
    833 
    834   if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) {
    835     indepFlag = flags & SBRDEC_USAC_INDEP;
    836   }
    837 
    838   if (bs_pvc_mode == 0) {
    839     i = 0;
    840     if (indepFlag) {
    841       h_frame_data->domain_vec[i++] = 0;
    842     }
    843     for (; i < h_frame_data->frameInfo.nEnvelopes; i++) {
    844       h_frame_data->domain_vec[i] = FDKreadBits(hBs, 1);
    845     }
    846   }
    847 
    848   i = 0;
    849   if (indepFlag) {
    850     h_frame_data->domain_vec_noise[i++] = 0;
    851   }
    852   for (; i < h_frame_data->frameInfo.nNoiseEnvelopes; i++) {
    853     h_frame_data->domain_vec_noise[i] = FDKreadBits(hBs, 1);
    854   }
    855 }
    856 
    857 /*!
    858   \brief   Read noise-floor-level data from bitstream
    859 */
    860 void sbrGetNoiseFloorData(
    861     HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
    862     HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */
    863     HANDLE_FDK_BITSTREAM hBs)           /*!< handle to struct BIT_BUF */
    864 {
    865   int i, j;
    866   int delta;
    867   COUPLING_MODE coupling;
    868   int noNoiseBands = hHeaderData->freqBandData.nNfb;
    869 
    870   Huffman hcb_noiseF;
    871   Huffman hcb_noise;
    872   int envDataTableCompFactor;
    873 
    874   coupling = h_frame_data->coupling;
    875 
    876   /*
    877     Select huffman codebook depending on coupling mode
    878   */
    879   if (coupling == COUPLING_BAL) {
    880     hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseBalance11T;
    881     hcb_noiseF =
    882         (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F; /* "sbr_huffBook_NoiseBalance11F"
    883                                                               */
    884     envDataTableCompFactor = 1;
    885   } else {
    886     hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseLevel11T;
    887     hcb_noiseF =
    888         (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F; /* "sbr_huffBook_NoiseLevel11F"
    889                                                             */
    890     envDataTableCompFactor = 0;
    891   }
    892 
    893   /*
    894     Read raw noise-envelope data
    895   */
    896   for (i = 0; i < h_frame_data->frameInfo.nNoiseEnvelopes; i++) {
    897     if (h_frame_data->domain_vec_noise[i] == 0) {
    898       if (coupling == COUPLING_BAL) {
    899         h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands] =
    900             (FIXP_SGL)(((int)FDKreadBits(hBs, 5)) << envDataTableCompFactor);
    901       } else {
    902         h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands] =
    903             (FIXP_SGL)(int)FDKreadBits(hBs, 5);
    904       }
    905 
    906       for (j = 1; j < noNoiseBands; j++) {
    907         delta = DecodeHuffmanCW(hcb_noiseF, hBs);
    908         h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands + j] =
    909             (FIXP_SGL)(delta << envDataTableCompFactor);
    910       }
    911     } else {
    912       for (j = 0; j < noNoiseBands; j++) {
    913         delta = DecodeHuffmanCW(hcb_noise, hBs);
    914         h_frame_data->sbrNoiseFloorLevel[i * noNoiseBands + j] =
    915             (FIXP_SGL)(delta << envDataTableCompFactor);
    916       }
    917     }
    918   }
    919 }
    920 
    921 /* ns = mapNsMode2ns[pvcMode-1][nsMode] */
    922 static const UCHAR mapNsMode2ns[2][2] = {
    923     {16, 4}, /* pvcMode = 1 */
    924     {12, 3}  /* pvcMode = 2 */
    925 };
    926 
    927 static int sbrGetPvcEnvelope(
    928     HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
    929     HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */
    930     HANDLE_FDK_BITSTREAM hBs,           /*!< handle to struct BIT_BUF */
    931     const UINT flags, const UINT pvcMode) {
    932   int divMode, nsMode;
    933   int indepFlag = flags & SBRDEC_USAC_INDEP;
    934   UCHAR *pvcID = h_frame_data->pvcID;
    935 
    936   divMode = FDKreadBits(hBs, PVC_DIVMODE_BITS);
    937   nsMode = FDKreadBit(hBs);
    938   FDK_ASSERT((pvcMode == 1) || (pvcMode == 2));
    939   h_frame_data->ns = mapNsMode2ns[pvcMode - 1][nsMode];
    940 
    941   if (divMode <= 3) {
    942     int i, k = 1, sum_length = 0, reuse_pcvID;
    943 
    944     /* special treatment for first time slot k=0 */
    945     indepFlag ? (reuse_pcvID = 0) : (reuse_pcvID = FDKreadBit(hBs));
    946     if (reuse_pcvID) {
    947       pvcID[0] = hHeaderData->pvcIDprev;
    948     } else {
    949       pvcID[0] = FDKreadBits(hBs, PVC_PVCID_BITS);
    950     }
    951 
    952     /* other time slots k>0 */
    953     for (i = 0; i < divMode; i++) {
    954       int length, numBits = 4;
    955 
    956       if (sum_length >= 13) {
    957         numBits = 1;
    958       } else if (sum_length >= 11) {
    959         numBits = 2;
    960       } else if (sum_length >= 7) {
    961         numBits = 3;
    962       }
    963 
    964       length = FDKreadBits(hBs, numBits);
    965       sum_length += length + 1;
    966       if (sum_length >= PVC_NTIMESLOT) {
    967         return 0; /* parse error */
    968       }
    969       for (; length--; k++) {
    970         pvcID[k] = pvcID[k - 1];
    971       }
    972       pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS);
    973     }
    974     for (; k < 16; k++) {
    975       pvcID[k] = pvcID[k - 1];
    976     }
    977   } else { /* divMode >= 4 */
    978     int num_grid_info, fixed_length, grid_info, j, k = 0;
    979 
    980     divMode -= 4;
    981     num_grid_info = 2 << divMode;
    982     fixed_length = 8 >> divMode;
    983     FDK_ASSERT(num_grid_info * fixed_length == PVC_NTIMESLOT);
    984 
    985     /* special treatment for first time slot k=0 */
    986     indepFlag ? (grid_info = 1) : (grid_info = FDKreadBit(hBs));
    987     if (grid_info) {
    988       pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS);
    989     } else {
    990       pvcID[k++] = hHeaderData->pvcIDprev;
    991     }
    992     j = fixed_length - 1;
    993     for (; j--; k++) {
    994       pvcID[k] = pvcID[k - 1];
    995     }
    996     num_grid_info--;
    997 
    998     /* other time slots k>0 */
    999     for (; num_grid_info--;) {
   1000       j = fixed_length;
   1001       grid_info = FDKreadBit(hBs);
   1002       if (grid_info) {
   1003         pvcID[k++] = FDKreadBits(hBs, PVC_PVCID_BITS);
   1004         j--;
   1005       }
   1006       for (; j--; k++) {
   1007         pvcID[k] = pvcID[k - 1];
   1008       }
   1009     }
   1010   }
   1011 
   1012   hHeaderData->pvcIDprev = pvcID[PVC_NTIMESLOT - 1];
   1013 
   1014   /* usage of PVC excludes inter-TES tool */
   1015   h_frame_data->iTESactive = (UCHAR)0;
   1016 
   1017   return 1;
   1018 }
   1019 /*!
   1020   \brief   Read envelope data from bitstream
   1021 */
   1022 static int sbrGetEnvelope(
   1023     HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
   1024     HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */
   1025     HANDLE_FDK_BITSTREAM hBs,           /*!< handle to struct BIT_BUF */
   1026     const UINT flags) {
   1027   int i, j;
   1028   UCHAR no_band[MAX_ENVELOPES];
   1029   int delta = 0;
   1030   int offset = 0;
   1031   COUPLING_MODE coupling = h_frame_data->coupling;
   1032   int ampRes = hHeaderData->bs_info.ampResolution;
   1033   int nEnvelopes = h_frame_data->frameInfo.nEnvelopes;
   1034   int envDataTableCompFactor;
   1035   int start_bits, start_bits_balance;
   1036   Huffman hcb_t, hcb_f;
   1037 
   1038   h_frame_data->nScaleFactors = 0;
   1039 
   1040   if ((h_frame_data->frameInfo.frameClass == 0) && (nEnvelopes == 1)) {
   1041     if (flags & SBRDEC_ELD_GRID)
   1042       ampRes = h_frame_data->ampResolutionCurrentFrame;
   1043     else
   1044       ampRes = 0;
   1045   }
   1046   h_frame_data->ampResolutionCurrentFrame = ampRes;
   1047 
   1048   /*
   1049     Set number of bits for first value depending on amplitude resolution
   1050   */
   1051   if (ampRes == 1) {
   1052     start_bits = 6;
   1053     start_bits_balance = 5;
   1054   } else {
   1055     start_bits = 7;
   1056     start_bits_balance = 6;
   1057   }
   1058 
   1059   /*
   1060     Calculate number of values for each envelope and alltogether
   1061   */
   1062   for (i = 0; i < nEnvelopes; i++) {
   1063     no_band[i] =
   1064         hHeaderData->freqBandData.nSfb[h_frame_data->frameInfo.freqRes[i]];
   1065     h_frame_data->nScaleFactors += no_band[i];
   1066   }
   1067   if (h_frame_data->nScaleFactors > MAX_NUM_ENVELOPE_VALUES) return 0;
   1068 
   1069   /*
   1070     Select Huffman codebook depending on coupling mode and amplitude resolution
   1071   */
   1072   if (coupling == COUPLING_BAL) {
   1073     envDataTableCompFactor = 1;
   1074     if (ampRes == 0) {
   1075       hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10T;
   1076       hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10F;
   1077     } else {
   1078       hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11T;
   1079       hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F;
   1080     }
   1081   } else {
   1082     envDataTableCompFactor = 0;
   1083     if (ampRes == 0) {
   1084       hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10T;
   1085       hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10F;
   1086     } else {
   1087       hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11T;
   1088       hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F;
   1089     }
   1090   }
   1091 
   1092   h_frame_data->iTESactive = (UCHAR)0; /* disable inter-TES by default */
   1093   /*
   1094     Now read raw envelope data
   1095   */
   1096   for (j = 0, offset = 0; j < nEnvelopes; j++) {
   1097     if (h_frame_data->domain_vec[j] == 0) {
   1098       if (coupling == COUPLING_BAL) {
   1099         h_frame_data->iEnvelope[offset] =
   1100             (FIXP_SGL)(((int)FDKreadBits(hBs, start_bits_balance))
   1101                        << envDataTableCompFactor);
   1102       } else {
   1103         h_frame_data->iEnvelope[offset] =
   1104             (FIXP_SGL)(int)FDKreadBits(hBs, start_bits);
   1105       }
   1106     }
   1107 
   1108     for (i = (1 - h_frame_data->domain_vec[j]); i < no_band[j]; i++) {
   1109       if (h_frame_data->domain_vec[j] == 0) {
   1110         delta = DecodeHuffmanCW(hcb_f, hBs);
   1111       } else {
   1112         delta = DecodeHuffmanCW(hcb_t, hBs);
   1113       }
   1114 
   1115       h_frame_data->iEnvelope[offset + i] =
   1116           (FIXP_SGL)(delta << envDataTableCompFactor);
   1117     }
   1118     if ((flags & SBRDEC_SYNTAX_USAC) && (flags & SBRDEC_USAC_ITES)) {
   1119       int bs_temp_shape = FDKreadBit(hBs);
   1120       FDK_ASSERT(j < 8);
   1121       h_frame_data->iTESactive |= (UCHAR)(bs_temp_shape << j);
   1122       if (bs_temp_shape) {
   1123         h_frame_data->interTempShapeMode[j] =
   1124             FDKread2Bits(hBs); /* bs_inter_temp_shape_mode */
   1125       } else {
   1126         h_frame_data->interTempShapeMode[j] = 0;
   1127       }
   1128     }
   1129     offset += no_band[j];
   1130   }
   1131 
   1132 #if ENV_EXP_FRACT
   1133   /* Convert from int to scaled fract (ENV_EXP_FRACT bits for the fractional
   1134    * part) */
   1135   for (i = 0; i < h_frame_data->nScaleFactors; i++) {
   1136     h_frame_data->iEnvelope[i] <<= ENV_EXP_FRACT;
   1137   }
   1138 #endif
   1139 
   1140   return 1;
   1141 }
   1142 
   1143 /***************************************************************************/
   1144 /*!
   1145   \brief    Generates frame info for FIXFIXonly frame class used for low delay
   1146  version
   1147 
   1148   \return   zero for error, one for correct.
   1149  ****************************************************************************/
   1150 static int generateFixFixOnly(FRAME_INFO *hSbrFrameInfo, int tranPosInternal,
   1151                               int numberTimeSlots, const UINT flags) {
   1152   int nEnv, i, tranIdx;
   1153   const int *pTable;
   1154 
   1155   if (tranPosInternal >= numberTimeSlots) {
   1156     return 0;
   1157   }
   1158 
   1159   switch (numberTimeSlots) {
   1160     case 8:
   1161       pTable = FDK_sbrDecoder_envelopeTable_8[tranPosInternal];
   1162       break;
   1163     case 15:
   1164       pTable = FDK_sbrDecoder_envelopeTable_15[tranPosInternal];
   1165       break;
   1166     case 16:
   1167       pTable = FDK_sbrDecoder_envelopeTable_16[tranPosInternal];
   1168       break;
   1169     default:
   1170       return 0;
   1171   }
   1172 
   1173   /* look number of envelopes in table */
   1174   nEnv = pTable[0];
   1175   /* look up envelope distribution in table */
   1176   for (i = 1; i < nEnv; i++) hSbrFrameInfo->borders[i] = pTable[i + 2];
   1177   /* open and close frame border */
   1178   hSbrFrameInfo->borders[0] = 0;
   1179   hSbrFrameInfo->borders[nEnv] = numberTimeSlots;
   1180   hSbrFrameInfo->nEnvelopes = nEnv;
   1181 
   1182   /* transient idx */
   1183   tranIdx = hSbrFrameInfo->tranEnv = pTable[1];
   1184 
   1185   /* add noise floors */
   1186   hSbrFrameInfo->bordersNoise[0] = 0;
   1187   hSbrFrameInfo->bordersNoise[1] =
   1188       hSbrFrameInfo->borders[tranIdx ? tranIdx : 1];
   1189   hSbrFrameInfo->bordersNoise[2] = numberTimeSlots;
   1190   /* nEnv is always > 1, so nNoiseEnvelopes is always 2 (IEC 14496-3 4.6.19.3.2)
   1191    */
   1192   hSbrFrameInfo->nNoiseEnvelopes = 2;
   1193 
   1194   return 1;
   1195 }
   1196 
   1197 /*!
   1198   \brief  Extracts LowDelaySBR control data from the bitstream.
   1199 
   1200   \return zero for bitstream error, one for correct.
   1201 */
   1202 static int extractLowDelayGrid(
   1203     HANDLE_FDK_BITSTREAM hBitBuf, /*!< bitbuffer handle */
   1204     HANDLE_SBR_HEADER_DATA hHeaderData,
   1205     HANDLE_SBR_FRAME_DATA
   1206         h_frame_data, /*!< contains the FRAME_INFO struct to be filled */
   1207     int timeSlots, const UINT flags) {
   1208   FRAME_INFO *pFrameInfo = &h_frame_data->frameInfo;
   1209   INT numberTimeSlots = hHeaderData->numberTimeSlots;
   1210   INT temp = 0, k;
   1211 
   1212   /* FIXFIXonly framing case */
   1213   h_frame_data->frameInfo.frameClass = 0;
   1214 
   1215   /* get the transient position from the bitstream */
   1216   switch (timeSlots) {
   1217     case 8:
   1218       /* 3bit transient position (temp={0;..;7}) */
   1219       temp = FDKreadBits(hBitBuf, 3);
   1220       break;
   1221 
   1222     case 16:
   1223     case 15:
   1224       /* 4bit transient position (temp={0;..;15}) */
   1225       temp = FDKreadBits(hBitBuf, 4);
   1226       break;
   1227 
   1228     default:
   1229       return 0;
   1230   }
   1231 
   1232   /* For "case 15" only*/
   1233   if (temp >= timeSlots) {
   1234     return 0;
   1235   }
   1236 
   1237   /* calculate borders according to the transient position */
   1238   if (!generateFixFixOnly(pFrameInfo, temp, numberTimeSlots, flags)) {
   1239     return 0;
   1240   }
   1241 
   1242   /* decode freq res: */
   1243   for (k = 0; k < pFrameInfo->nEnvelopes; k++) {
   1244     pFrameInfo->freqRes[k] =
   1245         (UCHAR)FDKreadBits(hBitBuf, 1); /* f = F [1 bits] */
   1246   }
   1247 
   1248   return 1;
   1249 }
   1250 
   1251 /*!
   1252   \brief   Extract the PVC frame information (structure FRAME_INFO) from the
   1253   bitstream \return  Zero for bitstream error, one for correct.
   1254 */
   1255 int extractPvcFrameInfo(
   1256     HANDLE_FDK_BITSTREAM hBs,           /*!< bitbuffer handle */
   1257     HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
   1258     HANDLE_SBR_FRAME_DATA h_frame_data, /*!< pointer to memory where the
   1259                                            frame-info will be stored */
   1260     HANDLE_SBR_PREV_FRAME_DATA h_prev_frame_data, /*!< pointer to memory where
   1261                                                      the previous frame-info
   1262                                                      will be stored */
   1263     UCHAR pvc_mode_last,                          /**< PVC mode of last frame */
   1264     const UINT flags) {
   1265   FRAME_INFO *pFrameInfo = &h_frame_data->frameInfo;
   1266   FRAME_INFO *pPrevFrameInfo = &h_prev_frame_data->prevFrameInfo;
   1267   int bs_var_len_hf, bs_noise_position;
   1268   bs_noise_position = FDKreadBits(hBs, 4); /* SBR_PVC_NOISEPOSITION_BITS 4 */
   1269   bs_var_len_hf = FDKreadBit(hBs);
   1270   pFrameInfo->noisePosition = bs_noise_position;
   1271   pFrameInfo->tranEnv = -1;
   1272 
   1273   /* Init for bs_noise_position == 0 in case a parse error is found below. */
   1274   pFrameInfo->nEnvelopes = 1;
   1275   pFrameInfo->nNoiseEnvelopes = 1;
   1276   pFrameInfo->freqRes[0] = 0;
   1277 
   1278   if (bs_var_len_hf) { /* 1 or 3 Bits */
   1279     pFrameInfo->varLength = FDKreadBits(hBs, 2) + 1;
   1280     if (pFrameInfo->varLength > 3) {
   1281       pFrameInfo->varLength =
   1282           0;    /* assume bs_var_len_hf == 0 in case of error */
   1283       return 0; /* reserved value -> parse error */
   1284     }
   1285   } else {
   1286     pFrameInfo->varLength = 0;
   1287   }
   1288 
   1289   if (bs_noise_position) {
   1290     pFrameInfo->nEnvelopes = 2;
   1291     pFrameInfo->nNoiseEnvelopes = 2;
   1292     FDKmemclear(pFrameInfo->freqRes, sizeof(pFrameInfo->freqRes));
   1293   }
   1294 
   1295   /* frame border calculation */
   1296   if (hHeaderData->bs_info.pvc_mode > 0) {
   1297     /* See "7.5.1.4 HF adjustment of SBR envelope scalefactors" for reference.
   1298      */
   1299 
   1300     FDK_ASSERT((pFrameInfo->nEnvelopes == 1) || (pFrameInfo->nEnvelopes == 2));
   1301 
   1302     /* left timeborder-offset: use the timeborder of prev SBR frame */
   1303     if (pPrevFrameInfo->nEnvelopes > 0) {
   1304       pFrameInfo->borders[0] =
   1305           pPrevFrameInfo->borders[pPrevFrameInfo->nEnvelopes] - PVC_NTIMESLOT;
   1306       FDK_ASSERT(pFrameInfo->borders[0] <= 3);
   1307     } else {
   1308       pFrameInfo->borders[0] = 0;
   1309     }
   1310 
   1311     /* right timeborder-offset: */
   1312     pFrameInfo->borders[pFrameInfo->nEnvelopes] = 16 + pFrameInfo->varLength;
   1313 
   1314     if (pFrameInfo->nEnvelopes == 2) {
   1315       pFrameInfo->borders[1] = pFrameInfo->noisePosition;
   1316     }
   1317 
   1318     /* Calculation of PVC time borders t_EPVC */
   1319     if (pvc_mode_last == 0) {
   1320       /* there was a legacy SBR frame before this frame => use bs_var_len' for
   1321        * first PVC timeslot */
   1322       pFrameInfo->pvcBorders[0] = pFrameInfo->borders[0];
   1323     } else {
   1324       pFrameInfo->pvcBorders[0] = 0;
   1325     }
   1326     if (pFrameInfo->nEnvelopes == 2) {
   1327       pFrameInfo->pvcBorders[1] = pFrameInfo->borders[1];
   1328     }
   1329     pFrameInfo->pvcBorders[pFrameInfo->nEnvelopes] = 16;
   1330 
   1331     /* calculation of SBR noise-floor time-border vector: */
   1332     for (INT i = 0; i <= pFrameInfo->nNoiseEnvelopes; i++) {
   1333       pFrameInfo->bordersNoise[i] = pFrameInfo->borders[i];
   1334     }
   1335 
   1336     pFrameInfo->tranEnv = -1; /* tranEnv not used */
   1337   }
   1338   return 1;
   1339 }
   1340 
   1341 /*!
   1342   \brief   Extract the frame information (structure FRAME_INFO) from the
   1343   bitstream \return  Zero for bitstream error, one for correct.
   1344 */
   1345 int extractFrameInfo(
   1346     HANDLE_FDK_BITSTREAM hBs,           /*!< bitbuffer handle */
   1347     HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
   1348     HANDLE_SBR_FRAME_DATA h_frame_data, /*!< pointer to memory where the
   1349                                            frame-info will be stored */
   1350     const UINT nrOfChannels, const UINT flags) {
   1351   FRAME_INFO *pFrameInfo = &h_frame_data->frameInfo;
   1352   int numberTimeSlots = hHeaderData->numberTimeSlots;
   1353   int pointer_bits = 0, nEnv = 0, b = 0, border, i, n = 0, k, p, aL, aR, nL, nR,
   1354       temp = 0, staticFreqRes;
   1355   UCHAR frameClass;
   1356 
   1357   if (flags & SBRDEC_ELD_GRID) {
   1358     /* CODEC_AACLD (LD+SBR) only uses the normal 0 Grid for non-transient Frames
   1359      * and the LowDelayGrid for transient Frames */
   1360     frameClass = FDKreadBits(hBs, 1); /* frameClass = [1 bit] */
   1361     if (frameClass == 1) {
   1362       /* if frameClass == 1, extract LowDelaySbrGrid, otherwise extract normal
   1363        * SBR-Grid for FIXIFX */
   1364       /* extract the AACLD-Sbr-Grid */
   1365       pFrameInfo->frameClass = frameClass;
   1366       int err = 1;
   1367       err = extractLowDelayGrid(hBs, hHeaderData, h_frame_data, numberTimeSlots,
   1368                                 flags);
   1369       return err;
   1370     }
   1371   } else {
   1372     frameClass = FDKreadBits(hBs, 2); /* frameClass = C [2 bits] */
   1373   }
   1374 
   1375   switch (frameClass) {
   1376     case 0:
   1377       temp = FDKreadBits(hBs, 2); /* E [2 bits ] */
   1378       nEnv = (int)(1 << temp);    /* E -> e */
   1379 
   1380       if ((flags & SBRDEC_ELD_GRID) && (nEnv == 1))
   1381         h_frame_data->ampResolutionCurrentFrame =
   1382             FDKreadBits(hBs, 1); /* new ELD Syntax 07-11-09 */
   1383 
   1384       staticFreqRes = FDKreadBits(hBs, 1);
   1385 
   1386       if (flags & (SBRDEC_SYNTAX_USAC | SBRDEC_SYNTAX_RSVD50)) {
   1387         if (nEnv > MAX_ENVELOPES_USAC) return 0;
   1388       } else
   1389 
   1390         b = nEnv + 1;
   1391       switch (nEnv) {
   1392         case 1:
   1393           switch (numberTimeSlots) {
   1394             case 15:
   1395               FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_15,
   1396                         sizeof(FRAME_INFO));
   1397               break;
   1398             case 16:
   1399               FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_16,
   1400                         sizeof(FRAME_INFO));
   1401               break;
   1402             default:
   1403               FDK_ASSERT(0);
   1404           }
   1405           break;
   1406         case 2:
   1407           switch (numberTimeSlots) {
   1408             case 15:
   1409               FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_15,
   1410                         sizeof(FRAME_INFO));
   1411               break;
   1412             case 16:
   1413               FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_16,
   1414                         sizeof(FRAME_INFO));
   1415               break;
   1416             default:
   1417               FDK_ASSERT(0);
   1418           }
   1419           break;
   1420         case 4:
   1421           switch (numberTimeSlots) {
   1422             case 15:
   1423               FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_15,
   1424                         sizeof(FRAME_INFO));
   1425               break;
   1426             case 16:
   1427               FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_16,
   1428                         sizeof(FRAME_INFO));
   1429               break;
   1430             default:
   1431               FDK_ASSERT(0);
   1432           }
   1433           break;
   1434         case 8:
   1435 #if (MAX_ENVELOPES >= 8)
   1436           switch (numberTimeSlots) {
   1437             case 15:
   1438               FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_15,
   1439                         sizeof(FRAME_INFO));
   1440               break;
   1441             case 16:
   1442               FDKmemcpy(pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_16,
   1443                         sizeof(FRAME_INFO));
   1444               break;
   1445             default:
   1446               FDK_ASSERT(0);
   1447           }
   1448           break;
   1449 #else
   1450           return 0;
   1451 #endif
   1452       }
   1453       /* Apply correct freqRes (High is default) */
   1454       if (!staticFreqRes) {
   1455         for (i = 0; i < nEnv; i++) pFrameInfo->freqRes[i] = 0;
   1456       }
   1457 
   1458       break;
   1459     case 1:
   1460     case 2:
   1461       temp = FDKreadBits(hBs, 2); /* A [2 bits] */
   1462 
   1463       n = FDKreadBits(hBs, 2); /* n = N [2 bits] */
   1464 
   1465       nEnv = n + 1; /* # envelopes */
   1466       b = nEnv + 1; /* # borders   */
   1467 
   1468       break;
   1469   }
   1470 
   1471   switch (frameClass) {
   1472     case 1:
   1473       /* Decode borders: */
   1474       pFrameInfo->borders[0] = 0;      /* first border          */
   1475       border = temp + numberTimeSlots; /* A -> aR               */
   1476       i = b - 1;                       /* frame info index for last border */
   1477       pFrameInfo->borders[i] = border; /* last border                      */
   1478 
   1479       for (k = 0; k < n; k++) {
   1480         temp = FDKreadBits(hBs, 2); /* R [2 bits] */
   1481         border -= (2 * temp + 2);   /* R -> r                */
   1482         pFrameInfo->borders[--i] = border;
   1483       }
   1484 
   1485       /* Decode pointer: */
   1486       pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n + 1));
   1487       p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */
   1488 
   1489       if (p > n + 1) return 0;
   1490 
   1491       pFrameInfo->tranEnv = p ? n + 2 - p : -1;
   1492 
   1493       /* Decode freq res: */
   1494       for (k = n; k >= 0; k--) {
   1495         pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */
   1496       }
   1497 
   1498       /* Calculate noise floor middle border: */
   1499       if (p == 0 || p == 1)
   1500         pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n];
   1501       else
   1502         pFrameInfo->bordersNoise[1] = pFrameInfo->borders[pFrameInfo->tranEnv];
   1503 
   1504       break;
   1505 
   1506     case 2:
   1507       /* Decode borders: */
   1508       border = temp;                   /* A -> aL */
   1509       pFrameInfo->borders[0] = border; /* first border */
   1510 
   1511       for (k = 1; k <= n; k++) {
   1512         temp = FDKreadBits(hBs, 2); /* R [2 bits] */
   1513         border += (2 * temp + 2);   /* R -> r                */
   1514         pFrameInfo->borders[k] = border;
   1515       }
   1516       pFrameInfo->borders[k] = numberTimeSlots; /* last border */
   1517 
   1518       /* Decode pointer: */
   1519       pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n + 1));
   1520       p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */
   1521       if (p > n + 1) return 0;
   1522 
   1523       if (p == 0 || p == 1)
   1524         pFrameInfo->tranEnv = -1;
   1525       else
   1526         pFrameInfo->tranEnv = p - 1;
   1527 
   1528       /* Decode freq res: */
   1529       for (k = 0; k <= n; k++) {
   1530         pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */
   1531       }
   1532 
   1533       /* Calculate noise floor middle border: */
   1534       switch (p) {
   1535         case 0:
   1536           pFrameInfo->bordersNoise[1] = pFrameInfo->borders[1];
   1537           break;
   1538         case 1:
   1539           pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n];
   1540           break;
   1541         default:
   1542           pFrameInfo->bordersNoise[1] =
   1543               pFrameInfo->borders[pFrameInfo->tranEnv];
   1544           break;
   1545       }
   1546 
   1547       break;
   1548 
   1549     case 3:
   1550       /* v_ctrlSignal = [frameClass,aL,aR,nL,nR,v_rL,v_rR,p,v_fLR]; */
   1551 
   1552       aL = FDKreadBits(hBs, 2); /* AL [2 bits], AL -> aL */
   1553 
   1554       aR = FDKreadBits(hBs, 2) + numberTimeSlots; /* AR [2 bits], AR -> aR */
   1555 
   1556       nL = FDKreadBits(hBs, 2); /* nL = NL [2 bits] */
   1557 
   1558       nR = FDKreadBits(hBs, 2); /* nR = NR [2 bits] */
   1559 
   1560       /*-------------------------------------------------------------------------
   1561         Calculate help variables
   1562         --------------------------------------------------------------------------*/
   1563 
   1564       /* general: */
   1565       nEnv = nL + nR + 1; /* # envelopes */
   1566       if (nEnv > MAX_ENVELOPES) return 0;
   1567       b = nEnv + 1; /* # borders   */
   1568 
   1569       /*-------------------------------------------------------------------------
   1570         Decode envelopes
   1571         --------------------------------------------------------------------------*/
   1572 
   1573       /* L-borders:   */
   1574       border = aL; /* first border */
   1575       pFrameInfo->borders[0] = border;
   1576 
   1577       for (k = 1; k <= nL; k++) {
   1578         temp = FDKreadBits(hBs, 2); /* R [2 bits] */
   1579         border += (2 * temp + 2);   /* R -> r                */
   1580         pFrameInfo->borders[k] = border;
   1581       }
   1582 
   1583       /* R-borders:  */
   1584       border = aR; /* last border */
   1585       i = nEnv;
   1586 
   1587       pFrameInfo->borders[i] = border;
   1588 
   1589       for (k = 0; k < nR; k++) {
   1590         temp = FDKreadBits(hBs, 2); /* R [2 bits] */
   1591         border -= (2 * temp + 2);   /* R -> r                */
   1592         pFrameInfo->borders[--i] = border;
   1593       }
   1594 
   1595       /* decode pointer: */
   1596       pointer_bits =
   1597           DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(nL + nR + 1));
   1598       p = FDKreadBits(hBs, pointer_bits); /* p = P [pointer_bits bits] */
   1599 
   1600       if (p > nL + nR + 1) return 0;
   1601 
   1602       pFrameInfo->tranEnv = p ? b - p : -1;
   1603 
   1604       /* decode freq res: */
   1605       for (k = 0; k < nEnv; k++) {
   1606         pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */
   1607       }
   1608 
   1609       /*-------------------------------------------------------------------------
   1610         Decode noise floors
   1611         --------------------------------------------------------------------------*/
   1612       pFrameInfo->bordersNoise[0] = aL;
   1613 
   1614       if (nEnv == 1) {
   1615         /* 1 noise floor envelope: */
   1616         pFrameInfo->bordersNoise[1] = aR;
   1617       } else {
   1618         /* 2 noise floor envelopes */
   1619         if (p == 0 || p == 1)
   1620           pFrameInfo->bordersNoise[1] = pFrameInfo->borders[nEnv - 1];
   1621         else
   1622           pFrameInfo->bordersNoise[1] =
   1623               pFrameInfo->borders[pFrameInfo->tranEnv];
   1624         pFrameInfo->bordersNoise[2] = aR;
   1625       }
   1626       break;
   1627   }
   1628 
   1629   /*
   1630     Store number of envelopes, noise floor envelopes and frame class
   1631   */
   1632   pFrameInfo->nEnvelopes = nEnv;
   1633 
   1634   if (nEnv == 1)
   1635     pFrameInfo->nNoiseEnvelopes = 1;
   1636   else
   1637     pFrameInfo->nNoiseEnvelopes = 2;
   1638 
   1639   pFrameInfo->frameClass = frameClass;
   1640 
   1641   if (pFrameInfo->frameClass == 2 || pFrameInfo->frameClass == 1) {
   1642     /* calculate noise floor first and last borders: */
   1643     pFrameInfo->bordersNoise[0] = pFrameInfo->borders[0];
   1644     pFrameInfo->bordersNoise[pFrameInfo->nNoiseEnvelopes] =
   1645         pFrameInfo->borders[nEnv];
   1646   }
   1647 
   1648   return 1;
   1649 }
   1650 
   1651 /*!
   1652   \brief   Check if the frameInfo vector has reasonable values.
   1653   \return  Zero for error, one for correct
   1654 */
   1655 static int checkFrameInfo(
   1656     FRAME_INFO *pFrameInfo, /*!< pointer to frameInfo */
   1657     int numberOfTimeSlots,  /*!< QMF time slots per frame */
   1658     int overlap,            /*!< Amount of overlap QMF time slots */
   1659     int timeStep)           /*!< QMF slots to SBR slots step factor */
   1660 {
   1661   int maxPos, i, j;
   1662   int startPos;
   1663   int stopPos;
   1664   int tranEnv;
   1665   int startPosNoise;
   1666   int stopPosNoise;
   1667   int nEnvelopes = pFrameInfo->nEnvelopes;
   1668   int nNoiseEnvelopes = pFrameInfo->nNoiseEnvelopes;
   1669 
   1670   if (nEnvelopes < 1 || nEnvelopes > MAX_ENVELOPES) return 0;
   1671 
   1672   if (nNoiseEnvelopes > MAX_NOISE_ENVELOPES) return 0;
   1673 
   1674   startPos = pFrameInfo->borders[0];
   1675   stopPos = pFrameInfo->borders[nEnvelopes];
   1676   tranEnv = pFrameInfo->tranEnv;
   1677   startPosNoise = pFrameInfo->bordersNoise[0];
   1678   stopPosNoise = pFrameInfo->bordersNoise[nNoiseEnvelopes];
   1679 
   1680   if (overlap < 0 || overlap > (3 * (4))) {
   1681     return 0;
   1682   }
   1683   if (timeStep < 1 || timeStep > (4)) {
   1684     return 0;
   1685   }
   1686   maxPos = numberOfTimeSlots + (overlap / timeStep);
   1687 
   1688   /* Check that the start and stop positions of the frame are reasonable values.
   1689    */
   1690   if ((startPos < 0) || (startPos >= stopPos)) return 0;
   1691   if (startPos > maxPos - numberOfTimeSlots) /* First env. must start in or
   1692                                                 directly after the overlap
   1693                                                 buffer */
   1694     return 0;
   1695   if (stopPos < numberOfTimeSlots) /* One complete frame must be ready for
   1696                                       output after processing */
   1697     return 0;
   1698   if (stopPos > maxPos) return 0;
   1699 
   1700   /* Check that the  start border for every envelope is strictly later in time
   1701    */
   1702   for (i = 0; i < nEnvelopes; i++) {
   1703     if (pFrameInfo->borders[i] >= pFrameInfo->borders[i + 1]) return 0;
   1704   }
   1705 
   1706   /* Check that the envelope to be shortened is actually among the envelopes */
   1707   if (tranEnv > nEnvelopes) return 0;
   1708 
   1709   /* Check the noise borders */
   1710   if (nEnvelopes == 1 && nNoiseEnvelopes > 1) return 0;
   1711 
   1712   if (startPos != startPosNoise || stopPos != stopPosNoise) return 0;
   1713 
   1714   /* Check that the  start border for every noise-envelope is strictly later in
   1715    * time*/
   1716   for (i = 0; i < nNoiseEnvelopes; i++) {
   1717     if (pFrameInfo->bordersNoise[i] >= pFrameInfo->bordersNoise[i + 1])
   1718       return 0;
   1719   }
   1720 
   1721   /* Check that every noise border is the same as an envelope border*/
   1722   for (i = 0; i < nNoiseEnvelopes; i++) {
   1723     startPosNoise = pFrameInfo->bordersNoise[i];
   1724 
   1725     for (j = 0; j < nEnvelopes; j++) {
   1726       if (pFrameInfo->borders[j] == startPosNoise) break;
   1727     }
   1728     if (j == nEnvelopes) return 0;
   1729   }
   1730 
   1731   return 1;
   1732 }
   1733