util.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:9k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include "util.h"
  2. #include <assert.h>
  3. /***********************************************************************
  4. *
  5. *  Global Variable Definitions
  6. *
  7. ***********************************************************************/
  8. /* 1: MPEG-1, 0: MPEG-2 LSF, 1995-07-11 shn */
  9. FLOAT8  s_freq_table[2][4] = {{22.05, 24, 16, 0}, {44.1, 48, 32, 0}};
  10. /* 1: MPEG-1, 0: MPEG-2 LSF, 1995-07-11 shn */
  11. int     bitrate_table[2][15] = {
  12.           {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160},
  13.           {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320}};
  14. enum byte_order NativeByteOrder = order_unknown;
  15. /***********************************************************************
  16. *
  17. *  Global Function Definitions
  18. *
  19. ***********************************************************************/
  20. /***********************************************************************
  21.  * compute bitsperframe and mean_bits for a layer III frame 
  22.  **********************************************************************/
  23. void getframebits(lame_global_flags *gfp,int *bitsPerFrame, int *mean_bits) {
  24.   int whole_SpF;
  25.   FLOAT8 bit_rate,samp;
  26.   int bitsPerSlot;
  27.   int sideinfo_len;
  28.   
  29.   samp =      gfp->out_samplerate/1000.0;
  30.   bit_rate = bitrate_table[gfp->version][gfp->bitrate_index];
  31.   bitsPerSlot = 8;
  32.   /* determine the mean bitrate for main data */
  33.   sideinfo_len = 32;
  34.   if ( gfp->version == 1 )
  35.     {   /* MPEG 1 */
  36.       if ( gfp->stereo == 1 )
  37. sideinfo_len += 136;
  38.       else
  39. sideinfo_len += 256;
  40.     }
  41.   else
  42.     {   /* MPEG 2 */
  43.       if ( gfp->stereo == 1 )
  44. sideinfo_len += 72;
  45.       else
  46. sideinfo_len += 136;
  47.     }
  48.   
  49.   if (gfp->error_protection) sideinfo_len += 16;
  50.   
  51.   /* -f fast-math option causes some strange rounding here, be carefull: */  
  52.   whole_SpF = floor( (gfp->framesize /samp)*(bit_rate /  (FLOAT8)bitsPerSlot) + 1e-9);
  53.   *bitsPerFrame = 8 * whole_SpF + (gfp->padding * 8);
  54.   *mean_bits = (*bitsPerFrame - sideinfo_len) / gfp->mode_gr;
  55. }
  56. void display_bitrates(FILE *out_fh)
  57. {
  58.   int index,version;
  59.   version = 1;
  60.   fprintf(out_fh,"n");
  61.   fprintf(out_fh,"MPEG1 samplerates(kHz): 32 44.1 48 n");
  62.   fprintf(out_fh,"bitrates(kbs): ");
  63.   for (index=1;index<15;index++) {
  64.     fprintf(out_fh,"%i ",bitrate_table[version][index]);
  65.   }
  66.   fprintf(out_fh,"n");
  67.   
  68.   
  69.   version = 0;
  70.   fprintf(out_fh,"n");
  71.   fprintf(out_fh,"MPEG2 samplerates(kHz): 16 22.05 24 n");
  72.   fprintf(out_fh,"bitrates(kbs): ");
  73.   for (index=1;index<15;index++) {
  74.     fprintf(out_fh,"%i ",bitrate_table[version][index]);
  75.   }
  76.   fprintf(out_fh,"n");
  77. }
  78. int BitrateIndex(
  79. int bRate,        /* legal rates from 32 to 448 */
  80. int version,      /* MPEG-1 or MPEG-2 LSF */
  81. int samplerate)   /* convert bitrate in kbps to index */
  82. {
  83. int     index = 0;
  84. int     found = 0;
  85.     while(!found && index<15)   {
  86.         if(bitrate_table[version][index] == bRate)
  87.             found = 1;
  88.         else
  89.             ++index;
  90.     }
  91.     if(found)
  92.         return(index);
  93.     else {
  94.         fprintf(stderr,"Bitrate %dkbs not legal for %iHz output sampling.n",
  95.                 bRate, samplerate);
  96.         return(-1);     /* Error! */
  97.     }
  98. }
  99. int SmpFrqIndex(  /* convert samp frq in Hz to index */
  100. long sRate,             /* legal rates 16000, 22050, 24000, 32000, 44100, 48000 */
  101. int  *version)
  102. {
  103. /* Assign default value */
  104. *version=0;
  105.     if (sRate == 44100L) {
  106.         *version = 1; return(0);
  107.     }
  108.     else if (sRate == 48000L) {
  109.         *version = 1; return(1);
  110.     }
  111.     else if (sRate == 32000L) {
  112.         *version = 1; return(2);
  113.     }
  114.     else if (sRate == 24000L) {
  115.         *version = 0; return(1);
  116.     }
  117.     else if (sRate == 22050L) {
  118.         *version = 0; return(0);
  119.     }
  120.     else if (sRate == 16000L) {
  121.         *version = 0; return(2);
  122.     }
  123.     else {
  124.         fprintf(stderr, "SmpFrqIndex: %ldHz is not a legal sample raten", sRate);
  125.         return(-1);     /* Error! */
  126.     }
  127. }
  128. /*******************************************************************************
  129. *
  130. *  Allocate number of bytes of memory equal to "block".
  131. *
  132. *******************************************************************************/
  133. /* exit(0) changed to exit(1) on memory allocation
  134.  * error -- 1999/06 Alvaro Martinez Echevarria */
  135. void  *mem_alloc(unsigned long block, char *item)
  136. {
  137.     void    *ptr;
  138.     /* what kind of shit does ISO put out?  */
  139.     ptr = (void *) malloc((size_t) block /* <<1 */ ); /* allocate twice as much memory as needed. fixes dodgy
  140.     memory problem on most systems */
  141.     if (ptr != NULL) {
  142.         memset(ptr, 0, (size_t) block);
  143.     } else {
  144.         fprintf(stderr,"Unable to allocate %sn", item);
  145.         exit(1);
  146.     }
  147.     return(ptr);
  148. }
  149. /*****************************************************************************
  150. *
  151. *  Routines to determine byte order and swap bytes
  152. *
  153. *****************************************************************************/
  154. enum byte_order DetermineByteOrder(void)
  155. {
  156.     char s[ sizeof(long) + 1 ];
  157.     union
  158.     {
  159.         long longval;
  160.         char charval[ sizeof(long) ];
  161.     } probe;
  162.     probe.longval = 0x41424344L;  /* ABCD in ASCII */
  163.     strncpy( s, probe.charval, sizeof(long) );
  164.     s[ sizeof(long) ] = '';
  165.     /* fprintf( stderr, "byte order is %sn", s ); */
  166.     if ( strcmp(s, "ABCD") == 0 )
  167.         return order_bigEndian;
  168.     else
  169.         if ( strcmp(s, "DCBA") == 0 )
  170.             return order_littleEndian;
  171.         else
  172.             return order_unknown;
  173. }
  174. void SwapBytesInWords( short *loc, int words )
  175. {
  176.     int i;
  177.     short thisval;
  178.     char *dst, *src;
  179.     src = (char *) &thisval;
  180.     for ( i = 0; i < words; i++ )
  181.     {
  182.         thisval = *loc;
  183.         dst = (char *) loc++;
  184.         dst[0] = src[1];
  185.         dst[1] = src[0];
  186.     }
  187. }
  188. /*****************************************************************************
  189. *
  190. *  bit_stream.c package
  191. *  Author:  Jean-Georges Fritsch, C-Cube Microsystems
  192. *
  193. *****************************************************************************/
  194. /********************************************************************
  195.   This package provides functions to write (exclusive or read)
  196.   information from (exclusive or to) the bit stream.
  197.   If the bit stream is opened in read mode only the get functions are
  198.   available. If the bit stream is opened in write mode only the put
  199.   functions are available.
  200. ********************************************************************/
  201. /*alloc_buffer();      open and initialize the buffer;                    */
  202. /*desalloc_buffer();   empty and close the buffer                         */
  203. /*back_track_buffer();     goes back N bits in the buffer                 */
  204. /*unsigned int get1bit();  read 1 bit from the bit stream                 */
  205. /*unsigned long look_ahead(); grep the next N bits in the bit stream without*/
  206. /*                            changing the buffer pointer                   */
  207. /*putbits(); write N bits from the bit stream */
  208. /*int seek_sync(); return 1 if a sync word was found in the bit stream      */
  209. /*                 otherwise returns 0                                      */
  210. void empty_buffer(Bit_stream_struc *bs)
  211. {
  212.    int minimum=1+bs->buf_byte_idx;    /* end of the buffer to empty */
  213.    if (bs->buf_size-minimum <= 0) return;
  214.    bs->buf_byte_idx = bs->buf_size -1;
  215.    bs->buf_bit_idx = 8;
  216.    bs->buf[bs->buf_byte_idx] = 0;  /* what does this do? */
  217. }
  218. int copy_buffer(char *buffer,int size,Bit_stream_struc *bs)
  219. {
  220.   int i,j=0;
  221.   if (size!=0 && (bs->buf_size-1 - bs->buf_byte_idx) > size ) return -1;
  222.   for (i=bs->buf_size-1 ; i > bs->buf_byte_idx ; (i-- ))
  223.     buffer[j++]=bs->buf[i];
  224.   assert(j == (bs->buf_size-1 - bs->buf_byte_idx));
  225.   empty_buffer(bs);  /* empty buffer, (changes bs->buf_size) */
  226.   return j;
  227. }
  228. void init_bit_stream_w(Bit_stream_struc* bs)
  229. {
  230.    alloc_buffer(bs, BUFFER_SIZE);
  231.    bs->buf_byte_idx = BUFFER_SIZE-1;
  232.    bs->buf_bit_idx=8;
  233.    bs->totbit=0;
  234. }
  235. /*open and initialize the buffer; */
  236. void alloc_buffer(
  237. Bit_stream_struc *bs,   /* bit stream structure */
  238. int size)
  239. {
  240.    bs->buf = (unsigned char *)
  241. mem_alloc((unsigned long) (size * sizeof(unsigned char)), "buffer");
  242.    bs->buf_size = size;
  243. }
  244. /*empty and close the buffer */
  245. void desalloc_buffer(Bit_stream_struc *bs)   /* bit stream structure */
  246. {
  247.    free(bs->buf);
  248. }
  249. int putmask[9]={0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff};
  250. /*write N bits into the bit stream */
  251. void putbits(
  252. Bit_stream_struc *bs,   /* bit stream structure */
  253. unsigned int val,       /* val to write into the buffer */
  254. int N)                  /* number of bits of val */
  255. {
  256.  register int j = N;
  257.  register int k, tmp;
  258.  if (N > MAX_LENGTH)
  259.     fprintf(stderr,"Cannot read or write more than %d bits at a time.n", MAX_LENGTH);
  260.  bs->totbit += N;
  261.  while (j > 0) {
  262.    k = Min(j, bs->buf_bit_idx);
  263.    tmp = val >> (j-k);
  264.    bs->buf[bs->buf_byte_idx] |= (tmp&putmask[k]) << (bs->buf_bit_idx-k);
  265.    bs->buf_bit_idx -= k;
  266.    if (!bs->buf_bit_idx) {
  267.        bs->buf_bit_idx = 8;
  268.        bs->buf_byte_idx--;
  269.        assert(bs->buf_byte_idx >= 0);
  270.        bs->buf[bs->buf_byte_idx] = 0;
  271.    }
  272.    j -= k;
  273.  }
  274. }
  275. /*****************************************************************************
  276. *
  277. *  End of bit_stream.c package
  278. *
  279. *****************************************************************************/