Coverage Report

Created: 2026-02-14 06:59

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