1 /*****************************************************************************
2 * adec_generic.c: MPEG audio decoder
3 *****************************************************************************
4 * Copyright (C) 1999-2001 VideoLAN
5 * $Id: mpeg_adec_generic.c,v 1.6 2002/01/09 00:33:37 asmax Exp $
7 * Authors: Michel Kaempf <maxx@via.ecp.fr>
8 * Michel Lespinasse <walken@via.ecp.fr>
9 * Cyril Deguet <asmax@via.ecp.fr>
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
24 *****************************************************************************/
26 #include <string.h> /* memcpy(), memset() */
28 #include <videolan/vlc.h>
30 #include "input_ext-dec.h"
31 #include "stream_control.h"
33 #include "mpeg_adec_generic.h"
34 #include "mpeg_adec.h"
35 #include "adec_math.h" /* DCT32(), PCM() */
36 #include "adec_layer1.h"
37 #include "adec_layer2.h"
39 int adec_Init( adec_thread_t * p_adec )
41 p_adec->bank_0.actual = p_adec->bank_0.v1;
42 p_adec->bank_0.pos = 0;
43 p_adec->bank_1.actual = p_adec->bank_1.v1;
44 p_adec->bank_1.pos = 0;
48 int adec_SyncFrame( adec_thread_t * p_adec, adec_sync_info_t * p_sync_info )
50 static int mpeg1_sample_rate[3] = {44100, 48000, 32000};
51 static int mpeg1_layer1_bit_rate[15] =
53 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448
55 static int mpeg1_layer2_bit_rate[15] =
57 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384
59 static int mpeg2_layer1_bit_rate[15] =
61 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256
63 static int mpeg2_layer2_bit_rate[15] =
65 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160
67 static int * bit_rate_table[8] =
69 NULL, NULL, mpeg2_layer2_bit_rate, mpeg2_layer1_bit_rate,
70 NULL, NULL, mpeg1_layer2_bit_rate, mpeg1_layer1_bit_rate
80 /* We read the whole header, but only really take 8 bits */
81 header = GetBits( &p_adec->bit_stream, 8 ) << 24;
82 header |= ShowBits( &p_adec->bit_stream, 24 );
84 p_adec->header = header;
86 /* basic header check : sync word */
87 if( (header & 0xfff00000) != 0xfff00000 )
92 /* calculate bit rate */
93 index = ( header >> 17 ) & 7; /* mpeg ID + layer */
94 bit_rates = bit_rate_table[ index ];
95 if( bit_rates == NULL )
97 return 1; /* invalid layer */
100 index = ( header >> 12 ) & 15; /* bit rate index */
105 bit_rate = bit_rates[ index ];
107 /* mpeg 1 layer 2 : check that bitrate per channel is valid */
109 if( bit_rates == mpeg1_layer2_bit_rate )
111 if( (header & 0xc0) == 0xc0 )
115 return 1; /* invalid bitrate per channel */
120 if( (1 << index) & 0x2e )
122 return 1; /* invalid bitrate per channel */
127 /* calculate sample rate */
129 index = ( header >> 10 ) & 3; /* sample rate index */
135 sample_rate = mpeg1_sample_rate[ index ];
137 if( ! (header & 0x80000) )
139 sample_rate >>= 1; /* half sample rate for mpeg2 */
142 /* calculate frame length */
144 if( (header & 0x60000) == 0x60000 )
147 frame_size = 48000 * bit_rate / sample_rate;
158 frame_size = 144000 * bit_rate / sample_rate;
167 /* Now we are sure we want this header, read it */
168 RemoveBits( &p_adec->bit_stream, 24 );
169 p_adec->i_read_bits = 32;
171 if( ! (p_adec->header & 0x10000) )
173 /* Error check, skip it */
174 RemoveBits( &p_adec->bit_stream, 16 );
175 p_adec->i_read_bits += 16;
178 p_sync_info->b_stereo = ((p_adec->header & 0xc0) != 0xc0);
179 p_sync_info->sample_rate = sample_rate;
180 p_sync_info->bit_rate = bit_rate;
181 p_sync_info->frame_size = frame_size;
182 p_adec->frame_size = frame_size;
187 int adec_DecodeFrame( adec_thread_t * p_adec, s16 * buffer )
189 int i_total_bytes_read;
191 /* parse audio data */
193 switch( (p_adec->header >> 17) & 3 )
197 if( (p_adec->header & 0xc0) == 0xc0 )
199 if( adec_layer2_mono (p_adec, buffer) )
206 if( adec_layer2_stereo (p_adec, buffer) )
215 if( (p_adec->header & 0xc0) == 0xc0 )
217 if( adec_layer1_mono (p_adec, buffer) )
224 if( adec_layer1_stereo (p_adec, buffer) )
232 /* Skip ancillary data */
234 if( (p_adec->header & 0xf000) == 0 ) /* free bitrate format */
239 RealignBits( &p_adec->bit_stream );
240 i_total_bytes_read = ( p_adec->i_read_bits + 7 ) / 8;
242 if( i_total_bytes_read > p_adec->frame_size )
244 return 1; /* overrun */
247 while( i_total_bytes_read++ < p_adec->frame_size )
249 RemoveBits( &p_adec->bit_stream, 8 ); /* skip ancillary data */