]> git.sesse.net Git - vlc/blob - src/ac3_decoder/ac3_mantissa.c
Encore un commit venu tout droit des abysses de l'enfer, d�sol� pour
[vlc] / src / ac3_decoder / ac3_mantissa.c
1 /*****************************************************************************
2  * ac3_mantissa.c: ac3 mantissa computation
3  *****************************************************************************
4  * Copyright (C) 1999, 2000 VideoLAN
5  *
6  * Authors:
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public
19  * License along with this program; if not, write to the
20  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21  * Boston, MA 02111-1307, USA.
22  *****************************************************************************/
23
24 #include <stdio.h>                                           /* "intf_msg.h" */
25
26 #include "int_types.h"
27 #include "ac3_decoder.h"
28 #include "ac3_internal.h"
29 #include "ac3_bit_stream.h"
30
31 #define Q0 ((-2 << 15) / 3.0)
32 #define Q1 (0)
33 #define Q2 ((2 << 15) / 3.0)
34 static float q_1_0[ 32 ] = { Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
35                              Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
36                              Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
37                              0, 0, 0, 0, 0 };
38 static float q_1_1[ 32 ] = { 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,
41                              0, 0, 0, 0, 0 };
42 static float q_1_2[ 32 ] = { Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
43                              Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
44                              Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
45                              0, 0, 0, 0, 0 };
46 #undef Q0
47 #undef Q1
48 #undef Q2
49
50 #define Q0 ((-4 << 15) / 5.0)
51 #define Q1 ((-2 << 15) / 5.0)
52 #define Q2 (0)
53 #define Q3 ((2 << 15) / 5.0)
54 #define Q4 ((4 << 15) / 5.0)
55 static float q_2_0[ 128 ] =
56   { 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,
57     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,
58     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,
59     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,
60     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,
61      0, 0, 0 };
62 static float q_2_1[ 128 ] =
63   { 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,
64     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,
65     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,
66     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,
67     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,
68      0, 0, 0 };
69 static float q_2_2[ 128 ] =
70   { 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,
71     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,
72     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,
73     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,
74     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,
75      0, 0, 0 };
76 #undef Q0
77 #undef Q1
78 #undef Q2
79 #undef Q3
80 #undef Q4
81
82 #define Q0 ((-10 << 15) / 11.0)
83 #define Q1 ((-8 << 15) / 11.0)
84 #define Q2 ((-6 << 15) / 11.0)
85 #define Q3 ((-4 << 15) / 11.0)
86 #define Q4 ((-2 << 15) / 11.0)
87 #define Q5 (0)
88 #define Q6 ((2 << 15) / 11.0)
89 #define Q7 ((4 << 15) / 11.0)
90 #define Q8 ((6 << 15) / 11.0)
91 #define Q9 ((8 << 15) / 11.0)
92 #define QA ((10 << 15) / 11.0)
93 static float q_4_0[ 128 ] = { Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
94                               Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
95                               Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
96                               Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3, Q3,
97                               Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4, Q4,
98                               Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5, Q5,
99                               Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6, Q6,
100                               Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7, Q7,
101                               Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8, Q8,
102                               Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9, Q9,
103                               QA, QA, QA, QA, QA, QA, QA, QA, QA, QA, QA,
104                                0,  0,  0,  0,  0,  0,  0};
105 static float q_4_1[ 128 ] = { Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
106                               Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
107                               Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
108                               Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
109                               Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
110                               Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
111                               Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
112                               Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
113                               Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
114                               Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
115                               Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
116                                0,  0,  0,  0,  0,  0,  0};
117 #undef Q0
118 #undef Q1
119 #undef Q2
120 #undef Q3
121 #undef Q4
122 #undef Q5
123 #undef Q6
124 #undef Q7
125 #undef Q8
126 #undef Q9
127 #undef QA
128
129 /* Lookup tables of 0.16 two's complement quantization values */
130
131 static float q_3[8] = { (-6 << 15)/7.0, (-4 << 15)/7.0, (-2 << 15)/7.0,
132                           0           , (2 << 15)/7.0, (4 << 15)/7.0,
133                         (6 << 15)/7.0, 0 };
134
135 static float q_5[16] = { (-14 << 15)/15.0, (-12 << 15)/15.0, (-10 << 15)/15.0,
136                          (-8 << 15)/15.0, (-6 << 15)/15.0, (-4 << 15)/15.0,
137                          (-2 << 15)/15.0,    0            ,  (2 << 15)/15.0,
138                           (4 << 15)/15.0,  (6 << 15)/15.0,  (8 << 15)/15.0,
139                          (10 << 15)/15.0, (12 << 15)/15.0, (14 << 15)/15.0,
140                          0 };
141
142 /* These store the persistent state of the packed mantissas */
143 static float q_1[2];
144 static float q_2[2];
145 static float q_4[1];
146 static s32 q_1_pointer;
147 static s32 q_2_pointer;
148 static s32 q_4_pointer;
149
150 /* Conversion from bap to number of bits in the mantissas
151  * zeros account for cases 0,1,2,4 which are special cased */
152 static u16 qnttztab[16] = { 0, 0, 0, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16};
153
154 static float exp_lut[ 25 ] =
155 {
156     6.10351562500000000000000000e-05,
157     3.05175781250000000000000000e-05,
158     1.52587890625000000000000000e-05,
159     7.62939453125000000000000000e-06,
160     3.81469726562500000000000000e-06,
161     1.90734863281250000000000000e-06,
162     9.53674316406250000000000000e-07,
163     4.76837158203125000000000000e-07,
164     2.38418579101562500000000000e-07,
165     1.19209289550781250000000000e-07,
166     5.96046447753906250000000000e-08,
167     2.98023223876953125000000000e-08,
168     1.49011611938476562500000000e-08,
169     7.45058059692382812500000000e-09,
170     3.72529029846191406250000000e-09,
171     1.86264514923095703125000000e-09,
172     9.31322574615478515625000000e-10,
173     4.65661287307739257812500000e-10,
174     2.32830643653869628906250000e-10,
175     1.16415321826934814453125000e-10,
176     5.82076609134674072265625000e-11,
177     2.91038304567337036132812500e-11,
178     1.45519152283668518066406250e-11,
179     7.27595761418342590332031250e-12,
180     3.63797880709171295166015625e-12,
181 };
182
183 /* Fetch an unpacked, left justified, and properly biased/dithered mantissa value */
184 static __inline__ float float_get (ac3dec_t * p_ac3dec, u16 bap, u16 exp)
185 {
186     u32 group_code;
187
188     /* If the bap is 0-5 then we have special cases to take care of */
189     switch (bap) {
190     case 0:
191         return (0);     /* FIXME dither */
192
193     case 1:
194         if (q_1_pointer >= 0) {
195             return (q_1[q_1_pointer--] * exp_lut[exp]);
196         }
197
198         NeedBits (&(p_ac3dec->bit_stream), 5);
199         group_code = p_ac3dec->bit_stream.buffer >> (32 - 5);
200         DumpBits (&(p_ac3dec->bit_stream), 5);
201         if (group_code >= 27) {
202             fprintf (stderr, "ac3dec debug: invalid mantissa\n");
203         }
204
205         q_1[ 1 ] = q_1_1[ group_code ];
206         q_1[ 0 ] = q_1_2[ group_code ];
207
208         q_1_pointer = 1;
209
210         return (q_1_0[group_code] * exp_lut[exp]);
211
212     case 2:
213         if (q_2_pointer >= 0) {
214             return (q_2[q_2_pointer--] * exp_lut[exp]);
215         }
216         NeedBits (&(p_ac3dec->bit_stream), 7);
217         group_code = p_ac3dec->bit_stream.buffer >> (32 - 7);
218         DumpBits (&(p_ac3dec->bit_stream), 7);
219
220         if (group_code >= 125) {
221             fprintf (stderr, "ac3dec debug: invalid mantissa\n");
222         }
223
224         q_2[ 1 ] = q_2_1[ group_code ];
225         q_2[ 0 ] = q_2_2[ group_code ];
226
227         q_2_pointer = 1;
228
229         return (q_2_0[ group_code ] * exp_lut[exp]);
230
231     case 3:
232         NeedBits (&(p_ac3dec->bit_stream), 3);
233         group_code = p_ac3dec->bit_stream.buffer >> (32 - 3);
234         DumpBits (&(p_ac3dec->bit_stream), 3);
235
236         if (group_code >= 7) {
237             fprintf (stderr, "ac3dec debug: invalid mantissa\n");
238         }
239
240         return (q_3[group_code] * exp_lut[exp]);
241
242     case 4:
243         if (q_4_pointer >= 0) {
244             return (q_4[q_4_pointer--] * exp_lut[exp]);
245         }
246         NeedBits (&(p_ac3dec->bit_stream), 7);
247         group_code = p_ac3dec->bit_stream.buffer >> (32 - 7);
248         DumpBits (&(p_ac3dec->bit_stream), 7);
249
250         if (group_code >= 121) {
251             fprintf (stderr, "ac3dec debug: invalid mantissa\n");
252         }
253
254         q_4[ 0 ] = q_4_1[ group_code ];
255
256         q_4_pointer = 0;
257
258         return (q_4_0[ group_code ] * exp_lut[exp]);
259
260     case 5:
261         NeedBits (&(p_ac3dec->bit_stream), 4);
262         group_code = p_ac3dec->bit_stream.buffer >> (32 - 4);
263         DumpBits (&(p_ac3dec->bit_stream), 4);
264
265         if (group_code >= 15) {
266             fprintf (stderr, "ac3dec debug: invalid mantissa\n");
267         }
268
269         return (q_5[group_code] * exp_lut[exp]);
270
271     default:
272         NeedBits (&(p_ac3dec->bit_stream), qnttztab[bap]);
273         group_code = (((s32)(p_ac3dec->bit_stream.buffer)) >> (32 - qnttztab[bap])) << (16 - qnttztab[bap]);
274         DumpBits (&(p_ac3dec->bit_stream), qnttztab[bap]);
275
276         return (((s32)group_code) * exp_lut[exp]);
277     }
278 }
279
280 static __inline__ void uncouple_channel (ac3dec_t * p_ac3dec, u32 ch)
281 {
282     u32 bnd = 0;
283     u32 i,j;
284     float cpl_coord = 0;
285     u32 cpl_exp_tmp;
286     u32 cpl_mant_tmp;
287
288     for (i = p_ac3dec->audblk.cplstrtmant; i < p_ac3dec->audblk.cplendmant;) {
289         if (!p_ac3dec->audblk.cplbndstrc[bnd]) {
290             cpl_exp_tmp = p_ac3dec->audblk.cplcoexp[ch][bnd] + 3 * p_ac3dec->audblk.mstrcplco[ch];
291             if (p_ac3dec->audblk.cplcoexp[ch][bnd] == 15)
292                 cpl_mant_tmp = (p_ac3dec->audblk.cplcomant[ch][bnd]) << 12;
293             else
294                 cpl_mant_tmp = ((0x10) | p_ac3dec->audblk.cplcomant[ch][bnd]) << 11;
295
296             cpl_coord = ((s16)cpl_mant_tmp) * exp_lut[cpl_exp_tmp];
297         }
298         bnd++;
299
300         for (j=0;j < 12; j++) {
301             p_ac3dec->coeffs.fbw[ch][i]  = cpl_coord * p_ac3dec->audblk.cplfbw[i];
302             i++;
303         }
304     }
305 }
306
307 void mantissa_unpack (ac3dec_t * p_ac3dec)
308 {
309     int i, j;
310
311     q_1_pointer = -1;
312     q_2_pointer = -1;
313     q_4_pointer = -1;
314
315     if (p_ac3dec->audblk.cplinu) {
316         /* 1 */
317         for (i = 0; !p_ac3dec->audblk.chincpl[i]; i++) {
318             for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++) {
319                 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
320             }
321         }
322
323         /* 2 */
324         for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++) {
325             p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
326         }
327         for (j = p_ac3dec->audblk.cplstrtmant; j < p_ac3dec->audblk.cplendmant; j++) {
328             p_ac3dec->audblk.cplfbw[j] = float_get (p_ac3dec, p_ac3dec->audblk.cpl_bap[j], p_ac3dec->audblk.cpl_exp[j]);
329         }
330         uncouple_channel (p_ac3dec, i);
331
332         /* 3 */
333         for (i++; i < p_ac3dec->bsi.nfchans; i++) {
334             for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++) {
335                 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
336             }
337             if (p_ac3dec->audblk.chincpl[i]) {
338                 uncouple_channel (p_ac3dec, i);
339             }
340         }
341     } else {
342         for (i = 0; i < p_ac3dec->bsi.nfchans; i++) {
343             for (j = 0; j < p_ac3dec->audblk.endmant[i]; j++) {
344                 p_ac3dec->coeffs.fbw[i][j] = float_get (p_ac3dec, p_ac3dec->audblk.fbw_bap[i][j], p_ac3dec->audblk.fbw_exp[i][j]);
345             }
346         }
347     }
348
349     if (p_ac3dec->bsi.lfeon) {
350         /* There are always 7 mantissas for lfe, no dither for lfe */
351         for (j = 0; j < 7; j++) {
352             p_ac3dec->coeffs.lfe[j] = float_get (p_ac3dec, p_ac3dec->audblk.lfe_bap[j], p_ac3dec->audblk.lfe_exp[j]);
353         }
354     }
355 }