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 - 2018 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: individual channel stream info
100*e5436536SAndroid Build Coastguard Worker
101*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
102*e5436536SAndroid Build Coastguard Worker
103*e5436536SAndroid Build Coastguard Worker #ifndef CHANNELINFO_H
104*e5436536SAndroid Build Coastguard Worker #define CHANNELINFO_H
105*e5436536SAndroid Build Coastguard Worker
106*e5436536SAndroid Build Coastguard Worker #include "common_fix.h"
107*e5436536SAndroid Build Coastguard Worker
108*e5436536SAndroid Build Coastguard Worker #include "aac_rom.h"
109*e5436536SAndroid Build Coastguard Worker #include "aacdecoder_lib.h"
110*e5436536SAndroid Build Coastguard Worker #include "FDK_bitstream.h"
111*e5436536SAndroid Build Coastguard Worker #include "overlapadd.h"
112*e5436536SAndroid Build Coastguard Worker
113*e5436536SAndroid Build Coastguard Worker #include "mdct.h"
114*e5436536SAndroid Build Coastguard Worker #include "stereo.h"
115*e5436536SAndroid Build Coastguard Worker #include "pulsedata.h"
116*e5436536SAndroid Build Coastguard Worker #include "aacdec_tns.h"
117*e5436536SAndroid Build Coastguard Worker
118*e5436536SAndroid Build Coastguard Worker #include "aacdec_pns.h"
119*e5436536SAndroid Build Coastguard Worker
120*e5436536SAndroid Build Coastguard Worker #include "aacdec_hcr_types.h"
121*e5436536SAndroid Build Coastguard Worker #include "rvlc_info.h"
122*e5436536SAndroid Build Coastguard Worker
123*e5436536SAndroid Build Coastguard Worker #include "usacdec_acelp.h"
124*e5436536SAndroid Build Coastguard Worker #include "usacdec_const.h"
125*e5436536SAndroid Build Coastguard Worker #include "usacdec_rom.h"
126*e5436536SAndroid Build Coastguard Worker
127*e5436536SAndroid Build Coastguard Worker #include "ac_arith_coder.h"
128*e5436536SAndroid Build Coastguard Worker
129*e5436536SAndroid Build Coastguard Worker #include "conceal_types.h"
130*e5436536SAndroid Build Coastguard Worker
131*e5436536SAndroid Build Coastguard Worker #include "aacdec_drc_types.h"
132*e5436536SAndroid Build Coastguard Worker
133*e5436536SAndroid Build Coastguard Worker #define WB_SECTION_SIZE (1024 * 2)
134*e5436536SAndroid Build Coastguard Worker
135*e5436536SAndroid Build Coastguard Worker #define DRM_BS_BUFFER_SIZE \
136*e5436536SAndroid Build Coastguard Worker (512) /* size of the dynamic buffer which is used to reverse the bits of \
137*e5436536SAndroid Build Coastguard Worker the DRM SBR payload */
138*e5436536SAndroid Build Coastguard Worker
139*e5436536SAndroid Build Coastguard Worker /* Output rendering mode */
140*e5436536SAndroid Build Coastguard Worker typedef enum {
141*e5436536SAndroid Build Coastguard Worker AACDEC_RENDER_INVALID = 0,
142*e5436536SAndroid Build Coastguard Worker AACDEC_RENDER_IMDCT,
143*e5436536SAndroid Build Coastguard Worker AACDEC_RENDER_ELDFB,
144*e5436536SAndroid Build Coastguard Worker AACDEC_RENDER_LPD,
145*e5436536SAndroid Build Coastguard Worker AACDEC_RENDER_INTIMDCT
146*e5436536SAndroid Build Coastguard Worker } AACDEC_RENDER_MODE;
147*e5436536SAndroid Build Coastguard Worker
148*e5436536SAndroid Build Coastguard Worker enum { MAX_QUANTIZED_VALUE = 8191 };
149*e5436536SAndroid Build Coastguard Worker
150*e5436536SAndroid Build Coastguard Worker typedef enum { FD_LONG, FD_SHORT, LPD } USAC_COREMODE;
151*e5436536SAndroid Build Coastguard Worker
152*e5436536SAndroid Build Coastguard Worker typedef struct {
153*e5436536SAndroid Build Coastguard Worker const SHORT *ScaleFactorBands_Long;
154*e5436536SAndroid Build Coastguard Worker const SHORT *ScaleFactorBands_Short;
155*e5436536SAndroid Build Coastguard Worker UCHAR NumberOfScaleFactorBands_Long;
156*e5436536SAndroid Build Coastguard Worker UCHAR NumberOfScaleFactorBands_Short;
157*e5436536SAndroid Build Coastguard Worker UINT samplingRateIndex;
158*e5436536SAndroid Build Coastguard Worker UINT samplingRate;
159*e5436536SAndroid Build Coastguard Worker } SamplingRateInfo;
160*e5436536SAndroid Build Coastguard Worker
161*e5436536SAndroid Build Coastguard Worker typedef struct {
162*e5436536SAndroid Build Coastguard Worker UCHAR CommonWindow;
163*e5436536SAndroid Build Coastguard Worker UCHAR GlobalGain;
164*e5436536SAndroid Build Coastguard Worker
165*e5436536SAndroid Build Coastguard Worker } CRawDataInfo;
166*e5436536SAndroid Build Coastguard Worker
167*e5436536SAndroid Build Coastguard Worker typedef struct {
168*e5436536SAndroid Build Coastguard Worker UCHAR WindowGroupLength[8];
169*e5436536SAndroid Build Coastguard Worker UCHAR WindowGroups;
170*e5436536SAndroid Build Coastguard Worker UCHAR Valid;
171*e5436536SAndroid Build Coastguard Worker
172*e5436536SAndroid Build Coastguard Worker UCHAR WindowShape; /* 0: sine window, 1: KBD, 2: low overlap */
173*e5436536SAndroid Build Coastguard Worker BLOCK_TYPE WindowSequence; /* mdct.h; 0: long, 1: start, 2: short, 3: stop */
174*e5436536SAndroid Build Coastguard Worker UCHAR MaxSfBands;
175*e5436536SAndroid Build Coastguard Worker UCHAR max_sfb_ste;
176*e5436536SAndroid Build Coastguard Worker UCHAR ScaleFactorGrouping;
177*e5436536SAndroid Build Coastguard Worker
178*e5436536SAndroid Build Coastguard Worker UCHAR TotalSfBands;
179*e5436536SAndroid Build Coastguard Worker
180*e5436536SAndroid Build Coastguard Worker } CIcsInfo;
181*e5436536SAndroid Build Coastguard Worker
182*e5436536SAndroid Build Coastguard Worker enum {
183*e5436536SAndroid Build Coastguard Worker ZERO_HCB = 0,
184*e5436536SAndroid Build Coastguard Worker ESCBOOK = 11,
185*e5436536SAndroid Build Coastguard Worker NSPECBOOKS = ESCBOOK + 1,
186*e5436536SAndroid Build Coastguard Worker BOOKSCL = NSPECBOOKS,
187*e5436536SAndroid Build Coastguard Worker NOISE_HCB = 13,
188*e5436536SAndroid Build Coastguard Worker INTENSITY_HCB2 = 14,
189*e5436536SAndroid Build Coastguard Worker INTENSITY_HCB = 15,
190*e5436536SAndroid Build Coastguard Worker LAST_HCB
191*e5436536SAndroid Build Coastguard Worker };
192*e5436536SAndroid Build Coastguard Worker
193*e5436536SAndroid Build Coastguard Worker /* This struct holds the persistent data shared by both channels of a CPE.
194*e5436536SAndroid Build Coastguard Worker It needs to be allocated for each CPE. */
195*e5436536SAndroid Build Coastguard Worker typedef struct {
196*e5436536SAndroid Build Coastguard Worker CJointStereoPersistentData jointStereoPersistentData;
197*e5436536SAndroid Build Coastguard Worker } CpePersistentData;
198*e5436536SAndroid Build Coastguard Worker
199*e5436536SAndroid Build Coastguard Worker /*
200*e5436536SAndroid Build Coastguard Worker * This struct must be allocated one for every channel and must be persistent.
201*e5436536SAndroid Build Coastguard Worker */
202*e5436536SAndroid Build Coastguard Worker typedef struct {
203*e5436536SAndroid Build Coastguard Worker FIXP_DBL *pOverlapBuffer;
204*e5436536SAndroid Build Coastguard Worker mdct_t IMdct;
205*e5436536SAndroid Build Coastguard Worker
206*e5436536SAndroid Build Coastguard Worker CArcoData *hArCo;
207*e5436536SAndroid Build Coastguard Worker
208*e5436536SAndroid Build Coastguard Worker INT pnsCurrentSeed;
209*e5436536SAndroid Build Coastguard Worker
210*e5436536SAndroid Build Coastguard Worker /* LPD memory */
211*e5436536SAndroid Build Coastguard Worker FIXP_DBL old_synth[PIT_MAX_MAX - L_SUBFR];
212*e5436536SAndroid Build Coastguard Worker INT old_T_pf[SYN_SFD];
213*e5436536SAndroid Build Coastguard Worker FIXP_DBL old_gain_pf[SYN_SFD];
214*e5436536SAndroid Build Coastguard Worker FIXP_DBL mem_bpf[L_FILT + L_SUBFR];
215*e5436536SAndroid Build Coastguard Worker UCHAR
216*e5436536SAndroid Build Coastguard Worker old_bpf_control_info; /* (1: enable, 0: disable) bpf for past superframe
217*e5436536SAndroid Build Coastguard Worker */
218*e5436536SAndroid Build Coastguard Worker
219*e5436536SAndroid Build Coastguard Worker USAC_COREMODE last_core_mode; /* core mode used by the decoder in previous
220*e5436536SAndroid Build Coastguard Worker frame. (not signalled by the bitstream, see
221*e5436536SAndroid Build Coastguard Worker CAacDecoderChannelInfo::core_mode_last !! )
222*e5436536SAndroid Build Coastguard Worker */
223*e5436536SAndroid Build Coastguard Worker UCHAR last_lpd_mode; /* LPD mode used by the decoder in last LPD subframe
224*e5436536SAndroid Build Coastguard Worker (not signalled by the bitstream, see
225*e5436536SAndroid Build Coastguard Worker CAacDecoderChannelInfo::lpd_mode_last !! ) */
226*e5436536SAndroid Build Coastguard Worker UCHAR last_last_lpd_mode; /* LPD mode used in second last LPD subframe
227*e5436536SAndroid Build Coastguard Worker (not signalled by the bitstream) */
228*e5436536SAndroid Build Coastguard Worker UCHAR last_lpc_lost; /* Flag indicating that the previous LPC is lost */
229*e5436536SAndroid Build Coastguard Worker
230*e5436536SAndroid Build Coastguard Worker FIXP_LPC
231*e5436536SAndroid Build Coastguard Worker lpc4_lsf[M_LP_FILTER_ORDER]; /* Last LPC4 coefficients in LSF domain. */
232*e5436536SAndroid Build Coastguard Worker FIXP_LPC lsf_adaptive_mean[M_LP_FILTER_ORDER]; /* Adaptive mean of LPC
233*e5436536SAndroid Build Coastguard Worker coefficients in LSF domain
234*e5436536SAndroid Build Coastguard Worker for concealment. */
235*e5436536SAndroid Build Coastguard Worker FIXP_LPC lp_coeff_old[2][M_LP_FILTER_ORDER]; /* Last LPC coefficients in LP
236*e5436536SAndroid Build Coastguard Worker domain. lp_coeff_old[0] is lpc4 (coeffs for
237*e5436536SAndroid Build Coastguard Worker right folding point of last tcx frame),
238*e5436536SAndroid Build Coastguard Worker lp_coeff_old[1] are coeffs for left folding
239*e5436536SAndroid Build Coastguard Worker point of last tcx frame */
240*e5436536SAndroid Build Coastguard Worker INT lp_coeff_old_exp[2];
241*e5436536SAndroid Build Coastguard Worker
242*e5436536SAndroid Build Coastguard Worker FIXP_SGL
243*e5436536SAndroid Build Coastguard Worker oldStability; /* LPC coeff stability value from last frame (required for
244*e5436536SAndroid Build Coastguard Worker TCX concealment). */
245*e5436536SAndroid Build Coastguard Worker UINT numLostLpdFrames; /* Number of consecutive lost subframes. */
246*e5436536SAndroid Build Coastguard Worker
247*e5436536SAndroid Build Coastguard Worker /* TCX memory */
248*e5436536SAndroid Build Coastguard Worker FIXP_DBL last_tcx_gain;
249*e5436536SAndroid Build Coastguard Worker INT last_tcx_gain_e;
250*e5436536SAndroid Build Coastguard Worker FIXP_DBL last_alfd_gains[32]; /* Scaled by one bit. */
251*e5436536SAndroid Build Coastguard Worker SHORT last_tcx_pitch;
252*e5436536SAndroid Build Coastguard Worker UCHAR last_tcx_noise_factor;
253*e5436536SAndroid Build Coastguard Worker
254*e5436536SAndroid Build Coastguard Worker /* ACELP memory */
255*e5436536SAndroid Build Coastguard Worker CAcelpStaticMem acelp;
256*e5436536SAndroid Build Coastguard Worker
257*e5436536SAndroid Build Coastguard Worker ULONG nfRandomSeed; /* seed value for USAC noise filling random generator */
258*e5436536SAndroid Build Coastguard Worker
259*e5436536SAndroid Build Coastguard Worker CDrcChannelData drcData;
260*e5436536SAndroid Build Coastguard Worker CConcealmentInfo concealmentInfo;
261*e5436536SAndroid Build Coastguard Worker
262*e5436536SAndroid Build Coastguard Worker CpePersistentData *pCpeStaticData;
263*e5436536SAndroid Build Coastguard Worker
264*e5436536SAndroid Build Coastguard Worker } CAacDecoderStaticChannelInfo;
265*e5436536SAndroid Build Coastguard Worker
266*e5436536SAndroid Build Coastguard Worker /*
267*e5436536SAndroid Build Coastguard Worker * This union must be allocated for every element (up to 2 channels).
268*e5436536SAndroid Build Coastguard Worker */
269*e5436536SAndroid Build Coastguard Worker typedef struct {
270*e5436536SAndroid Build Coastguard Worker /* Common bit stream data */
271*e5436536SAndroid Build Coastguard Worker SHORT aScaleFactor[(
272*e5436536SAndroid Build Coastguard Worker 8 * 16)]; /* Spectral scale factors for each sfb in each window. */
273*e5436536SAndroid Build Coastguard Worker SHORT aSfbScale[(8 * 16)]; /* could be free after ApplyTools() */
274*e5436536SAndroid Build Coastguard Worker UCHAR
275*e5436536SAndroid Build Coastguard Worker aCodeBook[(8 * 16)]; /* section data: codebook for each window and sfb. */
276*e5436536SAndroid Build Coastguard Worker UCHAR band_is_noise[(8 * 16)];
277*e5436536SAndroid Build Coastguard Worker CTnsData TnsData;
278*e5436536SAndroid Build Coastguard Worker CRawDataInfo RawDataInfo;
279*e5436536SAndroid Build Coastguard Worker
280*e5436536SAndroid Build Coastguard Worker shouldBeUnion {
281*e5436536SAndroid Build Coastguard Worker struct {
282*e5436536SAndroid Build Coastguard Worker CPulseData PulseData;
283*e5436536SAndroid Build Coastguard Worker SHORT aNumLineInSec4Hcr[MAX_SFB_HCR]; /* needed once for all channels
284*e5436536SAndroid Build Coastguard Worker except for Drm syntax */
285*e5436536SAndroid Build Coastguard Worker UCHAR
286*e5436536SAndroid Build Coastguard Worker aCodeBooks4Hcr[MAX_SFB_HCR]; /* needed once for all channels except for
287*e5436536SAndroid Build Coastguard Worker Drm syntax. Same as "aCodeBook" ? */
288*e5436536SAndroid Build Coastguard Worker SHORT lenOfReorderedSpectralData;
289*e5436536SAndroid Build Coastguard Worker SCHAR lenOfLongestCodeword;
290*e5436536SAndroid Build Coastguard Worker SCHAR numberSection;
291*e5436536SAndroid Build Coastguard Worker SCHAR rvlcCurrentScaleFactorOK;
292*e5436536SAndroid Build Coastguard Worker SCHAR rvlcIntensityUsed;
293*e5436536SAndroid Build Coastguard Worker } aac;
294*e5436536SAndroid Build Coastguard Worker struct {
295*e5436536SAndroid Build Coastguard Worker UCHAR fd_noise_level_and_offset;
296*e5436536SAndroid Build Coastguard Worker UCHAR tns_active;
297*e5436536SAndroid Build Coastguard Worker UCHAR tns_on_lr;
298*e5436536SAndroid Build Coastguard Worker UCHAR tcx_noise_factor[4];
299*e5436536SAndroid Build Coastguard Worker UCHAR tcx_global_gain[4];
300*e5436536SAndroid Build Coastguard Worker } usac;
301*e5436536SAndroid Build Coastguard Worker }
302*e5436536SAndroid Build Coastguard Worker specificTo;
303*e5436536SAndroid Build Coastguard Worker
304*e5436536SAndroid Build Coastguard Worker } CAacDecoderDynamicData;
305*e5436536SAndroid Build Coastguard Worker
306*e5436536SAndroid Build Coastguard Worker typedef shouldBeUnion {
307*e5436536SAndroid Build Coastguard Worker UCHAR DrmBsBuffer[DRM_BS_BUFFER_SIZE];
308*e5436536SAndroid Build Coastguard Worker
309*e5436536SAndroid Build Coastguard Worker /* Common signal data, can be used once the bit stream data from above is not
310*e5436536SAndroid Build Coastguard Worker * used anymore. */
311*e5436536SAndroid Build Coastguard Worker FIXP_DBL mdctOutTemp[1024];
312*e5436536SAndroid Build Coastguard Worker
313*e5436536SAndroid Build Coastguard Worker FIXP_DBL synth_buf[(PIT_MAX_MAX + SYN_DELAY + L_FRAME_PLUS)];
314*e5436536SAndroid Build Coastguard Worker
315*e5436536SAndroid Build Coastguard Worker FIXP_DBL workBuffer[WB_SECTION_SIZE];
316*e5436536SAndroid Build Coastguard Worker }
317*e5436536SAndroid Build Coastguard Worker CWorkBufferCore1;
318*e5436536SAndroid Build Coastguard Worker
319*e5436536SAndroid Build Coastguard Worker /* Common data referenced by all channels */
320*e5436536SAndroid Build Coastguard Worker typedef struct {
321*e5436536SAndroid Build Coastguard Worker CAacDecoderDynamicData pAacDecoderDynamicData[2];
322*e5436536SAndroid Build Coastguard Worker
323*e5436536SAndroid Build Coastguard Worker CPnsInterChannelData pnsInterChannelData;
324*e5436536SAndroid Build Coastguard Worker INT pnsRandomSeed[(8 * 16)];
325*e5436536SAndroid Build Coastguard Worker
326*e5436536SAndroid Build Coastguard Worker CJointStereoData jointStereoData; /* One for one element */
327*e5436536SAndroid Build Coastguard Worker
328*e5436536SAndroid Build Coastguard Worker shouldBeUnion {
329*e5436536SAndroid Build Coastguard Worker struct {
330*e5436536SAndroid Build Coastguard Worker CErHcrInfo erHcrInfo;
331*e5436536SAndroid Build Coastguard Worker CErRvlcInfo erRvlcInfo;
332*e5436536SAndroid Build Coastguard Worker SHORT aRvlcScfEsc[RVLC_MAX_SFB]; /* needed once for all channels */
333*e5436536SAndroid Build Coastguard Worker SHORT aRvlcScfFwd[RVLC_MAX_SFB]; /* needed once for all channels */
334*e5436536SAndroid Build Coastguard Worker SHORT aRvlcScfBwd[RVLC_MAX_SFB]; /* needed once for all channels */
335*e5436536SAndroid Build Coastguard Worker } aac;
336*e5436536SAndroid Build Coastguard Worker }
337*e5436536SAndroid Build Coastguard Worker overlay;
338*e5436536SAndroid Build Coastguard Worker
339*e5436536SAndroid Build Coastguard Worker } CAacDecoderCommonData;
340*e5436536SAndroid Build Coastguard Worker
341*e5436536SAndroid Build Coastguard Worker typedef struct {
342*e5436536SAndroid Build Coastguard Worker CWorkBufferCore1 *pWorkBufferCore1;
343*e5436536SAndroid Build Coastguard Worker CCplxPredictionData *cplxPredictionData;
344*e5436536SAndroid Build Coastguard Worker } CAacDecoderCommonStaticData;
345*e5436536SAndroid Build Coastguard Worker
346*e5436536SAndroid Build Coastguard Worker /*
347*e5436536SAndroid Build Coastguard Worker * This struct must be allocated one for every channel of every element and must
348*e5436536SAndroid Build Coastguard Worker * be persistent. Among its members, the following memory areas can be
349*e5436536SAndroid Build Coastguard Worker * overwritten under the given conditions:
350*e5436536SAndroid Build Coastguard Worker * - pSpectralCoefficient The memory pointed to can be overwritten after time
351*e5436536SAndroid Build Coastguard Worker * signal rendering.
352*e5436536SAndroid Build Coastguard Worker * - data can be overwritten after time signal rendering.
353*e5436536SAndroid Build Coastguard Worker * - pDynData memory pointed to can be overwritten after each
354*e5436536SAndroid Build Coastguard Worker * CChannelElement_Decode() call.
355*e5436536SAndroid Build Coastguard Worker * - pComData->overlay memory pointed to can be overwritten after each
356*e5436536SAndroid Build Coastguard Worker * CChannelElement_Decode() call..
357*e5436536SAndroid Build Coastguard Worker */
358*e5436536SAndroid Build Coastguard Worker typedef struct {
359*e5436536SAndroid Build Coastguard Worker shouldBeUnion {
360*e5436536SAndroid Build Coastguard Worker struct {
361*e5436536SAndroid Build Coastguard Worker FIXP_DBL fac_data0[LFAC];
362*e5436536SAndroid Build Coastguard Worker SCHAR fac_data_e[4];
363*e5436536SAndroid Build Coastguard Worker FIXP_DBL
364*e5436536SAndroid Build Coastguard Worker *fac_data[4]; /* Pointers to unused parts of pSpectralCoefficient */
365*e5436536SAndroid Build Coastguard Worker
366*e5436536SAndroid Build Coastguard Worker UCHAR core_mode; /* current core mode */
367*e5436536SAndroid Build Coastguard Worker USAC_COREMODE
368*e5436536SAndroid Build Coastguard Worker core_mode_last; /* previous core mode, signalled in the bitstream
369*e5436536SAndroid Build Coastguard Worker (not done by the decoder, see
370*e5436536SAndroid Build Coastguard Worker CAacDecoderStaticChannelInfo::last_core_mode !!)*/
371*e5436536SAndroid Build Coastguard Worker UCHAR lpd_mode_last; /* previous LPD mode, signalled in the bitstream
372*e5436536SAndroid Build Coastguard Worker (not done by the decoder, see
373*e5436536SAndroid Build Coastguard Worker CAacDecoderStaticChannelInfo::last_core_mode !!)*/
374*e5436536SAndroid Build Coastguard Worker UCHAR mod[4];
375*e5436536SAndroid Build Coastguard Worker UCHAR bpf_control_info; /* (1: enable, 0: disable) bpf for current
376*e5436536SAndroid Build Coastguard Worker superframe */
377*e5436536SAndroid Build Coastguard Worker
378*e5436536SAndroid Build Coastguard Worker FIXP_LPC lsp_coeff[5][M_LP_FILTER_ORDER]; /* linear prediction
379*e5436536SAndroid Build Coastguard Worker coefficients in LSP domain */
380*e5436536SAndroid Build Coastguard Worker FIXP_LPC
381*e5436536SAndroid Build Coastguard Worker lp_coeff[5][M_LP_FILTER_ORDER]; /* linear prediction coefficients in
382*e5436536SAndroid Build Coastguard Worker LP domain */
383*e5436536SAndroid Build Coastguard Worker INT lp_coeff_exp[5];
384*e5436536SAndroid Build Coastguard Worker FIXP_LPC lsf_adaptive_mean_cand
385*e5436536SAndroid Build Coastguard Worker [M_LP_FILTER_ORDER]; /* concealment: is copied to
386*e5436536SAndroid Build Coastguard Worker CAacDecoderStaticChannelInfo->lsf_adaptive_mean once frame is
387*e5436536SAndroid Build Coastguard Worker assumed to be correct*/
388*e5436536SAndroid Build Coastguard Worker FIXP_SGL aStability[4]; /* LPC coeff stability values required for ACELP
389*e5436536SAndroid Build Coastguard Worker and TCX (concealment) */
390*e5436536SAndroid Build Coastguard Worker
391*e5436536SAndroid Build Coastguard Worker CAcelpChannelData acelp[4];
392*e5436536SAndroid Build Coastguard Worker
393*e5436536SAndroid Build Coastguard Worker FIXP_DBL tcx_gain[4];
394*e5436536SAndroid Build Coastguard Worker SCHAR tcx_gain_e[4];
395*e5436536SAndroid Build Coastguard Worker } usac;
396*e5436536SAndroid Build Coastguard Worker
397*e5436536SAndroid Build Coastguard Worker struct {
398*e5436536SAndroid Build Coastguard Worker CPnsData PnsData; /* Not required for USAC */
399*e5436536SAndroid Build Coastguard Worker } aac;
400*e5436536SAndroid Build Coastguard Worker }
401*e5436536SAndroid Build Coastguard Worker data;
402*e5436536SAndroid Build Coastguard Worker
403*e5436536SAndroid Build Coastguard Worker SPECTRAL_PTR pSpectralCoefficient; /* Spectral coefficients of each window */
404*e5436536SAndroid Build Coastguard Worker SHORT specScale[8]; /* Scale shift values of each spectrum window */
405*e5436536SAndroid Build Coastguard Worker CIcsInfo icsInfo;
406*e5436536SAndroid Build Coastguard Worker INT granuleLength; /* Size of smallest spectrum piece */
407*e5436536SAndroid Build Coastguard Worker UCHAR ElementInstanceTag;
408*e5436536SAndroid Build Coastguard Worker
409*e5436536SAndroid Build Coastguard Worker AACDEC_RENDER_MODE renderMode; /* Output signal rendering mode */
410*e5436536SAndroid Build Coastguard Worker
411*e5436536SAndroid Build Coastguard Worker CAacDecoderDynamicData *
412*e5436536SAndroid Build Coastguard Worker pDynData; /* Data required for one element and discarded after decoding */
413*e5436536SAndroid Build Coastguard Worker CAacDecoderCommonData
414*e5436536SAndroid Build Coastguard Worker *pComData; /* Data required for one channel at a time during decode */
415*e5436536SAndroid Build Coastguard Worker CAacDecoderCommonStaticData *pComStaticData; /* Persistent data required for
416*e5436536SAndroid Build Coastguard Worker one channel at a time during
417*e5436536SAndroid Build Coastguard Worker decode */
418*e5436536SAndroid Build Coastguard Worker
419*e5436536SAndroid Build Coastguard Worker int currAliasingSymmetry; /* required for RSVD60 MCT */
420*e5436536SAndroid Build Coastguard Worker
421*e5436536SAndroid Build Coastguard Worker } CAacDecoderChannelInfo;
422*e5436536SAndroid Build Coastguard Worker
423*e5436536SAndroid Build Coastguard Worker /* channelinfo.cpp */
424*e5436536SAndroid Build Coastguard Worker
425*e5436536SAndroid Build Coastguard Worker AAC_DECODER_ERROR getSamplingRateInfo(SamplingRateInfo *t, UINT samplesPerFrame,
426*e5436536SAndroid Build Coastguard Worker UINT samplingRateIndex,
427*e5436536SAndroid Build Coastguard Worker UINT samplingRate);
428*e5436536SAndroid Build Coastguard Worker
429*e5436536SAndroid Build Coastguard Worker /**
430*e5436536SAndroid Build Coastguard Worker * \brief Read max SFB from bit stream and assign TotalSfBands according
431*e5436536SAndroid Build Coastguard Worker * to the window sequence and sample rate.
432*e5436536SAndroid Build Coastguard Worker * \param hBs bit stream handle as data source
433*e5436536SAndroid Build Coastguard Worker * \param pIcsInfo IcsInfo structure to read the window sequence and store
434*e5436536SAndroid Build Coastguard Worker * MaxSfBands and TotalSfBands
435*e5436536SAndroid Build Coastguard Worker * \param pSamplingRateInfo read only
436*e5436536SAndroid Build Coastguard Worker */
437*e5436536SAndroid Build Coastguard Worker AAC_DECODER_ERROR IcsReadMaxSfb(HANDLE_FDK_BITSTREAM hBs, CIcsInfo *pIcsInfo,
438*e5436536SAndroid Build Coastguard Worker const SamplingRateInfo *pSamplingRateInfo);
439*e5436536SAndroid Build Coastguard Worker
440*e5436536SAndroid Build Coastguard Worker AAC_DECODER_ERROR IcsRead(HANDLE_FDK_BITSTREAM bs, CIcsInfo *pIcsInfo,
441*e5436536SAndroid Build Coastguard Worker const SamplingRateInfo *SamplingRateInfoTable,
442*e5436536SAndroid Build Coastguard Worker const UINT flags);
443*e5436536SAndroid Build Coastguard Worker
444*e5436536SAndroid Build Coastguard Worker /* stereo.cpp, only called from this file */
445*e5436536SAndroid Build Coastguard Worker
446*e5436536SAndroid Build Coastguard Worker /*!
447*e5436536SAndroid Build Coastguard Worker \brief Applies MS stereo.
448*e5436536SAndroid Build Coastguard Worker
449*e5436536SAndroid Build Coastguard Worker The function applies MS stereo.
450*e5436536SAndroid Build Coastguard Worker
451*e5436536SAndroid Build Coastguard Worker \param pAacDecoderChannelInfo aac channel info.
452*e5436536SAndroid Build Coastguard Worker \param pScaleFactorBandOffsets pointer to scalefactor band offsets.
453*e5436536SAndroid Build Coastguard Worker \param pWindowGroupLength pointer to window group length array.
454*e5436536SAndroid Build Coastguard Worker \param windowGroups number of window groups.
455*e5436536SAndroid Build Coastguard Worker \param scaleFactorBandsTransmittedL number of transmitted scalefactor bands in
456*e5436536SAndroid Build Coastguard Worker left channel. \param scaleFactorBandsTransmittedR number of transmitted
457*e5436536SAndroid Build Coastguard Worker scalefactor bands in right channel. May differ from
458*e5436536SAndroid Build Coastguard Worker scaleFactorBandsTransmittedL only for USAC. \return none
459*e5436536SAndroid Build Coastguard Worker */
460*e5436536SAndroid Build Coastguard Worker void CJointStereo_ApplyMS(
461*e5436536SAndroid Build Coastguard Worker CAacDecoderChannelInfo *pAacDecoderChannelInfo[2],
462*e5436536SAndroid Build Coastguard Worker CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[2],
463*e5436536SAndroid Build Coastguard Worker FIXP_DBL *spectrumL, FIXP_DBL *spectrumR, SHORT *SFBleftScale,
464*e5436536SAndroid Build Coastguard Worker SHORT *SFBrightScale, SHORT *specScaleL, SHORT *specScaleR,
465*e5436536SAndroid Build Coastguard Worker const SHORT *pScaleFactorBandOffsets, const UCHAR *pWindowGroupLength,
466*e5436536SAndroid Build Coastguard Worker const int windowGroups, const int max_sfb_ste_outside,
467*e5436536SAndroid Build Coastguard Worker const int scaleFactorBandsTransmittedL,
468*e5436536SAndroid Build Coastguard Worker const int scaleFactorBandsTransmittedR, FIXP_DBL *store_dmx_re_prev,
469*e5436536SAndroid Build Coastguard Worker SHORT *store_dmx_re_prev_e, const int mainband_flag);
470*e5436536SAndroid Build Coastguard Worker
471*e5436536SAndroid Build Coastguard Worker /*!
472*e5436536SAndroid Build Coastguard Worker \brief Applies intensity stereo
473*e5436536SAndroid Build Coastguard Worker
474*e5436536SAndroid Build Coastguard Worker The function applies intensity stereo.
475*e5436536SAndroid Build Coastguard Worker
476*e5436536SAndroid Build Coastguard Worker \param pAacDecoderChannelInfo aac channel info.
477*e5436536SAndroid Build Coastguard Worker \param pScaleFactorBandOffsets pointer to scalefactor band offsets.
478*e5436536SAndroid Build Coastguard Worker \param pWindowGroupLength pointer to window group length array.
479*e5436536SAndroid Build Coastguard Worker \param windowGroups number of window groups.
480*e5436536SAndroid Build Coastguard Worker \param scaleFactorBandsTransmitted number of transmitted scalefactor bands.
481*e5436536SAndroid Build Coastguard Worker \return none
482*e5436536SAndroid Build Coastguard Worker */
483*e5436536SAndroid Build Coastguard Worker void CJointStereo_ApplyIS(CAacDecoderChannelInfo *pAacDecoderChannelInfo[2],
484*e5436536SAndroid Build Coastguard Worker const short *pScaleFactorBandOffsets,
485*e5436536SAndroid Build Coastguard Worker const UCHAR *pWindowGroupLength,
486*e5436536SAndroid Build Coastguard Worker const int windowGroups,
487*e5436536SAndroid Build Coastguard Worker const int scaleFactorBandsTransmitted);
488*e5436536SAndroid Build Coastguard Worker
489*e5436536SAndroid Build Coastguard Worker /* aacdec_pns.cpp */
490*e5436536SAndroid Build Coastguard Worker int CPns_IsPnsUsed(const CPnsData *pPnsData, const int group, const int band);
491*e5436536SAndroid Build Coastguard Worker
492*e5436536SAndroid Build Coastguard Worker void CPns_SetCorrelation(CPnsData *pPnsData, const int group, const int band,
493*e5436536SAndroid Build Coastguard Worker const int outofphase);
494*e5436536SAndroid Build Coastguard Worker
495*e5436536SAndroid Build Coastguard Worker /****************** inline functions ******************/
496*e5436536SAndroid Build Coastguard Worker
IsValid(const CIcsInfo * pIcsInfo)497*e5436536SAndroid Build Coastguard Worker inline UCHAR IsValid(const CIcsInfo *pIcsInfo) { return pIcsInfo->Valid; }
498*e5436536SAndroid Build Coastguard Worker
IsLongBlock(const CIcsInfo * pIcsInfo)499*e5436536SAndroid Build Coastguard Worker inline UCHAR IsLongBlock(const CIcsInfo *pIcsInfo) {
500*e5436536SAndroid Build Coastguard Worker return (pIcsInfo->WindowSequence != BLOCK_SHORT);
501*e5436536SAndroid Build Coastguard Worker }
502*e5436536SAndroid Build Coastguard Worker
GetWindowShape(const CIcsInfo * pIcsInfo)503*e5436536SAndroid Build Coastguard Worker inline UCHAR GetWindowShape(const CIcsInfo *pIcsInfo) {
504*e5436536SAndroid Build Coastguard Worker return pIcsInfo->WindowShape;
505*e5436536SAndroid Build Coastguard Worker }
506*e5436536SAndroid Build Coastguard Worker
GetWindowSequence(const CIcsInfo * pIcsInfo)507*e5436536SAndroid Build Coastguard Worker inline BLOCK_TYPE GetWindowSequence(const CIcsInfo *pIcsInfo) {
508*e5436536SAndroid Build Coastguard Worker return pIcsInfo->WindowSequence;
509*e5436536SAndroid Build Coastguard Worker }
510*e5436536SAndroid Build Coastguard Worker
GetScaleFactorBandOffsets(const CIcsInfo * pIcsInfo,const SamplingRateInfo * samplingRateInfo)511*e5436536SAndroid Build Coastguard Worker inline const SHORT *GetScaleFactorBandOffsets(
512*e5436536SAndroid Build Coastguard Worker const CIcsInfo *pIcsInfo, const SamplingRateInfo *samplingRateInfo) {
513*e5436536SAndroid Build Coastguard Worker if (IsLongBlock(pIcsInfo)) {
514*e5436536SAndroid Build Coastguard Worker return samplingRateInfo->ScaleFactorBands_Long;
515*e5436536SAndroid Build Coastguard Worker } else {
516*e5436536SAndroid Build Coastguard Worker return samplingRateInfo->ScaleFactorBands_Short;
517*e5436536SAndroid Build Coastguard Worker }
518*e5436536SAndroid Build Coastguard Worker }
519*e5436536SAndroid Build Coastguard Worker
GetNumberOfScaleFactorBands(const CIcsInfo * pIcsInfo,const SamplingRateInfo * samplingRateInfo)520*e5436536SAndroid Build Coastguard Worker inline UCHAR GetNumberOfScaleFactorBands(
521*e5436536SAndroid Build Coastguard Worker const CIcsInfo *pIcsInfo, const SamplingRateInfo *samplingRateInfo) {
522*e5436536SAndroid Build Coastguard Worker if (IsLongBlock(pIcsInfo)) {
523*e5436536SAndroid Build Coastguard Worker return samplingRateInfo->NumberOfScaleFactorBands_Long;
524*e5436536SAndroid Build Coastguard Worker } else {
525*e5436536SAndroid Build Coastguard Worker return samplingRateInfo->NumberOfScaleFactorBands_Short;
526*e5436536SAndroid Build Coastguard Worker }
527*e5436536SAndroid Build Coastguard Worker }
528*e5436536SAndroid Build Coastguard Worker
GetWindowsPerFrame(const CIcsInfo * pIcsInfo)529*e5436536SAndroid Build Coastguard Worker inline int GetWindowsPerFrame(const CIcsInfo *pIcsInfo) {
530*e5436536SAndroid Build Coastguard Worker return (pIcsInfo->WindowSequence == BLOCK_SHORT) ? 8 : 1;
531*e5436536SAndroid Build Coastguard Worker }
532*e5436536SAndroid Build Coastguard Worker
GetWindowGroups(const CIcsInfo * pIcsInfo)533*e5436536SAndroid Build Coastguard Worker inline UCHAR GetWindowGroups(const CIcsInfo *pIcsInfo) {
534*e5436536SAndroid Build Coastguard Worker return pIcsInfo->WindowGroups;
535*e5436536SAndroid Build Coastguard Worker }
536*e5436536SAndroid Build Coastguard Worker
GetWindowGroupLength(const CIcsInfo * pIcsInfo,const INT index)537*e5436536SAndroid Build Coastguard Worker inline UCHAR GetWindowGroupLength(const CIcsInfo *pIcsInfo, const INT index) {
538*e5436536SAndroid Build Coastguard Worker return pIcsInfo->WindowGroupLength[index];
539*e5436536SAndroid Build Coastguard Worker }
540*e5436536SAndroid Build Coastguard Worker
GetWindowGroupLengthTable(const CIcsInfo * pIcsInfo)541*e5436536SAndroid Build Coastguard Worker inline const UCHAR *GetWindowGroupLengthTable(const CIcsInfo *pIcsInfo) {
542*e5436536SAndroid Build Coastguard Worker return pIcsInfo->WindowGroupLength;
543*e5436536SAndroid Build Coastguard Worker }
544*e5436536SAndroid Build Coastguard Worker
GetScaleFactorBandsTransmitted(const CIcsInfo * pIcsInfo)545*e5436536SAndroid Build Coastguard Worker inline UCHAR GetScaleFactorBandsTransmitted(const CIcsInfo *pIcsInfo) {
546*e5436536SAndroid Build Coastguard Worker return pIcsInfo->MaxSfBands;
547*e5436536SAndroid Build Coastguard Worker }
548*e5436536SAndroid Build Coastguard Worker
GetScaleMaxFactorBandsTransmitted(const CIcsInfo * pIcsInfo0,const CIcsInfo * pIcsInfo1)549*e5436536SAndroid Build Coastguard Worker inline UCHAR GetScaleMaxFactorBandsTransmitted(const CIcsInfo *pIcsInfo0,
550*e5436536SAndroid Build Coastguard Worker const CIcsInfo *pIcsInfo1) {
551*e5436536SAndroid Build Coastguard Worker return fMax(pIcsInfo0->MaxSfBands, pIcsInfo1->MaxSfBands);
552*e5436536SAndroid Build Coastguard Worker }
553*e5436536SAndroid Build Coastguard Worker
GetScaleFactorBandsTotal(const CIcsInfo * pIcsInfo)554*e5436536SAndroid Build Coastguard Worker inline UCHAR GetScaleFactorBandsTotal(const CIcsInfo *pIcsInfo) {
555*e5436536SAndroid Build Coastguard Worker return pIcsInfo->TotalSfBands;
556*e5436536SAndroid Build Coastguard Worker }
557*e5436536SAndroid Build Coastguard Worker
558*e5436536SAndroid Build Coastguard Worker /* Note: This function applies to AAC-LC only ! */
GetMaximumTnsBands(const CIcsInfo * pIcsInfo,const int samplingRateIndex)559*e5436536SAndroid Build Coastguard Worker inline UCHAR GetMaximumTnsBands(const CIcsInfo *pIcsInfo,
560*e5436536SAndroid Build Coastguard Worker const int samplingRateIndex) {
561*e5436536SAndroid Build Coastguard Worker return tns_max_bands_tbl[samplingRateIndex][!IsLongBlock(pIcsInfo)];
562*e5436536SAndroid Build Coastguard Worker }
563*e5436536SAndroid Build Coastguard Worker
564*e5436536SAndroid Build Coastguard Worker #endif /* #ifndef CHANNELINFO_H */
565