]> git.sesse.net Git - vlc/blob - src/ac3_decoder/ac3_mantissa.c
b95e5e5952bde9a65293e2b2af0c2d0bcad2f572
[vlc] / src / ac3_decoder / ac3_mantissa.c
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 $
6  *
7  * Authors: Michel Kaempf <maxx@via.ecp.fr>
8  *          Aaron Holtzman <aholtzma@engr.uvic.ca>
9  *          Renaud Dartus <reno@videolan.org>
10  *
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.
15  * 
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.
20  *
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  *****************************************************************************/
25
26 #include "defs.h"
27
28 #include <string.h>                                              /* memcpy() */
29
30 #include "config.h"
31 #include "common.h"
32 #include "threads.h"
33 #include "mtime.h"
34
35 #include "stream_control.h"
36 #include "input_ext-dec.h"
37
38 #include "audio_output.h"
39
40 #include "ac3_decoder.h"
41
42 #include "intf_msg.h"
43
44 #define Q0 ((-2 << 15) / 3.0)
45 #define Q1 (0)
46 #define Q2 ((2 << 15) / 3.0)
47 static const float q_1_0[ 32 ] =
48 {
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,
52     0, 0, 0, 0, 0
53 };
54 static const float q_1_1[ 32 ] =
55 {
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,
59     0, 0, 0, 0, 0
60 };
61 static const float q_1_2[ 32 ] =
62 {
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,
66     0, 0, 0, 0, 0
67 };
68 #undef Q0
69 #undef Q1
70 #undef Q2
71
72 #define Q0 ((-4 << 15) / 5.0)
73 #define Q1 ((-2 << 15) / 5.0)
74 #define Q2 (0)
75 #define Q3 ((2 << 15) / 5.0)
76 #define Q4 ((4 << 15) / 5.0)
77 static const float q_2_0[ 128 ] =
78 {
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,
84     0, 0, 0
85 };
86 static const float q_2_1[ 128 ] =
87 {
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,
93     0, 0, 0
94 };
95 static const float q_2_2[ 128 ] =
96 {
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,
102     0, 0, 0
103 };
104 #undef Q0
105 #undef Q1
106 #undef Q2
107 #undef Q3
108 #undef Q4
109
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)
115 #define Q5 (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 ] =
122 {
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,
134     0,  0,  0,  0,  0,  0,  0
135 };
136 static const float q_4_1[ 128 ] =
137 {
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,
149     0,  0,  0,  0,  0,  0,  0
150 };
151 #undef Q0
152 #undef Q1
153 #undef Q2
154 #undef Q3
155 #undef Q4
156 #undef Q5
157 #undef Q6
158 #undef Q7
159 #undef Q8
160 #undef Q9
161 #undef QA
162
163 /* Lookup tables of 0.16 two's complement quantization values */
164
165 static const float q_3[8] =
166 {
167     (-6 << 15)/7.0, (-4 << 15)/7.0, (-2 << 15)/7.0,
168     0           , (2 << 15)/7.0, (4 << 15)/7.0,
169     (6 << 15)/7.0, 0
170 };
171
172 static const float q_5[16] =
173 {
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,
179     0
180 };
181
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] =
185 {
186     0, 0, 0, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16
187 };
188
189 static const float scale_factor[25] =
190 {
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,
216 };
217
218 static const u16 dither_lut[256] =
219 {
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
252 };
253
254 static __inline__ u16 dither_gen (mantissa_t * p_mantissa)
255 {
256         s16 state;
257
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 );
262 }
263
264
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,
267                                    u16 exp)
268 {
269     u16 group_code = 0;
270
271     /* If the bap is 0-5 then we have special cases to take care of */
272     switch (bap)
273     {
274         case 0:
275             if (dithflag)
276             {
277                 return ( dither_gen(&p_ac3dec->mantissa) * scale_factor[exp] );
278             }    
279             return (0);
280
281         case 1:
282             if (p_ac3dec->mantissa.q_1_pointer >= 0)
283             {
284                 return (p_ac3dec->mantissa.q_1[p_ac3dec->mantissa.q_1_pointer--] *
285                         scale_factor[exp]);
286             }
287
288             p_ac3dec->total_bits_read += 5;
289             if ((group_code = GetBits (&p_ac3dec->bit_stream,5)) > 26)
290             {
291                 intf_WarnMsg ( 3, "ac3dec warn: invalid mantissa (1)" );
292                 return 0;
293             }
294     
295             p_ac3dec->mantissa.q_1[ 1 ] = q_1_1[ group_code ];
296             p_ac3dec->mantissa.q_1[ 0 ] = q_1_2[ group_code ];
297     
298             p_ac3dec->mantissa.q_1_pointer = 1;
299     
300             return (q_1_0[group_code] * scale_factor[exp]);
301     
302         case 2:
303             if (p_ac3dec->mantissa.q_2_pointer >= 0)
304             {
305                 return (p_ac3dec->mantissa.q_2[p_ac3dec->mantissa.q_2_pointer--] *
306                         scale_factor[exp]);
307             }
308             
309             p_ac3dec->total_bits_read += 7;
310             if ((group_code = GetBits (&p_ac3dec->bit_stream,7)) > 124)
311             {
312                 intf_WarnMsg ( 3, "ac3dec warn: invalid mantissa (2)" );
313                 return 0;
314             }
315
316             p_ac3dec->mantissa.q_2[ 1 ] = q_2_1[ group_code ];
317             p_ac3dec->mantissa.q_2[ 0 ] = q_2_2[ group_code ];
318
319             p_ac3dec->mantissa.q_2_pointer = 1;
320
321             return (q_2_0[group_code] * scale_factor[exp]);
322
323         case 3:
324             p_ac3dec->total_bits_read += 3;
325             if ((group_code = GetBits (&p_ac3dec->bit_stream,3)) > 6)
326             {
327                 intf_WarnMsg ( 3, "ac3dec warn: invalid mantissa (3)" );
328                 return 0;
329             }
330
331             return (q_3[group_code] * scale_factor[exp]);
332
333         case 4:
334             if (p_ac3dec->mantissa.q_4_pointer >= 0)
335             {
336                 return (p_ac3dec->mantissa.q_4[p_ac3dec->mantissa.q_4_pointer--] *
337                         scale_factor[exp]);
338             }
339
340             p_ac3dec->total_bits_read += 7;
341             if ((group_code = GetBits (&p_ac3dec->bit_stream,7)) > 120)
342             {
343                 intf_WarnMsg ( 3, "ac3dec warn: invalid mantissa (4)" );
344                 return 0;
345             }
346
347             p_ac3dec->mantissa.q_4[ 0 ] = q_4_1[group_code];
348
349             p_ac3dec->mantissa.q_4_pointer = 0;
350
351             return (q_4_0[group_code] * scale_factor[exp]);
352
353         case 5:
354             p_ac3dec->total_bits_read += 4;
355             if ((group_code = GetBits (&p_ac3dec->bit_stream,4)) > 14)
356             {
357                 intf_WarnMsg ( 3, "ac3dec warn: invalid mantissa (5)" );
358                 return 0;
359             }
360
361             return (q_5[group_code] * scale_factor[exp]);
362
363         default:
364             group_code = GetBits (&p_ac3dec->bit_stream,qnttztab[bap]);
365             group_code <<= 16 - qnttztab[bap];
366             p_ac3dec->total_bits_read += qnttztab[bap];
367
368             return ((s16)(group_code) * scale_factor[exp]);
369     }
370 }
371
372 /* Uncouple the coupling channel into a fbw channel */
373 static __inline__ void uncouple_channel (ac3dec_t * p_ac3dec, u32 ch)
374 {
375     u32 bnd = 0;
376     u32 sub_bnd = 0;
377     u32 i,j;
378     float cpl_coord = 1.0;
379     u32 cpl_exp_tmp;
380     u32 cpl_mant_tmp;
381
382     for (i = p_ac3dec->audblk.cplstrtmant; i < p_ac3dec->audblk.cplendmant;)
383     {
384         if (!p_ac3dec->audblk.cplbndstrc[sub_bnd++])
385         {
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)
389             {
390                 cpl_mant_tmp = (p_ac3dec->audblk.cplcomant[ch][bnd]) << 11;
391             }
392             else
393             {
394                 cpl_mant_tmp = ((0x10) | p_ac3dec->audblk.cplcomant[ch][bnd]) << 10;
395             }
396             cpl_coord = (cpl_mant_tmp) * scale_factor[cpl_exp_tmp] * 8.0f;
397
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])
401             {
402                 cpl_coord *= -1;
403             }
404             bnd++;
405         }
406
407         for (j=0;j < 12; j++)
408         {
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])
412             {
413                 p_ac3dec->samples[ch][i] = cpl_coord * dither_gen(&p_ac3dec->mantissa) *
414                     scale_factor[p_ac3dec->audblk.cpl_exp[i]];
415             } else {
416                 p_ac3dec->samples[ch][i]  = cpl_coord * p_ac3dec->audblk.cpl_flt[i];
417             }
418             i++;
419         }
420     }
421 }
422
423 void mantissa_unpack (ac3dec_t * p_ac3dec)
424 {
425     int i, j;
426     u32 done_cpl = 0;
427
428     p_ac3dec->mantissa.q_1_pointer = -1;
429     p_ac3dec->mantissa.q_2_pointer = -1;
430     p_ac3dec->mantissa.q_4_pointer = -1;
431
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]);
436
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 
441          */
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]);
445             done_cpl = 1;
446         }
447     }
448     
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);
454         }
455     }
456
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]);
462     }
463 }
464