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