1 /*****************************************************************************
2 * ac3_mantissa.h: ac3 mantissa computation
3 *****************************************************************************
4 * Copyright (C) 1999, 2000, 2001 VideoLAN
5 * $Id: ac3_mantissa.h,v 1.5 2001/10/30 19:34:53 reno Exp $
7 * Authors: Michel Kaempf <maxx@via.ecp.fr>
8 * Aaron Holtzman <aholtzma@engr.uvic.ca>
9 * Renaud Dartus <reno@videolan.org>
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
24 *****************************************************************************/
26 #define Q0 ((-2 << 15) / 3.0)
28 #define Q2 ((2 << 15) / 3.0)
29 static const float q_1_0[ 32 ] =
31 Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
32 Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
33 Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
36 static const float q_1_1[ 32 ] =
38 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,
43 static const float q_1_2[ 32 ] =
45 Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
46 Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
47 Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
54 #define Q0 ((-4 << 15) / 5.0)
55 #define Q1 ((-2 << 15) / 5.0)
57 #define Q3 ((2 << 15) / 5.0)
58 #define Q4 ((4 << 15) / 5.0)
59 static const float q_2_0[ 128 ] =
61 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,
62 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,
63 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,
64 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,
65 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,
68 static const float q_2_1[ 128 ] =
70 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,
71 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,
72 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,
73 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,
74 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,
77 static const float q_2_2[ 128 ] =
79 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,
80 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,
81 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 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,
83 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,
92 #define Q0 ((-10 << 15) / 11.0)
93 #define Q1 ((-8 << 15) / 11.0)
94 #define Q2 ((-6 << 15) / 11.0)
95 #define Q3 ((-4 << 15) / 11.0)
96 #define Q4 ((-2 << 15) / 11.0)
98 #define Q6 ((2 << 15) / 11.0)
99 #define Q7 ((4 << 15) / 11.0)
100 #define Q8 ((6 << 15) / 11.0)
101 #define Q9 ((8 << 15) / 11.0)
102 #define QA ((10 << 15) / 11.0)
103 static const float q_4_0[ 128 ] =
105 Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
106 Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
107 Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
108 Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3,
109 Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4,
110 Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5,
111 Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6,
112 Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7,
113 Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8,
114 Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9,
115 QA, QA, QA, QA, QA, QA, QA, QA, QA, QA, QA,
118 static const float q_4_1[ 128 ] =
120 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
121 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
122 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
123 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
124 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
125 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
126 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
127 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
128 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
129 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
130 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
145 /* Lookup tables of 0.16 two's complement quantization values */
147 static const float q_3[8] =
149 (-6 << 15)/7.0, (-4 << 15)/7.0, (-2 << 15)/7.0,
150 0 , (2 << 15)/7.0, (4 << 15)/7.0,
154 static const float q_5[16] =
156 (-14 << 15)/15.0, (-12 << 15)/15.0, (-10 << 15)/15.0,
157 (-8 << 15)/15.0, (-6 << 15)/15.0, (-4 << 15)/15.0,
158 (-2 << 15)/15.0, 0 , (2 << 15)/15.0,
159 (4 << 15)/15.0, (6 << 15)/15.0, (8 << 15)/15.0,
160 (10 << 15)/15.0, (12 << 15)/15.0, (14 << 15)/15.0,
164 /* Conversion from bap to number of bits in the mantissas
165 * zeros account for cases 0,1,2,4 which are special cased */
166 static const u16 qnttztab[16] =
168 0, 0, 0, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16
171 static const float scale_factor[25] =
173 6.10351562500000000000000000e-05,
174 3.05175781250000000000000000e-05,
175 1.52587890625000000000000000e-05,
176 7.62939453125000000000000000e-06,
177 3.81469726562500000000000000e-06,
178 1.90734863281250000000000000e-06,
179 9.53674316406250000000000000e-07,
180 4.76837158203125000000000000e-07,
181 2.38418579101562500000000000e-07,
182 1.19209289550781250000000000e-07,
183 5.96046447753906250000000000e-08,
184 2.98023223876953125000000000e-08,
185 1.49011611938476562500000000e-08,
186 7.45058059692382812500000000e-09,
187 3.72529029846191406250000000e-09,
188 1.86264514923095703125000000e-09,
189 9.31322574615478515625000000e-10,
190 4.65661287307739257812500000e-10,
191 2.32830643653869628906250000e-10,
192 1.16415321826934814453125000e-10,
193 5.82076609134674072265625000e-11,
194 2.91038304567337036132812500e-11,
195 1.45519152283668518066406250e-11,
196 7.27595761418342590332031250e-12,
197 3.63797880709171295166015625e-12,
200 static const u16 dither_lut[256] =
202 0x0000, 0xa011, 0xe033, 0x4022, 0x6077, 0xc066, 0x8044, 0x2055,
203 0xc0ee, 0x60ff, 0x20dd, 0x80cc, 0xa099, 0x0088, 0x40aa, 0xe0bb,
204 0x21cd, 0x81dc, 0xc1fe, 0x61ef, 0x41ba, 0xe1ab, 0xa189, 0x0198,
205 0xe123, 0x4132, 0x0110, 0xa101, 0x8154, 0x2145, 0x6167, 0xc176,
206 0x439a, 0xe38b, 0xa3a9, 0x03b8, 0x23ed, 0x83fc, 0xc3de, 0x63cf,
207 0x8374, 0x2365, 0x6347, 0xc356, 0xe303, 0x4312, 0x0330, 0xa321,
208 0x6257, 0xc246, 0x8264, 0x2275, 0x0220, 0xa231, 0xe213, 0x4202,
209 0xa2b9, 0x02a8, 0x428a, 0xe29b, 0xc2ce, 0x62df, 0x22fd, 0x82ec,
210 0x8734, 0x2725, 0x6707, 0xc716, 0xe743, 0x4752, 0x0770, 0xa761,
211 0x47da, 0xe7cb, 0xa7e9, 0x07f8, 0x27ad, 0x87bc, 0xc79e, 0x678f,
212 0xa6f9, 0x06e8, 0x46ca, 0xe6db, 0xc68e, 0x669f, 0x26bd, 0x86ac,
213 0x6617, 0xc606, 0x8624, 0x2635, 0x0660, 0xa671, 0xe653, 0x4642,
214 0xc4ae, 0x64bf, 0x249d, 0x848c, 0xa4d9, 0x04c8, 0x44ea, 0xe4fb,
215 0x0440, 0xa451, 0xe473, 0x4462, 0x6437, 0xc426, 0x8404, 0x2415,
216 0xe563, 0x4572, 0x0550, 0xa541, 0x8514, 0x2505, 0x6527, 0xc536,
217 0x258d, 0x859c, 0xc5be, 0x65af, 0x45fa, 0xe5eb, 0xa5c9, 0x05d8,
218 0xae79, 0x0e68, 0x4e4a, 0xee5b, 0xce0e, 0x6e1f, 0x2e3d, 0x8e2c,
219 0x6e97, 0xce86, 0x8ea4, 0x2eb5, 0x0ee0, 0xaef1, 0xeed3, 0x4ec2,
220 0x8fb4, 0x2fa5, 0x6f87, 0xcf96, 0xefc3, 0x4fd2, 0x0ff0, 0xafe1,
221 0x4f5a, 0xef4b, 0xaf69, 0x0f78, 0x2f2d, 0x8f3c, 0xcf1e, 0x6f0f,
222 0xede3, 0x4df2, 0x0dd0, 0xadc1, 0x8d94, 0x2d85, 0x6da7, 0xcdb6,
223 0x2d0d, 0x8d1c, 0xcd3e, 0x6d2f, 0x4d7a, 0xed6b, 0xad49, 0x0d58,
224 0xcc2e, 0x6c3f, 0x2c1d, 0x8c0c, 0xac59, 0x0c48, 0x4c6a, 0xec7b,
225 0x0cc0, 0xacd1, 0xecf3, 0x4ce2, 0x6cb7, 0xcca6, 0x8c84, 0x2c95,
226 0x294d, 0x895c, 0xc97e, 0x696f, 0x493a, 0xe92b, 0xa909, 0x0918,
227 0xe9a3, 0x49b2, 0x0990, 0xa981, 0x89d4, 0x29c5, 0x69e7, 0xc9f6,
228 0x0880, 0xa891, 0xe8b3, 0x48a2, 0x68f7, 0xc8e6, 0x88c4, 0x28d5,
229 0xc86e, 0x687f, 0x285d, 0x884c, 0xa819, 0x0808, 0x482a, 0xe83b,
230 0x6ad7, 0xcac6, 0x8ae4, 0x2af5, 0x0aa0, 0xaab1, 0xea93, 0x4a82,
231 0xaa39, 0x0a28, 0x4a0a, 0xea1b, 0xca4e, 0x6a5f, 0x2a7d, 0x8a6c,
232 0x4b1a, 0xeb0b, 0xab29, 0x0b38, 0x2b6d, 0x8b7c, 0xcb5e, 0x6b4f,
233 0x8bf4, 0x2be5, 0x6bc7, 0xcbd6, 0xeb83, 0x4b92, 0x0bb0, 0xaba1
236 static __inline__ u16 dither_gen (mantissa_t * p_mantissa)
240 state = dither_lut[p_mantissa->lfsr_state >> 8] ^
241 (p_mantissa->lfsr_state << 8);
242 p_mantissa->lfsr_state = (u16) state;
243 return ( (state * (s32) (0.707106 * 256.0)) >> 8 );
247 /* Fetch an unpacked, left justified, and properly biased/dithered mantissa value */
248 static __inline__ float coeff_get_float (ac3dec_t * p_ac3dec, u16 bap, u16 dithflag,
253 /* If the bap is 0-5 then we have special cases to take care of */
259 return ( dither_gen(&p_ac3dec->mantissa) * scale_factor[exp] );
264 if (p_ac3dec->mantissa.q_1_pointer >= 0)
266 return (p_ac3dec->mantissa.q_1[p_ac3dec->mantissa.q_1_pointer--] *
270 p_ac3dec->total_bits_read += 5;
271 if ((group_code = GetBits (&p_ac3dec->bit_stream,5)) > 26)
273 intf_WarnMsg ( 3, "ac3dec warn: invalid mantissa (1)" );
277 p_ac3dec->mantissa.q_1[ 1 ] = q_1_1[ group_code ];
278 p_ac3dec->mantissa.q_1[ 0 ] = q_1_2[ group_code ];
280 p_ac3dec->mantissa.q_1_pointer = 1;
282 return (q_1_0[group_code] * scale_factor[exp]);
285 if (p_ac3dec->mantissa.q_2_pointer >= 0)
287 return (p_ac3dec->mantissa.q_2[p_ac3dec->mantissa.q_2_pointer--] *
291 p_ac3dec->total_bits_read += 7;
292 if ((group_code = GetBits (&p_ac3dec->bit_stream,7)) > 124)
294 intf_WarnMsg ( 3, "ac3dec warn: invalid mantissa (2)" );
298 p_ac3dec->mantissa.q_2[ 1 ] = q_2_1[ group_code ];
299 p_ac3dec->mantissa.q_2[ 0 ] = q_2_2[ group_code ];
301 p_ac3dec->mantissa.q_2_pointer = 1;
303 return (q_2_0[group_code] * scale_factor[exp]);
306 p_ac3dec->total_bits_read += 3;
307 if ((group_code = GetBits (&p_ac3dec->bit_stream,3)) > 6)
309 intf_WarnMsg ( 3, "ac3dec warn: invalid mantissa (3)" );
313 return (q_3[group_code] * scale_factor[exp]);
316 if (p_ac3dec->mantissa.q_4_pointer >= 0)
318 return (p_ac3dec->mantissa.q_4[p_ac3dec->mantissa.q_4_pointer--] *
322 p_ac3dec->total_bits_read += 7;
323 if ((group_code = GetBits (&p_ac3dec->bit_stream,7)) > 120)
325 intf_WarnMsg ( 3, "ac3dec warn: invalid mantissa (4)" );
329 p_ac3dec->mantissa.q_4[ 0 ] = q_4_1[group_code];
331 p_ac3dec->mantissa.q_4_pointer = 0;
333 return (q_4_0[group_code] * scale_factor[exp]);
336 p_ac3dec->total_bits_read += 4;
337 if ((group_code = GetBits (&p_ac3dec->bit_stream,4)) > 14)
339 intf_WarnMsg ( 3, "ac3dec warn: invalid mantissa (5)" );
343 return (q_5[group_code] * scale_factor[exp]);
346 group_code = GetBits (&p_ac3dec->bit_stream,qnttztab[bap]);
347 group_code <<= 16 - qnttztab[bap];
348 p_ac3dec->total_bits_read += qnttztab[bap];
350 return ((s16)(group_code) * scale_factor[exp]);
354 /* Uncouple the coupling channel into a fbw channel */
355 static __inline__ void uncouple_channel (ac3dec_t * p_ac3dec, u32 ch)
360 float cpl_coord = 1.0;
364 for (i = p_ac3dec->audblk.cplstrtmant; i < p_ac3dec->audblk.cplendmant;)
366 if (!p_ac3dec->audblk.cplbndstrc[sub_bnd++])
368 cpl_exp_tmp = p_ac3dec->audblk.cplcoexp[ch][bnd] +
369 3 * p_ac3dec->audblk.mstrcplco[ch];
370 if (p_ac3dec->audblk.cplcoexp[ch][bnd] == 15)
372 cpl_mant_tmp = (p_ac3dec->audblk.cplcomant[ch][bnd]) << 11;
376 cpl_mant_tmp = ((0x10) | p_ac3dec->audblk.cplcomant[ch][bnd]) << 10;
378 cpl_coord = (cpl_mant_tmp) * scale_factor[cpl_exp_tmp] * 8.0f;
380 /* Invert the phase for the right channel if necessary */
381 if (p_ac3dec->bsi.acmod == 0x02 && p_ac3dec->audblk.phsflginu &&
382 ch == 1 && p_ac3dec->audblk.phsflg[bnd])
389 for (j=0;j < 12; j++)
391 /* Get new dither values for each channel if necessary,
392 * so the channels are uncorrelated */
393 if (p_ac3dec->audblk.dithflag[ch] && !p_ac3dec->audblk.cpl_bap[i])
395 *(p_ac3dec->samples+ch*256+i) = cpl_coord * dither_gen(&p_ac3dec->mantissa) *
396 scale_factor[p_ac3dec->audblk.cpl_exp[i]];
398 *(p_ac3dec->samples+ch*256+i) = cpl_coord * p_ac3dec->audblk.cpl_flt[i];