1 /*****************************************************************************
2 * ac3_mantissa.c: ac3 mantissa computation
3 *****************************************************************************
4 * Copyright (C) 1999, 2000 VideoLAN
8 * This program 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 of the License, or
11 * (at your option) any later version.
13 * This program 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 GNU
16 * General Public License for more details.
18 * You should have received a copy of the GNU General Public
19 * License along with this program; if not, write to the
20 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 * Boston, MA 02111-1307, USA.
22 *****************************************************************************/
24 #include <stdio.h> /* "intf_msg.h" */
26 #include "int_types.h"
27 #include "ac3_decoder.h"
28 #include "ac3_internal.h"
29 #include "ac3_bit_stream.h"
31 #define Q0 ((-2 << 15) / 3.0)
33 #define Q2 ((2 << 15) / 3.0)
34 static float q_1_0[ 32 ] = { Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
35 Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
36 Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
38 static float q_1_1[ 32 ] = { Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
39 Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
40 Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
42 static float q_1_2[ 32 ] = { Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
43 Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
44 Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
50 #define Q0 ((-4 << 15) / 5.0)
51 #define Q1 ((-2 << 15) / 5.0)
53 #define Q3 ((2 << 15) / 5.0)
54 #define Q4 ((4 << 15) / 5.0)
55 static float q_2_0[ 128 ] =
56 { 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,
57 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,
58 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,
59 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,
60 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,
62 static float q_2_1[ 128 ] =
63 { 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,
64 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,
65 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,
66 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,
67 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,
69 static float q_2_2[ 128 ] =
70 { 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,
71 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,
72 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,
73 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,
74 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,
82 #define Q0 ((-10 << 15) / 11.0)
83 #define Q1 ((-8 << 15) / 11.0)
84 #define Q2 ((-6 << 15) / 11.0)
85 #define Q3 ((-4 << 15) / 11.0)
86 #define Q4 ((-2 << 15) / 11.0)
88 #define Q6 ((2 << 15) / 11.0)
89 #define Q7 ((4 << 15) / 11.0)
90 #define Q8 ((6 << 15) / 11.0)
91 #define Q9 ((8 << 15) / 11.0)
92 #define QA ((10 << 15) / 11.0)
93 static float q_4_0[ 128 ] = { Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
94 Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
95 Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
96 Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3,
97 Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4,
98 Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5,
99 Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6,
100 Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7,
101 Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8,
102 Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9,
103 QA, QA, QA, QA, QA, QA, QA, QA, QA, QA, QA,
104 0, 0, 0, 0, 0, 0, 0};
105 static float q_4_1[ 128 ] = { Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
106 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
107 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
108 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
109 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
110 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
111 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
112 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
113 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
114 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
115 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
116 0, 0, 0, 0, 0, 0, 0};
129 /* Lookup tables of 0.16 two's complement quantization values */
131 static float q_3[8] = { (-6 << 15)/7.0, (-4 << 15)/7.0, (-2 << 15)/7.0,
132 0 , (2 << 15)/7.0, (4 << 15)/7.0,
135 static float q_5[16] = { (-14 << 15)/15.0, (-12 << 15)/15.0, (-10 << 15)/15.0,
136 (-8 << 15)/15.0, (-6 << 15)/15.0, (-4 << 15)/15.0,
137 (-2 << 15)/15.0, 0 , (2 << 15)/15.0,
138 (4 << 15)/15.0, (6 << 15)/15.0, (8 << 15)/15.0,
139 (10 << 15)/15.0, (12 << 15)/15.0, (14 << 15)/15.0,
142 /* These store the persistent state of the packed mantissas */
146 static s32 q_1_pointer;
147 static s32 q_2_pointer;
148 static s32 q_4_pointer;
150 /* Conversion from bap to number of bits in the mantissas
151 * zeros account for cases 0,1,2,4 which are special cased */
152 static u16 qnttztab[16] = { 0, 0, 0, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16};
154 static float exp_lut[ 25 ] =
156 6.10351562500000000000000000e-05,
157 3.05175781250000000000000000e-05,
158 1.52587890625000000000000000e-05,
159 7.62939453125000000000000000e-06,
160 3.81469726562500000000000000e-06,
161 1.90734863281250000000000000e-06,
162 9.53674316406250000000000000e-07,
163 4.76837158203125000000000000e-07,
164 2.38418579101562500000000000e-07,
165 1.19209289550781250000000000e-07,
166 5.96046447753906250000000000e-08,
167 2.98023223876953125000000000e-08,
168 1.49011611938476562500000000e-08,
169 7.45058059692382812500000000e-09,
170 3.72529029846191406250000000e-09,
171 1.86264514923095703125000000e-09,
172 9.31322574615478515625000000e-10,
173 4.65661287307739257812500000e-10,
174 2.32830643653869628906250000e-10,
175 1.16415321826934814453125000e-10,
176 5.82076609134674072265625000e-11,
177 2.91038304567337036132812500e-11,
178 1.45519152283668518066406250e-11,
179 7.27595761418342590332031250e-12,
180 3.63797880709171295166015625e-12,
183 /* Fetch an unpacked, left justified, and properly biased/dithered mantissa value */
184 static __inline__ float float_get (ac3dec_t * p_ac3dec, u16 bap, u16 exp)
188 /* If the bap is 0-5 then we have special cases to take care of */
191 return (0); /* FIXME dither */
194 if (q_1_pointer >= 0) {
195 return (q_1[q_1_pointer--] * exp_lut[exp]);
198 NeedBits (&(p_ac3dec->bit_stream), 5);
199 group_code = p_ac3dec->bit_stream.buffer >> (32 - 5);
200 DumpBits (&(p_ac3dec->bit_stream), 5);
201 if (group_code >= 27) {
202 fprintf (stderr, "ac3dec debug: invalid mantissa\n");
205 q_1[ 1 ] = q_1_1[ group_code ];
206 q_1[ 0 ] = q_1_2[ group_code ];
210 return (q_1_0[group_code] * exp_lut[exp]);
213 if (q_2_pointer >= 0) {
214 return (q_2[q_2_pointer--] * exp_lut[exp]);
216 NeedBits (&(p_ac3dec->bit_stream), 7);
217 group_code = p_ac3dec->bit_stream.buffer >> (32 - 7);
218 DumpBits (&(p_ac3dec->bit_stream), 7);
220 if (group_code >= 125) {
221 fprintf (stderr, "ac3dec debug: invalid mantissa\n");
224 q_2[ 1 ] = q_2_1[ group_code ];
225 q_2[ 0 ] = q_2_2[ group_code ];
229 return (q_2_0[ group_code ] * exp_lut[exp]);
232 NeedBits (&(p_ac3dec->bit_stream), 3);
233 group_code = p_ac3dec->bit_stream.buffer >> (32 - 3);
234 DumpBits (&(p_ac3dec->bit_stream), 3);
236 if (group_code >= 7) {
237 fprintf (stderr, "ac3dec debug: invalid mantissa\n");
240 return (q_3[group_code] * exp_lut[exp]);
243 if (q_4_pointer >= 0) {
244 return (q_4[q_4_pointer--] * exp_lut[exp]);
246 NeedBits (&(p_ac3dec->bit_stream), 7);
247 group_code = p_ac3dec->bit_stream.buffer >> (32 - 7);
248 DumpBits (&(p_ac3dec->bit_stream), 7);
250 if (group_code >= 121) {
251 fprintf (stderr, "ac3dec debug: invalid mantissa\n");
254 q_4[ 0 ] = q_4_1[ group_code ];
258 return (q_4_0[ group_code ] * exp_lut[exp]);
261 NeedBits (&(p_ac3dec->bit_stream), 4);
262 group_code = p_ac3dec->bit_stream.buffer >> (32 - 4);
263 DumpBits (&(p_ac3dec->bit_stream), 4);
265 if (group_code >= 15) {
266 fprintf (stderr, "ac3dec debug: invalid mantissa\n");
269 return (q_5[group_code] * exp_lut[exp]);
272 NeedBits (&(p_ac3dec->bit_stream), qnttztab[bap]);
273 group_code = (((s32)(p_ac3dec->bit_stream.buffer)) >> (32 - qnttztab[bap])) << (16 - qnttztab[bap]);
274 DumpBits (&(p_ac3dec->bit_stream), qnttztab[bap]);
276 return (((s32)group_code) * exp_lut[exp]);
280 static __inline__ void uncouple_channel (ac3dec_t * p_ac3dec, u32 ch)
288 for (i = p_ac3dec->audblk.cplstrtmant; i < p_ac3dec->audblk.cplendmant;) {
289 if (!p_ac3dec->audblk.cplbndstrc[bnd]) {
290 cpl_exp_tmp = p_ac3dec->audblk.cplcoexp[ch][bnd] + 3 * p_ac3dec->audblk.mstrcplco[ch];
291 if (p_ac3dec->audblk.cplcoexp[ch][bnd] == 15)
292 cpl_mant_tmp = (p_ac3dec->audblk.cplcomant[ch][bnd]) << 12;
294 cpl_mant_tmp = ((0x10) | p_ac3dec->audblk.cplcomant[ch][bnd]) << 11;
296 cpl_coord = ((s16)cpl_mant_tmp) * exp_lut[cpl_exp_tmp];
300 for (j=0;j < 12; j++) {
301 p_ac3dec->coeffs.fbw[ch][i] = cpl_coord * p_ac3dec->audblk.cplfbw[i];
307 void mantissa_unpack (ac3dec_t * p_ac3dec)
315 if (p_ac3dec->audblk.cplinu) {
317 for (i = 0; !p_ac3dec->audblk.chincpl[i]; i++) {
318 for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++) {
319 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
324 for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++) {
325 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
327 for (j = p_ac3dec->audblk.cplstrtmant; j < p_ac3dec->audblk.cplendmant; j++) {
328 p_ac3dec->audblk.cplfbw[j] = float_get (p_ac3dec, p_ac3dec->audblk.cpl_bap[j], p_ac3dec->audblk.cpl_exp[j]);
330 uncouple_channel (p_ac3dec, i);
333 for (i++; i < p_ac3dec->bsi.nfchans; i++) {
334 for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++) {
335 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
337 if (p_ac3dec->audblk.chincpl[i]) {
338 uncouple_channel (p_ac3dec, i);
342 for (i = 0; i < p_ac3dec->bsi.nfchans; i++) {
343 for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++) {
344 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
349 if (p_ac3dec->bsi.lfeon) {
350 /* There are always 7 mantissas for lfe, no dither for lfe */
351 for (j = 0; j < 7; j++) {
352 p_ac3dec->coeffs.lfe[j] = float_get (p_ac3dec, p_ac3dec->audblk.lfe_bap[j], p_ac3dec->audblk.lfe_exp[j]);