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

DVD

开发平台:

Unix_Linux

  1. /* 
  2.  *    exponent.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 "exponent.h"
  28. static void exp_unpack_ch(uint_16 type,uint_16 expstr,uint_16 ngrps,uint_16 initial_exp, 
  29. uint_16 exps[], uint_16 *dest);
  30. void
  31. exponent_unpack( bsi_t *bsi, audblk_t *audblk, stream_coeffs_t *coeffs)
  32. {
  33. uint_16 i;
  34. for(i=0; i< bsi->nfchans; i++)
  35. exp_unpack_ch(UNPACK_FBW, audblk->chexpstr[i], audblk->nchgrps[i], audblk->exps[i][0], 
  36. &audblk->exps[i][1], audblk->fbw_exp[i]);
  37. if(audblk->cplinu)
  38. exp_unpack_ch(UNPACK_CPL, audblk->cplexpstr, audblk->ncplgrps, audblk->cplabsexp << 1,
  39. audblk->cplexps, &audblk->cpl_exp[audblk->cplstrtmant]);
  40. if(bsi->lfeon)
  41. exp_unpack_ch(UNPACK_LFE, audblk->lfeexpstr, 2, audblk->lfeexps[0], 
  42. &audblk->lfeexps[1], audblk->lfe_exp);
  43. }
  44. static void
  45. exp_unpack_ch(uint_16 type,uint_16 expstr,uint_16 ngrps,uint_16 initial_exp, 
  46. uint_16 exps[], uint_16 *dest)
  47. {
  48. uint_16 i,j;
  49. sint_16 exp_acc;
  50. sint_16 exp_1,exp_2,exp_3;
  51. if(expstr == EXP_REUSE)
  52. return;
  53. /* Handle the initial absolute exponent */
  54. exp_acc = initial_exp;
  55. j = 0;
  56. /* In the case of a fbw channel then the initial absolute values is 
  57.  * also an exponent */
  58. if(type != UNPACK_CPL)
  59. dest[j++] = exp_acc;
  60. /* Loop through the groups and fill the dest array appropriately */
  61. for(i=0; i< ngrps; i++)
  62. {
  63. if(exps[i] > 124)
  64. {
  65. //FIXME set an error flag and mute the frame
  66. printf("n!! Invalid exponent !!n");
  67. exit(1);
  68. }
  69. exp_1 = exps[i] / 25;
  70. exp_2 = (exps[i] - (exp_1 * 25)) / 5;
  71. exp_3 = exps[i] - (exp_1 * 25) - (exp_2 * 5) ;
  72. exp_acc += (exp_1 - 2);
  73. switch(expstr)
  74. {
  75. case EXP_D45:
  76. dest[j++] = exp_acc;
  77. dest[j++] = exp_acc;
  78. case EXP_D25:
  79. dest[j++] = exp_acc;
  80. case EXP_D15:
  81. dest[j++] = exp_acc;
  82. }
  83. exp_acc += (exp_2 - 2);
  84. switch(expstr)
  85. {
  86. case EXP_D45:
  87. dest[j++] = exp_acc;
  88. dest[j++] = exp_acc;
  89. case EXP_D25:
  90. dest[j++] = exp_acc;
  91. case EXP_D15:
  92. dest[j++] = exp_acc;
  93. }
  94. exp_acc += (exp_3 - 2);
  95. switch(expstr)
  96. {
  97. case EXP_D45:
  98. dest[j++] = exp_acc;
  99. dest[j++] = exp_acc;
  100. case EXP_D25:
  101. dest[j++] = exp_acc;
  102. case EXP_D15:
  103. dest[j++] = exp_acc;
  104. }
  105. }
  106. }