home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1998 June B / Pcwk6b98.iso / Mpeg3 / Dos / MP3 / MPG12304.EXE / COMMON.C < prev    next >
C/C++ Source or Header  |  1997-04-12  |  12KB  |  442 lines

  1. #include <ctype.h>
  2. #include <stdlib.h>
  3. #include <signal.h>
  4. #include "mpg123.h"
  5. #include "tables.h"
  6.  
  7. /* max = 1728 */
  8. #define MAXFRAMESIZE 1792
  9.  
  10. static int tabsel_123[3][16] = 
  11.    { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,},
  12.      {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,},
  13.      {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} };
  14.  
  15. long freqs[4] = { 44100, 48000, 32000, 999999 };
  16.  
  17. #ifdef I386_ASSEM
  18. int  bitindex,tellcnt=0;
  19. unsigned char *wordpointer;
  20. #else
  21. static int  bitindex,tellcnt=0;
  22. static unsigned char *wordpointer;
  23. #endif
  24.  
  25. static int fsize=0,fsizeold=0,ssize;
  26. static unsigned char bsspace[2][MAXFRAMESIZE+512]; /* MAXFRAMESIZE */
  27. static unsigned char *bsbuf=bsspace[1],*bsbufold;
  28. static int bsnum=0;
  29.  
  30. struct ibuf {
  31.     struct ibuf *next;
  32.     struct ibuf *prev;
  33.     unsigned char *buf;
  34.     unsigned char *pnt;
  35.     int len;
  36.     /* skip,time stamp */
  37. };
  38.  
  39. struct ibuf ibufs[2];
  40. struct ibuf *cibuf;
  41. int ibufnum=0;
  42.  
  43. short pcm_sample[AUDIOBUFSIZE];
  44. int pcm_point = 0;
  45. int audiobufsize = AUDIOBUFSIZE;
  46.  
  47. #ifdef VARMODESUPPORT
  48.     /*
  49.      *   This is a dirty hack!  It might burn your PC and kill your cat!
  50.      *   When in "varmode", specially formatted layer-3 mpeg files are
  51.      *   expected as input -- it will NOT work with standard mpeg files.
  52.      *   The reason for this:
  53.      *   Varmode mpeg files enable my own GUI player to perform fast
  54.      *   forward and backward functions, and to jump to an arbitrary
  55.      *   timestamp position within the file.  This would be possible
  56.      *   with standard mpeg files, too, but it would be a lot harder to
  57.      *   implement.
  58.      *   A filter for converting standard mpeg to varmode mpeg is
  59.      *   available on request, but it's really not useful on its own.
  60.      *
  61.      *   Oliver Fromme  <oliver.fromme@heim3.tu-clausthal.de>
  62.      *   Mon Mar 24 00:04:24 MET 1997
  63.      */
  64. int varmode = FALSE;
  65. int playlimit;
  66. #endif
  67.  
  68. static FILE *filept;
  69.  
  70. static void get_II_stuff(struct frame *fr)
  71. {
  72.   static int translate[3][2][16] = 
  73.    { { { 0,2,2,2,2,2,2,0,0,0,1,1,1,1,1,0 } ,
  74.        { 0,2,2,0,0,0,1,1,1,1,1,1,1,1,1,0 } } ,
  75.      { { 0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 } ,
  76.        { 0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0 } } ,
  77.      { { 0,3,3,3,3,3,3,0,0,0,1,1,1,1,1,0 } ,
  78.        { 0,3,3,0,0,0,1,1,1,1,1,1,1,1,1,0 } } };
  79.  
  80.   int table,sblim;
  81.   static struct al_table *tables[4] = { alloc_0, alloc_1, alloc_2, alloc_3 };
  82.   static int sblims[4] = { 27 , 30 , 8, 12 };
  83.  
  84.   table = translate[fr->sampling_frequency][2-fr->stereo][fr->bitrate_index];
  85.   sblim = sblims[table];
  86.  
  87.   fr->alloc = tables[table];
  88.   fr->II_sblimit = sblim;
  89. }
  90.  
  91. void audio_flush(int outmode, struct audio_info_struct *ai)
  92. {
  93.   if (pcm_point) {
  94.     switch (outmode) {
  95.       case DECODE_STDOUT:
  96.         write (1, pcm_sample, pcm_point * 2);
  97.         break;
  98.       case DECODE_AUDIO:
  99.         audio_play_samples (ai, pcm_sample, pcm_point);
  100.         break;
  101.     }
  102.     pcm_point = 0;
  103.   }
  104. }
  105.  
  106. #define HDRCMPMASK 0xfffffddf
  107.  
  108. int read_frame(struct frame *fr)
  109. {
  110.   static long fs[3][16] = {
  111.     { 0 , 104, 156, 182, 208, 261, 313, 365, 417, 522, 626, 731, 835, 1044, 1253, },
  112.     { 0 , 96 , 144, 168, 192, 240, 288, 336, 384, 480, 576, 672, 768, 960 , 1152, },
  113.     { 0 , 144, 216, 252, 288, 360, 432, 504, 576, 720, 864, 1008, 1152, 1440, 1728 } };
  114.  
  115. /*
  116.   static int jsb_table[3][4] =  { { 4, 8, 12, 16 }, { 4, 8, 12, 16}, { 0, 4, 8, 16} };
  117. */
  118.  
  119.   static unsigned long oldhead=0,newhead;
  120.   static unsigned long firsthead=0;
  121.  
  122.   static unsigned char ssave[34];
  123.   unsigned char hbuf[8];
  124.   static int framesize;
  125.   static int halfphase = 0;
  126.   int l;
  127.   int try = 0;
  128.  
  129.   if (halfspeed)
  130.     if (halfphase--) {
  131.       bitindex = tellcnt = 0;
  132.       wordpointer = (unsigned char *) bsbuf;
  133.       if (fr->lay == 3)
  134.         memcpy (bsbuf, ssave, ssize);
  135.       return 1;
  136.     }
  137.     else
  138.       halfphase = halfspeed - 1;
  139.  
  140. #ifdef VARMODESUPPORT
  141.   if (varmode) {
  142.     if(fread(hbuf,1,8,filept) != 8)
  143.       return 0;
  144.   }
  145.   else
  146. #endif
  147.     if(fread(hbuf,1,4,filept) != 4)
  148.       return 0;
  149.  
  150.   newhead = ((unsigned long) hbuf[0] << 24) | ((unsigned long) hbuf[1] << 16) |
  151.             ((unsigned long) hbuf[2] << 8) | (unsigned long) hbuf[3];
  152.  
  153.   if(oldhead != newhead || !oldhead)
  154.   {
  155. #if 0
  156.     fprintf(stderr,"Major headerchange %08lx->%08lx.\n",oldhead,newhead);
  157. #endif
  158.  
  159.     if( (newhead & 0xfff80000) != 0xfff80000)
  160.     {
  161.       if((newhead & 0xfff80000) == 0xfff00000)
  162.         fprintf(stderr,"MPEG 2.0 Audio not supported!\n");
  163.       else if((newhead & 0xfff80000) == 0xffe00000)
  164.         fprintf(stderr,"MPEG '2.5' Audio not supported!\n");
  165.       else
  166.         fprintf(stderr,"Illegal Audio-MPEG-Header 0x%08lx at offset 0x%lx.\n",
  167.                 newhead,ftell(filept)-4);
  168.       if (tryresync && oldhead) {
  169.             /* Read more bytes until we find something that looks
  170.                reasonably like a valid header.  This is not a
  171.                perfect strategy, but it should get us back on the
  172.                track within a short time (and hopefully without
  173.                too much distortion in the audio output).  */
  174.         do {
  175.           try++;
  176.           memmove (&hbuf[0], &hbuf[1], 7);
  177. #ifdef VARMODESUPPORT
  178.           if (fread(&hbuf[varmode?7:3],1,1,filept) != 1)
  179. #else
  180.           if (fread(&hbuf[3],1,1,filept) != 1)
  181. #endif
  182.             return 0;
  183.           newhead = ((unsigned long) hbuf[0] << 24) | ((unsigned long) hbuf[1] << 16) |
  184.                     ((unsigned long) hbuf[2] << 8) | (unsigned long) hbuf[3];
  185.         } while ((newhead & HDRCMPMASK) != (oldhead & HDRCMPMASK)
  186.               && (newhead & HDRCMPMASK) != (firsthead & HDRCMPMASK));
  187.         if (!quiet)
  188.           fprintf (stderr, "Skipped %d bytes in input.\n", try);
  189.       }
  190.       else
  191.         exit(1);
  192.     }
  193.     if (!firsthead)
  194.       firsthead = newhead;
  195.  
  196.     fr->version = 1;
  197.     if (!tryresync || !oldhead) {
  198.           /* If "tryresync" is true, assume that certain
  199.              parameters do not change within the stream! */
  200.       fr->lay = 4-((newhead>>17)&3);
  201.       fr->bitrate_index = ((newhead>>12)&0xf);
  202.       fr->sampling_frequency = ((newhead>>10)&0x3);
  203.       fr->error_protection = ((newhead>>16)&0x1)^0x1;
  204.     }
  205.     fr->padding = ((newhead>>9)&0x1);
  206.     fr->extension = ((newhead>>8)&0x1);
  207.     fr->copyright = ((newhead>>3)&0x1);
  208.     fr->original = ((newhead>>2)&0x1);
  209.     fr->emphasis = newhead & 0x3;
  210.     fr->mode = ((newhead>>6)&0x3);
  211.     fr->mode_ext = ((newhead>>4)&0x3);
  212.     fr->padding = ((newhead>>9)&0x1);
  213.     fr->stereo = (fr->mode == MPG_MD_MONO) ? 1 : 2;
  214.  
  215.     oldhead = newhead;
  216.  
  217.     if(!fr->bitrate_index)
  218.     {
  219.       fprintf(stderr,"Free format not supported.\n");
  220.       exit(1);
  221.     }
  222.  
  223.     switch(fr->lay)
  224.     {
  225.       case 1:
  226. #ifdef VARMODESUPPORT
  227.         if (varmode) {
  228.           fprintf(stderr,"Sorry, layer-1 not supported in varmode.\n"); 
  229.           exit(1);
  230.         }
  231. #endif
  232.         fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? 
  233.                          (fr->mode_ext<<2)+4 : 32;
  234.         framesize  = (long) tabsel_123[0][fr->bitrate_index] * 12000;
  235.         framesize /= freqs[fr->sampling_frequency];
  236.         framesize  = ((framesize+fr->padding)<<2)-4;
  237.         break;
  238.       case 2:
  239. #ifdef VARMODESUPPORT
  240.         if (varmode) {
  241.           fprintf(stderr,"Sorry, layer-2 not supported in varmode.\n"); 
  242.           exit(1);
  243.         }
  244. #endif
  245.         get_II_stuff(fr);
  246.         fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ?
  247.                          (fr->mode_ext<<2)+4 : fr->II_sblimit;
  248.         framesize = fs[fr->sampling_frequency][fr->bitrate_index]-4;
  249.         framesize += fr->padding;
  250.         break;
  251.       case 3:
  252.         ssize = (fr->stereo == 1) ? 17 : 32;
  253.         if(fr->error_protection)
  254.           ssize += 2;
  255. #ifdef VARMODESUPPORT
  256.         if (varmode)
  257.           playlimit = ((unsigned int) hbuf[6] << 8) | (unsigned int) hbuf[7];
  258.           framesize = ssize + 
  259.                       (((unsigned int) hbuf[4] << 8) | (unsigned int) hbuf[5]);
  260.         else {
  261. #endif
  262.           framesize  = (long) tabsel_123[2][fr->bitrate_index] * 144000;
  263.           framesize /= freqs[fr->sampling_frequency];
  264.           framesize = framesize + fr->padding - 4;
  265. #ifdef VARMODESUPPORT
  266.         }
  267. #endif
  268.         break; 
  269.       default:
  270.         fprintf(stderr,"Sorry, unknow layer type.\n"); 
  271.         exit(1);
  272.     }
  273.   }
  274.  
  275.   fsizeold=fsize;    /* for Layer3 */
  276.   bsbufold = bsbuf;    
  277.   bsbuf = bsspace[bsnum]+512;
  278.   bsnum = (bsnum + 1) & 1;
  279.  
  280.   fsize = framesize;
  281.  
  282.   if( (l=fread(bsbuf,1,fsize,filept)) != fsize)
  283.   {
  284.     if(l <= 0)
  285.       return 0;
  286.     memset(bsbuf+l,0,fsize-l);
  287.   }
  288.  
  289.   if (halfspeed && fr->lay == 3)
  290.     memcpy (ssave, bsbuf, ssize);
  291.  
  292.   bitindex = tellcnt = 0;
  293.   wordpointer = (unsigned char *) bsbuf;
  294.  
  295.   return 1;
  296. }
  297.  
  298. void print_header(struct frame *fr)
  299. {
  300.     static char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" };
  301.     static char *layers[4] = { "Unknown" , "I", "II", "III" };
  302.  
  303.     fprintf(stderr,"Layer: %s, Freq: %ld, mode: %s, modext: %d, BPF: %d\n",
  304.         layers[fr->lay],freqs[fr->sampling_frequency],
  305.         modes[fr->mode],fr->mode_ext,fsize+4);
  306.     fprintf(stderr,"chan: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d.\n",
  307.         fr->stereo,fr->copyright?"Yes":"No",
  308.         fr->original?"Yes":"No",fr->error_protection?"Yes":"No",
  309.         fr->emphasis);
  310.     fprintf(stderr,"Bitrate: %d Kbits/s, Extension value: %d\n",
  311.         tabsel_123[fr->lay-1][fr->bitrate_index],fr->extension);
  312. }
  313.  
  314. /* open the device to read the bit stream from it */
  315.  
  316. void open_stream(char *bs_filenam)
  317. {
  318.     if (!bs_filenam)
  319.         filept = stdin;
  320.     else if (!(filept = fopen(bs_filenam, "rb"))) {
  321.         perror (bs_filenam);
  322.         exit(1);
  323.     }
  324. }
  325.  
  326. /*close the device containing the bit stream after a read process*/
  327.  
  328. void close_stream(char *bs_filenam)
  329. {
  330.     if (bs_filenam)
  331.         fclose(filept);
  332. }
  333.  
  334. #ifndef I386_ASSEM
  335. #ifdef _gcc_
  336. inline 
  337. #endif
  338. unsigned int getbits(int number_of_bits)
  339. {
  340.   unsigned long rval;
  341.  
  342.   if(!number_of_bits)
  343.     return 0;
  344.  
  345.   {
  346.     rval = wordpointer[0];
  347.     rval <<= 8;
  348.     rval |= wordpointer[1];
  349.     rval <<= 8;
  350.     rval |= wordpointer[2];
  351. #if 0
  352.     rval = ((unsigned int) wordpointer[0] << 16)+((unsigned int) wordpointer[1]<<8)+
  353.                  (unsigned int) wordpointer[2];
  354. #endif
  355.     rval <<= bitindex;
  356.     rval &= 0xffffff;
  357.  
  358.     tellcnt += number_of_bits;
  359.     bitindex += number_of_bits;
  360.  
  361.     rval >>= (24-number_of_bits);
  362.  
  363.     wordpointer += (bitindex>>3);
  364.     bitindex &= 7;
  365.   }
  366.  
  367.   return rval;
  368. }
  369.  
  370. #ifdef _gcc_
  371. inline
  372. #endif
  373. unsigned int getbits_fast(int number_of_bits)
  374. {
  375.   unsigned long rval;
  376.  
  377.   {
  378.     rval = wordpointer[0];
  379.     rval <<= 8;    
  380.     rval |= wordpointer[1];
  381.     rval <<= bitindex;
  382.     rval &= 0xffff;
  383. #if 0
  384.     rval = ((unsigned int) high << (8-bitindex) )+((unsigned int) (unsigned char) wordpointer[1]);
  385. #endif
  386.     tellcnt += number_of_bits;
  387.     bitindex += number_of_bits;
  388.  
  389.     rval >>= (16-number_of_bits);
  390.  
  391.     wordpointer += (bitindex>>3);
  392.     bitindex &= 7;
  393.   }
  394.  
  395.   return rval;
  396. }
  397.  
  398. #ifdef _gcc_
  399. inline 
  400. #endif
  401. unsigned int get1bit(void)
  402. {
  403.   unsigned char rval;
  404.  
  405.   rval = *wordpointer << bitindex;
  406.  
  407.   tellcnt++;
  408.   bitindex++;
  409.   wordpointer += (bitindex>>3);
  410.   bitindex &= 7;
  411.  
  412.   return rval>>7;
  413. }
  414. #endif
  415.  
  416. int hsstell(void)
  417. {
  418.   return tellcnt;
  419. }
  420.  
  421. void set_pointer(long backstep)
  422. {
  423.   wordpointer = bsbuf + ssize - backstep;
  424.   if (backstep)
  425.     memcpy(wordpointer,bsbufold+fsizeold-backstep,backstep);
  426.   bitindex = 0; 
  427. }
  428.  
  429. void rewindNbits(int bits)
  430. {
  431.    fprintf(stderr,"rewind: %d\n",bits); 
  432.    wordpointer -= (bits>>3);
  433.    bitindex -= (bits & 7);
  434.    if(bitindex < 0)
  435.    {
  436.       bitindex += 8;
  437.       wordpointer--;
  438.    }
  439.    tellcnt -= bits;
  440. }
  441.  
  442.