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