Layer2.cpp
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:7k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #include "mpg123.h"
  2. #include "l2tables.h"
  3. static int grp_3tab[32 * 3] = { 0, };   
  4. static int grp_5tab[128 * 3] = { 0, };  
  5. static int grp_9tab[1024 * 3] = { 0, }; 
  6. real muls[27][64];
  7. /**
  8.  *
  9.  **/
  10. void init_layer2(void)
  11. {
  12. static double mulmul[27] = {
  13. 0.0 , -2.0/3.0 , 2.0/3.0 ,
  14. 2.0/7.0 , 2.0/15.0 , 2.0/31.0, 2.0/63.0 , 2.0/127.0 , 2.0/255.0 ,
  15. 2.0/511.0 , 2.0/1023.0 , 2.0/2047.0 , 2.0/4095.0 , 2.0/8191.0 ,
  16. 2.0/16383.0 , 2.0/32767.0 , 2.0/65535.0 ,
  17. -4.0/5.0 , -2.0/5.0 , 2.0/5.0, 4.0/5.0 ,
  18. -8.0/9.0 , -4.0/9.0 , -2.0/9.0 , 2.0/9.0 , 4.0/9.0 , 8.0/9.0 };
  19. static int base[3][9] = {
  20. { 1 , 0, 2 , } ,
  21. { 17, 18, 0 , 19, 20 , } ,
  22. { 21, 1, 22, 23, 0, 24, 25, 2, 26 } };
  23. int i,j,k,l,len;
  24. real *table;
  25. static int tablen[3] = { 3 , 5 , 9 };
  26. static int *itable,*tables[3] = { grp_3tab , grp_5tab , grp_9tab };
  27. for(i=0;i<3;i++) {
  28. itable = tables[i];
  29. len = tablen[i];
  30. for(j=0;j<len;j++) {
  31. for(k=0;k<len;k++) {
  32. for(l=0;l<len;l++) {
  33. *itable++ = base[i][l];
  34. *itable++ = base[i][k];
  35. *itable++ = base[i][j];
  36. }
  37. }
  38. }
  39. }
  40. for(k=0;k<27;k++) {
  41. double m=mulmul[k];
  42. table = muls[k];
  43. for(j=3,i=0;i<63;i++,j--)
  44. *table++ = m * pow(2.0,(double) j / 3.0);
  45. *table++ = 0.0;
  46. }
  47. }
  48. /**
  49.  *
  50.  **/
  51. static void II_step_one (unsigned int *bit_alloc,int *scale,struct frame *fr)
  52. {
  53. int stereo = fr->stereo-1;
  54. int sblimit = fr->II_sblimit;
  55. int jsbound = fr->jsbound;
  56. int sblimit2 = fr->II_sblimit<<stereo;
  57. struct al_table *alloc1 = (struct al_table *) fr->alloc;
  58. int i;
  59. static unsigned int scfsi_buf[64];
  60. unsigned int *scfsi,*bita;
  61. int sc,step;
  62. bita = bit_alloc;
  63. if (stereo) {
  64. for (i=jsbound;i;i--,alloc1+=(1<<step)) {
  65. *bita++ = (char) getbits(step=alloc1->bits);
  66. *bita++ = (char) getbits(step);
  67. }
  68. for (i=sblimit-jsbound;i;i--,alloc1+=(1<<step)) {
  69. bita[0] = (char) getbits(step=alloc1->bits);
  70. bita[1] = bita[0];
  71. bita+=2;
  72. }
  73. bita = bit_alloc;
  74. scfsi=scfsi_buf;
  75. for (i=sblimit2;i;i--)
  76. if (*bita++)
  77. *scfsi++ = (char) getbits_fast(2);
  78. } else { /* mono */
  79. for (i=sblimit;i;i--,alloc1+=(1<<step))
  80. *bita++ = (char) getbits(step=alloc1->bits);
  81. bita = bit_alloc;
  82. scfsi=scfsi_buf;
  83. for (i=sblimit;i;i--)
  84. if (*bita++)
  85. *scfsi++ = (char) getbits_fast(2);
  86. }
  87. bita = bit_alloc;
  88. scfsi=scfsi_buf;
  89. for (i=sblimit2;i;i--) {
  90. if (*bita++) {
  91. switch (*scfsi++) {
  92. case 0: 
  93. *scale++ = getbits_fast(6);
  94. *scale++ = getbits_fast(6);
  95. *scale++ = getbits_fast(6);
  96. break;
  97. case 1 : 
  98. *scale++ = sc = getbits_fast(6);
  99. *scale++ = sc;
  100. *scale++ = getbits_fast(6);
  101. break;
  102. case 2: 
  103. *scale++ = sc = getbits_fast(6);
  104. *scale++ = sc;
  105. *scale++ = sc;
  106. break;
  107. case 3:
  108.            default:
  109. *scale++ = getbits_fast(6);
  110. *scale++ = sc = getbits_fast(6);
  111. *scale++ = sc;
  112. break;
  113. }
  114. }
  115.         }
  116. }
  117. /**
  118.  *
  119.  **/
  120. static void II_step_two (unsigned int *bit_alloc,real fraction[2][4][SBLIMIT],int *scale,struct frame *fr,int x1)
  121. {
  122. int i,j,k,ba;
  123. int stereo = fr->stereo;
  124. int sblimit = fr->II_sblimit;
  125. int jsbound = fr->jsbound;
  126. struct al_table *alloc2,*alloc1 = (struct al_table *) fr->alloc;
  127. unsigned int *bita=bit_alloc;
  128. int d1,step;
  129. for (i=0;i<jsbound;i++,alloc1+=(1<<step)) {
  130. step = alloc1->bits;
  131. for (j=0;j<stereo;j++) {
  132. if ((ba=*bita++)) {
  133. k=(alloc2 = alloc1+ba)->bits;
  134. if( (d1=alloc2->d) < 0) {
  135. real cm=muls[k][scale[x1]];
  136. fraction[j][0][i] = ((real) ((int)getbits(k) + d1)) * cm;
  137. fraction[j][1][i] = ((real) ((int)getbits(k) + d1)) * cm;
  138. fraction[j][2][i] = ((real) ((int)getbits(k) + d1)) * cm;
  139. } else {
  140. static int *table[] = { 0,0,0,grp_3tab,0,grp_5tab,0,0,0,grp_9tab };
  141. unsigned int idx,*tab,m=scale[x1];
  142. idx = (unsigned int) getbits(k);
  143. tab = (unsigned int *) (table[d1] + idx + idx + idx);
  144. fraction[j][0][i] = muls[*tab++][m];
  145. fraction[j][1][i] = muls[*tab++][m];
  146. fraction[j][2][i] = muls[*tab][m];  
  147. }
  148. scale+=3;
  149. } else
  150. fraction[j][0][i] = fraction[j][1][i] = fraction[j][2][i] = 0.0;
  151. }
  152. }
  153. for (i=jsbound;i<sblimit;i++,alloc1+=(1<<step)) {
  154. step = alloc1->bits;
  155. bita++;
  156. if ((ba=*bita++)) {
  157. k=(alloc2 = alloc1+ba)->bits;
  158. if( (d1=alloc2->d) < 0) {
  159. real cm;
  160. cm=muls[k][scale[x1+3]];
  161. fraction[1][0][i] = (fraction[0][0][i] = (real) ((int)getbits(k) + d1) ) * cm;
  162. fraction[1][1][i] = (fraction[0][1][i] = (real) ((int)getbits(k) + d1) ) * cm;
  163. fraction[1][2][i] = (fraction[0][2][i] = (real) ((int)getbits(k) + d1) ) * cm;
  164. cm=muls[k][scale[x1]];
  165. fraction[0][0][i] *= cm; fraction[0][1][i] *= cm; fraction[0][2][i] *= cm;
  166. } else {
  167. static int *table[] = { 0,0,0,grp_3tab,0,grp_5tab,0,0,0,grp_9tab };
  168. unsigned int idx,*tab,m1,m2;
  169. m1 = scale[x1]; m2 = scale[x1+3];
  170. idx = (unsigned int) getbits(k);
  171. tab = (unsigned int *) (table[d1] + idx + idx + idx);
  172. fraction[0][0][i] = muls[*tab][m1]; fraction[1][0][i] = muls[*tab++][m2];
  173. fraction[0][1][i] = muls[*tab][m1]; fraction[1][1][i] = muls[*tab++][m2];
  174. fraction[0][2][i] = muls[*tab][m1]; fraction[1][2][i] = muls[*tab][m2];
  175. }
  176. scale+=6;
  177. } else
  178. fraction[0][0][i] = fraction[0][1][i] = fraction[0][2][i] = fraction[1][0][i] = fraction[1][1][i] = fraction[1][2][i] = 0.0;
  179. }
  180. for(i=sblimit;i<SBLIMIT;i++)
  181. for (j=0;j<stereo;j++)
  182. fraction[j][0][i] = fraction[j][1][i] = fraction[j][2][i] = 0.0;
  183. }
  184. /**
  185.  *
  186.  **/
  187. static void II_select_table(struct frame *fr)
  188. {
  189. static int translate[3][2][16] =
  190.    { { { 0,2,2,2,2,2,2,0,0,0,1,1,1,1,1,0 } ,
  191.        { 0,2,2,0,0,0,1,1,1,1,1,1,1,1,1,0 } } ,
  192.      { { 0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 } ,
  193.        { 0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0 } } ,
  194.      { { 0,3,3,3,3,3,3,0,0,0,1,1,1,1,1,0 } ,
  195.        { 0,3,3,0,0,0,1,1,1,1,1,1,1,1,1,0 } } };
  196. int table,sblim;
  197. static struct al_table *tables[5] =
  198. { alloc_0, alloc_1, alloc_2, alloc_3 , alloc_4 };
  199. static int sblims[5] = { 27 , 30 , 8, 12 , 30 };
  200. if(fr->lsf)
  201. table = 4;
  202. else
  203. table = translate[fr->sampling_frequency][2-fr->stereo][fr->bitrate_index];
  204. sblim = sblims[table];
  205. fr->alloc      = tables[table];
  206. fr->II_sblimit = sblim;
  207. }
  208. /**
  209.  *
  210.  **/
  211. int do_layer2 (struct frame *fr,unsigned char *pcm_sample,int *pcm_point)
  212. {
  213. int clip=0;
  214. int i,j;
  215. int stereo = fr->stereo;
  216. real fraction[2][4][SBLIMIT]; 
  217. unsigned int bit_alloc[64];
  218. int scale[192];
  219. int single = fr->single;
  220. II_select_table(fr);
  221. fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ?
  222.       (fr->mode_ext<<2)+4 : fr->II_sblimit;
  223. if(stereo == 1 || single == 3)
  224.      single = 0;
  225. II_step_one(bit_alloc, scale, fr);
  226. if(single >= 0) {
  227. for (i=0;i<SCALE_BLOCK;i++) {
  228.      II_step_two(bit_alloc,fraction,scale,fr,i>>2);
  229. for (j=0;j<3;j++)
  230. clip += synth_1to1_mono(fraction[0][j],pcm_sample,pcm_point);
  231. }
  232. } else {
  233. for (i=0;i<SCALE_BLOCK;i++) {
  234.      II_step_two(bit_alloc,fraction,scale,fr,i>>2);
  235. for (j=0;j<3;j++) {
  236. int p1 = *pcm_point;
  237. clip += synth_1to1(fraction[0][j],0,pcm_sample,&p1);
  238. clip += synth_1to1(fraction[1][j],1,pcm_sample,pcm_point);
  239. }
  240. }
  241. }
  242. return clip;
  243. }