Coverage Report

Created: 2026-10-17 06:51

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