common.c

Go to the documentation of this file.
00001 /* $Id: common.c,v 1.32 2007/07/01 20:05:52 robert Exp $ */
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] =   /* char ? */
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     look for a valid header.  
00081     if check_layer > 0, then require that
00082     nLayer = check_layer.  
00083    */
00084 
00085   /* bits 13-14 = layer 3 */
00086   int nLayer=4-((head>>17)&3);
00087 
00088   if( (head & 0xffe00000) != 0xffe00000) {
00089     /* syncword */
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     /* bits 16,17,18,19 = 1111  invalid bitrate */
00101     return FALSE;
00102   }
00103   if( ((head>>10)&0x3) == 0x3 ) {
00104     /* bits 20,21 = 11  invalid sampling freq */
00105     return FALSE;
00106   }
00107   if ((head&0x3) == 0x2 )
00108       /* invalid emphasis */
00109       return FALSE;
00110   return TRUE;
00111 }
00112 
00113 
00114 /*
00115  * the code a header and write the information
00116  * into the frame structure
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) /* allow Bitrate change for 2.5 ... */
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     /*    print_header(fr); */
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 

Generated on Sun Dec 2 11:34:21 2007 for LAME by  doxygen 1.5.2