123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383 |
- /* ***** BEGIN LICENSE BLOCK *****
- * Source last modified: $Id: sbr.h,v 1.2 2005/05/20 18:05:41 jrecker Exp $
- *
- * Portions Copyright (c) 1995-2005 RealNetworks, Inc. All Rights Reserved.
- *
- * The contents of this file, and the files included with this file,
- * are subject to the current version of the RealNetworks Public
- * Source License (the "RPSL") available at
- * http://www.helixcommunity.org/content/rpsl unless you have licensed
- * the file under the current version of the RealNetworks Community
- * Source License (the "RCSL") available at
- * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
- * will apply. You may also obtain the license terms directly from
- * RealNetworks. You may not use this file except in compliance with
- * the RPSL or, if you have a valid RCSL with RealNetworks applicable
- * to this file, the RCSL. Please see the applicable RPSL or RCSL for
- * the rights, obligations and limitations governing use of the
- * contents of the file.
- *
- * This file is part of the Helix DNA Technology. RealNetworks is the
- * developer of the Original Code and owns the copyrights in the
- * portions it created.
- *
- * This file, and the files included with this file, is distributed
- * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
- * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
- * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
- * ENJOYMENT OR NON-INFRINGEMENT.
- *
- * Technology Compatibility Kit Test Suite(s) Location:
- * http://www.helixcommunity.org/content/tck
- *
- * Contributor(s):
- *
- * ***** END LICENSE BLOCK ***** */
- /**************************************************************************************
- * Fixed-point HE-AAC decoder
- * Jon Recker (jrecker@real.com)
- * February 2005
- *
- * sbr.h - definitions of platform-specific SBR data structures, functions, and tables
- **************************************************************************************/
- #ifndef _SBR_H
- #define _SBR_H
- #include "aaccommon.h"
- #include "bitstream.h"
- #ifndef ASSERT
- #if defined(_WIN32) && defined(_M_IX86) && (defined (_DEBUG) || defined (REL_ENABLE_ASSERTS))
- #define ASSERT(x) if (!(x)) __asm int 3;
- #else
- #define ASSERT(x) /* do nothing */
- #endif
- #endif
- #ifndef MAX
- #define MAX(a,b) ((a) > (b) ? (a) : (b))
- #endif
- #ifndef MIN
- #define MIN(a,b) ((a) < (b) ? (a) : (b))
- #endif
- #define NUM_TIME_SLOTS 16
- #define SAMPLES_PER_SLOT 2 /* RATE in spec */
- #define NUM_SAMPLE_RATES_SBR 9 /* downsampled (single-rate) mode unsupported, so only use Fs_sbr >= 16 kHz */
- #define MAX_NUM_ENV 5
- #define MAX_NUM_NOISE_FLOORS 2
- #define MAX_NUM_NOISE_FLOOR_BANDS 5 /* max Nq, see 4.6.18.3.6 */
- #define MAX_NUM_PATCHES 5
- #define MAX_NUM_SMOOTH_COEFS 5
- #define HF_GEN 8
- #define HF_ADJ 2
- #define MAX_QMF_BANDS 48 /* max QMF subbands covered by SBR (4.6.18.3.6) */
- #define FBITS_IN_QMFA 14
- #define FBITS_LOST_QMFA (1 + 2 + 3 + 2 + 1) /* 1 from cTab, 2 in premul, 3 in FFT, 2 in postmul, 1 for implicit scaling by 2.0 */
- #define FBITS_OUT_QMFA (FBITS_IN_QMFA - FBITS_LOST_QMFA)
- #define MIN_GBITS_IN_QMFS 2
- #define FBITS_IN_QMFS FBITS_OUT_QMFA
- #define FBITS_LOST_DCT4_64 (2 + 3 + 2) /* 2 in premul, 3 in FFT, 2 in postmul */
- #define FBITS_OUT_DQ_ENV 29 /* dequantized env scalefactors are Q(29 - envDataDequantScale) */
- #define FBITS_OUT_DQ_NOISE 24 /* range of Q_orig = [2^-24, 2^6] */
- #define NOISE_FLOOR_OFFSET 6
- /* see comments in ApplyBoost() */
- #define FBITS_GLIM_BOOST 24
- #define FBITS_QLIM_BOOST 14
- #define MAX_HUFF_BITS 20
- #define NUM_QMF_DELAY_BUFS 10
- #define DELAY_SAMPS_QMFA (NUM_QMF_DELAY_BUFS * 32)
- #define DELAY_SAMPS_QMFS (NUM_QMF_DELAY_BUFS * 128)
- /* additional external symbols to name-mangle for static linking */
- #define FFT32C STATNAME(FFT32C)
- #define CalcFreqTables STATNAME(CalcFreqTables)
- #define AdjustHighFreq STATNAME(AdjustHighFreq)
- #define GenerateHighFreq STATNAME(GenerateHighFreq)
- #define DecodeSBREnvelope STATNAME(DecodeSBREnvelope)
- #define DecodeSBRNoise STATNAME(DecodeSBRNoise)
- #define UncoupleSBREnvelope STATNAME(UncoupleSBREnvelope)
- #define UncoupleSBRNoise STATNAME(UncoupleSBRNoise)
- #define InvRNormalized STATNAME(InvRNormalized)
- #define RatioPowInv STATNAME(RatioPowInv)
- #define SqrtFix STATNAME(SqrtFix)
- #define QMFAnalysis STATNAME(QMFAnalysis)
- #define QMFSynthesis STATNAME(QMFSynthesis)
- #define GetSampRateIdx STATNAME(GetSampRateIdx)
- #define UnpackSBRHeader STATNAME(UnpackSBRHeader)
- #define UnpackSBRSingleChannel STATNAME(UnpackSBRSingleChannel)
- #define UnpackSBRChannelPair STATNAME(UnpackSBRChannelPair)
- /* asm functions */
- #define CVKernel1 STATNAME(CVKernel1)
- #define CVKernel2 STATNAME(CVKernel2)
- #define QMFAnalysisConv STATNAME(QMFAnalysisConv)
- #define QMFSynthesisConv STATNAME(QMFSynthesisConv)
- #define k0Tab STATNAME(k0Tab)
- #define k2Tab STATNAME(k2Tab)
- #define goalSBTab STATNAME(goalSBTab)
- #define huffTabSBR STATNAME(huffTabSBR)
- #define huffTabSBRInfo STATNAME(huffTabSBRInfo)
- #define log2Tab STATNAME(log2Tab)
- #define noiseTab STATNAME(noiseTab)
- #define cTabA STATNAME(cTabA)
- #define cTabS STATNAME(cTabS)
- /* do y <<= n, clipping to range [-2^30, 2^30 - 1] (i.e. output has one guard bit) */
- #define CLIP_2N_SHIFT30(y, n) { \
- int sign = (y) >> 31; \
- if (sign != (y) >> (30 - (n))) { \
- (y) = sign ^ (0x3fffffff); \
- } else { \
- (y) = (y) << (n); \
- } \
- }
- /*
- #define CLIP_2N(y, n) { \
- int sign = (y) >> 31; \
- if (sign != ((y) >> (n))) { \
- (y) = sign ^ ((1 << (n)) - 1); \
- } \
- }
- */
- enum {
- SBR_GRID_FIXFIX = 0,
- SBR_GRID_FIXVAR = 1,
- SBR_GRID_VARFIX = 2,
- SBR_GRID_VARVAR = 3
- };
- enum {
- HuffTabSBR_tEnv15 = 0,
- HuffTabSBR_fEnv15 = 1,
- HuffTabSBR_tEnv15b = 2,
- HuffTabSBR_fEnv15b = 3,
- HuffTabSBR_tEnv30 = 4,
- HuffTabSBR_fEnv30 = 5,
- HuffTabSBR_tEnv30b = 6,
- HuffTabSBR_fEnv30b = 7,
- HuffTabSBR_tNoise30 = 8,
- HuffTabSBR_fNoise30 = 5,
- HuffTabSBR_tNoise30b = 9,
- HuffTabSBR_fNoise30b = 7
- };
- typedef struct _HuffInfo {
- int maxBits; /* number of bits in longest codeword */
- unsigned /*char*/ int count[MAX_HUFF_BITS]; /* count[i] = number of codes with length i+1 bits */
- int offset; /* offset into symbol table */
- } HuffInfo;
- /* need one SBRHeader per element (SCE/CPE), updated only on new header */
- typedef struct _SBRHeader {
- int count;
- unsigned char ampRes;
- unsigned char startFreq;
- unsigned char stopFreq;
- unsigned char crossOverBand;
- unsigned char resBitsHdr;
- unsigned char hdrExtra1;
- unsigned char hdrExtra2;
- unsigned char freqScale;
- unsigned char alterScale;
- unsigned char noiseBands;
-
- unsigned char limiterBands;
- unsigned char limiterGains;
- unsigned char interpFreq;
- unsigned char smoothMode;
- } SBRHeader;
- /* need one SBRGrid per channel, updated every frame */
- typedef struct _SBRGrid {
- unsigned char frameClass;
- unsigned char ampResFrame;
- unsigned char pointer;
- unsigned char numEnv; /* L_E */
- unsigned char envTimeBorder[MAX_NUM_ENV+1]; /* t_E */
- unsigned char freqRes[MAX_NUM_ENV]; /* r */
- unsigned char numNoiseFloors; /* L_Q */
- unsigned char noiseTimeBorder[MAX_NUM_NOISE_FLOORS+1]; /* t_Q */
- unsigned char numEnvPrev;
- unsigned char numNoiseFloorsPrev;
- unsigned char freqResPrev;
- } SBRGrid;
- /* need one SBRFreq per element (SCE/CPE/LFE), updated only on header reset */
- typedef struct _SBRFreq {
- int kStart; /* k_x */
- int nMaster;
- int nHigh;
- int nLow;
- int nLimiter; /* N_l */
- int numQMFBands; /* M */
- int numNoiseFloorBands; /* Nq */
- int kStartPrev;
- int numQMFBandsPrev;
- unsigned char freqMaster[MAX_QMF_BANDS + 1]; /* not necessary to save this after derived tables are generated */
- unsigned char freqHigh[MAX_QMF_BANDS + 1];
- unsigned char freqLow[MAX_QMF_BANDS / 2 + 1]; /* nLow = nHigh - (nHigh >> 1) */
- unsigned char freqNoise[MAX_NUM_NOISE_FLOOR_BANDS+1];
- unsigned char freqLimiter[MAX_QMF_BANDS / 2 + MAX_NUM_PATCHES]; /* max (intermediate) size = nLow + numPatches - 1 */
- unsigned char numPatches;
- unsigned char patchNumSubbands[MAX_NUM_PATCHES + 1];
- unsigned char patchStartSubband[MAX_NUM_PATCHES + 1];
- } SBRFreq;
- typedef struct _SBRChan {
- int reset;
- unsigned char deltaFlagEnv[MAX_NUM_ENV];
- unsigned char deltaFlagNoise[MAX_NUM_NOISE_FLOORS];
- signed char envDataQuant[MAX_NUM_ENV][MAX_QMF_BANDS]; /* range = [0, 127] */
- signed char noiseDataQuant[MAX_NUM_NOISE_FLOORS][MAX_NUM_NOISE_FLOOR_BANDS];
- unsigned char invfMode[2][MAX_NUM_NOISE_FLOOR_BANDS]; /* invfMode[0/1][band] = prev/curr */
- int chirpFact[MAX_NUM_NOISE_FLOOR_BANDS]; /* bwArray */
- unsigned char addHarmonicFlag[2]; /* addHarmonicFlag[0/1] = prev/curr */
- unsigned char addHarmonic[2][64]; /* addHarmonic[0/1][band] = prev/curr */
-
- int gbMask[2]; /* gbMask[0/1] = XBuf[0-31]/XBuf[32-39] */
- signed char laPrev;
- int noiseTabIndex;
- int sinIndex;
- int gainNoiseIndex;
- int gTemp[MAX_NUM_SMOOTH_COEFS][MAX_QMF_BANDS];
- int qTemp[MAX_NUM_SMOOTH_COEFS][MAX_QMF_BANDS];
- } SBRChan;
- typedef struct _PSInfoSBR {
- /* save for entire file */
- int frameCount;
- int sampRateIdx;
- /* state info that must be saved for each channel */
- SBRHeader sbrHdr[AAC_MAX_NCHANS];
- SBRGrid sbrGrid[AAC_MAX_NCHANS];
- SBRFreq sbrFreq[AAC_MAX_NCHANS];
- SBRChan sbrChan[AAC_MAX_NCHANS];
- /* temp variables, no need to save between blocks */
- unsigned char dataExtra;
- unsigned char resBitsData;
- unsigned char extendedDataPresent;
- int extendedDataSize;
- signed char envDataDequantScale[MAX_NCHANS_ELEM][MAX_NUM_ENV];
- int envDataDequant[MAX_NCHANS_ELEM][MAX_NUM_ENV][MAX_QMF_BANDS];
- int noiseDataDequant[MAX_NCHANS_ELEM][MAX_NUM_NOISE_FLOORS][MAX_NUM_NOISE_FLOOR_BANDS];
- int eCurr[MAX_QMF_BANDS];
- unsigned char eCurrExp[MAX_QMF_BANDS];
- unsigned char eCurrExpMax;
- signed char la;
- int crcCheckWord;
- int couplingFlag;
- int envBand;
- int eOMGainMax;
- int gainMax;
- int gainMaxFBits;
- int noiseFloorBand;
- int qp1Inv;
- int qqp1Inv;
- int sMapped;
- int sBand;
- int highBand;
- int sumEOrigMapped;
- int sumECurrGLim;
- int sumSM;
- int sumQM;
- int gLimBoost[MAX_QMF_BANDS];
- int qmLimBoost[MAX_QMF_BANDS];
- int smBoost[MAX_QMF_BANDS];
- int smBuf[MAX_QMF_BANDS];
- int qmLimBuf[MAX_QMF_BANDS];
- int gLimBuf[MAX_QMF_BANDS];
- int gLimFbits[MAX_QMF_BANDS];
- int gFiltLast[MAX_QMF_BANDS];
- int qFiltLast[MAX_QMF_BANDS];
- /* large buffers */
- int delayIdxQMFA[AAC_MAX_NCHANS];
- int delayQMFA[AAC_MAX_NCHANS][DELAY_SAMPS_QMFA];
- int delayIdxQMFS[AAC_MAX_NCHANS];
- int delayQMFS[AAC_MAX_NCHANS][DELAY_SAMPS_QMFS];
- int XBufDelay[AAC_MAX_NCHANS][HF_GEN][64][2];
- int XBuf[32+8][64][2];
- } PSInfoSBR;
- /* sbrfft.c */
- void FFT32C(int *x);
- /* sbrfreq.c */
- int CalcFreqTables(SBRHeader *sbrHdr, SBRFreq *sbrFreq, int sampRateIdx);
- /* sbrhfadj.c */
- void AdjustHighFreq(PSInfoSBR *psi, SBRHeader *sbrHdr, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int ch);
- /* sbrhfgen.c */
- void GenerateHighFreq(PSInfoSBR *psi, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int ch);
- /* sbrhuff.c */
- void DecodeSBREnvelope(BitStreamInfo *bsi, PSInfoSBR *psi, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int ch);
- void DecodeSBRNoise(BitStreamInfo *bsi, PSInfoSBR *psi, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChan, int ch);
- void UncoupleSBREnvelope(PSInfoSBR *psi, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChanR);
- void UncoupleSBRNoise(PSInfoSBR *psi, SBRGrid *sbrGrid, SBRFreq *sbrFreq, SBRChan *sbrChanR);
- /* sbrmath.c */
- int InvRNormalized(int r);
- int RatioPowInv(int a, int b, int c);
- int SqrtFix(int x, int fBitsIn, int *fBitsOut);
- /* sbrqmf.c */
- int QMFAnalysis(int *inbuf, int *delay, int *XBuf, int fBitsIn, int *delayIdx, int qmfaBands);
- void QMFSynthesis(int *inbuf, int *delay, int *delayIdx, int qmfsBands, short *outbuf, int nChans);
- /* sbrside.c */
- int GetSampRateIdx(int sampRate);
- int UnpackSBRHeader(BitStreamInfo *bsi, SBRHeader *sbrHdr);
- void UnpackSBRSingleChannel(BitStreamInfo *bsi, PSInfoSBR *psi, int chOut);
- void UnpackSBRChannelPair(BitStreamInfo *bsi, PSInfoSBR *psi, int chOut);
- /* sbrtabs.c */
- extern const unsigned char k0Tab[NUM_SAMPLE_RATES_SBR][16];
- extern const unsigned char k2Tab[NUM_SAMPLE_RATES_SBR][14];
- extern const unsigned char goalSBTab[NUM_SAMPLE_RATES_SBR];
- extern const HuffInfo huffTabSBRInfo[10];
- extern const signed int /*short*/ huffTabSBR[604];
- extern const int log2Tab[65];
- extern const int noiseTab[512*2];
- extern const int cTabA[165];
- extern const int cTabS[640];
- #endif /* _SBR_H */
|