1 #include <stdio.h> /* "intf_msg.h" */
4 #include "ac3_decoder.h"
5 #include "ac3_bit_stream.h"
6 #include "ac3_internal.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,
37 u16 expstr, u16 ngrps, u16 initial_exp,
38 u16 exps[], u16 * dest)
43 if (expstr == EXP_REUSE) {
47 /* Handle the initial absolute exponent */
48 exp_acc = initial_exp;
51 /* In the case of a fbw channel then the initial absolute values is
53 if (type != UNPACK_CPL) {
57 /* Loop through the groups and fill the dest array appropriately */
60 for (i = 0; i < ngrps; i++) {
62 fprintf (stderr, "ac3dec debug: invalid exponent\n");
65 exp_acc += (exps_1[exps[i]] /*- 2*/);
67 exp_acc += (exps_2[exps[i]] /*- 2*/);
69 exp_acc += (exps_3[exps[i]] /*- 2*/);
75 for (i = 0; i < ngrps; i++) {
77 fprintf (stderr, "ac3dec debug: invalid exponent\n");
80 exp_acc += (exps_1[exps[i]] /*- 2*/);
83 exp_acc += (exps_2[exps[i]] /*- 2*/);
86 exp_acc += (exps_3[exps[i]] /*- 2*/);
93 for (i = 0; i < ngrps; i++) {
95 fprintf (stderr, "ac3dec debug: invalid exponent\n");
98 exp_acc += (exps_1[exps[i]] /*- 2*/);
103 exp_acc += (exps_2[exps[i]] /*- 2*/);
108 exp_acc += (exps_3[exps[i]] /*- 2*/);
120 int exponent_unpack (ac3dec_t * p_ac3dec)
124 for (i = 0; i < p_ac3dec->bsi.nfchans; i++) {
125 if (exp_unpack_ch (p_ac3dec, UNPACK_FBW, p_ac3dec->audblk.chexpstr[i],
126 p_ac3dec->audblk.nchgrps[i],
127 p_ac3dec->audblk.exps[i][0],
128 &p_ac3dec->audblk.exps[i][1],
129 p_ac3dec->audblk.fbw_exp[i]))
133 if (p_ac3dec->audblk.cplinu) {
134 if (exp_unpack_ch (p_ac3dec, UNPACK_CPL, p_ac3dec->audblk.cplexpstr,
135 p_ac3dec->audblk.ncplgrps,
136 p_ac3dec->audblk.cplabsexp << 1,
137 p_ac3dec->audblk.cplexps,
138 &p_ac3dec->audblk.cpl_exp[p_ac3dec->audblk.cplstrtmant]))
142 if (p_ac3dec->bsi.lfeon) {
143 if (exp_unpack_ch (p_ac3dec, UNPACK_LFE, p_ac3dec->audblk.lfeexpstr,
144 2, p_ac3dec->audblk.lfeexps[0],
145 &p_ac3dec->audblk.lfeexps[1],
146 p_ac3dec->audblk.lfe_exp))