Coverage Report

Created: 2026-08-31 06:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/aac/libAACdec/src/block.cpp
Line
Count
Source
1
/* -----------------------------------------------------------------------------
2
Software License for The Fraunhofer FDK AAC Codec Library for Android
3
4
© Copyright  1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
5
Forschung e.V. All rights reserved.
6
7
 1.    INTRODUCTION
8
The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9
that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10
scheme for digital audio. This FDK AAC Codec software is intended to be used on
11
a wide variety of Android devices.
12
13
AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14
general perceptual audio codecs. AAC-ELD is considered the best-performing
15
full-bandwidth communications codec by independent studies and is widely
16
deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17
specifications.
18
19
Patent licenses for necessary patent claims for the FDK AAC Codec (including
20
those of Fraunhofer) may be obtained through Via Licensing
21
(www.vialicensing.com) or through the respective patent owners individually for
22
the purpose of encoding or decoding bit streams in products that are compliant
23
with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24
Android devices already license these patent claims through Via Licensing or
25
directly from the patent owners, and therefore FDK AAC Codec software may
26
already be covered under those patent licenses when it is used for those
27
licensed purposes only.
28
29
Commercially-licensed AAC software libraries, including floating-point versions
30
with enhanced sound quality, are also available from Fraunhofer. Users are
31
encouraged to check the Fraunhofer website for additional applications
32
information and documentation.
33
34
2.    COPYRIGHT LICENSE
35
36
Redistribution and use in source and binary forms, with or without modification,
37
are permitted without payment of copyright license fees provided that you
38
satisfy the following conditions:
39
40
You must retain the complete text of this software license in redistributions of
41
the FDK AAC Codec or your modifications thereto in source code form.
42
43
You must retain the complete text of this software license in the documentation
44
and/or other materials provided with redistributions of the FDK AAC Codec or
45
your modifications thereto in binary form. You must make available free of
46
charge copies of the complete source code of the FDK AAC Codec and your
47
modifications thereto to recipients of copies in binary form.
48
49
The name of Fraunhofer may not be used to endorse or promote products derived
50
from this library without prior written permission.
51
52
You may not charge copyright license fees for anyone to use, copy or distribute
53
the FDK AAC Codec software or your modifications thereto.
54
55
Your modified versions of the FDK AAC Codec must carry prominent notices stating
56
that you changed the software and the date of any change. For modified versions
57
of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58
must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59
AAC Codec Library for Android."
60
61
3.    NO PATENT LICENSE
62
63
NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64
limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65
Fraunhofer provides no warranty of patent non-infringement with respect to this
66
software.
67
68
You may use this FDK AAC Codec software or modifications thereto only for
69
purposes that are authorized by appropriate patent licenses.
70
71
4.    DISCLAIMER
72
73
This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74
holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75
including but not limited to the implied warranties of merchantability and
76
fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77
CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78
or consequential damages, including but not limited to procurement of substitute
79
goods or services; loss of use, data, or profits, or business interruption,
80
however caused and on any theory of liability, whether in contract, strict
81
liability, or tort (including negligence), arising in any way out of the use of
82
this software, even if advised of the possibility of such damage.
83
84
5.    CONTACT INFORMATION
85
86
Fraunhofer Institute for Integrated Circuits IIS
87
Attention: Audio and Multimedia Departments - FDK AAC LL
88
Am Wolfsmantel 33
89
91058 Erlangen, Germany
90
91
www.iis.fraunhofer.de/amm
92
amm-info@iis.fraunhofer.de
93
----------------------------------------------------------------------------- */
94
95
/**************************** AAC decoder library ******************************
96
97
   Author(s):   Josef Hoepfl
98
99
   Description: long/short-block decoding
100
101
*******************************************************************************/
102
103
#include "block.h"
104
105
#include "aac_rom.h"
106
#include "FDK_bitstream.h"
107
#include "scale.h"
108
#include "FDK_tools_rom.h"
109
110
#include "usacdec_fac.h"
111
#include "usacdec_lpd.h"
112
#include "usacdec_lpc.h"
113
#include "FDK_trigFcts.h"
114
115
#include "ac_arith_coder.h"
116
117
#include "aacdec_hcr.h"
118
#include "rvlc.h"
119
120
#if defined(__arm__)
121
#include "arm/block_arm.cpp"
122
#endif
123
124
/*!
125
  \brief Read escape sequence of codeword
126
127
  The function reads the escape sequence from the bitstream,
128
  if the absolute value of the quantized coefficient has the
129
  value 16.
130
  A limitation is implemented to maximal 21 bits according to
131
  ISO/IEC 14496-3:2009(E) 4.6.3.3.
132
  This limits the escape prefix to a maximum of eight 1's.
133
  If more than eight 1's are read, MAX_QUANTIZED_VALUE + 1 is
134
  returned, independent of the sign of parameter q.
135
136
  \return  quantized coefficient
137
*/
138
LONG CBlock_GetEscape(HANDLE_FDK_BITSTREAM bs, /*!< pointer to bitstream */
139
                      const LONG q)            /*!< quantized coefficient */
140
473k
{
141
473k
  if (fAbs(q) != 16) return (q);
142
143
26.0k
  LONG i, off;
144
35.0k
  for (i = 4; i < 13; i++) {
145
34.9k
    if (FDKreadBit(bs) == 0) break;
146
34.9k
  }
147
148
26.0k
  if (i == 13) return (MAX_QUANTIZED_VALUE + 1);
149
150
26.0k
  off = FDKreadBits(bs, i);
151
26.0k
  i = off + (1 << i);
152
153
26.0k
  if (q < 0) i = -i;
154
155
26.0k
  return i;
156
26.0k
}
157
158
AAC_DECODER_ERROR CBlock_ReadScaleFactorData(
159
    CAacDecoderChannelInfo *pAacDecoderChannelInfo, HANDLE_FDK_BITSTREAM bs,
160
451k
    UINT flags) {
161
451k
  int temp;
162
451k
  int band;
163
451k
  int group;
164
451k
  int position = 0; /* accu for intensity delta coding */
165
451k
  int factor = pAacDecoderChannelInfo->pDynData->RawDataInfo
166
451k
                   .GlobalGain; /* accu for scale factor delta coding */
167
451k
  UCHAR *pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook;
168
451k
  SHORT *pScaleFactor = pAacDecoderChannelInfo->pDynData->aScaleFactor;
169
451k
  const CodeBookDescription *hcb = &AACcodeBookDescriptionTable[BOOKSCL];
170
171
451k
  const USHORT(*CodeBook)[HuffmanEntries] = hcb->CodeBook;
172
173
451k
  int ScaleFactorBandsTransmitted =
174
451k
      GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
175
1.37M
  for (group = 0; group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo);
176
927k
       group++) {
177
2.87M
    for (band = 0; band < ScaleFactorBandsTransmitted; band++) {
178
1.94M
      switch (pCodeBook[band]) {
179
51.1k
        case ZERO_HCB: /* zero book */
180
51.1k
          pScaleFactor[band] = 0;
181
51.1k
          break;
182
183
1.83M
        default: /* decode scale factor */
184
1.83M
          if (!((flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) && band == 0 &&
185
1.70M
                group == 0)) {
186
1.70M
            temp = CBlock_DecodeHuffmanWordCB(bs, CodeBook);
187
1.70M
            factor += temp - 60; /* MIDFAC 1.5 dB */
188
1.70M
          }
189
1.83M
          pScaleFactor[band] = factor - 100;
190
1.83M
          break;
191
192
28.9k
        case INTENSITY_HCB: /* intensity steering */
193
39.8k
        case INTENSITY_HCB2:
194
39.8k
          temp = CBlock_DecodeHuffmanWordCB(bs, CodeBook);
195
39.8k
          position += temp - 60;
196
39.8k
          pScaleFactor[band] = position - 100;
197
39.8k
          break;
198
199
20.7k
        case NOISE_HCB: /* PNS */
200
20.7k
          if (flags & (AC_MPEGD_RES | AC_USAC | AC_RSVD50 | AC_RSV603DA)) {
201
0
            return AAC_DEC_PARSE_ERROR;
202
0
          }
203
20.7k
          CPns_Read(&pAacDecoderChannelInfo->data.aac.PnsData, bs, hcb,
204
20.7k
                    pAacDecoderChannelInfo->pDynData->aScaleFactor,
205
20.7k
                    pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain,
206
20.7k
                    band, group);
207
20.7k
          break;
208
1.94M
      }
209
1.94M
    }
210
927k
    pCodeBook += 16;
211
927k
    pScaleFactor += 16;
212
927k
  }
213
214
451k
  return AAC_DEC_OK;
215
451k
}
216
217
void CBlock_ScaleSpectralData(CAacDecoderChannelInfo *pAacDecoderChannelInfo,
218
                              UCHAR maxSfbs,
219
565k
                              SamplingRateInfo *pSamplingRateInfo) {
220
565k
  int band;
221
565k
  int window;
222
565k
  const SHORT *RESTRICT pSfbScale = pAacDecoderChannelInfo->pDynData->aSfbScale;
223
565k
  SHORT *RESTRICT pSpecScale = pAacDecoderChannelInfo->specScale;
224
565k
  int groupwin, group;
225
565k
  const SHORT *RESTRICT BandOffsets = GetScaleFactorBandOffsets(
226
565k
      &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
227
565k
  SPECTRAL_PTR RESTRICT pSpectralCoefficient =
228
565k
      pAacDecoderChannelInfo->pSpectralCoefficient;
229
230
565k
  FDKmemclear(pSpecScale, 8 * sizeof(SHORT));
231
232
565k
  for (window = 0, group = 0;
233
1.63M
       group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); group++) {
234
2.34M
    for (groupwin = 0; groupwin < GetWindowGroupLength(
235
2.34M
                                      &pAacDecoderChannelInfo->icsInfo, group);
236
1.27M
         groupwin++, window++) {
237
1.27M
      int SpecScale_window = pSpecScale[window];
238
1.27M
      FIXP_DBL *pSpectrum = SPEC(pSpectralCoefficient, window,
239
1.27M
                                 pAacDecoderChannelInfo->granuleLength);
240
241
      /* find scaling for current window */
242
4.31M
      for (band = 0; band < maxSfbs; band++) {
243
3.04M
        SpecScale_window =
244
3.04M
            fMax(SpecScale_window, (int)pSfbScale[window * 16 + band]);
245
3.04M
      }
246
247
1.27M
      if (pAacDecoderChannelInfo->pDynData->TnsData.Active &&
248
444k
          pAacDecoderChannelInfo->pDynData->TnsData.NumberOfFilters[window] >
249
444k
              0) {
250
186k
        int filter_index, SpecScale_window_tns;
251
186k
        int tns_start, tns_stop;
252
253
        /* Find max scale of TNS bands */
254
186k
        SpecScale_window_tns = 0;
255
186k
        tns_start = GetMaximumTnsBands(&pAacDecoderChannelInfo->icsInfo,
256
186k
                                       pSamplingRateInfo->samplingRateIndex);
257
186k
        tns_stop = 0;
258
186k
        for (filter_index = 0;
259
390k
             filter_index < (int)pAacDecoderChannelInfo->pDynData->TnsData
260
390k
                                .NumberOfFilters[window];
261
204k
             filter_index++) {
262
204k
          for (band = pAacDecoderChannelInfo->pDynData->TnsData
263
204k
                          .Filter[window][filter_index]
264
204k
                          .StartBand;
265
2.06M
               band < pAacDecoderChannelInfo->pDynData->TnsData
266
2.06M
                          .Filter[window][filter_index]
267
2.06M
                          .StopBand;
268
1.86M
               band++) {
269
1.86M
            SpecScale_window_tns =
270
1.86M
                fMax(SpecScale_window_tns, (int)pSfbScale[window * 16 + band]);
271
1.86M
          }
272
          /* Find TNS line boundaries for all TNS filters */
273
204k
          tns_start =
274
204k
              fMin(tns_start, (int)pAacDecoderChannelInfo->pDynData->TnsData
275
204k
                                  .Filter[window][filter_index]
276
204k
                                  .StartBand);
277
204k
          tns_stop =
278
204k
              fMax(tns_stop, (int)pAacDecoderChannelInfo->pDynData->TnsData
279
204k
                                 .Filter[window][filter_index]
280
204k
                                 .StopBand);
281
204k
        }
282
186k
        SpecScale_window_tns = SpecScale_window_tns +
283
186k
                               pAacDecoderChannelInfo->pDynData->TnsData.GainLd;
284
186k
        FDK_ASSERT(tns_stop >= tns_start);
285
        /* Consider existing headroom of all MDCT lines inside the TNS bands. */
286
186k
        SpecScale_window_tns -=
287
186k
            getScalefactor(pSpectrum + BandOffsets[tns_start],
288
186k
                           BandOffsets[tns_stop] - BandOffsets[tns_start]);
289
186k
        if (SpecScale_window <= 17) {
290
177k
          SpecScale_window_tns++;
291
177k
        }
292
        /* Add enough mantissa head room such that the spectrum is still
293
           representable after applying TNS. */
294
186k
        SpecScale_window = fMax(SpecScale_window, SpecScale_window_tns);
295
186k
      }
296
297
      /* store scaling of current window */
298
1.27M
      pSpecScale[window] = SpecScale_window;
299
300
#ifdef FUNCTION_CBlock_ScaleSpectralData_func1
301
302
      CBlock_ScaleSpectralData_func1(pSpectrum, maxSfbs, BandOffsets,
303
                                     SpecScale_window, pSfbScale, window);
304
305
#else  /* FUNCTION_CBlock_ScaleSpectralData_func1 */
306
4.31M
      for (band = 0; band < maxSfbs; band++) {
307
3.04M
        int scale = fMin(DFRACT_BITS - 1,
308
3.04M
                         SpecScale_window - pSfbScale[window * 16 + band]);
309
3.04M
        if (scale) {
310
2.10M
          FDK_ASSERT(scale > 0);
311
312
          /* following relation can be used for optimizations:
313
           * (BandOffsets[i]%4) == 0 for all i */
314
2.10M
          int max_index = BandOffsets[band + 1];
315
2.10M
          DWORD_ALIGNED(pSpectrum);
316
18.7M
          for (int index = BandOffsets[band]; index < max_index; index++) {
317
16.6M
            pSpectrum[index] >>= scale;
318
16.6M
          }
319
2.10M
        }
320
3.04M
      }
321
1.27M
#endif /* FUNCTION_CBlock_ScaleSpectralData_func1 */
322
1.27M
    }
323
1.06M
  }
324
565k
}
325
326
AAC_DECODER_ERROR CBlock_ReadSectionData(
327
    HANDLE_FDK_BITSTREAM bs, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
328
313k
    const SamplingRateInfo *pSamplingRateInfo, const UINT flags) {
329
313k
  int top, band;
330
313k
  int sect_len, sect_len_incr;
331
313k
  int group;
332
313k
  UCHAR sect_cb;
333
313k
  UCHAR *pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook;
334
  /* HCR input (long) */
335
313k
  SHORT *pNumLinesInSec =
336
313k
      pAacDecoderChannelInfo->pDynData->specificTo.aac.aNumLineInSec4Hcr;
337
313k
  int numLinesInSecIdx = 0;
338
313k
  UCHAR *pHcrCodeBook =
339
313k
      pAacDecoderChannelInfo->pDynData->specificTo.aac.aCodeBooks4Hcr;
340
313k
  const SHORT *BandOffsets = GetScaleFactorBandOffsets(
341
313k
      &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
342
313k
  pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection = 0;
343
313k
  AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK;
344
345
313k
  FDKmemclear(pCodeBook, sizeof(UCHAR) * (8 * 16));
346
347
313k
  const int nbits =
348
313k
      (IsLongBlock(&pAacDecoderChannelInfo->icsInfo) == 1) ? 5 : 3;
349
350
313k
  int sect_esc_val = (1 << nbits) - 1;
351
352
313k
  UCHAR ScaleFactorBandsTransmitted =
353
313k
      GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
354
850k
  for (group = 0; group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo);
355
537k
       group++) {
356
73.7M
    for (band = 0; band < ScaleFactorBandsTransmitted;) {
357
73.2M
      sect_len = 0;
358
73.2M
      if (flags & AC_ER_VCB11) {
359
52.4M
        sect_cb = (UCHAR)FDKreadBits(bs, 5);
360
52.4M
      } else
361
20.7M
        sect_cb = (UCHAR)FDKreadBits(bs, 4);
362
363
73.2M
      if (((flags & AC_ER_VCB11) == 0) || (sect_cb < 11) ||
364
73.1M
          ((sect_cb > 11) && (sect_cb < 16))) {
365
73.1M
        sect_len_incr = FDKreadBits(bs, nbits);
366
73.2M
        while (sect_len_incr == sect_esc_val) {
367
93.7k
          sect_len += sect_esc_val;
368
93.7k
          sect_len_incr = FDKreadBits(bs, nbits);
369
93.7k
        }
370
73.1M
      } else {
371
85.6k
        sect_len_incr = 1;
372
85.6k
      }
373
374
73.2M
      sect_len += sect_len_incr;
375
376
73.2M
      top = band + sect_len;
377
378
73.2M
      if (flags & AC_ER_HCR) {
379
        /* HCR input (long) -- collecting sideinfo (for HCR-_long_ only) */
380
129k
        if (numLinesInSecIdx >= MAX_SFB_HCR) {
381
227
          return AAC_DEC_PARSE_ERROR;
382
227
        }
383
129k
        if (top > (int)GetNumberOfScaleFactorBands(
384
129k
                      &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo)) {
385
8
          return AAC_DEC_PARSE_ERROR;
386
8
        }
387
129k
        pNumLinesInSec[numLinesInSecIdx] = BandOffsets[top] - BandOffsets[band];
388
129k
        numLinesInSecIdx++;
389
129k
        if (sect_cb == BOOKSCL) {
390
11
          return AAC_DEC_INVALID_CODE_BOOK;
391
129k
        } else {
392
129k
          *pHcrCodeBook++ = sect_cb;
393
129k
        }
394
129k
        pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection++;
395
129k
      }
396
397
      /* Check spectral line limits */
398
73.2M
      if (IsLongBlock(&(pAacDecoderChannelInfo->icsInfo))) {
399
15.4M
        if (top > 64) {
400
12
          return AAC_DEC_DECODE_FRAME_ERROR;
401
12
        }
402
57.7M
      } else { /* short block */
403
57.7M
        if (top + group * 16 > (8 * 16)) {
404
33
          return AAC_DEC_DECODE_FRAME_ERROR;
405
33
        }
406
57.7M
      }
407
408
      /* Check if decoded codebook index is feasible */
409
73.2M
      if ((sect_cb == BOOKSCL) ||
410
73.2M
          ((sect_cb == INTENSITY_HCB || sect_cb == INTENSITY_HCB2) &&
411
34.7k
           pAacDecoderChannelInfo->pDynData->RawDataInfo.CommonWindow == 0)) {
412
159
        return AAC_DEC_INVALID_CODE_BOOK;
413
159
      }
414
415
      /* Store codebook index */
416
75.7M
      for (; band < top; band++) {
417
2.53M
        pCodeBook[group * 16 + band] = sect_cb;
418
2.53M
      }
419
73.2M
    }
420
537k
  }
421
422
312k
  return ErrorStatus;
423
313k
}
424
425
/* mso: provides a faster way to i-quantize a whole band in one go */
426
427
/**
428
 * \brief inverse quantize one sfb. Each value of the sfb is processed according
429
 * to the formula: spectrum[i] = Sign(spectrum[i]) * Matissa(spectrum[i])^(4/3)
430
 * * 2^(lsb/4).
431
 * \param spectrum pointer to first line of the sfb to be inverse quantized.
432
 * \param noLines number of lines belonging to the sfb.
433
 * \param lsb last 2 bits of the scale factor of the sfb.
434
 * \param scale max allowed shift scale for the sfb.
435
 */
436
static inline void InverseQuantizeBand(
437
    FIXP_DBL *RESTRICT spectrum, const FIXP_DBL *RESTRICT InverseQuantTabler,
438
    const FIXP_DBL *RESTRICT MantissaTabler,
439
1.32M
    const SCHAR *RESTRICT ExponentTabler, INT noLines, INT scale) {
440
1.32M
  scale = scale + 1; /* +1 to compensate fMultDiv2 shift-right in loop */
441
442
1.32M
  FIXP_DBL *RESTRICT ptr = spectrum;
443
1.32M
  FIXP_DBL signedValue;
444
445
9.60M
  for (INT i = noLines; i--;) {
446
8.28M
    if ((signedValue = *ptr++) != FL2FXCONST_DBL(0)) {
447
3.92M
      FIXP_DBL value = fAbs(signedValue);
448
3.92M
      UINT freeBits = CntLeadingZeros(value);
449
3.92M
      UINT exponent = 32 - freeBits;
450
451
3.92M
      UINT x = (UINT)(LONG)value << (INT)freeBits;
452
3.92M
      x <<= 1; /* shift out sign bit to avoid masking later on */
453
3.92M
      UINT tableIndex = x >> 24;
454
3.92M
      x = (x >> 20) & 0x0F;
455
456
3.92M
      UINT r0 = (UINT)(LONG)InverseQuantTabler[tableIndex + 0];
457
3.92M
      UINT r1 = (UINT)(LONG)InverseQuantTabler[tableIndex + 1];
458
3.92M
      UINT temp = (r1 - r0) * x + (r0 << 4);
459
460
3.92M
      value = fMultDiv2((FIXP_DBL)temp, MantissaTabler[exponent]);
461
462
      /* + 1 compensates fMultDiv2() */
463
3.92M
      scaleValueInPlace(&value, scale + ExponentTabler[exponent]);
464
465
3.92M
      signedValue = (signedValue < (FIXP_DBL)0) ? -value : value;
466
3.92M
      ptr[-1] = signedValue;
467
3.92M
    }
468
8.28M
  }
469
1.32M
}
470
471
static inline FIXP_DBL maxabs_D(const FIXP_DBL *pSpectralCoefficient,
472
2.39M
                                const int noLines) {
473
  /* Find max spectral line value of the current sfb */
474
2.39M
  FIXP_DBL locMax = (FIXP_DBL)0;
475
2.39M
  int i;
476
477
2.39M
  DWORD_ALIGNED(pSpectralCoefficient);
478
479
21.0M
  for (i = noLines; i-- > 0;) {
480
    /* Expensive memory access */
481
18.6M
    locMax = fMax(fixp_abs(pSpectralCoefficient[i]), locMax);
482
18.6M
  }
483
484
2.39M
  return locMax;
485
2.39M
}
486
487
AAC_DECODER_ERROR CBlock_InverseQuantizeSpectralData(
488
    CAacDecoderChannelInfo *pAacDecoderChannelInfo,
489
    SamplingRateInfo *pSamplingRateInfo, UCHAR *band_is_noise,
490
584k
    UCHAR active_band_search) {
491
584k
  int window, group, groupwin, band;
492
584k
  int ScaleFactorBandsTransmitted =
493
584k
      GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
494
584k
  UCHAR *RESTRICT pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook;
495
584k
  SHORT *RESTRICT pSfbScale = pAacDecoderChannelInfo->pDynData->aSfbScale;
496
584k
  SHORT *RESTRICT pScaleFactor = pAacDecoderChannelInfo->pDynData->aScaleFactor;
497
584k
  const SHORT *RESTRICT BandOffsets = GetScaleFactorBandOffsets(
498
584k
      &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
499
584k
  const SHORT total_bands =
500
584k
      GetScaleFactorBandsTotal(&pAacDecoderChannelInfo->icsInfo);
501
502
584k
  FDKmemclear(pAacDecoderChannelInfo->pDynData->aSfbScale,
503
584k
              (8 * 16) * sizeof(SHORT));
504
505
584k
  for (window = 0, group = 0;
506
1.70M
       group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); group++) {
507
2.45M
    for (groupwin = 0; groupwin < GetWindowGroupLength(
508
2.45M
                                      &pAacDecoderChannelInfo->icsInfo, group);
509
1.33M
         groupwin++, window++) {
510
      /* inverse quantization */
511
4.32M
      for (band = 0; band < ScaleFactorBandsTransmitted; band++) {
512
2.98M
        FIXP_DBL *pSpectralCoefficient =
513
2.98M
            SPEC(pAacDecoderChannelInfo->pSpectralCoefficient, window,
514
2.98M
                 pAacDecoderChannelInfo->granuleLength) +
515
2.98M
            BandOffsets[band];
516
2.98M
        FIXP_DBL locMax;
517
518
2.98M
        const int noLines = BandOffsets[band + 1] - BandOffsets[band];
519
2.98M
        const int bnds = group * 16 + band;
520
521
2.98M
        if ((pCodeBook[bnds] == ZERO_HCB) ||
522
2.62M
            (pCodeBook[bnds] == INTENSITY_HCB) ||
523
2.54M
            (pCodeBook[bnds] == INTENSITY_HCB2))
524
517k
          continue;
525
526
2.46M
        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
74.4k
          pSfbScale[window * 16 + band] = (pScaleFactor[bnds] >> 2) + 1;
531
74.4k
          continue;
532
74.4k
        }
533
534
2.39M
        locMax = maxabs_D(pSpectralCoefficient, noLines);
535
536
2.39M
        if (active_band_search) {
537
2.39M
          if (locMax != FIXP_DBL(0)) {
538
1.32M
            band_is_noise[group * 16 + band] = 0;
539
1.32M
          }
540
2.39M
        }
541
542
        /* Cheap robustness improvement - Do not remove!!! */
543
2.39M
        if (fixp_abs(locMax) > (FIXP_DBL)MAX_QUANTIZED_VALUE) {
544
32
          return AAC_DEC_PARSE_ERROR;
545
32
        }
546
547
        /* Added by Youliy Ninov:
548
        The inverse quantization operation is given by (ISO/IEC 14496-3:2009(E))
549
        by:
550
551
        x_invquant=Sign(x_quant). abs(x_quant)^(4/3)
552
553
        We apply a gain, derived from the scale factor for the particular sfb,
554
        according to the following function:
555
556
        gain=2^(0.25*ScaleFactor)
557
558
        So, after scaling we have:
559
560
        x_rescale=gain*x_invquant=Sign(x_quant)*2^(0.25*ScaleFactor)*abs(s_quant)^(4/3)
561
562
        We could represent the ScaleFactor as:
563
564
        ScaleFactor= (ScaleFactor >> 2)*4 + ScaleFactor %4
565
566
        When we substitute it we get:
567
568
        x_rescale=Sign(x_quant)*2^(ScaleFactor>>2)* (
569
        2^(0.25*(ScaleFactor%4))*abs(s_quant)^(4/3))
570
571
        When we set: msb=(ScaleFactor>>2) and lsb=(ScaleFactor%4), we obtain:
572
573
        x_rescale=Sign(x_quant)*(2^msb)* ( 2^(lsb/4)*abs(s_quant)^(4/3))
574
575
        The rescaled output can be represented by:
576
           mantissa : Sign(x_quant)*( 2^(lsb/4)*abs(s_quant)^(4/3))
577
           exponent :(2^msb)
578
579
        */
580
581
2.39M
        int msb = pScaleFactor[bnds] >> 2;
582
583
        /* Inverse quantize band only if it is not empty */
584
2.39M
        if (locMax != FIXP_DBL(0)) {
585
1.32M
          int lsb = pScaleFactor[bnds] & 0x03;
586
587
1.32M
          int scale = EvaluatePower43(&locMax, lsb);
588
589
1.32M
          scale = CntLeadingZeros(locMax) - scale - 2;
590
591
1.32M
          pSfbScale[window * 16 + band] = msb - scale;
592
1.32M
          InverseQuantizeBand(pSpectralCoefficient, InverseQuantTable,
593
1.32M
                              MantissaTable[lsb], ExponentTable[lsb], noLines,
594
1.32M
                              scale);
595
1.32M
        } else {
596
1.06M
          pSfbScale[window * 16 + band] = msb;
597
1.06M
        }
598
599
2.39M
      } /* for (band=0; band < ScaleFactorBandsTransmitted; band++) */
600
601
      /* Make sure the array is cleared to the end */
602
1.33M
      SHORT start_clear = BandOffsets[ScaleFactorBandsTransmitted];
603
1.33M
      SHORT end_clear = BandOffsets[total_bands];
604
1.33M
      int diff_clear = (int)(end_clear - start_clear);
605
1.33M
      FIXP_DBL *pSpectralCoefficient =
606
1.33M
          SPEC(pAacDecoderChannelInfo->pSpectralCoefficient, window,
607
1.33M
               pAacDecoderChannelInfo->granuleLength) +
608
1.33M
          start_clear;
609
1.33M
      FDKmemclear(pSpectralCoefficient, diff_clear * sizeof(FIXP_DBL));
610
611
1.33M
    } /* for (groupwin=0; groupwin <
612
         GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group);
613
         groupwin++, window++) */
614
1.11M
  }   /* for (window=0, group=0; group <
615
         GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); group++)*/
616
617
584k
  return AAC_DEC_OK;
618
584k
}
619
620
AAC_DECODER_ERROR CBlock_ReadSpectralData(
621
    HANDLE_FDK_BITSTREAM bs, CAacDecoderChannelInfo *pAacDecoderChannelInfo,
622
312k
    const SamplingRateInfo *pSamplingRateInfo, const UINT flags) {
623
312k
  int index, i;
624
312k
  const SHORT *RESTRICT BandOffsets = GetScaleFactorBandOffsets(
625
312k
      &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
626
627
312k
  SPECTRAL_PTR pSpectralCoefficient =
628
312k
      pAacDecoderChannelInfo->pSpectralCoefficient;
629
630
312k
  FDK_ASSERT(BandOffsets != NULL);
631
632
312k
  FDKmemclear(pSpectralCoefficient, sizeof(SPECTRUM));
633
634
312k
  if ((flags & AC_ER_HCR) == 0) {
635
302k
    int group;
636
302k
    int groupoffset;
637
302k
    UCHAR *pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook;
638
302k
    int ScaleFactorBandsTransmitted =
639
302k
        GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
640
302k
    int granuleLength = pAacDecoderChannelInfo->granuleLength;
641
642
302k
    groupoffset = 0;
643
644
    /* plain huffman decoder  short */
645
302k
    int max_group = GetWindowGroups(&pAacDecoderChannelInfo->icsInfo);
646
647
812k
    for (group = 0; group < max_group; group++) {
648
510k
      int max_groupwin =
649
510k
          GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo, group);
650
510k
      int band;
651
652
510k
      int bnds = group * 16;
653
654
510k
      int bandOffset1 = BandOffsets[0];
655
1.35M
      for (band = 0; band < ScaleFactorBandsTransmitted; band++, bnds++) {
656
849k
        UCHAR currentCB = pCodeBook[bnds];
657
849k
        int bandOffset0 = bandOffset1;
658
849k
        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
849k
        if ((currentCB >= 16) && (currentCB <= 31)) {
664
63.0k
          pCodeBook[bnds] = currentCB = 11;
665
63.0k
        }
666
849k
        if (((currentCB != ZERO_HCB) && (currentCB != NOISE_HCB) &&
667
551k
             (currentCB != INTENSITY_HCB) && (currentCB != INTENSITY_HCB2))) {
668
446k
          const CodeBookDescription *hcb =
669
446k
              &AACcodeBookDescriptionTable[currentCB];
670
446k
          int step = hcb->Dimension;
671
446k
          int offset = hcb->Offset;
672
446k
          int bits = hcb->numBits;
673
446k
          int mask = (1 << bits) - 1;
674
446k
          const USHORT(*CodeBook)[HuffmanEntries] = hcb->CodeBook;
675
446k
          int groupwin;
676
677
446k
          FIXP_DBL *mdctSpectrum =
678
446k
              &pSpectralCoefficient[groupoffset * granuleLength];
679
680
446k
          if (offset == 0) {
681
586k
            for (groupwin = 0; groupwin < max_groupwin; groupwin++) {
682
940k
              for (index = bandOffset0; index < bandOffset1; index += step) {
683
634k
                int idx = CBlock_DecodeHuffmanWordCB(bs, CodeBook);
684
2.11M
                for (i = 0; i < step; i++, idx >>= bits) {
685
1.48M
                  FIXP_DBL tmp = (FIXP_DBL)((idx & mask) - offset);
686
1.48M
                  if (tmp != FIXP_DBL(0)) tmp = (FDKreadBit(bs)) ? -tmp : tmp;
687
1.48M
                  mdctSpectrum[index + i] = tmp;
688
1.48M
                }
689
690
634k
                if (currentCB == ESCBOOK) {
691
710k
                  for (int j = 0; j < 2; j++)
692
473k
                    mdctSpectrum[index + j] = (FIXP_DBL)CBlock_GetEscape(
693
473k
                        bs, (LONG)mdctSpectrum[index + j]);
694
236k
                }
695
634k
              }
696
306k
              mdctSpectrum += granuleLength;
697
306k
            }
698
280k
          } else {
699
336k
            for (groupwin = 0; groupwin < max_groupwin; groupwin++) {
700
447k
              for (index = bandOffset0; index < bandOffset1; index += step) {
701
275k
                int idx = CBlock_DecodeHuffmanWordCB(bs, CodeBook);
702
1.08M
                for (i = 0; i < step; i++, idx >>= bits) {
703
805k
                  mdctSpectrum[index + i] = (FIXP_DBL)((idx & mask) - offset);
704
805k
                }
705
275k
                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
275k
              }
711
171k
              mdctSpectrum += granuleLength;
712
171k
            }
713
165k
          }
714
446k
        }
715
849k
      }
716
510k
      groupoffset += max_groupwin;
717
510k
    }
718
    /* plain huffman decoding (short) finished */
719
302k
  }
720
721
  /* HCR - Huffman Codeword Reordering  short */
722
10.0k
  else /* if ( flags & AC_ER_HCR ) */
723
724
10.0k
  {
725
10.0k
    H_HCR_INFO hHcr = &pAacDecoderChannelInfo->pComData->overlay.aac.erHcrInfo;
726
727
10.0k
    int hcrStatus = 0;
728
729
    /* advanced Huffman decoding starts here (HCR decoding :) */
730
10.0k
    if (pAacDecoderChannelInfo->pDynData->specificTo.aac
731
10.0k
            .lenOfReorderedSpectralData != 0) {
732
      /* HCR initialization short */
733
9.67k
      hcrStatus = HcrInit(hHcr, pAacDecoderChannelInfo, pSamplingRateInfo, bs);
734
735
9.67k
      if (hcrStatus != 0) {
736
32
        return AAC_DEC_DECODE_FRAME_ERROR;
737
32
      }
738
739
      /* HCR decoding short */
740
9.64k
      hcrStatus =
741
9.64k
          HcrDecoder(hHcr, pAacDecoderChannelInfo, pSamplingRateInfo, bs);
742
743
9.64k
      if (hcrStatus != 0) {
744
7.11k
#if HCR_ERROR_CONCEALMENT
745
7.11k
        HcrMuteErroneousLines(hHcr);
746
#else
747
        return AAC_DEC_DECODE_FRAME_ERROR;
748
#endif /* HCR_ERROR_CONCEALMENT */
749
7.11k
      }
750
751
9.64k
      FDKpushFor(bs, pAacDecoderChannelInfo->pDynData->specificTo.aac
752
9.64k
                         .lenOfReorderedSpectralData);
753
9.64k
    }
754
10.0k
  }
755
  /* HCR - Huffman Codeword Reordering short finished */
756
757
312k
  if (IsLongBlock(&pAacDecoderChannelInfo->icsInfo) &&
758
260k
      !(flags & (AC_ELD | AC_SCALABLE))) {
759
    /* apply pulse data */
760
24.0k
    CPulseData_Apply(
761
24.0k
        &pAacDecoderChannelInfo->pDynData->specificTo.aac.PulseData,
762
24.0k
        GetScaleFactorBandOffsets(&pAacDecoderChannelInfo->icsInfo,
763
24.0k
                                  pSamplingRateInfo),
764
24.0k
        SPEC_LONG(pSpectralCoefficient));
765
24.0k
  }
766
767
312k
  return AAC_DEC_OK;
768
312k
}
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.1k
                       UCHAR *band_is_noise) {
786
13.1k
  const SHORT *swb_offset = GetScaleFactorBandOffsets(
787
13.1k
      &pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo);
788
13.1k
  int g, win, gwin, sfb, noiseFillingStartOffset, nfStartOffset_sfb;
789
790
  /* Obtain noise level and scale factor offset. */
791
13.1k
  int noise_level = pAacDecoderChannelInfo->pDynData->specificTo.usac
792
13.1k
                        .fd_noise_level_and_offset >>
793
13.1k
                    5;
794
13.1k
  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.1k
  const int noise_offset = (pAacDecoderChannelInfo->pDynData->specificTo.usac
799
13.1k
                                .fd_noise_level_and_offset &
800
13.1k
                            0x1f) -
801
13.1k
                           16;
802
803
13.1k
  int max_sfb =
804
13.1k
      GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
805
806
13.1k
  noiseFillingStartOffset =
807
13.1k
      (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == BLOCK_SHORT)
808
13.1k
          ? 20
809
13.1k
          : 160;
810
13.1k
  if (pAacDecoderChannelInfo->granuleLength == 96) {
811
3.42k
    noiseFillingStartOffset =
812
3.42k
        (3 * noiseFillingStartOffset) /
813
3.42k
        4; /* scale offset with 3/4 for coreCoderFrameLength == 768 */
814
3.42k
  }
815
816
  /* determine sfb from where on noise filling is applied */
817
122k
  for (sfb = 0; swb_offset[sfb] < noiseFillingStartOffset; sfb++)
818
109k
    ;
819
13.1k
  nfStartOffset_sfb = sfb;
820
821
  /* if (noise_level!=0) */
822
13.1k
  {
823
76.5k
    for (g = 0, win = 0; g < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo);
824
63.3k
         g++) {
825
63.3k
      int windowGroupLength =
826
63.3k
          GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo, g);
827
69.6k
      for (sfb = nfStartOffset_sfb; sfb < max_sfb; sfb++) {
828
6.28k
        int bin_start = swb_offset[sfb];
829
6.28k
        int bin_stop = swb_offset[sfb + 1];
830
831
6.28k
        int flagN = band_is_noise[g * 16 + sfb];
832
833
        /* if all bins of one sfb in one window group are zero modify the scale
834
         * factor by noise_offset */
835
6.28k
        if (flagN) {
836
          /* Change scaling factors for empty signal bands */
837
3.80k
          pAacDecoderChannelInfo->pDynData->aScaleFactor[g * 16 + sfb] +=
838
3.80k
              noise_offset;
839
          /* scale factor "sf" implied gain "g" is g = 2^(sf/4) */
840
8.17k
          for (gwin = 0; gwin < windowGroupLength; gwin++) {
841
4.37k
            pAacDecoderChannelInfo->pDynData
842
4.37k
                ->aSfbScale[(win + gwin) * 16 + sfb] += (noise_offset >> 2);
843
4.37k
          }
844
3.80k
        }
845
846
6.28k
        ULONG seed = *nfRandomSeed;
847
        /* + 1 because exponent of MantissaTable[lsb][0] is always 1. */
848
6.28k
        int scale =
849
6.28k
            (pAacDecoderChannelInfo->pDynData->aScaleFactor[g * 16 + sfb] >>
850
6.28k
             2) +
851
6.28k
            1;
852
6.28k
        int lsb =
853
6.28k
            pAacDecoderChannelInfo->pDynData->aScaleFactor[g * 16 + sfb] & 3;
854
6.28k
        FIXP_DBL mantissa = MantissaTable[lsb][0];
855
856
14.1k
        for (gwin = 0; gwin < windowGroupLength; gwin++) {
857
7.90k
          FIXP_DBL *pSpec =
858
7.90k
              SPEC(pAacDecoderChannelInfo->pSpectralCoefficient, win + gwin,
859
7.90k
                   pAacDecoderChannelInfo->granuleLength);
860
861
7.90k
          int scale1 = scale - pAacDecoderChannelInfo->pDynData
862
7.90k
                                   ->aSfbScale[(win + gwin) * 16 + sfb];
863
7.90k
          FIXP_DBL scaled_noiseVal_pos =
864
7.90k
              scaleValue(fMultDiv2(noiseVal_pos, mantissa), scale1);
865
7.90k
          FIXP_DBL scaled_noiseVal_neg = -scaled_noiseVal_pos;
866
867
          /* If the whole band is zero, just fill without checking */
868
7.90k
          if (flagN) {
869
70.8k
            for (int bin = bin_start; bin < bin_stop; bin++) {
870
66.4k
              seed = (ULONG)(
871
66.4k
                  (UINT64)seed * 69069 +
872
66.4k
                  5); /* Inlined: UsacRandomSign - origin in usacdec_lpd.h */
873
66.4k
              pSpec[bin] =
874
66.4k
                  (seed & 0x10000) ? scaled_noiseVal_neg : scaled_noiseVal_pos;
875
66.4k
            } /* for (bin...) */
876
4.37k
          }
877
          /*If band is sparsely filled, check for 0 and fill */
878
3.53k
          else {
879
44.3k
            for (int bin = bin_start; bin < bin_stop; bin++) {
880
40.8k
              if (pSpec[bin] == (FIXP_DBL)0) {
881
29.8k
                seed = (ULONG)(
882
29.8k
                    (UINT64)seed * 69069 +
883
29.8k
                    5); /* Inlined: UsacRandomSign - origin in usacdec_lpd.h */
884
29.8k
                pSpec[bin] = (seed & 0x10000) ? scaled_noiseVal_neg
885
29.8k
                                              : scaled_noiseVal_pos;
886
29.8k
              }
887
40.8k
            } /* for (bin...) */
888
3.53k
          }
889
890
7.90k
        } /* for (gwin...) */
891
6.28k
        *nfRandomSeed = seed;
892
6.28k
      } /* for (sfb...) */
893
63.3k
      win += windowGroupLength;
894
63.3k
    } /* for (g...) */
895
896
13.1k
  } /* ... */
897
13.1k
}
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
273k
    const UINT flags) {
904
273k
  AAC_DECODER_ERROR errorAAC = AAC_DEC_OK;
905
273k
  ARITH_CODING_ERROR error = ARITH_CODER_OK;
906
273k
  int arith_reset_flag, lg, numWin, win, winLen;
907
273k
  const SHORT *RESTRICT BandOffsets;
908
909
  /* number of transmitted spectral coefficients */
910
273k
  BandOffsets = GetScaleFactorBandOffsets(&pAacDecoderChannelInfo->icsInfo,
911
273k
                                          pSamplingRateInfo);
912
273k
  lg = BandOffsets[GetScaleFactorBandsTransmitted(
913
273k
      &pAacDecoderChannelInfo->icsInfo)];
914
915
273k
  numWin = GetWindowsPerFrame(&pAacDecoderChannelInfo->icsInfo);
916
273k
  winLen = (IsLongBlock(&pAacDecoderChannelInfo->icsInfo))
917
273k
               ? (int)frame_length
918
273k
               : (int)frame_length / numWin;
919
920
273k
  if (flags & AC_INDEP) {
921
195k
    arith_reset_flag = 1;
922
195k
  } else {
923
77.9k
    arith_reset_flag = (USHORT)FDKreadBits(hBs, 1);
924
77.9k
  }
925
926
938k
  for (win = 0; win < numWin; win++) {
927
666k
    error =
928
666k
        CArco_DecodeArithData(pAacDecoderStaticChannelInfo->hArCo, hBs,
929
666k
                              SPEC(pAacDecoderChannelInfo->pSpectralCoefficient,
930
666k
                                   win, pAacDecoderChannelInfo->granuleLength),
931
666k
                              lg, winLen, arith_reset_flag && (win == 0));
932
666k
    if (error != ARITH_CODER_OK) {
933
1.13k
      goto bail;
934
1.13k
    }
935
666k
  }
936
937
273k
bail:
938
273k
  if (error == ARITH_CODER_ERROR) {
939
1.13k
    errorAAC = AAC_DEC_PARSE_ERROR;
940
1.13k
  }
941
942
273k
  return errorAAC;
943
273k
}
944
945
void ApplyTools(CAacDecoderChannelInfo *pAacDecoderChannelInfo[],
946
                const SamplingRateInfo *pSamplingRateInfo, const UINT flags,
947
                const UINT elFlags, const int channel,
948
517k
                const int common_window) {
949
517k
  if (!(flags & (AC_USAC | AC_RSVD50 | AC_MPEGD_RES | AC_RSV603DA))) {
950
303k
    CPns_Apply(&pAacDecoderChannelInfo[channel]->data.aac.PnsData,
951
303k
               &pAacDecoderChannelInfo[channel]->icsInfo,
952
303k
               pAacDecoderChannelInfo[channel]->pSpectralCoefficient,
953
303k
               pAacDecoderChannelInfo[channel]->specScale,
954
303k
               pAacDecoderChannelInfo[channel]->pDynData->aScaleFactor,
955
303k
               pSamplingRateInfo,
956
303k
               pAacDecoderChannelInfo[channel]->granuleLength, channel);
957
303k
  }
958
959
517k
  UCHAR nbands =
960
517k
      GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[channel]->icsInfo);
961
962
517k
  CTns_Apply(&pAacDecoderChannelInfo[channel]->pDynData->TnsData,
963
517k
             &pAacDecoderChannelInfo[channel]->icsInfo,
964
517k
             pAacDecoderChannelInfo[channel]->pSpectralCoefficient,
965
517k
             pSamplingRateInfo, pAacDecoderChannelInfo[channel]->granuleLength,
966
517k
             nbands, (elFlags & AC_EL_ENHANCED_NOISE) ? 1 : 0, flags);
967
517k
}
968
969
195k
static int getWindow2Nr(int length, int shape) {
970
195k
  int nr = 0;
971
972
195k
  if (shape == 2) {
973
    /* Low Overlap, 3/4 zeroed */
974
67
    nr = (length * 3) >> 2;
975
67
  }
976
977
195k
  return nr;
978
195k
}
979
980
278k
FIXP_DBL get_gain(const FIXP_DBL *x, const FIXP_DBL *y, int n) {
981
278k
  FIXP_DBL corr = (FIXP_DBL)0;
982
278k
  FIXP_DBL ener = (FIXP_DBL)1;
983
984
278k
  int headroom_x = getScalefactor(x, n);
985
278k
  int headroom_y = getScalefactor(y, n);
986
987
  /*Calculate the normalization necessary due to addition*/
988
  /* Check for power of two /special case */
989
278k
  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
278k
  width_shift = 31 - width_shift;
993
994
18.0M
  for (int i = 0; i < n; i++) {
995
17.7M
    corr +=
996
17.7M
        fMultDiv2((x[i] << headroom_x), (y[i] << headroom_y)) >> width_shift;
997
17.7M
    ener += fPow2Div2((y[i] << headroom_y)) >> width_shift;
998
17.7M
  }
999
1000
278k
  int exp_corr = (17 - headroom_x) + (17 - headroom_y) + width_shift + 1;
1001
278k
  int exp_ener = ((17 - headroom_y) << 1) + width_shift + 1;
1002
1003
278k
  int temp_exp = 0;
1004
278k
  FIXP_DBL output = fDivNormSigned(corr, ener, &temp_exp);
1005
1006
278k
  int output_exp = (exp_corr - exp_ener) + temp_exp;
1007
1008
278k
  INT output_shift = 17 - output_exp;
1009
278k
  output_shift = fMin(output_shift, 31);
1010
1011
278k
  output = scaleValue(output, -output_shift);
1012
1013
278k
  return output;
1014
278k
}
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
364k
    const INT aacOutDataHeadroom, UINT elFlags, INT elCh) {
1021
364k
  int fr, fl, tl, nSpec;
1022
1023
364k
#if defined(FDK_ASSERT_ENABLE)
1024
364k
  LONG nSamples;
1025
364k
#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
364k
  tl = frameLen;
1033
364k
  nSpec = 1;
1034
1035
364k
  switch (pAacDecoderChannelInfo->icsInfo.WindowSequence) {
1036
0
    default:
1037
195k
    case BLOCK_LONG:
1038
195k
      fl = frameLen;
1039
195k
      fr = frameLen -
1040
195k
           getWindow2Nr(frameLen,
1041
195k
                        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
195k
      if (pAacDecoderStaticChannelInfo->IMdct.prev_tl == 0) {
1047
16.6k
        fl = fr;
1048
16.6k
      }
1049
195k
      break;
1050
28.7k
    case BLOCK_STOP:
1051
28.7k
      fl = frameLen >> 3;
1052
28.7k
      fr = frameLen;
1053
28.7k
      break;
1054
33.3k
    case BLOCK_START: /* or StopStartSequence */
1055
33.3k
      fl = frameLen;
1056
33.3k
      fr = frameLen >> 3;
1057
33.3k
      break;
1058
106k
    case BLOCK_SHORT:
1059
106k
      fl = fr = frameLen >> 3;
1060
106k
      tl >>= 3;
1061
106k
      nSpec = 8;
1062
106k
      break;
1063
364k
  }
1064
1065
364k
  {
1066
364k
    int last_frame_lost = pAacDecoderStaticChannelInfo->last_lpc_lost;
1067
1068
364k
    if (pAacDecoderStaticChannelInfo->last_core_mode == LPD) {
1069
21.9k
      INT fac_FB = 1;
1070
21.9k
      if (elFlags & AC_EL_FULLBANDLPD) {
1071
0
        fac_FB = 2;
1072
0
      }
1073
1074
21.9k
      FIXP_DBL *synth;
1075
1076
      /* Keep some free space at the beginning of the buffer. To be used for
1077
       * past data */
1078
21.9k
      if (!(elFlags & AC_EL_LPDSTEREOIDX)) {
1079
21.9k
        synth = pWorkBuffer1 + ((PIT_MAX_MAX - (1 * L_SUBFR)) * fac_FB);
1080
21.9k
      } else {
1081
0
        synth = pWorkBuffer1 + PIT_MAX_MAX * fac_FB;
1082
0
      }
1083
1084
21.9k
      int fac_length =
1085
21.9k
          (pAacDecoderChannelInfo->icsInfo.WindowSequence == BLOCK_SHORT)
1086
21.9k
              ? (frameLen >> 4)
1087
21.9k
              : (frameLen >> 3);
1088
1089
21.9k
      INT pitch[NB_SUBFR_SUPERFR + SYN_SFD];
1090
21.9k
      FIXP_DBL pit_gain[NB_SUBFR_SUPERFR + SYN_SFD];
1091
1092
21.9k
      int nbDiv = (elFlags & AC_EL_FULLBANDLPD) ? 2 : 4;
1093
21.9k
      int lFrame = (elFlags & AC_EL_FULLBANDLPD) ? frameLen / 2 : frameLen;
1094
21.9k
      int nbSubfr =
1095
21.9k
          lFrame / (nbDiv * L_SUBFR); /* number of subframes per division */
1096
21.9k
      int LpdSfd = (nbDiv * nbSubfr) >> 1;
1097
21.9k
      int SynSfd = LpdSfd - BPF_SFD;
1098
1099
21.9k
      FDKmemclear(
1100
21.9k
          pitch,
1101
21.9k
          sizeof(
1102
21.9k
              pitch));  // added to prevent ferret errors in bass_pf_1sf_delay
1103
21.9k
      FDKmemclear(pit_gain, sizeof(pit_gain));
1104
1105
      /* FAC case */
1106
21.9k
      if (pAacDecoderStaticChannelInfo->last_lpd_mode == 0 ||
1107
16.9k
          pAacDecoderStaticChannelInfo->last_lpd_mode == 4) {
1108
16.9k
        FIXP_DBL fac_buf[LFAC];
1109
16.9k
        FIXP_LPC *A = pAacDecoderChannelInfo->data.usac.lp_coeff[0];
1110
1111
16.9k
        if (!frameOk || last_frame_lost ||
1112
16.9k
            (pAacDecoderChannelInfo->data.usac.fac_data[0] == NULL)) {
1113
3
          FDKmemclear(fac_buf,
1114
3
                      pAacDecoderChannelInfo->granuleLength * sizeof(FIXP_DBL));
1115
3
          pAacDecoderChannelInfo->data.usac.fac_data[0] = fac_buf;
1116
3
          pAacDecoderChannelInfo->data.usac.fac_data_e[0] = 0;
1117
3
        }
1118
1119
16.9k
        INT A_exp; /* linear prediction coefficients exponent */
1120
16.9k
        {
1121
288k
          for (int i = 0; i < M_LP_FILTER_ORDER; i++) {
1122
271k
            A[i] = FX_DBL2FX_LPC(fixp_cos(
1123
271k
                fMult(pAacDecoderStaticChannelInfo->lpc4_lsf[i],
1124
271k
                      FL2FXCONST_SGL((1 << LSPARG_SCALE) * M_PI / 6400.0)),
1125
271k
                LSF_SCALE - LSPARG_SCALE));
1126
271k
          }
1127
1128
16.9k
          E_LPC_f_lsp_a_conversion(A, A, &A_exp);
1129
16.9k
        }
1130
1131
16.9k
#if defined(FDK_ASSERT_ENABLE)
1132
16.9k
        nSamples =
1133
16.9k
#endif
1134
16.9k
            CLpd_FAC_Acelp2Mdct(
1135
16.9k
                &pAacDecoderStaticChannelInfo->IMdct, synth,
1136
16.9k
                SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient),
1137
16.9k
                pAacDecoderChannelInfo->specScale, nSpec,
1138
16.9k
                pAacDecoderChannelInfo->data.usac.fac_data[0],
1139
16.9k
                pAacDecoderChannelInfo->data.usac.fac_data_e[0], fac_length,
1140
16.9k
                frameLen, tl,
1141
16.9k
                FDKgetWindowSlope(
1142
16.9k
                    fr, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
1143
16.9k
                fr, A, A_exp, &pAacDecoderStaticChannelInfo->acelp,
1144
16.9k
                (FIXP_DBL)0, /* FAC gain has already been applied. */
1145
16.9k
                (last_frame_lost || !frameOk), 1,
1146
16.9k
                pAacDecoderStaticChannelInfo->last_lpd_mode, 0,
1147
16.9k
                pAacDecoderChannelInfo->currAliasingSymmetry);
1148
1149
16.9k
      } else {
1150
5.02k
#if defined(FDK_ASSERT_ENABLE)
1151
5.02k
        nSamples =
1152
5.02k
#endif
1153
5.02k
            imlt_block(
1154
5.02k
                &pAacDecoderStaticChannelInfo->IMdct, synth,
1155
5.02k
                SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient),
1156
5.02k
                pAacDecoderChannelInfo->specScale, nSpec, frameLen, tl,
1157
5.02k
                FDKgetWindowSlope(
1158
5.02k
                    fl, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
1159
5.02k
                fl,
1160
5.02k
                FDKgetWindowSlope(
1161
5.02k
                    fr, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
1162
5.02k
                fr, (FIXP_DBL)0,
1163
5.02k
                pAacDecoderChannelInfo->currAliasingSymmetry
1164
5.02k
                    ? MLT_FLAG_CURR_ALIAS_SYMMETRY
1165
5.02k
                    : 0);
1166
5.02k
      }
1167
21.9k
      FDK_ASSERT(nSamples == frameLen);
1168
1169
      /* The "if" clause is entered both for fullbandLpd mono and
1170
       * non-fullbandLpd*. The "else"-> just for fullbandLpd stereo*/
1171
21.9k
      if (!(elFlags & AC_EL_LPDSTEREOIDX)) {
1172
21.9k
        FDKmemcpy(pitch, pAacDecoderStaticChannelInfo->old_T_pf,
1173
21.9k
                  SynSfd * sizeof(INT));
1174
21.9k
        FDKmemcpy(pit_gain, pAacDecoderStaticChannelInfo->old_gain_pf,
1175
21.9k
                  SynSfd * sizeof(FIXP_DBL));
1176
1177
109k
        for (int i = SynSfd; i < LpdSfd + 3; i++) {
1178
87.9k
          pitch[i] = L_SUBFR;
1179
87.9k
          pit_gain[i] = (FIXP_DBL)0;
1180
87.9k
        }
1181
1182
21.9k
        if (pAacDecoderStaticChannelInfo->last_lpd_mode == 0) {
1183
16.9k
          pitch[SynSfd] = pitch[SynSfd - 1];
1184
16.9k
          pit_gain[SynSfd] = pit_gain[SynSfd - 1];
1185
16.9k
          if (IsLongBlock(&pAacDecoderChannelInfo->icsInfo)) {
1186
3.93k
            pitch[SynSfd + 1] = pitch[SynSfd];
1187
3.93k
            pit_gain[SynSfd + 1] = pit_gain[SynSfd];
1188
3.93k
          }
1189
16.9k
        }
1190
1191
        /* Copy old data to the beginning of the buffer */
1192
21.9k
        {
1193
21.9k
          FDKmemcpy(
1194
21.9k
              pWorkBuffer1, pAacDecoderStaticChannelInfo->old_synth,
1195
21.9k
              ((PIT_MAX_MAX - (1 * L_SUBFR)) * fac_FB) * sizeof(FIXP_DBL));
1196
21.9k
        }
1197
1198
21.9k
        FIXP_DBL *p2_synth = pWorkBuffer1 + (PIT_MAX_MAX * fac_FB);
1199
1200
        /* recalculate pitch gain to allow postfilering on FAC area */
1201
206k
        for (int i = 0; i < SynSfd + 2; i++) {
1202
184k
          int T = pitch[i];
1203
184k
          FIXP_DBL gain = pit_gain[i];
1204
1205
184k
          if (gain > (FIXP_DBL)0) {
1206
98.6k
            gain = get_gain(&p2_synth[i * L_SUBFR * fac_FB],
1207
98.6k
                            &p2_synth[(i * L_SUBFR * fac_FB) - fac_FB * T],
1208
98.6k
                            L_SUBFR * fac_FB);
1209
98.6k
            pit_gain[i] = gain;
1210
98.6k
          }
1211
184k
        }
1212
1213
21.9k
        bass_pf_1sf_delay(p2_synth, pitch, pit_gain, frameLen,
1214
21.9k
                          (LpdSfd + 2) * L_SUBFR + BPF_SFD * L_SUBFR,
1215
21.9k
                          frameLen - (LpdSfd + 4) * L_SUBFR, outSamples,
1216
21.9k
                          aacOutDataHeadroom,
1217
21.9k
                          pAacDecoderStaticChannelInfo->mem_bpf);
1218
21.9k
      }
1219
1220
21.9k
    } else /* last_core_mode was not LPD */
1221
342k
    {
1222
342k
      FIXP_DBL *tmp =
1223
342k
          pAacDecoderChannelInfo->pComStaticData->pWorkBufferCore1->mdctOutTemp;
1224
342k
#if defined(FDK_ASSERT_ENABLE)
1225
342k
      nSamples =
1226
342k
#endif
1227
342k
          imlt_block(&pAacDecoderStaticChannelInfo->IMdct, tmp,
1228
342k
                     SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient),
1229
342k
                     pAacDecoderChannelInfo->specScale, nSpec, frameLen, tl,
1230
342k
                     FDKgetWindowSlope(
1231
342k
                         fl, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
1232
342k
                     fl,
1233
342k
                     FDKgetWindowSlope(
1234
342k
                         fr, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)),
1235
342k
                     fr, (FIXP_DBL)0,
1236
342k
                     pAacDecoderChannelInfo->currAliasingSymmetry
1237
342k
                         ? MLT_FLAG_CURR_ALIAS_SYMMETRY
1238
342k
                         : 0);
1239
1240
342k
      scaleValuesSaturate(outSamples, tmp, frameLen,
1241
342k
                          MDCT_OUT_HEADROOM - aacOutDataHeadroom);
1242
342k
    }
1243
364k
  }
1244
1245
364k
  FDK_ASSERT(nSamples == frameLen);
1246
1247
364k
  pAacDecoderStaticChannelInfo->last_core_mode =
1248
364k
      (pAacDecoderChannelInfo->icsInfo.WindowSequence == BLOCK_SHORT) ? FD_SHORT
1249
364k
                                                                      : FD_LONG;
1250
364k
  pAacDecoderStaticChannelInfo->last_lpd_mode = 255;
1251
364k
}
1252
1253
#include "ldfiltbank.h"
1254
void CBlock_FrequencyToTimeLowDelay(
1255
    CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
1256
    CAacDecoderChannelInfo *pAacDecoderChannelInfo, PCM_DEC outSamples[],
1257
221k
    const short frameLen) {
1258
221k
  InvMdctTransformLowDelay_fdk(
1259
221k
      SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient),
1260
221k
      pAacDecoderChannelInfo->specScale[0], outSamples,
1261
221k
      pAacDecoderStaticChannelInfo->pOverlapBuffer, frameLen);
1262
221k
}