Coverage Report

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