1
/*****************************************************************************
2
* ac3_mantissa.h: ac3 mantissa computation
3
*****************************************************************************
4
* Copyright (C) 1999, 2000, 2001 VideoLAN
5
* $Id: ac3_mantissa.h,v 1.1 2001/11/13 12:09:17 henri 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];