uncouple.c
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:4k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /* 
  2.  *    uncouple.c
  3.  *
  4.  * Aaron Holtzman - May 1999
  5.  *
  6.  */
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include "ac3.h"
  10. #include "decode.h"
  11. #include "dither.h"
  12. #include "uncouple.h"
  13. void convert_to_float(uint_16 exp, uint_16 mantissa, uint_32 *dest);
  14. void uncouple_channel(stream_coeffs_t *coeffs,audblk_t *audblk, uint_32 ch);
  15. void
  16. uncouple(bsi_t *bsi,audblk_t *audblk,stream_coeffs_t *coeffs)
  17. {
  18. int i,j;
  19. for(i=0; i< bsi->nfchans; i++)
  20. {
  21. for(j=0; j < audblk->endmant[i]; j++)
  22.  convert_to_float(audblk->fbw_exp[i][j],audblk->chmant[i][j],
  23.  (uint_32*) &coeffs->fbw[i][j]);
  24. }
  25. if(audblk->cplinu)
  26. {
  27. for(i=0; i< bsi->nfchans; i++)
  28. {
  29. if(audblk->chincpl[i])
  30. {
  31. uncouple_channel(coeffs,audblk,i);
  32. }
  33. }
  34. }
  35. if(bsi->lfeon)
  36. {
  37. /* There are always 7 mantissas for lfe */
  38. for(j=0; j < 7 ; j++)
  39.  convert_to_float(audblk->lfe_exp[j],audblk->lfemant[j],
  40.  (uint_32*) &coeffs->lfe[j]);
  41. }
  42. }
  43. void
  44. uncouple_channel(stream_coeffs_t *coeffs,audblk_t *audblk, uint_32 ch)
  45. {
  46. uint_32 bnd = 0;
  47. uint_32 i,j;
  48. float cpl_coord;
  49. float coeff;
  50. uint_32 cpl_exp_tmp;
  51. uint_32 cpl_mant_tmp;
  52. for(i=audblk->cplstrtmant;i<audblk->cplendmant;)
  53. {
  54. if(!audblk->cplbndstrc[bnd])
  55. {
  56. cpl_exp_tmp = audblk->cplcoexp[ch][bnd] + 3 * audblk->mstrcplco[ch];
  57. if(audblk->cplcoexp[ch][bnd] == 15)
  58. cpl_mant_tmp = (audblk->cplcomant[ch][bnd]) << 12;
  59. else
  60. cpl_mant_tmp = ((0x10) | audblk->cplcomant[ch][bnd]) << 11;
  61. convert_to_float(cpl_exp_tmp,cpl_mant_tmp,(uint_32*)&cpl_coord);
  62. }
  63. bnd++;
  64. for(j=0;j < 12; j++)
  65. {
  66. //Get new dither values for each channel if necessary, so
  67. //the channels are uncorrelated
  68. if(audblk->dithflag[ch] && audblk->cpl_bap[i] == 0)
  69. convert_to_float(audblk->cpl_exp[i],dither_gen(),(uint_32*)&coeff);
  70. else
  71. convert_to_float(audblk->cpl_exp[i], audblk->cplmant[i],(uint_32*)&coeff);
  72. coeffs->fbw[ch][i]  = cpl_coord * coeff;
  73. i++;
  74. }
  75. }
  76. }
  77. static uint_8 first_bit_lut[256] = 
  78. {
  79. 0, 8, 7, 7, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 
  80. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
  81. 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
  82. 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
  83. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
  84. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  85. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  86. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  87. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  88. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  89. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  90. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  91. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  92. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  93. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  94. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  95. };
  96. /* Converts an unsigned exponent in the range of 0-24 and a 16 bit mantissa
  97.  * to an IEEE single precision floating point value */
  98. void convert_to_float(uint_16 exp, uint_16 mantissa, uint_32 *dest)
  99. {
  100. uint_32 num;
  101. uint_16 exponent;
  102. uint_8 i;
  103. /* If the mantissa is zero we can simply return zero */
  104. if(mantissa == 0)
  105. {
  106. *dest = 0;
  107. return;
  108. }
  109. /* Exponent is offset by 127 in IEEE format minus the shift to
  110.  * align the mantissa to 1.f (subtracted in the final result) */
  111. exponent = 127 - exp;
  112. /* Take care of the one asymmetric negative number */
  113. if(mantissa == 0x8000)
  114. mantissa++;
  115. /* Extract the sign bit, invert the mantissa if it's negative, and 
  116.    shift out the sign bit */
  117. if( mantissa & 0x8000 )
  118. {
  119. mantissa *= -2;
  120. num = 0x80000000 + (exponent << 23);
  121. }
  122. else
  123. {
  124. mantissa *= 2;
  125. num = exponent << 23;
  126. }
  127. /* Find the index of the most significant one bit */
  128. i = first_bit_lut[mantissa >> 8];
  129. if(i == 0)
  130. i = first_bit_lut[mantissa & 0xff] + 8;
  131. *dest = num - (i << 23) + (mantissa << (7 + i));
  132. }