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 /**************************** AAC decoder library ******************************
     96 
     97    Author(s):   Josef Hoepfl
     98 
     99    Description: long/short-block decoding
    100 
    101 *******************************************************************************/
    102 
    103 #include "block.h"
    104 
    105 #include "aac_rom.h"
    106 #include "FDK_bitstream.h"
    107 #include "scale.h"
    108 #include "FDK_tools_rom.h"
    109 
    110 #include "usacdec_fac.h"
    111 #include "usacdec_lpd.h"
    112 #include "usacdec_lpc.h"
    113 #include "FDK_trigFcts.h"
    114 
    115 #include "ac_arith_coder.h"
    116 
    117 #include "aacdec_hcr.h"
    118 #include "rvlc.h"
    119 
    120 #if defined(__arm__)
    121 #include "arm/block_arm.cpp"
    122 #endif
    123 
    124 /*!
    125   \brief Read escape sequence of codeword
    126 
    127   The function reads the escape sequence from the bitstream,
    128   if the absolute value of the quantized coefficient has the
    129   value 16.
    130   A limitation is implemented to maximal 31 bits to prevent endless loops.
    131   If it strikes, MAX_QUANTIZED_VALUE + 1 is returned, independent of the sign of
    132   parameter q.
    133 
    134   \return  quantized coefficient
    135 */
    136 LONG CBlock_GetEscape(HANDLE_FDK_BITSTREAM bs, /*!< pointer to bitstream */
    137                       const LONG q)            /*!< quantized coefficient */
    138 {
    139   if (fAbs(q) != 16) return (q);
    140 
    141   LONG i, off;
    142   for (i = 4; i < 32; i++) {
    143     if (FDKreadBit(bs) == 0) break;
    144   }
    145 
    146   if (i == 32) return (MAX_QUANTIZED_VALUE + 1);
    147 
    148   off = FDKreadBits(bs, i);
    149   i = off + (1 << i);
    150 
    151   if (q < 0) i = -i;
    152 
    153   return i;
    154 }
    155 
    156 AAC_DECODER_ERROR CBlock_ReadScaleFactorData(
    157     CAacDecoderChannelInfo *pAacDecoderChannelInfo, HANDLE_FDK_BITSTREAM bs,
    158     UINT flags) {
    159   int temp;
    160   int band;
    161   int group;
    162   int position = 0; /* accu for intensity delta coding */
    163   int factor = pAacDecoderChannelInfo->pDynData->RawDataInfo
    164                    .GlobalGain; /* accu for scale factor delta coding */
    165   UCHAR *pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook;
    166   SHORT *pScaleFactor = pAacDecoderChannelInfo->pDynData->aScaleFactor;
    167   const CodeBookDescription *hcb = &AACcodeBookDescriptionTable[BOOKSCL];
    168 
    169   const USHORT(*CodeBook)[HuffmanEntries] = hcb->CodeBook;
    170 
    171   int ScaleFactorBandsTransmitted =
    172       GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
    173   for (group = 0; group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo);
    174        group++) {
    175     for (band = 0; band < ScaleFactorBandsTransmitted; band++) {
    176       switch (pCodeBook[band]) {
    177         case ZERO_HCB: /* zero book */
    178           pScaleFactor[band] = 0;
    179           break;
    180 
    181         default: /* decode scale factor */
    182           if (!((flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) && band == 0 &&
    183                 group == 0)) {
    184             temp = CBlock_DecodeHuffmanWordCB(bs, CodeBook);
    185             factor += temp - 60; /* MIDFAC 1.5 dB */
    186           }
    187           pScaleFactor[band] = factor - 100;
    188           break;
    189 
    190         case INTENSITY_HCB: /* intensity steering */
    191         case INTENSITY_HCB2:
    192           temp = CBlock_DecodeHuffmanWordCB(bs, CodeBook);
    193           position += temp - 60;
    194           pScaleFactor[band] = position - 100;
    195           break;
    196 
    197         case NOISE_HCB: /* PNS */
    198           if (flags & (AC_MPEGD_RES | AC_USAC | AC_RSVD50 | AC_RSV603DA)) {
    199             return AAC_DEC_PARSE_ERROR;
    200           }
    201           CPns_Read(&pAacDecoderChannelInfo->data.aac.PnsData, bs, hcb,
    202                     pAacDecoderChannelInfo->pDynData->aScaleFactor,
    203                     pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain,
    204                     band, group);
    205           break;
    206       }
    207     }
    208     pCodeBook += 16;
    209     pScaleFactor += 16;
    210   }
    211 
    212   return AAC_DEC_OK;
    213 }
    214 
    215 void CBlock_ScaleSpectralData(CAacDecoderChannelInfo *pAacDecoderChannelInfo,
    216                               UCHAR maxSfbs,
    217                               SamplingRateInfo *pSamplingRateInfo) {
    218   int band;
    219   int window;
    220   const SHORT *RESTRICT pSfbScale = pAacDecoderChannelInfo->pDynData->aSfbScale;
    221   SHORT *RESTRICT pSpecScale = pAacDecoderChannelInfo->specScale;
    222   int groupwin, group;
    223   const SHORT *RESTRICT BandOffsets = GetScaleFactorBandOffsets(
    224       &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
    225   SPECTRAL_PTR RESTRICT pSpectralCoefficient =
    226       pAacDecoderChannelInfo->pSpectralCoefficient;
    227 
    228   FDKmemclear(pSpecScale, 8 * sizeof(SHORT));
    229 
    230   for (window = 0, group = 0;
    231        group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); group++) {
    232     for (groupwin = 0; groupwin < GetWindowGroupLength(
    233                                       &pAacDecoderChannelInfo->icsInfo, group);
    234          groupwin++, window++) {
    235       int SpecScale_window = pSpecScale[window];
    236       FIXP_DBL *pSpectrum = SPEC(pSpectralCoefficient, window,
    237                                  pAacDecoderChannelInfo->granuleLength);
    238 
    239       /* find scaling for current window */
    240       for (band = 0; band < maxSfbs; band++) {
    241         SpecScale_window =
    242             fMax(SpecScale_window, (int)pSfbScale[window * 16 + band]);
    243       }
    244 
    245       if (pAacDecoderChannelInfo->pDynData->TnsData.Active &&
    246           pAacDecoderChannelInfo->pDynData->TnsData.NumberOfFilters[window] >
    247               0) {
    248         int filter_index, SpecScale_window_tns;
    249         int tns_start, tns_stop;
    250 
    251         /* Find max scale of TNS bands */
    252         SpecScale_window_tns = 0;
    253         tns_start = GetMaximumTnsBands(&pAacDecoderChannelInfo->icsInfo,
    254                                        pSamplingRateInfo->samplingRateIndex);
    255         tns_stop = 0;
    256         for (filter_index = 0;
    257              filter_index < (int)pAacDecoderChannelInfo->pDynData->TnsData
    258                                 .NumberOfFilters[window];
    259              filter_index++) {
    260           for (band = pAacDecoderChannelInfo->pDynData->TnsData
    261                           .Filter[window][filter_index]
    262                           .StartBand;
    263                band < pAacDecoderChannelInfo->pDynData->TnsData
    264                           .Filter[window][filter_index]
    265                           .StopBand;
    266                band++) {
    267             SpecScale_window_tns =
    268                 fMax(SpecScale_window_tns, (int)pSfbScale[window * 16 + band]);
    269           }
    270           /* Find TNS line boundaries for all TNS filters */
    271           tns_start =
    272               fMin(tns_start, (int)pAacDecoderChannelInfo->pDynData->TnsData
    273                                   .Filter[window][filter_index]
    274                                   .StartBand);
    275           tns_stop =
    276               fMax(tns_stop, (int)pAacDecoderChannelInfo->pDynData->TnsData
    277                                  .Filter[window][filter_index]
    278                                  .StopBand);
    279         }
    280         SpecScale_window_tns = SpecScale_window_tns +
    281                                pAacDecoderChannelInfo->pDynData->TnsData.GainLd;
    282         FDK_ASSERT(tns_stop >= tns_start);
    283         /* Consider existing headroom of all MDCT lines inside the TNS bands. */
    284         SpecScale_window_tns -=
    285             getScalefactor(pSpectrum + BandOffsets[tns_start],
    286                            BandOffsets[tns_stop] - BandOffsets[tns_start]);
    287         if (SpecScale_window <= 17) {
    288           SpecScale_window_tns++;
    289         }
    290         /* Add enough mantissa head room such that the spectrum is still
    291            representable after applying TNS. */
    292         SpecScale_window = fMax(SpecScale_window, SpecScale_window_tns);
    293       }
    294 
    295       /* store scaling of current window */
    296       pSpecScale[window] = SpecScale_window;
    297 
    298 #ifdef FUNCTION_CBlock_ScaleSpectralData_func1
    299 
    300       CBlock_ScaleSpectralData_func1(pSpectrum, maxSfbs, BandOffsets,
    301                                      SpecScale_window, pSfbScale, window);
    302 
    303 #else  /* FUNCTION_CBlock_ScaleSpectralData_func1 */
    304       for (band = 0; band < maxSfbs; band++) {
    305         int scale = fMin(DFRACT_BITS - 1,
    306                          SpecScale_window - pSfbScale[window * 16 + band]);
    307         if (scale) {
    308           FDK_ASSERT(scale > 0);
    309 
    310           /* following relation can be used for optimizations:
    311            * (BandOffsets[i]%4) == 0 for all i */
    312           int max_index = BandOffsets[band + 1];
    313           DWORD_ALIGNED(pSpectrum);
    314           for (int index = BandOffsets[band]; index < max_index; index++) {
    315             pSpectrum[index] >>= scale;
    316           }
    317         }
    318       }
    319 #endif /* FUNCTION_CBlock_ScaleSpectralData_func1 */
    320     }
    321   }
    322 }
    323 
    324 AAC_DECODER_ERROR CBlock_ReadSectionData(
    325     HANDLE_FDK_BITSTREAM bs, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
    326     const SamplingRateInfo *pSamplingRateInfo, const UINT flags) {
    327   int top, band;
    328   int sect_len, sect_len_incr;
    329   int group;
    330   UCHAR sect_cb;
    331   UCHAR *pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook;
    332   /* HCR input (long) */
    333   SHORT *pNumLinesInSec =
    334       pAacDecoderChannelInfo->pDynData->specificTo.aac.aNumLineInSec4Hcr;
    335   int numLinesInSecIdx = 0;
    336   UCHAR *pHcrCodeBook =
    337       pAacDecoderChannelInfo->pDynData->specificTo.aac.aCodeBooks4Hcr;
    338   const SHORT *BandOffsets = GetScaleFactorBandOffsets(
    339       &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
    340   pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection = 0;
    341   AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK;
    342 
    343   FDKmemclear(pCodeBook, sizeof(UCHAR) * (8 * 16));
    344 
    345   const int nbits =
    346       (IsLongBlock(&pAacDecoderChannelInfo->icsInfo) == 1) ? 5 : 3;
    347 
    348   int sect_esc_val = (1 << nbits) - 1;
    349 
    350   UCHAR ScaleFactorBandsTransmitted =
    351       GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
    352   for (group = 0; group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo);
    353        group++) {
    354     for (band = 0; band < ScaleFactorBandsTransmitted;) {
    355       sect_len = 0;
    356       if (flags & AC_ER_VCB11) {
    357         sect_cb = (UCHAR)FDKreadBits(bs, 5);
    358       } else
    359         sect_cb = (UCHAR)FDKreadBits(bs, 4);
    360 
    361       if (((flags & AC_ER_VCB11) == 0) || (sect_cb < 11) ||
    362           ((sect_cb > 11) && (sect_cb < 16))) {
    363         sect_len_incr = FDKreadBits(bs, nbits);
    364         while (sect_len_incr == sect_esc_val) {
    365           sect_len += sect_esc_val;
    366           sect_len_incr = FDKreadBits(bs, nbits);
    367         }
    368       } else {
    369         sect_len_incr = 1;
    370       }
    371 
    372       sect_len += sect_len_incr;
    373 
    374       top = band + sect_len;
    375 
    376       if (flags & AC_ER_HCR) {
    377         /* HCR input (long) -- collecting sideinfo (for HCR-_long_ only) */
    378         if (numLinesInSecIdx >= MAX_SFB_HCR) {
    379           return AAC_DEC_PARSE_ERROR;
    380         }
    381         if (top > (int)GetNumberOfScaleFactorBands(
    382                       &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo)) {
    383           return AAC_DEC_PARSE_ERROR;
    384         }
    385         pNumLinesInSec[numLinesInSecIdx] = BandOffsets[top] - BandOffsets[band];
    386         numLinesInSecIdx++;
    387         if (sect_cb == BOOKSCL) {
    388           return AAC_DEC_INVALID_CODE_BOOK;
    389         } else {
    390           *pHcrCodeBook++ = sect_cb;
    391         }
    392         pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection++;
    393       }
    394 
    395       /* Check spectral line limits */
    396       if (IsLongBlock(&(pAacDecoderChannelInfo->icsInfo))) {
    397         if (top > 64) {
    398           return AAC_DEC_DECODE_FRAME_ERROR;
    399         }
    400       } else { /* short block */
    401         if (top + group * 16 > (8 * 16)) {
    402           return AAC_DEC_DECODE_FRAME_ERROR;
    403         }
    404       }
    405 
    406       /* Check if decoded codebook index is feasible */
    407       if ((sect_cb == BOOKSCL) ||
    408           ((sect_cb == INTENSITY_HCB || sect_cb == INTENSITY_HCB2) &&
    409            pAacDecoderChannelInfo->pDynData->RawDataInfo.CommonWindow == 0)) {
    410         return AAC_DEC_INVALID_CODE_BOOK;
    411       }
    412 
    413       /* Store codebook index */
    414       for (; band < top; band++) {
    415         pCodeBook[group * 16 + band] = sect_cb;
    416       }
    417     }
    418   }
    419 
    420   return ErrorStatus;
    421 }
    422 
    423 /* mso: provides a faster way to i-quantize a whole band in one go */
    424 
    425 /**
    426  * \brief inverse quantize one sfb. Each value of the sfb is processed according
    427  * to the formula: spectrum[i] = Sign(spectrum[i]) * Matissa(spectrum[i])^(4/3)
    428  * * 2^(lsb/4).
    429  * \param spectrum pointer to first line of the sfb to be inverse quantized.
    430  * \param noLines number of lines belonging to the sfb.
    431  * \param lsb last 2 bits of the scale factor of the sfb.
    432  * \param scale max allowed shift scale for the sfb.
    433  */
    434 static inline void InverseQuantizeBand(
    435     FIXP_DBL *RESTRICT spectrum, const FIXP_DBL *RESTRICT InverseQuantTabler,
    436     const FIXP_DBL *RESTRICT MantissaTabler,
    437     const SCHAR *RESTRICT ExponentTabler, INT noLines, INT scale) {
    438   scale = scale + 1; /* +1 to compensate fMultDiv2 shift-right in loop */
    439 
    440   FIXP_DBL *RESTRICT ptr = spectrum;
    441   FIXP_DBL signedValue;
    442 
    443   for (INT i = noLines; i--;) {
    444     if ((signedValue = *ptr++) != FL2FXCONST_DBL(0)) {
    445       FIXP_DBL value = fAbs(signedValue);
    446       UINT freeBits = CntLeadingZeros(value);
    447       UINT exponent = 32 - freeBits;
    448 
    449       UINT x = (UINT)(LONG)value << (INT)freeBits;
    450       x <<= 1; /* shift out sign bit to avoid masking later on */
    451       UINT tableIndex = x >> 24;
    452       x = (x >> 20) & 0x0F;
    453 
    454       UINT r0 = (UINT)(LONG)InverseQuantTabler[tableIndex + 0];
    455       UINT r1 = (UINT)(LONG)InverseQuantTabler[tableIndex + 1];
    456       UINT temp = (r1 - r0) * x + (r0 << 4);
    457 
    458       value = fMultDiv2((FIXP_DBL)temp, MantissaTabler[exponent]);
    459 
    460       /* + 1 compensates fMultDiv2() */
    461       scaleValueInPlace(&value, scale + ExponentTabler[exponent]);
    462 
    463       signedValue = (signedValue < (FIXP_DBL)0) ? -value : value;
    464       ptr[-1] = signedValue;
    465     }
    466   }
    467 }
    468 
    469 static inline FIXP_DBL maxabs_D(const FIXP_DBL *pSpectralCoefficient,
    470                                 const int noLines) {
    471   /* Find max spectral line value of the current sfb */
    472   FIXP_DBL locMax = (FIXP_DBL)0;
    473   int i;
    474 
    475   DWORD_ALIGNED(pSpectralCoefficient);
    476 
    477   for (i = noLines; i-- > 0;) {
    478     /* Expensive memory access */
    479     locMax = fMax(fixp_abs(pSpectralCoefficient[i]), locMax);
    480   }
    481 
    482   return locMax;
    483 }
    484 
    485 AAC_DECODER_ERROR CBlock_InverseQuantizeSpectralData(
    486     CAacDecoderChannelInfo *pAacDecoderChannelInfo,
    487     SamplingRateInfo *pSamplingRateInfo, UCHAR *band_is_noise,
    488     UCHAR active_band_search) {
    489   int window, group, groupwin, band;
    490   int ScaleFactorBandsTransmitted =
    491       GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
    492   UCHAR *RESTRICT pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook;
    493   SHORT *RESTRICT pSfbScale = pAacDecoderChannelInfo->pDynData->aSfbScale;
    494   SHORT *RESTRICT pScaleFactor = pAacDecoderChannelInfo->pDynData->aScaleFactor;
    495   const SHORT *RESTRICT BandOffsets = GetScaleFactorBandOffsets(
    496       &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
    497   const SHORT total_bands =
    498       GetScaleFactorBandsTotal(&pAacDecoderChannelInfo->icsInfo);
    499 
    500   FDKmemclear(pAacDecoderChannelInfo->pDynData->aSfbScale,
    501               (8 * 16) * sizeof(SHORT));
    502 
    503   for (window = 0, group = 0;
    504        group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); group++) {
    505     for (groupwin = 0; groupwin < GetWindowGroupLength(
    506                                       &pAacDecoderChannelInfo->icsInfo, group);
    507          groupwin++, window++) {
    508       /* inverse quantization */
    509       for (band = 0; band < ScaleFactorBandsTransmitted; band++) {
    510         FIXP_DBL *pSpectralCoefficient =
    511             SPEC(pAacDecoderChannelInfo->pSpectralCoefficient, window,
    512                  pAacDecoderChannelInfo->granuleLength) +
    513             BandOffsets[band];
    514         FIXP_DBL locMax;
    515 
    516         const int noLines = BandOffsets[band + 1] - BandOffsets[band];
    517         const int bnds = group * 16 + band;
    518 
    519         if ((pCodeBook[bnds] == ZERO_HCB) ||
    520             (pCodeBook[bnds] == INTENSITY_HCB) ||
    521             (pCodeBook[bnds] == INTENSITY_HCB2))
    522           continue;
    523 
    524         if (pCodeBook[bnds] == NOISE_HCB) {
    525           /* Leave headroom for PNS values. + 1 because ceil(log2(2^(0.25*3))) =
    526              1, worst case of additional headroom required because of the
    527              scalefactor. */
    528           pSfbScale[window * 16 + band] = (pScaleFactor[bnds] >> 2) + 1;
    529           continue;
    530         }
    531 
    532         locMax = maxabs_D(pSpectralCoefficient, noLines);
    533 
    534         if (active_band_search) {
    535           if (locMax != FIXP_DBL(0)) {
    536             band_is_noise[group * 16 + band] = 0;
    537           }
    538         }
    539 
    540         /* Cheap robustness improvement - Do not remove!!! */
    541         if (fixp_abs(locMax) > (FIXP_DBL)MAX_QUANTIZED_VALUE) {
    542           return AAC_DEC_PARSE_ERROR;
    543         }
    544 
    545         /* Added by Youliy Ninov:
    546         The inverse quantization operation is given by (ISO/IEC 14496-3:2009(E))
    547         by:
    548 
    549         x_invquant=Sign(x_quant). abs(x_quant)^(4/3)
    550 
    551         We apply a gain, derived from the scale factor for the particular sfb,
    552         according to the following function:
    553 
    554         gain=2^(0.25*ScaleFactor)
    555 
    556         So, after scaling we have:
    557 
    558         x_rescale=gain*x_invquant=Sign(x_quant)*2^(0.25*ScaleFactor)*abs(s_quant)^(4/3)
    559 
    560         We could represent the ScaleFactor as:
    561 
    562         ScaleFactor= (ScaleFactor >> 2)*4 + ScaleFactor %4
    563 
    564         When we substitute it we get:
    565 
    566         x_rescale=Sign(x_quant)*2^(ScaleFactor>>2)* (
    567         2^(0.25*(ScaleFactor%4))*abs(s_quant)^(4/3))
    568 
    569         When we set: msb=(ScaleFactor>>2) and lsb=(ScaleFactor%4), we obtain:
    570 
    571         x_rescale=Sign(x_quant)*(2^msb)* ( 2^(lsb/4)*abs(s_quant)^(4/3))
    572 
    573         The rescaled output can be represented by:
    574            mantissa : Sign(x_quant)*( 2^(lsb/4)*abs(s_quant)^(4/3))
    575            exponent :(2^msb)
    576 
    577         */
    578 
    579         int msb = pScaleFactor[bnds] >> 2;
    580 
    581         /* Inverse quantize band only if it is not empty */
    582         if (locMax != FIXP_DBL(0)) {
    583           int lsb = pScaleFactor[bnds] & 0x03;
    584 
    585           int scale = EvaluatePower43(&locMax, lsb);
    586 
    587           scale = CntLeadingZeros(locMax) - scale - 2;
    588 
    589           pSfbScale[window * 16 + band] = msb - scale;
    590           InverseQuantizeBand(pSpectralCoefficient, InverseQuantTable,
    591                               MantissaTable[lsb], ExponentTable[lsb], noLines,
    592                               scale);
    593         } else {
    594           pSfbScale[window * 16 + band] = msb;
    595         }
    596 
    597       } /* for (band=0; band < ScaleFactorBandsTransmitted; band++) */
    598 
    599       /* Make sure the array is cleared to the end */
    600       SHORT start_clear = BandOffsets[ScaleFactorBandsTransmitted];
    601       SHORT end_clear = BandOffsets[total_bands];
    602       int diff_clear = (int)(end_clear - start_clear);
    603       FIXP_DBL *pSpectralCoefficient =
    604           SPEC(pAacDecoderChannelInfo->pSpectralCoefficient, window,
    605                pAacDecoderChannelInfo->granuleLength) +
    606           start_clear;
    607       FDKmemclear(pSpectralCoefficient, diff_clear * sizeof(FIXP_DBL));
    608 
    609     } /* for (groupwin=0; groupwin <
    610          GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group);
    611          groupwin++, window++) */
    612   }   /* for (window=0, group=0; group <
    613          GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); group++)*/
    614 
    615   return AAC_DEC_OK;
    616 }
    617 
    618 AAC_DECODER_ERROR CBlock_ReadSpectralData(
    619     HANDLE_FDK_BITSTREAM bs, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
    620     const SamplingRateInfo *pSamplingRateInfo, const UINT flags) {
    621   int index, i;
    622   const SHORT *RESTRICT BandOffsets = GetScaleFactorBandOffsets(
    623       &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
    624 
    625   SPECTRAL_PTR pSpectralCoefficient =
    626       pAacDecoderChannelInfo->pSpectralCoefficient;
    627 
    628   FDK_ASSERT(BandOffsets != NULL);
    629 
    630   FDKmemclear(pSpectralCoefficient, sizeof(SPECTRUM));
    631 
    632   if ((flags & AC_ER_HCR) == 0) {
    633     int group;
    634     int groupoffset;
    635     UCHAR *pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook;
    636     int ScaleFactorBandsTransmitted =
    637         GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
    638     int granuleLength = pAacDecoderChannelInfo->granuleLength;
    639 
    640     groupoffset = 0;
    641 
    642     /* plain huffman decoder  short */
    643     int max_group = GetWindowGroups(&pAacDecoderChannelInfo->icsInfo);
    644 
    645     for (group = 0; group < max_group; group++) {
    646       int max_groupwin =
    647           GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo, group);
    648       int band;
    649 
    650       int bnds = group * 16;
    651 
    652       int bandOffset1 = BandOffsets[0];
    653       for (band = 0; band < ScaleFactorBandsTransmitted; band++, bnds++) {
    654         UCHAR currentCB = pCodeBook[bnds];
    655         int bandOffset0 = bandOffset1;
    656         bandOffset1 = BandOffsets[band + 1];
    657 
    658         /* patch to run plain-huffman-decoder with vcb11 input codebooks
    659          * (LAV-checking might be possible below using the virtual cb and a
    660          * LAV-table) */
    661         if ((currentCB >= 16) && (currentCB <= 31)) {
    662           pCodeBook[bnds] = currentCB = 11;
    663         }
    664         if (((currentCB != ZERO_HCB) && (currentCB != NOISE_HCB) &&
    665              (currentCB != INTENSITY_HCB) && (currentCB != INTENSITY_HCB2))) {
    666           const CodeBookDescription *hcb =
    667               &AACcodeBookDescriptionTable[currentCB];
    668           int step = hcb->Dimension;
    669           int offset = hcb->Offset;
    670           int bits = hcb->numBits;
    671           int mask = (1 << bits) - 1;
    672           const USHORT(*CodeBook)[HuffmanEntries] = hcb->CodeBook;
    673           int groupwin;
    674 
    675           FIXP_DBL *mdctSpectrum =
    676               &pSpectralCoefficient[groupoffset * granuleLength];
    677 
    678           if (offset == 0) {
    679             for (groupwin = 0; groupwin < max_groupwin; groupwin++) {
    680               for (index = bandOffset0; index < bandOffset1; index += step) {
    681                 int idx = CBlock_DecodeHuffmanWordCB(bs, CodeBook);
    682                 for (i = 0; i < step; i++, idx >>= bits) {
    683                   FIXP_DBL tmp = (FIXP_DBL)((idx & mask) - offset);
    684                   if (tmp != FIXP_DBL(0)) tmp = (FDKreadBit(bs)) ? -tmp : tmp;
    685                   mdctSpectrum[index + i] = tmp;
    686                 }
    687 
    688                 if (currentCB == ESCBOOK) {
    689                   for (int j = 0; j < 2; j++)
    690                     mdctSpectrum[index + j] = (FIXP_DBL)CBlock_GetEscape(
    691                         bs, (LONG)mdctSpectrum[index + j]);
    692                 }
    693               }
    694               mdctSpectrum += granuleLength;
    695             }
    696           } else {
    697             for (groupwin = 0; groupwin < max_groupwin; groupwin++) {
    698               for (index = bandOffset0; index < bandOffset1; index += step) {
    699                 int idx = CBlock_DecodeHuffmanWordCB(bs, CodeBook);
    700                 for (i = 0; i < step; i++, idx >>= bits) {
    701                   mdctSpectrum[index + i] = (FIXP_DBL)((idx & mask) - offset);
    702                 }
    703                 if (currentCB == ESCBOOK) {
    704                   for (int j = 0; j < 2; j++)
    705                     mdctSpectrum[index + j] = (FIXP_DBL)CBlock_GetEscape(
    706                         bs, (LONG)mdctSpectrum[index + j]);
    707                 }
    708               }
    709               mdctSpectrum += granuleLength;
    710             }
    711           }
    712         }
    713       }
    714       groupoffset += max_groupwin;
    715     }
    716     /* plain huffman decoding (short) finished */
    717   }
    718 
    719   /* HCR - Huffman Codeword Reordering  short */
    720   else /* if ( flags & AC_ER_HCR ) */
    721 
    722   {
    723     H_HCR_INFO hHcr = &pAacDecoderChannelInfo->pComData->overlay.aac.erHcrInfo;
    724 
    725     int hcrStatus = 0;
    726 
    727     /* advanced Huffman decoding starts here (HCR decoding :) */
    728     if (pAacDecoderChannelInfo->pDynData->specificTo.aac
    729             .lenOfReorderedSpectralData != 0) {
    730       /* HCR initialization short */
    731       hcrStatus = HcrInit(hHcr, pAacDecoderChannelInfo, pSamplingRateInfo, bs);
    732 
    733       if (hcrStatus != 0) {
    734         return AAC_DEC_DECODE_FRAME_ERROR;
    735       }
    736 
    737       /* HCR decoding short */
    738       hcrStatus =
    739           HcrDecoder(hHcr, pAacDecoderChannelInfo, pSamplingRateInfo, bs);
    740 
    741       if (hcrStatus != 0) {
    742 #if HCR_ERROR_CONCEALMENT
    743         HcrMuteErroneousLines(hHcr);
    744 #else
    745         return AAC_DEC_DECODE_FRAME_ERROR;
    746 #endif /* HCR_ERROR_CONCEALMENT */
    747       }
    748 
    749       FDKpushFor(bs, pAacDecoderChannelInfo->pDynData->specificTo.aac
    750                          .lenOfReorderedSpectralData);
    751     }
    752   }
    753   /* HCR - Huffman Codeword Reordering short finished */
    754 
    755   if (IsLongBlock(&pAacDecoderChannelInfo->icsInfo) &&
    756       !(flags & (AC_ELD | AC_SCALABLE))) {
    757     /* apply pulse data */
    758     CPulseData_Apply(
    759         &pAacDecoderChannelInfo->pDynData->specificTo.aac.PulseData,
    760         GetScaleFactorBandOffsets(&pAacDecoderChannelInfo->icsInfo,
    761                                   pSamplingRateInfo),
    762         SPEC_LONG(pSpectralCoefficient));
    763   }
    764 
    765   return AAC_DEC_OK;
    766 }
    767 
    768 static const FIXP_SGL noise_level_tab[8] = {
    769     /* FDKpow(2, (float)(noise_level-14)/3.0f) * 2; (*2 to compensate for
    770        fMultDiv2) noise_level_tab(noise_level==0) == 0 by definition
    771     */
    772     FX_DBL2FXCONST_SGL(0x00000000 /*0x0a145173*/),
    773     FX_DBL2FXCONST_SGL(0x0cb2ff5e),
    774     FX_DBL2FXCONST_SGL(0x10000000),
    775     FX_DBL2FXCONST_SGL(0x1428a2e7),
    776     FX_DBL2FXCONST_SGL(0x1965febd),
    777     FX_DBL2FXCONST_SGL(0x20000000),
    778     FX_DBL2FXCONST_SGL(0x28514606),
    779     FX_DBL2FXCONST_SGL(0x32cbfd33)};
    780 
    781 void CBlock_ApplyNoise(CAacDecoderChannelInfo *pAacDecoderChannelInfo,
    782                        SamplingRateInfo *pSamplingRateInfo, ULONG *nfRandomSeed,
    783                        UCHAR *band_is_noise) {
    784   const SHORT *swb_offset = GetScaleFactorBandOffsets(
    785       &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
    786   int g, win, gwin, sfb, noiseFillingStartOffset, nfStartOffset_sfb;
    787 
    788   /* Obtain noise level and scale factor offset. */
    789   int noise_level = pAacDecoderChannelInfo->pDynData->specificTo.usac
    790                         .fd_noise_level_and_offset >>
    791                     5;
    792   const FIXP_SGL noiseVal_pos = noise_level_tab[noise_level];
    793 
    794   /* noise_offset can change even when noise_level=0. Neccesary for IGF stereo
    795    * filling */
    796   const int noise_offset = (pAacDecoderChannelInfo->pDynData->specificTo.usac
    797                                 .fd_noise_level_and_offset &
    798                             0x1f) -
    799                            16;
    800 
    801   int max_sfb =
    802       GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
    803 
    804   noiseFillingStartOffset =
    805       (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == BLOCK_SHORT)
    806           ? 20
    807           : 160;
    808   if (pAacDecoderChannelInfo->granuleLength == 96) {
    809     noiseFillingStartOffset =
    810         (3 * noiseFillingStartOffset) /
    811         4; /* scale offset with 3/4 for coreCoderFrameLength == 768 */
    812   }
    813 
    814   /* determine sfb from where on noise filling is applied */
    815   for (sfb = 0; swb_offset[sfb] < noiseFillingStartOffset; sfb++)
    816     ;
    817   nfStartOffset_sfb = sfb;
    818 
    819   /* if (noise_level!=0) */
    820   {
    821     for (g = 0, win = 0; g < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo);
    822          g++) {
    823       int windowGroupLength =
    824           GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo, g);
    825       for (sfb = nfStartOffset_sfb; sfb < max_sfb; sfb++) {
    826         int bin_start = swb_offset[sfb];
    827         int bin_stop = swb_offset[sfb + 1];
    828 
    829         int flagN = band_is_noise[g * 16 + sfb];
    830 
    831         /* if all bins of one sfb in one window group are zero modify the scale
    832          * factor by noise_offset */
    833         if (flagN) {
    834           /* Change scaling factors for empty signal bands */
    835           pAacDecoderChannelInfo->pDynData->aScaleFactor[g * 16 + sfb] +=
    836               noise_offset;
    837           /* scale factor "sf" implied gain "g" is g = 2^(sf/4) */
    838           for (gwin = 0; gwin < windowGroupLength; gwin++) {
    839             pAacDecoderChannelInfo->pDynData
    840                 ->aSfbScale[(win + gwin) * 16 + sfb] += (noise_offset >> 2);
    841           }
    842         }
    843 
    844         ULONG seed = *nfRandomSeed;
    845         /* + 1 because exponent of MantissaTable[lsb][0] is always 1. */
    846         int scale =
    847             (pAacDecoderChannelInfo->pDynData->aScaleFactor[g * 16 + sfb] >>
    848              2) +
    849             1;
    850         int lsb =
    851             pAacDecoderChannelInfo->pDynData->aScaleFactor[g * 16 + sfb] & 3;
    852         FIXP_DBL mantissa = MantissaTable[lsb][0];
    853 
    854         for (gwin = 0; gwin < windowGroupLength; gwin++) {
    855           FIXP_DBL *pSpec =
    856               SPEC(pAacDecoderChannelInfo->pSpectralCoefficient, win + gwin,
    857                    pAacDecoderChannelInfo->granuleLength);
    858 
    859           int scale1 = scale - pAacDecoderChannelInfo->pDynData
    860                                    ->aSfbScale[(win + gwin) * 16 + sfb];
    861           FIXP_DBL scaled_noiseVal_pos =
    862               scaleValue(fMultDiv2(noiseVal_pos, mantissa), scale1);
    863           FIXP_DBL scaled_noiseVal_neg = -scaled_noiseVal_pos;
    864 
    865           /* If the whole band is zero, just fill without checking */
    866           if (flagN) {
    867             for (int bin = bin_start; bin < bin_stop; bin++) {
    868               seed = (ULONG)(
    869                   (UINT64)seed * 69069 +
    870                   5); /* Inlined: UsacRandomSign - origin in usacdec_lpd.h */
    871               pSpec[bin] =
    872                   (seed & 0x10000) ? scaled_noiseVal_neg : scaled_noiseVal_pos;
    873             } /* for (bin...) */
    874           }
    875           /*If band is sparsely filled, check for 0 and fill */
    876           else {
    877             for (int bin = bin_start; bin < bin_stop; bin++) {
    878               if (pSpec[bin] == (FIXP_DBL)0) {
    879                 seed = (ULONG)(
    880                     (UINT64)seed * 69069 +
    881                     5); /* Inlined: UsacRandomSign - origin in usacdec_lpd.h */
    882                 pSpec[bin] = (seed & 0x10000) ? scaled_noiseVal_neg
    883                                               : scaled_noiseVal_pos;
    884               }
    885             } /* for (bin...) */
    886           }
    887 
    888         } /* for (gwin...) */
    889         *nfRandomSeed = seed;
    890       } /* for (sfb...) */
    891       win += windowGroupLength;
    892     } /* for (g...) */
    893 
    894   } /* ... */
    895 }
    896 
    897 AAC_DECODER_ERROR CBlock_ReadAcSpectralData(
    898     HANDLE_FDK_BITSTREAM hBs, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
    899     CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
    900     const SamplingRateInfo *pSamplingRateInfo, const UINT frame_length,
    901     const UINT flags) {
    902   AAC_DECODER_ERROR errorAAC = AAC_DEC_OK;
    903   ARITH_CODING_ERROR error = ARITH_CODER_OK;
    904   int arith_reset_flag, lg, numWin, win, winLen;
    905   const SHORT *RESTRICT BandOffsets;
    906 
    907   /* number of transmitted spectral coefficients */
    908   BandOffsets = GetScaleFactorBandOffsets(&pAacDecoderChannelInfo->icsInfo,
    909                                           pSamplingRateInfo);
    910   lg = BandOffsets[GetScaleFactorBandsTransmitted(
    911       &pAacDecoderChannelInfo->icsInfo)];
    912 
    913   numWin = GetWindowsPerFrame(&pAacDecoderChannelInfo->icsInfo);
    914   winLen = (IsLongBlock(&pAacDecoderChannelInfo->icsInfo))
    915                ? (int)frame_length
    916                : (int)frame_length / numWin;
    917 
    918   if (flags & AC_INDEP) {
    919     arith_reset_flag = 1;
    920   } else {
    921     arith_reset_flag = (USHORT)FDKreadBits(hBs, 1);
    922   }
    923 
    924   for (win = 0; win < numWin; win++) {
    925     error =
    926         CArco_DecodeArithData(pAacDecoderStaticChannelInfo->hArCo, hBs,
    927                               SPEC(pAacDecoderChannelInfo->pSpectralCoefficient,
    928                                    win, pAacDecoderChannelInfo->granuleLength),
    929                               lg, winLen, arith_reset_flag && (win == 0));
    930     if (error != ARITH_CODER_OK) {
    931       goto bail;
    932     }
    933   }
    934 
    935 bail:
    936   if (error == ARITH_CODER_ERROR) {
    937     errorAAC = AAC_DEC_PARSE_ERROR;
    938   }
    939 
    940   return errorAAC;
    941 }
    942 
    943 void ApplyTools(CAacDecoderChannelInfo *pAacDecoderChannelInfo[],
    944                 const SamplingRateInfo *pSamplingRateInfo, const UINT flags,
    945                 const UINT elFlags, const int channel,
    946                 const int common_window) {
    947   if (!(flags & (AC_USAC | AC_RSVD50 | AC_MPEGD_RES | AC_RSV603DA))) {
    948     CPns_Apply(&pAacDecoderChannelInfo[channel]->data.aac.PnsData,
    949                &pAacDecoderChannelInfo[channel]->icsInfo,
    950                pAacDecoderChannelInfo[channel]->pSpectralCoefficient,
    951                pAacDecoderChannelInfo[channel]->specScale,
    952                pAacDecoderChannelInfo[channel]->pDynData->aScaleFactor,
    953                pSamplingRateInfo,
    954                pAacDecoderChannelInfo[channel]->granuleLength, channel);
    955   }
    956 
    957   UCHAR nbands =
    958       GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[channel]->icsInfo);
    959 
    960   CTns_Apply(&pAacDecoderChannelInfo[channel]->pDynData->TnsData,
    961              &pAacDecoderChannelInfo[channel]->icsInfo,
    962              pAacDecoderChannelInfo[channel]->pSpectralCoefficient,
    963              pSamplingRateInfo, pAacDecoderChannelInfo[channel]->granuleLength,
    964              nbands, (elFlags & AC_EL_ENHANCED_NOISE) ? 1 : 0, flags);
    965 }
    966 
    967 static int getWindow2Nr(int length, int shape) {
    968   int nr = 0;
    969 
    970   if (shape == 2) {
    971     /* Low Overlap, 3/4 zeroed */
    972     nr = (length * 3) >> 2;
    973   }
    974 
    975   return nr;
    976 }
    977 
    978 FIXP_DBL get_gain(const FIXP_DBL *x, const FIXP_DBL *y, int n) {
    979   FIXP_DBL corr = (FIXP_DBL)0;
    980   FIXP_DBL ener = (FIXP_DBL)1;
    981 
    982   int headroom_x = getScalefactor(x, n);
    983   int headroom_y = getScalefactor(y, n);
    984 
    985   /*Calculate the normalization necessary due to addition*/
    986   /* Check for power of two /special case */
    987   INT width_shift = (INT)(fNormz((FIXP_DBL)n));
    988   /* Get the number of bits necessary minus one, because we need one sign bit
    989    * only */
    990   width_shift = 31 - width_shift;
    991 
    992   for (int i = 0; i < n; i++) {
    993     corr +=
    994         fMultDiv2((x[i] << headroom_x), (y[i] << headroom_y)) >> width_shift;
    995     ener += fPow2Div2((y[i] << headroom_y)) >> width_shift;
    996   }
    997 
    998   int exp_corr = (17 - headroom_x) + (17 - headroom_y) + width_shift + 1;
    999   int exp_ener = ((17 - headroom_y) << 1) + width_shift + 1;
   1000 
   1001   int temp_exp = 0;
   1002   FIXP_DBL output = fDivNormSigned(corr, ener, &temp_exp);
   1003 
   1004   int output_exp = (exp_corr - exp_ener) + temp_exp;
   1005 
   1006   INT output_shift = 17 - output_exp;
   1007   output_shift = fMin(output_shift, 31);
   1008 
   1009   output = scaleValue(output, -output_shift);
   1010 
   1011   return output;
   1012 }
   1013 
   1014 void CBlock_FrequencyToTime(
   1015     CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
   1016     CAacDecoderChannelInfo *pAacDecoderChannelInfo, FIXP_PCM outSamples[],
   1017     const SHORT frameLen, const int frameOk, FIXP_DBL *pWorkBuffer1,
   1018     UINT elFlags, INT elCh) {
   1019   int fr, fl, tl, nSpec;
   1020 
   1021 #if defined(FDK_ASSERT_ENABLE)
   1022   LONG nSamples;
   1023 #endif
   1024 
   1025   /* Determine left slope length (fl), right slope length (fr) and transform
   1026      length (tl). USAC: The slope length may mismatch with the previous frame in
   1027      case of LPD / FD transitions. The adjustment is handled by the imdct
   1028      implementation.
   1029   */
   1030   tl = frameLen;
   1031   nSpec = 1;
   1032 
   1033   switch (pAacDecoderChannelInfo->icsInfo.WindowSequence) {
   1034     default:
   1035     case BLOCK_LONG:
   1036       fl = frameLen;
   1037       fr = frameLen -
   1038            getWindow2Nr(frameLen,
   1039                         GetWindowShape(&pAacDecoderChannelInfo->icsInfo));
   1040       /* New startup needs differentiation between sine shape and low overlap
   1041          shape. This is a special case for the LD-AAC transformation windows,
   1042          because the slope length can be different while using the same window
   1043          sequence. */
   1044       if (pAacDecoderStaticChannelInfo->IMdct.prev_tl == 0) {
   1045         fl = fr;
   1046       }
   1047       break;
   1048     case BLOCK_STOP:
   1049       fl = frameLen >> 3;
   1050       fr = frameLen;
   1051       break;
   1052     case BLOCK_START: /* or StopStartSequence */
   1053       fl = frameLen;
   1054       fr = frameLen >> 3;
   1055       break;
   1056     case BLOCK_SHORT:
   1057       fl = fr = frameLen >> 3;
   1058       tl >>= 3;
   1059       nSpec = 8;
   1060       break;
   1061   }
   1062 
   1063   {
   1064     int last_frame_lost = pAacDecoderStaticChannelInfo->last_lpc_lost;
   1065 
   1066     if (pAacDecoderStaticChannelInfo->last_core_mode == LPD) {
   1067       INT fac_FB = 1;
   1068       if (elFlags & AC_EL_FULLBANDLPD) {
   1069         fac_FB = 2;
   1070       }
   1071 
   1072       FIXP_DBL *synth;
   1073 
   1074       /* Keep some free space at the beginning of the buffer. To be used for
   1075        * past data */
   1076       if (!(elFlags & AC_EL_LPDSTEREOIDX)) {
   1077         synth = pWorkBuffer1 + ((PIT_MAX_MAX - (1 * L_SUBFR)) * fac_FB);
   1078       } else {
   1079         synth = pWorkBuffer1 + PIT_MAX_MAX * fac_FB;
   1080       }
   1081 
   1082       int fac_length =
   1083           (pAacDecoderChannelInfo->icsInfo.WindowSequence == BLOCK_SHORT)
   1084               ? (frameLen >> 4)
   1085               : (frameLen >> 3);
   1086 
   1087       INT pitch[NB_SUBFR_SUPERFR + SYN_SFD];
   1088       FIXP_DBL pit_gain[NB_SUBFR_SUPERFR + SYN_SFD];
   1089 
   1090       int nbDiv = (elFlags & AC_EL_FULLBANDLPD) ? 2 : 4;
   1091       int lFrame = (elFlags & AC_EL_FULLBANDLPD) ? frameLen / 2 : frameLen;
   1092       int nbSubfr =
   1093           lFrame / (nbDiv * L_SUBFR); /* number of subframes per division */
   1094       int LpdSfd = (nbDiv * nbSubfr) >> 1;
   1095       int SynSfd = LpdSfd - BPF_SFD;
   1096 
   1097       FDKmemclear(
   1098           pitch,
   1099           sizeof(
   1100               pitch));  // added to prevent ferret errors in bass_pf_1sf_delay
   1101       FDKmemclear(pit_gain, sizeof(pit_gain));
   1102 
   1103       /* FAC case */
   1104       if (pAacDecoderStaticChannelInfo->last_lpd_mode == 0 ||
   1105           pAacDecoderStaticChannelInfo->last_lpd_mode == 4) {
   1106         FIXP_DBL fac_buf[LFAC];
   1107         FIXP_LPC *A = pAacDecoderChannelInfo->data.usac.lp_coeff[0];
   1108 
   1109         if (!frameOk || last_frame_lost ||
   1110             (pAacDecoderChannelInfo->data.usac.fac_data[0] == NULL)) {
   1111           FDKmemclear(fac_buf,
   1112                       pAacDecoderChannelInfo->granuleLength * sizeof(FIXP_DBL));
   1113           pAacDecoderChannelInfo->data.usac.fac_data[0] = fac_buf;
   1114           pAacDecoderChannelInfo->data.usac.fac_data_e[0] = 0;
   1115         }
   1116 
   1117         INT A_exp; /* linear prediction coefficients exponent */
   1118         {
   1119           for (int i = 0; i < M_LP_FILTER_ORDER; i++) {
   1120             A[i] = FX_DBL2FX_LPC(fixp_cos(
   1121                 fMult(pAacDecoderStaticChannelInfo->lpc4_lsf[i],
   1122                       FL2FXCONST_SGL((1 << LSPARG_SCALE) * M_PI / 6400.0)),
   1123                 LSF_SCALE - LSPARG_SCALE));
   1124           }
   1125 
   1126           E_LPC_f_lsp_a_conversion(A, A, &A_exp);
   1127         }
   1128 
   1129 #if defined(FDK_ASSERT_ENABLE)
   1130         nSamples =
   1131 #endif
   1132             CLpd_FAC_Acelp2Mdct(
   1133                 &pAacDecoderStaticChannelInfo->IMdct, synth,
   1134                 SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient),
   1135                 pAacDecoderChannelInfo->specScale, nSpec,
   1136                 pAacDecoderChannelInfo->data.usac.fac_data[0],
   1137                 pAacDecoderChannelInfo->data.usac.fac_data_e[0], fac_length,
   1138                 frameLen, tl,
   1139                 FDKgetWindowSlope(
   1140                     fr, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
   1141                 fr, A, A_exp, &pAacDecoderStaticChannelInfo->acelp,
   1142                 (FIXP_DBL)0, /* FAC gain has already been applied. */
   1143                 (last_frame_lost || !frameOk), 1,
   1144                 pAacDecoderStaticChannelInfo->last_lpd_mode, 0,
   1145                 pAacDecoderChannelInfo->currAliasingSymmetry);
   1146 
   1147       } else {
   1148 #if defined(FDK_ASSERT_ENABLE)
   1149         nSamples =
   1150 #endif
   1151             imlt_block(
   1152                 &pAacDecoderStaticChannelInfo->IMdct, synth,
   1153                 SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient),
   1154                 pAacDecoderChannelInfo->specScale, nSpec, frameLen, tl,
   1155                 FDKgetWindowSlope(
   1156                     fl, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
   1157                 fl,
   1158                 FDKgetWindowSlope(
   1159                     fr, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
   1160                 fr, (FIXP_DBL)0,
   1161                 pAacDecoderChannelInfo->currAliasingSymmetry
   1162                     ? MLT_FLAG_CURR_ALIAS_SYMMETRY
   1163                     : 0);
   1164       }
   1165       FDK_ASSERT(nSamples == frameLen);
   1166 
   1167       /* The "if" clause is entered both for fullbandLpd mono and
   1168        * non-fullbandLpd*. The "else"-> just for fullbandLpd stereo*/
   1169       if (!(elFlags & AC_EL_LPDSTEREOIDX)) {
   1170         FDKmemcpy(pitch, pAacDecoderStaticChannelInfo->old_T_pf,
   1171                   SynSfd * sizeof(INT));
   1172         FDKmemcpy(pit_gain, pAacDecoderStaticChannelInfo->old_gain_pf,
   1173                   SynSfd * sizeof(FIXP_DBL));
   1174 
   1175         for (int i = SynSfd; i < LpdSfd + 3; i++) {
   1176           pitch[i] = L_SUBFR;
   1177           pit_gain[i] = (FIXP_DBL)0;
   1178         }
   1179 
   1180         if (pAacDecoderStaticChannelInfo->last_lpd_mode == 0) {
   1181           pitch[SynSfd] = pitch[SynSfd - 1];
   1182           pit_gain[SynSfd] = pit_gain[SynSfd - 1];
   1183           if (IsLongBlock(&pAacDecoderChannelInfo->icsInfo)) {
   1184             pitch[SynSfd + 1] = pitch[SynSfd];
   1185             pit_gain[SynSfd + 1] = pit_gain[SynSfd];
   1186           }
   1187         }
   1188 
   1189         /* Copy old data to the beginning of the buffer */
   1190         {
   1191           FDKmemcpy(
   1192               pWorkBuffer1, pAacDecoderStaticChannelInfo->old_synth,
   1193               ((PIT_MAX_MAX - (1 * L_SUBFR)) * fac_FB) * sizeof(FIXP_DBL));
   1194         }
   1195 
   1196         FIXP_DBL *p2_synth = pWorkBuffer1 + (PIT_MAX_MAX * fac_FB);
   1197 
   1198         /* recalculate pitch gain to allow postfilering on FAC area */
   1199         for (int i = 0; i < SynSfd + 2; i++) {
   1200           int T = pitch[i];
   1201           FIXP_DBL gain = pit_gain[i];
   1202 
   1203           if (gain > (FIXP_DBL)0) {
   1204             gain = get_gain(&p2_synth[i * L_SUBFR * fac_FB],
   1205                             &p2_synth[(i * L_SUBFR * fac_FB) - fac_FB * T],
   1206                             L_SUBFR * fac_FB);
   1207             pit_gain[i] = gain;
   1208           }
   1209         }
   1210 
   1211         bass_pf_1sf_delay(p2_synth, pitch, pit_gain, frameLen,
   1212                           (LpdSfd + 2) * L_SUBFR + BPF_SFD * L_SUBFR,
   1213                           frameLen - (LpdSfd + 4) * L_SUBFR, outSamples,
   1214                           pAacDecoderStaticChannelInfo->mem_bpf);
   1215       }
   1216 
   1217     } else /* last_core_mode was not LPD */
   1218     {
   1219       FIXP_DBL *tmp =
   1220           pAacDecoderChannelInfo->pComStaticData->pWorkBufferCore1->mdctOutTemp;
   1221 #if defined(FDK_ASSERT_ENABLE)
   1222       nSamples =
   1223 #endif
   1224           imlt_block(&pAacDecoderStaticChannelInfo->IMdct, tmp,
   1225                      SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient),
   1226                      pAacDecoderChannelInfo->specScale, nSpec, frameLen, tl,
   1227                      FDKgetWindowSlope(
   1228                          fl, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
   1229                      fl,
   1230                      FDKgetWindowSlope(
   1231                          fr, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
   1232                      fr, (FIXP_DBL)0,
   1233                      pAacDecoderChannelInfo->currAliasingSymmetry
   1234                          ? MLT_FLAG_CURR_ALIAS_SYMMETRY
   1235                          : 0);
   1236 
   1237       scaleValuesSaturate(outSamples, tmp, frameLen, MDCT_OUT_HEADROOM);
   1238     }
   1239   }
   1240 
   1241   FDK_ASSERT(nSamples == frameLen);
   1242 
   1243   pAacDecoderStaticChannelInfo->last_core_mode =
   1244       (pAacDecoderChannelInfo->icsInfo.WindowSequence == BLOCK_SHORT) ? FD_SHORT
   1245                                                                       : FD_LONG;
   1246   pAacDecoderStaticChannelInfo->last_lpd_mode = 255;
   1247 }
   1248 
   1249 #include "ldfiltbank.h"
   1250 void CBlock_FrequencyToTimeLowDelay(
   1251     CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
   1252     CAacDecoderChannelInfo *pAacDecoderChannelInfo, FIXP_PCM outSamples[],
   1253     const short frameLen) {
   1254   InvMdctTransformLowDelay_fdk(
   1255       SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient),
   1256       pAacDecoderChannelInfo->specScale[0], outSamples,
   1257       pAacDecoderStaticChannelInfo->pOverlapBuffer, frameLen);
   1258 }
   1259