Coverage Report

Created: 2025-07-11 06:54

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