Coverage Report

Created: 2025-08-26 06:50

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