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

mpeg/mp3

开发平台:

C/C++

  1. /* main.c
  2.  * Command line interface.
  3.  *
  4.  * This fixed point version of shine is based on Gabriel Bouvigne's original
  5.  * source, version 0.1.2
  6.  */
  7. #include "types.h"
  8. config_t config;
  9. int cutoff;
  10. /*
  11.  * error:
  12.  * ------
  13.  */
  14. void error(char *s)
  15. {
  16.   printf("[ERROR] %sn",s);
  17.   exit(1);
  18. }
  19. /*
  20.  * print_usage:
  21.  * ------------
  22.  */
  23. static void print_usage()
  24. {
  25.   printf("nUSAGE   :  Shine [options] <infile> <outfile>n"
  26.          "options : -h            this help messagen"
  27.          "          -b <bitrate>  set the bitrate [32-320], default 128kbitn"
  28.          "          -c            set copyright flag, default offn"
  29.          "          -o            reset original flag, default onn"
  30.          "          -r [sample rate]  raw cd data file instead of waven"
  31.          "          -m            mono from stereo, raw mono with -rn"
  32.          "The sample rate is optional and defaults to 44100.nn");
  33.   exit(0);
  34. }
  35. /*
  36.  * set_defaults:
  37.  * -------------
  38.  */
  39. static void set_defaults()
  40. {
  41.   config.mpeg.type = MPEG1;
  42.   config.mpeg.layr = LAYER_3;
  43.   config.mpeg.mode = MODE_DUAL_CHANNEL;
  44.   config.mpeg.bitr = 128;
  45.   config.mpeg.psyc = 0;
  46.   config.mpeg.emph = 0;
  47.   config.mpeg.crc  = 0;
  48.   config.mpeg.ext  = 0;
  49.   config.mpeg.mode_ext  = 0;
  50.   config.mpeg.copyright = 0;
  51.   config.mpeg.original  = 1;
  52.   config.mpeg.channels = 2;
  53.   config.mpeg.granules = 2;
  54.   cutoff = 418; /* 16KHz @ 44.1Ksps */
  55.   config.wave.samplerate = 44100;
  56. }
  57. /*
  58.  * parse_command:
  59.  * --------------
  60.  */
  61. static int parse_command(int argc, char **argv, int *raw, int *mono_from_stereo)
  62. {
  63.   int i = 0, x;
  64.   if(argc<3) return 0;
  65.   while(argv[++i][0]=='-')
  66.     switch(argv[i][1])
  67.     {
  68.       case 'b':
  69.         config.mpeg.bitr = atoi(argv[++i]);
  70.         break;
  71.       case 'c':
  72.         config.mpeg.copyright = 1;
  73.         break;
  74.       case 'o':
  75.         config.mpeg.original = 0;
  76.         break;
  77.       case 'r':
  78.         *raw = 1;
  79.         x = atoi(argv[i+1]);
  80.         if(x > 7999)
  81.         {
  82.           i++;
  83.           config.wave.samplerate = x;
  84.         }
  85.         break;
  86.       case 'm':
  87.         *mono_from_stereo = 1;
  88.         break;
  89.       default :
  90.         return 0;
  91.     }
  92.   if((argc-i)!=2) return 0;
  93.   config.infile  = argv[i++];
  94.   config.outfile = argv[i];
  95.   return 1;
  96. }
  97. /*
  98.  * find_samplerate_index:
  99.  * ----------------------
  100.  */
  101. static int find_samplerate_index(long freq)
  102. {
  103.   static long sr[4][3] = {{11025, 12000,  8000},   /* mpeg 2.5 */
  104.                           {    0,     0,     0},   /* reserved */
  105.                           {22050, 24000, 16000},   /* mpeg 2 */
  106.                           {44100, 48000, 32000}};  /* mpeg 1 */
  107.   int i, j;
  108.   for(j=0; j<4; j++)
  109.     for(i=0; i<3; i++)
  110.       if((freq == sr[j][i]) && (j != 1))
  111.       {
  112.         config.mpeg.type = j;
  113.         return i;
  114.       }
  115.   error("Invalid samplerate");
  116.   return 0;
  117. }
  118. /*
  119.  * find_bitrate_index:
  120.  * -------------------
  121.  */
  122. static int find_bitrate_index(int bitr)
  123. {
  124.   static long br[2][15] =
  125.     {{0, 8,16,24,32,40,48,56, 64, 80, 96,112,128,144,160},   /* mpeg 2/2.5 */
  126.      {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320}};  /* mpeg 1 */
  127.   int i;
  128.   for(i=1; i<15; i++)
  129.     if(bitr==br[config.mpeg.type & 1][i]) return i;
  130.   error("Invalid bitrate");
  131.   return 0;
  132. }
  133. int set_cutoff(void)
  134. {
  135.   static int cutoff_tab[3][2][15] =
  136.   {
  137.     { /* 44.1k, 22.05k, 11.025k */
  138.       {100,104,131,157,183,209,261,313,365,418,418,418,418,418,418}, /* stereo */
  139.       {183,209,261,313,365,418,418,418,418,418,418,418,418,418,418}  /* mono */
  140.     },
  141.     { /* 48k, 24k, 12k */
  142.       {100,104,131,157,183,209,261,313,384,384,384,384,384,384,384}, /* stereo */
  143.       {183,209,261,313,365,384,384,384,384,384,384,384,384,384,384}  /* mono */
  144.     },
  145.     { /* 32k, 16k, 8k */
  146.       {100,104,131,157,183,209,261,313,365,418,522,576,576,576,576}, /* stereo */
  147.       {183,209,261,313,365,418,522,576,576,576,576,576,576,576,576}  /* mono */
  148.     }
  149.   };
  150.   return cutoff_tab[config.mpeg.samplerate_index]
  151.                    [config.mpeg.mode == MODE_MONO]
  152.                    [config.mpeg.bitrate_index];
  153. }
  154. /*
  155.  * check_config:
  156.  * -------------
  157.  */
  158. static void check_config()
  159. {
  160.   static char *mode_names[4]    = { "stereo", "j-stereo", "dual-ch", "mono" };
  161.   static char *layer_names[4]   = { "", "III", "II", "I" };
  162.   static char *version_names[4] = { "MPEG 2.5", "", "MPEG 2", "MPEG 1" };
  163.   static char *psy_names[3]     = { "none", "MUSICAM", "Shine" };
  164.   static char *demp_names[4]    = { "none", "50/15us", "", "CITT" };
  165.   config.mpeg.samplerate_index = find_samplerate_index(config.wave.samplerate);
  166.   config.mpeg.bitrate_index    = find_bitrate_index(config.mpeg.bitr);
  167.   cutoff = set_cutoff();
  168.   printf("%s layer %s, %s  Psychoacoustic Model: %sn",
  169.            version_names[config.mpeg.type],
  170.            layer_names[config.mpeg.layr],
  171.            mode_names[config.mpeg.mode],
  172.            psy_names[config.mpeg.psyc] );
  173.   printf("Bitrate=%d kbps  ",config.mpeg.bitr );
  174.   printf("De-emphasis: %s   %s %sn",
  175.            demp_names[config.mpeg.emph],
  176.            (config.mpeg.original) ? "Original" : "",
  177.            (config.mpeg.copyright) ? "(C)" : "" );
  178. }
  179. /*
  180.  * main:
  181.  * -----
  182.  */
  183. int main(int argc, char **argv)
  184. {
  185.   time_t end_time;
  186.   int raw = 0;
  187.   int mono_from_stereo = 0;
  188.   printf("Shine v1.08 19/06/03n");
  189.   time(&config.start_time);
  190.   set_defaults();
  191.   if (!parse_command(argc, argv, &raw, &mono_from_stereo))
  192.     print_usage();
  193.   wave_open(raw, mono_from_stereo); /* prints wave (input) configuration */
  194.   check_config(); /* prints mpeg (output) configuration */
  195.   printf("Encoding "%s" to "%s"n", config.infile, config.outfile);
  196.   L3_compress();
  197.   wave_close();
  198.   time(&end_time);
  199.   end_time -= config.start_time;
  200.   printf(" Finished in %2ld:%2ld:%2ldn",
  201.             end_time/3600,(end_time/60)%60,end_time%60);
  202.   return 0;
  203. }