Coverage Report

Created: 2026-10-28 06:57

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