1 /*****************************************************************************
2 * ac3_mantissa.c: ac3 mantissa computation
3 *****************************************************************************
4 * Copyright (C) 1999, 2000, 2001 VideoLAN
5 * $Id: ac3_mantissa.c,v 1.21 2001/03/21 13:42:34 sam 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 *****************************************************************************/
33 #include "stream_control.h"
34 #include "input_ext-dec.h"
36 #include "audio_output.h"
38 #include "ac3_decoder.h"
39 #include "ac3_decoder_thread.h"
41 #include "ac3_internal.h"
42 #include "ac3_bit_stream.h"
46 #define Q0 ((-2 << 15) / 3.0)
48 #define Q2 ((2 << 15) / 3.0)
49 static const float q_1_0[ 32 ] =
51 Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
52 Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
53 Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
56 static const float q_1_1[ 32 ] =
58 Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
59 Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
60 Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
63 static const float q_1_2[ 32 ] =
65 Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
66 Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
67 Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
74 #define Q0 ((-4 << 15) / 5.0)
75 #define Q1 ((-2 << 15) / 5.0)
77 #define Q3 ((2 << 15) / 5.0)
78 #define Q4 ((4 << 15) / 5.0)
79 static const float q_2_0[ 128 ] =
81 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,
82 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,
83 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,
84 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,
85 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,
88 static const float q_2_1[ 128 ] =
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,
94 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,
97 static const float q_2_2[ 128 ] =
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,
103 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,
112 #define Q0 ((-10 << 15) / 11.0)
113 #define Q1 ((-8 << 15) / 11.0)
114 #define Q2 ((-6 << 15) / 11.0)
115 #define Q3 ((-4 << 15) / 11.0)
116 #define Q4 ((-2 << 15) / 11.0)
118 #define Q6 ((2 << 15) / 11.0)
119 #define Q7 ((4 << 15) / 11.0)
120 #define Q8 ((6 << 15) / 11.0)
121 #define Q9 ((8 << 15) / 11.0)
122 #define QA ((10 << 15) / 11.0)
123 static const float q_4_0[ 128 ] =
125 Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
126 Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
127 Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
128 Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3,
129 Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4,
130 Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5,
131 Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6,
132 Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7,
133 Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8,
134 Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9,
135 QA, QA, QA, QA, QA, QA, QA, QA, QA, QA, QA,
138 static const float q_4_1[ 128 ] =
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,
150 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
165 /* Lookup tables of 0.16 two's complement quantization values */
167 static const float q_3[8] =
169 (-6 << 15)/7.0, (-4 << 15)/7.0, (-2 << 15)/7.0,
170 0 , (2 << 15)/7.0, (4 << 15)/7.0,
174 static const float q_5[16] =
176 (-14 << 15)/15.0, (-12 << 15)/15.0, (-10 << 15)/15.0,
177 (-8 << 15)/15.0, (-6 << 15)/15.0, (-4 << 15)/15.0,
178 (-2 << 15)/15.0, 0 , (2 << 15)/15.0,
179 (4 << 15)/15.0, (6 << 15)/15.0, (8 << 15)/15.0,
180 (10 << 15)/15.0, (12 << 15)/15.0, (14 << 15)/15.0,
184 /* Conversion from bap to number of bits in the mantissas
185 * zeros account for cases 0,1,2,4 which are special cased */
186 static const u16 qnttztab[16] =
188 0, 0, 0, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16
191 static const float exp_lut[ 25 ] =
193 6.10351562500000000000000000e-05,
194 3.05175781250000000000000000e-05,
195 1.52587890625000000000000000e-05,
196 7.62939453125000000000000000e-06,
197 3.81469726562500000000000000e-06,
198 1.90734863281250000000000000e-06,
199 9.53674316406250000000000000e-07,
200 4.76837158203125000000000000e-07,
201 2.38418579101562500000000000e-07,
202 1.19209289550781250000000000e-07,
203 5.96046447753906250000000000e-08,
204 2.98023223876953125000000000e-08,
205 1.49011611938476562500000000e-08,
206 7.45058059692382812500000000e-09,
207 3.72529029846191406250000000e-09,
208 1.86264514923095703125000000e-09,
209 9.31322574615478515625000000e-10,
210 4.65661287307739257812500000e-10,
211 2.32830643653869628906250000e-10,
212 1.16415321826934814453125000e-10,
213 5.82076609134674072265625000e-11,
214 2.91038304567337036132812500e-11,
215 1.45519152283668518066406250e-11,
216 7.27595761418342590332031250e-12,
217 3.63797880709171295166015625e-12,
220 static const u16 dither_lut[256] =
222 0x0000, 0xa011, 0xe033, 0x4022, 0x6077, 0xc066, 0x8044, 0x2055,
223 0xc0ee, 0x60ff, 0x20dd, 0x80cc, 0xa099, 0x0088, 0x40aa, 0xe0bb,
224 0x21cd, 0x81dc, 0xc1fe, 0x61ef, 0x41ba, 0xe1ab, 0xa189, 0x0198,
225 0xe123, 0x4132, 0x0110, 0xa101, 0x8154, 0x2145, 0x6167, 0xc176,
226 0x439a, 0xe38b, 0xa3a9, 0x03b8, 0x23ed, 0x83fc, 0xc3de, 0x63cf,
227 0x8374, 0x2365, 0x6347, 0xc356, 0xe303, 0x4312, 0x0330, 0xa321,
228 0x6257, 0xc246, 0x8264, 0x2275, 0x0220, 0xa231, 0xe213, 0x4202,
229 0xa2b9, 0x02a8, 0x428a, 0xe29b, 0xc2ce, 0x62df, 0x22fd, 0x82ec,
230 0x8734, 0x2725, 0x6707, 0xc716, 0xe743, 0x4752, 0x0770, 0xa761,
231 0x47da, 0xe7cb, 0xa7e9, 0x07f8, 0x27ad, 0x87bc, 0xc79e, 0x678f,
232 0xa6f9, 0x06e8, 0x46ca, 0xe6db, 0xc68e, 0x669f, 0x26bd, 0x86ac,
233 0x6617, 0xc606, 0x8624, 0x2635, 0x0660, 0xa671, 0xe653, 0x4642,
234 0xc4ae, 0x64bf, 0x249d, 0x848c, 0xa4d9, 0x04c8, 0x44ea, 0xe4fb,
235 0x0440, 0xa451, 0xe473, 0x4462, 0x6437, 0xc426, 0x8404, 0x2415,
236 0xe563, 0x4572, 0x0550, 0xa541, 0x8514, 0x2505, 0x6527, 0xc536,
237 0x258d, 0x859c, 0xc5be, 0x65af, 0x45fa, 0xe5eb, 0xa5c9, 0x05d8,
238 0xae79, 0x0e68, 0x4e4a, 0xee5b, 0xce0e, 0x6e1f, 0x2e3d, 0x8e2c,
239 0x6e97, 0xce86, 0x8ea4, 0x2eb5, 0x0ee0, 0xaef1, 0xeed3, 0x4ec2,
240 0x8fb4, 0x2fa5, 0x6f87, 0xcf96, 0xefc3, 0x4fd2, 0x0ff0, 0xafe1,
241 0x4f5a, 0xef4b, 0xaf69, 0x0f78, 0x2f2d, 0x8f3c, 0xcf1e, 0x6f0f,
242 0xede3, 0x4df2, 0x0dd0, 0xadc1, 0x8d94, 0x2d85, 0x6da7, 0xcdb6,
243 0x2d0d, 0x8d1c, 0xcd3e, 0x6d2f, 0x4d7a, 0xed6b, 0xad49, 0x0d58,
244 0xcc2e, 0x6c3f, 0x2c1d, 0x8c0c, 0xac59, 0x0c48, 0x4c6a, 0xec7b,
245 0x0cc0, 0xacd1, 0xecf3, 0x4ce2, 0x6cb7, 0xcca6, 0x8c84, 0x2c95,
246 0x294d, 0x895c, 0xc97e, 0x696f, 0x493a, 0xe92b, 0xa909, 0x0918,
247 0xe9a3, 0x49b2, 0x0990, 0xa981, 0x89d4, 0x29c5, 0x69e7, 0xc9f6,
248 0x0880, 0xa891, 0xe8b3, 0x48a2, 0x68f7, 0xc8e6, 0x88c4, 0x28d5,
249 0xc86e, 0x687f, 0x285d, 0x884c, 0xa819, 0x0808, 0x482a, 0xe83b,
250 0x6ad7, 0xcac6, 0x8ae4, 0x2af5, 0x0aa0, 0xaab1, 0xea93, 0x4a82,
251 0xaa39, 0x0a28, 0x4a0a, 0xea1b, 0xca4e, 0x6a5f, 0x2a7d, 0x8a6c,
252 0x4b1a, 0xeb0b, 0xab29, 0x0b38, 0x2b6d, 0x8b7c, 0xcb5e, 0x6b4f,
253 0x8bf4, 0x2be5, 0x6bc7, 0xcbd6, 0xeb83, 0x4b92, 0x0bb0, 0xaba1
256 static __inline__ u16 dither_gen (mantissa_t * p_mantissa)
260 state = dither_lut[p_mantissa->lfsr_state >> 8] ^
261 (p_mantissa->lfsr_state << 8);
262 p_mantissa->lfsr_state = (u16) state;
263 return ( (state * (s32) (0.707106 * 256.0)) >> 8 );
267 /* Fetch an unpacked, left justified, and properly biased/dithered mantissa value */
268 static __inline__ float float_get (ac3dec_t * p_ac3dec, u16 bap, u16 exp)
272 /* If the bap is 0-5 then we have special cases to take care of */
276 if (p_ac3dec->audblk.dithflag[exp])
278 return ( dither_gen(&p_ac3dec->mantissa) * exp_lut[exp] );
283 if (p_ac3dec->mantissa.q_1_pointer >= 0)
285 return (p_ac3dec->mantissa.q_1[p_ac3dec->mantissa.q_1_pointer--] * exp_lut[exp]);
288 if ((group_code = bitstream_get(&(p_ac3dec->bit_stream),5)) >= 27)
290 intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (1)" );
293 p_ac3dec->mantissa.q_1[ 1 ] = q_1_1[ group_code ];
294 p_ac3dec->mantissa.q_1[ 0 ] = q_1_2[ group_code ];
296 p_ac3dec->mantissa.q_1_pointer = 1;
298 return (q_1_0[group_code] * exp_lut[exp]);
301 if (p_ac3dec->mantissa.q_2_pointer >= 0)
303 return (p_ac3dec->mantissa.q_2[p_ac3dec->mantissa.q_2_pointer--] * exp_lut[exp]);
306 if ((group_code = bitstream_get(&(p_ac3dec->bit_stream),7)) >= 125)
308 intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (2)" );
311 p_ac3dec->mantissa.q_2[ 1 ] = q_2_1[ group_code ];
312 p_ac3dec->mantissa.q_2[ 0 ] = q_2_2[ group_code ];
314 p_ac3dec->mantissa.q_2_pointer = 1;
316 return (q_2_0[ group_code ] * exp_lut[exp]);
319 if ((group_code = bitstream_get(&(p_ac3dec->bit_stream),3)) >= 7)
321 intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (3)" );
324 return (q_3[group_code] * exp_lut[exp]);
327 if (p_ac3dec->mantissa.q_4_pointer >= 0)
329 return (p_ac3dec->mantissa.q_4[p_ac3dec->mantissa.q_4_pointer--] * exp_lut[exp]);
332 if ((group_code = bitstream_get(&(p_ac3dec->bit_stream),7)) >= 121)
334 intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (4)" );
337 p_ac3dec->mantissa.q_4[ 0 ] = q_4_1[ group_code ];
339 p_ac3dec->mantissa.q_4_pointer = 0;
341 return (q_4_0[ group_code ] * exp_lut[exp]);
344 if ((group_code = bitstream_get(&(p_ac3dec->bit_stream),4)) >= 15)
346 intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (5)" );
349 return (q_5[group_code] * exp_lut[exp]);
352 group_code = bitstream_get(&(p_ac3dec->bit_stream),qnttztab[bap]);
353 group_code <<= 16 - qnttztab[bap];
355 return ((s16)(group_code) * exp_lut[exp]);
359 static __inline__ void uncouple_channel (ac3dec_t * p_ac3dec, u32 ch)
364 float cpl_coord = 1.0;
368 for (i = p_ac3dec->audblk.cplstrtmant; i < p_ac3dec->audblk.cplendmant;)
370 if (!p_ac3dec->audblk.cplbndstrc[sub_bnd++])
372 cpl_exp_tmp = p_ac3dec->audblk.cplcoexp[ch][bnd] + 3 * p_ac3dec->audblk.mstrcplco[ch];
373 if (p_ac3dec->audblk.cplcoexp[ch][bnd] == 15)
375 cpl_mant_tmp = (p_ac3dec->audblk.cplcomant[ch][bnd]) << 11;
379 cpl_mant_tmp = ((0x10) | p_ac3dec->audblk.cplcomant[ch][bnd]) << 10;
381 cpl_coord = ((s16)cpl_mant_tmp) * exp_lut[cpl_exp_tmp] * 8.0f;
383 /* Invert the phase for the right channel if necessary */
384 if (p_ac3dec->bsi.acmod == 0x02 && p_ac3dec->audblk.phsflginu &&
385 ch == 1 && p_ac3dec->audblk.phsflg[bnd])
392 for (j=0;j < 12; j++)
394 /* Get new dither values for each channel if necessary,
395 * so the channels are uncorrelated */
396 if (p_ac3dec->audblk.dithflag[ch] && !p_ac3dec->audblk.cpl_bap[i])
398 p_ac3dec->coeffs.fbw[ch][i] = cpl_coord * dither_gen(&p_ac3dec->mantissa) *
399 exp_lut[p_ac3dec->audblk.cpl_exp[i]];
401 p_ac3dec->coeffs.fbw[ch][i] = cpl_coord * p_ac3dec->audblk.cplfbw[i];
408 void mantissa_unpack (ac3dec_t * p_ac3dec)
412 p_ac3dec->mantissa.q_1_pointer = -1;
413 p_ac3dec->mantissa.q_2_pointer = -1;
414 p_ac3dec->mantissa.q_4_pointer = -1;
416 if (p_ac3dec->audblk.cplinu)
419 for (i = 0; !p_ac3dec->audblk.chincpl[i]; i++)
421 for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++)
423 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
428 for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++)
430 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
432 for (j = p_ac3dec->audblk.cplstrtmant; j < p_ac3dec->audblk.cplendmant; j++)
434 p_ac3dec->audblk.cplfbw[j] = float_get (p_ac3dec, p_ac3dec->audblk.cpl_bap[j], p_ac3dec->audblk.cpl_exp[j]);
436 uncouple_channel (p_ac3dec, i);
439 for (i++; i < p_ac3dec->bsi.nfchans; i++)
441 for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++)
443 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
445 if (p_ac3dec->audblk.chincpl[i])
447 uncouple_channel (p_ac3dec, i);
453 for (i = 0; i < p_ac3dec->bsi.nfchans; i++)
455 for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++)
457 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
462 if (p_ac3dec->bsi.lfeon)
464 /* There are always 7 mantissas for lfe, no dither for lfe */
465 for (j = 0; j < 7; j++)
467 p_ac3dec->coeffs.lfe[j] = float_get (p_ac3dec, p_ac3dec->audblk.lfe_bap[j], p_ac3dec->audblk.lfe_exp[j]);