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