1 #include <stdio.h> /* "intf_msg.h" */
4 #include "ac3_decoder.h"
5 #include "ac3_bit_stream.h"
6 #include "ac3_exponent.h"
8 static const s16 exps_1[128] =
9 { -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
10 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
11 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
13 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
16 static const s16 exps_2[128] =
17 { -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
18 -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
19 -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
20 -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
21 -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
24 static const s16 exps_3[128] =
25 { -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,
26 -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,
27 -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,
28 -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,
29 -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,
36 static __inline__ int exp_unpack_ch( ac3dec_t * p_ac3dec, u16 type, u16 expstr, u16 ngrps, u16 initial_exp, u16 exps[], u16 * dest )
41 if ( expstr == EXP_REUSE )
46 /* Handle the initial absolute exponent */
47 exp_acc = initial_exp;
50 /* In the case of a fbw channel then the initial absolute values is
52 if ( type != UNPACK_CPL )
57 /* Loop through the groups and fill the dest array appropriately */
61 for ( i = 0; i < ngrps; i++ )
65 fprintf( stderr, "ac3dec debug: invalid exponent\n" );
68 exp_acc += (exps_1[exps[i]] /*- 2*/);
70 exp_acc += (exps_2[exps[i]] /*- 2*/);
72 exp_acc += (exps_3[exps[i]] /*- 2*/);
78 for ( i = 0; i < ngrps; i++ )
82 fprintf( stderr, "ac3dec debug: invalid exponent\n" );
85 exp_acc += (exps_1[exps[i]] /*- 2*/);
88 exp_acc += (exps_2[exps[i]] /*- 2*/);
91 exp_acc += (exps_3[exps[i]] /*- 2*/);
98 for ( i = 0; i < ngrps; i++ )
102 fprintf( stderr, "ac3dec debug: invalid exponent\n" );
105 exp_acc += (exps_1[exps[i]] /*- 2*/);
110 exp_acc += (exps_2[exps[i]] /*- 2*/);
115 exp_acc += (exps_3[exps[i]] /*- 2*/);
127 int exponent_unpack( ac3dec_t * p_ac3dec )
131 for ( i = 0; i < p_ac3dec->bsi.nfchans; i++ )
133 if (exp_unpack_ch( p_ac3dec, UNPACK_FBW, p_ac3dec->audblk.chexpstr[i],
134 p_ac3dec->audblk.nchgrps[i],
135 p_ac3dec->audblk.exps[i][0],
136 &p_ac3dec->audblk.exps[i][1],
137 p_ac3dec->audblk.fbw_exp[i] ))
141 if ( p_ac3dec->audblk.cplinu )
143 if (exp_unpack_ch( p_ac3dec, UNPACK_CPL, p_ac3dec->audblk.cplexpstr,
144 p_ac3dec->audblk.ncplgrps,
145 p_ac3dec->audblk.cplabsexp << 1,
146 p_ac3dec->audblk.cplexps,
147 &p_ac3dec->audblk.cpl_exp[p_ac3dec->audblk.cplstrtmant] ))
151 if ( p_ac3dec->bsi.lfeon )
153 if (exp_unpack_ch( p_ac3dec, UNPACK_LFE, p_ac3dec->audblk.lfeexpstr,
154 2, p_ac3dec->audblk.lfeexps[0],
155 &p_ac3dec->audblk.lfeexps[1],
156 p_ac3dec->audblk.lfe_exp ))