MP3_Decode.c
上传用户:kingbiz
上传日期:2022-06-24
资源大小:2524k
文件大小:22k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. #include "mp3_common.h"
  2. #include "mp3_decode.h"
  3.  
  4. /*============================================================================*/
  5. const struct BandIndex sfBandIndex[3]=
  6. {
  7. {{0,4,8,12,16,20,24,30,36,44,52,62,74,90,110,134,162,196,238,288,342,418,576},
  8. {0,4,8,12,16,22,30,40,52,66,84,106,136,192}},
  9. {{0,4,8,12,16,20,24,30,36,42,50,60,72,88,106,128,156,190,230,276,330,384,576},
  10. {0,4,8,12,16,22,28,38,50,64,80,100,126,192}},
  11. {{0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576},
  12. {0,4,8,12,16,22,30,42,58,78,104,138,180,192}}
  13. };
  14. /*============================================================================*/
  15. const static int bitrate[3][15] = {
  16. {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448},
  17. {0,32,48,56,64,80,96,112,128,160,192,224,256,320,384},
  18. {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320}
  19. };
  20. /*============================================================================*/
  21. /*============================================================================*/
  22. void decode_info()
  23. {
  24.     layer *hdr = fr_ps.header;
  25.     int x;
  26.     hdr->version = getbit(1);
  27.     hdr->lay = 4-getbit(2);
  28.     hdr->error_protection = !getbit(1); /* error protect. TRUE/FALSE */
  29.     hdr->bitrate_index = getbit(4);
  30.     hdr->sampling_frequency = getbit(2);
  31.     hdr->padding = getbit(1);
  32.     hdr->extension = getbit(1);
  33.     hdr->mode = getbit(2);
  34.     hdr->mode_ext = getbit(2);
  35.     hdr->copyright = getbit(1);
  36.     hdr->original = getbit(1);
  37.     hdr->emphasis = getbit(2);
  38. }
  39. /*============================================================================*/
  40. //攻取Side信息
  41. void III_get_side_info(III_side_info_t *si)
  42. {
  43. int ch, gr, i;
  44. int stereo = fr_ps.stereo;
  45. si->main_data_begin = getbit(9);  //SI 边信息结构
  46. if (stereo == 1)
  47. si->private_bits = getbit(5);
  48. else
  49. si->private_bits = getbit(3);
  50. for (ch=0; ch<stereo; ch++)         //第二颗粒是否传送信息
  51. for (i=0; i<4; i++)
  52. si->scfsi[ch][i] = getbit(1);
  53. for (gr=0; gr<2; gr++) {
  54. for (ch=0; ch<stereo; ch++) {
  55. grle[ch][gr].part2_3_length = getbit(12);
  56. grle[ch][gr].big_values = getbit(9);
  57. grle[ch][gr].global_gain = getbit(8);
  58. grle[ch][gr].scalefac_compress = getbit(4);
  59. grle[ch][gr].window_switching_flag = getbit(1);
  60. if (grle[ch][gr].window_switching_flag) {            //窗开关为1
  61. grle[ch][gr].block_type = getbit(2);
  62. grle[ch][gr].mixed_block_flag = getbit(1);
  63. for (i=0; i<2; i++)
  64. grle[ch][gr].table_select[i] = getbit(5);
  65. for (i=0; i<3; i++)
  66. grle[ch][gr].subblock_gain[i] = getbit(3);
  67. /* Set region_count parameters since they are implicit in this case. */
  68. if (grle[ch][gr].block_type == 0) {
  69. // printf("Side info bad: block_type == 0 in split block.n");
  70. // exit(0);
  71. }
  72. else if (grle[ch][gr].block_type == 2
  73. && grle[ch][gr].mixed_block_flag == 0)
  74. grle[ch][gr].region0_count = 8; /* MI 9; */     //region0和1的缺省配置
  75. else grle[ch][gr].region0_count = 7; /* MI 8; */
  76. grle[ch][gr].region1_count = 20 - grle[ch][gr].region0_count;
  77. }
  78. else {                                                       //窗开关为0
  79. for (i=0; i<3; i++)
  80. grle[ch][gr].table_select[i] = getbit(5);
  81. grle[ch][gr].region0_count = getbit(4);
  82. grle[ch][gr].region1_count = getbit(3);
  83. grle[ch][gr].block_type = 0;
  84. }
  85. grle[ch][gr].preflag = getbit(1);
  86. grle[ch][gr].scalefac_scale = getbit(1);
  87. grle[ch][gr].count1table_select = getbit(1);
  88.          }
  89. }
  90. }
  91. /*============================================================================*/
  92. /*============================================================================*/
  93. /*============================================================================*/
  94. //获取比例因子
  95. const struct
  96. {
  97. int l[5];
  98. int s[3];
  99. } sfbtable = {
  100. {0, 6, 11, 16, 21},
  101. {0, 6, 12}
  102. };
  103. const int slen[2][16]=
  104. {
  105. {0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4},
  106. {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3}
  107. };
  108. void III_get_scale_factors(III_scalefac_t *scalefac, III_side_info_t *si, int gr, int ch)
  109. {
  110. int sfb, i, window;
  111. struct Granule *gr_info = &(grle[ch][gr]);
  112. if (gr_info->window_switching_flag && (gr_info->block_type == 2)) {
  113. if (gr_info->mixed_block_flag) { /* MIXED */ /* NEW - ag 11/25 */
  114. for (sfb = 0; sfb < 8; sfb++)
  115. (*scalefac)[ch].l[sfb] = hgetbits(
  116. slen[0][gr_info->scalefac_compress]);       //用 slen[0]
  117. for (sfb = 3; sfb < 6; sfb++)
  118. for (window=0; window<3; window++)
  119. (*scalefac)[ch].s[window][sfb] = hgetbits(
  120. slen[0][gr_info->scalefac_compress]);   //用 slen[0]
  121. for (sfb = 6; sfb < 12; sfb++)
  122. for (window=0; window<3; window++)
  123. (*scalefac)[ch].s[window][sfb] = hgetbits(
  124. slen[1][gr_info->scalefac_compress]);   //6-11用 slen[1]
  125. for (sfb=12,window=0; window<3; window++)
  126. (*scalefac)[ch].s[window][sfb] = 0;
  127. }
  128. else {  /* SHORT*/
  129. for (i=0; i<2; i++)
  130. for (sfb = sfbtable.s[i]; sfb < sfbtable.s[i+1]; sfb++)
  131. for (window=0; window<3; window++)
  132. (*scalefac)[ch].s[window][sfb] = hgetbits(
  133. slen[i][gr_info->scalefac_compress]);
  134. for (sfb=12,window=0; window<3; window++)
  135. (*scalefac)[ch].s[window][sfb] = 0;
  136. }
  137. }
  138. else {   /* LONG types 0,1,3 */
  139. for (i=0; i<4; i++) {
  140. if ((si->scfsi[ch][i] == 0) || (gr == 0))
  141. for (sfb = sfbtable.l[i]; sfb < sfbtable.l[i+1]; sfb++)
  142. (*scalefac)[ch].l[sfb] = hgetbits(
  143. slen[(i<2)?0:1][gr_info->scalefac_compress]);
  144. }
  145. (*scalefac)[ch].l[22] = 0;
  146. }
  147. }
  148.  
  149. /*============================================================================*/
  150. /*============================================================================*/
  151. //逆量化采样
  152. const int pretab[22] = {0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,2,0};
  153. static float is43_table[1024];
  154. void III_dequantize_sample(int is[SBLIMIT][SSLIMIT], float xr[SBLIMIT][SSLIMIT], III_scalefac_t *scalefac, struct Granule *gr_info, int ch)
  155. {
  156. int ss,sb,cb=0,sfreq=fr_ps.header->sampling_frequency;
  157. int next_cb_boundary, cb_begin, cb_width, sign;
  158. float temp;
  159. static int init=1;
  160. if(init)
  161. {
  162. for(init=0;init<1024;init++)
  163. {
  164.   is43_table[init]=1.33333333333*log(init);
  165. }
  166. init=0;
  167. }
  168. /* choose correct scalefactor band per block type, initalize boundary */
  169. if (gr_info->window_switching_flag && (gr_info->block_type == 2) )
  170. if (gr_info->mixed_block_flag)
  171. next_cb_boundary=sfBandIndex[sfreq].l[1];  /* LONG blocks: 0,1,3 */
  172. else
  173. {
  174. next_cb_boundary=sfBandIndex[sfreq].s[1]*3; /* pure SHORT block */
  175. cb_width = sfBandIndex[sfreq].s[1];
  176. cb_begin = 0;
  177. }
  178. else
  179. next_cb_boundary=sfBandIndex[sfreq].l[1];  /* LONG blocks: 0,1,3 */
  180. /* apply formula per block type */
  181. for (sb=0 ; sb < SBLIMIT ; sb++) {        //0-31
  182. for (ss=0 ; ss < SSLIMIT ; ss++) {    //0-17
  183. /*********              由sb和ss计算cb(比例因子带)和cb_width(比例因子带宽)   **************/
  184. if ( (sb*18)+ss == next_cb_boundary)
  185. { /* Adjust critical band boundary */
  186. if (gr_info->window_switching_flag && (gr_info->block_type == 2))
  187. {
  188. if (gr_info->mixed_block_flag)
  189. {
  190. if (((sb*18)+ss) == sfBandIndex[sfreq].l[8])
  191. {
  192. next_cb_boundary=sfBandIndex[sfreq].s[4]*3;
  193. cb = 3;
  194. cb_width = sfBandIndex[sfreq].s[cb+1] -
  195. sfBandIndex[sfreq].s[cb];
  196. cb_begin = sfBandIndex[sfreq].s[cb]*3;
  197. }
  198. else if (((sb*18)+ss) < sfBandIndex[sfreq].l[8])
  199. next_cb_boundary = sfBandIndex[sfreq].l[(++cb)+1];
  200. else {
  201. next_cb_boundary = sfBandIndex[sfreq].s[(++cb)+1]*3;
  202. cb_width = sfBandIndex[sfreq].s[cb+1] -
  203. sfBandIndex[sfreq].s[cb];
  204. cb_begin = sfBandIndex[sfreq].s[cb]*3;
  205. }
  206. }
  207. else
  208. {
  209. next_cb_boundary = sfBandIndex[sfreq].s[(++cb)+1]*3;
  210. cb_width = sfBandIndex[sfreq].s[cb+1] -
  211. sfBandIndex[sfreq].s[cb];
  212. cb_begin = sfBandIndex[sfreq].s[cb]*3;
  213. }
  214. }
  215.             else /* long blocks */
  216.            next_cb_boundary = sfBandIndex[sfreq].l[(++cb)+1];
  217. }
  218. /***************************************************************************************/
  219.   if(is[sb][ss]!=0)
  220.   {
  221. /* Compute overall (global) scaling. */
  222. xr[sb][ss] = (0.25 * (gr_info->global_gain - 210.0));
  223. /* Do long/short dependent scaling operations. */
  224. if (gr_info->window_switching_flag && (
  225. ((gr_info->block_type == 2) && (gr_info->mixed_block_flag == 0)) ||
  226. ((gr_info->block_type == 2) && gr_info->mixed_block_flag && (sb >= 2)) ))
  227. {
  228. xr[sb][ss] += (0.25 * -8.0 *gr_info->subblock_gain[(((sb*18)+ss) - cb_begin)/cb_width]);
  229. xr[sb][ss] += (0.25 * -2.0 * (1.0+gr_info->scalefac_scale)
  230. * (*scalefac)[ch].s[(((sb*18)+ss) - cb_begin)/cb_width][cb]);
  231. }
  232. else    /* LONG block types 0,1,3 & 1st 2 subbands of switched blocks */
  233. {
  234. xr[sb][ss] +=  (-0.5 * (1.0+gr_info->scalefac_scale)
  235. * ((*scalefac)[ch].l[cb]
  236. + gr_info->preflag * pretab[cb]));
  237. }
  238. /* Scale quantized value. */
  239.             //求出符号
  240. sign=0;
  241. if(is[sb][ss]<0)
  242. {
  243. sign=1;
  244.     is[sb][ss]=-is[sb][ss];
  245. }
  246. if(is[sb][ss]>1023)
  247. temp=is43_table[(unsigned)is[sb][ss]>>3]+2.7725887;// 4/3*ln8
  248. else
  249. temp=is43_table[is[sb][ss]];
  250. xr[sb][ss] *=0.69314318;        //log(2);
  251. xr[sb][ss] +=temp;
  252. xr[sb][ss] =exp(xr[sb][ss]);
  253. if (sign) xr[sb][ss] = -xr[sb][ss];
  254.   }
  255.   else
  256. xr[sb][ss] =0;
  257. }
  258. }
  259. }
  260.  
  261. /*============================================================================*/
  262. /*============================================================================*/
  263. //重新排序
  264. void III_reorder(SS xr ,  struct Granule *gr_info)
  265. {
  266.    int sfreq=fr_ps.header->sampling_frequency;
  267.    int sfb, sfb_start, sfb_lines;
  268.    int sb, ss, window, freq, src_line, des_line;
  269.    SS ro ;
  270.    ////
  271.    
  272.    if (gr_info->window_switching_flag && (gr_info->block_type == 2)) 
  273.    {
  274.       if (gr_info->mixed_block_flag) 
  275.   {
  276.          /* NO REORDER FOR LOW 2 SUBBANDS */
  277.          for (sb=0 ; sb < 2 ; sb++)
  278.             for (ss=0 ; ss < SSLIMIT ; ss++) 
  279.                ro[sb][ss] = xr[sb][ss];
  280.             
  281.          /* REORDERING FOR REST SWITCHED SHORT */
  282.          for(sfb=3,sfb_start=sfBandIndex[sfreq].s[3],
  283.             sfb_lines=sfBandIndex[sfreq].s[4] - sfb_start;
  284.             sfb < 13; sfb++,sfb_start=sfBandIndex[sfreq].s[sfb],
  285.             (sfb_lines=sfBandIndex[sfreq].s[sfb+1] - sfb_start))
  286.                for(window=0; window<3; window++)
  287.                   for(freq=0;freq<sfb_lines;freq++) {
  288.                      src_line = sfb_start*3 + window*sfb_lines + freq;
  289.                      des_line = (sfb_start*3) + window + (freq*3);
  290.                      ro[des_line/SSLIMIT][des_line%SSLIMIT] =
  291.                                     xr[src_line/SSLIMIT][src_line%SSLIMIT];
  292.                }
  293.       }
  294.       else {  /* pure short */
  295.          for(sfb=0,sfb_start=0,sfb_lines=sfBandIndex[sfreq].s[1];
  296.             sfb < 13; sfb++,sfb_start=sfBandIndex[sfreq].s[sfb],
  297.             (sfb_lines=sfBandIndex[sfreq].s[sfb+1] - sfb_start))
  298.                for(window=0; window<3; window++)
  299.                   for(freq=0;freq<sfb_lines;freq++) 
  300.   {
  301.                      src_line = sfb_start*3 + window*sfb_lines + freq;
  302.                      des_line = sfb_start*3 + window + (freq*3);
  303.                      ro[des_line/SSLIMIT][des_line%SSLIMIT] =
  304.                                     xr[src_line/SSLIMIT][src_line%SSLIMIT];
  305.   }
  306.       }
  307.       for (sb=0 ; sb < SBLIMIT ; sb++)
  308.          for (ss=0 ; ss < SSLIMIT ; ss++)
  309.             xr[sb][ss] = ro[sb][ss];
  310.    }
  311. }
  312.  
  313. /*============================================================================*/
  314. /*============================================================================*/
  315. /*============================================================================*/
  316. //立体声处理
  317. static int is_pos[576];
  318. static  float is_ratio[576];
  319. void III_stereo(float xr[2][SBLIMIT][SSLIMIT],III_scalefac_t *scalefac, struct Granule *gr_info)
  320. {
  321.    int sfreq = fr_ps.header->sampling_frequency;
  322.    int stereo = fr_ps.stereo;
  323.    int ms_stereo = (fr_ps.header->mode == MPG_MD_JOINT_STEREO) &&
  324.                    (fr_ps.header->mode_ext & 0x2);
  325.    int i_stereo = (fr_ps.header->mode == MPG_MD_JOINT_STEREO) &&
  326.                   (fr_ps.header->mode_ext & 0x1);
  327.    int sfb;
  328.    int i,j,sb,ss;
  329.    /////
  330.    
  331.    /* intialization */
  332.    for ( i=0; i<576; i++ )
  333.    {
  334.       is_pos[i] = 7;
  335.    }
  336.    ////
  337.    if ((stereo == 2) && i_stereo )
  338.    {  if (gr_info->window_switching_flag && (gr_info->block_type == 2))
  339.       {  if( gr_info->mixed_block_flag )
  340.          {  int max_sfb = 0;
  341.             for ( j=0; j<3; j++ )
  342.             {  int sfbcnt;
  343.                sfbcnt = 2;
  344.                for( sfb=12; sfb >=3; sfb-- )
  345.                {  int lines;
  346.                   lines = sfBandIndex[sfreq].s[sfb+1]-sfBandIndex[sfreq].s[sfb];
  347.                   i = 3*sfBandIndex[sfreq].s[sfb] + (j+1) * lines - 1;
  348.                   while ( lines > 0 )
  349.                   {  if ( xr[1][i/SSLIMIT][i%SSLIMIT] != 0.0 )
  350.                      {  sfbcnt = sfb;
  351.                         sfb = -10;
  352.                         lines = -10;
  353.                      }
  354.                      lines--;
  355.                      i--;
  356.                   }
  357.                }
  358.                sfb = sfbcnt + 1;
  359.                if ( sfb > max_sfb )
  360.                   max_sfb = sfb;
  361.                while( sfb<12 )
  362.                {  sb = sfBandIndex[sfreq].s[sfb+1]-sfBandIndex[sfreq].s[sfb];
  363.                   i = 3*sfBandIndex[sfreq].s[sfb] + j * sb;
  364.                   for ( ; sb > 0; sb--)
  365.                   {  is_pos[i] = (*scalefac)[1].s[j][sfb];
  366.                      if ( is_pos[i] != 7 )
  367.                         is_ratio[i] = tan( is_pos[i] * (PI / 12));
  368.                      i++;
  369.                   }
  370.                   sfb++;
  371.                }
  372.                sb = sfBandIndex[sfreq].s[11]-sfBandIndex[sfreq].s[10];
  373.                sfb = 3*sfBandIndex[sfreq].s[10] + j * sb;
  374.                sb = sfBandIndex[sfreq].s[12]-sfBandIndex[sfreq].s[11];
  375.                i = 3*sfBandIndex[sfreq].s[11] + j * sb;
  376.                for ( ; sb > 0; sb-- )
  377.                {  is_pos[i] = is_pos[sfb];
  378.                   is_ratio[i] = is_ratio[sfb];
  379.                   i++;
  380.                }
  381.              }
  382.              if ( max_sfb <= 3 )
  383.              {  i = 2;
  384.                 ss = 17;
  385.                 sb = -1;
  386.                 while ( i >= 0 )
  387.                 {  if ( xr[1][i][ss] != 0.0 )
  388.                    {  sb = i*18+ss;
  389.                       i = -1;
  390.                    } else
  391.                    {  ss--;
  392.                       if ( ss < 0 )
  393.                       {  i--;
  394.                          ss = 17;
  395.                       }
  396.                    }
  397.                 }
  398.                 i = 0;
  399.                 while ( sfBandIndex[sfreq].l[i] <= sb )
  400.                    i++;
  401.                 sfb = i;
  402.                 i = sfBandIndex[sfreq].l[i];
  403.                 for ( ; sfb<8; sfb++ )
  404.                 {  sb = sfBandIndex[sfreq].l[sfb+1]-sfBandIndex[sfreq].l[sfb];
  405.                    for ( ; sb > 0; sb--)
  406.                    {  is_pos[i] = (*scalefac)[1].l[sfb];
  407.                       if ( is_pos[i] != 7 )
  408.                          is_ratio[i] = tan( is_pos[i] * (PI / 12));
  409.                       i++;
  410.                    }
  411.                 }
  412.             }
  413.          } else
  414.          {  for ( j=0; j<3; j++ )
  415.             {  int sfbcnt;
  416.                sfbcnt = -1;
  417.                for( sfb=12; sfb >=0; sfb-- )
  418.                {  int lines;
  419.                   lines = sfBandIndex[sfreq].s[sfb+1]-sfBandIndex[sfreq].s[sfb];
  420.                   i = 3*sfBandIndex[sfreq].s[sfb] + (j+1) * lines - 1;
  421.                   while ( lines > 0 )
  422.                   {  if ( xr[1][i/SSLIMIT][i%SSLIMIT] != 0.0 )
  423.                      {  sfbcnt = sfb;
  424.                         sfb = -10;
  425.                         lines = -10;
  426.                      }
  427.                      lines--;
  428.                      i--;
  429.                   }
  430.                }
  431.                sfb = sfbcnt + 1;
  432.                while( sfb<12 )
  433.                {  sb = sfBandIndex[sfreq].s[sfb+1]-sfBandIndex[sfreq].s[sfb];
  434.                   i = 3*sfBandIndex[sfreq].s[sfb] + j * sb;
  435.                   for ( ; sb > 0; sb--)
  436.                   {  is_pos[i] = (*scalefac)[1].s[j][sfb];
  437.                      if ( is_pos[i] != 7 )
  438.                         is_ratio[i] = tan( is_pos[i] * (PI / 12));
  439.                      i++;
  440.                   }
  441.                   sfb++;
  442.                }
  443.                sb = sfBandIndex[sfreq].s[11]-sfBandIndex[sfreq].s[10];
  444.                sfb = 3*sfBandIndex[sfreq].s[10] + j * sb;
  445.                sb = sfBandIndex[sfreq].s[12]-sfBandIndex[sfreq].s[11];
  446.                i = 3*sfBandIndex[sfreq].s[11] + j * sb;
  447.                for ( ; sb > 0; sb-- )
  448.                {  is_pos[i] = is_pos[sfb];
  449.                   is_ratio[i] = is_ratio[sfb];
  450.                   i++;
  451.                }
  452.             }
  453.          }
  454.       } else
  455.       {  i = 31;
  456.          ss = 17;
  457.          sb = 0;
  458.          while ( i >= 0 )
  459.          {  if ( xr[1][i][ss] != 0.0 )
  460.             {  sb = i*18+ss;
  461.                i = -1;
  462.             } else
  463.             {  ss--;
  464.                if ( ss < 0 )
  465.                {  i--;
  466.                   ss = 17;
  467.                }
  468.             }
  469.          }
  470.          i = 0;
  471.          while ( sfBandIndex[sfreq].l[i] <= sb )
  472.             i++;
  473.          sfb = i;
  474.          i = sfBandIndex[sfreq].l[i];
  475.          for ( ; sfb<21; sfb++ )
  476.          {  sb = sfBandIndex[sfreq].l[sfb+1] - sfBandIndex[sfreq].l[sfb];
  477.             for ( ; sb > 0; sb--)
  478.             {  is_pos[i] = (*scalefac)[1].l[sfb];
  479.                if ( is_pos[i] != 7 )
  480.                   is_ratio[i] = tan( is_pos[i] * (PI / 12));
  481.                i++;
  482.             }
  483.          }
  484.          sfb = sfBandIndex[sfreq].l[20];
  485.          for ( sb = 576 - sfBandIndex[sfreq].l[21]; sb > 0; sb-- )
  486.          {  is_pos[i] = is_pos[sfb];
  487.             is_ratio[i] = is_ratio[sfb];
  488.             i++;
  489.          }
  490.       }
  491.    }
  492.    if (stereo==2)
  493.       for(sb=0;sb<SBLIMIT;sb++)
  494.          for(ss=0;ss<SSLIMIT;ss++)
  495.  {
  496.             float xr0,xr1;
  497. i = (sb*18)+ss;
  498. xr0=xr[0][sb][ss];
  499. xr1=xr[1][sb][ss];
  500.             if ( is_pos[i] == 7 ) {
  501.                if ( ms_stereo ) {
  502.                   xr[0][sb][ss] = (xr0+xr1)/1.41421356;
  503.                   xr[1][sb][ss] = (xr0-xr1)/1.41421356;
  504.                }
  505.                else {
  506.                   xr[0][sb][ss] = xr0;
  507.                   xr[1][sb][ss] = xr1;
  508.                }
  509.             }
  510.             else if (i_stereo ) {
  511.                xr[0][sb][ss] = xr0 * (is_ratio[i]/(1+is_ratio[i]));
  512.                xr[1][sb][ss] = xr0 * (1/(1+is_ratio[i]));
  513.             }
  514. //            else 
  515. //               printf("Error in streo processingn");
  516.             
  517.          }
  518. /*============================================================================*/
  519. /*============================================================================*/
  520. /*============================================================================*/
  521. float Ci[8]={-0.6,-0.535,-0.33,-0.185,-0.095,-0.041,-0.0142,-0.0037};
  522. void III_antialias(SS hybridIn, struct Granule *gr_info)
  523. {
  524.    static int    init = 1;
  525.    static float ca[8],cs[8];
  526.    float        bu,bd;  /* upper and lower butterfly inputs */
  527.    int           ss,sb,sblim;
  528.    if (init) {
  529.       int i;
  530.       float    sq;
  531.       for (i=0;i<8;i++) {
  532.          sq=sqrt(1.0+Ci[i]*Ci[i]);
  533.          cs[i] = 1.0/sq;
  534.          ca[i] = Ci[i]/sq;
  535.       }
  536.       init = 0;
  537.    }
  538.    /* clear all inputs */
  539.    if  (gr_info->window_switching_flag && (gr_info->block_type == 2) &&
  540.        !gr_info->mixed_block_flag ) return;
  541.    if ( gr_info->window_switching_flag && gr_info->mixed_block_flag &&
  542.      (gr_info->block_type == 2))
  543.       sblim = 1;
  544.    else
  545.       sblim = SBLIMIT-1;
  546.    /* 31 alias-reduction operations between each pair of sub-bands */
  547.    /* with 8 butterflies between each pair                         */
  548.    for(sb=0;sb<sblim;sb++)
  549.       for(ss=0;ss<8;ss++)
  550.   {
  551.          bu = hybridIn[sb][17-ss];
  552.          bd = hybridIn[sb+1][ss];
  553.          hybridIn[sb][17-ss] =(bu * cs[ss]) - (bd * ca[ss]);
  554.          hybridIn[sb+1][ss] = (bd * cs[ss]) + (bu * ca[ss]);
  555.       }
  556. }
  557. /*============================================================================*/
  558. /*============================================================================*/
  559. /*============================================================================*/
  560. /*
  561. void out_fifo(short  SAM[2][SSLIMIT][SBLIMIT], FILE *outFile)
  562. {
  563.     short *pcm=&SAM[0][0][0];
  564.     fwrite(pcm,2,SBLIMIT*SSLIMIT*2,outFile);
  565. }
  566. */
  567. void  buffer_CRC()
  568. {
  569.     getbit(16);
  570. }
  571. /*============================================================================*/
  572. /*============================================================================*/
  573. /* Return the number of slots for main data of current frame, */
  574. int main_data_slots()
  575. {
  576. unsigned int nSlots; 
  577.  
  578. nSlots = (unsigned int)((144 * bitrate[2][fr_ps.header->bitrate_index])
  579. / s_freq[fr_ps.header->sampling_frequency]);
  580. if (fr_ps.header->padding) nSlots++;
  581. nSlots -= 4;                         //减去4字节的头
  582. if (fr_ps.header->error_protection)  //如有CRC 则减2字节
  583. nSlots -= 2;
  584. if (fr_ps.stereo == 1)               //单声道-17字节的side 信息
  585. nSlots -= 17;
  586. else
  587. nSlots -=32;                     //单声道-32字节的side 信息
  588. return(nSlots);
  589. }
  590. /*============================================================================*/
  591. /*============================================================================*/
  592. /*============================================================================*/