DECODE.C
上传用户:dshsh2009
上传日期:2007-01-07
资源大小:155k
文件大小:24k
源码类别:

mpeg/mp3

开发平台:

Unix_Linux

  1. /**********************************************************************
  2. Copyright (c) 1991 MPEG/audio software simulation group, All Rights Reserved
  3. decode.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.  *          Davis Pan                                                 *
  16.  * 3/06/91  Douglas Wong        rename: setup.h to dedef.h            *
  17.  *                                      dfilter to defilter           *
  18.  *                                      dwindow to dewindow           *
  19.  *                              integrated "quantizer", "scalefactor" *
  20.  *                              combined window_samples routine into  *
  21.  *                              filter samples                        *
  22.  * 3/31/91  Bill Aspromonte     replaced read_filter by               *
  23.  *                              create_syn_filter and introduced a    *
  24.  *                              new Sub-Band Synthesis routine called *
  25.  *                              SubBandSynthesis()                    *
  26.  * 5/10/91  Vish (PRISM)        Ported to Macintosh and Unix.         *
  27.  *                              Changed "out_fifo()" so that last     *
  28.  *                              unfilled block is also written out.   *
  29.  *                              "create_syn_filter()" was modified so *
  30.  *                              that calculation precision is same as *
  31.  *                              in specification tables.              *
  32.  *                              Changed "decode_scale()" to reflect   *
  33.  *                              specifications.                       *
  34.  *                              Removed all routines used by          *
  35.  *                              "synchronize_buffer()".  This is now  *
  36.  *                              replaced by "seek_sync()".            *
  37.  *                              Incorporated Jean-Georges Fritsch's   *
  38.  *                              "bitstream.c" package.                *
  39.  *                              Deleted "reconstruct_sample()".       *
  40.  * 27jun91  dpwe (Aware)        Passed outFile and &sampFrames as     *
  41.  *                              args to out_fifo() - were global.     *
  42.  *                              Moved "alloc_*" reader to common.c.   *
  43.  *                              alloc, sblimit, stereo passed via new *
  44.  *                              'frame_params struct (were globals).  *
  45.  *                              Added JOINT STEREO decoding, lyrs I&II*
  46.  *                              Affects: decode_bitalloc,buffer_samps *
  47.  *                              Plus a few other cleanups.            *
  48.  * 6/10/91   Earle Jennings     conditional expansion added in        *
  49.  *                              II_dequantize_sample to handle range  *
  50.  *                              problems in MSDOS version             *
  51.  * 8/8/91    Jens Spille        Change for MS-C6.00                   *
  52.  *10/1/91    S.I. Sudharsanan,  Ported to IBM AIX platform.           *
  53.  *           Don H. Lee,                                              *
  54.  *           Peter W. Farrett                                         *
  55.  *10/3/91    Don H. Lee         implemented CRC-16 error protection   *
  56.  *                              newly introduced functions are        *
  57.  *                              buffer_CRC and recover_CRC_error.     *
  58.  * 2/11/92  W. Joseph Carter    Ported new code to Macintosh.  Most   *
  59.  *                              important fixes involved changing     *
  60.  *                              16-bit ints to long or unsigned in    *
  61.  *                              bit alloc routines for quant of 65535 *
  62.  *                              and passing proper function args.     *
  63.  *                              Removed "Other Joint Stereo" option   *
  64.  *                              and made bitrate be total channel     *
  65.  *                              bitrate, irrespective of the mode.    *
  66.  *                              Fixed many small bugs & reorganized.  *
  67.  * 7/27/92  Juan Pineda         Bug fix in SubBandSynthesis()         *
  68.  **********************************************************************/
  69. #include        "common.h"
  70. #include        "decoder.h"
  71. /***************************************************************
  72. /*
  73. /* This module contains the core of the decoder ie all the
  74. /* computational routines. (Layer I and II only)
  75. /* Functions are common to both layer unless
  76. /* otherwise specified.
  77. /*
  78. /***************************************************************/
  79. /*****************************************************************
  80. /*
  81. /* The following routines decode the system information
  82. /*
  83. /****************************************************************/
  84. /************ Layer I, Layer II & Layer III ******************/
  85. void decode_info(bs, fr_ps)
  86. Bit_stream_struc *bs;
  87. frame_params *fr_ps;
  88. {
  89.     layer *hdr = fr_ps->header;
  90.     hdr->version = get1bit(bs);
  91.     hdr->lay = 4-getbits(bs,2);
  92.     hdr->error_protection = !get1bit(bs); /* error protect. TRUE/FALSE */
  93.     hdr->bitrate_index = getbits(bs,4);
  94.     hdr->sampling_frequency = getbits(bs,2);
  95.     hdr->padding = get1bit(bs);
  96.     hdr->extension = get1bit(bs);
  97.     hdr->mode = getbits(bs,2);
  98.     hdr->mode_ext = getbits(bs,2);
  99.     hdr->copyright = get1bit(bs);
  100.     hdr->original = get1bit(bs);
  101.     hdr->emphasis = getbits(bs,2);
  102. }
  103. /*******************************************************************
  104. /*
  105. /* The bit allocation information is decoded. Layer I
  106. /* has 4 bit per subband whereas Layer II is Ws and bit rate
  107. /* dependent.
  108. /*
  109. /********************************************************************/
  110. /**************************** Layer II *************/
  111. void II_decode_bitalloc(bs, bit_alloc, fr_ps)
  112. Bit_stream_struc *bs;
  113. unsigned int bit_alloc[2][SBLIMIT];
  114. frame_params *fr_ps;
  115. {
  116.     int i,j;
  117.     int stereo = fr_ps->stereo;
  118.     int sblimit = fr_ps->sblimit;
  119.     int jsbound = fr_ps->jsbound;
  120.     al_table *alloc = fr_ps->alloc;
  121.     for (i=0;i<jsbound;i++) for (j=0;j<stereo;j++)
  122.         bit_alloc[j][i] = (char) getbits(bs,(*alloc)[i][0].bits);
  123.     for (i=jsbound;i<sblimit;i++) /* expand to 2 channels */
  124.         bit_alloc[0][i] = bit_alloc[1][i] =
  125.             (char) getbits(bs,(*alloc)[i][0].bits);
  126.     for (i=sblimit;i<SBLIMIT;i++) for (j=0;j<stereo;j++)
  127.         bit_alloc[j][i] = 0;
  128. }
  129. /**************************** Layer I *************/
  130. void I_decode_bitalloc(bs, bit_alloc, fr_ps)
  131. Bit_stream_struc *bs;
  132. unsigned int bit_alloc[2][SBLIMIT];
  133. frame_params *fr_ps;
  134. {
  135.     int i,j;
  136.     int stereo  = fr_ps->stereo;
  137.     int sblimit = fr_ps->sblimit;
  138.     int jsbound = fr_ps->jsbound;
  139.     int b;
  140.     for (i=0;i<jsbound;i++) for (j=0;j<stereo;j++)
  141.         bit_alloc[j][i] = getbits(bs,4);
  142.     for (i=jsbound;i<SBLIMIT;i++) {
  143.         b = getbits(bs,4);
  144.         for (j=0;j<stereo;j++)
  145.             bit_alloc[j][i] = b;
  146.     }
  147. }
  148. /*****************************************************************
  149. /*
  150. /* The following two functions implement the layer I and II
  151. /* format of scale factor extraction. Layer I involves reading
  152. /* 6 bit per subband as scale factor. Layer II requires reading
  153. /* first the scfsi which in turn indicate the number of scale factors
  154. /* transmitted.
  155. /*    Layer I : I_decode_scale
  156. /*   Layer II : II_decode_scale
  157. /*
  158. /****************************************************************/
  159. /************************** Layer I stuff ************************/
  160. void I_decode_scale(bs, bit_alloc, scale_index, fr_ps)
  161. Bit_stream_struc *bs;
  162. unsigned int bit_alloc[2][SBLIMIT], scale_index[2][3][SBLIMIT];
  163. frame_params *fr_ps;
  164. {
  165.     int i,j;
  166.     int stereo = fr_ps->stereo;
  167.     int sblimit = fr_ps->sblimit;
  168.     for (i=0;i<SBLIMIT;i++) for (j=0;j<stereo;j++)
  169.         if (!bit_alloc[j][i])
  170.             scale_index[j][0][i] = SCALE_RANGE-1;
  171.         else                    /* 6 bit per scale factor */
  172.             scale_index[j][0][i] =  getbits(bs,6);
  173. }
  174. /*************************** Layer II stuff ***************************/
  175. void II_decode_scale(bs,scfsi, bit_alloc,scale_index, fr_ps)
  176. Bit_stream_struc *bs;
  177. unsigned int scfsi[2][SBLIMIT], bit_alloc[2][SBLIMIT],
  178.              scale_index[2][3][SBLIMIT];
  179. frame_params *fr_ps;
  180. {
  181.     int i,j;
  182.     int stereo = fr_ps->stereo;
  183.     int sblimit = fr_ps->sblimit;
  184.    
  185.     for (i=0;i<sblimit;i++) for (j=0;j<stereo;j++) /* 2 bit scfsi */
  186.         if (bit_alloc[j][i]) scfsi[j][i] = (char) getbits(bs,2);
  187.     for (i=sblimit;i<SBLIMIT;i++) for (j=0;j<stereo;j++)   
  188.         scfsi[j][i] = 0;
  189.     for (i=0;i<sblimit;i++) for (j=0;j<stereo;j++) {
  190.         if (bit_alloc[j][i])   
  191.             switch (scfsi[j][i]) {
  192.                 /* all three scale factors transmitted */
  193.              case 0 : scale_index[j][0][i] = getbits(bs,6);
  194.                 scale_index[j][1][i] = getbits(bs,6);
  195.                 scale_index[j][2][i] = getbits(bs,6);
  196.                 break;
  197.                 /* scale factor 1 & 3 transmitted */
  198.              case 1 : scale_index[j][0][i] =
  199.                  scale_index[j][1][i] = getbits(bs,6);
  200.                 scale_index[j][2][i] = getbits(bs,6);
  201.                 break;
  202.                 /* scale factor 1 & 2 transmitted */
  203.              case 3 : scale_index[j][0][i] = getbits(bs,6);
  204.                 scale_index[j][1][i] =
  205.                     scale_index[j][2][i] =  getbits(bs,6);
  206.                 break;
  207.                 /* only one scale factor transmitted */
  208.              case 2 : scale_index[j][0][i] =
  209.                  scale_index[j][1][i] =
  210.                      scale_index[j][2][i] = getbits(bs,6);
  211.                 break;
  212.                 default : break;
  213.             }
  214.         else {
  215.             scale_index[j][0][i] = scale_index[j][1][i] =
  216.                 scale_index[j][2][i] = SCALE_RANGE-1;
  217.         }
  218.     }
  219.     for (i=sblimit;i<SBLIMIT;i++) for (j=0;j<stereo;j++) {
  220.         scale_index[j][0][i] = scale_index[j][1][i] =
  221.             scale_index[j][2][i] = SCALE_RANGE-1;
  222.     }
  223. }
  224. /**************************************************************
  225. /*
  226. /*   The following two routines take care of reading the
  227. /* compressed sample from the bit stream for both layer 1 and
  228. /* layer 2. For layer 1, read the number of bits as indicated
  229. /* by the bit_alloc information. For layer 2, if grouping is
  230. /* indicated for a particular subband, then the sample size has
  231. /* to be read from the bits_group and the merged samples has
  232. /* to be decompose into the three distinct samples. Otherwise,
  233. /* it is the same for as layer one.
  234. /*
  235. /**************************************************************/
  236. /******************************* Layer I stuff ******************/
  237. void I_buffer_sample(bs, sample, bit_alloc, fr_ps)
  238. unsigned int FAR sample[2][3][SBLIMIT];
  239. unsigned int bit_alloc[2][SBLIMIT];
  240. Bit_stream_struc *bs;
  241. frame_params *fr_ps;
  242. {
  243.     int i,j,k;
  244.     int stereo = fr_ps->stereo;
  245.     int sblimit = fr_ps->sblimit;
  246.     int jsbound = fr_ps->jsbound;
  247.     unsigned int s;
  248.     for (i=0;i<jsbound;i++) for (j=0;j<stereo;j++)
  249.         if ( (k = bit_alloc[j][i]) == 0)
  250.             sample[j][0][i] = 0;
  251.         else 
  252.             sample[j][0][i] = (unsigned int) getbits(bs,k+1);
  253.     for (i=jsbound;i<SBLIMIT;i++) {
  254.         if ( (k = bit_alloc[0][i]) == 0)
  255.             s = 0;
  256.         else 
  257.             s = (unsigned int)getbits(bs,k+1);
  258.         for (j=0;j<stereo;j++)
  259.             sample[j][0][i]    = s;
  260.     }
  261. }
  262. /*************************** Layer II stuff ************************/
  263. void II_buffer_sample(bs,sample,bit_alloc,fr_ps)
  264. unsigned int FAR sample[2][3][SBLIMIT];
  265. unsigned int bit_alloc[2][SBLIMIT];
  266. Bit_stream_struc *bs;
  267. frame_params *fr_ps;
  268. {
  269.     int i,j,k,m;
  270.     int stereo = fr_ps->stereo;
  271.     int sblimit = fr_ps->sblimit;
  272.     int jsbound = fr_ps->jsbound;
  273.     al_table *alloc = fr_ps->alloc;
  274.     for (i=0;i<sblimit;i++) for (j=0;j<((i<jsbound)?stereo:1);j++) {
  275.         if (bit_alloc[j][i]) {
  276.             /* check for grouping in subband */
  277.             if ((*alloc)[i][bit_alloc[j][i]].group==3)
  278.                 for (m=0;m<3;m++) {
  279.                     k = (*alloc)[i][bit_alloc[j][i]].bits;
  280.                     sample[j][m][i] = (unsigned int) getbits(bs,k);
  281.                 }         
  282.             else {              /* bit_alloc = 3, 5, 9 */
  283.                 unsigned int nlevels, c=0;
  284.                 nlevels = (*alloc)[i][bit_alloc[j][i]].steps;
  285.                 k=(*alloc)[i][bit_alloc[j][i]].bits;
  286.                 c = (unsigned int) getbits(bs, k);
  287.                 for (k=0;k<3;k++) {
  288.                     sample[j][k][i] = c % nlevels;
  289.                     c /= nlevels;
  290.                 }
  291.             }
  292.         }
  293.         else {                  /* for no sample transmitted */
  294.             for (k=0;k<3;k++) sample[j][k][i] = 0;
  295.         }
  296.         if(stereo == 2 && i>= jsbound) /* joint stereo : copy L to R */
  297.             for (k=0;k<3;k++) sample[1][k][i] = sample[0][k][i];
  298.     }
  299.     for (i=sblimit;i<SBLIMIT;i++) for (j=0;j<stereo;j++) for (k=0;k<3;k++)
  300.         sample[j][k][i] = 0;
  301. }      
  302. /**************************************************************
  303. /*
  304. /*   Restore the compressed sample to a factional number.
  305. /*   first complement the MSB of the sample
  306. /*    for layer I :
  307. /*    Use s = (s' + 2^(-nb+1) ) * 2^nb / (2^nb-1)
  308. /*   for Layer II :
  309. /*   Use the formula s = s' * c + d
  310. /*
  311. /**************************************************************/
  312. static double c[17] = { 1.33333333333, 1.60000000000, 1.14285714286,
  313.                         1.77777777777, 1.06666666666, 1.03225806452,
  314.                         1.01587301587, 1.00787401575, 1.00392156863,
  315.                         1.00195694716, 1.00097751711, 1.00048851979,
  316.                         1.00024420024, 1.00012208522, 1.00006103888,
  317.                         1.00003051851, 1.00001525902 };
  318. static double d[17] = { 0.500000000, 0.500000000, 0.250000000, 0.500000000,
  319.                         0.125000000, 0.062500000, 0.031250000, 0.015625000,
  320.                         0.007812500, 0.003906250, 0.001953125, 0.0009765625,
  321.                         0.00048828125, 0.00024414063, 0.00012207031,
  322.                         0.00006103516, 0.00003051758 };
  323. /************************** Layer II stuff ************************/
  324. void II_dequantize_sample(sample, bit_alloc, fraction, fr_ps)
  325. unsigned int FAR sample[2][3][SBLIMIT];
  326. unsigned int bit_alloc[2][SBLIMIT];
  327. double FAR fraction[2][3][SBLIMIT];
  328. frame_params *fr_ps;
  329. {
  330.     int i, j, k, x;
  331.     int stereo = fr_ps->stereo;
  332.     int sblimit = fr_ps->sblimit;
  333.     al_table *alloc = fr_ps->alloc;
  334.     for (i=0;i<sblimit;i++)  for (j=0;j<3;j++) for (k=0;k<stereo;k++)
  335.         if (bit_alloc[k][i]) {
  336.             /* locate MSB in the sample */
  337.             x = 0;
  338. #ifndef MS_DOS
  339.             while ((1L<<x) < (*alloc)[i][bit_alloc[k][i]].steps) x++;
  340. #else
  341.             /* microsoft C thinks an int is a short */
  342.             while (( (unsigned long) (1L<<(long)x) <
  343.                     (unsigned long)( (*alloc)[i][bit_alloc[k][i]].steps)
  344.                     ) && ( x < 16) ) x++;
  345. #endif
  346.             /* MSB inversion */
  347.             if (((sample[k][j][i] >> x-1) & 1) == 1)
  348.                 fraction[k][j][i] = 0.0;
  349.             else  fraction[k][j][i] = -1.0;
  350.             /* Form a 2's complement sample */
  351.             fraction[k][j][i] += (double) (sample[k][j][i] & ((1<<x-1)-1)) /
  352.                 (double) (1L<<x-1);
  353.             /* Dequantize the sample */
  354.             fraction[k][j][i] += d[(*alloc)[i][bit_alloc[k][i]].quant];
  355.             fraction[k][j][i] *= c[(*alloc)[i][bit_alloc[k][i]].quant];
  356.         }
  357.         else fraction[k][j][i] = 0.0;   
  358.    
  359.     for (i=sblimit;i<SBLIMIT;i++) for (j=0;j<3;j++) for(k=0;k<stereo;k++)
  360.         fraction[k][j][i] = 0.0;
  361. }
  362. /***************************** Layer I stuff ***********************/
  363. void I_dequantize_sample(sample, fraction, bit_alloc, fr_ps)
  364. unsigned int FAR sample[2][3][SBLIMIT];
  365. unsigned int bit_alloc[2][SBLIMIT];
  366. double FAR fraction[2][3][SBLIMIT];
  367. frame_params *fr_ps;
  368. {
  369.     int i, nb, k;
  370.     int stereo = fr_ps->stereo;
  371.     int sblimit = fr_ps->sblimit;
  372.     for (i=0;i<SBLIMIT;i++)
  373.         for (k=0;k<stereo;k++)
  374.             if (bit_alloc[k][i]) {
  375.                 nb = bit_alloc[k][i] + 1;
  376.                 if (((sample[k][0][i] >> nb-1) & 1) == 1) fraction[k][0][i] = 0.0;
  377.                 else fraction[k][0][i] = -1.0;
  378.                 fraction[k][0][i] += (double) (sample[k][0][i] & ((1<<nb-1)-1)) /
  379.                     (double) (1L<<nb-1);
  380.                 fraction[k][0][i] =
  381.                     (double) (fraction[k][0][i]+1.0/(double)(1L<<nb-1)) *
  382.                         (double) (1L<<nb) / (double) ((1L<<nb)-1);
  383.             }
  384.             else fraction[k][0][i] = 0.0;
  385. }
  386. /************************************************************
  387. /*
  388. /*   Restore the original value of the sample ie multiply
  389. /*    the fraction value by its scalefactor.
  390. /*
  391. /************************************************************/
  392. /************************* Layer II Stuff **********************/
  393. void II_denormalize_sample(fraction, scale_index,fr_ps,x)
  394. double FAR fraction[2][3][SBLIMIT];
  395. unsigned int scale_index[2][3][SBLIMIT];
  396. frame_params *fr_ps;
  397. int x;
  398. {
  399.     int i,j,k;
  400.     int stereo = fr_ps->stereo;
  401.     int sblimit = fr_ps->sblimit;
  402.     for (i=0;i<sblimit;i++) for (j=0;j<stereo;j++) {
  403.         fraction[j][0][i] *= multiple[scale_index[j][x][i]];
  404.         fraction[j][1][i] *= multiple[scale_index[j][x][i]];
  405.         fraction[j][2][i] *= multiple[scale_index[j][x][i]];
  406.     }
  407. }
  408. /**************************** Layer I stuff ******************************/
  409. void I_denormalize_sample(fraction,scale_index,fr_ps)
  410. double FAR fraction[2][3][SBLIMIT];
  411. unsigned int scale_index[2][3][SBLIMIT];
  412. frame_params *fr_ps;
  413. {
  414.     int i,j,k;
  415.     int stereo = fr_ps->stereo;
  416.     int sblimit = fr_ps->sblimit;
  417.     for (i=0;i<SBLIMIT;i++) for (j=0;j<stereo;j++)
  418.         fraction[j][0][i] *= multiple[scale_index[j][0][i]];
  419. }
  420. /*****************************************************************
  421. /*
  422. /* The following are the subband synthesis routines. They apply
  423. /* to both layer I and layer II stereo or mono. The user has to
  424. /* decide what parameters are to be passed to the routines.
  425. /*
  426. /***************************************************************/
  427. /*************************************************************
  428. /*
  429. /*   Pass the subband sample through the synthesis window
  430. /*
  431. /**************************************************************/
  432. /* create in synthesis filter */
  433. void create_syn_filter(filter)
  434. double FAR filter[64][SBLIMIT];
  435. {
  436.     register int i,k;
  437.     for (i=0; i<64; i++)
  438.         for (k=0; k<32; k++) {
  439.             if ((filter[i][k] = 1e9*cos((double)((PI64*i+PI4)*(2*k+1)))) >= 0)
  440.                 modf(filter[i][k]+0.5, &filter[i][k]);
  441.             else
  442.                 modf(filter[i][k]-0.5, &filter[i][k]);
  443.             filter[i][k] *= 1e-9;
  444.         }
  445. }
  446. /***************************************************************
  447. /*
  448. /*   Window the restored sample
  449. /*
  450. /***************************************************************/
  451. /* read in synthesis window */
  452. void read_syn_window(window)
  453. double FAR window[HAN_SIZE];
  454. {
  455.     int i,j[4];
  456.     FILE *fp;
  457.     double f[4];
  458.     char t[150];
  459.     if (!(fp = OpenTableFile("dewindow") )) {
  460.         printf("Please check synthesis window table 'dewindow'n");
  461.         exit(1);
  462.     }
  463.     for (i=0;i<512;i+=4) {
  464.         fgets(t, 150, fp);
  465.         sscanf(t,"D[%d] = %lf D[%d] = %lf D[%d] = %lf D[%d] = %lfn",
  466.                j, f,j+1,f+1,j+2,f+2,j+3,f+3);
  467.         if (i==j[0]) {
  468.             window[i] = f[0];
  469.             window[i+1] = f[1];
  470.             window[i+2] = f[2];
  471.             window[i+3] = f[3];
  472.         }
  473.         else {
  474.             printf("Check index in synthesis window tablen");
  475.             exit(1);
  476.         }
  477.         fgets(t,150,fp);
  478.     }
  479.     fclose(fp);
  480. }
  481. int SubBandSynthesis (bandPtr, channel, samples)
  482. double *bandPtr;
  483. int channel;
  484. short *samples;
  485. {
  486.     register int i,j,k;
  487.     register double *bufOffsetPtr, sum;
  488.     static int init = 1;
  489.     typedef double NN[64][32];
  490.     static NN FAR *filter;
  491.     typedef double BB[2][2*HAN_SIZE];
  492.     static BB FAR *buf;
  493.     static int bufOffset = 64;
  494.     static double FAR *window;
  495.     int clip = 0;               /* count & return how many samples clipped */
  496.     if (init) {
  497.         buf = (BB FAR *) mem_alloc(sizeof(BB),"BB");
  498.         filter = (NN FAR *) mem_alloc(sizeof(NN), "NN");
  499.         create_syn_filter(*filter);
  500.         window = (double FAR *) mem_alloc(sizeof(double) * HAN_SIZE, "WIN");
  501.         read_syn_window(window);
  502.         bufOffset = 64;
  503.         init = 0;
  504.     }
  505.     if (channel == 0) bufOffset = (bufOffset - 64) & 0x3ff;
  506.     bufOffsetPtr = &((*buf)[channel][bufOffset]);
  507.     for (i=0; i<64; i++) {
  508.         sum = 0;
  509.         for (k=0; k<32; k++)
  510.             sum += bandPtr[k] * (*filter)[i][k];
  511.         bufOffsetPtr[i] = sum;
  512.     }
  513.     /*  S(i,j) = D(j+32i) * U(j+32i+((i+1)>>1)*64)  */
  514.     /*  samples(i,j) = MWindow(j+32i) * bufPtr(j+32i+((i+1)>>1)*64)  */
  515.     for (j=0; j<32; j++) {
  516.         sum = 0;
  517.         for (i=0; i<16; i++) {
  518.             k = j + (i<<5);
  519.             sum += window[k] * (*buf) [channel] [( (k + ( ((i+1)>>1) <<6) ) +
  520.                                                   bufOffset) & 0x3ff];
  521.         }
  522. /*   {long foo = (sum > 0) ? sum * SCALE + 0.5 : sum * SCALE - 0.5; */
  523.      {long foo = sum * SCALE;
  524.      if (foo >= (long) SCALE)      {samples[j] = SCALE-1; ++clip;}
  525.      else if (foo < (long) -SCALE) {samples[j] = -SCALE;  ++clip;}
  526.      else                           samples[j] = foo;
  527.  }
  528.     }
  529.     return(clip);
  530. }
  531. void out_fifo(pcm_sample, num, fr_ps, done, outFile, psampFrames)
  532. short FAR pcm_sample[2][3][SBLIMIT];
  533. int num;
  534. frame_params *fr_ps;
  535. int done;
  536. FILE *outFile;
  537. unsigned long *psampFrames;
  538. {
  539.     int i,j,l;
  540.     int stereo = fr_ps->stereo;
  541.     int sblimit = fr_ps->sblimit;
  542.     static short int outsamp[1600];
  543.     static long k = 0;
  544.     if (!done)
  545.         for (i=0;i<num;i++) for (j=0;j<SBLIMIT;j++) {
  546.             (*psampFrames)++;
  547.             for (l=0;l<stereo;l++) {
  548.                 if (!(k%1600) && k) {
  549.                     fwrite(outsamp,2,1600,outFile);
  550.                     k = 0;
  551.                 }
  552.                 outsamp[k++] = pcm_sample[l][i][j];
  553.             }
  554.         }
  555.     else {
  556.         fwrite(outsamp,2,(int)k,outFile);
  557.         k = 0;
  558.     }
  559. }
  560. void  buffer_CRC(bs, old_crc)
  561. Bit_stream_struc  *bs;
  562. unsigned int  *old_crc;
  563. {
  564.     *old_crc = getbits(bs, 16);
  565. }
  566. void  recover_CRC_error(pcm_sample, error_count, fr_ps, outFile, psampFrames)
  567. short FAR pcm_sample[2][3][SBLIMIT];
  568. int error_count;
  569. frame_params *fr_ps;
  570. FILE *outFile;
  571. unsigned long *psampFrames;
  572. {
  573.     int  stereo = fr_ps->stereo;
  574.     int  num, done, i;
  575.     int  samplesPerFrame, samplesPerSlot;
  576.     layer  *hdr = fr_ps->header;
  577.     long  offset;
  578.     short  *temp;
  579.     num = 3;
  580.     if (hdr->lay == 1) num = 1;
  581.     samplesPerSlot = SBLIMIT * num * stereo;
  582.     samplesPerFrame = samplesPerSlot * 32;
  583.     if (error_count == 1) {     /* replicate previous error_free frame */
  584.         done = 1;
  585.         /* flush out fifo */
  586.         out_fifo(pcm_sample, num, fr_ps, done, outFile, psampFrames);
  587.         /* go back to the beginning of the previous frame */
  588.         offset = sizeof(short int) * samplesPerFrame;
  589.         fseek(outFile, -offset, SEEK_CUR);
  590.         done = 0;
  591.         for (i = 0; i < SCALE_BLOCK; i++) {
  592.             fread(pcm_sample, 2, samplesPerSlot, outFile);
  593.             out_fifo(pcm_sample, num, fr_ps, done, outFile, psampFrames);
  594.         }
  595.     }
  596.     else{                       /* mute the frame */
  597.         temp = (short*) pcm_sample;
  598.         done = 0;
  599.         for (i = 0; i < 2*3*SBLIMIT; i++)
  600.             *temp++ = MUTE;     /* MUTE value is in decoder.h */
  601.         for (i = 0; i < SCALE_BLOCK; i++)
  602.             out_fifo(pcm_sample, num, fr_ps, done, outFile, psampFrames);
  603.     }
  604. }