Coverage Report

Created: 2023-06-17 06:26

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