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