xref: /aosp_15_r20/external/aac/libAACdec/src/channel.cpp (revision e54365361535b070c2db7374cec45c159c7d0e7a)
1*e5436536SAndroid Build Coastguard Worker /* -----------------------------------------------------------------------------
2*e5436536SAndroid Build Coastguard Worker Software License for The Fraunhofer FDK AAC Codec Library for Android
3*e5436536SAndroid Build Coastguard Worker 
4*e5436536SAndroid Build Coastguard Worker © Copyright  1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten
5*e5436536SAndroid Build Coastguard Worker Forschung e.V. All rights reserved.
6*e5436536SAndroid Build Coastguard Worker 
7*e5436536SAndroid Build Coastguard Worker  1.    INTRODUCTION
8*e5436536SAndroid Build Coastguard Worker The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9*e5436536SAndroid Build Coastguard Worker that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10*e5436536SAndroid Build Coastguard Worker scheme for digital audio. This FDK AAC Codec software is intended to be used on
11*e5436536SAndroid Build Coastguard Worker a wide variety of Android devices.
12*e5436536SAndroid Build Coastguard Worker 
13*e5436536SAndroid Build Coastguard Worker AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14*e5436536SAndroid Build Coastguard Worker general perceptual audio codecs. AAC-ELD is considered the best-performing
15*e5436536SAndroid Build Coastguard Worker full-bandwidth communications codec by independent studies and is widely
16*e5436536SAndroid Build Coastguard Worker deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17*e5436536SAndroid Build Coastguard Worker specifications.
18*e5436536SAndroid Build Coastguard Worker 
19*e5436536SAndroid Build Coastguard Worker Patent licenses for necessary patent claims for the FDK AAC Codec (including
20*e5436536SAndroid Build Coastguard Worker those of Fraunhofer) may be obtained through Via Licensing
21*e5436536SAndroid Build Coastguard Worker (www.vialicensing.com) or through the respective patent owners individually for
22*e5436536SAndroid Build Coastguard Worker the purpose of encoding or decoding bit streams in products that are compliant
23*e5436536SAndroid Build Coastguard Worker with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24*e5436536SAndroid Build Coastguard Worker Android devices already license these patent claims through Via Licensing or
25*e5436536SAndroid Build Coastguard Worker directly from the patent owners, and therefore FDK AAC Codec software may
26*e5436536SAndroid Build Coastguard Worker already be covered under those patent licenses when it is used for those
27*e5436536SAndroid Build Coastguard Worker licensed purposes only.
28*e5436536SAndroid Build Coastguard Worker 
29*e5436536SAndroid Build Coastguard Worker Commercially-licensed AAC software libraries, including floating-point versions
30*e5436536SAndroid Build Coastguard Worker with enhanced sound quality, are also available from Fraunhofer. Users are
31*e5436536SAndroid Build Coastguard Worker encouraged to check the Fraunhofer website for additional applications
32*e5436536SAndroid Build Coastguard Worker information and documentation.
33*e5436536SAndroid Build Coastguard Worker 
34*e5436536SAndroid Build Coastguard Worker 2.    COPYRIGHT LICENSE
35*e5436536SAndroid Build Coastguard Worker 
36*e5436536SAndroid Build Coastguard Worker Redistribution and use in source and binary forms, with or without modification,
37*e5436536SAndroid Build Coastguard Worker are permitted without payment of copyright license fees provided that you
38*e5436536SAndroid Build Coastguard Worker satisfy the following conditions:
39*e5436536SAndroid Build Coastguard Worker 
40*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in redistributions of
41*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec or your modifications thereto in source code form.
42*e5436536SAndroid Build Coastguard Worker 
43*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in the documentation
44*e5436536SAndroid Build Coastguard Worker and/or other materials provided with redistributions of the FDK AAC Codec or
45*e5436536SAndroid Build Coastguard Worker your modifications thereto in binary form. You must make available free of
46*e5436536SAndroid Build Coastguard Worker charge copies of the complete source code of the FDK AAC Codec and your
47*e5436536SAndroid Build Coastguard Worker modifications thereto to recipients of copies in binary form.
48*e5436536SAndroid Build Coastguard Worker 
49*e5436536SAndroid Build Coastguard Worker The name of Fraunhofer may not be used to endorse or promote products derived
50*e5436536SAndroid Build Coastguard Worker from this library without prior written permission.
51*e5436536SAndroid Build Coastguard Worker 
52*e5436536SAndroid Build Coastguard Worker You may not charge copyright license fees for anyone to use, copy or distribute
53*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec software or your modifications thereto.
54*e5436536SAndroid Build Coastguard Worker 
55*e5436536SAndroid Build Coastguard Worker Your modified versions of the FDK AAC Codec must carry prominent notices stating
56*e5436536SAndroid Build Coastguard Worker that you changed the software and the date of any change. For modified versions
57*e5436536SAndroid Build Coastguard Worker of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58*e5436536SAndroid Build Coastguard Worker must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59*e5436536SAndroid Build Coastguard Worker AAC Codec Library for Android."
60*e5436536SAndroid Build Coastguard Worker 
61*e5436536SAndroid Build Coastguard Worker 3.    NO PATENT LICENSE
62*e5436536SAndroid Build Coastguard Worker 
63*e5436536SAndroid Build Coastguard Worker NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64*e5436536SAndroid Build Coastguard Worker limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65*e5436536SAndroid Build Coastguard Worker Fraunhofer provides no warranty of patent non-infringement with respect to this
66*e5436536SAndroid Build Coastguard Worker software.
67*e5436536SAndroid Build Coastguard Worker 
68*e5436536SAndroid Build Coastguard Worker You may use this FDK AAC Codec software or modifications thereto only for
69*e5436536SAndroid Build Coastguard Worker purposes that are authorized by appropriate patent licenses.
70*e5436536SAndroid Build Coastguard Worker 
71*e5436536SAndroid Build Coastguard Worker 4.    DISCLAIMER
72*e5436536SAndroid Build Coastguard Worker 
73*e5436536SAndroid Build Coastguard Worker This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74*e5436536SAndroid Build Coastguard Worker holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75*e5436536SAndroid Build Coastguard Worker including but not limited to the implied warranties of merchantability and
76*e5436536SAndroid Build Coastguard Worker fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77*e5436536SAndroid Build Coastguard Worker CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78*e5436536SAndroid Build Coastguard Worker or consequential damages, including but not limited to procurement of substitute
79*e5436536SAndroid Build Coastguard Worker goods or services; loss of use, data, or profits, or business interruption,
80*e5436536SAndroid Build Coastguard Worker however caused and on any theory of liability, whether in contract, strict
81*e5436536SAndroid Build Coastguard Worker liability, or tort (including negligence), arising in any way out of the use of
82*e5436536SAndroid Build Coastguard Worker this software, even if advised of the possibility of such damage.
83*e5436536SAndroid Build Coastguard Worker 
84*e5436536SAndroid Build Coastguard Worker 5.    CONTACT INFORMATION
85*e5436536SAndroid Build Coastguard Worker 
86*e5436536SAndroid Build Coastguard Worker Fraunhofer Institute for Integrated Circuits IIS
87*e5436536SAndroid Build Coastguard Worker Attention: Audio and Multimedia Departments - FDK AAC LL
88*e5436536SAndroid Build Coastguard Worker Am Wolfsmantel 33
89*e5436536SAndroid Build Coastguard Worker 91058 Erlangen, Germany
90*e5436536SAndroid Build Coastguard Worker 
91*e5436536SAndroid Build Coastguard Worker www.iis.fraunhofer.de/amm
92*e5436536SAndroid Build Coastguard Worker [email protected]
93*e5436536SAndroid Build Coastguard Worker ----------------------------------------------------------------------------- */
94*e5436536SAndroid Build Coastguard Worker 
95*e5436536SAndroid Build Coastguard Worker /**************************** AAC decoder library ******************************
96*e5436536SAndroid Build Coastguard Worker 
97*e5436536SAndroid Build Coastguard Worker    Author(s):   Josef Hoepfl
98*e5436536SAndroid Build Coastguard Worker 
99*e5436536SAndroid Build Coastguard Worker    Description:
100*e5436536SAndroid Build Coastguard Worker 
101*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
102*e5436536SAndroid Build Coastguard Worker 
103*e5436536SAndroid Build Coastguard Worker #include "channel.h"
104*e5436536SAndroid Build Coastguard Worker #include "aacdecoder.h"
105*e5436536SAndroid Build Coastguard Worker #include "block.h"
106*e5436536SAndroid Build Coastguard Worker #include "aacdec_tns.h"
107*e5436536SAndroid Build Coastguard Worker #include "FDK_bitstream.h"
108*e5436536SAndroid Build Coastguard Worker 
109*e5436536SAndroid Build Coastguard Worker #include "conceal.h"
110*e5436536SAndroid Build Coastguard Worker 
111*e5436536SAndroid Build Coastguard Worker #include "rvlc.h"
112*e5436536SAndroid Build Coastguard Worker 
113*e5436536SAndroid Build Coastguard Worker #include "aacdec_hcr.h"
114*e5436536SAndroid Build Coastguard Worker 
115*e5436536SAndroid Build Coastguard Worker #include "usacdec_lpd.h"
116*e5436536SAndroid Build Coastguard Worker #include "usacdec_fac.h"
117*e5436536SAndroid Build Coastguard Worker 
MapMidSideMaskToPnsCorrelation(CAacDecoderChannelInfo * pAacDecoderChannelInfo[2])118*e5436536SAndroid Build Coastguard Worker static void MapMidSideMaskToPnsCorrelation(
119*e5436536SAndroid Build Coastguard Worker     CAacDecoderChannelInfo *pAacDecoderChannelInfo[2]) {
120*e5436536SAndroid Build Coastguard Worker   int group;
121*e5436536SAndroid Build Coastguard Worker 
122*e5436536SAndroid Build Coastguard Worker   for (group = 0; group < pAacDecoderChannelInfo[L]->icsInfo.WindowGroups;
123*e5436536SAndroid Build Coastguard Worker        group++) {
124*e5436536SAndroid Build Coastguard Worker     UCHAR groupMask = 1 << group;
125*e5436536SAndroid Build Coastguard Worker 
126*e5436536SAndroid Build Coastguard Worker     for (UCHAR band = 0; band < pAacDecoderChannelInfo[L]->icsInfo.MaxSfBands;
127*e5436536SAndroid Build Coastguard Worker          band++) {
128*e5436536SAndroid Build Coastguard Worker       if (pAacDecoderChannelInfo[L]->pComData->jointStereoData.MsUsed[band] &
129*e5436536SAndroid Build Coastguard Worker           groupMask) { /* channels are correlated */
130*e5436536SAndroid Build Coastguard Worker         CPns_SetCorrelation(&pAacDecoderChannelInfo[L]->data.aac.PnsData, group,
131*e5436536SAndroid Build Coastguard Worker                             band, 0);
132*e5436536SAndroid Build Coastguard Worker 
133*e5436536SAndroid Build Coastguard Worker         if (CPns_IsPnsUsed(&pAacDecoderChannelInfo[L]->data.aac.PnsData, group,
134*e5436536SAndroid Build Coastguard Worker                            band) &&
135*e5436536SAndroid Build Coastguard Worker             CPns_IsPnsUsed(&pAacDecoderChannelInfo[R]->data.aac.PnsData, group,
136*e5436536SAndroid Build Coastguard Worker                            band))
137*e5436536SAndroid Build Coastguard Worker           pAacDecoderChannelInfo[L]->pComData->jointStereoData.MsUsed[band] ^=
138*e5436536SAndroid Build Coastguard Worker               groupMask; /* clear the groupMask-bit */
139*e5436536SAndroid Build Coastguard Worker       }
140*e5436536SAndroid Build Coastguard Worker     }
141*e5436536SAndroid Build Coastguard Worker   }
142*e5436536SAndroid Build Coastguard Worker }
143*e5436536SAndroid Build Coastguard Worker 
Clean_Complex_Prediction_coefficients(CJointStereoPersistentData * pJointStereoPersistentData,int windowGroups,const int low_limit,const int high_limit)144*e5436536SAndroid Build Coastguard Worker static void Clean_Complex_Prediction_coefficients(
145*e5436536SAndroid Build Coastguard Worker     CJointStereoPersistentData *pJointStereoPersistentData, int windowGroups,
146*e5436536SAndroid Build Coastguard Worker     const int low_limit, const int high_limit) {
147*e5436536SAndroid Build Coastguard Worker   for (int group = 0; group < windowGroups; group++) {
148*e5436536SAndroid Build Coastguard Worker     for (int sfb = low_limit; sfb < high_limit; sfb++) {
149*e5436536SAndroid Build Coastguard Worker       pJointStereoPersistentData->alpha_q_re_prev[group][sfb] = 0;
150*e5436536SAndroid Build Coastguard Worker       pJointStereoPersistentData->alpha_q_im_prev[group][sfb] = 0;
151*e5436536SAndroid Build Coastguard Worker     }
152*e5436536SAndroid Build Coastguard Worker   }
153*e5436536SAndroid Build Coastguard Worker }
154*e5436536SAndroid Build Coastguard Worker 
155*e5436536SAndroid Build Coastguard Worker /*!
156*e5436536SAndroid Build Coastguard Worker   \brief Decode channel pair element
157*e5436536SAndroid Build Coastguard Worker 
158*e5436536SAndroid Build Coastguard Worker   The function decodes a channel pair element.
159*e5436536SAndroid Build Coastguard Worker 
160*e5436536SAndroid Build Coastguard Worker   \return  none
161*e5436536SAndroid Build Coastguard Worker */
CChannelElement_Decode(CAacDecoderChannelInfo * pAacDecoderChannelInfo[2],CAacDecoderStaticChannelInfo * pAacDecoderStaticChannelInfo[2],SamplingRateInfo * pSamplingRateInfo,UINT flags,UINT elFlags,int el_channels)162*e5436536SAndroid Build Coastguard Worker void CChannelElement_Decode(
163*e5436536SAndroid Build Coastguard Worker     CAacDecoderChannelInfo
164*e5436536SAndroid Build Coastguard Worker         *pAacDecoderChannelInfo[2], /*!< pointer to aac decoder channel info */
165*e5436536SAndroid Build Coastguard Worker     CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[2],
166*e5436536SAndroid Build Coastguard Worker     SamplingRateInfo *pSamplingRateInfo, UINT flags, UINT elFlags,
167*e5436536SAndroid Build Coastguard Worker     int el_channels) {
168*e5436536SAndroid Build Coastguard Worker   int ch = 0;
169*e5436536SAndroid Build Coastguard Worker 
170*e5436536SAndroid Build Coastguard Worker   int maxSfBandsL = 0, maxSfBandsR = 0;
171*e5436536SAndroid Build Coastguard Worker   int maybe_jstereo = (el_channels > 1);
172*e5436536SAndroid Build Coastguard Worker 
173*e5436536SAndroid Build Coastguard Worker   if (flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA) && el_channels == 2) {
174*e5436536SAndroid Build Coastguard Worker     if (pAacDecoderChannelInfo[L]->data.usac.core_mode ||
175*e5436536SAndroid Build Coastguard Worker         pAacDecoderChannelInfo[R]->data.usac.core_mode) {
176*e5436536SAndroid Build Coastguard Worker       maybe_jstereo = 0;
177*e5436536SAndroid Build Coastguard Worker     }
178*e5436536SAndroid Build Coastguard Worker   }
179*e5436536SAndroid Build Coastguard Worker 
180*e5436536SAndroid Build Coastguard Worker   if (maybe_jstereo) {
181*e5436536SAndroid Build Coastguard Worker     maxSfBandsL =
182*e5436536SAndroid Build Coastguard Worker         GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[L]->icsInfo);
183*e5436536SAndroid Build Coastguard Worker     maxSfBandsR =
184*e5436536SAndroid Build Coastguard Worker         GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[R]->icsInfo);
185*e5436536SAndroid Build Coastguard Worker 
186*e5436536SAndroid Build Coastguard Worker     /* apply ms */
187*e5436536SAndroid Build Coastguard Worker     if (pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow) {
188*e5436536SAndroid Build Coastguard Worker       if (!(flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA))) {
189*e5436536SAndroid Build Coastguard Worker         if (pAacDecoderChannelInfo[L]->data.aac.PnsData.PnsActive ||
190*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[R]->data.aac.PnsData.PnsActive) {
191*e5436536SAndroid Build Coastguard Worker           MapMidSideMaskToPnsCorrelation(pAacDecoderChannelInfo);
192*e5436536SAndroid Build Coastguard Worker         }
193*e5436536SAndroid Build Coastguard Worker       }
194*e5436536SAndroid Build Coastguard Worker       /* if tns_on_lr == 1 run MS */ /* &&
195*e5436536SAndroid Build Coastguard Worker                                         (pAacDecoderChannelInfo[L]->pDynData->specificTo.usac.tns_active
196*e5436536SAndroid Build Coastguard Worker                                         == 1) */
197*e5436536SAndroid Build Coastguard Worker       if (((flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) &&
198*e5436536SAndroid Build Coastguard Worker            (pAacDecoderChannelInfo[L]->pDynData->specificTo.usac.tns_on_lr ==
199*e5436536SAndroid Build Coastguard Worker             1)) ||
200*e5436536SAndroid Build Coastguard Worker           ((flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) == 0)) {
201*e5436536SAndroid Build Coastguard Worker         int max_sfb_ste = (INT)(pAacDecoderChannelInfo[L]->icsInfo.max_sfb_ste);
202*e5436536SAndroid Build Coastguard Worker 
203*e5436536SAndroid Build Coastguard Worker         CJointStereo_ApplyMS(
204*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo,
205*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[L]->pSpectralCoefficient,
206*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[R]->pSpectralCoefficient,
207*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[L]->pDynData->aSfbScale,
208*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[R]->pDynData->aSfbScale,
209*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[L]->specScale,
210*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[R]->specScale,
211*e5436536SAndroid Build Coastguard Worker             GetScaleFactorBandOffsets(&pAacDecoderChannelInfo[L]->icsInfo,
212*e5436536SAndroid Build Coastguard Worker                                       pSamplingRateInfo),
213*e5436536SAndroid Build Coastguard Worker             GetWindowGroupLengthTable(&pAacDecoderChannelInfo[L]->icsInfo),
214*e5436536SAndroid Build Coastguard Worker             GetWindowGroups(&pAacDecoderChannelInfo[L]->icsInfo), max_sfb_ste,
215*e5436536SAndroid Build Coastguard Worker             maxSfBandsL, maxSfBandsR,
216*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[L]
217*e5436536SAndroid Build Coastguard Worker                 ->pComData->jointStereoData.store_dmx_re_prev,
218*e5436536SAndroid Build Coastguard Worker             &(pAacDecoderChannelInfo[L]
219*e5436536SAndroid Build Coastguard Worker                   ->pComData->jointStereoData.store_dmx_re_prev_e),
220*e5436536SAndroid Build Coastguard Worker             1);
221*e5436536SAndroid Build Coastguard Worker 
222*e5436536SAndroid Build Coastguard Worker       } /* if ( ((elFlags & AC_EL_USAC_CP_POSSIBLE).... */
223*e5436536SAndroid Build Coastguard Worker     }   /* if (pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow)*/
224*e5436536SAndroid Build Coastguard Worker 
225*e5436536SAndroid Build Coastguard Worker     /* apply intensity stereo */ /* modifies pAacDecoderChannelInfo[]->aSpecSfb
226*e5436536SAndroid Build Coastguard Worker                                   */
227*e5436536SAndroid Build Coastguard Worker     if (!(flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA))) {
228*e5436536SAndroid Build Coastguard Worker       if ((pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow ==
229*e5436536SAndroid Build Coastguard Worker            1) &&
230*e5436536SAndroid Build Coastguard Worker           (el_channels == 2)) {
231*e5436536SAndroid Build Coastguard Worker         CJointStereo_ApplyIS(
232*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo,
233*e5436536SAndroid Build Coastguard Worker             GetScaleFactorBandOffsets(&pAacDecoderChannelInfo[L]->icsInfo,
234*e5436536SAndroid Build Coastguard Worker                                       pSamplingRateInfo),
235*e5436536SAndroid Build Coastguard Worker             GetWindowGroupLengthTable(&pAacDecoderChannelInfo[L]->icsInfo),
236*e5436536SAndroid Build Coastguard Worker             GetWindowGroups(&pAacDecoderChannelInfo[L]->icsInfo),
237*e5436536SAndroid Build Coastguard Worker             GetScaleFactorBandsTransmitted(
238*e5436536SAndroid Build Coastguard Worker                 &pAacDecoderChannelInfo[L]->icsInfo));
239*e5436536SAndroid Build Coastguard Worker       }
240*e5436536SAndroid Build Coastguard Worker     }
241*e5436536SAndroid Build Coastguard Worker   } /* maybe_stereo */
242*e5436536SAndroid Build Coastguard Worker 
243*e5436536SAndroid Build Coastguard Worker   for (ch = 0; ch < el_channels; ch++) {
244*e5436536SAndroid Build Coastguard Worker     if (pAacDecoderChannelInfo[ch]->renderMode == AACDEC_RENDER_LPD) {
245*e5436536SAndroid Build Coastguard Worker       /* Decode LPD data */
246*e5436536SAndroid Build Coastguard Worker       CLpdChannelStream_Decode(pAacDecoderChannelInfo[ch],
247*e5436536SAndroid Build Coastguard Worker                                pAacDecoderStaticChannelInfo[ch], flags);
248*e5436536SAndroid Build Coastguard Worker     } else {
249*e5436536SAndroid Build Coastguard Worker       UCHAR noSfbs =
250*e5436536SAndroid Build Coastguard Worker           GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[ch]->icsInfo);
251*e5436536SAndroid Build Coastguard Worker       /* For USAC common window: max_sfb of both channels may differ
252*e5436536SAndroid Build Coastguard Worker        * (common_max_sfb == 0). */
253*e5436536SAndroid Build Coastguard Worker       if ((maybe_jstereo == 1) &&
254*e5436536SAndroid Build Coastguard Worker           (pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow ==
255*e5436536SAndroid Build Coastguard Worker            1)) {
256*e5436536SAndroid Build Coastguard Worker         noSfbs = fMax(maxSfBandsL, maxSfBandsR);
257*e5436536SAndroid Build Coastguard Worker       }
258*e5436536SAndroid Build Coastguard Worker       int CP_active = 0;
259*e5436536SAndroid Build Coastguard Worker       if (elFlags & AC_EL_USAC_CP_POSSIBLE) {
260*e5436536SAndroid Build Coastguard Worker         CP_active = pAacDecoderChannelInfo[ch]
261*e5436536SAndroid Build Coastguard Worker                         ->pComData->jointStereoData.cplx_pred_flag;
262*e5436536SAndroid Build Coastguard Worker       }
263*e5436536SAndroid Build Coastguard Worker 
264*e5436536SAndroid Build Coastguard Worker       /* Omit writing of pAacDecoderChannelInfo[ch]->specScale for complex
265*e5436536SAndroid Build Coastguard Worker          stereo prediction since scaling has already been carried out. */
266*e5436536SAndroid Build Coastguard Worker       int max_sfb_ste = (INT)(pAacDecoderChannelInfo[L]->icsInfo.max_sfb_ste);
267*e5436536SAndroid Build Coastguard Worker 
268*e5436536SAndroid Build Coastguard Worker       if (!(CP_active && (max_sfb_ste == noSfbs)) ||
269*e5436536SAndroid Build Coastguard Worker           !(CP_active &&
270*e5436536SAndroid Build Coastguard Worker             !(pAacDecoderChannelInfo[ch]->pDynData->TnsData.Active)) ||
271*e5436536SAndroid Build Coastguard Worker           ((flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) &&
272*e5436536SAndroid Build Coastguard Worker            (pAacDecoderChannelInfo[L]->pDynData->specificTo.usac.tns_on_lr ==
273*e5436536SAndroid Build Coastguard Worker             0))) {
274*e5436536SAndroid Build Coastguard Worker         CBlock_ScaleSpectralData(pAacDecoderChannelInfo[ch], noSfbs,
275*e5436536SAndroid Build Coastguard Worker                                  pSamplingRateInfo);
276*e5436536SAndroid Build Coastguard Worker 
277*e5436536SAndroid Build Coastguard Worker         /*Active for the case of TNS applied before MS/CP*/
278*e5436536SAndroid Build Coastguard Worker         if ((flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) &&
279*e5436536SAndroid Build Coastguard Worker             (pAacDecoderChannelInfo[L]->pDynData->specificTo.usac.tns_on_lr ==
280*e5436536SAndroid Build Coastguard Worker              0)) {
281*e5436536SAndroid Build Coastguard Worker           if (IsLongBlock(&pAacDecoderChannelInfo[ch]->icsInfo)) {
282*e5436536SAndroid Build Coastguard Worker             for (int i = 0; i < noSfbs; i++) {
283*e5436536SAndroid Build Coastguard Worker               pAacDecoderChannelInfo[ch]->pDynData->aSfbScale[i] =
284*e5436536SAndroid Build Coastguard Worker                   pAacDecoderChannelInfo[ch]->specScale[0];
285*e5436536SAndroid Build Coastguard Worker             }
286*e5436536SAndroid Build Coastguard Worker           } else {
287*e5436536SAndroid Build Coastguard Worker             for (int i = 0; i < 8; i++) {
288*e5436536SAndroid Build Coastguard Worker               for (int j = 0; j < noSfbs; j++) {
289*e5436536SAndroid Build Coastguard Worker                 pAacDecoderChannelInfo[ch]->pDynData->aSfbScale[i * 16 + j] =
290*e5436536SAndroid Build Coastguard Worker                     pAacDecoderChannelInfo[ch]->specScale[i];
291*e5436536SAndroid Build Coastguard Worker               }
292*e5436536SAndroid Build Coastguard Worker             }
293*e5436536SAndroid Build Coastguard Worker           }
294*e5436536SAndroid Build Coastguard Worker         }
295*e5436536SAndroid Build Coastguard Worker       }
296*e5436536SAndroid Build Coastguard Worker     }
297*e5436536SAndroid Build Coastguard Worker   } /* End "for (ch = 0; ch < el_channels; ch++)" */
298*e5436536SAndroid Build Coastguard Worker 
299*e5436536SAndroid Build Coastguard Worker   if (maybe_jstereo) {
300*e5436536SAndroid Build Coastguard Worker     /* apply ms */
301*e5436536SAndroid Build Coastguard Worker     if (pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow) {
302*e5436536SAndroid Build Coastguard Worker     } /* CommonWindow */
303*e5436536SAndroid Build Coastguard Worker     else {
304*e5436536SAndroid Build Coastguard Worker       if (elFlags & AC_EL_USAC_CP_POSSIBLE) {
305*e5436536SAndroid Build Coastguard Worker         FDKmemclear(
306*e5436536SAndroid Build Coastguard Worker             pAacDecoderStaticChannelInfo[L]
307*e5436536SAndroid Build Coastguard Worker                 ->pCpeStaticData->jointStereoPersistentData.alpha_q_re_prev,
308*e5436536SAndroid Build Coastguard Worker             JointStereoMaximumGroups * JointStereoMaximumBands * sizeof(SHORT));
309*e5436536SAndroid Build Coastguard Worker         FDKmemclear(
310*e5436536SAndroid Build Coastguard Worker             pAacDecoderStaticChannelInfo[L]
311*e5436536SAndroid Build Coastguard Worker                 ->pCpeStaticData->jointStereoPersistentData.alpha_q_im_prev,
312*e5436536SAndroid Build Coastguard Worker             JointStereoMaximumGroups * JointStereoMaximumBands * sizeof(SHORT));
313*e5436536SAndroid Build Coastguard Worker       }
314*e5436536SAndroid Build Coastguard Worker     }
315*e5436536SAndroid Build Coastguard Worker 
316*e5436536SAndroid Build Coastguard Worker   } /* if (maybe_jstereo) */
317*e5436536SAndroid Build Coastguard Worker 
318*e5436536SAndroid Build Coastguard Worker   for (ch = 0; ch < el_channels; ch++) {
319*e5436536SAndroid Build Coastguard Worker     if (pAacDecoderChannelInfo[ch]->renderMode == AACDEC_RENDER_LPD) {
320*e5436536SAndroid Build Coastguard Worker     } else {
321*e5436536SAndroid Build Coastguard Worker       if (!(flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA))) {
322*e5436536SAndroid Build Coastguard Worker         /* Use same seed for coupled channels (CPE) */
323*e5436536SAndroid Build Coastguard Worker         int pnsCh = (ch > 0) ? L : ch;
324*e5436536SAndroid Build Coastguard Worker         CPns_UpdateNoiseState(
325*e5436536SAndroid Build Coastguard Worker             &pAacDecoderChannelInfo[ch]->data.aac.PnsData,
326*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[pnsCh]->data.aac.PnsData.currentSeed,
327*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[ch]->pComData->pnsRandomSeed);
328*e5436536SAndroid Build Coastguard Worker       }
329*e5436536SAndroid Build Coastguard Worker 
330*e5436536SAndroid Build Coastguard Worker       if ((!(flags & (AC_USAC))) ||
331*e5436536SAndroid Build Coastguard Worker           ((flags & (AC_USAC)) &&
332*e5436536SAndroid Build Coastguard Worker            (pAacDecoderChannelInfo[L]->pDynData->specificTo.usac.tns_active ==
333*e5436536SAndroid Build Coastguard Worker             1)) ||
334*e5436536SAndroid Build Coastguard Worker           (maybe_jstereo == 0)) {
335*e5436536SAndroid Build Coastguard Worker         ApplyTools(
336*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo, pSamplingRateInfo, flags, elFlags, ch,
337*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow);
338*e5436536SAndroid Build Coastguard Worker       }
339*e5436536SAndroid Build Coastguard Worker     } /* End "} else" */
340*e5436536SAndroid Build Coastguard Worker   }   /* End "for (ch = 0; ch < el_channels; ch++)" */
341*e5436536SAndroid Build Coastguard Worker 
342*e5436536SAndroid Build Coastguard Worker   if (maybe_jstereo) {
343*e5436536SAndroid Build Coastguard Worker     /* apply ms */
344*e5436536SAndroid Build Coastguard Worker     if (pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow) {
345*e5436536SAndroid Build Coastguard Worker       /* if tns_on_lr == 0 run MS */
346*e5436536SAndroid Build Coastguard Worker       if ((flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) &&
347*e5436536SAndroid Build Coastguard Worker           (pAacDecoderChannelInfo[L]->pDynData->specificTo.usac.tns_on_lr ==
348*e5436536SAndroid Build Coastguard Worker            0)) {
349*e5436536SAndroid Build Coastguard Worker         int max_sfb_ste = (INT)(pAacDecoderChannelInfo[L]->icsInfo.max_sfb_ste);
350*e5436536SAndroid Build Coastguard Worker 
351*e5436536SAndroid Build Coastguard Worker         CJointStereo_ApplyMS(
352*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo,
353*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[L]->pSpectralCoefficient,
354*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[R]->pSpectralCoefficient,
355*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[L]->pDynData->aSfbScale,
356*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[R]->pDynData->aSfbScale,
357*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[L]->specScale,
358*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[R]->specScale,
359*e5436536SAndroid Build Coastguard Worker             GetScaleFactorBandOffsets(&pAacDecoderChannelInfo[L]->icsInfo,
360*e5436536SAndroid Build Coastguard Worker                                       pSamplingRateInfo),
361*e5436536SAndroid Build Coastguard Worker             GetWindowGroupLengthTable(&pAacDecoderChannelInfo[L]->icsInfo),
362*e5436536SAndroid Build Coastguard Worker             GetWindowGroups(&pAacDecoderChannelInfo[L]->icsInfo), max_sfb_ste,
363*e5436536SAndroid Build Coastguard Worker             maxSfBandsL, maxSfBandsR,
364*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[L]
365*e5436536SAndroid Build Coastguard Worker                 ->pComData->jointStereoData.store_dmx_re_prev,
366*e5436536SAndroid Build Coastguard Worker             &(pAacDecoderChannelInfo[L]
367*e5436536SAndroid Build Coastguard Worker                   ->pComData->jointStereoData.store_dmx_re_prev_e),
368*e5436536SAndroid Build Coastguard Worker             1);
369*e5436536SAndroid Build Coastguard Worker       }
370*e5436536SAndroid Build Coastguard Worker 
371*e5436536SAndroid Build Coastguard Worker     } /* if (pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow) */
372*e5436536SAndroid Build Coastguard Worker 
373*e5436536SAndroid Build Coastguard Worker   } /* if (maybe_jstereo) */
374*e5436536SAndroid Build Coastguard Worker 
375*e5436536SAndroid Build Coastguard Worker   for (ch = 0; ch < el_channels; ch++) {
376*e5436536SAndroid Build Coastguard Worker     if (elFlags & AC_EL_USAC_CP_POSSIBLE) {
377*e5436536SAndroid Build Coastguard Worker       pAacDecoderStaticChannelInfo[L]
378*e5436536SAndroid Build Coastguard Worker           ->pCpeStaticData->jointStereoPersistentData.clearSpectralCoeffs = 0;
379*e5436536SAndroid Build Coastguard Worker     }
380*e5436536SAndroid Build Coastguard Worker   }
381*e5436536SAndroid Build Coastguard Worker 
382*e5436536SAndroid Build Coastguard Worker   CRvlc_ElementCheck(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo,
383*e5436536SAndroid Build Coastguard Worker                      flags, el_channels);
384*e5436536SAndroid Build Coastguard Worker }
385*e5436536SAndroid Build Coastguard Worker 
CChannel_CodebookTableInit(CAacDecoderChannelInfo * pAacDecoderChannelInfo)386*e5436536SAndroid Build Coastguard Worker void CChannel_CodebookTableInit(
387*e5436536SAndroid Build Coastguard Worker     CAacDecoderChannelInfo *pAacDecoderChannelInfo) {
388*e5436536SAndroid Build Coastguard Worker   int b, w, maxBands, maxWindows;
389*e5436536SAndroid Build Coastguard Worker   int maxSfb = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
390*e5436536SAndroid Build Coastguard Worker   UCHAR *pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook;
391*e5436536SAndroid Build Coastguard Worker 
392*e5436536SAndroid Build Coastguard Worker   if (IsLongBlock(&pAacDecoderChannelInfo->icsInfo)) {
393*e5436536SAndroid Build Coastguard Worker     maxBands = 64;
394*e5436536SAndroid Build Coastguard Worker     maxWindows = 1;
395*e5436536SAndroid Build Coastguard Worker   } else {
396*e5436536SAndroid Build Coastguard Worker     maxBands = 16;
397*e5436536SAndroid Build Coastguard Worker     maxWindows = 8;
398*e5436536SAndroid Build Coastguard Worker   }
399*e5436536SAndroid Build Coastguard Worker 
400*e5436536SAndroid Build Coastguard Worker   for (w = 0; w < maxWindows; w++) {
401*e5436536SAndroid Build Coastguard Worker     for (b = 0; b < maxSfb; b++) {
402*e5436536SAndroid Build Coastguard Worker       pCodeBook[b] = ESCBOOK;
403*e5436536SAndroid Build Coastguard Worker     }
404*e5436536SAndroid Build Coastguard Worker     for (; b < maxBands; b++) {
405*e5436536SAndroid Build Coastguard Worker       pCodeBook[b] = ZERO_HCB;
406*e5436536SAndroid Build Coastguard Worker     }
407*e5436536SAndroid Build Coastguard Worker     pCodeBook += maxBands;
408*e5436536SAndroid Build Coastguard Worker   }
409*e5436536SAndroid Build Coastguard Worker }
410*e5436536SAndroid Build Coastguard Worker 
411*e5436536SAndroid Build Coastguard Worker /*
412*e5436536SAndroid Build Coastguard Worker  * Arbitrary order bitstream parser
413*e5436536SAndroid Build Coastguard Worker  */
CChannelElement_Read(HANDLE_FDK_BITSTREAM hBs,CAacDecoderChannelInfo * pAacDecoderChannelInfo[],CAacDecoderStaticChannelInfo * pAacDecoderStaticChannelInfo[],const AUDIO_OBJECT_TYPE aot,SamplingRateInfo * pSamplingRateInfo,const UINT flags,const UINT elFlags,const UINT frame_length,const UCHAR numberOfChannels,const SCHAR epConfig,HANDLE_TRANSPORTDEC pTpDec)414*e5436536SAndroid Build Coastguard Worker AAC_DECODER_ERROR CChannelElement_Read(
415*e5436536SAndroid Build Coastguard Worker     HANDLE_FDK_BITSTREAM hBs, CAacDecoderChannelInfo *pAacDecoderChannelInfo[],
416*e5436536SAndroid Build Coastguard Worker     CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[],
417*e5436536SAndroid Build Coastguard Worker     const AUDIO_OBJECT_TYPE aot, SamplingRateInfo *pSamplingRateInfo,
418*e5436536SAndroid Build Coastguard Worker     const UINT flags, const UINT elFlags, const UINT frame_length,
419*e5436536SAndroid Build Coastguard Worker     const UCHAR numberOfChannels, const SCHAR epConfig,
420*e5436536SAndroid Build Coastguard Worker     HANDLE_TRANSPORTDEC pTpDec) {
421*e5436536SAndroid Build Coastguard Worker   AAC_DECODER_ERROR error = AAC_DEC_OK;
422*e5436536SAndroid Build Coastguard Worker   const element_list_t *list;
423*e5436536SAndroid Build Coastguard Worker   int i, ch, decision_bit;
424*e5436536SAndroid Build Coastguard Worker   int crcReg1 = -1, crcReg2 = -1;
425*e5436536SAndroid Build Coastguard Worker   int cplxPred;
426*e5436536SAndroid Build Coastguard Worker   int ind_sw_cce_flag = 0, num_gain_element_lists = 0;
427*e5436536SAndroid Build Coastguard Worker 
428*e5436536SAndroid Build Coastguard Worker   FDK_ASSERT((numberOfChannels == 1) || (numberOfChannels == 2));
429*e5436536SAndroid Build Coastguard Worker 
430*e5436536SAndroid Build Coastguard Worker   /* Get channel element sequence table */
431*e5436536SAndroid Build Coastguard Worker   list = getBitstreamElementList(aot, epConfig, numberOfChannels, 0, elFlags);
432*e5436536SAndroid Build Coastguard Worker   if (list == NULL) {
433*e5436536SAndroid Build Coastguard Worker     error = AAC_DEC_UNSUPPORTED_FORMAT;
434*e5436536SAndroid Build Coastguard Worker     goto bail;
435*e5436536SAndroid Build Coastguard Worker   }
436*e5436536SAndroid Build Coastguard Worker 
437*e5436536SAndroid Build Coastguard Worker   CTns_Reset(&pAacDecoderChannelInfo[0]->pDynData->TnsData);
438*e5436536SAndroid Build Coastguard Worker   /* Set common window to 0 by default. If signalized in the bit stream it will
439*e5436536SAndroid Build Coastguard Worker    * be overwritten later explicitely */
440*e5436536SAndroid Build Coastguard Worker   pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow = 0;
441*e5436536SAndroid Build Coastguard Worker   if (flags & (AC_USAC | AC_RSVD50 | AC_RSV603DA)) {
442*e5436536SAndroid Build Coastguard Worker     pAacDecoderChannelInfo[0]->pDynData->specificTo.usac.tns_active = 0;
443*e5436536SAndroid Build Coastguard Worker     pAacDecoderChannelInfo[0]->pDynData->specificTo.usac.tns_on_lr = 0;
444*e5436536SAndroid Build Coastguard Worker   }
445*e5436536SAndroid Build Coastguard Worker   if (numberOfChannels == 2) {
446*e5436536SAndroid Build Coastguard Worker     CTns_Reset(&pAacDecoderChannelInfo[1]->pDynData->TnsData);
447*e5436536SAndroid Build Coastguard Worker     pAacDecoderChannelInfo[1]->pDynData->RawDataInfo.CommonWindow = 0;
448*e5436536SAndroid Build Coastguard Worker   }
449*e5436536SAndroid Build Coastguard Worker 
450*e5436536SAndroid Build Coastguard Worker   cplxPred = 0;
451*e5436536SAndroid Build Coastguard Worker   if (pAacDecoderStaticChannelInfo != NULL) {
452*e5436536SAndroid Build Coastguard Worker     if (elFlags & AC_EL_USAC_CP_POSSIBLE) {
453*e5436536SAndroid Build Coastguard Worker       pAacDecoderChannelInfo[0]->pComData->jointStereoData.cplx_pred_flag = 0;
454*e5436536SAndroid Build Coastguard Worker       cplxPred = 1;
455*e5436536SAndroid Build Coastguard Worker     }
456*e5436536SAndroid Build Coastguard Worker   }
457*e5436536SAndroid Build Coastguard Worker 
458*e5436536SAndroid Build Coastguard Worker   if (0 || (flags & (AC_ELD | AC_SCALABLE))) {
459*e5436536SAndroid Build Coastguard Worker     pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow = 1;
460*e5436536SAndroid Build Coastguard Worker     if (numberOfChannels == 2) {
461*e5436536SAndroid Build Coastguard Worker       pAacDecoderChannelInfo[1]->pDynData->RawDataInfo.CommonWindow =
462*e5436536SAndroid Build Coastguard Worker           pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow;
463*e5436536SAndroid Build Coastguard Worker     }
464*e5436536SAndroid Build Coastguard Worker   }
465*e5436536SAndroid Build Coastguard Worker 
466*e5436536SAndroid Build Coastguard Worker   /* Iterate through sequence table */
467*e5436536SAndroid Build Coastguard Worker   i = 0;
468*e5436536SAndroid Build Coastguard Worker   ch = 0;
469*e5436536SAndroid Build Coastguard Worker   decision_bit = 0;
470*e5436536SAndroid Build Coastguard Worker   do {
471*e5436536SAndroid Build Coastguard Worker     switch (list->id[i]) {
472*e5436536SAndroid Build Coastguard Worker       case element_instance_tag:
473*e5436536SAndroid Build Coastguard Worker         pAacDecoderChannelInfo[0]->ElementInstanceTag = FDKreadBits(hBs, 4);
474*e5436536SAndroid Build Coastguard Worker         if (numberOfChannels == 2) {
475*e5436536SAndroid Build Coastguard Worker           pAacDecoderChannelInfo[1]->ElementInstanceTag =
476*e5436536SAndroid Build Coastguard Worker               pAacDecoderChannelInfo[0]->ElementInstanceTag;
477*e5436536SAndroid Build Coastguard Worker         }
478*e5436536SAndroid Build Coastguard Worker         break;
479*e5436536SAndroid Build Coastguard Worker       case common_window:
480*e5436536SAndroid Build Coastguard Worker         decision_bit =
481*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[ch]->pDynData->RawDataInfo.CommonWindow =
482*e5436536SAndroid Build Coastguard Worker                 FDKreadBits(hBs, 1);
483*e5436536SAndroid Build Coastguard Worker         if (numberOfChannels == 2) {
484*e5436536SAndroid Build Coastguard Worker           pAacDecoderChannelInfo[1]->pDynData->RawDataInfo.CommonWindow =
485*e5436536SAndroid Build Coastguard Worker               pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow;
486*e5436536SAndroid Build Coastguard Worker         }
487*e5436536SAndroid Build Coastguard Worker         break;
488*e5436536SAndroid Build Coastguard Worker       case ics_info:
489*e5436536SAndroid Build Coastguard Worker         /* store last window sequence (utilized in complex stereo prediction)
490*e5436536SAndroid Build Coastguard Worker          * before reading new channel-info */
491*e5436536SAndroid Build Coastguard Worker         if (cplxPred) {
492*e5436536SAndroid Build Coastguard Worker           if (pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow) {
493*e5436536SAndroid Build Coastguard Worker             pAacDecoderStaticChannelInfo[0]
494*e5436536SAndroid Build Coastguard Worker                 ->pCpeStaticData->jointStereoPersistentData.winSeqPrev =
495*e5436536SAndroid Build Coastguard Worker                 pAacDecoderChannelInfo[0]->icsInfo.WindowSequence;
496*e5436536SAndroid Build Coastguard Worker             pAacDecoderStaticChannelInfo[0]
497*e5436536SAndroid Build Coastguard Worker                 ->pCpeStaticData->jointStereoPersistentData.winShapePrev =
498*e5436536SAndroid Build Coastguard Worker                 pAacDecoderChannelInfo[0]->icsInfo.WindowShape;
499*e5436536SAndroid Build Coastguard Worker           }
500*e5436536SAndroid Build Coastguard Worker         }
501*e5436536SAndroid Build Coastguard Worker         /* Read individual channel info */
502*e5436536SAndroid Build Coastguard Worker         error = IcsRead(hBs, &pAacDecoderChannelInfo[ch]->icsInfo,
503*e5436536SAndroid Build Coastguard Worker                         pSamplingRateInfo, flags);
504*e5436536SAndroid Build Coastguard Worker 
505*e5436536SAndroid Build Coastguard Worker         if (elFlags & AC_EL_LFE &&
506*e5436536SAndroid Build Coastguard Worker             GetWindowSequence(&pAacDecoderChannelInfo[ch]->icsInfo) !=
507*e5436536SAndroid Build Coastguard Worker                 BLOCK_LONG) {
508*e5436536SAndroid Build Coastguard Worker           error = AAC_DEC_PARSE_ERROR;
509*e5436536SAndroid Build Coastguard Worker           break;
510*e5436536SAndroid Build Coastguard Worker         }
511*e5436536SAndroid Build Coastguard Worker 
512*e5436536SAndroid Build Coastguard Worker         if (numberOfChannels == 2 &&
513*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow) {
514*e5436536SAndroid Build Coastguard Worker           pAacDecoderChannelInfo[1]->icsInfo =
515*e5436536SAndroid Build Coastguard Worker               pAacDecoderChannelInfo[0]->icsInfo;
516*e5436536SAndroid Build Coastguard Worker         }
517*e5436536SAndroid Build Coastguard Worker         break;
518*e5436536SAndroid Build Coastguard Worker 
519*e5436536SAndroid Build Coastguard Worker       case common_max_sfb:
520*e5436536SAndroid Build Coastguard Worker         if (FDKreadBit(hBs) == 0) {
521*e5436536SAndroid Build Coastguard Worker           error = IcsReadMaxSfb(hBs, &pAacDecoderChannelInfo[1]->icsInfo,
522*e5436536SAndroid Build Coastguard Worker                                 pSamplingRateInfo);
523*e5436536SAndroid Build Coastguard Worker         }
524*e5436536SAndroid Build Coastguard Worker         break;
525*e5436536SAndroid Build Coastguard Worker 
526*e5436536SAndroid Build Coastguard Worker       case ltp_data_present:
527*e5436536SAndroid Build Coastguard Worker         if (FDKreadBits(hBs, 1) != 0) {
528*e5436536SAndroid Build Coastguard Worker           error = AAC_DEC_UNSUPPORTED_PREDICTION;
529*e5436536SAndroid Build Coastguard Worker         }
530*e5436536SAndroid Build Coastguard Worker         break;
531*e5436536SAndroid Build Coastguard Worker 
532*e5436536SAndroid Build Coastguard Worker       case ms:
533*e5436536SAndroid Build Coastguard Worker 
534*e5436536SAndroid Build Coastguard Worker         INT max_sfb_ste;
535*e5436536SAndroid Build Coastguard Worker         INT max_sfb_ste_clear;
536*e5436536SAndroid Build Coastguard Worker 
537*e5436536SAndroid Build Coastguard Worker         max_sfb_ste = GetScaleMaxFactorBandsTransmitted(
538*e5436536SAndroid Build Coastguard Worker             &pAacDecoderChannelInfo[0]->icsInfo,
539*e5436536SAndroid Build Coastguard Worker             &pAacDecoderChannelInfo[1]->icsInfo);
540*e5436536SAndroid Build Coastguard Worker 
541*e5436536SAndroid Build Coastguard Worker         max_sfb_ste_clear = 64;
542*e5436536SAndroid Build Coastguard Worker 
543*e5436536SAndroid Build Coastguard Worker         pAacDecoderChannelInfo[0]->icsInfo.max_sfb_ste = (UCHAR)max_sfb_ste;
544*e5436536SAndroid Build Coastguard Worker         pAacDecoderChannelInfo[1]->icsInfo.max_sfb_ste = (UCHAR)max_sfb_ste;
545*e5436536SAndroid Build Coastguard Worker 
546*e5436536SAndroid Build Coastguard Worker         if (flags & (AC_USAC | AC_RSV603DA) &&
547*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[ch]->pDynData->RawDataInfo.CommonWindow ==
548*e5436536SAndroid Build Coastguard Worker                 0) {
549*e5436536SAndroid Build Coastguard Worker           Clean_Complex_Prediction_coefficients(
550*e5436536SAndroid Build Coastguard Worker               &pAacDecoderStaticChannelInfo[0]
551*e5436536SAndroid Build Coastguard Worker                    ->pCpeStaticData->jointStereoPersistentData,
552*e5436536SAndroid Build Coastguard Worker               GetWindowGroups(&pAacDecoderChannelInfo[0]->icsInfo), 0, 64);
553*e5436536SAndroid Build Coastguard Worker         }
554*e5436536SAndroid Build Coastguard Worker 
555*e5436536SAndroid Build Coastguard Worker         if (CJointStereo_Read(
556*e5436536SAndroid Build Coastguard Worker                 hBs, &pAacDecoderChannelInfo[0]->pComData->jointStereoData,
557*e5436536SAndroid Build Coastguard Worker                 GetWindowGroups(&pAacDecoderChannelInfo[0]->icsInfo),
558*e5436536SAndroid Build Coastguard Worker                 max_sfb_ste, max_sfb_ste_clear,
559*e5436536SAndroid Build Coastguard Worker                 /* jointStereoPersistentData and cplxPredictionData are only
560*e5436536SAndroid Build Coastguard Worker                    available/allocated if cplxPred is active. */
561*e5436536SAndroid Build Coastguard Worker                 ((cplxPred == 0) || (pAacDecoderStaticChannelInfo == NULL))
562*e5436536SAndroid Build Coastguard Worker                     ? NULL
563*e5436536SAndroid Build Coastguard Worker                     : &pAacDecoderStaticChannelInfo[0]
564*e5436536SAndroid Build Coastguard Worker                            ->pCpeStaticData->jointStereoPersistentData,
565*e5436536SAndroid Build Coastguard Worker                 ((cplxPred == 0) || (pAacDecoderChannelInfo[0] == NULL))
566*e5436536SAndroid Build Coastguard Worker                     ? NULL
567*e5436536SAndroid Build Coastguard Worker                     : pAacDecoderChannelInfo[0]
568*e5436536SAndroid Build Coastguard Worker                           ->pComStaticData->cplxPredictionData,
569*e5436536SAndroid Build Coastguard Worker                 cplxPred,
570*e5436536SAndroid Build Coastguard Worker                 GetScaleFactorBandsTotal(&pAacDecoderChannelInfo[0]->icsInfo),
571*e5436536SAndroid Build Coastguard Worker                 GetWindowSequence(&pAacDecoderChannelInfo[0]->icsInfo),
572*e5436536SAndroid Build Coastguard Worker                 flags)) {
573*e5436536SAndroid Build Coastguard Worker           error = AAC_DEC_PARSE_ERROR;
574*e5436536SAndroid Build Coastguard Worker         }
575*e5436536SAndroid Build Coastguard Worker 
576*e5436536SAndroid Build Coastguard Worker         break;
577*e5436536SAndroid Build Coastguard Worker 
578*e5436536SAndroid Build Coastguard Worker       case global_gain:
579*e5436536SAndroid Build Coastguard Worker         pAacDecoderChannelInfo[ch]->pDynData->RawDataInfo.GlobalGain =
580*e5436536SAndroid Build Coastguard Worker             (UCHAR)FDKreadBits(hBs, 8);
581*e5436536SAndroid Build Coastguard Worker         break;
582*e5436536SAndroid Build Coastguard Worker 
583*e5436536SAndroid Build Coastguard Worker       case section_data:
584*e5436536SAndroid Build Coastguard Worker         error = CBlock_ReadSectionData(hBs, pAacDecoderChannelInfo[ch],
585*e5436536SAndroid Build Coastguard Worker                                        pSamplingRateInfo, flags);
586*e5436536SAndroid Build Coastguard Worker         break;
587*e5436536SAndroid Build Coastguard Worker 
588*e5436536SAndroid Build Coastguard Worker       case scale_factor_data_usac:
589*e5436536SAndroid Build Coastguard Worker         pAacDecoderChannelInfo[ch]->currAliasingSymmetry = 0;
590*e5436536SAndroid Build Coastguard Worker         /* Set active sfb codebook indexes to HCB_ESC to make them "active" */
591*e5436536SAndroid Build Coastguard Worker         CChannel_CodebookTableInit(
592*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[ch]); /*  equals ReadSectionData(self,
593*e5436536SAndroid Build Coastguard Worker                                             bs) in float soft. block.c
594*e5436536SAndroid Build Coastguard Worker                                             line: ~599 */
595*e5436536SAndroid Build Coastguard Worker         /* Note: The missing "break" is intentional here, since we need to call
596*e5436536SAndroid Build Coastguard Worker          * CBlock_ReadScaleFactorData(). */
597*e5436536SAndroid Build Coastguard Worker         FDK_FALLTHROUGH;
598*e5436536SAndroid Build Coastguard Worker 
599*e5436536SAndroid Build Coastguard Worker       case scale_factor_data:
600*e5436536SAndroid Build Coastguard Worker         if (flags & AC_ER_RVLC) {
601*e5436536SAndroid Build Coastguard Worker           /* read RVLC data from bitstream (error sens. cat. 1) */
602*e5436536SAndroid Build Coastguard Worker           CRvlc_Read(pAacDecoderChannelInfo[ch], hBs);
603*e5436536SAndroid Build Coastguard Worker         } else {
604*e5436536SAndroid Build Coastguard Worker           error = CBlock_ReadScaleFactorData(pAacDecoderChannelInfo[ch], hBs,
605*e5436536SAndroid Build Coastguard Worker                                              flags);
606*e5436536SAndroid Build Coastguard Worker         }
607*e5436536SAndroid Build Coastguard Worker         break;
608*e5436536SAndroid Build Coastguard Worker 
609*e5436536SAndroid Build Coastguard Worker       case pulse:
610*e5436536SAndroid Build Coastguard Worker         if (CPulseData_Read(
611*e5436536SAndroid Build Coastguard Worker                 hBs,
612*e5436536SAndroid Build Coastguard Worker                 &pAacDecoderChannelInfo[ch]->pDynData->specificTo.aac.PulseData,
613*e5436536SAndroid Build Coastguard Worker                 pSamplingRateInfo->ScaleFactorBands_Long, /* pulse data is only
614*e5436536SAndroid Build Coastguard Worker                                                              allowed to be
615*e5436536SAndroid Build Coastguard Worker                                                              present in long
616*e5436536SAndroid Build Coastguard Worker                                                              blocks! */
617*e5436536SAndroid Build Coastguard Worker                 (void *)&pAacDecoderChannelInfo[ch]->icsInfo,
618*e5436536SAndroid Build Coastguard Worker                 frame_length) != 0) {
619*e5436536SAndroid Build Coastguard Worker           error = AAC_DEC_DECODE_FRAME_ERROR;
620*e5436536SAndroid Build Coastguard Worker         }
621*e5436536SAndroid Build Coastguard Worker         break;
622*e5436536SAndroid Build Coastguard Worker       case tns_data_present:
623*e5436536SAndroid Build Coastguard Worker         CTns_ReadDataPresentFlag(
624*e5436536SAndroid Build Coastguard Worker             hBs, &pAacDecoderChannelInfo[ch]->pDynData->TnsData);
625*e5436536SAndroid Build Coastguard Worker         if (elFlags & AC_EL_LFE &&
626*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[ch]->pDynData->TnsData.DataPresent) {
627*e5436536SAndroid Build Coastguard Worker           error = AAC_DEC_PARSE_ERROR;
628*e5436536SAndroid Build Coastguard Worker         }
629*e5436536SAndroid Build Coastguard Worker         break;
630*e5436536SAndroid Build Coastguard Worker       case tns_data:
631*e5436536SAndroid Build Coastguard Worker         /* tns_data_present is checked inside CTns_Read(). */
632*e5436536SAndroid Build Coastguard Worker         error = CTns_Read(hBs, &pAacDecoderChannelInfo[ch]->pDynData->TnsData,
633*e5436536SAndroid Build Coastguard Worker                           &pAacDecoderChannelInfo[ch]->icsInfo, flags);
634*e5436536SAndroid Build Coastguard Worker 
635*e5436536SAndroid Build Coastguard Worker         break;
636*e5436536SAndroid Build Coastguard Worker 
637*e5436536SAndroid Build Coastguard Worker       case gain_control_data:
638*e5436536SAndroid Build Coastguard Worker         break;
639*e5436536SAndroid Build Coastguard Worker 
640*e5436536SAndroid Build Coastguard Worker       case gain_control_data_present:
641*e5436536SAndroid Build Coastguard Worker         if (FDKreadBits(hBs, 1)) {
642*e5436536SAndroid Build Coastguard Worker           error = AAC_DEC_UNSUPPORTED_GAIN_CONTROL_DATA;
643*e5436536SAndroid Build Coastguard Worker         }
644*e5436536SAndroid Build Coastguard Worker         break;
645*e5436536SAndroid Build Coastguard Worker 
646*e5436536SAndroid Build Coastguard Worker       case tw_data:
647*e5436536SAndroid Build Coastguard Worker         break;
648*e5436536SAndroid Build Coastguard Worker       case common_tw:
649*e5436536SAndroid Build Coastguard Worker         break;
650*e5436536SAndroid Build Coastguard Worker       case tns_data_present_usac:
651*e5436536SAndroid Build Coastguard Worker         if (pAacDecoderChannelInfo[0]->pDynData->specificTo.usac.tns_active) {
652*e5436536SAndroid Build Coastguard Worker           CTns_ReadDataPresentUsac(
653*e5436536SAndroid Build Coastguard Worker               hBs, &pAacDecoderChannelInfo[0]->pDynData->TnsData,
654*e5436536SAndroid Build Coastguard Worker               &pAacDecoderChannelInfo[1]->pDynData->TnsData,
655*e5436536SAndroid Build Coastguard Worker               &pAacDecoderChannelInfo[0]->pDynData->specificTo.usac.tns_on_lr,
656*e5436536SAndroid Build Coastguard Worker               &pAacDecoderChannelInfo[0]->icsInfo, flags, elFlags,
657*e5436536SAndroid Build Coastguard Worker               pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow);
658*e5436536SAndroid Build Coastguard Worker         } else {
659*e5436536SAndroid Build Coastguard Worker           pAacDecoderChannelInfo[0]->pDynData->specificTo.usac.tns_on_lr =
660*e5436536SAndroid Build Coastguard Worker               (UCHAR)1;
661*e5436536SAndroid Build Coastguard Worker         }
662*e5436536SAndroid Build Coastguard Worker         break;
663*e5436536SAndroid Build Coastguard Worker       case core_mode:
664*e5436536SAndroid Build Coastguard Worker         decision_bit = FDKreadBits(hBs, 1);
665*e5436536SAndroid Build Coastguard Worker         pAacDecoderChannelInfo[ch]->data.usac.core_mode = decision_bit;
666*e5436536SAndroid Build Coastguard Worker         if ((ch == 1) && (pAacDecoderChannelInfo[0]->data.usac.core_mode !=
667*e5436536SAndroid Build Coastguard Worker                           pAacDecoderChannelInfo[1]->data.usac.core_mode)) {
668*e5436536SAndroid Build Coastguard Worker           /* StereoCoreToolInfo(core_mode[ch] ) */
669*e5436536SAndroid Build Coastguard Worker           pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow = 0;
670*e5436536SAndroid Build Coastguard Worker           pAacDecoderChannelInfo[1]->pDynData->RawDataInfo.CommonWindow = 0;
671*e5436536SAndroid Build Coastguard Worker         }
672*e5436536SAndroid Build Coastguard Worker         break;
673*e5436536SAndroid Build Coastguard Worker       case tns_active:
674*e5436536SAndroid Build Coastguard Worker         pAacDecoderChannelInfo[0]->pDynData->specificTo.usac.tns_active =
675*e5436536SAndroid Build Coastguard Worker             FDKreadBit(hBs);
676*e5436536SAndroid Build Coastguard Worker         break;
677*e5436536SAndroid Build Coastguard Worker       case noise:
678*e5436536SAndroid Build Coastguard Worker         if (elFlags & AC_EL_USAC_NOISE) {
679*e5436536SAndroid Build Coastguard Worker           pAacDecoderChannelInfo[ch]
680*e5436536SAndroid Build Coastguard Worker               ->pDynData->specificTo.usac.fd_noise_level_and_offset =
681*e5436536SAndroid Build Coastguard Worker               FDKreadBits(hBs, 3 + 5); /* Noise level */
682*e5436536SAndroid Build Coastguard Worker         }
683*e5436536SAndroid Build Coastguard Worker         break;
684*e5436536SAndroid Build Coastguard Worker       case lpd_channel_stream:
685*e5436536SAndroid Build Coastguard Worker 
686*e5436536SAndroid Build Coastguard Worker       {
687*e5436536SAndroid Build Coastguard Worker         error = CLpdChannelStream_Read(/* = lpd_channel_stream() */
688*e5436536SAndroid Build Coastguard Worker                                        hBs, pAacDecoderChannelInfo[ch],
689*e5436536SAndroid Build Coastguard Worker                                        pAacDecoderStaticChannelInfo[ch],
690*e5436536SAndroid Build Coastguard Worker                                        pSamplingRateInfo, flags);
691*e5436536SAndroid Build Coastguard Worker       }
692*e5436536SAndroid Build Coastguard Worker 
693*e5436536SAndroid Build Coastguard Worker         pAacDecoderChannelInfo[ch]->renderMode = AACDEC_RENDER_LPD;
694*e5436536SAndroid Build Coastguard Worker         break;
695*e5436536SAndroid Build Coastguard Worker       case fac_data: {
696*e5436536SAndroid Build Coastguard Worker         int fFacDatPresent = FDKreadBit(hBs);
697*e5436536SAndroid Build Coastguard Worker 
698*e5436536SAndroid Build Coastguard Worker         /* Wee need a valid fac_data[0] even if no FAC data is present (as
699*e5436536SAndroid Build Coastguard Worker          * temporal buffer) */
700*e5436536SAndroid Build Coastguard Worker         pAacDecoderChannelInfo[ch]->data.usac.fac_data[0] =
701*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[ch]->data.usac.fac_data0;
702*e5436536SAndroid Build Coastguard Worker 
703*e5436536SAndroid Build Coastguard Worker         if (fFacDatPresent) {
704*e5436536SAndroid Build Coastguard Worker           if (elFlags & AC_EL_LFE) {
705*e5436536SAndroid Build Coastguard Worker             error = AAC_DEC_PARSE_ERROR;
706*e5436536SAndroid Build Coastguard Worker             break;
707*e5436536SAndroid Build Coastguard Worker           }
708*e5436536SAndroid Build Coastguard Worker           /* FAC data present, this frame is FD, so the last mode had to be
709*e5436536SAndroid Build Coastguard Worker            * ACELP. */
710*e5436536SAndroid Build Coastguard Worker           if (pAacDecoderStaticChannelInfo[ch]->last_core_mode != LPD ||
711*e5436536SAndroid Build Coastguard Worker               pAacDecoderStaticChannelInfo[ch]->last_lpd_mode != 0) {
712*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[ch]->data.usac.core_mode_last = LPD;
713*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[ch]->data.usac.lpd_mode_last = 0;
714*e5436536SAndroid Build Coastguard Worker             /* We can't change the past! So look to the future and go ahead! */
715*e5436536SAndroid Build Coastguard Worker           }
716*e5436536SAndroid Build Coastguard Worker           CLpd_FAC_Read(hBs, pAacDecoderChannelInfo[ch]->data.usac.fac_data[0],
717*e5436536SAndroid Build Coastguard Worker                         pAacDecoderChannelInfo[ch]->data.usac.fac_data_e,
718*e5436536SAndroid Build Coastguard Worker                         CLpd_FAC_getLength(
719*e5436536SAndroid Build Coastguard Worker                             IsLongBlock(&pAacDecoderChannelInfo[ch]->icsInfo),
720*e5436536SAndroid Build Coastguard Worker                             pAacDecoderChannelInfo[ch]->granuleLength),
721*e5436536SAndroid Build Coastguard Worker                         1, 0);
722*e5436536SAndroid Build Coastguard Worker         } else {
723*e5436536SAndroid Build Coastguard Worker           if (pAacDecoderStaticChannelInfo[ch]->last_core_mode == LPD &&
724*e5436536SAndroid Build Coastguard Worker               pAacDecoderStaticChannelInfo[ch]->last_lpd_mode == 0) {
725*e5436536SAndroid Build Coastguard Worker             /* ACELP to FD transitons without FAC are possible. That is why we
726*e5436536SAndroid Build Coastguard Worker             zero it out (i.e FAC will not be considered in the subsequent
727*e5436536SAndroid Build Coastguard Worker             calculations */
728*e5436536SAndroid Build Coastguard Worker             FDKmemclear(pAacDecoderChannelInfo[ch]->data.usac.fac_data0,
729*e5436536SAndroid Build Coastguard Worker                         LFAC * sizeof(FIXP_DBL));
730*e5436536SAndroid Build Coastguard Worker           }
731*e5436536SAndroid Build Coastguard Worker         }
732*e5436536SAndroid Build Coastguard Worker       } break;
733*e5436536SAndroid Build Coastguard Worker       case esc2_rvlc:
734*e5436536SAndroid Build Coastguard Worker         if (flags & AC_ER_RVLC) {
735*e5436536SAndroid Build Coastguard Worker           CRvlc_Decode(pAacDecoderChannelInfo[ch],
736*e5436536SAndroid Build Coastguard Worker                        pAacDecoderStaticChannelInfo[ch], hBs);
737*e5436536SAndroid Build Coastguard Worker         }
738*e5436536SAndroid Build Coastguard Worker         break;
739*e5436536SAndroid Build Coastguard Worker 
740*e5436536SAndroid Build Coastguard Worker       case esc1_hcr:
741*e5436536SAndroid Build Coastguard Worker         if (flags & AC_ER_HCR) {
742*e5436536SAndroid Build Coastguard Worker           CHcr_Read(hBs, pAacDecoderChannelInfo[ch],
743*e5436536SAndroid Build Coastguard Worker                     numberOfChannels == 2 ? ID_CPE : ID_SCE);
744*e5436536SAndroid Build Coastguard Worker         }
745*e5436536SAndroid Build Coastguard Worker         break;
746*e5436536SAndroid Build Coastguard Worker 
747*e5436536SAndroid Build Coastguard Worker       case spectral_data:
748*e5436536SAndroid Build Coastguard Worker         error = CBlock_ReadSpectralData(hBs, pAacDecoderChannelInfo[ch],
749*e5436536SAndroid Build Coastguard Worker                                         pSamplingRateInfo, flags);
750*e5436536SAndroid Build Coastguard Worker         if (flags & AC_ELD) {
751*e5436536SAndroid Build Coastguard Worker           pAacDecoderChannelInfo[ch]->renderMode = AACDEC_RENDER_ELDFB;
752*e5436536SAndroid Build Coastguard Worker         } else {
753*e5436536SAndroid Build Coastguard Worker           if (flags & AC_HDAAC) {
754*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[ch]->renderMode = AACDEC_RENDER_INTIMDCT;
755*e5436536SAndroid Build Coastguard Worker           } else {
756*e5436536SAndroid Build Coastguard Worker             pAacDecoderChannelInfo[ch]->renderMode = AACDEC_RENDER_IMDCT;
757*e5436536SAndroid Build Coastguard Worker           }
758*e5436536SAndroid Build Coastguard Worker         }
759*e5436536SAndroid Build Coastguard Worker         break;
760*e5436536SAndroid Build Coastguard Worker 
761*e5436536SAndroid Build Coastguard Worker       case ac_spectral_data:
762*e5436536SAndroid Build Coastguard Worker         error = CBlock_ReadAcSpectralData(
763*e5436536SAndroid Build Coastguard Worker             hBs, pAacDecoderChannelInfo[ch], pAacDecoderStaticChannelInfo[ch],
764*e5436536SAndroid Build Coastguard Worker             pSamplingRateInfo, frame_length, flags);
765*e5436536SAndroid Build Coastguard Worker         pAacDecoderChannelInfo[ch]->renderMode = AACDEC_RENDER_IMDCT;
766*e5436536SAndroid Build Coastguard Worker         break;
767*e5436536SAndroid Build Coastguard Worker 
768*e5436536SAndroid Build Coastguard Worker       case coupled_elements: {
769*e5436536SAndroid Build Coastguard Worker         int num_coupled_elements, c;
770*e5436536SAndroid Build Coastguard Worker 
771*e5436536SAndroid Build Coastguard Worker         ind_sw_cce_flag = FDKreadBit(hBs);
772*e5436536SAndroid Build Coastguard Worker         num_coupled_elements = FDKreadBits(hBs, 3);
773*e5436536SAndroid Build Coastguard Worker 
774*e5436536SAndroid Build Coastguard Worker         for (c = 0; c < (num_coupled_elements + 1); c++) {
775*e5436536SAndroid Build Coastguard Worker           int cc_target_is_cpe;
776*e5436536SAndroid Build Coastguard Worker 
777*e5436536SAndroid Build Coastguard Worker           num_gain_element_lists++;
778*e5436536SAndroid Build Coastguard Worker           cc_target_is_cpe = FDKreadBit(hBs); /* cc_target_is_cpe[c] */
779*e5436536SAndroid Build Coastguard Worker           FDKreadBits(hBs, 4);                /* cc_target_tag_select[c] */
780*e5436536SAndroid Build Coastguard Worker 
781*e5436536SAndroid Build Coastguard Worker           if (cc_target_is_cpe) {
782*e5436536SAndroid Build Coastguard Worker             int cc_l, cc_r;
783*e5436536SAndroid Build Coastguard Worker 
784*e5436536SAndroid Build Coastguard Worker             cc_l = FDKreadBit(hBs); /* cc_l[c] */
785*e5436536SAndroid Build Coastguard Worker             cc_r = FDKreadBit(hBs); /* cc_r[c] */
786*e5436536SAndroid Build Coastguard Worker 
787*e5436536SAndroid Build Coastguard Worker             if (cc_l && cc_r) {
788*e5436536SAndroid Build Coastguard Worker               num_gain_element_lists++;
789*e5436536SAndroid Build Coastguard Worker             }
790*e5436536SAndroid Build Coastguard Worker           }
791*e5436536SAndroid Build Coastguard Worker         }
792*e5436536SAndroid Build Coastguard Worker         FDKreadBit(hBs);     /* cc_domain */
793*e5436536SAndroid Build Coastguard Worker         FDKreadBit(hBs);     /* gain_element_sign  */
794*e5436536SAndroid Build Coastguard Worker         FDKreadBits(hBs, 2); /* gain_element_scale */
795*e5436536SAndroid Build Coastguard Worker       } break;
796*e5436536SAndroid Build Coastguard Worker 
797*e5436536SAndroid Build Coastguard Worker       case gain_element_lists: {
798*e5436536SAndroid Build Coastguard Worker         const CodeBookDescription *hcb;
799*e5436536SAndroid Build Coastguard Worker         UCHAR *pCodeBook;
800*e5436536SAndroid Build Coastguard Worker         int c;
801*e5436536SAndroid Build Coastguard Worker 
802*e5436536SAndroid Build Coastguard Worker         hcb = &AACcodeBookDescriptionTable[BOOKSCL];
803*e5436536SAndroid Build Coastguard Worker         pCodeBook = pAacDecoderChannelInfo[ch]->pDynData->aCodeBook;
804*e5436536SAndroid Build Coastguard Worker 
805*e5436536SAndroid Build Coastguard Worker         for (c = 1; c < num_gain_element_lists; c++) {
806*e5436536SAndroid Build Coastguard Worker           int cge;
807*e5436536SAndroid Build Coastguard Worker           if (ind_sw_cce_flag) {
808*e5436536SAndroid Build Coastguard Worker             cge = 1;
809*e5436536SAndroid Build Coastguard Worker           } else {
810*e5436536SAndroid Build Coastguard Worker             cge = FDKreadBits(hBs, 1); /* common_gain_element_present[c] */
811*e5436536SAndroid Build Coastguard Worker           }
812*e5436536SAndroid Build Coastguard Worker           if (cge) {
813*e5436536SAndroid Build Coastguard Worker             /* Huffman */
814*e5436536SAndroid Build Coastguard Worker             CBlock_DecodeHuffmanWord(
815*e5436536SAndroid Build Coastguard Worker                 hBs, hcb); /* hcod_sf[common_gain_element[c]] 1..19 */
816*e5436536SAndroid Build Coastguard Worker           } else {
817*e5436536SAndroid Build Coastguard Worker             int g, sfb;
818*e5436536SAndroid Build Coastguard Worker             for (g = 0;
819*e5436536SAndroid Build Coastguard Worker                  g < GetWindowGroups(&pAacDecoderChannelInfo[ch]->icsInfo);
820*e5436536SAndroid Build Coastguard Worker                  g++) {
821*e5436536SAndroid Build Coastguard Worker               for (sfb = 0; sfb < GetScaleFactorBandsTransmitted(
822*e5436536SAndroid Build Coastguard Worker                                       &pAacDecoderChannelInfo[ch]->icsInfo);
823*e5436536SAndroid Build Coastguard Worker                    sfb++) {
824*e5436536SAndroid Build Coastguard Worker                 if (pCodeBook[sfb] != ZERO_HCB) {
825*e5436536SAndroid Build Coastguard Worker                   /* Huffman */
826*e5436536SAndroid Build Coastguard Worker                   CBlock_DecodeHuffmanWord(
827*e5436536SAndroid Build Coastguard Worker                       hBs,
828*e5436536SAndroid Build Coastguard Worker                       hcb); /* hcod_sf[dpcm_gain_element[c][g][sfb]] 1..19 */
829*e5436536SAndroid Build Coastguard Worker                 }
830*e5436536SAndroid Build Coastguard Worker               }
831*e5436536SAndroid Build Coastguard Worker             }
832*e5436536SAndroid Build Coastguard Worker           }
833*e5436536SAndroid Build Coastguard Worker         }
834*e5436536SAndroid Build Coastguard Worker       } break;
835*e5436536SAndroid Build Coastguard Worker 
836*e5436536SAndroid Build Coastguard Worker         /* CRC handling */
837*e5436536SAndroid Build Coastguard Worker       case adtscrc_start_reg1:
838*e5436536SAndroid Build Coastguard Worker         if (pTpDec != NULL) {
839*e5436536SAndroid Build Coastguard Worker           crcReg1 = transportDec_CrcStartReg(pTpDec, 192);
840*e5436536SAndroid Build Coastguard Worker         }
841*e5436536SAndroid Build Coastguard Worker         break;
842*e5436536SAndroid Build Coastguard Worker       case adtscrc_start_reg2:
843*e5436536SAndroid Build Coastguard Worker         if (pTpDec != NULL) {
844*e5436536SAndroid Build Coastguard Worker           crcReg2 = transportDec_CrcStartReg(pTpDec, 128);
845*e5436536SAndroid Build Coastguard Worker         }
846*e5436536SAndroid Build Coastguard Worker         break;
847*e5436536SAndroid Build Coastguard Worker       case adtscrc_end_reg1:
848*e5436536SAndroid Build Coastguard Worker       case drmcrc_end_reg:
849*e5436536SAndroid Build Coastguard Worker         if (pTpDec != NULL) {
850*e5436536SAndroid Build Coastguard Worker           transportDec_CrcEndReg(pTpDec, crcReg1);
851*e5436536SAndroid Build Coastguard Worker           crcReg1 = -1;
852*e5436536SAndroid Build Coastguard Worker         }
853*e5436536SAndroid Build Coastguard Worker         break;
854*e5436536SAndroid Build Coastguard Worker       case adtscrc_end_reg2:
855*e5436536SAndroid Build Coastguard Worker         if (crcReg1 != -1) {
856*e5436536SAndroid Build Coastguard Worker           error = AAC_DEC_DECODE_FRAME_ERROR;
857*e5436536SAndroid Build Coastguard Worker         } else if (pTpDec != NULL) {
858*e5436536SAndroid Build Coastguard Worker           transportDec_CrcEndReg(pTpDec, crcReg2);
859*e5436536SAndroid Build Coastguard Worker           crcReg2 = -1;
860*e5436536SAndroid Build Coastguard Worker         }
861*e5436536SAndroid Build Coastguard Worker         break;
862*e5436536SAndroid Build Coastguard Worker       case drmcrc_start_reg:
863*e5436536SAndroid Build Coastguard Worker         if (pTpDec != NULL) {
864*e5436536SAndroid Build Coastguard Worker           crcReg1 = transportDec_CrcStartReg(pTpDec, 0);
865*e5436536SAndroid Build Coastguard Worker         }
866*e5436536SAndroid Build Coastguard Worker         break;
867*e5436536SAndroid Build Coastguard Worker 
868*e5436536SAndroid Build Coastguard Worker         /* Non data cases */
869*e5436536SAndroid Build Coastguard Worker       case next_channel:
870*e5436536SAndroid Build Coastguard Worker         ch = (ch + 1) % numberOfChannels;
871*e5436536SAndroid Build Coastguard Worker         break;
872*e5436536SAndroid Build Coastguard Worker       case link_sequence:
873*e5436536SAndroid Build Coastguard Worker         list = list->next[decision_bit];
874*e5436536SAndroid Build Coastguard Worker         i = -1;
875*e5436536SAndroid Build Coastguard Worker         break;
876*e5436536SAndroid Build Coastguard Worker 
877*e5436536SAndroid Build Coastguard Worker       default:
878*e5436536SAndroid Build Coastguard Worker         error = AAC_DEC_UNSUPPORTED_FORMAT;
879*e5436536SAndroid Build Coastguard Worker         break;
880*e5436536SAndroid Build Coastguard Worker     }
881*e5436536SAndroid Build Coastguard Worker 
882*e5436536SAndroid Build Coastguard Worker     if (error != AAC_DEC_OK) {
883*e5436536SAndroid Build Coastguard Worker       goto bail;
884*e5436536SAndroid Build Coastguard Worker     }
885*e5436536SAndroid Build Coastguard Worker 
886*e5436536SAndroid Build Coastguard Worker     i++;
887*e5436536SAndroid Build Coastguard Worker 
888*e5436536SAndroid Build Coastguard Worker   } while (list->id[i] != end_of_sequence);
889*e5436536SAndroid Build Coastguard Worker 
890*e5436536SAndroid Build Coastguard Worker   for (ch = 0; ch < numberOfChannels; ch++) {
891*e5436536SAndroid Build Coastguard Worker     if (pAacDecoderChannelInfo[ch]->renderMode == AACDEC_RENDER_IMDCT ||
892*e5436536SAndroid Build Coastguard Worker         pAacDecoderChannelInfo[ch]->renderMode == AACDEC_RENDER_ELDFB) {
893*e5436536SAndroid Build Coastguard Worker       /* Shows which bands are empty. */
894*e5436536SAndroid Build Coastguard Worker       UCHAR *band_is_noise =
895*e5436536SAndroid Build Coastguard Worker           pAacDecoderChannelInfo[ch]->pDynData->band_is_noise;
896*e5436536SAndroid Build Coastguard Worker       FDKmemset(band_is_noise, (UCHAR)1, sizeof(UCHAR) * (8 * 16));
897*e5436536SAndroid Build Coastguard Worker 
898*e5436536SAndroid Build Coastguard Worker       error = CBlock_InverseQuantizeSpectralData(
899*e5436536SAndroid Build Coastguard Worker           pAacDecoderChannelInfo[ch], pSamplingRateInfo, band_is_noise, 1);
900*e5436536SAndroid Build Coastguard Worker       if (error != AAC_DEC_OK) {
901*e5436536SAndroid Build Coastguard Worker         return error;
902*e5436536SAndroid Build Coastguard Worker       }
903*e5436536SAndroid Build Coastguard Worker 
904*e5436536SAndroid Build Coastguard Worker       if (elFlags & AC_EL_USAC_NOISE) {
905*e5436536SAndroid Build Coastguard Worker         CBlock_ApplyNoise(pAacDecoderChannelInfo[ch], pSamplingRateInfo,
906*e5436536SAndroid Build Coastguard Worker                           &pAacDecoderStaticChannelInfo[ch]->nfRandomSeed,
907*e5436536SAndroid Build Coastguard Worker                           band_is_noise);
908*e5436536SAndroid Build Coastguard Worker 
909*e5436536SAndroid Build Coastguard Worker       } /* if (elFlags & AC_EL_USAC_NOISE) */
910*e5436536SAndroid Build Coastguard Worker     }
911*e5436536SAndroid Build Coastguard Worker   }
912*e5436536SAndroid Build Coastguard Worker 
913*e5436536SAndroid Build Coastguard Worker bail:
914*e5436536SAndroid Build Coastguard Worker   if (crcReg1 != -1 || crcReg2 != -1) {
915*e5436536SAndroid Build Coastguard Worker     if (error == AAC_DEC_OK) {
916*e5436536SAndroid Build Coastguard Worker       error = AAC_DEC_DECODE_FRAME_ERROR;
917*e5436536SAndroid Build Coastguard Worker     }
918*e5436536SAndroid Build Coastguard Worker     if (crcReg1 != -1) {
919*e5436536SAndroid Build Coastguard Worker       transportDec_CrcEndReg(pTpDec, crcReg1);
920*e5436536SAndroid Build Coastguard Worker     }
921*e5436536SAndroid Build Coastguard Worker     if (crcReg2 != -1) {
922*e5436536SAndroid Build Coastguard Worker       transportDec_CrcEndReg(pTpDec, crcReg2);
923*e5436536SAndroid Build Coastguard Worker     }
924*e5436536SAndroid Build Coastguard Worker   }
925*e5436536SAndroid Build Coastguard Worker   return error;
926*e5436536SAndroid Build Coastguard Worker }
927