layer1.c
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:4k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* 
  2.  * Mpeg Layer-1 audio decoder 
  3.  * --------------------------
  4.  * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README'
  5.  * near unoptimzed ...
  6.  *
  7.  * may have a few bugs after last optimization ... 
  8.  *
  9.  */
  10. /*
  11.  * Modified for use with MPlayer, for details see the changelog at
  12.  * http://svn.mplayerhq.hu/mplayer/trunk/
  13.  * $Id: layer1.c 23484 2007-06-06 05:13:13Z zuxy $
  14.  *
  15.  * The above-mentioned README file has the following to say about licensing:
  16.  *
  17.  *   COPYING: you may use this source under LGPL terms!
  18.  */
  19. //#include "mpg123.h"
  20. static void I_step_one(unsigned int balloc[], unsigned int scale_index[2][SBLIMIT],struct frame *fr)
  21. {
  22.   unsigned int *ba=balloc;
  23.   unsigned int *sca = (unsigned int *) scale_index;
  24.   if(fr->stereo == 2) {
  25.     int i;
  26.     int jsbound = fr->jsbound;
  27.     for (i=0;i<jsbound;i++) { 
  28.       *ba++ = getbits(4);
  29.       *ba++ = getbits(4);
  30.     }
  31.     for (i=jsbound;i<SBLIMIT;i++)
  32.       *ba++ = getbits(4);
  33.     ba = balloc;
  34.     for (i=0;i<jsbound;i++) {
  35.       if ((*ba++))
  36.         *sca++ = getbits(6);
  37.       if ((*ba++))
  38.         *sca++ = getbits(6);
  39.     }
  40.     for (i=jsbound;i<SBLIMIT;i++)
  41.       if ((*ba++)) {
  42.         *sca++ =  getbits(6);
  43.         *sca++ =  getbits(6);
  44.       }
  45.   }
  46.   else {
  47.     int i;
  48.     for (i=0;i<SBLIMIT;i++)
  49.       *ba++ = getbits(4);
  50.     ba = balloc;
  51.     for (i=0;i<SBLIMIT;i++)
  52.       if ((*ba++))
  53.         *sca++ = getbits(6);
  54.   }
  55. }
  56. static void I_step_two(real fraction[2][SBLIMIT],unsigned int balloc[2*SBLIMIT],
  57. unsigned int scale_index[2][SBLIMIT],struct frame *fr)
  58. {
  59.   int i,n;
  60.   int smpb[2*SBLIMIT]; /* values: 0-65535 */
  61.   int *sample;
  62.   register unsigned int *ba;
  63.   register unsigned int *sca = (unsigned int *) scale_index;
  64.   if(fr->stereo == 2) {
  65.     int jsbound = fr->jsbound;
  66.     register real *f0 = fraction[0];
  67.     register real *f1 = fraction[1];
  68.     ba = balloc;
  69.     for (sample=smpb,i=0;i<jsbound;i++)  {
  70.       if ((n = *ba++))
  71.         *sample++ = getbits(n+1);
  72.       if ((n = *ba++))
  73.         *sample++ = getbits(n+1);
  74.     }
  75.     for (i=jsbound;i<SBLIMIT;i++) 
  76.       if ((n = *ba++))
  77.         *sample++ = getbits(n+1);
  78.     ba = balloc;
  79.     for (sample=smpb,i=0;i<jsbound;i++) {
  80.       if((n=*ba++))
  81.         *f0++ = (real) ( ((-1)<<n) + (*sample++) + 1) * muls[n+1][*sca++];
  82.       else
  83.         *f0++ = 0.0;
  84.       if((n=*ba++))
  85.         *f1++ = (real) ( ((-1)<<n) + (*sample++) + 1) * muls[n+1][*sca++];
  86.       else
  87.         *f1++ = 0.0;
  88.     }
  89.     for (i=jsbound;i<SBLIMIT;i++) {
  90.       if ((n=*ba++)) {
  91.         real samp = ( ((-1)<<n) + (*sample++) + 1);
  92.         *f0++ = samp * muls[n+1][*sca++];
  93.         *f1++ = samp * muls[n+1][*sca++];
  94.       }
  95.       else
  96.         *f0++ = *f1++ = 0.0;
  97.     }
  98.     for(i=fr->down_sample_sblimit;i<32;i++)
  99.       fraction[0][i] = fraction[1][i] = 0.0;
  100.   }
  101.   else {
  102.     register real *f0 = fraction[0];
  103.     ba = balloc;
  104.     for (sample=smpb,i=0;i<SBLIMIT;i++)
  105.       if ((n = *ba++))
  106.         *sample++ = getbits(n+1);
  107.     ba = balloc;
  108.     for (sample=smpb,i=0;i<SBLIMIT;i++) {
  109.       if((n=*ba++))
  110.         *f0++ = (real) ( ((-1)<<n) + (*sample++) + 1) * muls[n+1][*sca++];
  111.       else
  112.         *f0++ = 0.0;
  113.     }
  114.     for(i=fr->down_sample_sblimit;i<32;i++)
  115.       fraction[0][i] = 0.0;
  116.   }
  117. }
  118. static int do_layer1(struct frame *fr,int single)
  119. {
  120.   int clip=0;
  121.   int i,stereo = fr->stereo;
  122.   unsigned int balloc[2*SBLIMIT];
  123.   unsigned int scale_index[2][SBLIMIT];
  124.   DECLARE_ALIGNED(16, real, fraction[2][SBLIMIT]);
  125. //  int single = fr->single;
  126. //  printf("do_layer1(0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X )n",
  127. //    wordpointer[0],wordpointer[1],wordpointer[2],wordpointer[3],wordpointer[4],wordpointer[5],wordpointer[6],wordpointer[7]);
  128.   fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? 
  129.                          (fr->mode_ext<<2)+4 : 32;
  130.   if(stereo == 1 || single == 3)
  131.     single = 0;
  132.   I_step_one(balloc,scale_index,fr);
  133.   for (i=0;i<SCALE_BLOCK;i++)
  134.   {
  135.     I_step_two(fraction,balloc,scale_index,fr);
  136.     if(single >= 0)
  137.     {
  138.       clip += (fr->synth_mono)( (real *) fraction[single],pcm_sample,&pcm_point);
  139.     }
  140.     else {
  141.         int p1 = pcm_point;
  142.         clip += (fr->synth)( (real *) fraction[0],0,pcm_sample,&p1);
  143.         clip += (fr->synth)( (real *) fraction[1],1,pcm_sample,&pcm_point);
  144.     }
  145.   }
  146.   return clip;
  147. }