• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* -----------------------------------------------------------------------------
2 Software License for The Fraunhofer FDK AAC Codec Library for Android
3 
4 © Copyright  1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
5 Forschung e.V. All rights reserved.
6 
7  1.    INTRODUCTION
8 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9 that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10 scheme for digital audio. This FDK AAC Codec software is intended to be used on
11 a wide variety of Android devices.
12 
13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14 general perceptual audio codecs. AAC-ELD is considered the best-performing
15 full-bandwidth communications codec by independent studies and is widely
16 deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17 specifications.
18 
19 Patent licenses for necessary patent claims for the FDK AAC Codec (including
20 those of Fraunhofer) may be obtained through Via Licensing
21 (www.vialicensing.com) or through the respective patent owners individually for
22 the purpose of encoding or decoding bit streams in products that are compliant
23 with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24 Android devices already license these patent claims through Via Licensing or
25 directly from the patent owners, and therefore FDK AAC Codec software may
26 already be covered under those patent licenses when it is used for those
27 licensed purposes only.
28 
29 Commercially-licensed AAC software libraries, including floating-point versions
30 with enhanced sound quality, are also available from Fraunhofer. Users are
31 encouraged to check the Fraunhofer website for additional applications
32 information and documentation.
33 
34 2.    COPYRIGHT LICENSE
35 
36 Redistribution and use in source and binary forms, with or without modification,
37 are permitted without payment of copyright license fees provided that you
38 satisfy the following conditions:
39 
40 You must retain the complete text of this software license in redistributions of
41 the FDK AAC Codec or your modifications thereto in source code form.
42 
43 You must retain the complete text of this software license in the documentation
44 and/or other materials provided with redistributions of the FDK AAC Codec or
45 your modifications thereto in binary form. You must make available free of
46 charge copies of the complete source code of the FDK AAC Codec and your
47 modifications thereto to recipients of copies in binary form.
48 
49 The name of Fraunhofer may not be used to endorse or promote products derived
50 from this library without prior written permission.
51 
52 You may not charge copyright license fees for anyone to use, copy or distribute
53 the FDK AAC Codec software or your modifications thereto.
54 
55 Your modified versions of the FDK AAC Codec must carry prominent notices stating
56 that you changed the software and the date of any change. For modified versions
57 of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58 must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59 AAC Codec Library for Android."
60 
61 3.    NO PATENT LICENSE
62 
63 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64 limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65 Fraunhofer provides no warranty of patent non-infringement with respect to this
66 software.
67 
68 You may use this FDK AAC Codec software or modifications thereto only for
69 purposes that are authorized by appropriate patent licenses.
70 
71 4.    DISCLAIMER
72 
73 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74 holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75 including but not limited to the implied warranties of merchantability and
76 fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78 or consequential damages, including but not limited to procurement of substitute
79 goods or services; loss of use, data, or profits, or business interruption,
80 however caused and on any theory of liability, whether in contract, strict
81 liability, or tort (including negligence), arising in any way out of the use of
82 this software, even if advised of the possibility of such damage.
83 
84 5.    CONTACT INFORMATION
85 
86 Fraunhofer Institute for Integrated Circuits IIS
87 Attention: Audio and Multimedia Departments - FDK AAC LL
88 Am Wolfsmantel 33
89 91058 Erlangen, Germany
90 
91 www.iis.fraunhofer.de/amm
92 amm-info@iis.fraunhofer.de
93 ----------------------------------------------------------------------------- */
94 
95 /**************************** AAC decoder library ******************************
96 
97    Author(s):   Josef Hoepfl
98 
99    Description: individual channel stream info
100 
101 *******************************************************************************/
102 
103 #ifndef CHANNELINFO_H
104 #define CHANNELINFO_H
105 
106 #include "common_fix.h"
107 
108 #include "aac_rom.h"
109 #include "aacdecoder_lib.h"
110 #include "FDK_bitstream.h"
111 #include "overlapadd.h"
112 
113 #include "mdct.h"
114 #include "stereo.h"
115 #include "pulsedata.h"
116 #include "aacdec_tns.h"
117 
118 #include "aacdec_pns.h"
119 
120 #include "aacdec_hcr_types.h"
121 #include "rvlc_info.h"
122 
123 #include "usacdec_acelp.h"
124 #include "usacdec_const.h"
125 #include "usacdec_rom.h"
126 
127 #include "ac_arith_coder.h"
128 
129 #include "conceal_types.h"
130 
131 #include "aacdec_drc_types.h"
132 
133 #define WB_SECTION_SIZE (1024 * 2)
134 
135 #define DRM_BS_BUFFER_SIZE                                                 \
136   (512) /* size of the dynamic buffer which is used to reverse the bits of \
137            the DRM SBR payload */
138 
139 /* Output rendering mode */
140 typedef enum {
141   AACDEC_RENDER_INVALID = 0,
142   AACDEC_RENDER_IMDCT,
143   AACDEC_RENDER_ELDFB,
144   AACDEC_RENDER_LPD,
145   AACDEC_RENDER_INTIMDCT
146 } AACDEC_RENDER_MODE;
147 
148 enum { MAX_QUANTIZED_VALUE = 8191 };
149 
150 typedef enum { FD_LONG, FD_SHORT, LPD } USAC_COREMODE;
151 
152 typedef struct {
153   const SHORT *ScaleFactorBands_Long;
154   const SHORT *ScaleFactorBands_Short;
155   UCHAR NumberOfScaleFactorBands_Long;
156   UCHAR NumberOfScaleFactorBands_Short;
157   UINT samplingRateIndex;
158   UINT samplingRate;
159 } SamplingRateInfo;
160 
161 typedef struct {
162   UCHAR CommonWindow;
163   UCHAR GlobalGain;
164 
165 } CRawDataInfo;
166 
167 typedef struct {
168   UCHAR WindowGroupLength[8];
169   UCHAR WindowGroups;
170   UCHAR Valid;
171 
172   UCHAR WindowShape;         /* 0: sine window, 1: KBD, 2: low overlap */
173   BLOCK_TYPE WindowSequence; /* mdct.h; 0: long, 1: start, 2: short, 3: stop */
174   UCHAR MaxSfBands;
175   UCHAR max_sfb_ste;
176   UCHAR ScaleFactorGrouping;
177 
178   UCHAR TotalSfBands;
179 
180 } CIcsInfo;
181 
182 enum {
183   ZERO_HCB = 0,
184   ESCBOOK = 11,
185   NSPECBOOKS = ESCBOOK + 1,
186   BOOKSCL = NSPECBOOKS,
187   NOISE_HCB = 13,
188   INTENSITY_HCB2 = 14,
189   INTENSITY_HCB = 15,
190   LAST_HCB
191 };
192 
193 /* This struct holds the persistent data shared by both channels of a CPE.
194    It needs to be allocated for each CPE. */
195 typedef struct {
196   CJointStereoPersistentData jointStereoPersistentData;
197 } CpePersistentData;
198 
199 /*
200  * This struct must be allocated one for every channel and must be persistent.
201  */
202 typedef struct {
203   FIXP_DBL *pOverlapBuffer;
204   mdct_t IMdct;
205 
206   CArcoData *hArCo;
207 
208   INT pnsCurrentSeed;
209 
210   /* LPD memory */
211   FIXP_DBL old_synth[PIT_MAX_MAX - L_SUBFR];
212   INT old_T_pf[SYN_SFD];
213   FIXP_DBL old_gain_pf[SYN_SFD];
214   FIXP_DBL mem_bpf[L_FILT + L_SUBFR];
215   UCHAR
216   old_bpf_control_info; /* (1: enable, 0: disable) bpf for past superframe
217                          */
218 
219   USAC_COREMODE last_core_mode; /* core mode used by the decoder in previous
220                                    frame. (not signalled by the bitstream, see
221                                    CAacDecoderChannelInfo::core_mode_last !! )
222                                  */
223   UCHAR last_lpd_mode;      /* LPD mode used by the decoder in last LPD subframe
224                                 (not signalled by the bitstream, see
225                                CAacDecoderChannelInfo::lpd_mode_last !! ) */
226   UCHAR last_last_lpd_mode; /* LPD mode used in second last LPD subframe
227                                 (not signalled by the bitstream) */
228   UCHAR last_lpc_lost;      /* Flag indicating that the previous LPC is lost */
229 
230   FIXP_LPC
231   lpc4_lsf[M_LP_FILTER_ORDER]; /* Last LPC4 coefficients in LSF domain. */
232   FIXP_LPC lsf_adaptive_mean[M_LP_FILTER_ORDER]; /* Adaptive mean of LPC
233                                                     coefficients in LSF domain
234                                                     for concealment. */
235   FIXP_LPC lp_coeff_old[2][M_LP_FILTER_ORDER];   /* Last LPC coefficients in LP
236                                     domain. lp_coeff_old[0] is lpc4 (coeffs for
237                                     right folding point of last tcx frame),
238                                     lp_coeff_old[1] are coeffs for left folding
239                                     point of last tcx frame */
240   INT lp_coeff_old_exp[2];
241 
242   FIXP_SGL
243   oldStability; /* LPC coeff stability value from last frame (required for
244                    TCX concealment). */
245   UINT numLostLpdFrames; /* Number of consecutive lost subframes. */
246 
247   /* TCX memory */
248   FIXP_DBL last_tcx_gain;
249   INT last_tcx_gain_e;
250   FIXP_DBL last_alfd_gains[32]; /* Scaled by one bit. */
251   SHORT last_tcx_pitch;
252   UCHAR last_tcx_noise_factor;
253 
254   /* ACELP memory */
255   CAcelpStaticMem acelp;
256 
257   ULONG nfRandomSeed; /* seed value for USAC noise filling random generator */
258 
259   CDrcChannelData drcData;
260   CConcealmentInfo concealmentInfo;
261 
262   CpePersistentData *pCpeStaticData;
263 
264 } CAacDecoderStaticChannelInfo;
265 
266 /*
267  * This union must be allocated for every element (up to 2 channels).
268  */
269 typedef struct {
270   /* Common bit stream data */
271   SHORT aScaleFactor[(
272       8 * 16)]; /* Spectral scale factors for each sfb in each window. */
273   SHORT aSfbScale[(8 * 16)]; /* could be free after ApplyTools() */
274   UCHAR
275   aCodeBook[(8 * 16)]; /* section data: codebook for each window and sfb. */
276   UCHAR band_is_noise[(8 * 16)];
277   CTnsData TnsData;
278   CRawDataInfo RawDataInfo;
279 
280   shouldBeUnion {
281     struct {
282       CPulseData PulseData;
283       SHORT aNumLineInSec4Hcr[MAX_SFB_HCR]; /* needed once for all channels
284                                                except for Drm syntax */
285       UCHAR
286       aCodeBooks4Hcr[MAX_SFB_HCR]; /* needed once for all channels except for
287                                       Drm syntax. Same as "aCodeBook" ? */
288       SHORT lenOfReorderedSpectralData;
289       SCHAR lenOfLongestCodeword;
290       SCHAR numberSection;
291       SCHAR rvlcCurrentScaleFactorOK;
292       SCHAR rvlcIntensityUsed;
293     } aac;
294     struct {
295       UCHAR fd_noise_level_and_offset;
296       UCHAR tns_active;
297       UCHAR tns_on_lr;
298       UCHAR tcx_noise_factor[4];
299       UCHAR tcx_global_gain[4];
300     } usac;
301   }
302   specificTo;
303 
304 } CAacDecoderDynamicData;
305 
306 typedef shouldBeUnion {
307   UCHAR DrmBsBuffer[DRM_BS_BUFFER_SIZE];
308 
309   /* Common signal data, can be used once the bit stream data from above is not
310    * used anymore. */
311   FIXP_DBL mdctOutTemp[1024];
312 
313   FIXP_DBL synth_buf[(PIT_MAX_MAX + SYN_DELAY + L_FRAME_PLUS)];
314 
315   FIXP_DBL workBuffer[WB_SECTION_SIZE];
316 }
317 CWorkBufferCore1;
318 
319 /* Common data referenced by all channels */
320 typedef struct {
321   CAacDecoderDynamicData pAacDecoderDynamicData[2];
322 
323   CPnsInterChannelData pnsInterChannelData;
324   INT pnsRandomSeed[(8 * 16)];
325 
326   CJointStereoData jointStereoData; /* One for one element */
327 
328   shouldBeUnion {
329     struct {
330       CErHcrInfo erHcrInfo;
331       CErRvlcInfo erRvlcInfo;
332       SHORT aRvlcScfEsc[RVLC_MAX_SFB]; /* needed once for all channels */
333       SHORT aRvlcScfFwd[RVLC_MAX_SFB]; /* needed once for all channels */
334       SHORT aRvlcScfBwd[RVLC_MAX_SFB]; /* needed once for all channels */
335     } aac;
336   }
337   overlay;
338 
339 } CAacDecoderCommonData;
340 
341 typedef struct {
342   CWorkBufferCore1 *pWorkBufferCore1;
343   CCplxPredictionData *cplxPredictionData;
344 } CAacDecoderCommonStaticData;
345 
346 /*
347  * This struct must be allocated one for every channel of every element and must
348  * be persistent. Among its members, the following memory areas can be
349  * overwritten under the given conditions:
350  *  - pSpectralCoefficient The memory pointed to can be overwritten after time
351  * signal rendering.
352  *  - data can be overwritten after time signal rendering.
353  *  - pDynData memory pointed to can be overwritten after each
354  * CChannelElement_Decode() call.
355  *  - pComData->overlay memory pointed to can be overwritten after each
356  * CChannelElement_Decode() call..
357  */
358 typedef struct {
359   shouldBeUnion {
360     struct {
361       FIXP_DBL fac_data0[LFAC];
362       SCHAR fac_data_e[4];
363       FIXP_DBL
364       *fac_data[4]; /* Pointers to unused parts of pSpectralCoefficient */
365 
366       UCHAR core_mode; /* current core mode */
367       USAC_COREMODE
368       core_mode_last;      /* previous core mode, signalled in the bitstream
369                               (not done by the decoder, see
370                               CAacDecoderStaticChannelInfo::last_core_mode !!)*/
371       UCHAR lpd_mode_last; /* previous LPD mode, signalled in the bitstream
372                               (not done by the decoder, see
373                               CAacDecoderStaticChannelInfo::last_core_mode !!)*/
374       UCHAR mod[4];
375       UCHAR bpf_control_info; /* (1: enable, 0: disable) bpf for current
376                                  superframe */
377 
378       FIXP_LPC lsp_coeff[5][M_LP_FILTER_ORDER]; /* linear prediction
379                                                    coefficients in LSP domain */
380       FIXP_LPC
381       lp_coeff[5][M_LP_FILTER_ORDER]; /* linear prediction coefficients in
382                                          LP domain */
383       INT lp_coeff_exp[5];
384       FIXP_LPC lsf_adaptive_mean_cand
385           [M_LP_FILTER_ORDER]; /* concealment: is copied to
386                   CAacDecoderStaticChannelInfo->lsf_adaptive_mean once frame is
387                   assumed to be correct*/
388       FIXP_SGL aStability[4];  /* LPC coeff stability values required for ACELP
389                                   and TCX (concealment) */
390 
391       CAcelpChannelData acelp[4];
392 
393       FIXP_DBL tcx_gain[4];
394       SCHAR tcx_gain_e[4];
395     } usac;
396 
397     struct {
398       CPnsData PnsData; /* Not required for USAC */
399     } aac;
400   }
401   data;
402 
403   SPECTRAL_PTR pSpectralCoefficient; /* Spectral coefficients of each window */
404   SHORT specScale[8]; /* Scale shift values of each spectrum window */
405   CIcsInfo icsInfo;
406   INT granuleLength; /* Size of smallest spectrum piece */
407   UCHAR ElementInstanceTag;
408 
409   AACDEC_RENDER_MODE renderMode; /* Output signal rendering mode */
410 
411   CAacDecoderDynamicData *
412       pDynData; /* Data required for one element and discarded after decoding */
413   CAacDecoderCommonData
414       *pComData; /* Data required for one channel at a time during decode */
415   CAacDecoderCommonStaticData *pComStaticData; /* Persistent data required for
416                                                   one channel at a time during
417                                                   decode */
418 
419   int currAliasingSymmetry; /* required for RSVD60 MCT */
420 
421 } CAacDecoderChannelInfo;
422 
423 /* channelinfo.cpp */
424 
425 AAC_DECODER_ERROR getSamplingRateInfo(SamplingRateInfo *t, UINT samplesPerFrame,
426                                       UINT samplingRateIndex,
427                                       UINT samplingRate);
428 
429 /**
430  * \brief Read max SFB from bit stream and assign TotalSfBands according
431  *        to the window sequence and sample rate.
432  * \param hBs bit stream handle as data source
433  * \param pIcsInfo IcsInfo structure to read the window sequence and store
434  * MaxSfBands and TotalSfBands
435  * \param pSamplingRateInfo read only
436  */
437 AAC_DECODER_ERROR IcsReadMaxSfb(HANDLE_FDK_BITSTREAM hBs, CIcsInfo *pIcsInfo,
438                                 const SamplingRateInfo *pSamplingRateInfo);
439 
440 AAC_DECODER_ERROR IcsRead(HANDLE_FDK_BITSTREAM bs, CIcsInfo *pIcsInfo,
441                           const SamplingRateInfo *SamplingRateInfoTable,
442                           const UINT flags);
443 
444 /* stereo.cpp, only called from this file */
445 
446 /*!
447   \brief Applies MS stereo.
448 
449   The function applies MS stereo.
450 
451   \param pAacDecoderChannelInfo aac channel info.
452   \param pScaleFactorBandOffsets pointer to scalefactor band offsets.
453   \param pWindowGroupLength pointer to window group length array.
454   \param windowGroups number of window groups.
455   \param scaleFactorBandsTransmittedL number of transmitted scalefactor bands in
456   left channel. \param scaleFactorBandsTransmittedR number of transmitted
457   scalefactor bands in right channel. May differ from
458   scaleFactorBandsTransmittedL only for USAC. \return  none
459 */
460 void CJointStereo_ApplyMS(
461     CAacDecoderChannelInfo *pAacDecoderChannelInfo[2],
462     CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[2],
463     FIXP_DBL *spectrumL, FIXP_DBL *spectrumR, SHORT *SFBleftScale,
464     SHORT *SFBrightScale, SHORT *specScaleL, SHORT *specScaleR,
465     const SHORT *pScaleFactorBandOffsets, const UCHAR *pWindowGroupLength,
466     const int windowGroups, const int max_sfb_ste_outside,
467     const int scaleFactorBandsTransmittedL,
468     const int scaleFactorBandsTransmittedR, FIXP_DBL *store_dmx_re_prev,
469     SHORT *store_dmx_re_prev_e, const int mainband_flag);
470 
471 /*!
472   \brief Applies intensity stereo
473 
474   The function applies intensity stereo.
475 
476   \param pAacDecoderChannelInfo aac channel info.
477   \param pScaleFactorBandOffsets pointer to scalefactor band offsets.
478   \param pWindowGroupLength pointer to window group length array.
479   \param windowGroups number of window groups.
480   \param scaleFactorBandsTransmitted number of transmitted scalefactor bands.
481   \return  none
482 */
483 void CJointStereo_ApplyIS(CAacDecoderChannelInfo *pAacDecoderChannelInfo[2],
484                           const short *pScaleFactorBandOffsets,
485                           const UCHAR *pWindowGroupLength,
486                           const int windowGroups,
487                           const int scaleFactorBandsTransmitted);
488 
489 /* aacdec_pns.cpp */
490 int CPns_IsPnsUsed(const CPnsData *pPnsData, const int group, const int band);
491 
492 void CPns_SetCorrelation(CPnsData *pPnsData, const int group, const int band,
493                          const int outofphase);
494 
495 /****************** inline functions ******************/
496 
IsValid(const CIcsInfo * pIcsInfo)497 inline UCHAR IsValid(const CIcsInfo *pIcsInfo) { return pIcsInfo->Valid; }
498 
IsLongBlock(const CIcsInfo * pIcsInfo)499 inline UCHAR IsLongBlock(const CIcsInfo *pIcsInfo) {
500   return (pIcsInfo->WindowSequence != BLOCK_SHORT);
501 }
502 
GetWindowShape(const CIcsInfo * pIcsInfo)503 inline UCHAR GetWindowShape(const CIcsInfo *pIcsInfo) {
504   return pIcsInfo->WindowShape;
505 }
506 
GetWindowSequence(const CIcsInfo * pIcsInfo)507 inline BLOCK_TYPE GetWindowSequence(const CIcsInfo *pIcsInfo) {
508   return pIcsInfo->WindowSequence;
509 }
510 
GetScaleFactorBandOffsets(const CIcsInfo * pIcsInfo,const SamplingRateInfo * samplingRateInfo)511 inline const SHORT *GetScaleFactorBandOffsets(
512     const CIcsInfo *pIcsInfo, const SamplingRateInfo *samplingRateInfo) {
513   if (IsLongBlock(pIcsInfo)) {
514     return samplingRateInfo->ScaleFactorBands_Long;
515   } else {
516     return samplingRateInfo->ScaleFactorBands_Short;
517   }
518 }
519 
GetNumberOfScaleFactorBands(const CIcsInfo * pIcsInfo,const SamplingRateInfo * samplingRateInfo)520 inline UCHAR GetNumberOfScaleFactorBands(
521     const CIcsInfo *pIcsInfo, const SamplingRateInfo *samplingRateInfo) {
522   if (IsLongBlock(pIcsInfo)) {
523     return samplingRateInfo->NumberOfScaleFactorBands_Long;
524   } else {
525     return samplingRateInfo->NumberOfScaleFactorBands_Short;
526   }
527 }
528 
GetWindowsPerFrame(const CIcsInfo * pIcsInfo)529 inline int GetWindowsPerFrame(const CIcsInfo *pIcsInfo) {
530   return (pIcsInfo->WindowSequence == BLOCK_SHORT) ? 8 : 1;
531 }
532 
GetWindowGroups(const CIcsInfo * pIcsInfo)533 inline UCHAR GetWindowGroups(const CIcsInfo *pIcsInfo) {
534   return pIcsInfo->WindowGroups;
535 }
536 
GetWindowGroupLength(const CIcsInfo * pIcsInfo,const INT index)537 inline UCHAR GetWindowGroupLength(const CIcsInfo *pIcsInfo, const INT index) {
538   return pIcsInfo->WindowGroupLength[index];
539 }
540 
GetWindowGroupLengthTable(const CIcsInfo * pIcsInfo)541 inline const UCHAR *GetWindowGroupLengthTable(const CIcsInfo *pIcsInfo) {
542   return pIcsInfo->WindowGroupLength;
543 }
544 
GetScaleFactorBandsTransmitted(const CIcsInfo * pIcsInfo)545 inline UCHAR GetScaleFactorBandsTransmitted(const CIcsInfo *pIcsInfo) {
546   return pIcsInfo->MaxSfBands;
547 }
548 
GetScaleMaxFactorBandsTransmitted(const CIcsInfo * pIcsInfo0,const CIcsInfo * pIcsInfo1)549 inline UCHAR GetScaleMaxFactorBandsTransmitted(const CIcsInfo *pIcsInfo0,
550                                                const CIcsInfo *pIcsInfo1) {
551   return fMax(pIcsInfo0->MaxSfBands, pIcsInfo1->MaxSfBands);
552 }
553 
GetScaleFactorBandsTotal(const CIcsInfo * pIcsInfo)554 inline UCHAR GetScaleFactorBandsTotal(const CIcsInfo *pIcsInfo) {
555   return pIcsInfo->TotalSfBands;
556 }
557 
558 /* Note: This function applies to AAC-LC only ! */
GetMaximumTnsBands(const CIcsInfo * pIcsInfo,const int samplingRateIndex)559 inline UCHAR GetMaximumTnsBands(const CIcsInfo *pIcsInfo,
560                                 const int samplingRateIndex) {
561   return tns_max_bands_tbl[samplingRateIndex][!IsLongBlock(pIcsInfo)];
562 }
563 
564 #endif /* #ifndef CHANNELINFO_H */
565