www.pudn.com > mp3decoder.rar > COMMON.C
/*********************************************** copyright by Haia Tech www.haia2004.com ************************************************/ #include#include #include #include #include "common.h" //extern FILE *file_p; FILE *file_p; extern frame_params fr_ps; extern unsigned int frameNum; Bit_stream_struc bs; unsigned short *mp3_dat; double s_freq[4] = {44.1, 48, 32, 0}; char *mode_names[4] = { "stereo", "j-stereo", "dual-ch", "single-ch" }; char *layer_names[3] = { "I", "II", "III" }; int bitrate[3][15] = { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448}, {0,32,48,56,64,80,96,112,128,160,192,224,256,320,384}, {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320} }; unsigned short buffer[BUFFER_SIZE]; /* open the device to read the bit stream from it */ void open_bit_stream_r() { bs.buf=buffer; bs.read_ptr=0; bs.write_ptr=0; bs.bit_len=16; bs.totbit=0; bs.eof = FALSE; bs.eobs = FALSE; quest_stream(&bs.write_ptr); } /*return the status of the bit stream*/ /* returns 1 if end of bit stream was reached */ /* returns 0 if end of bit stream was not reached */ int mask[8]={0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; int seek_sync(unsigned int sync) { unsigned int aligning; unsigned int val; aligning = bs.totbit%ALIGNING; if (aligning) getbit((int)(ALIGNING-aligning)); //×Ö½Ú¶ÔÆë val = getbit(12); while( ((val&0xfff)!= sync) && (!bs.eobs)) { val<<=ALIGNING; val|=getbit(ALIGNING); } if (bs.eobs) return(0); else return(1); } int js_bound(int lay, int m_ext) { static int jsb_table[3][4] = { { 4, 8, 12, 16 }, { 4, 8, 12, 16}, { 0, 4, 8, 16} }; /* lay+m_e -> jsbound */ // if(lay<1 || lay >3 || m_ext<0 || m_ext>3) { // fprintf(stderr, "js_bound bad layer/modext (%d/%d)\n", lay, m_ext); // exit(1); // } return(jsb_table[lay-1][m_ext]); } /* interpret data in hdr str to fields in fr_ps */ void hdr_to_frps() { layer *hdr = fr_ps.header; /* (or pass in as arg?) */ fr_ps.actual_mode = hdr->mode; fr_ps.stereo = (hdr->mode == MPG_MD_MONO) ? 1 : 2; fr_ps.sblimit = SBLIMIT; if(hdr->mode == MPG_MD_JOINT_STEREO) fr_ps.jsbound = js_bound(hdr->lay, hdr->mode_ext); else fr_ps.jsbound = fr_ps.sblimit; } int putmask[9]={0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff}; /*read N bit from the bit stream */ unsigned int getbit(int N) { unsigned short val=0; unsigned long word; register unsigned int n = N; unsigned short x1,x2; bs.totbit += n; if (bs.bit_len<=n) { x1=bs.buf[bs.read_ptr]; x2=bs.buf[(++bs.read_ptr)%BUFFER_SIZE]; word=(x1<<16)|x2; // word=bs.buf[bs.read_ptr]<<16|bs.buf[(++bs.read_ptr)%BUFFER_SIZE]; //??? !!!! word=word<<(16-bs.bit_len); val=(short)(word>>(32-n)); bs.bit_len =16+bs.bit_len-n ; if(bs.bit_len==0) bs.bit_len=16; bs.read_ptr%=BUFFER_SIZE; } else { val=bs.buf[bs.read_ptr]<<(16-bs.bit_len); val=val>>(16-n); bs.bit_len -=n ; } if(bs.read_ptr>bs.write_ptr) { if(bs.read_ptr-bs.write_ptr>ETHER_SIZE) quest_stream(&bs.write_ptr); } else { if(BUFFER_SIZE-(bs.write_ptr-bs.read_ptr)>ETHER_SIZE) quest_stream(&bs.write_ptr); } return val; } void quest_stream(unsigned int *ptr) { register int i; unsigned char temp[2]; for (i=0;i