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

多媒体编程

开发平台:

Visual C++

  1. #include "mpg123.h"
  2. /**
  3.  *
  4.  **/
  5. static void I_step_one (unsigned int balloc[], unsigned int scale_index[2][SBLIMIT],struct frame *fr)
  6. {
  7. unsigned int *ba=balloc;
  8. unsigned int *sca = (unsigned int *) scale_index;
  9. if(fr->stereo) {
  10. int i;
  11. int jsbound = fr->jsbound;
  12. for (i=0;i<jsbound;i++) { 
  13. *ba++ = getbits(4);
  14. *ba++ = getbits(4);
  15. }
  16. for (i=jsbound;i<SBLIMIT;i++)
  17. *ba++ = getbits(4);
  18. ba = balloc;
  19. for (i=0;i<jsbound;i++) {
  20. if ((*ba++))
  21. *sca++ = getbits(6);
  22. if ((*ba++))
  23. *sca++ = getbits(6);
  24. }
  25. for (i=jsbound;i<SBLIMIT;i++) {
  26. if ((*ba++)) {
  27. *sca++ =  getbits(6);
  28. *sca++ =  getbits(6);
  29. }
  30. }
  31. } else {
  32. int i;
  33. for (i=0;i<SBLIMIT;i++)
  34. *ba++ = getbits(4);
  35. ba = balloc;
  36. for (i=0;i<SBLIMIT;i++) {
  37. if ((*ba++))
  38. *sca++ = getbits(6);
  39. }
  40. }
  41. }
  42. /**
  43.  *
  44.  **/
  45. static void I_step_two (real fraction[2][SBLIMIT],unsigned int balloc[2*SBLIMIT],
  46. unsigned int scale_index[2][SBLIMIT],struct frame *fr)
  47. {
  48. int i,n;
  49. int smpb[2*SBLIMIT]; 
  50. int *sample;
  51. register unsigned int *ba;
  52. register unsigned int *sca = (unsigned int *) scale_index;
  53. if(fr->stereo) {
  54. int jsbound = fr->jsbound;
  55. register real *f0 = fraction[0];
  56. register real *f1 = fraction[1];
  57. ba = balloc;
  58. for (sample=smpb,i=0;i<jsbound;i++)  {
  59. if ((n = *ba++))
  60. *sample++ = getbits(n+1);
  61. if ((n = *ba++))
  62. *sample++ = getbits(n+1);
  63. }
  64. for (i=jsbound;i<SBLIMIT;i++) {
  65. if ((n = *ba++))
  66. *sample++ = getbits(n+1);
  67. }
  68. ba = balloc;
  69. for (sample=smpb,i=0;i<jsbound;i++) {
  70. if((n=*ba++))
  71. *f0++ = (real) ( ((-1)<<n) + (*sample++) + 1) * muls[n+1][*sca++];
  72. else
  73. *f0++ = 0.0;
  74. if((n=*ba++))
  75. *f1++ = (real) ( ((-1)<<n) + (*sample++) + 1) * muls[n+1][*sca++];
  76. else
  77. *f1++ = 0.0;
  78. }
  79. for (i=jsbound;i<SBLIMIT;i++) {
  80. if ((n=*ba++)) {
  81. real samp = ( ((-1)<<n) + (*sample++) + 1);
  82. *f0++ = samp * muls[n+1][*sca++];
  83. *f1++ = samp * muls[n+1][*sca++];
  84. } else
  85. *f0++ = *f1++ = 0.0;
  86. }
  87. } else {
  88. register real *f0 = fraction[0];
  89. ba = balloc;
  90. for (sample=smpb,i=0;i<SBLIMIT;i++) {
  91. if ((n = *ba++))
  92. *sample++ = getbits(n+1);
  93. }
  94. ba = balloc;
  95. for (sample=smpb,i=0;i<SBLIMIT;i++) {
  96. if((n=*ba++))
  97. *f0++ = (real) ( ((-1)<<n) + (*sample++) + 1) * muls[n+1][*sca++];
  98. else
  99. *f0++ = 0.0;
  100. }
  101. }
  102. }
  103. /**
  104.  *
  105.  **/
  106. int do_layer1(struct frame *fr,unsigned char *pcm_sample,int *pcm_point)
  107. {
  108. int clip=0;
  109. int i,stereo = fr->stereo;
  110. unsigned int balloc[2*SBLIMIT];
  111. unsigned int scale_index[2][SBLIMIT];
  112. real fraction[2][SBLIMIT];
  113. int single = fr->single;
  114. fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? (fr->mode_ext<<2)+4 : 32;
  115. if(stereo == 1 || single == 3)
  116. single = 0;
  117. I_step_one (balloc,scale_index,fr);
  118. for (i=0;i<SCALE_BLOCK;i++) {
  119. I_step_two (fraction,balloc,scale_index,fr);
  120. if(single >= 0) {
  121.         clip += synth_1to1_mono( (real*)fraction[single],pcm_sample,pcm_point);
  122.       } else {
  123.         int p1 = *pcm_point;
  124.         clip += synth_1to1( (real*)fraction[0],0,pcm_sample,&p1);
  125.         clip += synth_1to1( (real*)fraction[1],1,pcm_sample,pcm_point);
  126.       }
  127.   }
  128.   return clip;
  129. }