home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 5 / DATAFILE_PDCD5.iso / utilities / a / audiompeg / !AudioMPEG / c / musicout < prev    next >
Text File  |  1995-05-16  |  12KB  |  279 lines

  1. /**********************************************************************
  2. Copyright (c) 1991 MPEG/audio software simulation group, All Rights Reserved
  3. musicout.c
  4. **********************************************************************/
  5. /**********************************************************************
  6.  * MPEG/audio coding/decoding software, work in progress              *
  7.  *   NOT for public distribution until verified and approved by the   *
  8.  *   MPEG/audio committee.  For further information, please contact   *
  9.  *   Davis Pan, 508-493-2241, e-mail: pan@3d.enet.dec.com             *
  10.  *                                                                    *
  11.  * VERSION 3.9                                                        *
  12.  *   changes made since last update:                                  *
  13.  *   date   programmers                comment                        *
  14.  * 2/25/91  Douglas Wong        start of version 1.0 records          *
  15.  * 3/06/91  Douglas Wong        rename setup.h to dedef.h             *
  16.  *                              removed extraneous variables          *
  17.  *                              removed window_samples (now part of   *
  18.  *                              filter_samples)                       *
  19.  * 3/07/91  Davis Pan           changed output file to "codmusic"     *
  20.  * 5/10/91  Vish (PRISM)        Ported to Macintosh and Unix.         *
  21.  *                              Incorporated new "out_fifo()" which   *
  22.  *                              writes out last incomplete buffer.    *
  23.  *                              Incorporated all AIFF routines which  *
  24.  *                              are also compatible with SUN.         *
  25.  *                              Incorporated user interface for       *
  26.  *                              specifying sound file names.          *
  27.  *                              Also incorporated user interface for  *
  28.  *                              writing AIFF compatible sound files.  *
  29.  * 27jun91  dpwe (Aware)        Added musicout and &sample_frames as  *
  30.  *                              args to out_fifo (were glob refs).    *
  31.  *                              Used new 'frame_params' struct.       *
  32.  *                              Clean,simplify, track clipped output  *
  33.  *                              and total bits/frame received.        *
  34.  * 7/10/91  Earle Jennings      changed to floats to FLOAT            *
  35.  *10/ 1/91  S.I. Sudharsanan,   Ported to IBM AIX platform.           *
  36.  *          Don H. Lee,                                               *
  37.  *          Peter W. Farrett                                          *
  38.  *10/ 3/91  Don H. Lee          implemented CRC-16 error protection   *
  39.  *                              newly introduced functions are        *
  40.  *                              buffer_CRC and recover_CRC_error      *
  41.  *                              Additions and revisions are marked    *
  42.  *                              with "dhl" for clarity                *
  43.  * 2/11/92  W. Joseph Carter    Ported new code to Macintosh.  Most   *
  44.  *                              important fixes involved changing     *
  45.  *                              16-bit ints to long or unsigned in    *
  46.  *                              bit alloc routines for quant of 65535 *
  47.  *                              and passing proper function args.     *
  48.  *                              Removed "Other Joint Stereo" option   *
  49.  *                              and made bitrate be total channel     *
  50.  *                              bitrate, irrespective of the mode.    *
  51.  *                              Fixed many small bugs & reorganized.  *
  52.  *19 aug 92 Soren H. Nielsen    Changed MS-DOS file name extensions.  *
  53.  * 8/27/93 Seymour Shlien,      Fixes in Unix and MSDOS ports,        *
  54.  *         Daniel Lauzon, and                                         *
  55.  *         Bill Truerniet                                             *
  56.  **********************************************************************/
  57.  
  58. #include        "common.h"
  59. #include        "decoder.h"
  60.  
  61.  
  62. int  highbytefirst = 0;
  63.  
  64. /********************************************************************
  65.  *
  66.  *        This part contains the MPEG I decoder for Layers I & II.
  67.  *
  68.  *********************************************************************/
  69.  
  70. /****************************************************************
  71.  *
  72.  *        For MS-DOS user (Turbo c) change all instance of malloc
  73.  *        to _farmalloc and free to _farfree. Compiler model hugh
  74.  *        Also make sure all the pointer specified are changed to far.
  75.  *
  76.  *****************************************************************/
  77.  
  78. /*********************************************************************
  79.  *
  80.  * Core of the Layer II decoder.  Default layer is Layer II.
  81.  *
  82.  *********************************************************************/
  83.  
  84. /* Global variable definitions for "musicout.c" */
  85.  
  86. char *programName;
  87.  
  88. /* Implementations */
  89.  
  90. main(argc, argv)
  91. int argc;
  92. char **argv;
  93. {
  94. typedef short PCM[2][3][SBLIMIT];
  95.     PCM FAR *pcm_sample;
  96. typedef unsigned int SAM[2][3][SBLIMIT];
  97.     SAM FAR *sample;
  98. typedef double FRA[2][3][SBLIMIT];
  99.     FRA FAR *fraction;
  100. typedef double VE[2][HAN_SIZE];
  101.     VE FAR *w;
  102.  
  103.     Bit_stream_struc  bs;
  104.     frame_params      fr_ps;
  105.     layer             info;
  106.     FILE              *musicout;
  107.     unsigned long     sample_frames;
  108.  
  109.     int               i, j, k, stereo, done=FALSE, clip, sync;
  110.     int               error_protection, crc_error_count, total_error_count;
  111.     unsigned int      old_crc, new_crc;
  112.     unsigned int      bit_alloc[2][SBLIMIT], scfsi[2][SBLIMIT],
  113.                       scale_index[2][3][SBLIMIT];
  114.     unsigned long     bitsPerSlot, samplesPerFrame, frameNum = 0;
  115.     unsigned long     frameBits, gotBits = 0;
  116.     char              encoded_file_name[MAX_NAME_SIZE];
  117.     char              decoded_file_name[MAX_NAME_SIZE];
  118.     char              t[50];
  119.     int topSb = 0;
  120.  
  121.     /* Most large variables are declared dynamically to ensure
  122.        compatibility with smaller machines */
  123.  
  124.     pcm_sample = (PCM FAR *) mem_alloc((long) sizeof(PCM), "PCM Samp");
  125.     sample = (SAM FAR *) mem_alloc((long) sizeof(SAM), "Sample");
  126.     fraction = (FRA FAR *) mem_alloc((long) sizeof(FRA), "fraction");
  127.     w = (VE FAR *) mem_alloc((long) sizeof(VE), "w");
  128.  
  129.     fr_ps.header = &info;
  130.     fr_ps.tab_num = -1;                /* no table loaded */
  131.     fr_ps.alloc = NULL;
  132.     for (i=0;i<HAN_SIZE;i++) for (j=0;j<2;j++) (*w)[j][i] = 0.0;
  133.  
  134.     programName = argv[0];
  135.     if(argc==1) usage();
  136.  
  137.     strcpy(encoded_file_name, argv[argc-2]);
  138.     strcpy(decoded_file_name, argv[argc-1]);
  139.     if ((argc == 4) && (stricmp(argv[2], "-h") != 0)) highbytefirst = 1;
  140.  
  141.     if ((musicout = fopen(decoded_file_name, "w+b")) == NULL) {
  142.        printf ("Could not create \"%s\".\n", decoded_file_name);
  143.        exit(1);
  144.     }
  145.  
  146.     open_bit_stream_r(&bs, encoded_file_name, BUFFER_SIZE);
  147.  
  148.     sample_frames = 0;
  149.  
  150.     while (!end_bs(&bs)) {
  151.  
  152.        sync = seek_sync(&bs, SYNC_WORD, SYNC_WORD_LNGTH);
  153.        frameBits = sstell(&bs) - gotBits;
  154.        if(frameNum > 0)        /* don't want to print on 1st loop; no lay */
  155.           if(frameBits%bitsPerSlot)
  156.              fprintf(stderr,"Got %ld bits = %ld slots plus %ld\n",
  157.                      frameBits, frameBits/bitsPerSlot, frameBits%bitsPerSlot);
  158.        gotBits += frameBits;
  159.  
  160.        if (!sync) {
  161.           done = TRUE;
  162.           /* finally write out the buffer */
  163.           if (info.lay == 2) out_fifo(*pcm_sample, 3, &fr_ps, done,
  164.                                       musicout, &sample_frames);
  165.           else               out_fifo(*pcm_sample, 1, &fr_ps, done,
  166.                                       musicout, &sample_frames);
  167.           break;
  168.        }
  169.  
  170.        decode_info(&bs, &fr_ps);
  171.        hdr_to_frps(&fr_ps);
  172.        stereo = fr_ps.stereo;
  173.        error_protection = info.error_protection;
  174.        crc_error_count = 0;
  175.        total_error_count = 0;
  176.  
  177.        fprintf(stderr, "{%4lu}\r", frameNum++); fflush(stderr);
  178.        if (error_protection) buffer_CRC(&bs, &old_crc);
  179.  
  180.        switch (info.lay) {
  181.  
  182.           case 1: {
  183.              bitsPerSlot = 32;        samplesPerFrame = 384;
  184.              I_decode_bitalloc(&bs,bit_alloc,&