| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373 | /* ***** BEGIN LICENSE BLOCK *****   * Source last modified: $Id: coder.h,v 1.2 2005/06/27 21:06:00 gwright 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 * * coder.h - definitions of platform-specific data structures, functions, and tables **************************************************************************************/#ifndef _CODER_H#define _CODER_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 NWINDOWS_LONG           1#define NWINDOWS_SHORT          8#define DATA_BUF_SIZE           510             /* max count = 255 + 255 */#define FILL_BUF_SIZE           269             /* max count = 15 + 255 - 1*/#define ADIF_COPYID_SIZE        9#define MAX_COMMENT_BYTES       255#define MAX_NUM_FCE                     15#define MAX_NUM_SCE                     15#define MAX_NUM_BCE                     15#define MAX_NUM_LCE                      3#define MAX_NUM_ADE                      7#define MAX_NUM_CCE                     15#define CHAN_ELEM_IS_CPE(x)             (((x) & 0x10) >> 4)  /* bit 4 = SCE/CPE flag */#define CHAN_ELEM_GET_TAG(x)    (((x) & 0x0f) >> 0)  /* bits 3-0 = instance tag */#define CHAN_ELEM_SET_CPE(x)    (((x) & 0x01) << 4)  /* bit 4 = SCE/CPE flag */#define CHAN_ELEM_SET_TAG(x)    (((x) & 0x0f) << 0)  /* bits 3-0 = instance tag */#define MAX_HUFF_BITS                   20#define HUFFTAB_SPEC_OFFSET             1/* do y <<= n, clipping to range [-2^30, 2^30 - 1] (i.e. output has one guard bit) *//*#define CLIP_2N_SHIFT(y, n) {                   \        int sign = (y) >> 31;                   \        if (sign != (y) >> (30 - (n)))  {       \            (y) = sign ^ (0x3fffffff);          \        } else {                                \            (y) = (y) << (n);                   \        }                                       \    }*//* clip to [-2^n, 2^n-1], valid range of n = [1, 30] *//*#define CLIP_2N(val, n) {                               \        if ((val) >> 31 != (val) >> (n))                \            (val) = ((val) >> 31) ^ ((1 << (n)) - 1);   \    }*/	#define SF_DQ_OFFSET            15#define FBITS_OUT_DQ            20#define FBITS_OUT_DQ_OFF        (FBITS_OUT_DQ - SF_DQ_OFFSET)   /* number of fraction bits out of dequant, including 2^15 bias */#define FBITS_IN_IMDCT          FBITS_OUT_DQ_OFF        /* number of fraction bits into IMDCT */#define GBITS_IN_DCT4           4                                       /* min guard bits in for DCT4 */#define FBITS_LOST_DCT4         1               /* number of fraction bits lost (>> out) in DCT-IV */#define FBITS_LOST_WND          1               /* number of fraction bits lost (>> out) in synthesis window (neg = gain frac bits) */#define FBITS_LOST_IMDCT        (FBITS_LOST_DCT4 + FBITS_LOST_WND)#define FBITS_OUT_IMDCT         (FBITS_IN_IMDCT - FBITS_LOST_IMDCT)#define NUM_IMDCT_SIZES         2/* additional external symbols to name-mangle for static linking */#define DecodeProgramConfigElement              STATNAME(DecodeProgramConfigElement)#define DecodeHuffmanScalar                             STATNAME(DecodeHuffmanScalar)#define DecodeSpectrumLong                              STATNAME(DecodeSpectrumLong)#define DecodeSpectrumShort                             STATNAME(DecodeSpectrumShort)#define DecodeICSInfo                                   STATNAME(DecodeICSInfo)#define DCT4                                                    STATNAME(DCT4)#define R4FFT                                                   STATNAME(R4FFT)#define DecWindowOverlapNoClip                  STATNAME(DecWindowOverlapNoClip)#define DecWindowOverlapLongStartNoClip STATNAME(DecWindowOverlapLongStartNoClip)#define DecWindowOverlapLongStopNoClip  STATNAME(DecWindowOverlapLongStopNoClip)#define DecWindowOverlapShortNoClip             STATNAME(DecWindowOverlapShortNoClip)#define huffTabSpecInfo                         STATNAME(huffTabSpecInfo)#define huffTabSpec                                     STATNAME(huffTabSpec)#define huffTabScaleFactInfo            STATNAME(huffTabScaleFactInfo)#define huffTabScaleFact                        STATNAME(huffTabScaleFact)#define cos4sin4tab                                     STATNAME(cos4sin4tab)#define cos4sin4tabOffset                       STATNAME(cos4sin4tabOffset)#define cos1sin1tab                                     STATNAME(cos1sin1tab)#define sinWindow                                       STATNAME(sinWindow)#define sinWindowOffset                         STATNAME(sinWindowOffset)#define kbdWindow                                       STATNAME(kbdWindow)#define kbdWindowOffset                         STATNAME(kbdWindowOffset)#define bitrevtab                                       STATNAME(bitrevtab)#define bitrevtabOffset                         STATNAME(bitrevtabOffset)#define uniqueIDTab                                     STATNAME(uniqueIDTab)#define twidTabEven                                     STATNAME(twidTabEven)#define twidTabOdd                                      STATNAME(twidTabOdd)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;typedef struct _PulseInfo {    unsigned char pulseDataPresent;    unsigned char numPulse;    unsigned char startSFB;    unsigned char offset[MAX_PULSES];    unsigned char amp[MAX_PULSES];} PulseInfo;typedef struct _TNSInfo {    unsigned char tnsDataPresent;    unsigned char numFilt[MAX_TNS_FILTERS];     /* max 1 filter each for 8 short windows, or 3 filters for 1 long window */    unsigned char coefRes[MAX_TNS_FILTERS];    unsigned char length[MAX_TNS_FILTERS];    unsigned char order[MAX_TNS_FILTERS];    unsigned char dir[MAX_TNS_FILTERS];    signed char   coef[MAX_TNS_COEFS];              /* max 3 filters * 20 coefs for 1 long window, or 1 filter * 7 coefs for each of 8 short windows */} TNSInfo;typedef struct _GainControlInfo {    unsigned char gainControlDataPresent;    unsigned char maxBand;    unsigned char adjNum[MAX_GAIN_BANDS][MAX_GAIN_WIN];    unsigned char alevCode[MAX_GAIN_BANDS][MAX_GAIN_WIN][MAX_GAIN_ADJUST];    unsigned char alocCode[MAX_GAIN_BANDS][MAX_GAIN_WIN][MAX_GAIN_ADJUST];} GainControlInfo;typedef struct _ICSInfo {    unsigned char icsResBit;    unsigned char winSequence;    unsigned char winShape;    unsigned char maxSFB;    unsigned char sfGroup;    unsigned char predictorDataPresent;    unsigned char predictorReset;    unsigned char predictorResetGroupNum;    unsigned char predictionUsed[MAX_PRED_SFB];    unsigned char numWinGroup;    unsigned char winGroupLen[MAX_WIN_GROUPS];} ICSInfo;typedef struct _ADTSHeader {    /* fixed */    unsigned char id;                             /* MPEG bit - should be 1 */    unsigned char layer;                          /* MPEG layer - should be 0 */    unsigned char protectBit;                     /* 0 = CRC word follows, 1 = no CRC word */    unsigned char profile;                        /* 0 = main, 1 = LC, 2 = SSR, 3 = reserved */    unsigned char sampRateIdx;                    /* sample rate index range = [0, 11] */    unsigned char privateBit;                     /* ignore */    unsigned char channelConfig;                  /* 0 = implicit, >0 = use default table */    unsigned char origCopy;                       /* 0 = copy, 1 = original */    unsigned char home;                           /* ignore */    /* variable */    unsigned char copyBit;                        /* 1 bit of the 72-bit copyright ID (transmitted as 1 bit per frame) */    unsigned char copyStart;                      /* 1 = this bit starts the 72-bit ID, 0 = it does not */    int           frameLength;                    /* length of frame */    int           bufferFull;                     /* number of 32-bit words left in enc buffer, 0x7FF = VBR */    unsigned char numRawDataBlocks;               /* number of raw data blocks in frame */    /* CRC */    int           crcCheckWord;                   /* 16-bit CRC check word (present if protectBit == 0) */} ADTSHeader;typedef struct _ADIFHeader {    unsigned char copyBit;                        /* 0 = no copyright ID, 1 = 72-bit copyright ID follows immediately */    unsigned char origCopy;                       /* 0 = copy, 1 = original */    unsigned char home;                           /* ignore */    unsigned char bsType;                         /* bitstream type: 0 = CBR, 1 = VBR */    int           bitRate;                        /* bitRate: CBR = bits/sec, VBR = peak bits/frame, 0 = unknown */    unsigned char numPCE;                         /* number of program config elements (max = 16) */    int           bufferFull;                     /* bits left in bit reservoir */    unsigned char copyID[ADIF_COPYID_SIZE];       /* optional 72-bit copyright ID */} ADIFHeader;/* sizeof(ProgConfigElement) = 82 bytes (if KEEP_PCE_COMMENTS not defined) */typedef struct _ProgConfigElement {    unsigned char elemInstTag;                    /* element instance tag */    unsigned char profile;                        /* 0 = main, 1 = LC, 2 = SSR, 3 = reserved */    unsigned char sampRateIdx;                    /* sample rate index range = [0, 11] */    unsigned char numFCE;                         /* number of front channel elements (max = 15) */    unsigned char numSCE;                         /* number of side channel elements (max = 15) */    unsigned char numBCE;                         /* number of back channel elements (max = 15) */    unsigned char numLCE;                         /* number of LFE channel elements (max = 3) */    unsigned char numADE;                         /* number of associated data elements (max = 7) */    unsigned char numCCE;                         /* number of valid channel coupling elements (max = 15) */    unsigned char monoMixdown;                    /* mono mixdown: bit 4 = present flag, bits 3-0 = element number */    unsigned char stereoMixdown;                  /* stereo mixdown: bit 4 = present flag, bits 3-0 = element number */    unsigned char matrixMixdown;                  /* matrix mixdown: bit 4 = present flag, bit 3 = unused,                                                      bits 2-1 = index, bit 0 = pseudo-surround enable */    unsigned char fce[MAX_NUM_FCE];               /* front element channel pair: bit 4 = SCE/CPE flag, bits 3-0 = inst tag */    unsigned char sce[MAX_NUM_SCE];               /* side element channel pair: bit 4 = SCE/CPE flag, bits 3-0 = inst tag */    unsigned char bce[MAX_NUM_BCE];               /* back element channel pair: bit 4 = SCE/CPE flag, bits 3-0 = inst tag */    unsigned char lce[MAX_NUM_LCE];               /* instance tag for LFE elements */    unsigned char ade[MAX_NUM_ADE];               /* instance tag for ADE elements */    unsigned char cce[MAX_NUM_BCE];               /* channel coupling elements: bit 4 = switching flag, bits 3-0 = inst tag */#ifdef KEEP_PCE_COMMENTS    /* make this optional - if not enabled, decoder will just skip comments */    unsigned char commentBytes;    unsigned char commentField[MAX_COMMENT_BYTES];#endif} ProgConfigElement;/* state info struct for baseline (MPEG-4 LC) decoding */typedef struct _PSInfoBase {    /* header information */    ADTSHeader            fhADTS;    ADIFHeader            fhADIF;    ProgConfigElement     pce[MAX_NUM_PCE_ADIF];    int                   dataCount;    unsigned char         dataBuf[DATA_BUF_SIZE];    int                   fillCount;    unsigned char         fillBuf[FILL_BUF_SIZE];    /* state information which is the same throughout whole frame */    int                   nChans;    int                   useImpChanMap;    int                   sampRateIdx;    /* state information which can be overwritten by subsequent elements within frame */    ICSInfo               icsInfo[MAX_NCHANS_ELEM];    int                   commonWin;    short                 scaleFactors[MAX_NCHANS_ELEM][MAX_SF_BANDS];    unsigned char         sfbCodeBook[MAX_NCHANS_ELEM][MAX_SF_BANDS];    int                   msMaskPresent;    unsigned char         msMaskBits[MAX_MS_MASK_BYTES];    int                   pnsUsed[MAX_NCHANS_ELEM];    int                   pnsLastVal;    int                   intensityUsed[MAX_NCHANS_ELEM];    PulseInfo             pulseInfo[MAX_NCHANS_ELEM];    TNSInfo               tnsInfo[MAX_NCHANS_ELEM];    int                   tnsLPCBuf[MAX_TNS_ORDER];    int                   tnsWorkBuf[MAX_TNS_ORDER];    GainControlInfo       gainControlInfo[MAX_NCHANS_ELEM];    int                   gbCurrent[MAX_NCHANS_ELEM];    int                   coef[MAX_NCHANS_ELEM][AAC_MAX_NSAMPS];#ifdef AAC_ENABLE_SBR    int                   sbrWorkBuf[MAX_NCHANS_ELEM][AAC_MAX_NSAMPS];#endif    /* state information which must be saved for each element and used in next frame */    int                   overlap[AAC_MAX_NCHANS][AAC_MAX_NSAMPS];    int                   prevWinShape[AAC_MAX_NCHANS];} PSInfoBase;/* private implementation-specific functions *//* decelmnt.c */int DecodeProgramConfigElement(ProgConfigElement *pce, BitStreamInfo *bsi);/* huffman.c */int DecodeHuffmanScalar(const signed short *huffTab, const HuffInfo *huffTabInfo, unsigned int bitBuf, signed int *val);void DecodeSpectrumLong(PSInfoBase *psi, BitStreamInfo *bsi, int ch);void DecodeSpectrumShort(PSInfoBase *psi, BitStreamInfo *bsi, int ch);/* noiseless.c */void DecodeICSInfo(BitStreamInfo *bsi, ICSInfo *icsInfo, int sampRateIdx);/* dct4.c */void DCT4(int tabidx, int *coef, int gb);/* fft.c */void R4FFT(int tabidx, int *x);/* sbrimdct.c */void DecWindowOverlapNoClip(int *buf0, int *over0, int *out0, int winTypeCurr, int winTypePrev);void DecWindowOverlapLongStartNoClip(int *buf0, int *over0, int *out0, int winTypeCurr, int winTypePrev);void DecWindowOverlapLongStopNoClip(int *buf0, int *over0, int *out0, int winTypeCurr, int winTypePrev);void DecWindowOverlapShortNoClip(int *buf0, int *over0, int *out0, int winTypeCurr, int winTypePrev);/* hufftabs.c */extern const HuffInfo huffTabSpecInfo[11];extern const signed short huffTabSpec[1241];extern const HuffInfo huffTabScaleFactInfo; extern const signed short huffTabScaleFact[121];/* trigtabs.c */extern const int cos4sin4tabOffset[NUM_IMDCT_SIZES];extern const int sinWindowOffset[NUM_IMDCT_SIZES];extern const int kbdWindowOffset[NUM_IMDCT_SIZES];extern const unsigned char bitrevtab[17 + 129];extern const int bitrevtabOffset[NUM_IMDCT_SIZES];#ifdef HELIX_CONFIG_AAC_GENERATE_TRIGTABS_FLOAT/* trigtabs_fltgen.c */extern int cos4sin4tab[128 + 1024];extern int cos1sin1tab[514];extern int sinWindow[128 + 1024];extern int kbdWindow[128 + 1024];extern int twidTabEven[4*6 + 16*6 + 64*6];extern int twidTabOdd[8*6 + 32*6 + 128*6];#else/* trigtabs.c */extern const int cos4sin4tab[128 + 1024];extern const int cos1sin1tab[514];extern const int sinWindow[128 + 1024];extern const int kbdWindow[128 + 1024];extern const int twidTabEven[4*6 + 16*6 + 64*6];extern const int twidTabOdd[8*6 + 32*6 + 128*6];#endif#endif  /* _CODER_H */
 |