summaryrefslogtreecommitdiffstats
path: root/libAACdec/src/channelinfo.h
diff options
context:
space:
mode:
Diffstat (limited to 'libAACdec/src/channelinfo.h')
-rw-r--r--libAACdec/src/channelinfo.h388
1 files changed, 388 insertions, 0 deletions
diff --git a/libAACdec/src/channelinfo.h b/libAACdec/src/channelinfo.h
new file mode 100644
index 0000000..f74583d
--- /dev/null
+++ b/libAACdec/src/channelinfo.h
@@ -0,0 +1,388 @@
+/***************************** MPEG-4 AAC Decoder **************************
+
+ (C) Copyright Fraunhofer IIS (2004)
+ All Rights Reserved
+
+ Please be advised that this software and/or program delivery is
+ Confidential Information of Fraunhofer and subject to and covered by the
+
+ Fraunhofer IIS Software Evaluation Agreement
+ between Google Inc. and Fraunhofer
+ effective and in full force since March 1, 2012.
+
+ You may use this software and/or program only under the terms and
+ conditions described in the above mentioned Fraunhofer IIS Software
+ Evaluation Agreement. Any other and/or further use requires a separate agreement.
+
+
+ $Id$
+ Author(s): Josef Hoepfl
+ Description: individual channel stream info
+
+ This software and/or program is protected by copyright law and international
+ treaties. Any reproduction or distribution of this software and/or program,
+ or any portion of it, may result in severe civil and criminal penalties, and
+ will be prosecuted to the maximum extent possible under law.
+
+******************************************************************************/
+
+#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 */
+