aboutsummaryrefslogtreecommitdiffstats
path: root/fdk-aac/libAACdec/src/channelinfo.h
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2019-11-11 11:38:02 +0100
committerMatthias P. Braendli <matthias.braendli@mpb.li>2019-11-11 11:38:02 +0100
commit0e5af65c467b2423a0b857ae3ad98c91acc1e190 (patch)
treed07f69550d8886271e44fe79c4dcfb299cafbd38 /fdk-aac/libAACdec/src/channelinfo.h
parentefe406d9724f959c8bc2a31802559ca6d41fd897 (diff)
downloadODR-AudioEnc-0e5af65c467b2423a0b857ae3ad98c91acc1e190.tar.gz
ODR-AudioEnc-0e5af65c467b2423a0b857ae3ad98c91acc1e190.tar.bz2
ODR-AudioEnc-0e5af65c467b2423a0b857ae3ad98c91acc1e190.zip
Include patched FDK-AAC in the repository
The initial idea was to get the DAB+ patch into upstream, but since that follows the android source releases, there is no place for a custom DAB+ patch there. So instead of having to maintain a patched fdk-aac that has to have the same .so version as the distribution package on which it is installed, we prefer having a separate fdk-aac-dab library to avoid collision. At that point, there's no reason to keep fdk-aac in a separate repository, as odr-audioenc is the only tool that needs DAB+ encoding support. Including it here simplifies installation, and makes it consistent with toolame-dab, also shipped in this repository. DAB+ decoding support (needed by ODR-SourceCompanion, dablin, etisnoop, welle.io and others) can be done using upstream FDK-AAC.
Diffstat (limited to 'fdk-aac/libAACdec/src/channelinfo.h')
-rw-r--r--fdk-aac/libAACdec/src/channelinfo.h564
1 files changed, 564 insertions, 0 deletions
diff --git a/fdk-aac/libAACdec/src/channelinfo.h b/fdk-aac/libAACdec/src/channelinfo.h
new file mode 100644
index 0000000..4523400
--- /dev/null
+++ b/fdk-aac/libAACdec/src/channelinfo.h
@@ -0,0 +1,564 @@
+/* -----------------------------------------------------------------------------
+Software License for The Fraunhofer FDK AAC Codec Library for Android
+
+© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
+Forschung e.V. All rights reserved.
+
+ 1. INTRODUCTION
+The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
+that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
+scheme for digital audio. This FDK AAC Codec software is intended to be used on
+a wide variety of Android devices.
+
+AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
+general perceptual audio codecs. AAC-ELD is considered the best-performing
+full-bandwidth communications codec by independent studies and is widely
+deployed. AAC has been standardized by ISO and IEC as part of the MPEG
+specifications.
+
+Patent licenses for necessary patent claims for the FDK AAC Codec (including
+those of Fraunhofer) may be obtained through Via Licensing
+(www.vialicensing.com) or through the respective patent owners individually for
+the purpose of encoding or decoding bit streams in products that are compliant
+with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
+Android devices already license these patent claims through Via Licensing or
+directly from the patent owners, and therefore FDK AAC Codec software may
+already be covered under those patent licenses when it is used for those
+licensed purposes only.
+
+Commercially-licensed AAC software libraries, including floating-point versions
+with enhanced sound quality, are also available from Fraunhofer. Users are
+encouraged to check the Fraunhofer website for additional applications
+information and documentation.
+
+2. COPYRIGHT LICENSE
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted without payment of copyright license fees provided that you
+satisfy the following conditions:
+
+You must retain the complete text of this software license in redistributions of
+the FDK AAC Codec or your modifications thereto in source code form.
+
+You must retain the complete text of this software license in the documentation
+and/or other materials provided with redistributions of the FDK AAC Codec or
+your modifications thereto in binary form. You must make available free of
+charge copies of the complete source code of the FDK AAC Codec and your
+modifications thereto to recipients of copies in binary form.
+
+The name of Fraunhofer may not be used to endorse or promote products derived
+from this library without prior written permission.
+
+You may not charge copyright license fees for anyone to use, copy or distribute
+the FDK AAC Codec software or your modifications thereto.
+
+Your modified versions of the FDK AAC Codec must carry prominent notices stating
+that you changed the software and the date of any change. For modified versions
+of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
+must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
+AAC Codec Library for Android."
+
+3. NO PATENT LICENSE
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
+limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
+Fraunhofer provides no warranty of patent non-infringement with respect to this
+software.
+
+You may use this FDK AAC Codec software or modifications thereto only for
+purposes that are authorized by appropriate patent licenses.
+
+4. DISCLAIMER
+
+This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
+holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
+including but not limited to the implied warranties of merchantability and
+fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
+or consequential damages, including but not limited to procurement of substitute
+goods or services; loss of use, data, or profits, or business interruption,
+however caused and on any theory of liability, whether in contract, strict
+liability, or tort (including negligence), arising in any way out of the use of
+this software, even if advised of the possibility of such damage.
+
+5. CONTACT INFORMATION
+
+Fraunhofer Institute for Integrated Circuits IIS
+Attention: Audio and Multimedia Departments - FDK AAC LL
+Am Wolfsmantel 33
+91058 Erlangen, Germany
+
+www.iis.fraunhofer.de/amm
+amm-info@iis.fraunhofer.de
+----------------------------------------------------------------------------- */
+
+/**************************** AAC decoder library ******************************
+
+ Author(s): Josef Hoepfl
+
+ Description: individual channel stream info
+
+*******************************************************************************/
+
+#ifndef CHANNELINFO_H
+#define CHANNELINFO_H
+
+#include "common_fix.h"
+
+#include "aac_rom.h"
+#include "aacdecoder_lib.h"
+#include "FDK_bitstream.h"
+#include "overlapadd.h"
+
+#include "mdct.h"
+#include "stereo.h"
+#include "pulsedata.h"
+#include "aacdec_tns.h"
+
+#include "aacdec_pns.h"
+
+#include "aacdec_hcr_types.h"
+#include "rvlc_info.h"
+
+#include "usacdec_acelp.h"
+#include "usacdec_const.h"
+#include "usacdec_rom.h"
+
+#include "ac_arith_coder.h"
+
+#include "conceal_types.h"
+
+#include "aacdec_drc_types.h"
+
+#define WB_SECTION_SIZE (1024 * 2)
+
+#define DRM_BS_BUFFER_SIZE \
+ (512) /* size of the dynamic buffer which is used to reverse the bits of \
+ the DRM SBR payload */
+
+/* Output rendering mode */
+typedef enum {
+ AACDEC_RENDER_INVALID = 0,
+ AACDEC_RENDER_IMDCT,
+ AACDEC_RENDER_ELDFB,
+ AACDEC_RENDER_LPD,
+ AACDEC_RENDER_INTIMDCT
+} AACDEC_RENDER_MODE;
+
+enum { MAX_QUANTIZED_VALUE = 8191 };
+
+typedef enum { FD_LONG, FD_SHORT, LPD } USAC_COREMODE;
+
+typedef struct {
+ const SHORT *ScaleFactorBands_Long;
+ const SHORT *ScaleFactorBands_Short;
+ UCHAR NumberOfScaleFactorBands_Long;
+ UCHAR NumberOfScaleFactorBands_Short;
+ UINT samplingRateIndex;
+ UINT samplingRate;
+} SamplingRateInfo;
+
+typedef struct {
+ UCHAR CommonWindow;
+ UCHAR GlobalGain;
+
+} CRawDataInfo;
+
+typedef struct {
+ UCHAR WindowGroupLength[8];
+ UCHAR WindowGroups;
+ UCHAR Valid;
+
+ UCHAR WindowShape; /* 0: sine window, 1: KBD, 2: low overlap */
+ BLOCK_TYPE WindowSequence; /* mdct.h; 0: long, 1: start, 2: short, 3: stop */
+ UCHAR MaxSfBands;
+ UCHAR max_sfb_ste;
+ UCHAR ScaleFactorGrouping;
+
+ UCHAR TotalSfBands;
+
+} CIcsInfo;
+
+enum {
+ ZERO_HCB = 0,
+ ESCBOOK = 11,
+ NSPECBOOKS = ESCBOOK + 1,
+ BOOKSCL = NSPECBOOKS,
+ NOISE_HCB = 13,
+ INTENSITY_HCB2 = 14,
+ INTENSITY_HCB = 15,
+ LAST_HCB
+};
+
+/* This struct holds the persistent data shared by both channels of a CPE.
+ It needs to be allocated for each CPE. */
+typedef struct {
+ CJointStereoPersistentData jointStereoPersistentData;
+} CpePersistentData;
+
+/*
+ * This struct must be allocated one for every channel and must be persistent.
+ */
+typedef struct {
+ FIXP_DBL *pOverlapBuffer;
+ mdct_t IMdct;
+
+ CArcoData *hArCo;
+
+ INT pnsCurrentSeed;
+
+ /* LPD memory */
+ FIXP_DBL old_synth[PIT_MAX_MAX - L_SUBFR];
+ INT old_T_pf[SYN_SFD];
+ FIXP_DBL old_gain_pf[SYN_SFD];
+ FIXP_DBL mem_bpf[L_FILT + L_SUBFR];
+ UCHAR
+ old_bpf_control_info; /* (1: enable, 0: disable) bpf for past superframe
+ */
+
+ USAC_COREMODE last_core_mode; /* core mode used by the decoder in previous
+ frame. (not signalled by the bitstream, see
+ CAacDecoderChannelInfo::core_mode_last !! )
+ */
+ UCHAR last_lpd_mode; /* LPD mode used by the decoder in last LPD subframe
+ (not signalled by the bitstream, see
+ CAacDecoderChannelInfo::lpd_mode_last !! ) */
+ UCHAR last_last_lpd_mode; /* LPD mode used in second last LPD subframe
+ (not signalled by the bitstream) */
+ UCHAR last_lpc_lost; /* Flag indicating that the previous LPC is lost */
+
+ FIXP_LPC
+ lpc4_lsf[M_LP_FILTER_ORDER]; /* Last LPC4 coefficients in LSF domain. */
+ FIXP_LPC lsf_adaptive_mean[M_LP_FILTER_ORDER]; /* Adaptive mean of LPC
+ coefficients in LSF domain
+ for concealment. */
+ FIXP_LPC lp_coeff_old[2][M_LP_FILTER_ORDER]; /* Last LPC coefficients in LP
+ domain. lp_coeff_old[0] is lpc4 (coeffs for
+ right folding point of last tcx frame),
+ lp_coeff_old[1] are coeffs for left folding
+ point of last tcx frame */
+ INT lp_coeff_old_exp[2];
+
+ FIXP_SGL
+ oldStability; /* LPC coeff stability value from last frame (required for
+ TCX concealment). */
+ UINT numLostLpdFrames; /* Number of consecutive lost subframes. */
+
+ /* TCX memory */
+ FIXP_DBL last_tcx_gain;
+ INT last_tcx_gain_e;
+ FIXP_DBL last_alfd_gains[32]; /* Scaled by one bit. */
+ SHORT last_tcx_pitch;
+ UCHAR last_tcx_noise_factor;
+
+ /* ACELP memory */
+ CAcelpStaticMem acelp;
+
+ ULONG nfRandomSeed; /* seed value for USAC noise filling random generator */
+
+ CDrcChannelData drcData;
+ CConcealmentInfo concealmentInfo;
+
+ CpePersistentData *pCpeStaticData;
+
+} CAacDecoderStaticChannelInfo;
+
+/*
+ * This union must be allocated for every element (up to 2 channels).
+ */
+typedef struct {
+ /* Common bit stream data */
+ SHORT aScaleFactor[(
+ 8 * 16)]; /* Spectral scale factors for each sfb in each window. */
+ SHORT aSfbScale[(8 * 16)]; /* could be free after ApplyTools() */
+ UCHAR
+ aCodeBook[(8 * 16)]; /* section data: codebook for each window and sfb. */
+ UCHAR band_is_noise[(8 * 16)];
+ CTnsData TnsData;
+ CRawDataInfo RawDataInfo;
+
+ shouldBeUnion {
+ struct {
+ CPulseData PulseData;
+ SHORT aNumLineInSec4Hcr[MAX_SFB_HCR]; /* needed once for all channels
+ except for Drm syntax */
+ UCHAR
+ aCodeBooks4Hcr[MAX_SFB_HCR]; /* needed once for all channels except for
+ Drm syntax. Same as "aCodeBook" ? */
+ SHORT lenOfReorderedSpectralData;
+ SCHAR lenOfLongestCodeword;
+ SCHAR numberSection;
+ SCHAR rvlcCurrentScaleFactorOK;
+ SCHAR rvlcIntensityUsed;
+ } aac;
+ struct {
+ UCHAR fd_noise_level_and_offset;
+ UCHAR tns_active;
+ UCHAR tns_on_lr;
+ UCHAR tcx_noise_factor[4];
+ UCHAR tcx_global_gain[4];
+ } usac;
+ }
+ specificTo;
+
+} CAacDecoderDynamicData;
+
+typedef shouldBeUnion {
+ UCHAR DrmBsBuffer[DRM_BS_BUFFER_SIZE];
+
+ /* Common signal data, can be used once the bit stream data from above is not
+ * used anymore. */
+ FIXP_DBL mdctOutTemp[1024];
+
+ FIXP_DBL synth_buf[(PIT_MAX_MAX + SYN_DELAY + L_FRAME_PLUS)];
+
+ FIXP_DBL workBuffer[WB_SECTION_SIZE];
+}
+CWorkBufferCore1;
+
+/* Common data referenced by all channels */
+typedef struct {
+ CAacDecoderDynamicData pAacDecoderDynamicData[2];
+
+ CPnsInterChannelData pnsInterChannelData;
+ INT pnsRandomSeed[(8 * 16)];
+
+ CJointStereoData jointStereoData; /* One for one element */
+
+ shouldBeUnion {
+ struct {
+ CErHcrInfo erHcrInfo;
+ CErRvlcInfo erRvlcInfo;
+ SHORT aRvlcScfEsc[RVLC_MAX_SFB]; /* needed once for all channels */
+ SHORT aRvlcScfFwd[RVLC_MAX_SFB]; /* needed once for all channels */
+ SHORT aRvlcScfBwd[RVLC_MAX_SFB]; /* needed once for all channels */
+ } aac;
+ }
+ overlay;
+
+} CAacDecoderCommonData;
+
+typedef struct {
+ CWorkBufferCore1 *pWorkBufferCore1;
+ CCplxPredictionData *cplxPredictionData;
+} CAacDecoderCommonStaticData;
+
+/*
+ * This struct must be allocated one for every channel of every element and must
+ * be persistent. Among its members, the following memory areas can be
+ * overwritten under the given conditions:
+ * - pSpectralCoefficient The memory pointed to can be overwritten after time
+ * signal rendering.
+ * - data can be overwritten after time signal rendering.
+ * - pDynData memory pointed to can be overwritten after each
+ * CChannelElement_Decode() call.
+ * - pComData->overlay memory pointed to can be overwritten after each
+ * CChannelElement_Decode() call..
+ */
+typedef struct {
+ shouldBeUnion {
+ struct {
+ FIXP_DBL fac_data0[LFAC];
+ SCHAR fac_data_e[4];
+ FIXP_DBL
+ *fac_data[4]; /* Pointers to unused parts of pSpectralCoefficient */
+
+ UCHAR core_mode; /* current core mode */
+ USAC_COREMODE
+ core_mode_last; /* previous core mode, signalled in the bitstream
+ (not done by the decoder, see
+ CAacDecoderStaticChannelInfo::last_core_mode !!)*/
+ UCHAR lpd_mode_last; /* previous LPD mode, signalled in the bitstream
+ (not done by the decoder, see
+ CAacDecoderStaticChannelInfo::last_core_mode !!)*/
+ UCHAR mod[4];
+ UCHAR bpf_control_info; /* (1: enable, 0: disable) bpf for current
+ superframe */
+
+ FIXP_LPC lsp_coeff[5][M_LP_FILTER_ORDER]; /* linear prediction
+ coefficients in LSP domain */
+ FIXP_LPC
+ lp_coeff[5][M_LP_FILTER_ORDER]; /* linear prediction coefficients in
+ LP domain */
+ INT lp_coeff_exp[5];
+ FIXP_LPC lsf_adaptive_mean_cand
+ [M_LP_FILTER_ORDER]; /* concealment: is copied to
+ CAacDecoderStaticChannelInfo->lsf_adaptive_mean once frame is
+ assumed to be correct*/
+ FIXP_SGL aStability[4]; /* LPC coeff stability values required for ACELP
+ and TCX (concealment) */
+
+ CAcelpChannelData acelp[4];
+
+ FIXP_DBL tcx_gain[4];
+ SCHAR tcx_gain_e[4];
+ } usac;
+
+ struct {
+ CPnsData PnsData; /* Not required for USAC */
+ } aac;
+ }
+ data;
+
+ SPECTRAL_PTR pSpectralCoefficient; /* Spectral coefficients of each window */
+ SHORT specScale[8]; /* Scale shift values of each spectrum window */
+ CIcsInfo icsInfo;
+ INT granuleLength; /* Size of smallest spectrum piece */
+ UCHAR ElementInstanceTag;
+
+ AACDEC_RENDER_MODE renderMode; /* Output signal rendering mode */
+
+ CAacDecoderDynamicData *
+ pDynData; /* Data required for one element and discarded after decoding */
+ CAacDecoderCommonData
+ *pComData; /* Data required for one channel at a time during decode */
+ CAacDecoderCommonStaticData *pComStaticData; /* Persistent data required for
+ one channel at a time during
+ decode */
+
+ int currAliasingSymmetry; /* required for RSVD60 MCT */
+
+} CAacDecoderChannelInfo;
+
+/* channelinfo.cpp */
+
+AAC_DECODER_ERROR getSamplingRateInfo(SamplingRateInfo *t, UINT samplesPerFrame,
+ UINT samplingRateIndex,
+ UINT samplingRate);
+
+/**
+ * \brief Read max SFB from bit stream and assign TotalSfBands according
+ * to the window sequence and sample rate.
+ * \param hBs bit stream handle as data source
+ * \param pIcsInfo IcsInfo structure to read the window sequence and store
+ * MaxSfBands and TotalSfBands
+ * \param pSamplingRateInfo read only
+ */
+AAC_DECODER_ERROR IcsReadMaxSfb(HANDLE_FDK_BITSTREAM hBs, CIcsInfo *pIcsInfo,
+ const SamplingRateInfo *pSamplingRateInfo);
+
+AAC_DECODER_ERROR IcsRead(HANDLE_FDK_BITSTREAM bs, CIcsInfo *pIcsInfo,
+ const SamplingRateInfo *SamplingRateInfoTable,
+ const UINT flags);
+
+/* stereo.cpp, only called from this file */
+
+/*!
+ \brief Applies MS stereo.
+
+ The function applies MS stereo.
+
+ \param pAacDecoderChannelInfo aac channel info.
+ \param pScaleFactorBandOffsets pointer to scalefactor band offsets.
+ \param pWindowGroupLength pointer to window group length array.
+ \param windowGroups number of window groups.
+ \param scaleFactorBandsTransmittedL number of transmitted scalefactor bands in
+ left channel. \param scaleFactorBandsTransmittedR number of transmitted
+ scalefactor bands in right channel. May differ from
+ scaleFactorBandsTransmittedL only for USAC. \return none
+*/
+void CJointStereo_ApplyMS(
+ CAacDecoderChannelInfo *pAacDecoderChannelInfo[2],
+ CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[2],
+ FIXP_DBL *spectrumL, FIXP_DBL *spectrumR, SHORT *SFBleftScale,
+ SHORT *SFBrightScale, SHORT *specScaleL, SHORT *specScaleR,
+ const SHORT *pScaleFactorBandOffsets, const UCHAR *pWindowGroupLength,
+ const int windowGroups, const int max_sfb_ste_outside,
+ const int scaleFactorBandsTransmittedL,
+ const int scaleFactorBandsTransmittedR, FIXP_DBL *store_dmx_re_prev,
+ SHORT *store_dmx_re_prev_e, const int mainband_flag);
+
+/*!
+ \brief Applies intensity stereo
+
+ The function applies intensity stereo.
+
+ \param pAacDecoderChannelInfo aac channel info.
+ \param pScaleFactorBandOffsets pointer to scalefactor band offsets.
+ \param pWindowGroupLength pointer to window group length array.
+ \param windowGroups number of window groups.
+ \param scaleFactorBandsTransmitted number of transmitted scalefactor bands.
+ \return none
+*/
+void CJointStereo_ApplyIS(CAacDecoderChannelInfo *pAacDecoderChannelInfo[2],
+ const short *pScaleFactorBandOffsets,
+ const UCHAR *pWindowGroupLength,
+ const int windowGroups,
+ const int scaleFactorBandsTransmitted);
+
+/* aacdec_pns.cpp */
+int CPns_IsPnsUsed(const CPnsData *pPnsData, const int group, const int band);
+
+void CPns_SetCorrelation(CPnsData *pPnsData, const int group, const int band,
+ const int outofphase);
+
+/****************** inline functions ******************/
+
+inline UCHAR IsValid(const CIcsInfo *pIcsInfo) { return pIcsInfo->Valid; }
+
+inline UCHAR IsLongBlock(const CIcsInfo *pIcsInfo) {
+ return (pIcsInfo->WindowSequence != BLOCK_SHORT);
+}
+
+inline UCHAR GetWindowShape(const CIcsInfo *pIcsInfo) {
+ return pIcsInfo->WindowShape;
+}
+
+inline BLOCK_TYPE GetWindowSequence(const CIcsInfo *pIcsInfo) {
+ return pIcsInfo->WindowSequence;
+}
+
+inline const SHORT *GetScaleFactorBandOffsets(
+ const CIcsInfo *pIcsInfo, const SamplingRateInfo *samplingRateInfo) {
+ if (IsLongBlock(pIcsInfo)) {
+ return samplingRateInfo->ScaleFactorBands_Long;
+ } else {
+ return samplingRateInfo->ScaleFactorBands_Short;
+ }
+}
+
+inline UCHAR GetNumberOfScaleFactorBands(
+ const CIcsInfo *pIcsInfo, const SamplingRateInfo *samplingRateInfo) {
+ if (IsLongBlock(pIcsInfo)) {
+ return samplingRateInfo->NumberOfScaleFactorBands_Long;
+ } else {
+ return samplingRateInfo->NumberOfScaleFactorBands_Short;
+ }
+}
+
+inline int GetWindowsPerFrame(const CIcsInfo *pIcsInfo) {
+ return (pIcsInfo->WindowSequence == BLOCK_SHORT) ? 8 : 1;
+}
+
+inline UCHAR GetWindowGroups(const CIcsInfo *pIcsInfo) {
+ return pIcsInfo->WindowGroups;
+}
+
+inline UCHAR GetWindowGroupLength(const CIcsInfo *pIcsInfo, const INT index) {
+ return pIcsInfo->WindowGroupLength[index];
+}
+
+inline const UCHAR *GetWindowGroupLengthTable(const CIcsInfo *pIcsInfo) {
+ return pIcsInfo->WindowGroupLength;
+}
+
+inline UCHAR GetScaleFactorBandsTransmitted(const CIcsInfo *pIcsInfo) {
+ return pIcsInfo->MaxSfBands;
+}
+
+inline UCHAR GetScaleMaxFactorBandsTransmitted(const CIcsInfo *pIcsInfo0,
+ const CIcsInfo *pIcsInfo1) {
+ return fMax(pIcsInfo0->MaxSfBands, pIcsInfo1->MaxSfBands);
+}
+
+inline UCHAR GetScaleFactorBandsTotal(const CIcsInfo *pIcsInfo) {
+ return pIcsInfo->TotalSfBands;
+}
+
+/* Note: This function applies to AAC-LC only ! */
+inline UCHAR GetMaximumTnsBands(const CIcsInfo *pIcsInfo,
+ const int samplingRateIndex) {
+ return tns_max_bands_tbl[samplingRateIndex][!IsLongBlock(pIcsInfo)];
+}
+
+#endif /* #ifndef CHANNELINFO_H */