1 /*****************************************************************************
2 * ac3_mantissa.c: ac3 mantissa computation
3 *****************************************************************************
4 * Copyright (C) 1999, 2000, 2001 VideoLAN
5 * $Id: ac3_mantissa.c,v 1.28 2001/05/14 15:58:04 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 *****************************************************************************/
28 #include <string.h> /* memcpy() */
35 #include "stream_control.h"
36 #include "input_ext-dec.h"
38 #include "audio_output.h"
40 #include "ac3_decoder.h"
44 #define Q0 ((-2 << 15) / 3.0)
46 #define Q2 ((2 << 15) / 3.0)
47 static const float q_1_0[ 32 ] =
49 Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
50 Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
51 Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
54 static const float q_1_1[ 32 ] =
56 Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
57 Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
58 Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
61 static const float q_1_2[ 32 ] =
63 Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
64 Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
65 Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
72 #define Q0 ((-4 << 15) / 5.0)
73 #define Q1 ((-2 << 15) / 5.0)
75 #define Q3 ((2 << 15) / 5.0)
76 #define Q4 ((4 << 15) / 5.0)
77 static const float q_2_0[ 128 ] =
79 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,
80 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,
81 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,
82 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,
83 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,
86 static const float q_2_1[ 128 ] =
88 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,
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,
95 static const float q_2_2[ 128 ] =
97 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,
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,
110 #define Q0 ((-10 << 15) / 11.0)
111 #define Q1 ((-8 << 15) / 11.0)
112 #define Q2 ((-6 << 15) / 11.0)
113 #define Q3 ((-4 << 15) / 11.0)
114 #define Q4 ((-2 << 15) / 11.0)
116 #define Q6 ((2 << 15) / 11.0)
117 #define Q7 ((4 << 15) / 11.0)
118 #define Q8 ((6 << 15) / 11.0)
119 #define Q9 ((8 << 15) / 11.0)
120 #define QA ((10 << 15) / 11.0)
121 static const float q_4_0[ 128 ] =
123 Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
124 Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
125 Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
126 Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3,
127 Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4,
128 Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5,
129 Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6,
130 Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7,
131 Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8,
132 Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9,
133 QA, QA, QA, QA, QA, QA, QA, QA, QA, QA, QA,
136 static const float q_4_1[ 128 ] =
138 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
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,
163 /* Lookup tables of 0.16 two's complement quantization values */
165 static const float q_3[8] =
167 (-6 << 15)/7.0, (-4 << 15)/7.0, (-2 << 15)/7.0,
168 0 , (2 << 15)/7.0, (4 << 15)/7.0,
172 static const float q_5[16] =
174 (-14 << 15)/15.0, (-12 << 15)/15.0, (-10 << 15)/15.0,
175 (-8 << 15)/15.0, (-6 << 15)/15.0, (-4 << 15)/15.0,
176 (-2 << 15)/15.0, 0 , (2 << 15)/15.0,
177 (4 << 15)/15.0, (6 << 15)/15.0, (8 << 15)/15.0,
178 (10 << 15)/15.0, (12 << 15)/15.0, (14 << 15)/15.0,
182 /* Conversion from bap to number of bits in the mantissas
183 * zeros account for cases 0,1,2,4 which are special cased */
184 static const u16 qnttztab[16] =
186 0, 0, 0, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16
189 static const float scale_factor[25] =
191 6.10351562500000000000000000e-05,
192 3.05175781250000000000000000e-05,
193 1.52587890625000000000000000e-05,
194 7.62939453125000000000000000e-06,
195 3.81469726562500000000000000e-06,
196 1.90734863281250000000000000e-06,
197 9.53674316406250000000000000e-07,
198 4.76837158203125000000000000e-07,
199 2.38418579101562500000000000e-07,
200 1.19209289550781250000000000e-07,
201 5.96046447753906250000000000e-08,
202 2.98023223876953125000000000e-08,
203 1.49011611938476562500000000e-08,
204 7.45058059692382812500000000e-09,
205 3.72529029846191406250000000e-09,
206 1.86264514923095703125000000e-09,
207 9.31322574615478515625000000e-10,
208 4.65661287307739257812500000e-10,
209 2.32830643653869628906250000e-10,
210 1.16415321826934814453125000e-10,
211 5.82076609134674072265625000e-11,
212 2.91038304567337036132812500e-11,
213 1.45519152283668518066406250e-11,
214 7.27595761418342590332031250e-12,
215 3.63797880709171295166015625e-12,
218 static const u16 dither_lut[256] =
220 0x0000, 0xa011, 0xe033, 0x4022, 0x6077, 0xc066, 0x8044, 0x2055,
221 0xc0ee, 0x60ff, 0x20dd, 0x80cc, 0xa099, 0x0088, 0x40aa, 0xe0bb,
222 0x21cd, 0x81dc, 0xc1fe, 0x61ef, 0x41ba, 0xe1ab, 0xa189, 0x0198,
223 0xe123, 0x4132, 0x0110, 0xa101, 0x8154, 0x2145, 0x6167, 0xc176,
224 0x439a, 0xe38b, 0xa3a9, 0x03b8, 0x23ed, 0x83fc, 0xc3de, 0x63cf,
225 0x8374, 0x2365, 0x6347, 0xc356, 0xe303, 0x4312, 0x0330, 0xa321,
226 0x6257, 0xc246, 0x8264, 0x2275, 0x0220, 0xa231, 0xe213, 0x4202,
227 0xa2b9, 0x02a8, 0x428a, 0xe29b, 0xc2ce, 0x62df, 0x22fd, 0x82ec,
228 0x8734, 0x2725, 0x6707, 0xc716, 0xe743, 0x4752, 0x0770, 0xa761,
229 0x47da, 0xe7cb, 0xa7e9, 0x07f8, 0x27ad, 0x87bc, 0xc79e, 0x678f,
230 0xa6f9, 0x06e8, 0x46ca, 0xe6db, 0xc68e, 0x669f, 0x26bd, 0x86ac,
231 0x6617, 0xc606, 0x8624, 0x2635, 0x0660, 0xa671, 0xe653, 0x4642,
232 0xc4ae, 0x64bf, 0x249d, 0x848c, 0xa4d9, 0x04c8, 0x44ea, 0xe4fb,
233 0x0440, 0xa451, 0xe473, 0x4462, 0x6437, 0xc426, 0x8404, 0x2415,
234 0xe563, 0x4572, 0x0550, 0xa541, 0x8514, 0x2505, 0x6527, 0xc536,
235 0x258d, 0x859c, 0xc5be, 0x65af, 0x45fa, 0xe5eb, 0xa5c9, 0x05d8,
236 0xae79, 0x0e68, 0x4e4a, 0xee5b, 0xce0e, 0x6e1f, 0x2e3d, 0x8e2c,
237 0x6e97, 0xce86, 0x8ea4, 0x2eb5, 0x0ee0, 0xaef1, 0xeed3, 0x4ec2,
238 0x8fb4, 0x2fa5, 0x6f87, 0xcf96, 0xefc3, 0x4fd2, 0x0ff0, 0xafe1,
239 0x4f5a, 0xef4b, 0xaf69, 0x0f78, 0x2f2d, 0x8f3c, 0xcf1e, 0x6f0f,
240 0xede3, 0x4df2, 0x0dd0, 0xadc1, 0x8d94, 0x2d85, 0x6da7, 0xcdb6,
241 0x2d0d, 0x8d1c, 0xcd3e, 0x6d2f, 0x4d7a, 0xed6b, 0xad49, 0x0d58,
242 0xcc2e, 0x6c3f, 0x2c1d, 0x8c0c, 0xac59, 0x0c48, 0x4c6a, 0xec7b,
243 0x0cc0, 0xacd1, 0xecf3, 0x4ce2, 0x6cb7, 0xcca6, 0x8c84, 0x2c95,
244 0x294d, 0x895c, 0xc97e, 0x696f, 0x493a, 0xe92b, 0xa909, 0x0918,
245 0xe9a3, 0x49b2, 0x0990, 0xa981, 0x89d4, 0x29c5, 0x69e7, 0xc9f6,
246 0x0880, 0xa891, 0xe8b3, 0x48a2, 0x68f7, 0xc8e6, 0x88c4, 0x28d5,
247 0xc86e, 0x687f, 0x285d, 0x884c, 0xa819, 0x0808, 0x482a, 0xe83b,
248 0x6ad7, 0xcac6, 0x8ae4, 0x2af5, 0x0aa0, 0xaab1, 0xea93, 0x4a82,
249 0xaa39, 0x0a28, 0x4a0a, 0xea1b, 0xca4e, 0x6a5f, 0x2a7d, 0x8a6c,
250 0x4b1a, 0xeb0b, 0xab29, 0x0b38, 0x2b6d, 0x8b7c, 0xcb5e, 0x6b4f,
251 0x8bf4, 0x2be5, 0x6bc7, 0xcbd6, 0xeb83, 0x4b92, 0x0bb0, 0xaba1
254 static __inline__ u16 dither_gen (mantissa_t * p_mantissa)
258 state = dither_lut[p_mantissa->lfsr_state >> 8] ^
259 (p_mantissa->lfsr_state << 8);
260 p_mantissa->lfsr_state = (u16) state;
261 return ( (state * (s32) (0.707106 * 256.0)) >> 8 );
265 /* Fetch an unpacked, left justified, and properly biased/dithered mantissa value */
266 static __inline__ float coeff_get_float (ac3dec_t * p_ac3dec, u16 bap, u16 dithflag,
271 /* If the bap is 0-5 then we have special cases to take care of */
277 return ( dither_gen(&p_ac3dec->mantissa) * scale_factor[exp] );
282 if (p_ac3dec->mantissa.q_1_pointer >= 0)
284 return (p_ac3dec->mantissa.q_1[p_ac3dec->mantissa.q_1_pointer--] *
288 p_ac3dec->total_bits_read += 5;
289 if ((group_code = GetBits (&p_ac3dec->bit_stream,5)) > 26)
291 intf_WarnMsg ( 3, "ac3dec warn: invalid mantissa (1)" );
295 p_ac3dec->mantissa.q_1[ 1 ] = q_1_1[ group_code ];
296 p_ac3dec->mantissa.q_1[ 0 ] = q_1_2[ group_code ];
298 p_ac3dec->mantissa.q_1_pointer = 1;
300 return (q_1_0[group_code] * scale_factor[exp]);
303 if (p_ac3dec->mantissa.q_2_pointer >= 0)
305 return (p_ac3dec->mantissa.q_2[p_ac3dec->mantissa.q_2_pointer--] *
309 p_ac3dec->total_bits_read += 7;
310 if ((group_code = GetBits (&p_ac3dec->bit_stream,7)) > 124)
312 intf_WarnMsg ( 3, "ac3dec warn: invalid mantissa (2)" );
316 p_ac3dec->mantissa.q_2[ 1 ] = q_2_1[ group_code ];
317 p_ac3dec->mantissa.q_2[ 0 ] = q_2_2[ group_code ];
319 p_ac3dec->mantissa.q_2_pointer = 1;
321 return (q_2_0[group_code] * scale_factor[exp]);
324 p_ac3dec->total_bits_read += 3;
325 if ((group_code = GetBits (&p_ac3dec->bit_stream,3)) > 6)
327 intf_WarnMsg ( 3, "ac3dec warn: invalid mantissa (3)" );
331 return (q_3[group_code] * scale_factor[exp]);
334 if (p_ac3dec->mantissa.q_4_pointer >= 0)
336 return (p_ac3dec->mantissa.q_4[p_ac3dec->mantissa.q_4_pointer--] *
340 p_ac3dec->total_bits_read += 7;
341 if ((group_code = GetBits (&p_ac3dec->bit_stream,7)) > 120)
343 intf_WarnMsg ( 3, "ac3dec warn: invalid mantissa (4)" );
347 p_ac3dec->mantissa.q_4[ 0 ] = q_4_1[group_code];
349 p_ac3dec->mantissa.q_4_pointer = 0;
351 return (q_4_0[group_code] * scale_factor[exp]);
354 p_ac3dec->total_bits_read += 4;
355 if ((group_code = GetBits (&p_ac3dec->bit_stream,4)) > 14)
357 intf_WarnMsg ( 3, "ac3dec warn: invalid mantissa (5)" );
361 return (q_5[group_code] * scale_factor[exp]);
364 group_code = GetBits (&p_ac3dec->bit_stream,qnttztab[bap]);
365 group_code <<= 16 - qnttztab[bap];
366 p_ac3dec->total_bits_read += qnttztab[bap];
368 return ((s16)(group_code) * scale_factor[exp]);
372 /* Uncouple the coupling channel into a fbw channel */
373 static __inline__ void uncouple_channel (ac3dec_t * p_ac3dec, u32 ch)
378 float cpl_coord = 1.0;
382 for (i = p_ac3dec->audblk.cplstrtmant; i < p_ac3dec->audblk.cplendmant;)
384 if (!p_ac3dec->audblk.cplbndstrc[sub_bnd++])
386 cpl_exp_tmp = p_ac3dec->audblk.cplcoexp[ch][bnd] +
387 3 * p_ac3dec->audblk.mstrcplco[ch];
388 if (p_ac3dec->audblk.cplcoexp[ch][bnd] == 15)
390 cpl_mant_tmp = (p_ac3dec->audblk.cplcomant[ch][bnd]) << 11;
394 cpl_mant_tmp = ((0x10) | p_ac3dec->audblk.cplcomant[ch][bnd]) << 10;
396 cpl_coord = (cpl_mant_tmp) * scale_factor[cpl_exp_tmp] * 8.0f;
398 /* Invert the phase for the right channel if necessary */
399 if (p_ac3dec->bsi.acmod == 0x02 && p_ac3dec->audblk.phsflginu &&
400 ch == 1 && p_ac3dec->audblk.phsflg[bnd])
407 for (j=0;j < 12; j++)
409 /* Get new dither values for each channel if necessary,
410 * so the channels are uncorrelated */
411 if (p_ac3dec->audblk.dithflag[ch] && !p_ac3dec->audblk.cpl_bap[i])
413 p_ac3dec->samples[ch][i] = cpl_coord * dither_gen(&p_ac3dec->mantissa) *
414 scale_factor[p_ac3dec->audblk.cpl_exp[i]];
416 p_ac3dec->samples[ch][i] = cpl_coord * p_ac3dec->audblk.cpl_flt[i];
423 void mantissa_unpack (ac3dec_t * p_ac3dec)
428 p_ac3dec->mantissa.q_1_pointer = -1;
429 p_ac3dec->mantissa.q_2_pointer = -1;
430 p_ac3dec->mantissa.q_4_pointer = -1;
432 for (i=0; i< p_ac3dec->bsi.nfchans; i++) {
433 for (j=0; j < p_ac3dec->audblk.endmant[i]; j++)
434 p_ac3dec->samples[i][j] = coeff_get_float(p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j],
435 p_ac3dec->audblk.dithflag[i], p_ac3dec->audblk.fbw_exp[i][j]);
437 if (p_ac3dec->audblk.cplinu && p_ac3dec->audblk.chincpl[i] && !(done_cpl)) {
438 /* ncplmant is equal to 12 * ncplsubnd
439 * Don't dither coupling channel until channel
440 * separation so that interchannel noise is uncorrelated
442 for (j=p_ac3dec->audblk.cplstrtmant; j < p_ac3dec->audblk.cplendmant; j++)
443 p_ac3dec->audblk.cpl_flt[j] = coeff_get_float(p_ac3dec, p_ac3dec->audblk.cpl_bap[j],
444 0, p_ac3dec->audblk.cpl_exp[j]);
449 /* uncouple the channel if necessary */
450 if (p_ac3dec->audblk.cplinu) {
451 for (i=0; i< p_ac3dec->bsi.nfchans; i++) {
452 if (p_ac3dec->audblk.chincpl[i])
453 uncouple_channel(p_ac3dec, i);
457 if (p_ac3dec->bsi.lfeon) {
458 /* There are always 7 mantissas for lfe, no dither for lfe */
459 for (j=0; j < 7 ; j++)
460 p_ac3dec->samples[5][j] = coeff_get_float(p_ac3dec, p_ac3dec->audblk.lfe_bap[j],
461 0, p_ac3dec->audblk.lfe_exp[j]);