encode.c
上传用户:bjsgzm
上传日期:2007-01-08
资源大小:256k
文件大小:9k
源码类别:

mpeg/mp3

开发平台:

Visual C++

  1. /*
  2. (c) Copyright 1998, 1999 - Tord Jansson
  3. =======================================
  4. This file is part of the BladeEnc MP3 Encoder, based on
  5. ISO's reference code for MPEG Layer 3 compression, and might
  6. contain smaller or larger sections that are directly taken
  7. from ISO's reference code.
  8. All changes to the ISO reference code herein are either
  9. copyrighted by Tord Jansson (tord.jansson@swipnet.se)
  10. or sublicensed to Tord Jansson by a third party.
  11. BladeEnc is free software; you can redistribute this file
  12. and/or modify it under the terms of the GNU Lesser General Public
  13. License as published by the Free Software Foundation; either
  14. version 2.1 of the License, or (at your option) any later version.
  15. */
  16. #include "common.h"
  17. #include "encoder.h"
  18. typedef double MM[SBLIMIT][64];
  19. typedef double XX[2][512];
  20. static int  off[2];
  21. static int  half[2];
  22. static MM  m;
  23. static XX  x;
  24. /*____ rebuffer_audio() __________________________________________________*/
  25. void rebuffer_audio( short buffer[2][1152], short * insamp, unsigned int samples_read, int stereo )
  26. {
  27.   unsigned int j;
  28.   if(stereo == 2)
  29. for(j=0;j<samples_read/2;j++)
  30. {
  31.     buffer[0][j] = insamp[2*j];
  32.     buffer[1][j] = insamp[2*j+1];
  33. }
  34.   }
  35.   else
  36. {
  37. for(j=0;j<samples_read/2;j++)
  38. {
  39. buffer[0][j] = insamp[j];
  40. buffer[1][j] = 0;
  41. }
  42.   }
  43. for( ; j < 1152 ; j++ )
  44. {
  45. buffer[0][j] = 0;
  46. buffer[1][j] = 0;
  47. }
  48.   return;
  49. }
  50. /************************************************************************
  51. *
  52. * create_ana_filter()
  53. *
  54. * PURPOSE:  Calculates the analysis filter bank coefficients
  55. *
  56. * SEMANTICS:
  57. * Calculates the analysis filterbank coefficients and rounds to the
  58. * 9th decimal place accuracy of the filterbank tables in the ISO
  59. * document.  The coefficients are stored in #filter#
  60. ************************************************************************/
  61. void create_ana_filter(double filter[SBLIMIT][64])
  62. {
  63.    register int i,k;
  64.    for (i=0; i<32; i++)
  65.       for (k=0; k<64; k++) {
  66.           if ((filter[i][k] = 1e9*cos((double)((2*i+1)*(16-k)*PI64))) >= 0)
  67.              modf(filter[i][k]+0.5, &filter[i][k]);
  68.           else
  69.              modf(filter[i][k]-0.5, &filter[i][k]);
  70.           filter[i][k] *= 1e-9;
  71.    }
  72. }
  73. /*____ initWindowFilterSubband() ____________________________________________*/
  74. void initWindowFilterSubband( void )
  75. {
  76. int i, j;
  77. off[0] = 0;
  78. off[1] = 0;
  79. half[0] = 0;
  80. half[1] = 0;
  81.     for (i=0;i<2;i++)
  82. for (j=0;j<512;j++)
  83.         x[i][j] = 0;
  84.     create_ana_filter(m);
  85. }
  86. /************************************************************************
  87. *
  88. * filter_subband()
  89. *
  90. * PURPOSE:  Calculates the analysis filter bank coefficients
  91. *
  92. * SEMANTICS:
  93. *      The windowed samples #z# is filtered by the digital filter matrix #m#
  94. * to produce the subband samples #s#. This done by first selectively
  95. * picking out values from the windowed samples, and then multiplying
  96. * them by the filter matrix, producing 32 subband samples.
  97. *
  98. ************************************************************************/
  99. /*____ windowFilterSubband() ____________________________________________*/
  100. void  oldwindowFilterSubband( short * pBuffer, int k, double s[SBLIMIT] )
  101. {
  102.  double y[64];
  103.  int    i,j;
  104.   double  t;
  105.   double *  rpMM;
  106.   int offcache;
  107. double *dp;
  108.   dp = &x[k][0];
  109. offcache = off[k];
  110.   /* replace 32 oldest samples with 32 new samples */
  111.   for ( i=0 ; i<32 ; i++ )
  112. dp[31-i+offcache] = (double) pBuffer[i]/SCALE;
  113.   
  114.   for( i = 0 ; i<64 ; i++ )
  115.   {
  116.     t =  dp[(i+64*0+offcache)&(512-1)] * enwindow[i+64*0];
  117.     t += dp[(i+64*1+offcache)&(512-1)] * enwindow[i+64*1];
  118.     t += dp[(i+64*2+offcache)&(512-1)] * enwindow[i+64*2];
  119.     t += dp[(i+64*3+offcache)&(512-1)] * enwindow[i+64*3];
  120.     t += dp[(i+64*4+offcache)&(512-1)] * enwindow[i+64*4];
  121.     t += dp[(i+64*5+offcache)&(512-1)] * enwindow[i+64*5];
  122.     t += dp[(i+64*6+offcache)&(512-1)] * enwindow[i+64*6];
  123.     t += dp[(i+64*7+offcache)&(512-1)] * enwindow[i+64*7];
  124.     y[i] = t;
  125.   }
  126.   off[k] += 480;              /*offset is modulo (HAN_SIZE-1)*/
  127.   off[k] &= 512-1;
  128.   rpMM = (double *) (m);
  129.   for ( i=0 ; i<SBLIMIT ; i++ )
  130.   {
  131. t = 0;
  132. for( j = 0 ; j < 64 ; j++ )
  133. t += rpMM[j] * y[j];
  134. rpMM += j;
  135. s[i] = t;
  136. }  
  137.  
  138. }
  139. /*____ new windowFilterSubband() ____________________________________________*/
  140. void  windowFilterSubband( short * pBuffer, int k, double s[SBLIMIT] )
  141. {
  142.   double y[64];
  143. int    i,j;
  144. int a;
  145.   double  t;    /* TJ */
  146.   double *  rpMM;    /* TJ */
  147. double *dp, *dp2;
  148. double * pEnw;
  149.    dp = x[k]+off[k]+half[k]*256;
  150. /* replace 32 oldest samples with 32 new samples */
  151. for ( i=0 ; i<32 ; i++ )
  152. dp[(31-i)*8] = (double) pBuffer[i]/SCALE;
  153. for( j = 0 ; j < 2 ; j++ )
  154. {
  155. if( j == 0 )
  156. {
  157. dp = x[k] +half[k]*256;
  158. a = off[k];
  159. }
  160. else
  161. {
  162. if( half[k] == 0 )
  163. {
  164. dp = x[k]+256;
  165. a = off[k];
  166. }
  167. else
  168. {
  169. dp = x[k];
  170. a = (off[k]+1) & 7;
  171. }
  172. }
  173. switch( a )
  174. {
  175. case 0:
  176.   for( i = 0 ; i<32 ; i++ )
  177.    {
  178. dp2 = dp + i*8;
  179. pEnw = enwindow + j*32 + i;
  180.      t =  dp2[0] * pEnw[64*0];
  181.     t += dp2[1] * pEnw[64*1];
  182.     t += dp2[2] * pEnw[64*2];
  183.     t += dp2[3] * pEnw[64*3];
  184.     t += dp2[4] * pEnw[64*4];
  185.     t += dp2[5] * pEnw[64*5];
  186.     t += dp2[6] * pEnw[64*6];
  187.     t += dp2[7] * pEnw[64*7];
  188.     y[i+j*32] = t;
  189.   }
  190. break;
  191. case 1:
  192.   for( i = 0 ; i<32 ; i++ )
  193.    {
  194. dp2 = dp + i*8;
  195. pEnw = enwindow + j*32 + i;
  196.      t =  dp2[1] * pEnw[64*0];
  197.     t += dp2[2] * pEnw[64*1];
  198.     t += dp2[3] * pEnw[64*2];
  199.     t += dp2[4] * pEnw[64*3];
  200.     t += dp2[5] * pEnw[64*4];
  201.     t += dp2[6] * pEnw[64*5];
  202.     t += dp2[7] * pEnw[64*6];
  203.     t += dp2[0] * pEnw[64*7];
  204.     y[i+j*32] = t;
  205.   }
  206. break;
  207. case 2:
  208.   for( i = 0 ; i<32 ; i++ )
  209.    {
  210. dp2 = dp + i*8;
  211. pEnw = enwindow + j*32 + i;
  212.      t =  dp2[2] * pEnw[64*0];
  213.     t += dp2[3] * pEnw[64*1];
  214.     t += dp2[4] * pEnw[64*2];
  215.     t += dp2[5] * pEnw[64*3];
  216.     t += dp2[6] * pEnw[64*4];
  217.     t += dp2[7] * pEnw[64*5];
  218.     t += dp2[0] * pEnw[64*6];
  219.     t += dp2[1] * pEnw[64*7];
  220.     y[i+j*32] = t;
  221.   }
  222. break;
  223. case 3:
  224.   for( i = 0 ; i<32 ; i++ )
  225.    {
  226. dp2 = dp + i*8;
  227. pEnw = enwindow + j*32 + i;
  228.      t =  dp2[3] * pEnw[64*0];
  229.     t += dp2[4] * pEnw[64*1];
  230.     t += dp2[5] * pEnw[64*2];
  231.     t += dp2[6] * pEnw[64*3];
  232.     t += dp2[7] * pEnw[64*4];
  233.     t += dp2[0] * pEnw[64*5];
  234.     t += dp2[1] * pEnw[64*6];
  235.     t += dp2[2] * pEnw[64*7];
  236.     y[i+j*32] = t;
  237.   }
  238. break;
  239. case 4:
  240.   for( i = 0 ; i<32 ; i++ )
  241.    {
  242. dp2 = dp + i*8;
  243. pEnw = enwindow + j*32 + i;
  244.      t =  dp2[4] * pEnw[64*0];
  245.     t += dp2[5] * pEnw[64*1];
  246.     t += dp2[6] * pEnw[64*2];
  247.     t += dp2[7] * pEnw[64*3];
  248.     t += dp2[0] * pEnw[64*4];
  249.     t += dp2[1] * pEnw[64*5];
  250.     t += dp2[2] * pEnw[64*6];
  251.     t += dp2[3] * pEnw[64*7];
  252.     y[i+j*32] = t;
  253.   }
  254. break;
  255. case 5:
  256.   for( i = 0 ; i<32 ; i++ )
  257.    {
  258. dp2 = dp + i*8;
  259. pEnw = enwindow + j*32 + i;
  260.      t =  dp2[5] * pEnw[64*0];
  261.     t += dp2[6] * pEnw[64*1];
  262.     t += dp2[7] * pEnw[64*2];
  263.     t += dp2[0] * pEnw[64*3];
  264.     t += dp2[1] * pEnw[64*4];
  265.     t += dp2[2] * pEnw[64*5];
  266.     t += dp2[3] * pEnw[64*6];
  267.     t += dp2[4] * pEnw[64*7];
  268.     y[i+j*32] = t;
  269.   }
  270. break;
  271. case 6:
  272.   for( i = 0 ; i<32 ; i++ )
  273.    {
  274. dp2 = dp + i*8;
  275. pEnw = enwindow + j*32 + i;
  276.      t =  dp2[6] * pEnw[64*0];
  277.     t += dp2[7] * pEnw[64*1];
  278.     t += dp2[0] * pEnw[64*2];
  279.     t += dp2[1] * pEnw[64*3];
  280.     t += dp2[2] * pEnw[64*4];
  281.     t += dp2[3] * pEnw[64*5];
  282.     t += dp2[4] * pEnw[64*6];
  283.     t += dp2[5] * pEnw[64*7];
  284.     y[i+j*32] = t;
  285.   }
  286. break;
  287. case 7:
  288.   for( i = 0 ; i<32 ; i++ )
  289.    {
  290. dp2 = dp + i*8;
  291. pEnw = enwindow + j*32 + i;
  292.      t =  dp2[7] * pEnw[64*0];
  293.     t += dp2[0] * pEnw[64*1];
  294.     t += dp2[1] * pEnw[64*2];
  295.     t += dp2[2] * pEnw[64*3];
  296.     t += dp2[3] * pEnw[64*4];
  297.     t += dp2[4] * pEnw[64*5];
  298.     t += dp2[5] * pEnw[64*6];
  299.     t += dp2[6] * pEnw[64*7];
  300.     y[i+j*32] = t;
  301.   }
  302. break;
  303. }
  304. }
  305. half[k] = (half[k]+1) & 1;
  306. if( half[k] == 1 )
  307.   off[k] = (off[k]+7) & 7;              /*offset is modulo (HAN_SIZE-1)*/
  308. /* ======================================= */
  309.   rpMM = (double *) (m);
  310.   for ( i=0 ; i<SBLIMIT ; i++ )
  311.   {
  312. t = 0;
  313. for( j = 0 ; j < 64 ; j++ )
  314. t += rpMM[j] * y[j];
  315. rpMM += j;
  316. s[i] = t;
  317. }  
  318. }