ex

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers coder.h Source File

coder.h

00001 /* ***** BEGIN LICENSE BLOCK ***** 
00002  * Version: RCSL 1.0/RPSL 1.0 
00003  *  
00004  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
00005  *      
00006  * The contents of this file, and the files included with this file, are 
00007  * subject to the current version of the RealNetworks Public Source License 
00008  * Version 1.0 (the "RPSL") available at 
00009  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
00010  * the file under the RealNetworks Community Source License Version 1.0 
00011  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
00012  * in which case the RCSL will apply. You may also obtain the license terms 
00013  * directly from RealNetworks.  You may not use this file except in 
00014  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
00015  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
00016  * RCSL for the rights, obligations and limitations governing use of the 
00017  * contents of the file.  
00018  *  
00019  * This file is part of the Helix DNA Technology. RealNetworks is the 
00020  * developer of the Original Code and owns the copyrights in the portions 
00021  * it created. 
00022  *  
00023  * This file, and the files included with this file, is distributed and made 
00024  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
00025  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
00026  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
00027  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
00028  * 
00029  * Technology Compatibility Kit Test Suite(s) Location: 
00030  *    http://www.helixcommunity.org/content/tck 
00031  * 
00032  * Contributor(s): 
00033  *  
00034  * ***** END LICENSE BLOCK ***** */ 
00035 
00036 /**************************************************************************************
00037  * Fixed-point MP3 decoder
00038  * Jon Recker (jrecker@real.com), Ken Cooke (kenc@real.com)
00039  * June 2003
00040  *
00041  * coder.h - private, implementation-specific header file
00042  **************************************************************************************/
00043 
00044 #ifndef _CODER_H
00045 #define _CODER_H
00046 
00047 #include "mp3common.h"
00048 
00049 #if defined(_WIN32) && defined(_M_IX86) && (defined (_DEBUG) || defined (REL_ENABLE_ASSERTS))
00050 #define ASSERT(x) if (!(x)) __asm int 3;
00051 #else
00052 #define ASSERT(x) /* do nothing */
00053 #endif
00054 
00055 #ifndef MAX
00056 #define MAX(a,b)    ((a) > (b) ? (a) : (b))
00057 #endif
00058 
00059 #ifndef MIN
00060 #define MIN(a,b)    ((a) < (b) ? (a) : (b))
00061 #endif
00062 
00063 /* clip to range [-2^n, 2^n - 1] */
00064 #define CLIP_2N(y, n) { \
00065     int sign = (y) >> 31;  \
00066     if (sign != (y) >> (n))  { \
00067         (y) = sign ^ ((1 << (n)) - 1); \
00068     } \
00069 }
00070 
00071 #define SIBYTES_MPEG1_MONO      17
00072 #define SIBYTES_MPEG1_STEREO    32
00073 #define SIBYTES_MPEG2_MONO       9
00074 #define SIBYTES_MPEG2_STEREO    17
00075 
00076 /* number of fraction bits for pow43Tab (see comments there) */
00077 #define POW43_FRACBITS_LOW      22
00078 #define POW43_FRACBITS_HIGH     12
00079 
00080 #define DQ_FRACBITS_OUT         25  /* number of fraction bits in output of dequant */
00081 #define IMDCT_SCALE             2   /* additional scaling (by sqrt(2)) for fast IMDCT36 */
00082 
00083 #define HUFF_PAIRTABS           32
00084 #define BLOCK_SIZE              18
00085 #define NBANDS                  32
00086 #define MAX_REORDER_SAMPS       ((192-126)*3)       /* largest critical band for short blocks (see sfBandTable) */
00087 #define VBUF_LENGTH             (17 * 2 * NBANDS)   /* for double-sized vbuf FIFO */
00088 
00089 /* additional external symbols to name-mangle for static linking */
00090 #define SetBitstreamPointer STATNAME(SetBitstreamPointer)
00091 #define GetBits             STATNAME(GetBits)
00092 #define CalcBitsUsed        STATNAME(CalcBitsUsed)
00093 #define DequantChannel      STATNAME(DequantChannel)
00094 #define MidSideProc         STATNAME(MidSideProc)
00095 #define IntensityProcMPEG1  STATNAME(IntensityProcMPEG1)
00096 #define IntensityProcMPEG2  STATNAME(IntensityProcMPEG2)
00097 #define PolyphaseMono       STATNAME(PolyphaseMono)
00098 #define PolyphaseStereo     STATNAME(PolyphaseStereo)
00099 #define FDCT32              STATNAME(FDCT32)
00100 
00101 #define ISFMpeg1            STATNAME(ISFMpeg1)
00102 #define ISFMpeg2            STATNAME(ISFMpeg2)
00103 #define ISFIIP              STATNAME(ISFIIP)
00104 #define uniqueIDTab         STATNAME(uniqueIDTab)
00105 #define coef32              STATNAME(coef32)
00106 #define polyCoef            STATNAME(polyCoef)
00107 #define csa                 STATNAME(csa)
00108 #define imdctWin            STATNAME(imdctWin)
00109 
00110 #define huffTable           STATNAME(huffTable)
00111 #define huffTabOffset       STATNAME(huffTabOffset)
00112 #define huffTabLookup       STATNAME(huffTabLookup)
00113 #define quadTable           STATNAME(quadTable)
00114 #define quadTabOffset       STATNAME(quadTabOffset)
00115 #define quadTabMaxBits      STATNAME(quadTabMaxBits)
00116 
00117 /* map these to the corresponding 2-bit values in the frame header */
00118 typedef enum {
00119     Stereo = 0x00,  /* two independent channels, but L and R frames might have different # of bits */
00120     Joint = 0x01,   /* coupled channels - layer III: mix of M-S and intensity, Layers I/II: intensity and direct coding only */
00121     Dual = 0x02,    /* two independent channels, L and R always have exactly 1/2 the total bitrate */
00122     Mono = 0x03     /* one channel */
00123 } StereoMode;
00124 
00125 typedef struct _BitStreamInfo {
00126     unsigned char *bytePtr;
00127     unsigned int iCache;
00128     int cachedBits;
00129     int nBytes;
00130 } BitStreamInfo;
00131 
00132 typedef struct _FrameHeader {
00133     MPEGVersion ver;    /* version ID */
00134     int layer;          /* layer index (1, 2, or 3) */
00135     int crc;            /* CRC flag: 0 = disabled, 1 = enabled */
00136     int brIdx;          /* bitrate index (0 - 15) */
00137     int srIdx;          /* sample rate index (0 - 2) */
00138     int paddingBit;     /* padding flag: 0 = no padding, 1 = single pad byte */
00139     int privateBit;     /* unused */
00140     StereoMode sMode;   /* mono/stereo mode */
00141     int modeExt;        /* used to decipher joint stereo mode */
00142     int copyFlag;       /* copyright flag: 0 = no, 1 = yes */
00143     int origFlag;       /* original flag: 0 = copy, 1 = original */
00144     int emphasis;       /* deemphasis mode */
00145     int CRCWord;        /* CRC word (16 bits, 0 if crc not enabled) */
00146 
00147     const SFBandTable *sfBand;
00148 } FrameHeader;
00149 
00150 typedef struct _SideInfoSub {
00151     int part23Length;       /* number of bits in main data */ 
00152     int nBigvals;           /* 2x this = first set of Huffman cw's (maximum amplitude can be > 1) */
00153     int globalGain;         /* overall gain for dequantizer */
00154     int sfCompress;         /* unpacked to figure out number of bits in scale factors */
00155     int winSwitchFlag;      /* window switching flag */
00156     int blockType;          /* block type */
00157     int mixedBlock;         /* 0 = regular block (all short or long), 1 = mixed block */
00158     int tableSelect[3];     /* index of Huffman tables for the big values regions */
00159     int subBlockGain[3];    /* subblock gain offset, relative to global gain */
00160     int region0Count;       /* 1+region0Count = num scale factor bands in first region of bigvals */
00161     int region1Count;       /* 1+region1Count = num scale factor bands in second region of bigvals */
00162     int preFlag;            /* for optional high frequency boost */
00163     int sfactScale;         /* scaling of the scalefactors */
00164     int count1TableSelect;  /* index of Huffman table for quad codewords */
00165 } SideInfoSub;
00166 
00167 typedef struct _SideInfo {
00168     int mainDataBegin;
00169     int privateBits;
00170     int scfsi[MAX_NCHAN][MAX_SCFBD];                /* 4 scalefactor bands per channel */
00171     
00172     SideInfoSub sis[MAX_NGRAN][MAX_NCHAN];
00173 } SideInfo;
00174 
00175 typedef struct {
00176     int cbType;     /* pure long = 0, pure short = 1, mixed = 2 */
00177     int cbEndS[3];  /* number nonzero short cb's, per subbblock */
00178     int cbEndSMax;  /* max of cbEndS[] */
00179     int cbEndL;     /* number nonzero long cb's  */
00180 } CriticalBandInfo;
00181 
00182 typedef struct _DequantInfo {
00183     int workBuf[MAX_REORDER_SAMPS];     /* workbuf for reordering short blocks */
00184     CriticalBandInfo cbi[MAX_NCHAN];    /* filled in dequantizer, used in joint stereo reconstruction */
00185 } DequantInfo;
00186 
00187 typedef struct _HuffmanInfo {
00188     int huffDecBuf[MAX_NCHAN][MAX_NSAMP];       /* used both for decoded Huffman values and dequantized coefficients */
00189     int nonZeroBound[MAX_NCHAN];                /* number of coeffs in huffDecBuf[ch] which can be > 0 */
00190     int gb[MAX_NCHAN];                          /* minimum number of guard bits in huffDecBuf[ch] */
00191 } HuffmanInfo;
00192 
00193 typedef enum _HuffTabType {
00194     noBits,
00195     oneShot,
00196     loopNoLinbits,
00197     loopLinbits,
00198     quadA,
00199     quadB,
00200     invalidTab
00201 } HuffTabType;
00202 
00203 typedef struct _HuffTabLookup {
00204     int linBits;
00205     HuffTabType tabType;
00206 } HuffTabLookup;
00207 
00208 typedef struct _IMDCTInfo {
00209     int outBuf[MAX_NCHAN][BLOCK_SIZE][NBANDS];  /* output of IMDCT */   
00210     int overBuf[MAX_NCHAN][MAX_NSAMP / 2];      /* overlap-add buffer (by symmetry, only need 1/2 size) */
00211     int numPrevIMDCT[MAX_NCHAN];                /* how many IMDCT's calculated in this channel on prev. granule */
00212     int prevType[MAX_NCHAN];
00213     int prevWinSwitch[MAX_NCHAN];
00214     int gb[MAX_NCHAN];
00215 } IMDCTInfo;
00216 
00217 typedef struct _BlockCount {
00218     int nBlocksLong;
00219     int nBlocksTotal;
00220     int nBlocksPrev; 
00221     int prevType;
00222     int prevWinSwitch;
00223     int currWinSwitch;
00224     int gbIn;
00225     int gbOut;
00226 } BlockCount;
00227 
00228 /* max bits in scalefactors = 5, so use char's to save space */
00229 typedef struct _ScaleFactorInfoSub {
00230     char l[23];            /* [band] */
00231     char s[13][3];         /* [band][window] */
00232 } ScaleFactorInfoSub;  
00233 
00234 /* used in MPEG 2, 2.5 intensity (joint) stereo only */
00235 typedef struct _ScaleFactorJS {
00236     int intensityScale;     
00237     int slen[4];
00238     int nr[4];
00239 } ScaleFactorJS;
00240 
00241 typedef struct _ScaleFactorInfo {
00242     ScaleFactorInfoSub sfis[MAX_NGRAN][MAX_NCHAN];
00243     ScaleFactorJS sfjs;
00244 } ScaleFactorInfo;
00245 
00246 /* NOTE - could get by with smaller vbuf if memory is more important than speed
00247  *  (in Subband, instead of replicating each block in FDCT32 you would do a memmove on the
00248  *   last 15 blocks to shift them down one, a hardware style FIFO)
00249  */ 
00250 typedef struct _SubbandInfo {
00251     int vbuf[MAX_NCHAN * VBUF_LENGTH];      /* vbuf for fast DCT-based synthesis PQMF - double size for speed (no modulo indexing) */
00252     int vindex;                             /* internal index for tracking position in vbuf */
00253 } SubbandInfo;
00254 
00255 /* bitstream.c */
00256 void SetBitstreamPointer(BitStreamInfo *bsi, int nBytes, unsigned char *buf);
00257 unsigned int GetBits(BitStreamInfo *bsi, int nBits);
00258 int CalcBitsUsed(BitStreamInfo *bsi, unsigned char *startBuf, int startOffset);
00259 
00260 /* dequant.c, dqchan.c, stproc.c */
00261 int DequantChannel(int *sampleBuf, int *workBuf, int *nonZeroBound, FrameHeader *fh, SideInfoSub *sis, 
00262                     ScaleFactorInfoSub *sfis, CriticalBandInfo *cbi);
00263 void MidSideProc(int x[MAX_NCHAN][MAX_NSAMP], int nSamps, int mOut[2]);
00264 void IntensityProcMPEG1(int x[MAX_NCHAN][MAX_NSAMP], int nSamps, FrameHeader *fh, ScaleFactorInfoSub *sfis, 
00265                         CriticalBandInfo *cbi, int midSideFlag, int mixFlag, int mOut[2]);
00266 void IntensityProcMPEG2(int x[MAX_NCHAN][MAX_NSAMP], int nSamps, FrameHeader *fh, ScaleFactorInfoSub *sfis, 
00267                         CriticalBandInfo *cbi, ScaleFactorJS *sfjs, int midSideFlag, int mixFlag, int mOut[2]);
00268 
00269 /* dct32.c */
00270 void FDCT32(int *x, int *d, int offset, int oddBlock, int gb);
00271 
00272 /* hufftabs.c */
00273 extern const HuffTabLookup huffTabLookup[HUFF_PAIRTABS];
00274 extern const int huffTabOffset[HUFF_PAIRTABS];
00275 extern const unsigned short huffTable[];
00276 extern const unsigned char quadTable[64+16];
00277 extern const int quadTabOffset[2];
00278 extern const int quadTabMaxBits[2];
00279 
00280 /* polyphase.c (or asmpoly.s)
00281  * some platforms require a C++ compile of all source files,
00282  * so if we're compiling C as C++ and using native assembly
00283  * for these functions we need to prevent C++ name mangling.
00284  */
00285 #ifdef __cplusplus
00286 extern "C" {
00287 #endif
00288 void PolyphaseMono(short *pcm, int *vbuf, const int *coefBase);
00289 void PolyphaseStereo(short *pcm, int *vbuf, const int *coefBase);
00290 #ifdef __cplusplus
00291 }
00292 #endif
00293 
00294 /* trigtabs.c */
00295 extern const int imdctWin[4][36];
00296 extern const int ISFMpeg1[2][7];
00297 extern const int ISFMpeg2[2][2][16];
00298 extern const int ISFIIP[2][2];
00299 extern const int csa[8][2];
00300 extern const int coef32[31];
00301 extern const int polyCoef[264];
00302 
00303 #endif  /* _CODER_H */