Coverage Report

Created: 2025-10-10 07:00

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