Coverage Report

Created: 2026-02-26 07:03

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