00001
00002
00003 #ifdef HAVE_CONFIG_H
00004 #include <config.h>
00005 #endif
00006
00007 #include <ctype.h>
00008 #include <stdlib.h>
00009 #include <signal.h>
00010
00011 #ifdef HAVE_FCNTL_H
00012 #include <fcntl.h>
00013 #endif
00014
00015 #ifdef macintosh
00016 #include <types.h>
00017 #include <stat.h>
00018 #else
00019 #include <sys/types.h>
00020 #include <sys/stat.h>
00021 #endif
00022
00023 #include "common.h"
00024
00025 #ifdef WITH_DMALLOC
00026 #include <dmalloc.h>
00027 #endif
00028
00029 const int tabsel_123 [2] [3] [16] = {
00030 { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,},
00031 {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,},
00032 {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} },
00033
00034 { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,},
00035 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,},
00036 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} }
00037 };
00038
00039 const long freqs[9] = { 44100, 48000, 32000,
00040 22050, 24000, 16000,
00041 11025, 12000, 8000 };
00042
00043
00044
00045 real muls[27][64];
00046
00047 #if 0
00048 static void get_II_stuff(struct frame *fr)
00049 {
00050 static const int translate [3] [2] [16] =
00051 { { { 0,2,2,2,2,2,2,0,0,0,1,1,1,1,1,0 } ,
00052 { 0,2,2,0,0,0,1,1,1,1,1,1,1,1,1,0 } } ,
00053 { { 0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 } ,
00054 { 0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0 } } ,
00055 { { 0,3,3,3,3,3,3,0,0,0,1,1,1,1,1,0 } ,
00056 { 0,3,3,0,0,0,1,1,1,1,1,1,1,1,1,0 } } };
00057
00058 int table,sblim;
00059 static const struct al_table2 *tables[5] =
00060 { alloc_0, alloc_1, alloc_2, alloc_3 , alloc_4 };
00061 static int sblims[5] = { 27 , 30 , 8, 12 , 30 };
00062
00063 if(fr->lsf)
00064 table = 4;
00065 else
00066 table = translate[fr->sampling_frequency][2-fr->stereo][fr->bitrate_index];
00067 sblim = sblims[table];
00068
00069 fr->alloc = tables[table];
00070 fr->II_sblimit = sblim;
00071 }
00072 #endif
00073
00074 #define HDRCMPMASK 0xfffffd00
00075
00076
00077 int head_check(unsigned long head,int check_layer)
00078 {
00079
00080
00081
00082
00083
00084
00085
00086 int nLayer=4-((head>>17)&3);
00087
00088 if( (head & 0xffe00000) != 0xffe00000) {
00089
00090 return FALSE;
00091 }
00092
00093 if (nLayer == 4)
00094 return FALSE;
00095
00096 if (check_layer > 0 && nLayer != check_layer)
00097 return FALSE;
00098
00099 if( ((head>>12)&0xf) == 0xf) {
00100
00101 return FALSE;
00102 }
00103 if( ((head>>10)&0x3) == 0x3 ) {
00104
00105 return FALSE;
00106 }
00107 if ((head&0x3) == 0x2 )
00108
00109 return FALSE;
00110 return TRUE;
00111 }
00112
00113
00114
00115
00116
00117
00118 int decode_header(struct frame *fr,unsigned long newhead)
00119 {
00120
00121
00122 if( newhead & (1<<20) ) {
00123 fr->lsf = (newhead & (1<<19)) ? 0x0 : 0x1;
00124 fr->mpeg25 = 0;
00125 }
00126 else {
00127 fr->lsf = 1;
00128 fr->mpeg25 = 1;
00129 }
00130
00131
00132 fr->lay = 4-((newhead>>17)&3);
00133 if( ((newhead>>10)&0x3) == 0x3) {
00134 fprintf(stderr,"Stream error\n");
00135 exit(1);
00136 }
00137 if(fr->mpeg25) {
00138 fr->sampling_frequency = 6 + ((newhead>>10)&0x3);
00139 }
00140 else
00141 fr->sampling_frequency = ((newhead>>10)&0x3) + (fr->lsf*3);
00142
00143 fr->error_protection = ((newhead>>16)&0x1)^0x1;
00144
00145 if(fr->mpeg25)
00146 fr->bitrate_index = ((newhead>>12)&0xf);
00147
00148 fr->bitrate_index = ((newhead>>12)&0xf);
00149 fr->padding = ((newhead>>9)&0x1);
00150 fr->extension = ((newhead>>8)&0x1);
00151 fr->mode = ((newhead>>6)&0x3);
00152 fr->mode_ext = ((newhead>>4)&0x3);
00153 fr->copyright = ((newhead>>3)&0x1);
00154 fr->original = ((newhead>>2)&0x1);
00155 fr->emphasis = newhead & 0x3;
00156
00157 fr->stereo = (fr->mode == MPG_MD_MONO) ? 1 : 2;
00158
00159 switch(fr->lay)
00160 {
00161 case 1:
00162 fr->framesize = (long) tabsel_123[fr->lsf][0][fr->bitrate_index] * 12000;
00163 fr->framesize /= freqs[fr->sampling_frequency];
00164 fr->framesize = ((fr->framesize+fr->padding)<<2)-4;
00165 fr->down_sample=0;
00166 fr->down_sample_sblimit = SBLIMIT>>(fr->down_sample);
00167 break;
00168
00169 case 2:
00170 fr->framesize = (long) tabsel_123[fr->lsf][1][fr->bitrate_index] * 144000;
00171 fr->framesize /= freqs[fr->sampling_frequency];
00172 fr->framesize += fr->padding - 4;
00173 fr->down_sample=0;
00174 fr->down_sample_sblimit = SBLIMIT>>(fr->down_sample);
00175 break;
00176
00177 case 3:
00178 #if 0
00179 fr->do_layer = do_layer3;
00180 if(fr->lsf)
00181 ssize = (fr->stereo == 1) ? 9 : 17;
00182 else
00183 ssize = (fr->stereo == 1) ? 17 : 32;
00184 #endif
00185
00186 #if 0
00187 if(fr->error_protection)
00188 ssize += 2;
00189 #endif
00190 if (fr->bitrate_index==0)
00191 fr->framesize=0;
00192 else{
00193 fr->framesize = (long) tabsel_123[fr->lsf][2][fr->bitrate_index] * 144000;
00194 fr->framesize /= freqs[fr->sampling_frequency]<<(fr->lsf);
00195 fr->framesize = fr->framesize + fr->padding - 4;
00196 }
00197 break;
00198 default:
00199 fprintf(stderr,"Sorry, layer %d not supported\n",fr->lay);
00200 return (0);
00201 }
00202
00203
00204 return 1;
00205 }
00206
00207
00208 #if 1
00209 void print_header(struct frame *fr)
00210 {
00211 static const char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" };
00212 static const char *layers[4] = { "Unknown" , "I", "II", "III" };
00213
00214 fprintf(stderr,"MPEG %s, Layer: %s, Freq: %ld, mode: %s, modext: %d, BPF : %d\n",
00215 fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"),
00216 layers[fr->lay],freqs[fr->sampling_frequency],
00217 modes[fr->mode],fr->mode_ext,fr->framesize+4);
00218 fprintf(stderr,"Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d.\n",
00219 fr->stereo,fr->copyright?"Yes":"No",
00220 fr->original?"Yes":"No",fr->error_protection?"Yes":"No",
00221 fr->emphasis);
00222 fprintf(stderr,"Bitrate: %d Kbits/s, Extension value: %d\n",
00223 tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index],fr->extension);
00224 }
00225
00226 void print_header_compact(struct frame *fr)
00227 {
00228 static const char *modes[4] = { "stereo", "joint-stereo", "dual-channel", "mono" };
00229 static const char *layers[4] = { "Unknown" , "I", "II", "III" };
00230
00231 fprintf(stderr,"MPEG %s layer %s, %d kbit/s, %ld Hz %s\n",
00232 fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"),
00233 layers[fr->lay],
00234 tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index],
00235 freqs[fr->sampling_frequency], modes[fr->mode]);
00236 }
00237
00238 #endif
00239
00240 unsigned int getbits(PMPSTR mp, int number_of_bits)
00241 {
00242 unsigned long rval;
00243
00244 if (number_of_bits <= 0 || !mp->wordpointer)
00245 return 0;
00246
00247 {
00248 rval = mp->wordpointer[0];
00249 rval <<= 8;
00250 rval |= mp->wordpointer[1];
00251 rval <<= 8;
00252 rval |= mp->wordpointer[2];
00253 rval <<= mp->bitindex;
00254 rval &= 0xffffff;
00255
00256 mp->bitindex += number_of_bits;
00257
00258 rval >>= (24-number_of_bits);
00259
00260 mp->wordpointer += (mp->bitindex>>3);
00261 mp->bitindex &= 7;
00262 }
00263 return rval;
00264 }
00265
00266 unsigned int getbits_fast(PMPSTR mp, int number_of_bits)
00267 {
00268 unsigned long rval;
00269
00270 {
00271 rval = mp->wordpointer[0];
00272 rval <<= 8;
00273 rval |= mp->wordpointer[1];
00274 rval <<= mp->bitindex;
00275 rval &= 0xffff;
00276 mp->bitindex += number_of_bits;
00277
00278 rval >>= (16-number_of_bits);
00279
00280 mp->wordpointer += (mp->bitindex>>3);
00281 mp->bitindex &= 7;
00282 }
00283 return rval;
00284 }
00285
00286
00287 int set_pointer( PMPSTR mp, long backstep)
00288 {
00289 unsigned char *bsbufold;
00290
00291 if(mp->fsizeold < 0 && backstep > 0) {
00292 fprintf(stderr,"Can't step back %ld!\n",backstep);
00293 return MP3_ERR;
00294 }
00295 bsbufold = mp->bsspace[1-mp->bsnum] + 512;
00296 mp->wordpointer -= backstep;
00297 if (backstep)
00298 memcpy(mp->wordpointer,bsbufold+mp->fsizeold-backstep,(size_t)backstep);
00299 mp->bitindex = 0;
00300 return MP3_OK;
00301 }
00302