1 /*****************************************************************************
2 * ac3_mantissa.c: ac3 mantissa computation
3 *****************************************************************************
4 * Copyright (C) 1999, 2000, 2001 VideoLAN
5 * $Id: ac3_mantissa.c,v 1.25 2001/04/30 21:04:20 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 *****************************************************************************/
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"
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 scale_factor[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 coeff_get_float (ac3dec_t * p_ac3dec, u16 bap, u16 dithflag,
272 /* If the bap is 0-5 then we have special cases to take care of */
278 return ( dither_gen(&p_ac3dec->mantissa) * scale_factor[exp] );
283 if (p_ac3dec->mantissa.q_1_pointer >= 0)
285 return (p_ac3dec->mantissa.q_1[p_ac3dec->mantissa.q_1_pointer--] *
289 p_ac3dec->total_bits_read += 5;
290 if ((group_code = GetBits (&p_ac3dec->bit_stream,5)) > 26)
292 intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (1)" );
296 p_ac3dec->mantissa.q_1[ 1 ] = q_1_1[ group_code ];
297 p_ac3dec->mantissa.q_1[ 0 ] = q_1_2[ group_code ];
299 p_ac3dec->mantissa.q_1_pointer = 1;
301 return (q_1_0[group_code] * scale_factor[exp]);
304 if (p_ac3dec->mantissa.q_2_pointer >= 0)
306 return (p_ac3dec->mantissa.q_2[p_ac3dec->mantissa.q_2_pointer--] *
310 p_ac3dec->total_bits_read += 7;
311 if ((group_code = GetBits (&p_ac3dec->bit_stream,7)) > 124)
313 intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (2)" );
317 p_ac3dec->mantissa.q_2[ 1 ] = q_2_1[ group_code ];
318 p_ac3dec->mantissa.q_2[ 0 ] = q_2_2[ group_code ];
320 p_ac3dec->mantissa.q_2_pointer = 1;
322 return (q_2_0[group_code] * scale_factor[exp]);
325 p_ac3dec->total_bits_read += 3;
326 if ((group_code = GetBits (&p_ac3dec->bit_stream,3)) > 6)
328 intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (3)" );
332 return (q_3[group_code] * scale_factor[exp]);
335 if (p_ac3dec->mantissa.q_4_pointer >= 0)
337 return (p_ac3dec->mantissa.q_4[p_ac3dec->mantissa.q_4_pointer--] *
341 p_ac3dec->total_bits_read += 7;
342 if ((group_code = GetBits (&p_ac3dec->bit_stream,7)) > 120)
344 intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (4)" );
348 p_ac3dec->mantissa.q_4[ 0 ] = q_4_1[group_code];
350 p_ac3dec->mantissa.q_4_pointer = 0;
352 return (q_4_0[group_code] * scale_factor[exp]);
355 p_ac3dec->total_bits_read += 4;
356 if ((group_code = GetBits (&p_ac3dec->bit_stream,4)) > 14)
358 intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (5)" );
362 return (q_5[group_code] * scale_factor[exp]);
365 group_code = GetBits (&p_ac3dec->bit_stream,qnttztab[bap]);
366 group_code <<= 16 - qnttztab[bap];
367 p_ac3dec->total_bits_read += qnttztab[bap];
369 return ((s16)(group_code) * scale_factor[exp]);
373 /* Uncouple the coupling channel into a fbw channel */
374 static __inline__ void uncouple_channel (ac3dec_t * p_ac3dec, u32 ch)
379 float cpl_coord = 1.0;
383 for (i = p_ac3dec->audblk.cplstrtmant; i < p_ac3dec->audblk.cplendmant;)
385 if (!p_ac3dec->audblk.cplbndstrc[sub_bnd++])
387 cpl_exp_tmp = p_ac3dec->audblk.cplcoexp[ch][bnd] +
388 3 * p_ac3dec->audblk.mstrcplco[ch];
389 if (p_ac3dec->audblk.cplcoexp[ch][bnd] == 15)
391 cpl_mant_tmp = (p_ac3dec->audblk.cplcomant[ch][bnd]) << 11;
395 cpl_mant_tmp = ((0x10) | p_ac3dec->audblk.cplcomant[ch][bnd]) << 10;
397 cpl_coord = (cpl_mant_tmp) * scale_factor[cpl_exp_tmp] * 8.0f;
399 /* Invert the phase for the right channel if necessary */
400 if (p_ac3dec->bsi.acmod == 0x02 && p_ac3dec->audblk.phsflginu &&
401 ch == 1 && p_ac3dec->audblk.phsflg[bnd])
408 for (j=0;j < 12; j++)
410 /* Get new dither values for each channel if necessary,
411 * so the channels are uncorrelated */
412 if (p_ac3dec->audblk.dithflag[ch] && !p_ac3dec->audblk.cpl_bap[i])
414 p_ac3dec->samples[ch][i] = cpl_coord * dither_gen(&p_ac3dec->mantissa) *
415 scale_factor[p_ac3dec->audblk.cpl_exp[i]];
417 p_ac3dec->samples[ch][i] = cpl_coord * p_ac3dec->audblk.cpl_flt[i];
424 void mantissa_unpack (ac3dec_t * p_ac3dec)
429 p_ac3dec->mantissa.q_1_pointer = -1;
430 p_ac3dec->mantissa.q_2_pointer = -1;
431 p_ac3dec->mantissa.q_4_pointer = -1;
433 for (i=0; i< p_ac3dec->bsi.nfchans; i++) {
434 for (j=0; j < p_ac3dec->audblk.endmant[i]; j++)
435 p_ac3dec->samples[i][j] = coeff_get_float(p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j],
436 p_ac3dec->audblk.dithflag[i], p_ac3dec->audblk.fbw_exp[i][j]);
438 if (p_ac3dec->audblk.cplinu && p_ac3dec->audblk.chincpl[i] && !(done_cpl)) {
439 /* ncplmant is equal to 12 * ncplsubnd
440 * Don't dither coupling channel until channel
441 * separation so that interchannel noise is uncorrelated
443 for (j=p_ac3dec->audblk.cplstrtmant; j < p_ac3dec->audblk.cplendmant; j++)
444 p_ac3dec->audblk.cpl_flt[j] = coeff_get_float(p_ac3dec, p_ac3dec->audblk.cpl_bap[j],
445 0, p_ac3dec->audblk.cpl_exp[j]);
450 /* uncouple the channel if necessary */
451 if (p_ac3dec->audblk.cplinu) {
452 for (i=0; i< p_ac3dec->bsi.nfchans; i++) {
453 if (p_ac3dec->audblk.chincpl[i])
454 uncouple_channel(p_ac3dec, i);
458 if (p_ac3dec->bsi.lfeon) {
459 /* There are always 7 mantissas for lfe, no dither for lfe */
460 for (j=0; j < 7 ; j++)
461 p_ac3dec->samples[5][j] = coeff_get_float(p_ac3dec, p_ac3dec->audblk.lfe_bap[j],
462 0, p_ac3dec->audblk.lfe_exp[j]);