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

其他游戏

开发平台:

Visual C++

  1. /*
  2.  * Modified for use with MPlayer, for details see the changelog at
  3.  * http://svn.mplayerhq.hu/mplayer/trunk/
  4.  * $Id: decod386.c 24193 2007-08-25 17:05:02Z diego $
  5.  */
  6. /*
  7.  * Mpeg Layer-1,2,3 audio decoder
  8.  * ------------------------------
  9.  * copyright (c) 1995,1996,1997 by Michael Hipp, All rights reserved.
  10.  * See also 'README'
  11.  *
  12.  * slighlty optimized for machines without autoincrement/decrement.
  13.  * The performance is highly compiler dependend. Maybe
  14.  * the decode.c version for 'normal' processor may be faster
  15.  * even for Intel processors.
  16.  */
  17. #include "config.h"
  18. #if 0
  19.  /* old WRITE_SAMPLE */
  20.    /* is portable */
  21. #define WRITE_SAMPLE(samples,sum,clip) {
  22.   if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; }
  23.   else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; }
  24.   else { *(samples) = sum;  }
  25. }
  26. #else
  27.  /* new WRITE_SAMPLE */
  28. /*
  29.  * should be the same as the "old WRITE_SAMPLE" macro above, but uses
  30.  * some tricks to avoid double->int conversions and floating point compares.
  31.  *
  32.  * Here's how it works:
  33.  * ((((65536.0 * 65536.0 * 16)+(65536.0 * 0.5))* 65536.0)) is
  34.  * 0x0010000080000000LL in hex.  It computes 0x0010000080000000LL + sum
  35.  * as a double IEEE fp value and extracts the low-order 32-bits from the
  36.  * IEEE fp representation stored in memory.  The 2^56 bit in the constant
  37.  * is intended to force the bits of "sum" into the least significant bits
  38.  * of the double mantissa.  After an integer substraction of 0x80000000
  39.  * we have the original double value "sum" converted to an 32-bit int value.
  40.  *
  41.  * (Is that really faster than the clean and simple old version of the macro?)
  42.  */
  43. /*
  44.  * On a SPARC cpu, we fetch the low-order 32-bit from the second 32-bit
  45.  * word of the double fp value stored in memory.  On an x86 cpu, we fetch it
  46.  * from the first 32-bit word.
  47.  * I'm not sure if the WORDS_BIGENDIAN feature test covers all possible memory
  48.  * layouts of double floating point values an all cpu architectures.  If
  49.  * it doesn't work for you, just enable the "old WRITE_SAMPLE" macro.
  50.  */
  51. #if WORDS_BIGENDIAN
  52. #define MANTISSA_OFFSET 1
  53. #else
  54. #define MANTISSA_OFFSET 0
  55. #endif
  56.    /* sizeof(int) == 4 */
  57. #if 0
  58. #define WRITE_SAMPLE(samples,sum,clip) { 
  59.   union { double dtemp; int itemp[2]; } u; int v; 
  60.   u.dtemp = ((((65536.0 * 65536.0 * 16)+(65536.0 * 0.5))* 65536.0)) + (sum);
  61.   v = u.itemp[MANTISSA_OFFSET] - 0x80000000; 
  62.   if( v > 32767) { *(samples) = 0x7fff; (clip)++; } 
  63.   else if( v < -32768) { *(samples) = -0x8000; (clip)++; } 
  64.   else { *(samples) = v; } 
  65. }
  66. #else
  67. #define WRITE_SAMPLE(samples,sum,clip) { 
  68.   int v = (int)floorf(sum + 0.5f);
  69.   if( v > 32767) { *(samples) = 0x7fff; (clip)++; } 
  70.   else if( v < -32768) { *(samples) = -0x8000; (clip)++; } 
  71.   else { *(samples) = v; } 
  72. }
  73. #endif
  74. #endif
  75. /*
  76. #define WRITE_SAMPLE(samples,sum,clip) { 
  77.   double dtemp; int v;                    
  78.   dtemp = ((((65536.0 * 65536.0 * 16)+(65536.0 * 0.5))* 65536.0)) + (sum);
  79.   v = ((*(int *)&dtemp) - 0x80000000); 
  80.   if( v > 32767) { *(samples) = 0x7fff; (clip)++; } 
  81.   else if( v < -32768) { *(samples) = -0x8000; (clip)++; } 
  82.   else { *(samples) = v; } 
  83. }
  84. */
  85. static int synth_1to1(real *bandPtr,int channel,unsigned char *out,int *pnt);
  86. static int synth_1to1_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
  87. {
  88.   int i,ret;
  89.   ret = synth_1to1(bandPtr,0,samples,pnt);
  90.   samples = samples + *pnt - 128;
  91.   for(i=0;i<32;i++) {
  92.     ((short *)samples)[1] = ((short *)samples)[0];
  93.     samples+=4;
  94.   }
  95.   return ret;
  96. }
  97. static synth_func_t synth_func;
  98. #ifdef HAVE_ALTIVEC
  99. #define dct64_base(a,b,c) if(gCpuCaps.hasAltiVec) dct64_altivec(a,b,c); else dct64(a,b,c)
  100. #else /* HAVE_ALTIVEC */
  101. #define dct64_base(a,b,c) dct64(a,b,c)
  102. #endif /* HAVE_ALTIVEC */
  103.  
  104. static int synth_1to1(real *bandPtr,int channel,unsigned char *out,int *pnt)
  105. {
  106. static real buffs[2][2][0x110];
  107.   static const int step = 2;
  108.   static int bo = 1;
  109.   short *samples = (short *) (out + *pnt);
  110.   real *b0,(*buf)[0x110];
  111.   int clip = 0;
  112.   int bo1;
  113.   *pnt += 128;
  114. /* optimized for x86 */
  115. #ifdef ARCH_X86
  116.   if ( synth_func )
  117.    {
  118. //    printf("Calling %p, bandPtr=%p channel=%d samples=%pn",synth_func,bandPtr,channel,samples);
  119.     // FIXME: synth_func() may destroy EBP, don't rely on stack contents!!!
  120.     return (*synth_func)( bandPtr,channel,samples);
  121.    }
  122. #endif
  123.   if(!channel) {     /* channel=0 */
  124.     bo--;
  125.     bo &= 0xf;
  126.     buf = buffs[0];
  127.   }
  128.   else {
  129.     samples++;
  130.     buf = buffs[1];
  131.   }
  132.   if(bo & 0x1) {
  133.     b0 = buf[0];
  134.     bo1 = bo;
  135.     dct64_base(buf[1]+((bo+1)&0xf),buf[0]+bo,bandPtr);
  136.   }
  137.   else {
  138.     b0 = buf[1];
  139.     bo1 = bo+1;
  140.     dct64_base(buf[0]+bo,buf[1]+bo+1,bandPtr);
  141.   }
  142.   {
  143.     register int j;
  144.     real *window = mp3lib_decwin + 16 - bo1;
  145.     for (j=16;j;j--,b0+=0x10,window+=0x20,samples+=step)
  146.     {
  147.       real sum;
  148.       sum  = window[0x0] * b0[0x0];
  149.       sum -= window[0x1] * b0[0x1];
  150.       sum += window[0x2] * b0[0x2];
  151.       sum -= window[0x3] * b0[0x3];
  152.       sum += window[0x4] * b0[0x4];
  153.       sum -= window[0x5] * b0[0x5];
  154.       sum += window[0x6] * b0[0x6];
  155.       sum -= window[0x7] * b0[0x7];
  156.       sum += window[0x8] * b0[0x8];
  157.       sum -= window[0x9] * b0[0x9];
  158.       sum += window[0xA] * b0[0xA];
  159.       sum -= window[0xB] * b0[0xB];
  160.       sum += window[0xC] * b0[0xC];
  161.       sum -= window[0xD] * b0[0xD];
  162.       sum += window[0xE] * b0[0xE];
  163.       sum -= window[0xF] * b0[0xF];
  164.       WRITE_SAMPLE(samples,sum,clip);
  165.     }
  166.     {
  167.       real sum;
  168.       sum  = window[0x0] * b0[0x0];
  169.       sum += window[0x2] * b0[0x2];
  170.       sum += window[0x4] * b0[0x4];
  171.       sum += window[0x6] * b0[0x6];
  172.       sum += window[0x8] * b0[0x8];
  173.       sum += window[0xA] * b0[0xA];
  174.       sum += window[0xC] * b0[0xC];
  175.       sum += window[0xE] * b0[0xE];
  176.       WRITE_SAMPLE(samples,sum,clip);
  177.       b0-=0x10,window-=0x20,samples+=step;
  178.     }
  179.     window += bo1<<1;
  180.     for (j=15;j;j--,b0-=0x10,window-=0x20,samples+=step)
  181.     {
  182.       real sum;
  183.       sum = -window[-0x1] * b0[0x0];
  184.       sum -= window[-0x2] * b0[0x1];
  185.       sum -= window[-0x3] * b0[0x2];
  186.       sum -= window[-0x4] * b0[0x3];
  187.       sum -= window[-0x5] * b0[0x4];
  188.       sum -= window[-0x6] * b0[0x5];
  189.       sum -= window[-0x7] * b0[0x6];
  190.       sum -= window[-0x8] * b0[0x7];
  191.       sum -= window[-0x9] * b0[0x8];
  192.       sum -= window[-0xA] * b0[0x9];
  193.       sum -= window[-0xB] * b0[0xA];
  194.       sum -= window[-0xC] * b0[0xB];
  195.       sum -= window[-0xD] * b0[0xC];
  196.       sum -= window[-0xE] * b0[0xD];
  197.       sum -= window[-0xF] * b0[0xE];
  198.       sum -= window[-0x0] * b0[0xF];
  199.       WRITE_SAMPLE(samples,sum,clip);
  200.     }
  201.   }
  202.   return clip;
  203. }
  204. #ifdef USE_FAKE_MONO
  205. static int synth_1to1_l(real *bandPtr,int channel,unsigned char *out,int *pnt)
  206. {
  207.   int i,ret;
  208.   ret = synth_1to1(bandPtr,channel,out,pnt);
  209.   out = out + *pnt - 128;
  210.   for(i=0;i<32;i++) {
  211.     ((short *)out)[1] = ((short *)out)[0];
  212.     out+=4;
  213.   }
  214.   return ret;
  215. }
  216. static int synth_1to1_r(real *bandPtr,int channel,unsigned char *out,int *pnt)
  217. {
  218.   int i,ret;
  219.   ret = synth_1to1(bandPtr,channel,out,pnt);
  220.   out = out + *pnt - 128;
  221.   for(i=0;i<32;i++) {
  222.     ((short *)out)[0] = ((short *)out)[1];
  223.     out+=4;
  224.   }
  225.   return ret;
  226. }
  227. #endif