layer3.c
上传用户:shenggui01
上传日期:2022-01-16
资源大小:54k
文件大小:4k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. /* layer3.c */
  2. #include "types.h"
  3. //#define NO_RESERVOIR
  4. int *scalefac_band_long;
  5. /* Scalefactor bands. */
  6. static int sfBandIndex[4][3][23] =
  7. {
  8.   { /* MPEG-2.5 11.025 kHz */
  9.     {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
  10.     /* MPEG-2.5 12 kHz */
  11.     {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
  12.     /* MPEG-2.5 8 kHz */
  13.     {0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576}
  14.   },
  15.   {
  16.     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  17.     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  18.     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
  19.   },
  20.   { /* Table B.2.b: 22.05 kHz */
  21.     {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
  22.     /* Table B.2.c: 24 kHz */
  23.     {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,332,394,464,540,576},
  24.     /* Table B.2.a: 16 kHz */
  25.     {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}
  26.   },
  27.   { /* Table B.8.b: 44.1 kHz */
  28.     {0,4,8,12,16,20,24,30,36,44,52,62,74,90,110,134,162,196,238,288,342,418,576},
  29.     /* Table B.8.c: 48 kHz */
  30.     {0,4,8,12,16,20,24,30,36,42,50,60,72,88,106,128,156,190,230,276,330,384,576},
  31.     /* Table B.8.a: 32 kHz */
  32.     {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576}
  33.   }
  34. };
  35. /*
  36.  * L3_compress:
  37.  * ------------
  38.  */
  39. void L3_compress(void)
  40. {
  41.   long          frames_processed;
  42.   int           ch;
  43.   int           i;
  44.   int           gr;
  45.   unsigned long *buffer[2];
  46.   long          remainder;
  47.   long          bytes_per_frame;
  48.   long          lag;
  49.   int           mean_bits;
  50.   int           sideinfo_len;
  51.   static int    l3_enc[2][2][samp_per_frame2];
  52.   static long   l3_sb_sample[2][3][18][SBLIMIT];
  53.   static long   mdct_freq[2][2][samp_per_frame2];
  54.   static L3_side_info_t side_info;
  55.   if(config.mpeg.type == MPEG1)
  56.   {
  57.     config.mpeg.granules = 2;
  58.     config.mpeg.samples_per_frame = samp_per_frame;
  59.     config.mpeg.resv_limit = ((1<<9)-1)<<3;
  60.     sideinfo_len = (config.mpeg.channels == 1) ? 168 : 288;
  61.   }
  62.   else /* mpeg 2/2.5 */
  63.   {
  64.     config.mpeg.granules = 1;
  65.     config.mpeg.samples_per_frame = samp_per_frame2;
  66.     config.mpeg.resv_limit = ((1<<8)-1)<<3;
  67.     sideinfo_len = (config.mpeg.channels == 1) ? 104 : 168;
  68.   }
  69.   scalefac_band_long = sfBandIndex[config.mpeg.type][config.mpeg.samplerate_index];
  70. #ifdef NO_RESERVOIR
  71.   config.mpeg.resv_limit = 0;
  72. #endif
  73.   { /* find number of whole bytes per frame and the remainder */
  74.     long x = config.mpeg.samples_per_frame * config.mpeg.bitr * (1000/8);
  75.     bytes_per_frame = x / config.wave.samplerate;
  76.     remainder  = x % config.wave.samplerate;
  77.   }
  78.   config.mpeg.total_frames =  /* round up */
  79.         (config.wave.total_samples + config.mpeg.samples_per_frame - 1) /
  80.                       config.mpeg.samples_per_frame;
  81.   printf("%ld framesn",config.mpeg.total_frames);
  82.   frames_processed = lag = 0;
  83.   open_bit_stream(config.outfile);
  84.   while((buffer[0] = buffer[1] = wave_get()) != 0)
  85.   {
  86.     frames_processed++;
  87.     if(((frames_processed & 7)==0) || (frames_processed >= config.mpeg.total_frames))
  88.       printf("15[%ld] %ld%%", frames_processed,(frames_processed*100)/config.mpeg.total_frames);
  89.     /* sort out padding */
  90.     config.mpeg.padding = (lag += remainder) >= config.wave.samplerate;
  91.     if (config.mpeg.padding)
  92.       lag -= config.wave.samplerate;
  93.     config.mpeg.bits_per_frame = 8*(bytes_per_frame + config.mpeg.padding);
  94.     /* bits per channel per granule */
  95.     mean_bits = (config.mpeg.bits_per_frame - sideinfo_len) >>
  96.                       (config.mpeg.granules + config.mpeg.channels - 2);
  97.     /* polyphase filtering */
  98.     for(gr=0; gr<config.mpeg.granules; gr++)
  99.       for(ch=0; ch<config.mpeg.channels; ch++)
  100.         for(i=0;i<18;i++)
  101.           L3_window_filter_subband(&buffer[ch], &l3_sb_sample[ch][gr+1][i][0] ,ch);
  102.     /* apply mdct to the polyphase output */
  103.     L3_mdct_sub(l3_sb_sample, mdct_freq);
  104.     /* bit and noise allocation */
  105.     L3_iteration_loop(mdct_freq, &side_info, l3_enc, mean_bits);
  106.     /* write the frame to the bitstream */
  107.     L3_format_bitstream(l3_enc, &side_info);
  108.   }
  109.   close_bit_stream();
  110. }