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