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

DVD

开发平台:

Unix_Linux

  1. /* 
  2.  *    mantissa.c
  3.  *
  4.  * Copyright (C) Aaron Holtzman - May 1999
  5.  *
  6.  *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
  7.  *
  8.  *  ac3dec is free software; you can redistribute it and/or modify
  9.  *  it under the terms of the GNU General Public License as published by
  10.  *  the Free Software Foundation; either version 2, or (at your option)
  11.  *  any later version.
  12.  *   
  13.  *  ac3dec is distributed in the hope that it will be useful,
  14.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  *  GNU General Public License for more details.
  17.  *   
  18.  *  You should have received a copy of the GNU General Public License
  19.  *  along with GNU Make; see the file COPYING.  If not, write to
  20.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  21.  *
  22.  */
  23. #include <stdlib.h>
  24. #include <stdio.h>
  25. #include "ac3.h"
  26. #include "decode.h"
  27. #include "bitstream.h"
  28. #include "dither.h"
  29. #include "mantissa.h"
  30. //Lookup tables of 0.16 two's complement quantization values
  31. uint_16 q_1[3] = {( -2 << 15)/3, 0           ,(  2 << 15)/3 };
  32. uint_16 q_2[5] = {( -4 << 15)/5,( -2 << 15)/5,   0         ,
  33.                 (  2 << 15)/5,(  4 << 15)/5};
  34. uint_16 q_3[7] = {( -6 << 15)/7,( -4 << 15)/7,( -2 << 15)/7,
  35.                    0         ,(  2 << 15)/7,(  4 << 15)/7,
  36. (  6 << 15)/7};
  37. uint_16 q_4[11] = {(-10 << 15)/11,(-8 << 15)/11,(-6 << 15)/11,
  38.                 ( -4 << 15)/11,(-2 << 15)/11,  0          ,
  39. (  2 << 15)/11,( 4 << 15)/11,( 6 << 15)/11,
  40. (  8 << 15)/11,(10 << 15)/11};
  41. uint_16 q_5[15] = {(-14 << 15)/15,(-12 << 15)/15,(-10 << 15)/15,
  42.                    ( -8 << 15)/15,( -6 << 15)/15,( -4 << 15)/15,
  43.  ( -2 << 15)/15,   0          ,(  2 << 15)/15,
  44.  (  4 << 15)/15,(  6 << 15)/15,(  8 << 15)/15,
  45.  ( 10 << 15)/15,( 12 << 15)/15,( 14 << 15)/15};
  46. //These store the persistent state of the packed mantissas
  47. static uint_16 m_1[3];
  48. static uint_16 m_2[3];
  49. static uint_16 m_4[2];
  50. static uint_16 m_1_pointer;
  51. static uint_16 m_2_pointer;
  52. static uint_16 m_4_pointer;
  53. //Conversion from bap to number of bits in the mantissas
  54. //zeros account for cases 0,1,2,4 which are special cased
  55. static uint_16 qnttztab[16] = { 0, 0, 0, 3, 0 , 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16};
  56. static uint_16 mantissa_get(bitstream_t *bs, uint_16 bap, uint_16 dithflag);
  57. static void mantissa_reset(void);
  58. void
  59. mantissa_unpack(bsi_t *bsi, audblk_t *audblk,bitstream_t *bs)
  60. {
  61. uint_16 i,j;
  62. uint_32 done_cpl = 0;
  63. mantissa_reset();
  64. for(i=0; i< bsi->nfchans; i++)
  65. {
  66. for(j=0; j < audblk->endmant[i]; j++)
  67. audblk->chmant[i][j] = mantissa_get(bs,audblk->fbw_bap[i][j],audblk->dithflag[i]);
  68. if(audblk->cplinu && audblk->chincpl[i] && !(done_cpl))
  69. {
  70. /* ncplmant is equal to 12 * ncplsubnd */
  71. /* Don't dither coupling channel until channel separation so that
  72.  * interchannel noise is uncorrelated */
  73. for(j=audblk->cplstrtmant; j < audblk->cplendmant; j++)
  74. audblk->cplmant[j] = mantissa_get(bs,audblk->cpl_bap[j],0);
  75. done_cpl = 1;
  76. }
  77. }
  78. if(bsi->lfeon)
  79. {
  80. /* There are always 7 mantissas for lfe, no dither for lfe */
  81. for(j=0; j < 7 ; j++)
  82. audblk->lfemant[j] = mantissa_get(bs,audblk->lfe_bap[j],0);
  83. }
  84. }
  85. /* Fetch an unpacked, left justified, and properly biased/dithered mantissa value */
  86. static uint_16
  87. mantissa_get(bitstream_t *bs, uint_16 bap, uint_16 dithflag)
  88. {
  89. uint_16 result;
  90. uint_16 group_code;
  91. //If the bap is 0-5 then we have special cases to take care of
  92. switch(bap)
  93. {
  94. case 0:
  95. if(dithflag)
  96. result = dither_gen();
  97. else
  98. result = 0;
  99. break;
  100. case 1:
  101. if(m_1_pointer > 2)
  102. {
  103. group_code = bitstream_get(bs,5);
  104. if(group_code > 26)
  105. //FIXME do proper block error handling
  106. printf("n!! Invalid mantissa !!n");
  107. m_1[0] = group_code / 9; 
  108. m_1[1] = (group_code % 9) / 3; 
  109. m_1[2] = (group_code % 9) % 3; 
  110. m_1_pointer = 0;
  111. }
  112. result = m_1[m_1_pointer++];
  113. result = q_1[result];
  114. break;
  115. case 2:
  116. if(m_2_pointer > 2)
  117. {
  118. group_code = bitstream_get(bs,7);
  119. if(group_code > 124)
  120. //FIXME do proper block error handling
  121. printf("n!! Invalid mantissa !!n");
  122. m_2[0] = group_code / 25;
  123. m_2[1] = (group_code % 25) / 5 ;
  124. m_2[2] = (group_code % 25) % 5 ; 
  125. m_2_pointer = 0;
  126. }
  127. result = m_2[m_2_pointer++];
  128. result = q_2[result];
  129. break;
  130. case 3:
  131. result = bitstream_get(bs,3);
  132. if(result > 6)
  133. //FIXME do proper block error handling
  134. printf("n!! Invalid mantissa !!n");
  135. result = q_3[result];
  136. break;
  137. case 4:
  138. if(m_4_pointer > 1)
  139. {
  140. group_code = bitstream_get(bs,7);
  141. if(group_code > 120)
  142. //FIXME do proper block error handling
  143. printf("n!! Invalid mantissa !!n");
  144. m_4[0] = group_code / 11;
  145. m_4[1] = group_code % 11;
  146. m_4_pointer = 0;
  147. }
  148. result = m_4[m_4_pointer++];
  149. result = q_4[result];
  150. break;
  151. case 5:
  152. result = bitstream_get(bs,4);
  153. if(result > 14)
  154. //FIXME do proper block error handling
  155. printf("n!! Invalid mantissa !!n");
  156. result = q_5[result];
  157. break;
  158. default:
  159. result = bitstream_get(bs,qnttztab[bap]);
  160. result <<= 16 - qnttztab[bap];
  161. }
  162. return result;
  163. }
  164. static void 
  165. mantissa_reset(void)
  166. {
  167. m_1[2] = m_1[1] = m_1[0] = 0;
  168. m_2[2] = m_2[1] = m_2[0] = 0;
  169. m_4[1] = m_4[0] = 0;
  170. m_1_pointer = m_2_pointer = m_4_pointer = 3;
  171. }