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