1 #include <stdio.h> /* "intf_msg.h" */
4 #include "ac3_decoder.h"
5 #include "ac3_internal.h"
6 #include "ac3_bit_stream.h"
8 #define Q0 ((-2 << 15) / 3.0)
10 #define Q2 ((2 << 15) / 3.0)
11 static float q_1_0[ 32 ] = { Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
12 Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
13 Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
15 static float q_1_1[ 32 ] = { Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
16 Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
17 Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
19 static float q_1_2[ 32 ] = { Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
20 Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
21 Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
27 #define Q0 ((-4 << 15) / 5.0)
28 #define Q1 ((-2 << 15) / 5.0)
30 #define Q3 ((2 << 15) / 5.0)
31 #define Q4 ((4 << 15) / 5.0)
32 static float q_2_0[ 128 ] =
33 { Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,
34 Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,
35 Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,
36 Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,Q3,
37 Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,Q4,
39 static float q_2_1[ 128 ] =
40 { Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4,
41 Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4,
42 Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4,
43 Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4,
44 Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4,
46 static float q_2_2[ 128 ] =
47 { Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,
48 Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,
49 Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,
50 Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,
51 Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,
59 #define Q0 ((-10 << 15) / 11.0)
60 #define Q1 ((-8 << 15) / 11.0)
61 #define Q2 ((-6 << 15) / 11.0)
62 #define Q3 ((-4 << 15) / 11.0)
63 #define Q4 ((-2 << 15) / 11.0)
65 #define Q6 ((2 << 15) / 11.0)
66 #define Q7 ((4 << 15) / 11.0)
67 #define Q8 ((6 << 15) / 11.0)
68 #define Q9 ((8 << 15) / 11.0)
69 #define QA ((10 << 15) / 11.0)
70 static float q_4_0[ 128 ] = { Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
71 Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
72 Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
73 Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3,
74 Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4,
75 Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5,
76 Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6,
77 Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7,
78 Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8,
79 Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9,
80 QA, QA, QA, QA, QA, QA, QA, QA, QA, QA, QA,
82 static float q_4_1[ 128 ] = { Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
83 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
84 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
85 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
86 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
87 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
88 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
89 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
90 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
91 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
92 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
106 /* Lookup tables of 0.16 two's complement quantization values */
108 static float q_3[8] = { (-6 << 15)/7.0, (-4 << 15)/7.0, (-2 << 15)/7.0,
109 0 , (2 << 15)/7.0, (4 << 15)/7.0,
112 static float q_5[16] = { (-14 << 15)/15.0, (-12 << 15)/15.0, (-10 << 15)/15.0,
113 (-8 << 15)/15.0, (-6 << 15)/15.0, (-4 << 15)/15.0,
114 (-2 << 15)/15.0, 0 , (2 << 15)/15.0,
115 (4 << 15)/15.0, (6 << 15)/15.0, (8 << 15)/15.0,
116 (10 << 15)/15.0, (12 << 15)/15.0, (14 << 15)/15.0,
119 /* These store the persistent state of the packed mantissas */
123 static s32 q_1_pointer;
124 static s32 q_2_pointer;
125 static s32 q_4_pointer;
127 /* Conversion from bap to number of bits in the mantissas
128 * zeros account for cases 0,1,2,4 which are special cased */
129 static u16 qnttztab[16] = { 0, 0, 0, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16};
131 static float exp_lut[ 25 ] =
133 6.10351562500000000000000000e-05,
134 3.05175781250000000000000000e-05,
135 1.52587890625000000000000000e-05,
136 7.62939453125000000000000000e-06,
137 3.81469726562500000000000000e-06,
138 1.90734863281250000000000000e-06,
139 9.53674316406250000000000000e-07,
140 4.76837158203125000000000000e-07,
141 2.38418579101562500000000000e-07,
142 1.19209289550781250000000000e-07,
143 5.96046447753906250000000000e-08,
144 2.98023223876953125000000000e-08,
145 1.49011611938476562500000000e-08,
146 7.45058059692382812500000000e-09,
147 3.72529029846191406250000000e-09,
148 1.86264514923095703125000000e-09,
149 9.31322574615478515625000000e-10,
150 4.65661287307739257812500000e-10,
151 2.32830643653869628906250000e-10,
152 1.16415321826934814453125000e-10,
153 5.82076609134674072265625000e-11,
154 2.91038304567337036132812500e-11,
155 1.45519152283668518066406250e-11,
156 7.27595761418342590332031250e-12,
157 3.63797880709171295166015625e-12,
160 /* Fetch an unpacked, left justified, and properly biased/dithered mantissa value */
161 static __inline__ float float_get (ac3dec_t * p_ac3dec, u16 bap, u16 exp)
165 /* If the bap is 0-5 then we have special cases to take care of */
168 return (0); /* FIXME dither */
171 if (q_1_pointer >= 0) {
172 return (q_1[q_1_pointer--] * exp_lut[exp]);
175 NeedBits (&(p_ac3dec->bit_stream), 5);
176 group_code = p_ac3dec->bit_stream.buffer >> (32 - 5);
177 DumpBits (&(p_ac3dec->bit_stream), 5);
178 if (group_code >= 27) {
179 fprintf (stderr, "ac3dec debug: invalid mantissa\n");
182 q_1[ 1 ] = q_1_1[ group_code ];
183 q_1[ 0 ] = q_1_2[ group_code ];
187 return (q_1_0[group_code] * exp_lut[exp]);
190 if (q_2_pointer >= 0) {
191 return (q_2[q_2_pointer--] * exp_lut[exp]);
193 NeedBits (&(p_ac3dec->bit_stream), 7);
194 group_code = p_ac3dec->bit_stream.buffer >> (32 - 7);
195 DumpBits (&(p_ac3dec->bit_stream), 7);
197 if (group_code >= 125) {
198 fprintf (stderr, "ac3dec debug: invalid mantissa\n");
201 q_2[ 1 ] = q_2_1[ group_code ];
202 q_2[ 0 ] = q_2_2[ group_code ];
206 return (q_2_0[ group_code ] * exp_lut[exp]);
209 NeedBits (&(p_ac3dec->bit_stream), 3);
210 group_code = p_ac3dec->bit_stream.buffer >> (32 - 3);
211 DumpBits (&(p_ac3dec->bit_stream), 3);
213 if (group_code >= 7) {
214 fprintf (stderr, "ac3dec debug: invalid mantissa\n");
217 return (q_3[group_code] * exp_lut[exp]);
220 if (q_4_pointer >= 0) {
221 return (q_4[q_4_pointer--] * exp_lut[exp]);
223 NeedBits (&(p_ac3dec->bit_stream), 7);
224 group_code = p_ac3dec->bit_stream.buffer >> (32 - 7);
225 DumpBits (&(p_ac3dec->bit_stream), 7);
227 if (group_code >= 121) {
228 fprintf (stderr, "ac3dec debug: invalid mantissa\n");
231 q_4[ 0 ] = q_4_1[ group_code ];
235 return (q_4_0[ group_code ] * exp_lut[exp]);
238 NeedBits (&(p_ac3dec->bit_stream), 4);
239 group_code = p_ac3dec->bit_stream.buffer >> (32 - 4);
240 DumpBits (&(p_ac3dec->bit_stream), 4);
242 if (group_code >= 15) {
243 fprintf (stderr, "ac3dec debug: invalid mantissa\n");
246 return (q_5[group_code] * exp_lut[exp]);
249 NeedBits (&(p_ac3dec->bit_stream), qnttztab[bap]);
250 group_code = (((s32)(p_ac3dec->bit_stream.buffer)) >> (32 - qnttztab[bap])) << (16 - qnttztab[bap]);
251 DumpBits (&(p_ac3dec->bit_stream), qnttztab[bap]);
253 return (((s32)group_code) * exp_lut[exp]);
257 static __inline__ void uncouple_channel (ac3dec_t * p_ac3dec, u32 ch)
265 for (i = p_ac3dec->audblk.cplstrtmant; i < p_ac3dec->audblk.cplendmant;) {
266 if (!p_ac3dec->audblk.cplbndstrc[bnd]) {
267 cpl_exp_tmp = p_ac3dec->audblk.cplcoexp[ch][bnd] + 3 * p_ac3dec->audblk.mstrcplco[ch];
268 if (p_ac3dec->audblk.cplcoexp[ch][bnd] == 15)
269 cpl_mant_tmp = (p_ac3dec->audblk.cplcomant[ch][bnd]) << 12;
271 cpl_mant_tmp = ((0x10) | p_ac3dec->audblk.cplcomant[ch][bnd]) << 11;
273 cpl_coord = ((s16)cpl_mant_tmp) * exp_lut[cpl_exp_tmp];
277 for (j=0;j < 12; j++) {
278 p_ac3dec->coeffs.fbw[ch][i] = cpl_coord * p_ac3dec->audblk.cplfbw[i];
284 void mantissa_unpack (ac3dec_t * p_ac3dec)
292 if (p_ac3dec->audblk.cplinu) {
294 for (i = 0; !p_ac3dec->audblk.chincpl[i]; i++) {
295 for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++) {
296 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
301 for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++) {
302 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
304 for (j = p_ac3dec->audblk.cplstrtmant; j < p_ac3dec->audblk.cplendmant; j++) {
305 p_ac3dec->audblk.cplfbw[j] = float_get (p_ac3dec, p_ac3dec->audblk.cpl_bap[j], p_ac3dec->audblk.cpl_exp[j]);
307 uncouple_channel (p_ac3dec, i);
310 for (i++; i < p_ac3dec->bsi.nfchans; i++) {
311 for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++) {
312 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
314 if (p_ac3dec->audblk.chincpl[i]) {
315 uncouple_channel (p_ac3dec, i);
319 for (i = 0; i < p_ac3dec->bsi.nfchans; i++) {
320 for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++) {
321 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
326 if (p_ac3dec->bsi.lfeon) {
327 /* There are always 7 mantissas for lfe, no dither for lfe */
328 for (j = 0; j < 7; j++) {
329 p_ac3dec->coeffs.lfe[j] = float_get (p_ac3dec, p_ac3dec->audblk.lfe_bap[j], p_ac3dec->audblk.lfe_exp[j]);