00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034  
00035 
00036 
00037 
00038 
00039 
00040 
00041 
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) 
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 
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 
00077 #define POW43_FRACBITS_LOW              22
00078 #define POW43_FRACBITS_HIGH             12
00079 
00080 #define DQ_FRACBITS_OUT                 25      
00081 #define IMDCT_SCALE                             2       
00082 
00083 #define HUFF_PAIRTABS                   32
00084 #define BLOCK_SIZE                              18
00085 #define NBANDS                                  32
00086 #define MAX_REORDER_SAMPS               ((192-126)*3)           
00087 #define VBUF_LENGTH                             (17 * 2 * NBANDS)       
00088 
00089 
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 
00118 typedef enum {
00119         Stereo = 0x00,  
00120         Joint = 0x01,   
00121         Dual = 0x02,    
00122         Mono = 0x03             
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;    
00134     int layer;                  
00135     int crc;                    
00136     int brIdx;                  
00137     int srIdx;                  
00138     int paddingBit;             
00139     int privateBit;             
00140     StereoMode sMode;   
00141     int modeExt;                
00142     int copyFlag;               
00143     int origFlag;               
00144     int emphasis;               
00145     int CRCWord;                
00146 
00147         const SFBandTable *sfBand;
00148 } FrameHeader;
00149 
00150 typedef struct _SideInfoSub {
00151     int part23Length;            
00152     int nBigvals;                       
00153     int globalGain;                     
00154     int sfCompress;                     
00155     int winSwitchFlag;          
00156     int blockType;                      
00157     int mixedBlock;                     
00158     int tableSelect[3];         
00159     int subBlockGain[3];        
00160     int region0Count;           
00161     int region1Count;           
00162     int preFlag;                        
00163     int sfactScale;                     
00164     int count1TableSelect;      
00165 } SideInfoSub;
00166 
00167 typedef struct _SideInfo {
00168         int mainDataBegin;
00169         int privateBits;
00170         int scfsi[MAX_NCHAN][MAX_SCFBD];                                
00171         
00172         SideInfoSub     sis[MAX_NGRAN][MAX_NCHAN];
00173 } SideInfo;
00174 
00175 typedef struct {
00176     int cbType;         
00177     int cbEndS[3];      
00178         int cbEndSMax;  
00179     int cbEndL;         
00180 } CriticalBandInfo;
00181 
00182 typedef struct _DequantInfo {
00183         int workBuf[MAX_REORDER_SAMPS];         
00184         CriticalBandInfo cbi[MAX_NCHAN];        
00185 } DequantInfo;
00186 
00187 typedef struct _HuffmanInfo {
00188         int huffDecBuf[MAX_NCHAN][MAX_NSAMP];           
00189         int nonZeroBound[MAX_NCHAN];                            
00190         int gb[MAX_NCHAN];                                                      
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];         
00210         int overBuf[MAX_NCHAN][MAX_NSAMP / 2];          
00211         int numPrevIMDCT[MAX_NCHAN];                            
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 
00229 typedef struct _ScaleFactorInfoSub {
00230         char l[23];            
00231         char s[13][3];         
00232 } ScaleFactorInfoSub;  
00233 
00234 
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 
00247 
00248 
00249  
00250 typedef struct _SubbandInfo {
00251         int vbuf[MAX_NCHAN * VBUF_LENGTH];              
00252         int vindex;                                                             
00253 } SubbandInfo;
00254 
00255 
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 
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 
00270 void FDCT32(int *x, int *d, int offset, int oddBlock, int gb);
00271 
00272 
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 
00281 
00282 
00283 
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 
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