Coverage Report

Created: 2026-10-28 06:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/aac/libAACdec/src/channel.cpp
Line
Count
Source
1
/* -----------------------------------------------------------------------------
2
Software License for The Fraunhofer FDK AAC Codec Library for Android
3
4
© Copyright  1995 - 2020 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:
100
101
*******************************************************************************/
102
103
#include "channel.h"
104
#include "aacdecoder.h"
105
#include "block.h"
106
#include "aacdec_tns.h"
107
#include "FDK_bitstream.h"
108
109
#include "conceal.h"
110
111
#include "rvlc.h"
112
113
#include "aacdec_hcr.h"
114
115
#include "usacdec_lpd.h"
116
#include "usacdec_fac.h"
117
118
static void MapMidSideMaskToPnsCorrelation(
119
16.8k
    CAacDecoderChannelInfo *pAacDecoderChannelInfo[2]) {
120
16.8k
  int group;
121
122
80.6k
  for (group = 0; group < pAacDecoderChannelInfo[L]->icsInfo.WindowGroups;
123
63.8k
       group++) {
124
63.8k
    UCHAR groupMask = 1 << group;
125
126
278k
    for (UCHAR band = 0; band < pAacDecoderChannelInfo[L]->icsInfo.MaxSfBands;
127
214k
         band++) {
128
214k
      if (pAacDecoderChannelInfo[L]->pComData->jointStereoData.MsUsed[band] &
129
214k
          groupMask) { /* channels are correlated */
130
23.7k
        CPns_SetCorrelation(&pAacDecoderChannelInfo[L]->data.aac.PnsData, group,
131
23.7k
                            band, 0);
132
133
23.7k
        if (CPns_IsPnsUsed(&pAacDecoderChannelInfo[L]->data.aac.PnsData, group,
134
23.7k
                           band) &&
135
4.86k
            CPns_IsPnsUsed(&pAacDecoderChannelInfo[R]->data.aac.PnsData, group,
136
4.86k
                           band))
137
2.91k
          pAacDecoderChannelInfo[L]->pComData->jointStereoData.MsUsed[band] ^=
138
2.91k
              groupMask; /* clear the groupMask-bit */
139
23.7k
      }
140
214k
    }
141
63.8k
  }
142
16.8k
}
143
144
static void Clean_Complex_Prediction_coefficients(
145
    CJointStereoPersistentData *pJointStereoPersistentData, int windowGroups,
146
0
    const int low_limit, const int high_limit) {
147
0
  for (int group = 0; group < windowGroups; group++) {
148
0
    for (int sfb = low_limit; sfb < high_limit; sfb++) {
149
0
      pJointStereoPersistentData->alpha_q_re_prev[group][sfb] = 0;
150
0
      pJointStereoPersistentData->alpha_q_im_prev[group][sfb] = 0;
151
0
    }
152
0
  }
153
0
}
154
155
/*!
156
  \brief Decode channel pair element
157
158
  The function decodes a channel pair element.
159
160
  \return  none
161
*/
162
void CChannelElement_Decode(
163
    CAacDecoderChannelInfo
164
        *pAacDecoderChannelInfo[2], /*!< pointer to aac decoder channel info */
165
    CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[2],
166
    SamplingRateInfo *pSamplingRateInfo, UINT flags, UINT elFlags,
167
555k
    int el_channels) {
168
555k
  int ch = 0;
169
170
555k
  int maxSfBandsL = 0, maxSfBandsR = 0;
171
555k
  int maybe_jstereo = (el_channels > 1);
172
173
555k
  if (flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA) && el_channels == 2) {
174
93.5k
    if (pAacDecoderChannelInfo[L]->data.usac.core_mode ||
175
81.2k
        pAacDecoderChannelInfo[R]->data.usac.core_mode) {
176
16.8k
      maybe_jstereo = 0;
177
16.8k
    }
178
93.5k
  }
179
180
555k
  if (maybe_jstereo) {
181
199k
    maxSfBandsL =
182
199k
        GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[L]->icsInfo);
183
199k
    maxSfBandsR =
184
199k
        GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[R]->icsInfo);
185
186
    /* apply ms */
187
199k
    if (pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow) {
188
178k
      if (!(flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA))) {
189
117k
        if (pAacDecoderChannelInfo[L]->data.aac.PnsData.PnsActive ||
190
102k
            pAacDecoderChannelInfo[R]->data.aac.PnsData.PnsActive) {
191
16.8k
          MapMidSideMaskToPnsCorrelation(pAacDecoderChannelInfo);
192
16.8k
        }
193
117k
      }
194
      /* if tns_on_lr == 1 run MS */ /* &&
195
                                        (pAacDecoderChannelInfo[L]->pDynData->specificTo.usac.tns_active
196
                                        == 1) */
197
178k
      if (((flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) &&
198
60.7k
           (pAacDecoderChannelInfo[L]->pDynData->specificTo.usac.tns_on_lr ==
199
60.7k
            1)) ||
200
159k
          ((flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) == 0)) {
201
159k
        int max_sfb_ste = (INT)(pAacDecoderChannelInfo[L]->icsInfo.max_sfb_ste);
202
203
159k
        CJointStereo_ApplyMS(
204
159k
            pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo,
205
159k
            pAacDecoderChannelInfo[L]->pSpectralCoefficient,
206
159k
            pAacDecoderChannelInfo[R]->pSpectralCoefficient,
207
159k
            pAacDecoderChannelInfo[L]->pDynData->aSfbScale,
208
159k
            pAacDecoderChannelInfo[R]->pDynData->aSfbScale,
209
159k
            pAacDecoderChannelInfo[L]->specScale,
210
159k
            pAacDecoderChannelInfo[R]->specScale,
211
159k
            GetScaleFactorBandOffsets(&pAacDecoderChannelInfo[L]->icsInfo,
212
159k
                                      pSamplingRateInfo),
213
159k
            GetWindowGroupLengthTable(&pAacDecoderChannelInfo[L]->icsInfo),
214
159k
            GetWindowGroups(&pAacDecoderChannelInfo[L]->icsInfo), max_sfb_ste,
215
159k
            maxSfBandsL, maxSfBandsR,
216
159k
            pAacDecoderChannelInfo[L]
217
159k
                ->pComData->jointStereoData.store_dmx_re_prev,
218
159k
            &(pAacDecoderChannelInfo[L]
219
159k
                  ->pComData->jointStereoData.store_dmx_re_prev_e),
220
159k
            1);
221
222
159k
      } /* if ( ((elFlags & AC_EL_USAC_CP_POSSIBLE).... */
223
178k
    }   /* if (pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow)*/
224
225
    /* apply intensity stereo */ /* modifies pAacDecoderChannelInfo[]->aSpecSfb
226
                                  */
227
199k
    if (!(flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA))) {
228
123k
      if ((pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow ==
229
123k
           1) &&
230
117k
          (el_channels == 2)) {
231
117k
        CJointStereo_ApplyIS(
232
117k
            pAacDecoderChannelInfo,
233
117k
            GetScaleFactorBandOffsets(&pAacDecoderChannelInfo[L]->icsInfo,
234
117k
                                      pSamplingRateInfo),
235
117k
            GetWindowGroupLengthTable(&pAacDecoderChannelInfo[L]->icsInfo),
236
117k
            GetWindowGroups(&pAacDecoderChannelInfo[L]->icsInfo),
237
117k
            GetScaleFactorBandsTransmitted(
238
117k
                &pAacDecoderChannelInfo[L]->icsInfo));
239
117k
      }
240
123k
    }
241
199k
  } /* maybe_stereo */
242
243
1.32M
  for (ch = 0; ch < el_channels; ch++) {
244
772k
    if (pAacDecoderChannelInfo[ch]->renderMode == AACDEC_RENDER_LPD) {
245
      /* Decode LPD data */
246
59.6k
      CLpdChannelStream_Decode(pAacDecoderChannelInfo[ch],
247
59.6k
                               pAacDecoderStaticChannelInfo[ch], flags);
248
712k
    } else {
249
712k
      UCHAR noSfbs =
250
712k
          GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[ch]->icsInfo);
251
      /* For USAC common window: max_sfb of both channels may differ
252
       * (common_max_sfb == 0). */
253
712k
      if ((maybe_jstereo == 1) &&
254
399k
          (pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow ==
255
399k
           1)) {
256
356k
        noSfbs = fMax(maxSfBandsL, maxSfBandsR);
257
356k
      }
258
712k
      int CP_active = 0;
259
712k
      if (elFlags & AC_EL_USAC_CP_POSSIBLE) {
260
124k
        CP_active = pAacDecoderChannelInfo[ch]
261
124k
                        ->pComData->jointStereoData.cplx_pred_flag;
262
124k
      }
263
264
      /* Omit writing of pAacDecoderChannelInfo[ch]->specScale for complex
265
         stereo prediction since scaling has already been carried out. */
266
712k
      int max_sfb_ste = (INT)(pAacDecoderChannelInfo[L]->icsInfo.max_sfb_ste);
267
268
712k
      if (!(CP_active && (max_sfb_ste == noSfbs)) ||
269
98.9k
          !(CP_active &&
270
98.9k
            !(pAacDecoderChannelInfo[ch]->pDynData->TnsData.Active)) ||
271
22.5k
          ((flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) &&
272
22.5k
           (pAacDecoderChannelInfo[L]->pDynData->specificTo.usac.tns_on_lr ==
273
697k
            0))) {
274
697k
        CBlock_ScaleSpectralData(pAacDecoderChannelInfo[ch], noSfbs,
275
697k
                                 pSamplingRateInfo);
276
277
        /*Active for the case of TNS applied before MS/CP*/
278
697k
        if ((flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) &&
279
319k
            (pAacDecoderChannelInfo[L]->pDynData->specificTo.usac.tns_on_lr ==
280
319k
             0)) {
281
218k
          if (IsLongBlock(&pAacDecoderChannelInfo[ch]->icsInfo)) {
282
1.77M
            for (int i = 0; i < noSfbs; i++) {
283
1.57M
              pAacDecoderChannelInfo[ch]->pDynData->aSfbScale[i] =
284
1.57M
                  pAacDecoderChannelInfo[ch]->specScale[0];
285
1.57M
            }
286
205k
          } else {
287
117k
            for (int i = 0; i < 8; i++) {
288
767k
              for (int j = 0; j < noSfbs; j++) {
289
663k
                pAacDecoderChannelInfo[ch]->pDynData->aSfbScale[i * 16 + j] =
290
663k
                    pAacDecoderChannelInfo[ch]->specScale[i];
291
663k
              }
292
104k
            }
293
13.0k
          }
294
218k
        }
295
697k
      }
296
712k
    }
297
772k
  } /* End "for (ch = 0; ch < el_channels; ch++)" */
298
299
555k
  if (maybe_jstereo) {
300
    /* apply ms */
301
199k
    if (pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow) {
302
178k
    } /* CommonWindow */
303
21.3k
    else {
304
21.3k
      if (elFlags & AC_EL_USAC_CP_POSSIBLE) {
305
2.85k
        FDKmemclear(
306
2.85k
            pAacDecoderStaticChannelInfo[L]
307
2.85k
                ->pCpeStaticData->jointStereoPersistentData.alpha_q_re_prev,
308
2.85k
            JointStereoMaximumGroups * JointStereoMaximumBands * sizeof(SHORT));
309
2.85k
        FDKmemclear(
310
2.85k
            pAacDecoderStaticChannelInfo[L]
311
2.85k
                ->pCpeStaticData->jointStereoPersistentData.alpha_q_im_prev,
312
2.85k
            JointStereoMaximumGroups * JointStereoMaximumBands * sizeof(SHORT));
313
2.85k
      }
314
21.3k
    }
315
316
199k
  } /* if (maybe_jstereo) */
317
318
1.32M
  for (ch = 0; ch < el_channels; ch++) {
319
772k
    if (pAacDecoderChannelInfo[ch]->renderMode == AACDEC_RENDER_LPD) {
320
712k
    } else {
321
712k
      if (!(flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA))) {
322
        /* Use same seed for coupled channels (CPE) */
323
378k
        int pnsCh = (ch > 0) ? L : ch;
324
378k
        CPns_UpdateNoiseState(
325
378k
            &pAacDecoderChannelInfo[ch]->data.aac.PnsData,
326
378k
            pAacDecoderChannelInfo[pnsCh]->data.aac.PnsData.currentSeed,
327
378k
            pAacDecoderChannelInfo[ch]->pComData->pnsRandomSeed);
328
378k
      }
329
330
712k
      if ((!(flags & (AC_USAC))) ||
331
334k
          ((flags & (AC_USAC)) &&
332
334k
           (pAacDecoderChannelInfo[L]->pDynData->specificTo.usac.tns_active ==
333
334k
            1)) ||
334
645k
          (maybe_jstereo == 0)) {
335
645k
        ApplyTools(
336
645k
            pAacDecoderChannelInfo, pSamplingRateInfo, flags, elFlags, ch,
337
645k
            pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow);
338
645k
      }
339
712k
    } /* End "} else" */
340
772k
  }   /* End "for (ch = 0; ch < el_channels; ch++)" */
341
342
555k
  if (maybe_jstereo) {
343
    /* apply ms */
344
199k
    if (pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow) {
345
      /* if tns_on_lr == 0 run MS */
346
178k
      if ((flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) &&
347
60.7k
          (pAacDecoderChannelInfo[L]->pDynData->specificTo.usac.tns_on_lr ==
348
60.7k
           0)) {
349
18.7k
        int max_sfb_ste = (INT)(pAacDecoderChannelInfo[L]->icsInfo.max_sfb_ste);
350
351
18.7k
        CJointStereo_ApplyMS(
352
18.7k
            pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo,
353
18.7k
            pAacDecoderChannelInfo[L]->pSpectralCoefficient,
354
18.7k
            pAacDecoderChannelInfo[R]->pSpectralCoefficient,
355
18.7k
            pAacDecoderChannelInfo[L]->pDynData->aSfbScale,
356
18.7k
            pAacDecoderChannelInfo[R]->pDynData->aSfbScale,
357
18.7k
            pAacDecoderChannelInfo[L]->specScale,
358
18.7k
            pAacDecoderChannelInfo[R]->specScale,
359
18.7k
            GetScaleFactorBandOffsets(&pAacDecoderChannelInfo[L]->icsInfo,
360
18.7k
                                      pSamplingRateInfo),
361
18.7k
            GetWindowGroupLengthTable(&pAacDecoderChannelInfo[L]->icsInfo),
362
18.7k
            GetWindowGroups(&pAacDecoderChannelInfo[L]->icsInfo), max_sfb_ste,
363
18.7k
            maxSfBandsL, maxSfBandsR,
364
18.7k
            pAacDecoderChannelInfo[L]
365
18.7k
                ->pComData->jointStereoData.store_dmx_re_prev,
366
18.7k
            &(pAacDecoderChannelInfo[L]
367
18.7k
                  ->pComData->jointStereoData.store_dmx_re_prev_e),
368
18.7k
            1);
369
18.7k
      }
370
371
178k
    } /* if (pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow) */
372
373
199k
  } /* if (maybe_jstereo) */
374
375
1.32M
  for (ch = 0; ch < el_channels; ch++) {
376
772k
    if (elFlags & AC_EL_USAC_CP_POSSIBLE) {
377
147k
      pAacDecoderStaticChannelInfo[L]
378
147k
          ->pCpeStaticData->jointStereoPersistentData.clearSpectralCoeffs = 0;
379
147k
    }
380
772k
  }
381
382
555k
  CRvlc_ElementCheck(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo,
383
555k
                     flags, el_channels);
384
555k
}
385
386
void CChannel_CodebookTableInit(
387
336k
    CAacDecoderChannelInfo *pAacDecoderChannelInfo) {
388
336k
  int b, w, maxBands, maxWindows;
389
336k
  int maxSfb = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
390
336k
  UCHAR *pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook;
391
392
336k
  if (IsLongBlock(&pAacDecoderChannelInfo->icsInfo)) {
393
256k
    maxBands = 64;
394
256k
    maxWindows = 1;
395
256k
  } else {
396
80.4k
    maxBands = 16;
397
80.4k
    maxWindows = 8;
398
80.4k
  }
399
400
1.23M
  for (w = 0; w < maxWindows; w++) {
401
3.25M
    for (b = 0; b < maxSfb; b++) {
402
2.35M
      pCodeBook[b] = ESCBOOK;
403
2.35M
    }
404
25.2M
    for (; b < maxBands; b++) {
405
24.3M
      pCodeBook[b] = ZERO_HCB;
406
24.3M
    }
407
900k
    pCodeBook += maxBands;
408
900k
  }
409
336k
}
410
411
/*
412
 * Arbitrary order bitstream parser
413
 */
414
AAC_DECODER_ERROR CChannelElement_Read(
415
    HANDLE_FDK_BITSTREAM hBs, CAacDecoderChannelInfo *pAacDecoderChannelInfo[],
416
    CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[],
417
    const AUDIO_OBJECT_TYPE aot, SamplingRateInfo *pSamplingRateInfo,
418
    const UINT flags, const UINT elFlags, const UINT frame_length,
419
    const UCHAR numberOfChannels, const SCHAR epConfig,
420
569k
    HANDLE_TRANSPORTDEC pTpDec) {
421
569k
  AAC_DECODER_ERROR error = AAC_DEC_OK;
422
569k
  const element_list_t *list;
423
569k
  int i, ch, decision_bit;
424
569k
  int crcReg1 = -1, crcReg2 = -1;
425
569k
  int cplxPred;
426
569k
  int ind_sw_cce_flag = 0, num_gain_element_lists = 0;
427
428
569k
  FDK_ASSERT((numberOfChannels == 1) || (numberOfChannels == 2));
429
430
  /* Get channel element sequence table */
431
569k
  list = getBitstreamElementList(aot, epConfig, numberOfChannels, 0, elFlags);
432
569k
  if (list == NULL) {
433
0
    error = AAC_DEC_UNSUPPORTED_FORMAT;
434
0
    goto bail;
435
0
  }
436
437
569k
  CTns_Reset(&pAacDecoderChannelInfo[0]->pDynData->TnsData);
438
  /* Set common window to 0 by default. If signalized in the bit stream it will
439
   * be overwritten later explicitely */
440
569k
  pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow = 0;
441
569k
  if (flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) {
442
304k
    pAacDecoderChannelInfo[0]->pDynData->specificTo.usac.tns_active = 0;
443
304k
    pAacDecoderChannelInfo[0]->pDynData->specificTo.usac.tns_on_lr = 0;
444
304k
  }
445
569k
  if (numberOfChannels == 2) {
446
221k
    CTns_Reset(&pAacDecoderChannelInfo[1]->pDynData->TnsData);
447
221k
    pAacDecoderChannelInfo[1]->pDynData->RawDataInfo.CommonWindow = 0;
448
221k
  }
449
450
569k
  cplxPred = 0;
451
569k
  if (pAacDecoderStaticChannelInfo != NULL) {
452
567k
    if (elFlags & AC_EL_USAC_CP_POSSIBLE) {
453
74.4k
      pAacDecoderChannelInfo[0]->pComData->jointStereoData.cplx_pred_flag = 0;
454
74.4k
      cplxPred = 1;
455
74.4k
    }
456
567k
  }
457
458
569k
  if (0 || (flags & (AC_ELD | AC_SCALABLE))) {
459
228k
    pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow = 1;
460
228k
    if (numberOfChannels == 2) {
461
118k
      pAacDecoderChannelInfo[1]->pDynData->RawDataInfo.CommonWindow =
462
118k
          pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow;
463
118k
    }
464
228k
  }
465
466
  /* Iterate through sequence table */
467
569k
  i = 0;
468
569k
  ch = 0;
469
569k
  decision_bit = 0;
470
8.69M
  do {
471
8.69M
    switch (list->id[i]) {
472
36.9k
      case element_instance_tag:
473
36.9k
        pAacDecoderChannelInfo[0]->ElementInstanceTag = FDKreadBits(hBs, 4);
474
36.9k
        if (numberOfChannels == 2) {
475
7.65k
          pAacDecoderChannelInfo[1]->ElementInstanceTag =
476
7.65k
              pAacDecoderChannelInfo[0]->ElementInstanceTag;
477
7.65k
        }
478
36.9k
        break;
479
85.1k
      case common_window:
480
85.1k
        decision_bit =
481
85.1k
            pAacDecoderChannelInfo[ch]->pDynData->RawDataInfo.CommonWindow =
482
85.1k
                FDKreadBits(hBs, 1);
483
85.1k
        if (numberOfChannels == 2) {
484
85.1k
          pAacDecoderChannelInfo[1]->pDynData->RawDataInfo.CommonWindow =
485
85.1k
              pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow;
486
85.1k
        }
487
85.1k
        break;
488
546k
      case ics_info:
489
        /* store last window sequence (utilized in complex stereo prediction)
490
         * before reading new channel-info */
491
546k
        if (cplxPred) {
492
70.3k
          if (pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow) {
493
54.4k
            pAacDecoderStaticChannelInfo[0]
494
54.4k
                ->pCpeStaticData->jointStereoPersistentData.winSeqPrev =
495
54.4k
                pAacDecoderChannelInfo[0]->icsInfo.WindowSequence;
496
54.4k
            pAacDecoderStaticChannelInfo[0]
497
54.4k
                ->pCpeStaticData->jointStereoPersistentData.winShapePrev =
498
54.4k
                pAacDecoderChannelInfo[0]->icsInfo.WindowShape;
499
54.4k
          }
500
70.3k
        }
501
        /* Read individual channel info */
502
546k
        error = IcsRead(hBs, &pAacDecoderChannelInfo[ch]->icsInfo,
503
546k
                        pSamplingRateInfo, flags);
504
505
546k
        if (elFlags & AC_EL_LFE &&
506
0
            GetWindowSequence(&pAacDecoderChannelInfo[ch]->icsInfo) !=
507
0
                BLOCK_LONG) {
508
0
          error = AAC_DEC_PARSE_ERROR;
509
0
          break;
510
0
        }
511
512
546k
        if (numberOfChannels == 2 &&
513
235k
            pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow) {
514
181k
          pAacDecoderChannelInfo[1]->icsInfo =
515
181k
              pAacDecoderChannelInfo[0]->icsInfo;
516
181k
        }
517
546k
        break;
518
519
61.0k
      case common_max_sfb:
520
61.0k
        if (FDKreadBit(hBs) == 0) {
521
24.9k
          error = IcsReadMaxSfb(hBs, &pAacDecoderChannelInfo[1]->icsInfo,
522
24.9k
                                pSamplingRateInfo);
523
24.9k
        }
524
61.0k
        break;
525
526
78.8k
      case ltp_data_present:
527
78.8k
        if (FDKreadBits(hBs, 1) != 0) {
528
53
          error = AAC_DEC_UNSUPPORTED_PREDICTION;
529
53
        }
530
78.8k
        break;
531
532
181k
      case ms:
533
534
181k
        INT max_sfb_ste;
535
181k
        INT max_sfb_ste_clear;
536
537
181k
        max_sfb_ste = GetScaleMaxFactorBandsTransmitted(
538
181k
            &pAacDecoderChannelInfo[0]->icsInfo,
539
181k
            &pAacDecoderChannelInfo[1]->icsInfo);
540
541
181k
        max_sfb_ste_clear = 64;
542
543
181k
        pAacDecoderChannelInfo[0]->icsInfo.max_sfb_ste = (UCHAR)max_sfb_ste;
544
181k
        pAacDecoderChannelInfo[1]->icsInfo.max_sfb_ste = (UCHAR)max_sfb_ste;
545
546
181k
        if (flags & (AC_USAC | AC_RSV603DA) &&
547
61.0k
            pAacDecoderChannelInfo[ch]->pDynData->RawDataInfo.CommonWindow ==
548
61.0k
                0) {
549
0
          Clean_Complex_Prediction_coefficients(
550
0
              &pAacDecoderStaticChannelInfo[0]
551
0
                   ->pCpeStaticData->jointStereoPersistentData,
552
0
              GetWindowGroups(&pAacDecoderChannelInfo[0]->icsInfo), 0, 64);
553
0
        }
554
555
181k
        if (CJointStereo_Read(
556
181k
                hBs, &pAacDecoderChannelInfo[0]->pComData->jointStereoData,
557
181k
                GetWindowGroups(&pAacDecoderChannelInfo[0]->icsInfo),
558
181k
                max_sfb_ste, max_sfb_ste_clear,
559
                /* jointStereoPersistentData and cplxPredictionData are only
560
                   available/allocated if cplxPred is active. */
561
181k
                ((cplxPred == 0) || (pAacDecoderStaticChannelInfo == NULL))
562
181k
                    ? NULL
563
181k
                    : &pAacDecoderStaticChannelInfo[0]
564
54.4k
                           ->pCpeStaticData->jointStereoPersistentData,
565
181k
                ((cplxPred == 0) || (pAacDecoderChannelInfo[0] == NULL))
566
181k
                    ? NULL
567
181k
                    : pAacDecoderChannelInfo[0]
568
54.4k
                          ->pComStaticData->cplxPredictionData,
569
181k
                cplxPred,
570
181k
                GetScaleFactorBandsTotal(&pAacDecoderChannelInfo[0]->icsInfo),
571
181k
                GetWindowSequence(&pAacDecoderChannelInfo[0]->icsInfo),
572
181k
                flags)) {
573
3
          error = AAC_DEC_PARSE_ERROR;
574
3
        }
575
576
181k
        break;
577
578
728k
      case global_gain:
579
728k
        pAacDecoderChannelInfo[ch]->pDynData->RawDataInfo.GlobalGain =
580
728k
            (UCHAR)FDKreadBits(hBs, 8);
581
728k
        break;
582
583
390k
      case section_data:
584
390k
        error = CBlock_ReadSectionData(hBs, pAacDecoderChannelInfo[ch],
585
390k
                                       pSamplingRateInfo, flags);
586
390k
        break;
587
588
336k
      case scale_factor_data_usac:
589
336k
        pAacDecoderChannelInfo[ch]->currAliasingSymmetry = 0;
590
        /* Set active sfb codebook indexes to HCB_ESC to make them "active" */
591
336k
        CChannel_CodebookTableInit(
592
336k
            pAacDecoderChannelInfo[ch]); /*  equals ReadSectionData(self,
593
                                            bs) in float soft. block.c
594
                                            line: ~599 */
595
        /* Note: The missing "break" is intentional here, since we need to call
596
         * CBlock_ReadScaleFactorData(). */
597
336k
        FDK_FALLTHROUGH;
598
599
727k
      case scale_factor_data:
600
727k
        if (flags & AC_ER_RVLC) {
601
          /* read RVLC data from bitstream (error sens. cat. 1) */
602
165k
          CRvlc_Read(pAacDecoderChannelInfo[ch], hBs);
603
561k
        } else {
604
561k
          error = CBlock_ReadScaleFactorData(pAacDecoderChannelInfo[ch], hBs,
605
561k
                                             flags);
606
561k
        }
607
727k
        break;
608
609
44.3k
      case pulse:
610
44.3k
        if (CPulseData_Read(
611
44.3k
                hBs,
612
44.3k
                &pAacDecoderChannelInfo[ch]->pDynData->specificTo.aac.PulseData,
613
44.3k
                pSamplingRateInfo->ScaleFactorBands_Long, /* pulse data is only
614
                                                             allowed to be
615
                                                             present in long
616
                                                             blocks! */
617
44.3k
                (void *)&pAacDecoderChannelInfo[ch]->icsInfo,
618
44.3k
                frame_length) != 0) {
619
54
          error = AAC_DEC_DECODE_FRAME_ERROR;
620
54
        }
621
44.3k
        break;
622
573k
      case tns_data_present:
623
573k
        CTns_ReadDataPresentFlag(
624
573k
            hBs, &pAacDecoderChannelInfo[ch]->pDynData->TnsData);
625
573k
        if (elFlags & AC_EL_LFE &&
626
0
            pAacDecoderChannelInfo[ch]->pDynData->TnsData.DataPresent) {
627
0
          error = AAC_DEC_PARSE_ERROR;
628
0
        }
629
573k
        break;
630
727k
      case tns_data:
631
        /* tns_data_present is checked inside CTns_Read(). */
632
727k
        error = CTns_Read(hBs, &pAacDecoderChannelInfo[ch]->pDynData->TnsData,
633
727k
                          &pAacDecoderChannelInfo[ch]->icsInfo, flags);
634
635
727k
        break;
636
637
1.31k
      case gain_control_data:
638
1.31k
        break;
639
640
44.2k
      case gain_control_data_present:
641
44.2k
        if (FDKreadBits(hBs, 1)) {
642
31
          error = AAC_DEC_UNSUPPORTED_GAIN_CONTROL_DATA;
643
31
        }
644
44.2k
        break;
645
646
276k
      case tw_data:
647
276k
        break;
648
77.4k
      case common_tw:
649
77.4k
        break;
650
77.4k
      case tns_data_present_usac:
651
77.4k
        if (pAacDecoderChannelInfo[0]->pDynData->specificTo.usac.tns_active) {
652
43.3k
          CTns_ReadDataPresentUsac(
653
43.3k
              hBs, &pAacDecoderChannelInfo[0]->pDynData->TnsData,
654
43.3k
              &pAacDecoderChannelInfo[1]->pDynData->TnsData,
655
43.3k
              &pAacDecoderChannelInfo[0]->pDynData->specificTo.usac.tns_on_lr,
656
43.3k
              &pAacDecoderChannelInfo[0]->icsInfo, flags, elFlags,
657
43.3k
              pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow);
658
43.3k
        } else {
659
34.0k
          pAacDecoderChannelInfo[0]->pDynData->specificTo.usac.tns_on_lr =
660
34.0k
              (UCHAR)1;
661
34.0k
        }
662
77.4k
        break;
663
398k
      case core_mode:
664
398k
        decision_bit = FDKreadBits(hBs, 1);
665
398k
        pAacDecoderChannelInfo[ch]->data.usac.core_mode = decision_bit;
666
398k
        if ((ch == 1) && (pAacDecoderChannelInfo[0]->data.usac.core_mode !=
667
94.6k
                          pAacDecoderChannelInfo[1]->data.usac.core_mode)) {
668
          /* StereoCoreToolInfo(core_mode[ch] ) */
669
10.2k
          pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow = 0;
670
10.2k
          pAacDecoderChannelInfo[1]->pDynData->RawDataInfo.CommonWindow = 0;
671
10.2k
        }
672
398k
        break;
673
77.4k
      case tns_active:
674
77.4k
        pAacDecoderChannelInfo[0]->pDynData->specificTo.usac.tns_active =
675
77.4k
            FDKreadBit(hBs);
676
77.4k
        break;
677
337k
      case noise:
678
337k
        if (elFlags & AC_EL_USAC_NOISE) {
679
19.5k
          pAacDecoderChannelInfo[ch]
680
19.5k
              ->pDynData->specificTo.usac.fd_noise_level_and_offset =
681
19.5k
              FDKreadBits(hBs, 3 + 5); /* Noise level */
682
19.5k
        }
683
337k
        break;
684
61.2k
      case lpd_channel_stream:
685
686
61.2k
      {
687
61.2k
        error = CLpdChannelStream_Read(/* = lpd_channel_stream() */
688
61.2k
                                       hBs, pAacDecoderChannelInfo[ch],
689
61.2k
                                       pAacDecoderStaticChannelInfo[ch],
690
61.2k
                                       pSamplingRateInfo, flags);
691
61.2k
      }
692
693
61.2k
        pAacDecoderChannelInfo[ch]->renderMode = AACDEC_RENDER_LPD;
694
61.2k
        break;
695
335k
      case fac_data: {
696
335k
        int fFacDatPresent = FDKreadBit(hBs);
697
698
        /* Wee need a valid fac_data[0] even if no FAC data is present (as
699
         * temporal buffer) */
700
335k
        pAacDecoderChannelInfo[ch]->data.usac.fac_data[0] =
701
335k
            pAacDecoderChannelInfo[ch]->data.usac.fac_data0;
702
703
335k
        if (fFacDatPresent) {
704
46.5k
          if (elFlags & AC_EL_LFE) {
705
0
            error = AAC_DEC_PARSE_ERROR;
706
0
            break;
707
0
          }
708
          /* FAC data present, this frame is FD, so the last mode had to be
709
           * ACELP. */
710
46.5k
          if (pAacDecoderStaticChannelInfo[ch]->last_core_mode != LPD ||
711
33.8k
              pAacDecoderStaticChannelInfo[ch]->last_lpd_mode != 0) {
712
33.8k
            pAacDecoderChannelInfo[ch]->data.usac.core_mode_last = LPD;
713
33.8k
            pAacDecoderChannelInfo[ch]->data.usac.lpd_mode_last = 0;
714
            /* We can't change the past! So look to the future and go ahead! */
715
33.8k
          }
716
46.5k
          CLpd_FAC_Read(hBs, pAacDecoderChannelInfo[ch]->data.usac.fac_data[0],
717
46.5k
                        pAacDecoderChannelInfo[ch]->data.usac.fac_data_e,
718
46.5k
                        CLpd_FAC_getLength(
719
46.5k
                            IsLongBlock(&pAacDecoderChannelInfo[ch]->icsInfo),
720
46.5k
                            pAacDecoderChannelInfo[ch]->granuleLength),
721
46.5k
                        1, 0);
722
288k
        } else {
723
288k
          if (pAacDecoderStaticChannelInfo[ch]->last_core_mode == LPD &&
724
20.3k
              pAacDecoderStaticChannelInfo[ch]->last_lpd_mode == 0) {
725
            /* ACELP to FD transitons without FAC are possible. That is why we
726
            zero it out (i.e FAC will not be considered in the subsequent
727
            calculations */
728
15.0k
            FDKmemclear(pAacDecoderChannelInfo[ch]->data.usac.fac_data0,
729
15.0k
                        LFAC * sizeof(FIXP_DBL));
730
15.0k
          }
731
288k
        }
732
335k
      } break;
733
345k
      case esc2_rvlc:
734
345k
        if (flags & AC_ER_RVLC) {
735
165k
          CRvlc_Decode(pAacDecoderChannelInfo[ch],
736
165k
                       pAacDecoderStaticChannelInfo[ch], hBs);
737
165k
        }
738
345k
        break;
739
740
351k
      case esc1_hcr:
741
351k
        if (flags & AC_ER_HCR) {
742
11.7k
          CHcr_Read(hBs, pAacDecoderChannelInfo[ch],
743
11.7k
                    numberOfChannels == 2 ? ID_CPE : ID_SCE);
744
11.7k
        }
745
351k
        break;
746
747
390k
      case spectral_data:
748
390k
        error = CBlock_ReadSpectralData(hBs, pAacDecoderChannelInfo[ch],
749
390k
                                        pSamplingRateInfo, flags);
750
390k
        if (flags & AC_ELD) {
751
267k
          pAacDecoderChannelInfo[ch]->renderMode = AACDEC_RENDER_ELDFB;
752
267k
        } else {
753
122k
          if (flags & AC_HDAAC) {
754
0
            pAacDecoderChannelInfo[ch]->renderMode = AACDEC_RENDER_INTIMDCT;
755
122k
          } else {
756
122k
            pAacDecoderChannelInfo[ch]->renderMode = AACDEC_RENDER_IMDCT;
757
122k
          }
758
122k
        }
759
390k
        break;
760
761
336k
      case ac_spectral_data:
762
336k
        error = CBlock_ReadAcSpectralData(
763
336k
            hBs, pAacDecoderChannelInfo[ch], pAacDecoderStaticChannelInfo[ch],
764
336k
            pSamplingRateInfo, frame_length, flags);
765
336k
        pAacDecoderChannelInfo[ch]->renderMode = AACDEC_RENDER_IMDCT;
766
336k
        break;
767
768
2.09k
      case coupled_elements: {
769
2.09k
        int num_coupled_elements, c;
770
771
2.09k
        ind_sw_cce_flag = FDKreadBit(hBs);
772
2.09k
        num_coupled_elements = FDKreadBits(hBs, 3);
773
774
10.1k
        for (c = 0; c < (num_coupled_elements + 1); c++) {
775
8.07k
          int cc_target_is_cpe;
776
777
8.07k
          num_gain_element_lists++;
778
8.07k
          cc_target_is_cpe = FDKreadBit(hBs); /* cc_target_is_cpe[c] */
779
8.07k
          FDKreadBits(hBs, 4);                /* cc_target_tag_select[c] */
780
781
8.07k
          if (cc_target_is_cpe) {
782
1.96k
            int cc_l, cc_r;
783
784
1.96k
            cc_l = FDKreadBit(hBs); /* cc_l[c] */
785
1.96k
            cc_r = FDKreadBit(hBs); /* cc_r[c] */
786
787
1.96k
            if (cc_l && cc_r) {
788
719
              num_gain_element_lists++;
789
719
            }
790
1.96k
          }
791
8.07k
        }
792
2.09k
        FDKreadBit(hBs);     /* cc_domain */
793
2.09k
        FDKreadBit(hBs);     /* gain_element_sign  */
794
2.09k
        FDKreadBits(hBs, 2); /* gain_element_scale */
795
2.09k
      } break;
796
797
2.06k
      case gain_element_lists: {
798
2.06k
        const CodeBookDescription *hcb;
799
2.06k
        UCHAR *pCodeBook;
800
2.06k
        int c;
801
802
2.06k
        hcb = &AACcodeBookDescriptionTable[BOOKSCL];
803
2.06k
        pCodeBook = pAacDecoderChannelInfo[ch]->pDynData->aCodeBook;
804
805
8.69k
        for (c = 1; c < num_gain_element_lists; c++) {
806
6.62k
          int cge;
807
6.62k
          if (ind_sw_cce_flag) {
808
1.41k
            cge = 1;
809
5.21k
          } else {
810
5.21k
            cge = FDKreadBits(hBs, 1); /* common_gain_element_present[c] */
811
5.21k
          }
812
6.62k
          if (cge) {
813
            /* Huffman */
814
2.35k
            CBlock_DecodeHuffmanWord(
815
2.35k
                hBs, hcb); /* hcod_sf[common_gain_element[c]] 1..19 */
816
4.26k
          } else {
817
4.26k
            int g, sfb;
818
4.26k
            for (g = 0;
819
9.83k
                 g < GetWindowGroups(&pAacDecoderChannelInfo[ch]->icsInfo);
820
5.56k
                 g++) {
821
14.6k
              for (sfb = 0; sfb < GetScaleFactorBandsTransmitted(
822
14.6k
                                      &pAacDecoderChannelInfo[ch]->icsInfo);
823
9.03k
                   sfb++) {
824
9.03k
                if (pCodeBook[sfb] != ZERO_HCB) {
825
                  /* Huffman */
826
7.96k
                  CBlock_DecodeHuffmanWord(
827
7.96k
                      hBs,
828
7.96k
                      hcb); /* hcod_sf[dpcm_gain_element[c][g][sfb]] 1..19 */
829
7.96k
                }
830
9.03k
              }
831
5.56k
            }
832
4.26k
          }
833
6.62k
        }
834
2.06k
      } break;
835
836
        /* CRC handling */
837
33.5k
      case adtscrc_start_reg1:
838
33.5k
        if (pTpDec != NULL) {
839
33.5k
          crcReg1 = transportDec_CrcStartReg(pTpDec, 192);
840
33.5k
        }
841
33.5k
        break;
842
5.47k
      case adtscrc_start_reg2:
843
5.47k
        if (pTpDec != NULL) {
844
5.47k
          crcReg2 = transportDec_CrcStartReg(pTpDec, 128);
845
5.47k
        }
846
5.47k
        break;
847
32.9k
      case adtscrc_end_reg1:
848
32.9k
      case drmcrc_end_reg:
849
32.9k
        if (pTpDec != NULL) {
850
32.9k
          transportDec_CrcEndReg(pTpDec, crcReg1);
851
32.9k
          crcReg1 = -1;
852
32.9k
        }
853
32.9k
        break;
854
5.44k
      case adtscrc_end_reg2:
855
5.44k
        if (crcReg1 != -1) {
856
0
          error = AAC_DEC_DECODE_FRAME_ERROR;
857
5.44k
        } else if (pTpDec != NULL) {
858
5.44k
          transportDec_CrcEndReg(pTpDec, crcReg2);
859
5.44k
          crcReg2 = -1;
860
5.44k
        }
861
5.44k
        break;
862
0
      case drmcrc_start_reg:
863
0
        if (pTpDec != NULL) {
864
0
          crcReg1 = transportDec_CrcStartReg(pTpDec, 0);
865
0
        }
866
0
        break;
867
868
        /* Non data cases */
869
759k
      case next_channel:
870
759k
        ch = (ch + 1) % numberOfChannels;
871
759k
        break;
872
561k
      case link_sequence:
873
561k
        list = list->next[decision_bit];
874
561k
        i = -1;
875
561k
        break;
876
877
0
      default:
878
0
        error = AAC_DEC_UNSUPPORTED_FORMAT;
879
0
        break;
880
8.69M
    }
881
882
8.69M
    if (error != AAC_DEC_OK) {
883
3.46k
      goto bail;
884
3.46k
    }
885
886
8.69M
    i++;
887
888
8.69M
  } while (list->id[i] != end_of_sequence);
889
890
1.35M
  for (ch = 0; ch < numberOfChannels; ch++) {
891
785k
    if (pAacDecoderChannelInfo[ch]->renderMode == AACDEC_RENDER_IMDCT ||
892
724k
        pAacDecoderChannelInfo[ch]->renderMode == AACDEC_RENDER_ELDFB) {
893
      /* Shows which bands are empty. */
894
724k
      UCHAR *band_is_noise =
895
724k
          pAacDecoderChannelInfo[ch]->pDynData->band_is_noise;
896
724k
      FDKmemset(band_is_noise, (UCHAR)1, sizeof(UCHAR) * (8 * 16));
897
898
724k
      error = CBlock_InverseQuantizeSpectralData(
899
724k
          pAacDecoderChannelInfo[ch], pSamplingRateInfo, band_is_noise, 1);
900
724k
      if (error != AAC_DEC_OK) {
901
35
        return error;
902
35
      }
903
904
724k
      if (elFlags & AC_EL_USAC_NOISE) {
905
19.2k
        CBlock_ApplyNoise(pAacDecoderChannelInfo[ch], pSamplingRateInfo,
906
19.2k
                          &pAacDecoderStaticChannelInfo[ch]->nfRandomSeed,
907
19.2k
                          band_is_noise);
908
909
19.2k
      } /* if (elFlags & AC_EL_USAC_NOISE) */
910
724k
    }
911
785k
  }
912
913
569k
bail:
914
569k
  if (crcReg1 != -1 || crcReg2 != -1) {
915
0
    if (error == AAC_DEC_OK) {
916
0
      error = AAC_DEC_DECODE_FRAME_ERROR;
917
0
    }
918
0
    if (crcReg1 != -1) {
919
0
      transportDec_CrcEndReg(pTpDec, crcReg1);
920
0
    }
921
0
    if (crcReg2 != -1) {
922
0
      transportDec_CrcEndReg(pTpDec, crcReg2);
923
0
    }
924
0
  }
925
569k
  return error;
926
565k
}