]> git.sesse.net Git - vlc/blob - plugins/mpeg_adec/adec_layer1.c
Some heavy changes today:
[vlc] / plugins / mpeg_adec / adec_layer1.c
1 /*****************************************************************************
2  * adec_layer1.c: MPEG Layer I audio decoder
3  *****************************************************************************
4  * Copyright (C) 1999-2001 VideoLAN
5  * $Id: adec_layer1.c,v 1.5 2001/12/30 07:09:55 sam Exp $
6  *
7  * Authors: Michel Kaempf <maxx@via.ecp.fr>
8  *          Michel Lespinasse <walken@via.ecp.fr>
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 <stdlib.h>                                                  /* NULL */
26 #include <string.h>                                    /* memcpy(), memset() */
27
28 #include <videolan/vlc.h>
29
30 #include "stream_control.h"
31 #include "input_ext-dec.h"
32
33 #include "mpeg_adec_generic.h"
34 #include "mpeg_adec.h"
35 #include "adec_math.h"                                     /* DCT32(), PCM() */
36
37 /**** wkn ****/
38
39 static float adec_scalefactor_table[64] =
40 {   /* 2 ^ (1 - i/3) */
41     2.0000000000000000, 1.5874010519681994, 1.2599210498948732,
42     1.0000000000000000, 0.7937005259840998, 0.6299605249474366,
43     0.5000000000000000, 0.3968502629920499, 0.3149802624737183,
44     0.2500000000000000, 0.1984251314960249, 0.1574901312368591,
45     0.1250000000000000, 0.0992125657480125, 0.0787450656184296,
46     0.0625000000000000, 0.0496062828740062, 0.0393725328092148,
47     0.0312500000000000, 0.0248031414370031, 0.0196862664046074,
48     0.0156250000000000, 0.0124015707185016, 0.0098431332023037,
49     0.0078125000000000, 0.0062007853592508, 0.0049215666011518,
50     0.0039062500000000, 0.0031003926796254, 0.0024607833005759,
51     0.0019531250000000, 0.0015501963398127, 0.0012303916502880,
52     0.0009765625000000, 0.0007750981699063, 0.0006151958251440,
53     0.0004882812500000, 0.0003875490849532, 0.0003075979125720,
54     0.0002441406250000, 0.0001937745424766, 0.0001537989562860,
55     0.0001220703125000, 0.0000968872712383, 0.0000768994781430,
56     0.0000610351562500, 0.0000484436356191, 0.0000384497390715,
57     0.0000305175781250, 0.0000242218178096, 0.0000192248695357,
58     0.0000152587890625, 0.0000121109089048, 0.0000096124347679,
59     0.0000076293945312, 0.0000060554544524, 0.0000048062173839,
60     0.0000038146972656, 0.0000030277272262, 0.0000024031086920,
61     0.0000019073486328, 0.0000015138636131, 0.0000012015543460,
62     0.0000009536743164 /* last element is not in the standard... invalid ??? */
63 };
64
65 static float adec_slope_table[15] =
66 {
67     0.6666666666666666, 0.2857142857142857, 0.1333333333333333,
68     0.0645161290322581, 0.0317460317460317, 0.0157480314960630,
69     0.0078431372549020, 0.0039138943248532, 0.0019550342130987,
70     0.0009770395701026, 0.0004884004884005, 0.0002441704309608,
71     0.0001220777635354, 0.0000610370189520, 0.0000305180437934
72 };
73
74 static float adec_offset_table[15] =
75 {
76     -0.6666666666666666, -0.8571428571428571, -0.9333333333333333,
77     -0.9677419354838710, -0.9841269841269841, -0.9921259842519685,
78     -0.9960784313725490, -0.9980430528375733, -0.9990224828934506,
79     -0.9995114802149487, -0.9997557997557998, -0.9998779147845196,
80     -0.9999389611182323, -0.9999694814905240, -0.9999847409781033
81 };
82
83 static u8 adec_layer1_allocation_table[15] =
84 {
85     0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
86 };
87
88 static int adec_bound_table[4] = { 4, 8, 12, 16 };
89
90 int adec_layer1_mono( adec_thread_t * p_adec, s16 * buffer )
91 {
92     u8 allocation[32];
93     float slope[32];
94     float offset[32];
95     float sample[32];
96
97     int i_sb;
98     int s;
99     int i_read_bits = 0;
100
101     /*
102      * Parse the allocation tables
103      */
104
105     for (i_sb = 0; i_sb < 32; i_sb += 2)
106     {
107         u8 tmp;
108
109         /* i_read_bits will be updated at the end of the loop */
110         tmp = GetBits ( &p_adec->bit_stream, 8 );
111
112         if ( (tmp >> 4) > 14 )
113         {
114             return 1;
115         }
116
117         allocation[i_sb] = adec_layer1_allocation_table [tmp >> 4];
118
119         if ((tmp & 15) > 14)
120         {
121             return 1;
122         }
123
124         allocation[i_sb+1] = adec_layer1_allocation_table [tmp & 15];
125     }
126
127     i_read_bits += 8 * 16; /* we did 16 iterations */
128
129     /*
130      * Parse scalefactors
131      */
132
133     for ( i_sb = 0; i_sb < 32; i_sb++ )
134     {
135         if ( allocation[i_sb] )
136         {
137             int index;
138             float scalefactor;
139
140             index = GetBits( &p_adec->bit_stream, 6);
141
142             /* We also add the bits we'll take later in the sample parsing */
143             i_read_bits += 6 + 12 * allocation[i_sb];
144
145             scalefactor = adec_scalefactor_table[index];
146
147             slope[i_sb] = adec_slope_table[allocation[i_sb]-2] * scalefactor;
148             offset[i_sb] = adec_offset_table[allocation[i_sb]-2] * scalefactor;
149         }
150     }
151
152     /* 
153      * Parse samples
154      */
155
156     for ( s = 0 ; s < 12; s++)
157     {
158         s16 * XXX_buf;
159
160         for (i_sb = 0; i_sb < 32; i_sb++)
161         {
162             if (!allocation[i_sb])
163             {
164                 sample[i_sb] = 0;
165             }
166             else
167             {
168                 int code;
169
170                 /* The bits were already counted in the scalefactors parsing */
171                 code = GetBits( &p_adec->bit_stream, allocation[i_sb] );
172
173                 sample[i_sb] = slope[i_sb] * code + offset[i_sb];
174             }
175         }
176
177         DCT32 (sample, &p_adec->bank_0);
178         XXX_buf = buffer;
179         PCM (&p_adec->bank_0, &XXX_buf, 1);
180         buffer += 32;
181     }
182
183     p_adec->i_read_bits += i_read_bits;
184
185     return 0;
186 }
187
188 int adec_layer1_stereo( adec_thread_t * p_adec, s16 * buffer )
189 {
190     u8 allocation_0[32], allocation_1[32];
191     float slope_0[32], slope_1[32];
192     float offset_0[32], offset_1[32];
193     float sample_0[32], sample_1[32];
194
195     int bound;
196     int i_sb;
197     int s;
198     int i_read_bits = 0;
199
200     /*
201      * Calculate bound
202      */
203
204     bound = 32;
205     if ( (p_adec->header & 0xc0) == 0x40)
206     {
207         /* intensity stereo */
208         int index;
209         index = (p_adec->header >> 4) & 3;
210         bound = adec_bound_table[index];
211     }
212
213     /*
214      * Parse allocation
215      */
216
217     for (i_sb = 0; i_sb < bound; i_sb++)
218     {
219         u8 tmp;
220         tmp = GetBits( &p_adec->bit_stream, 8 );
221         if ((tmp >> 4) > 14)
222         {
223             return 1;
224         }
225         allocation_0[i_sb] = adec_layer1_allocation_table [tmp >> 4];
226         if ((tmp & 15) > 14)
227         {
228             return 1;
229         }
230         allocation_1[i_sb] = adec_layer1_allocation_table [tmp & 15];
231     }
232
233     for (; i_sb < 32; i_sb += 2)
234     {
235         u8 tmp;
236         tmp = GetBits( &p_adec->bit_stream, 8 );
237
238         if ((tmp >> 4) > 14)
239         {
240             return 1;
241         }
242         allocation_0[i_sb] = allocation_1[i_sb]
243             = adec_layer1_allocation_table [tmp >> 4];
244
245         if ((tmp & 15) > 14)
246         {
247             return 1;
248         }
249         allocation_0[i_sb+1] = allocation_1[i_sb+1]
250             = adec_layer1_allocation_table [tmp & 15];
251     }
252
253     i_read_bits += 4 * ( 32 + bound ); /* we read 8*bound and 4*(32-bound) */
254
255     /*
256      * Parse scalefactors
257      */
258
259     for ( i_sb = 0; i_sb < 32; i_sb++ )
260     {
261         if ( allocation_0[i_sb] )
262         {
263             int index;
264             float scalefactor;
265
266             index = GetBits( &p_adec->bit_stream, 6 );
267             i_read_bits += 6;
268
269             scalefactor = adec_scalefactor_table[index];
270
271             slope_0[i_sb] = adec_slope_table[allocation_0[i_sb]-2] * scalefactor;
272             offset_0[i_sb] = adec_offset_table[allocation_0[i_sb]-2] * scalefactor;
273         }
274
275         if (allocation_1[i_sb])
276         {
277             int index;
278             float scalefactor;
279
280             index = GetBits( &p_adec->bit_stream, 6 );
281             i_read_bits += 6;
282
283             scalefactor = adec_scalefactor_table[index];
284
285             slope_1[i_sb] = adec_slope_table[allocation_1[i_sb]-2] * scalefactor;
286             offset_1[i_sb] = adec_offset_table[allocation_1[i_sb]-2] * scalefactor;
287         }
288     }
289
290     /* parse samples */
291
292     for (s = 0; s < 12; s++)
293     {
294         s16 * XXX_buf;
295
296         for (i_sb = 0; i_sb < bound; i_sb++)
297         {
298             if (!allocation_0[i_sb])
299             {
300                 sample_0[i_sb] = 0;
301             }
302             else
303             {
304                 int code;
305
306                 code = GetBits( &p_adec->bit_stream, allocation_0[i_sb] );
307                 i_read_bits += allocation_0[i_sb];
308
309                 sample_0[i_sb] = slope_0[i_sb] * code + offset_0[i_sb];
310             }
311
312             if ( !allocation_1[i_sb] )
313             {
314                 sample_1[i_sb] = 0;
315             }
316             else
317             {
318                 int code;
319
320                 code = GetBits( &p_adec->bit_stream, allocation_1[i_sb] );
321                 i_read_bits += allocation_1[i_sb];
322
323                 sample_1[i_sb] = slope_1[i_sb] * code + offset_1[i_sb];
324             }
325         }
326
327         for (; i_sb < 32; i_sb++)
328         {
329             if (!allocation_0[i_sb])
330             {
331                 sample_0[i_sb] = 0;
332                 sample_1[i_sb] = 0;
333             }
334             else
335             {
336                 int code;
337
338                 code = GetBits( &p_adec->bit_stream, allocation_0[i_sb] );
339                 i_read_bits += allocation_0[i_sb];
340
341                 sample_0[i_sb] = slope_0[i_sb] * code + offset_0[i_sb];
342                 sample_1[i_sb] = slope_1[i_sb] * code + offset_1[i_sb];
343             }
344         }
345
346         DCT32 (sample_0, &p_adec->bank_0);
347         XXX_buf = buffer;
348         PCM (&p_adec->bank_0, &XXX_buf, 2);
349         DCT32 (sample_1, &p_adec->bank_1);
350         XXX_buf = buffer+1;
351         PCM (&p_adec->bank_1, &XXX_buf, 2);
352         buffer += 64;
353     }
354
355     p_adec->i_read_bits += i_read_bits;
356
357     return 0;
358 }
359