1 /*****************************************************************************
2 * ac3_mantissa.c: ac3 mantissa computation
3 *****************************************************************************
4 * Copyright (C) 1999, 2000, 2001 VideoLAN
6 * Authors: Michel Kaempf <maxx@via.ecp.fr>
7 * Aaron Holtzman <aholtzma@engr.uvic.ca>
8 * Renaud Dartus <reno@videolan.org>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
23 *****************************************************************************/
32 #include "stream_control.h"
33 #include "input_ext-dec.h"
35 #include "audio_output.h"
37 #include "ac3_decoder.h"
38 #include "ac3_decoder_thread.h"
40 #include "ac3_internal.h"
41 #include "ac3_bit_stream.h"
45 #define Q0 ((-2 << 15) / 3.0)
47 #define Q2 ((2 << 15) / 3.0)
48 static const float q_1_0[ 32 ] =
50 Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
51 Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
52 Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
55 static const float q_1_1[ 32 ] =
57 Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
58 Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
59 Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
62 static const float q_1_2[ 32 ] =
64 Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
65 Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
66 Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
73 #define Q0 ((-4 << 15) / 5.0)
74 #define Q1 ((-2 << 15) / 5.0)
76 #define Q3 ((2 << 15) / 5.0)
77 #define Q4 ((4 << 15) / 5.0)
78 static const float q_2_0[ 128 ] =
80 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,
81 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,
82 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,
83 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,
84 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,
87 static const float q_2_1[ 128 ] =
89 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,
90 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,
91 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,
92 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,
93 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,
96 static const float q_2_2[ 128 ] =
98 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,
99 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,
100 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,
101 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,
102 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,
111 #define Q0 ((-10 << 15) / 11.0)
112 #define Q1 ((-8 << 15) / 11.0)
113 #define Q2 ((-6 << 15) / 11.0)
114 #define Q3 ((-4 << 15) / 11.0)
115 #define Q4 ((-2 << 15) / 11.0)
117 #define Q6 ((2 << 15) / 11.0)
118 #define Q7 ((4 << 15) / 11.0)
119 #define Q8 ((6 << 15) / 11.0)
120 #define Q9 ((8 << 15) / 11.0)
121 #define QA ((10 << 15) / 11.0)
122 static const float q_4_0[ 128 ] =
124 Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
125 Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
126 Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
127 Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3,
128 Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4,
129 Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5,
130 Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6,
131 Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7,
132 Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8,
133 Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9,
134 QA, QA, QA, QA, QA, QA, QA, QA, QA, QA, QA,
137 static const float q_4_1[ 128 ] =
139 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
140 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
141 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
142 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
143 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
144 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
145 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
146 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
147 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
148 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
149 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
164 /* Lookup tables of 0.16 two's complement quantization values */
166 static const float q_3[8] =
168 (-6 << 15)/7.0, (-4 << 15)/7.0, (-2 << 15)/7.0,
169 0 , (2 << 15)/7.0, (4 << 15)/7.0,
173 static const float q_5[16] =
175 (-14 << 15)/15.0, (-12 << 15)/15.0, (-10 << 15)/15.0,
176 (-8 << 15)/15.0, (-6 << 15)/15.0, (-4 << 15)/15.0,
177 (-2 << 15)/15.0, 0 , (2 << 15)/15.0,
178 (4 << 15)/15.0, (6 << 15)/15.0, (8 << 15)/15.0,
179 (10 << 15)/15.0, (12 << 15)/15.0, (14 << 15)/15.0,
183 /* Conversion from bap to number of bits in the mantissas
184 * zeros account for cases 0,1,2,4 which are special cased */
185 static const u16 qnttztab[16] =
187 0, 0, 0, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16
190 static const float exp_lut[ 25 ] =
192 6.10351562500000000000000000e-05,
193 3.05175781250000000000000000e-05,
194 1.52587890625000000000000000e-05,
195 7.62939453125000000000000000e-06,
196 3.81469726562500000000000000e-06,
197 1.90734863281250000000000000e-06,
198 9.53674316406250000000000000e-07,
199 4.76837158203125000000000000e-07,
200 2.38418579101562500000000000e-07,
201 1.19209289550781250000000000e-07,
202 5.96046447753906250000000000e-08,
203 2.98023223876953125000000000e-08,
204 1.49011611938476562500000000e-08,
205 7.45058059692382812500000000e-09,
206 3.72529029846191406250000000e-09,
207 1.86264514923095703125000000e-09,
208 9.31322574615478515625000000e-10,
209 4.65661287307739257812500000e-10,
210 2.32830643653869628906250000e-10,
211 1.16415321826934814453125000e-10,
212 5.82076609134674072265625000e-11,
213 2.91038304567337036132812500e-11,
214 1.45519152283668518066406250e-11,
215 7.27595761418342590332031250e-12,
216 3.63797880709171295166015625e-12,
219 static const u16 dither_lut[256] =
221 0x0000, 0xa011, 0xe033, 0x4022, 0x6077, 0xc066, 0x8044, 0x2055,
222 0xc0ee, 0x60ff, 0x20dd, 0x80cc, 0xa099, 0x0088, 0x40aa, 0xe0bb,
223 0x21cd, 0x81dc, 0xc1fe, 0x61ef, 0x41ba, 0xe1ab, 0xa189, 0x0198,
224 0xe123, 0x4132, 0x0110, 0xa101, 0x8154, 0x2145, 0x6167, 0xc176,
225 0x439a, 0xe38b, 0xa3a9, 0x03b8, 0x23ed, 0x83fc, 0xc3de, 0x63cf,
226 0x8374, 0x2365, 0x6347, 0xc356, 0xe303, 0x4312, 0x0330, 0xa321,
227 0x6257, 0xc246, 0x8264, 0x2275, 0x0220, 0xa231, 0xe213, 0x4202,
228 0xa2b9, 0x02a8, 0x428a, 0xe29b, 0xc2ce, 0x62df, 0x22fd, 0x82ec,
229 0x8734, 0x2725, 0x6707, 0xc716, 0xe743, 0x4752, 0x0770, 0xa761,
230 0x47da, 0xe7cb, 0xa7e9, 0x07f8, 0x27ad, 0x87bc, 0xc79e, 0x678f,
231 0xa6f9, 0x06e8, 0x46ca, 0xe6db, 0xc68e, 0x669f, 0x26bd, 0x86ac,
232 0x6617, 0xc606, 0x8624, 0x2635, 0x0660, 0xa671, 0xe653, 0x4642,
233 0xc4ae, 0x64bf, 0x249d, 0x848c, 0xa4d9, 0x04c8, 0x44ea, 0xe4fb,
234 0x0440, 0xa451, 0xe473, 0x4462, 0x6437, 0xc426, 0x8404, 0x2415,
235 0xe563, 0x4572, 0x0550, 0xa541, 0x8514, 0x2505, 0x6527, 0xc536,
236 0x258d, 0x859c, 0xc5be, 0x65af, 0x45fa, 0xe5eb, 0xa5c9, 0x05d8,
237 0xae79, 0x0e68, 0x4e4a, 0xee5b, 0xce0e, 0x6e1f, 0x2e3d, 0x8e2c,
238 0x6e97, 0xce86, 0x8ea4, 0x2eb5, 0x0ee0, 0xaef1, 0xeed3, 0x4ec2,
239 0x8fb4, 0x2fa5, 0x6f87, 0xcf96, 0xefc3, 0x4fd2, 0x0ff0, 0xafe1,
240 0x4f5a, 0xef4b, 0xaf69, 0x0f78, 0x2f2d, 0x8f3c, 0xcf1e, 0x6f0f,
241 0xede3, 0x4df2, 0x0dd0, 0xadc1, 0x8d94, 0x2d85, 0x6da7, 0xcdb6,
242 0x2d0d, 0x8d1c, 0xcd3e, 0x6d2f, 0x4d7a, 0xed6b, 0xad49, 0x0d58,
243 0xcc2e, 0x6c3f, 0x2c1d, 0x8c0c, 0xac59, 0x0c48, 0x4c6a, 0xec7b,
244 0x0cc0, 0xacd1, 0xecf3, 0x4ce2, 0x6cb7, 0xcca6, 0x8c84, 0x2c95,
245 0x294d, 0x895c, 0xc97e, 0x696f, 0x493a, 0xe92b, 0xa909, 0x0918,
246 0xe9a3, 0x49b2, 0x0990, 0xa981, 0x89d4, 0x29c5, 0x69e7, 0xc9f6,
247 0x0880, 0xa891, 0xe8b3, 0x48a2, 0x68f7, 0xc8e6, 0x88c4, 0x28d5,
248 0xc86e, 0x687f, 0x285d, 0x884c, 0xa819, 0x0808, 0x482a, 0xe83b,
249 0x6ad7, 0xcac6, 0x8ae4, 0x2af5, 0x0aa0, 0xaab1, 0xea93, 0x4a82,
250 0xaa39, 0x0a28, 0x4a0a, 0xea1b, 0xca4e, 0x6a5f, 0x2a7d, 0x8a6c,
251 0x4b1a, 0xeb0b, 0xab29, 0x0b38, 0x2b6d, 0x8b7c, 0xcb5e, 0x6b4f,
252 0x8bf4, 0x2be5, 0x6bc7, 0xcbd6, 0xeb83, 0x4b92, 0x0bb0, 0xaba1
255 static __inline__ u16 dither_gen (mantissa_t * p_mantissa)
259 state = dither_lut[p_mantissa->lfsr_state >> 8] ^
260 (p_mantissa->lfsr_state << 8);
261 p_mantissa->lfsr_state = (u16) state;
262 return ( (state * (s32) (0.707106 * 256.0)) >> 8 );
266 /* Fetch an unpacked, left justified, and properly biased/dithered mantissa value */
267 static __inline__ float float_get (ac3dec_t * p_ac3dec, u16 bap, u16 exp)
271 /* If the bap is 0-5 then we have special cases to take care of */
275 if (p_ac3dec->audblk.dithflag[exp])
277 return ( dither_gen(&p_ac3dec->mantissa) * exp_lut[exp] );
282 if (p_ac3dec->mantissa.q_1_pointer >= 0)
284 return (p_ac3dec->mantissa.q_1[p_ac3dec->mantissa.q_1_pointer--] * exp_lut[exp]);
287 if ((group_code = bitstream_get(&(p_ac3dec->bit_stream),5)) >= 27)
289 intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (1)" );
292 p_ac3dec->mantissa.q_1[ 1 ] = q_1_1[ group_code ];
293 p_ac3dec->mantissa.q_1[ 0 ] = q_1_2[ group_code ];
295 p_ac3dec->mantissa.q_1_pointer = 1;
297 return (q_1_0[group_code] * exp_lut[exp]);
300 if (p_ac3dec->mantissa.q_2_pointer >= 0)
302 return (p_ac3dec->mantissa.q_2[p_ac3dec->mantissa.q_2_pointer--] * exp_lut[exp]);
305 if ((group_code = bitstream_get(&(p_ac3dec->bit_stream),7)) >= 125)
307 intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (2)" );
310 p_ac3dec->mantissa.q_2[ 1 ] = q_2_1[ group_code ];
311 p_ac3dec->mantissa.q_2[ 0 ] = q_2_2[ group_code ];
313 p_ac3dec->mantissa.q_2_pointer = 1;
315 return (q_2_0[ group_code ] * exp_lut[exp]);
318 if ((group_code = bitstream_get(&(p_ac3dec->bit_stream),3)) >= 7)
320 intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (3)" );
323 return (q_3[group_code] * exp_lut[exp]);
326 if (p_ac3dec->mantissa.q_4_pointer >= 0)
328 return (p_ac3dec->mantissa.q_4[p_ac3dec->mantissa.q_4_pointer--] * exp_lut[exp]);
331 if ((group_code = bitstream_get(&(p_ac3dec->bit_stream),7)) >= 121)
333 intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (4)" );
336 p_ac3dec->mantissa.q_4[ 0 ] = q_4_1[ group_code ];
338 p_ac3dec->mantissa.q_4_pointer = 0;
340 return (q_4_0[ group_code ] * exp_lut[exp]);
343 if ((group_code = bitstream_get(&(p_ac3dec->bit_stream),4)) >= 15)
345 intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (5)" );
348 return (q_5[group_code] * exp_lut[exp]);
351 group_code = bitstream_get(&(p_ac3dec->bit_stream),qnttztab[bap]);
352 group_code <<= 16 - qnttztab[bap];
354 return ((s16)(group_code) * exp_lut[exp]);
358 static __inline__ void uncouple_channel (ac3dec_t * p_ac3dec, u32 ch)
363 float cpl_coord = 1.0;
367 for (i = p_ac3dec->audblk.cplstrtmant; i < p_ac3dec->audblk.cplendmant;)
369 if (!p_ac3dec->audblk.cplbndstrc[sub_bnd++])
371 cpl_exp_tmp = p_ac3dec->audblk.cplcoexp[ch][bnd] + 3 * p_ac3dec->audblk.mstrcplco[ch];
372 if (p_ac3dec->audblk.cplcoexp[ch][bnd] == 15)
374 cpl_mant_tmp = (p_ac3dec->audblk.cplcomant[ch][bnd]) << 11;
378 cpl_mant_tmp = ((0x10) | p_ac3dec->audblk.cplcomant[ch][bnd]) << 10;
380 cpl_coord = ((s16)cpl_mant_tmp) * exp_lut[cpl_exp_tmp] * 8.0f;
382 /* Invert the phase for the right channel if necessary */
383 if (p_ac3dec->bsi.acmod == 0x02 && p_ac3dec->audblk.phsflginu &&
384 ch == 1 && p_ac3dec->audblk.phsflg[bnd])
391 for (j=0;j < 12; j++)
393 /* Get new dither values for each channel if necessary,
394 * so the channels are uncorrelated */
395 if (p_ac3dec->audblk.dithflag[ch] && !p_ac3dec->audblk.cpl_bap[i])
397 p_ac3dec->coeffs.fbw[ch][i] = cpl_coord * dither_gen(&p_ac3dec->mantissa) *
398 exp_lut[p_ac3dec->audblk.cpl_exp[i]];
400 p_ac3dec->coeffs.fbw[ch][i] = cpl_coord * p_ac3dec->audblk.cplfbw[i];
407 void mantissa_unpack (ac3dec_t * p_ac3dec)
411 p_ac3dec->mantissa.q_1_pointer = -1;
412 p_ac3dec->mantissa.q_2_pointer = -1;
413 p_ac3dec->mantissa.q_4_pointer = -1;
415 if (p_ac3dec->audblk.cplinu)
418 for (i = 0; !p_ac3dec->audblk.chincpl[i]; i++)
420 for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++)
422 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
427 for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++)
429 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
431 for (j = p_ac3dec->audblk.cplstrtmant; j < p_ac3dec->audblk.cplendmant; j++)
433 p_ac3dec->audblk.cplfbw[j] = float_get (p_ac3dec, p_ac3dec->audblk.cpl_bap[j], p_ac3dec->audblk.cpl_exp[j]);
435 uncouple_channel (p_ac3dec, i);
438 for (i++; i < p_ac3dec->bsi.nfchans; i++)
440 for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++)
442 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
444 if (p_ac3dec->audblk.chincpl[i])
446 uncouple_channel (p_ac3dec, i);
452 for (i = 0; i < p_ac3dec->bsi.nfchans; i++)
454 for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++)
456 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
461 if (p_ac3dec->bsi.lfeon)
463 /* There are always 7 mantissas for lfe, no dither for lfe */
464 for (j = 0; j < 7; j++)
466 p_ac3dec->coeffs.lfe[j] = float_get (p_ac3dec, p_ac3dec->audblk.lfe_bap[j], p_ac3dec->audblk.lfe_exp[j]);