aboutsummaryrefslogtreecommitdiffstats
path: root/libAACdec/src/channelinfo.h
diff options
context:
space:
mode:
Diffstat (limited to 'libAACdec/src/channelinfo.h')
-rw-r--r--libAACdec/src/channelinfo.h450
1 files changed, 450 insertions, 0 deletions
diff --git a/libAACdec/src/channelinfo.h b/libAACdec/src/channelinfo.h
new file mode 100644
index 0000000..9be07da
--- /dev/null
+++ b/libAACdec/src/channelinfo.h
@@ -0,0 +1,450 @@
+
+/* -----------------------------------------------------------------------------------------------------------
+Software License for The Fraunhofer FDK AAC Codec Library for Android
+
+© Copyright 1995 - 2012 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
+----------------------------------------------------------------------------------------------------------- */
+
+/***************************** MPEG-4 AAC Decoder **************************
+
+ 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 "conceal_types.h"
+
+ #include "aacdec_drc_types.h"
+
+/* 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
+};
+
+enum
+{
+ OnlyLongSequence = 0,
+ LongStartSequence,
+ EightShortSequence,
+ LongStopSequence
+};
+
+
+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 */
+ UCHAR WindowSequence; /* See enum above, 0: long, 1: start, 2: short, 3: stop */
+ UCHAR MaxSfBands;
+ 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
+};
+
+#define TNS_SCALE 3
+
+/*
+ * This struct must be allocated one for every channel and must be persistent.
+ */
+typedef struct
+{
+ FIXP_DBL *pOverlapBuffer;
+ mdct_t IMdct;
+
+
+
+ CDrcChannelData drcData;
+ CConcealmentInfo concealmentInfo;
+
+} 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. */
+ 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;
+ } specificTo;
+
+} CAacDecoderDynamicData;
+
+typedef shouldBeUnion {
+ CAacDecoderDynamicData pAacDecoderDynamicData[2];
+
+ /* Common signal data, can be used once the bit stream data from above is not used anymore. */
+ FIXP_DBL mdctOutTemp[1024];
+ FIXP_DBL sbrWorkBuffer[1024*2];
+
+} CWorkBufferCore1;
+
+/* Common data referenced by all channels */
+typedef struct {
+
+ CWorkBufferCore1 *workBufferCore1;
+ FIXP_DBL* workBufferCore2;
+
+ CPnsInterChannelData pnsInterChannelData;
+ INT pnsCurrentSeed;
+ 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;
+
+
+/*
+ * This struct must be allocated one for every channels 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
+{
+ 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 */
+
+ shouldBeUnion {
+ struct {
+ CPnsData PnsData; /* Not required for USAC */
+ } aac;
+
+ struct {
+ } usac;
+ } data;
+
+ CAacDecoderDynamicData *pDynData; /* Data required for one element and discarded after decoding */
+ CAacDecoderCommonData *pComData; /* Data required for one channel at a time during decode */
+
+} 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],
+ const short *pScaleFactorBandOffsets,
+ const UCHAR *pWindowGroupLength,
+ const int windowGroups,
+ const int scaleFactorBandsTransmittedL,
+ const int scaleFactorBandsTransmittedR);
+
+/*!
+ \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.
+ \param CommonWindow common window bit.
+ \return none
+*/
+void CJointStereo_ApplyIS(CAacDecoderChannelInfo *pAacDecoderChannelInfo[2],
+ const short *pScaleFactorBandOffsets,
+ const UCHAR *pWindowGroupLength,
+ const int windowGroups,
+ const int scaleFactorBandsTransmitted,
+ const UINT CommonWindow);
+
+
+/* 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 != EightShortSequence);
+}
+
+inline UCHAR GetWindowShape(const CIcsInfo *pIcsInfo)
+{
+ return pIcsInfo->WindowShape;
+}
+
+inline UCHAR 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 int GetWindowsPerFrame(const CIcsInfo *pIcsInfo)
+{
+ return (pIcsInfo->WindowSequence == EightShortSequence) ? 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 */
+