]> git.sesse.net Git - vlc/blob - src/ac3_decoder/ac3_mantissa.c
* Header cleaning: filled all empty authors fields, added CVS $Id stuff.
[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.21 2001/03/21 13:42:34 sam 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 #include "ac3_bit_stream.h"
43
44 #include "intf_msg.h"
45
46 #define Q0 ((-2 << 15) / 3.0)
47 #define Q1 (0)
48 #define Q2 ((2 << 15) / 3.0)
49 static const float q_1_0[ 32 ] =
50 {
51     Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
52     Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
53     Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
54     0, 0, 0, 0, 0
55 };
56 static const float q_1_1[ 32 ] =
57 {
58     Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
59     Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
60     Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
61     0, 0, 0, 0, 0
62 };
63 static const float q_1_2[ 32 ] =
64 {
65     Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
66     Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
67     Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
68     0, 0, 0, 0, 0
69 };
70 #undef Q0
71 #undef Q1
72 #undef Q2
73
74 #define Q0 ((-4 << 15) / 5.0)
75 #define Q1 ((-2 << 15) / 5.0)
76 #define Q2 (0)
77 #define Q3 ((2 << 15) / 5.0)
78 #define Q4 ((4 << 15) / 5.0)
79 static const float q_2_0[ 128 ] =
80 {
81     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,
82     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,
83     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,
84     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,
85     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     0, 0, 0
87 };
88 static const float q_2_1[ 128 ] =
89 {
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     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     0, 0, 0
96 };
97 static const float q_2_2[ 128 ] =
98 {
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     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,
104     0, 0, 0
105 };
106 #undef Q0
107 #undef Q1
108 #undef Q2
109 #undef Q3
110 #undef Q4
111
112 #define Q0 ((-10 << 15) / 11.0)
113 #define Q1 ((-8 << 15) / 11.0)
114 #define Q2 ((-6 << 15) / 11.0)
115 #define Q3 ((-4 << 15) / 11.0)
116 #define Q4 ((-2 << 15) / 11.0)
117 #define Q5 (0)
118 #define Q6 ((2 << 15) / 11.0)
119 #define Q7 ((4 << 15) / 11.0)
120 #define Q8 ((6 << 15) / 11.0)
121 #define Q9 ((8 << 15) / 11.0)
122 #define QA ((10 << 15) / 11.0)
123 static const float q_4_0[ 128 ] =
124 {
125     Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
126     Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
127     Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
128     Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3,
129     Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4,
130     Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5,
131     Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6,
132     Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7,
133     Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8,
134     Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9,
135     QA, QA, QA, QA, QA, QA, QA, QA, QA, QA, QA,
136     0,  0,  0,  0,  0,  0,  0
137 };
138 static const float q_4_1[ 128 ] =
139 {
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     Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
151     0,  0,  0,  0,  0,  0,  0
152 };
153 #undef Q0
154 #undef Q1
155 #undef Q2
156 #undef Q3
157 #undef Q4
158 #undef Q5
159 #undef Q6
160 #undef Q7
161 #undef Q8
162 #undef Q9
163 #undef QA
164
165 /* Lookup tables of 0.16 two's complement quantization values */
166
167 static const float q_3[8] =
168 {
169     (-6 << 15)/7.0, (-4 << 15)/7.0, (-2 << 15)/7.0,
170     0           , (2 << 15)/7.0, (4 << 15)/7.0,
171     (6 << 15)/7.0, 0
172 };
173
174 static const float q_5[16] =
175 {
176     (-14 << 15)/15.0, (-12 << 15)/15.0, (-10 << 15)/15.0,
177     (-8 << 15)/15.0,  (-6 << 15)/15.0,  (-4 << 15)/15.0,
178     (-2 << 15)/15.0,  0            ,    (2 << 15)/15.0,
179     (4 << 15)/15.0,   (6 << 15)/15.0,   (8 << 15)/15.0,
180     (10 << 15)/15.0,  (12 << 15)/15.0,  (14 << 15)/15.0,
181     0
182 };
183
184 /* Conversion from bap to number of bits in the mantissas
185  * zeros account for cases 0,1,2,4 which are special cased */
186 static const u16 qnttztab[16] =
187 {
188     0, 0, 0, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16
189 };
190
191 static const float exp_lut[ 25 ] =
192 {
193     6.10351562500000000000000000e-05,
194     3.05175781250000000000000000e-05,
195     1.52587890625000000000000000e-05,
196     7.62939453125000000000000000e-06,
197     3.81469726562500000000000000e-06,
198     1.90734863281250000000000000e-06,
199     9.53674316406250000000000000e-07,
200     4.76837158203125000000000000e-07,
201     2.38418579101562500000000000e-07,
202     1.19209289550781250000000000e-07,
203     5.96046447753906250000000000e-08,
204     2.98023223876953125000000000e-08,
205     1.49011611938476562500000000e-08,
206     7.45058059692382812500000000e-09,
207     3.72529029846191406250000000e-09,
208     1.86264514923095703125000000e-09,
209     9.31322574615478515625000000e-10,
210     4.65661287307739257812500000e-10,
211     2.32830643653869628906250000e-10,
212     1.16415321826934814453125000e-10,
213     5.82076609134674072265625000e-11,
214     2.91038304567337036132812500e-11,
215     1.45519152283668518066406250e-11,
216     7.27595761418342590332031250e-12,
217     3.63797880709171295166015625e-12,
218 };
219
220 static const u16 dither_lut[256] =
221 {
222  0x0000, 0xa011, 0xe033, 0x4022, 0x6077, 0xc066, 0x8044, 0x2055,
223  0xc0ee, 0x60ff, 0x20dd, 0x80cc, 0xa099, 0x0088, 0x40aa, 0xe0bb,
224  0x21cd, 0x81dc, 0xc1fe, 0x61ef, 0x41ba, 0xe1ab, 0xa189, 0x0198,
225  0xe123, 0x4132, 0x0110, 0xa101, 0x8154, 0x2145, 0x6167, 0xc176,
226  0x439a, 0xe38b, 0xa3a9, 0x03b8, 0x23ed, 0x83fc, 0xc3de, 0x63cf,
227  0x8374, 0x2365, 0x6347, 0xc356, 0xe303, 0x4312, 0x0330, 0xa321,
228  0x6257, 0xc246, 0x8264, 0x2275, 0x0220, 0xa231, 0xe213, 0x4202,
229  0xa2b9, 0x02a8, 0x428a, 0xe29b, 0xc2ce, 0x62df, 0x22fd, 0x82ec,
230  0x8734, 0x2725, 0x6707, 0xc716, 0xe743, 0x4752, 0x0770, 0xa761,
231  0x47da, 0xe7cb, 0xa7e9, 0x07f8, 0x27ad, 0x87bc, 0xc79e, 0x678f,
232  0xa6f9, 0x06e8, 0x46ca, 0xe6db, 0xc68e, 0x669f, 0x26bd, 0x86ac,
233  0x6617, 0xc606, 0x8624, 0x2635, 0x0660, 0xa671, 0xe653, 0x4642,
234  0xc4ae, 0x64bf, 0x249d, 0x848c, 0xa4d9, 0x04c8, 0x44ea, 0xe4fb,
235  0x0440, 0xa451, 0xe473, 0x4462, 0x6437, 0xc426, 0x8404, 0x2415,
236  0xe563, 0x4572, 0x0550, 0xa541, 0x8514, 0x2505, 0x6527, 0xc536,
237  0x258d, 0x859c, 0xc5be, 0x65af, 0x45fa, 0xe5eb, 0xa5c9, 0x05d8,
238  0xae79, 0x0e68, 0x4e4a, 0xee5b, 0xce0e, 0x6e1f, 0x2e3d, 0x8e2c,
239  0x6e97, 0xce86, 0x8ea4, 0x2eb5, 0x0ee0, 0xaef1, 0xeed3, 0x4ec2,
240  0x8fb4, 0x2fa5, 0x6f87, 0xcf96, 0xefc3, 0x4fd2, 0x0ff0, 0xafe1,
241  0x4f5a, 0xef4b, 0xaf69, 0x0f78, 0x2f2d, 0x8f3c, 0xcf1e, 0x6f0f,
242  0xede3, 0x4df2, 0x0dd0, 0xadc1, 0x8d94, 0x2d85, 0x6da7, 0xcdb6,
243  0x2d0d, 0x8d1c, 0xcd3e, 0x6d2f, 0x4d7a, 0xed6b, 0xad49, 0x0d58,
244  0xcc2e, 0x6c3f, 0x2c1d, 0x8c0c, 0xac59, 0x0c48, 0x4c6a, 0xec7b,
245  0x0cc0, 0xacd1, 0xecf3, 0x4ce2, 0x6cb7, 0xcca6, 0x8c84, 0x2c95,
246  0x294d, 0x895c, 0xc97e, 0x696f, 0x493a, 0xe92b, 0xa909, 0x0918,
247  0xe9a3, 0x49b2, 0x0990, 0xa981, 0x89d4, 0x29c5, 0x69e7, 0xc9f6,
248  0x0880, 0xa891, 0xe8b3, 0x48a2, 0x68f7, 0xc8e6, 0x88c4, 0x28d5,
249  0xc86e, 0x687f, 0x285d, 0x884c, 0xa819, 0x0808, 0x482a, 0xe83b,
250  0x6ad7, 0xcac6, 0x8ae4, 0x2af5, 0x0aa0, 0xaab1, 0xea93, 0x4a82,
251  0xaa39, 0x0a28, 0x4a0a, 0xea1b, 0xca4e, 0x6a5f, 0x2a7d, 0x8a6c,
252  0x4b1a, 0xeb0b, 0xab29, 0x0b38, 0x2b6d, 0x8b7c, 0xcb5e, 0x6b4f,
253  0x8bf4, 0x2be5, 0x6bc7, 0xcbd6, 0xeb83, 0x4b92, 0x0bb0, 0xaba1
254 };
255
256 static __inline__ u16 dither_gen (mantissa_t * p_mantissa)
257 {
258         s16 state;
259
260         state = dither_lut[p_mantissa->lfsr_state >> 8] ^ 
261                     (p_mantissa->lfsr_state << 8);
262         p_mantissa->lfsr_state = (u16) state;
263         return ( (state * (s32) (0.707106 * 256.0)) >> 8 );
264 }
265
266
267 /* Fetch an unpacked, left justified, and properly biased/dithered mantissa value */
268 static __inline__ float float_get (ac3dec_t * p_ac3dec, u16 bap, u16 exp)
269 {
270     u32 group_code;
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 (p_ac3dec->audblk.dithflag[exp])
277         {
278             return ( dither_gen(&p_ac3dec->mantissa) * exp_lut[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--] * exp_lut[exp]);
286         }
287
288         if ((group_code = bitstream_get(&(p_ac3dec->bit_stream),5)) >= 27)
289         {
290             intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (1)" );
291         }
292
293         p_ac3dec->mantissa.q_1[ 1 ] = q_1_1[ group_code ];
294         p_ac3dec->mantissa.q_1[ 0 ] = q_1_2[ group_code ];
295
296         p_ac3dec->mantissa.q_1_pointer = 1;
297
298         return (q_1_0[group_code] * exp_lut[exp]);
299
300     case 2:
301         if (p_ac3dec->mantissa.q_2_pointer >= 0)
302         {
303             return (p_ac3dec->mantissa.q_2[p_ac3dec->mantissa.q_2_pointer--] * exp_lut[exp]);
304         }
305         
306         if ((group_code = bitstream_get(&(p_ac3dec->bit_stream),7)) >= 125)
307         {
308             intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (2)" );
309         }
310
311         p_ac3dec->mantissa.q_2[ 1 ] = q_2_1[ group_code ];
312         p_ac3dec->mantissa.q_2[ 0 ] = q_2_2[ group_code ];
313
314         p_ac3dec->mantissa.q_2_pointer = 1;
315
316         return (q_2_0[ group_code ] * exp_lut[exp]);
317
318     case 3:
319         if ((group_code = bitstream_get(&(p_ac3dec->bit_stream),3)) >= 7)
320         {
321             intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (3)" );
322         }
323
324         return (q_3[group_code] * exp_lut[exp]);
325
326     case 4:
327         if (p_ac3dec->mantissa.q_4_pointer >= 0)
328         {
329             return (p_ac3dec->mantissa.q_4[p_ac3dec->mantissa.q_4_pointer--] * exp_lut[exp]);
330         }
331
332         if ((group_code = bitstream_get(&(p_ac3dec->bit_stream),7)) >= 121)
333         {
334             intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (4)" );
335         }
336
337         p_ac3dec->mantissa.q_4[ 0 ] = q_4_1[ group_code ];
338
339         p_ac3dec->mantissa.q_4_pointer = 0;
340
341         return (q_4_0[ group_code ] * exp_lut[exp]);
342
343     case 5:
344         if ((group_code = bitstream_get(&(p_ac3dec->bit_stream),4)) >= 15)
345         {
346             intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (5)" );
347         }
348
349         return (q_5[group_code] * exp_lut[exp]);
350
351     default:
352         group_code = bitstream_get(&(p_ac3dec->bit_stream),qnttztab[bap]);
353         group_code <<= 16 - qnttztab[bap];
354
355         return ((s16)(group_code) * exp_lut[exp]);
356     }
357 }
358
359 static __inline__ void uncouple_channel (ac3dec_t * p_ac3dec, u32 ch)
360 {
361     u32 bnd = 0;
362     u32 sub_bnd = 0;
363     u32 i,j;
364     float cpl_coord = 1.0;
365     u32 cpl_exp_tmp;
366     u32 cpl_mant_tmp;
367
368     for (i = p_ac3dec->audblk.cplstrtmant; i < p_ac3dec->audblk.cplendmant;)
369     {
370         if (!p_ac3dec->audblk.cplbndstrc[sub_bnd++])
371         {
372             cpl_exp_tmp = p_ac3dec->audblk.cplcoexp[ch][bnd] + 3 * p_ac3dec->audblk.mstrcplco[ch];
373             if (p_ac3dec->audblk.cplcoexp[ch][bnd] == 15)
374             {
375                 cpl_mant_tmp = (p_ac3dec->audblk.cplcomant[ch][bnd]) << 11;
376             }
377             else
378             {
379                 cpl_mant_tmp = ((0x10) | p_ac3dec->audblk.cplcomant[ch][bnd]) << 10;
380             }
381             cpl_coord = ((s16)cpl_mant_tmp) * exp_lut[cpl_exp_tmp] * 8.0f;
382
383             /* Invert the phase for the right channel if necessary */
384             if (p_ac3dec->bsi.acmod == 0x02 && p_ac3dec->audblk.phsflginu &&
385                     ch == 1 && p_ac3dec->audblk.phsflg[bnd])
386             {
387                 cpl_coord *= -1;
388             }
389             bnd++;
390         }
391
392         for (j=0;j < 12; j++)
393         {
394             /* Get new dither values for each channel if necessary,
395              * so the channels are uncorrelated */
396             if (p_ac3dec->audblk.dithflag[ch] && !p_ac3dec->audblk.cpl_bap[i])
397             {
398                 p_ac3dec->coeffs.fbw[ch][i] = cpl_coord * dither_gen(&p_ac3dec->mantissa) * 
399                     exp_lut[p_ac3dec->audblk.cpl_exp[i]];
400             } else {
401                 p_ac3dec->coeffs.fbw[ch][i]  = cpl_coord * p_ac3dec->audblk.cplfbw[i];
402             }
403             i++;
404         }
405     }
406 }
407
408 void mantissa_unpack (ac3dec_t * p_ac3dec)
409 {
410     int i, j;
411
412     p_ac3dec->mantissa.q_1_pointer = -1;
413     p_ac3dec->mantissa.q_2_pointer = -1;
414     p_ac3dec->mantissa.q_4_pointer = -1;
415     
416     if (p_ac3dec->audblk.cplinu)
417     {
418         /* 1 */
419         for (i = 0; !p_ac3dec->audblk.chincpl[i]; i++)
420         {
421             for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++)
422             {
423                 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
424             }
425         }
426
427         /* 2 */
428         for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++)
429         {
430             p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
431         }
432         for (j = p_ac3dec->audblk.cplstrtmant; j < p_ac3dec->audblk.cplendmant; j++)
433         {
434             p_ac3dec->audblk.cplfbw[j] = float_get (p_ac3dec, p_ac3dec->audblk.cpl_bap[j], p_ac3dec->audblk.cpl_exp[j]);
435         }
436         uncouple_channel (p_ac3dec, i);
437
438         /* 3 */
439         for (i++; i < p_ac3dec->bsi.nfchans; i++)
440         {
441             for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++)
442             {
443                 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
444             }
445             if (p_ac3dec->audblk.chincpl[i])
446             {
447                 uncouple_channel (p_ac3dec, i);
448             }
449         }
450     }
451     else
452     {
453         for (i = 0; i < p_ac3dec->bsi.nfchans; i++)
454         {
455             for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++)
456             {
457                 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
458             }
459         }
460     }
461
462     if (p_ac3dec->bsi.lfeon)
463     {
464         /* There are always 7 mantissas for lfe, no dither for lfe */
465         for (j = 0; j < 7; j++)
466         {
467             p_ac3dec->coeffs.lfe[j] = float_get (p_ac3dec, p_ac3dec->audblk.lfe_bap[j], p_ac3dec->audblk.lfe_exp[j]);
468         }
469     }
470 }
471