]> git.sesse.net Git - vlc/blob - src/ac3_decoder/ac3_mantissa.c
0db5604262edfd516cd48be0756e7b0b226a350b
[vlc] / src / ac3_decoder / ac3_mantissa.c
1 /*****************************************************************************
2  * ac3_mantissa.c: ac3 mantissa computation
3  *****************************************************************************
4  * Copyright (C) 1999, 2000, 2001 VideoLAN
5  *
6  * Authors: Michel Kaempf <maxx@via.ecp.fr>
7  *          Aaron Holtzman <aholtzma@engr.uvic.ca>
8  *          Renaud Dartus <reno@videolan.org>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  * 
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
23  *****************************************************************************/
24
25 #include "defs.h"
26
27 #include "config.h"
28 #include "common.h"
29 #include "threads.h"
30 #include "mtime.h"
31
32 #include "stream_control.h"
33 #include "input_ext-dec.h"
34
35 #include "audio_output.h"
36
37 #include "ac3_decoder.h"
38 #include "ac3_decoder_thread.h"
39
40 #include "ac3_internal.h"
41 #include "ac3_bit_stream.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 exp_lut[ 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 float_get (ac3dec_t * p_ac3dec, u16 bap, u16 exp)
268 {
269     u32 group_code;
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 (p_ac3dec->audblk.dithflag[exp])
276         {
277             return ( dither_gen(&p_ac3dec->mantissa) * exp_lut[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--] * exp_lut[exp]);
285         }
286
287         if ((group_code = bitstream_get(&(p_ac3dec->bit_stream),5)) >= 27)
288         {
289             intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (1)" );
290         }
291
292         p_ac3dec->mantissa.q_1[ 1 ] = q_1_1[ group_code ];
293         p_ac3dec->mantissa.q_1[ 0 ] = q_1_2[ group_code ];
294
295         p_ac3dec->mantissa.q_1_pointer = 1;
296
297         return (q_1_0[group_code] * exp_lut[exp]);
298
299     case 2:
300         if (p_ac3dec->mantissa.q_2_pointer >= 0)
301         {
302             return (p_ac3dec->mantissa.q_2[p_ac3dec->mantissa.q_2_pointer--] * exp_lut[exp]);
303         }
304         
305         if ((group_code = bitstream_get(&(p_ac3dec->bit_stream),7)) >= 125)
306         {
307             intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (2)" );
308         }
309
310         p_ac3dec->mantissa.q_2[ 1 ] = q_2_1[ group_code ];
311         p_ac3dec->mantissa.q_2[ 0 ] = q_2_2[ group_code ];
312
313         p_ac3dec->mantissa.q_2_pointer = 1;
314
315         return (q_2_0[ group_code ] * exp_lut[exp]);
316
317     case 3:
318         if ((group_code = bitstream_get(&(p_ac3dec->bit_stream),3)) >= 7)
319         {
320             intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (3)" );
321         }
322
323         return (q_3[group_code] * exp_lut[exp]);
324
325     case 4:
326         if (p_ac3dec->mantissa.q_4_pointer >= 0)
327         {
328             return (p_ac3dec->mantissa.q_4[p_ac3dec->mantissa.q_4_pointer--] * exp_lut[exp]);
329         }
330
331         if ((group_code = bitstream_get(&(p_ac3dec->bit_stream),7)) >= 121)
332         {
333             intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (4)" );
334         }
335
336         p_ac3dec->mantissa.q_4[ 0 ] = q_4_1[ group_code ];
337
338         p_ac3dec->mantissa.q_4_pointer = 0;
339
340         return (q_4_0[ group_code ] * exp_lut[exp]);
341
342     case 5:
343         if ((group_code = bitstream_get(&(p_ac3dec->bit_stream),4)) >= 15)
344         {
345             intf_WarnMsg ( 1, "ac3dec error: invalid mantissa (5)" );
346         }
347
348         return (q_5[group_code] * exp_lut[exp]);
349
350     default:
351         group_code = bitstream_get(&(p_ac3dec->bit_stream),qnttztab[bap]);
352         group_code <<= 16 - qnttztab[bap];
353
354         return ((s16)(group_code) * exp_lut[exp]);
355     }
356 }
357
358 static __inline__ void uncouple_channel (ac3dec_t * p_ac3dec, u32 ch)
359 {
360     u32 bnd = 0;
361     u32 sub_bnd = 0;
362     u32 i,j;
363     float cpl_coord = 1.0;
364     u32 cpl_exp_tmp;
365     u32 cpl_mant_tmp;
366
367     for (i = p_ac3dec->audblk.cplstrtmant; i < p_ac3dec->audblk.cplendmant;)
368     {
369         if (!p_ac3dec->audblk.cplbndstrc[sub_bnd++])
370         {
371             cpl_exp_tmp = p_ac3dec->audblk.cplcoexp[ch][bnd] + 3 * p_ac3dec->audblk.mstrcplco[ch];
372             if (p_ac3dec->audblk.cplcoexp[ch][bnd] == 15)
373             {
374                 cpl_mant_tmp = (p_ac3dec->audblk.cplcomant[ch][bnd]) << 11;
375             }
376             else
377             {
378                 cpl_mant_tmp = ((0x10) | p_ac3dec->audblk.cplcomant[ch][bnd]) << 10;
379             }
380             cpl_coord = ((s16)cpl_mant_tmp) * exp_lut[cpl_exp_tmp] * 8.0f;
381
382             /* Invert the phase for the right channel if necessary */
383             if (p_ac3dec->bsi.acmod == 0x02 && p_ac3dec->audblk.phsflginu &&
384                     ch == 1 && p_ac3dec->audblk.phsflg[bnd])
385             {
386                 cpl_coord *= -1;
387             }
388             bnd++;
389         }
390
391         for (j=0;j < 12; j++)
392         {
393             /* Get new dither values for each channel if necessary,
394              * so the channels are uncorrelated */
395             if (p_ac3dec->audblk.dithflag[ch] && !p_ac3dec->audblk.cpl_bap[i])
396             {
397                 p_ac3dec->coeffs.fbw[ch][i] = cpl_coord * dither_gen(&p_ac3dec->mantissa) * 
398                     exp_lut[p_ac3dec->audblk.cpl_exp[i]];
399             } else {
400                 p_ac3dec->coeffs.fbw[ch][i]  = cpl_coord * p_ac3dec->audblk.cplfbw[i];
401             }
402             i++;
403         }
404     }
405 }
406
407 void mantissa_unpack (ac3dec_t * p_ac3dec)
408 {
409     int i, j;
410
411     p_ac3dec->mantissa.q_1_pointer = -1;
412     p_ac3dec->mantissa.q_2_pointer = -1;
413     p_ac3dec->mantissa.q_4_pointer = -1;
414     
415     if (p_ac3dec->audblk.cplinu)
416     {
417         /* 1 */
418         for (i = 0; !p_ac3dec->audblk.chincpl[i]; i++)
419         {
420             for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++)
421             {
422                 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
423             }
424         }
425
426         /* 2 */
427         for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++)
428         {
429             p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
430         }
431         for (j = p_ac3dec->audblk.cplstrtmant; j < p_ac3dec->audblk.cplendmant; j++)
432         {
433             p_ac3dec->audblk.cplfbw[j] = float_get (p_ac3dec, p_ac3dec->audblk.cpl_bap[j], p_ac3dec->audblk.cpl_exp[j]);
434         }
435         uncouple_channel (p_ac3dec, i);
436
437         /* 3 */
438         for (i++; i < p_ac3dec->bsi.nfchans; i++)
439         {
440             for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++)
441             {
442                 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
443             }
444             if (p_ac3dec->audblk.chincpl[i])
445             {
446                 uncouple_channel (p_ac3dec, i);
447             }
448         }
449     }
450     else
451     {
452         for (i = 0; i < p_ac3dec->bsi.nfchans; i++)
453         {
454             for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++)
455             {
456                 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
457             }
458         }
459     }
460
461     if (p_ac3dec->bsi.lfeon)
462     {
463         /* There are always 7 mantissas for lfe, no dither for lfe */
464         for (j = 0; j < 7; j++)
465         {
466             p_ac3dec->coeffs.lfe[j] = float_get (p_ac3dec, p_ac3dec->audblk.lfe_bap[j], p_ac3dec->audblk.lfe_exp[j]);
467         }
468     }
469 }
470