* ./modules/codec/spudec/*: split spudec into the parsing and the rendering
[vlc.git] / modules / demux / mpeg / audio.c
1 /*****************************************************************************
2  * audio.c : mpeg audio Stream input module for vlc
3  *****************************************************************************
4  * Copyright (C) 2001 VideoLAN
5  * $Id: audio.c,v 1.5 2002/08/16 03:07:56 sam Exp $
6  *
7  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8  * 
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  * 
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
22  *****************************************************************************/
23
24 /*****************************************************************************
25  * Preamble
26  *****************************************************************************/
27 #include <stdlib.h>                                      /* malloc(), free() */
28 #include <string.h>
29
30 #include <vlc/vlc.h>
31 #include <vlc/input.h>
32
33 #include <sys/types.h>
34
35 /*****************************************************************************
36  * Local prototypes
37  *****************************************************************************/
38 static int  Activate ( vlc_object_t * );
39 static int  Demux ( input_thread_t * );
40
41 /* TODO: support MPEG-2.5, not difficult, but I need somes samples... */
42
43 /*****************************************************************************
44  * Module descriptor
45  *****************************************************************************/
46 vlc_module_begin();
47     set_description( _("MPEG I/II audio stream demux" ) );
48     set_capability( "demux", 50 );
49     set_callbacks( Activate, NULL );
50     add_shortcut( "mpegaudio" );
51     add_shortcut( "mp3" );
52 vlc_module_end();
53
54 /*****************************************************************************
55  * Definitions of structures  and functions used by this plugins 
56  *****************************************************************************/
57
58 /* XXX set this to 0 to avoid problem with PS XXX */
59 /* but with some file or web radio will failed to detect */
60 /* it's you to choose */
61 #define MPEGAUDIO_MAXTESTPOS    0
62
63 typedef struct mpeg_header_s
64 {
65     u32 i_header;
66     int i_version;
67     int i_layer;
68     int i_crc;
69     int i_bitrate;
70     int i_samplerate;
71     int i_padding;
72     int i_extension;
73     int i_mode;
74     int i_modeext;
75     int i_copyright;
76     int i_original;
77     int i_emphasis;
78
79 } mpeg_header_t;
80
81 /* Xing Header if present */
82 #define FRAMES_FLAG     0x0001  /* these flags is for i_flags */
83 #define BYTES_FLAG      0x0002  /* because all is optionnal */
84 #define TOC_FLAG        0x0004
85 #define VBR_SCALE_FLAG  0x0008
86 typedef struct xing_header_s
87 {
88     int i_flags;      /* from Xing header data */
89     int i_frames;     /* total bit stream frames from Xing header data */
90     int i_bytes;      /* total bit stream bytes from Xing header data */
91     int i_vbr_scale;  /* encoded vbr scale from Xing header data */
92     u8  i_toc[100];   /* for seek */
93     int i_avgbitrate; /* calculated, XXX: bits/sec not Kb */
94 } xing_header_t;
95
96 struct demux_sys_t
97 {
98     mtime_t i_pts;
99
100     es_descriptor_t *p_es;
101     mpeg_header_t   mpeg;
102     xing_header_t   xingheader;
103
104     /* extracted information */
105     int i_samplerate;
106     int i_samplelength;
107     int i_framelength;
108 };
109
110
111 static int mpegaudio_bitrate[2][3][16] =
112 {
113   {
114     /* v1 l1 */
115     { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0},
116     /* v1 l2 */
117     { 0, 32, 48, 56,  64,  80,  96, 112, 128, 160, 192, 224, 256, 320, 384, 0},
118     /* v1 l3 */
119     { 0, 32, 40, 48,  56,  64,  80,  96, 112, 128, 160, 192, 224, 256, 320, 0} 
120   },
121     
122   {
123      /* v2 l1 */
124     { 0, 32, 48, 56,  64,  80,  96, 112, 128, 144, 160, 176, 192, 224, 256, 0},
125     /* v2 l2 */
126     { 0,  8, 16, 24,  32,  40,  48,  56,  64,  80,  96, 112, 128, 144, 160, 0},
127     /* v2 l3 */
128     { 0,  8, 16, 24,  32,  40,  48,  56,  64,  80,  96, 112, 128, 144, 160, 0} 
129   }
130
131 };
132
133 static int mpegaudio_samplerate[2][4] = /* version 1 then 2 */
134 {
135     { 44100, 48000, 32000, 0 },
136     { 22050, 24000, 16000, 0 }
137 };
138
139 static char* mpegaudio_mode[4] =
140 {
141     "stereo", "joint stereo", "dual channel", "mono"
142 };
143
144 static inline u32 GetDWBE( u8 *p_buff )
145 {
146     return( ( p_buff[0] << 24 )|( p_buff[1] << 16 )|
147             ( p_buff[2] <<  8 )|( p_buff[3] ) );
148 }
149
150 /*****************************************************************************
151  * Function to manipulate stream easily
152  *****************************************************************************
153  *
154  * SkipBytes : skip bytes, not yet optimised, read bytes to be skipped :P
155  *
156  * ReadPes : read data and make a PES
157  * 
158  *****************************************************************************/
159 static int SkipBytes( input_thread_t *p_input, int i_size )
160 {
161     data_packet_t *p_data;
162     int i_read;
163
164     while( i_size > 0 )
165     {
166         i_read = input_SplitBuffer(p_input, &p_data, __MIN( i_size, 1024 ) );
167         if( i_read <= 0 )
168         {
169             return( 0 );
170         }
171         input_DeletePacket( p_input->p_method_data, p_data );
172         i_size -= i_read;
173     }
174     return( 1 );
175 }
176
177 static int ReadPES( input_thread_t *p_input, 
178                     pes_packet_t **pp_pes, 
179                     int i_size )
180 {
181     pes_packet_t *p_pes;
182
183     *pp_pes = NULL;
184         
185     if( !(p_pes = input_NewPES( p_input->p_method_data )) )
186     {
187         msg_Err( p_input, "cannot allocate new PES" );
188         return( 0 );
189     }
190
191     while( i_size > 0 )
192     {
193         data_packet_t   *p_data;
194         int i_read;
195
196         if( (i_read = input_SplitBuffer( p_input, 
197                                          &p_data, 
198                                          __MIN( i_size, 1024 ) ) ) <= 0 )
199         {
200             input_DeletePES( p_input->p_method_data, p_pes );
201             return( 0 );
202         }
203         if( !p_pes->p_first )
204         {
205             p_pes->p_first = p_data;
206             p_pes->i_nb_data = 1;
207             p_pes->i_pes_size = i_read;
208         }
209         else
210         {
211             p_pes->p_last->p_next  = p_data;
212             p_pes->i_nb_data++;
213             p_pes->i_pes_size += i_read;
214         }
215         p_pes->p_last  = p_data;
216         i_size -= i_read;
217     }
218     *pp_pes = p_pes;
219     return( 1 );
220 }
221
222 /*****************************************************************************
223  * CheckHeader : Test the validity of the header 
224  *****************************************************************************/
225 static int CheckHeader( u32 i_header )
226 {
227     if( ((( i_header >> 20 )&0x0FFF) != 0x0FFF )  /* header sync */
228         || (((i_header >> 17)&0x03) == 0 )  /* valid layer ?*/
229         || (((i_header >> 12)&0x0F) == 0x0F )
230         || (((i_header >> 12)&0x0F) == 0x00 ) /* valid bitrate ? */
231         || (((i_header >> 10) & 0x03) == 0x03 ) /* valide sampling freq ? */
232         || ((i_header & 0x03) == 0x02 )) /* valid emphasis ? */
233     {
234         return( 0 ); /*invalid */
235     }
236     return( 1 ); /* valid */
237 }
238
239 /*****************************************************************************
240  * DecodedFrameSize : give the length of the decoded pcm data
241  *****************************************************************************/
242 static int DecodedFrameSize( mpeg_header_t *p_mpeg )
243 {
244     switch( p_mpeg->i_layer )
245     {
246         case( 0 ): /* layer 1 */
247             return( 384);
248         case( 1 ): /* layer 2 */
249             return( 1152 );
250         case( 2 ): /* layer 3 */
251             return( !p_mpeg->i_version ? 1152 : 576 ); 
252             /* XXX: perhaps we have to /2 for all layer but i'm not sure */
253     }
254     return( 0 );
255 }
256
257 /****************************************************************************
258  * GetHeader : find an mpeg header and load it 
259  ****************************************************************************/
260 static int GetHeader( input_thread_t  *p_input,
261                       mpeg_header_t   *p_mpeg,
262                       int             i_max_pos,
263                       int             *pi_skip )
264 {
265     u32 i_header;
266     u8  *p_peek;
267     int i_size;
268
269     *pi_skip = 0;
270     i_size = input_Peek( p_input, &p_peek, i_max_pos + 4 );
271
272     for( ; ; )
273     {
274         if( i_size < 4 )
275         {
276             return( 0 );
277         }
278         if( !CheckHeader( GetDWBE( p_peek ) ) )
279         {
280             p_peek++;
281             i_size--;
282             *pi_skip += 1;
283             continue;
284         }
285         /* we found an header, load it */
286         break;
287     }
288     i_header = GetDWBE( p_peek );
289     p_mpeg->i_header = i_header;
290     p_mpeg->i_version =  1 - ( ( i_header >> 19 ) & 0x01 );
291     p_mpeg->i_layer =  3 - ( ( i_header >> 17 ) & 0x03 );
292     p_mpeg->i_crc = 1 - (( i_header >> 16 ) & 0x01);
293     p_mpeg->i_bitrate = 
294         mpegaudio_bitrate[p_mpeg->i_version][p_mpeg->i_layer][(i_header>>12)&0x0F];
295     p_mpeg->i_samplerate = mpegaudio_samplerate[p_mpeg->i_version][(i_header>>10)&0x03];
296     p_mpeg->i_padding = (( i_header >> 9 ) & 0x01);
297     p_mpeg->i_extension = ( i_header >> 7 ) & 0x01;
298     p_mpeg->i_mode = ( i_header >> 6 ) & 0x03;
299     p_mpeg->i_modeext = ( i_header >> 4 ) & 0x03;
300     p_mpeg->i_copyright = ( i_header >> 3 ) & 0x01;
301     p_mpeg->i_original = ( i_header >> 2 ) & 0x01;
302     p_mpeg->i_emphasis = ( i_header ) & 0x03;
303
304     return( 1 );
305 }
306
307 /*****************************************************************************
308  * ExtractXingHeader : extract a Xing header if exist
309  *****************************************************************************
310  * It also calcul avgbitrate, using Xing header if present or assume that
311  * the bitrate of the first frame is the same for the all file
312  *****************************************************************************/
313 static void ExtractXingHeader( input_thread_t *p_input,
314                                xing_header_t *p_xh )
315 {
316     int i_skip;
317     int i_size;
318     u8  *p_peek;
319     mpeg_header_t mpeg;
320     
321     p_xh->i_flags = 0;  /* nothing present */
322     if( !( GetHeader( p_input,
323                       &mpeg,
324                       8192,
325                       &i_skip ) ) )
326     {
327         msg_Err( p_input, "ExtractXingHeader failed, shouldn't ..." );
328         return;
329     }
330
331     p_xh->i_avgbitrate = mpeg.i_bitrate * 1000; /* default */
332
333     /* 1024 is enougth */
334     if( ( i_size = input_Peek( p_input, &p_peek, 1024 + i_skip ) ) < 8 )
335     {
336         return;
337     }
338     p_peek += i_skip;
339     i_size -= i_skip;
340
341     /* calculate pos of xing header */
342     if( !mpeg.i_version )
343     {
344         p_peek += mpeg.i_mode != 3 ? 36 : 21;
345         i_size -= mpeg.i_mode != 3 ? 36 : 21;
346     }
347     else
348     {
349         p_peek += mpeg.i_mode != 3 ? 21 : 13;
350         i_size -= mpeg.i_mode != 3 ? 21 : 13;
351     }
352     if( i_size < 8 )
353     {
354         return;
355     }
356     if( ( p_peek[0] != 'X' )||( p_peek[1] != 'i' )||
357         ( p_peek[2] != 'n' )||( p_peek[3] != 'g' ) )
358     {
359         return;
360     }
361     else
362     {
363         msg_Dbg( p_input, "Xing header is present" );
364         p_peek += 4;
365         i_size -= 4;
366     }
367     if( i_size < 4 )
368     {
369         return;
370     }
371     else
372     {
373         p_xh->i_flags = GetDWBE( p_peek ); 
374         p_peek += 4;
375         i_size -= 4;
376     }
377
378     if( ( p_xh->i_flags&FRAMES_FLAG )&&( i_size >= 4 ) )
379     {
380         p_xh->i_frames = GetDWBE( p_peek );
381         p_peek += 4;
382         i_size -= 4;
383     }
384     if( ( p_xh->i_flags&BYTES_FLAG ) &&( i_size >= 4 ) )
385
386     {
387         p_xh->i_bytes = GetDWBE( p_peek );
388         p_peek += 4;
389         i_size -= 4;
390     }
391     if( ( p_xh->i_flags&TOC_FLAG ) &&( i_size >= 100 ) )
392
393     {
394         memcpy( p_xh->i_toc, p_peek, 100 );
395         p_peek += 100;
396         i_size -= 100;
397     }
398     if( ( p_xh->i_flags&VBR_SCALE_FLAG ) &&( i_size >= 4 ) )
399
400     {
401         p_xh->i_vbr_scale = GetDWBE( p_peek );
402         p_peek += 4;
403         i_size -= 4;
404     }
405
406     if( ( p_xh->i_flags&FRAMES_FLAG )&&( p_xh->i_flags&BYTES_FLAG ) )
407     {
408         p_xh->i_avgbitrate = 
409               ((u64)p_xh->i_bytes * (u64)8 * (u64)mpeg.i_samplerate) / 
410                ((u64)p_xh->i_frames * (u64)DecodedFrameSize( &mpeg ) );
411     }
412 }
413
414 /****************************************************************************
415  * ExtractConfiguration : extract usefull informations from mpeg_header_t
416  ****************************************************************************/
417 static void ExtractConfiguration( demux_sys_t *p_demux )
418 {
419     p_demux->i_samplerate   = p_demux->mpeg.i_samplerate;
420     
421     p_demux->i_samplelength = DecodedFrameSize( &p_demux->mpeg );    
422
423     /* XXX if crc do i need to add 2 bytes or not? */
424     switch( p_demux->mpeg.i_layer )
425     {
426         case( 0 ):
427             p_demux->i_framelength = 
428                 ( ( ( !p_demux->mpeg.i_version ? 12000 : 6000 ) *
429                            p_demux->mpeg.i_bitrate ) / 
430                        p_demux->mpeg.i_samplerate + p_demux->mpeg.i_padding ) * 4;
431         case( 1 ):
432         case( 2 ):
433             p_demux->i_framelength = 
434                   ( ( !p_demux->mpeg.i_version ? 144000 : 72000 ) *
435                            p_demux->mpeg.i_bitrate ) / 
436                        p_demux->mpeg.i_samplerate + p_demux->mpeg.i_padding;
437     }
438 }
439
440 /****************************************************************************
441  * SkipID3Tag : check if an ID3 header is present and skip it
442  ****************************************************************************
443  *
444  * Author : Sigmund Augdal 
445  * 
446  ****************************************************************************/
447 static int SkipID3Tag( input_thread_t *p_input )
448 {
449     int count;
450     u8  *p_peek;
451     u8  version, revision;
452     int b_footer;
453     int i_size;
454
455     msg_Dbg( p_input, "Checking for ID3 tag" );
456     /* get 10 byte id3 header */    
457     if( ( count = input_Peek( p_input, &p_peek, 10 ) ) < 10 )
458     {
459         msg_Err( p_input, "cannot peek()" );
460         return( -1 );
461     }
462     if ( !( (p_peek[0] == 0x49) && (p_peek[1] == 0x44) && (p_peek[2] == 0x33)))
463     {
464         return( 0 );
465     }
466     
467     version = p_peek[3];  /* These may become usfull later, */
468     revision = p_peek[4]; /* but we ignore them for now */
469
470     b_footer = p_peek[5] & 0x10;
471     i_size = (p_peek[6] << 21) +
472              (p_peek[7] << 14) +
473              (p_peek[8] << 7) +
474              p_peek[9];  /* Is this safe? */
475     if ( b_footer )
476     {
477         i_size += 10;
478     }
479     i_size += 10;
480     msg_Dbg( p_input, "ID3 tag found, skipping %d bytes", i_size );
481     if ( input_Peek( p_input, &p_peek, i_size ) < i_size )
482     {
483         msg_Err( p_input, "cannot peek()" );
484         return( -1 );
485     }
486         
487     p_input->p_current_data += i_size; /* seek passed end of ID3 tag */
488
489     return (0);
490 }
491
492 /****************************************************************************
493  * CheckPS : check if this stream could be some ps, 
494  *           yes it's ugly ...  but another idea ?
495  *
496  ****************************************************************************/
497 static int CheckPS( input_thread_t *p_input )
498 {
499     u8  *p_peek;
500     int i_startcode = 0;
501     int i_size = input_Peek( p_input, &p_peek, 8196 );
502
503     while( i_size > 4 )
504     {
505         if( ( p_peek[0] == 0 ) && ( p_peek[1] == 0 ) &&
506             ( p_peek[2] == 1 ) && ( p_peek[3] >= 0xb9 ) &&
507             ++i_startcode >= 3 )
508         {
509             return 1;
510         }
511         p_peek++;
512         i_size--;
513     }
514
515     return 0;
516 }
517
518 /*****************************************************************************
519  * Activate: initializes MPEGaudio structures
520  *****************************************************************************/
521 static int Activate( vlc_object_t * p_this )
522 {
523     input_thread_t * p_input = (input_thread_t *)p_this;
524     demux_sys_t * p_demux;
525     input_info_category_t * p_category;
526
527     int i_found;
528     int b_forced;
529     int i_skip;
530
531     /* Set the demux function */
532     p_input->pf_demux = Demux;
533
534     /* Initialize access plug-in structures. */
535     if( p_input->i_mtu == 0 )
536     {
537         /* Improve speed. */
538         p_input->i_bufsize = INPUT_DEFAULT_BUFSIZE;
539     }
540
541     if( ( *p_input->psz_demux )
542         &&( ( !strncmp( p_input->psz_demux, "mpegaudio", 10 ) )||
543             ( !strncmp( p_input->psz_demux, "mp3", 3 ) ) ) )
544     {
545         b_forced = 1;
546     }
547     else
548     {
549         b_forced = 0;
550     }
551
552     if ( SkipID3Tag( p_input ) )
553     {
554         return( -1 );
555     }
556
557     /* create p_demux and init it */
558     if( !( p_demux = p_input->p_demux_data = malloc( sizeof(demux_sys_t) ) ) )
559     {
560         msg_Err( p_input, "out of memory" );
561         return( -1 );
562     }
563     memset( p_demux, 0, sizeof(demux_sys_t) );
564    
565     /* check if it could be a ps stream */
566     if( !b_forced && CheckPS(  p_input ))
567     {
568         return( -1 );
569     }
570
571
572     /* must be sure that is mpeg audio stream unless forced */
573     if( !( i_found = GetHeader( p_input,
574                                 &p_demux->mpeg,
575                                 b_forced ? 4000 : MPEGAUDIO_MAXTESTPOS,
576                                 &i_skip ) ) )
577     {
578         if( b_forced )
579         {
580             msg_Warn( p_input, 
581                       "this does not look like an MPEG audio stream, "
582                       "but continuing anyway" );
583         }
584         else
585         {
586             msg_Warn( p_input, "MPEGAudio module discarded (no frame found)" );
587             return( -1 );
588         }
589     }
590     else
591     {
592         ExtractConfiguration( p_demux );
593     }
594
595     
596     vlc_mutex_lock( &p_input->stream.stream_lock );
597     if( input_InitStream( p_input, 0 ) == -1)
598     {
599         msg_Err( p_input, "cannot init stream" );
600         return( -1 );
601     }    
602     if( input_AddProgram( p_input, 0, 0) == NULL )
603     {
604         msg_Err( p_input, "cannot add program" );
605         return( -1 );
606     }
607     p_input->stream.pp_programs[0]->b_is_ok = 0;
608     p_input->stream.p_selected_program = p_input->stream.pp_programs[0];
609     
610     /* create our ES */ 
611     p_demux->p_es = input_AddES( p_input, 
612                                  p_input->stream.p_selected_program,
613                                  1, /* id */
614                                  0 );
615     if( !p_demux->p_es )
616     {
617         vlc_mutex_unlock( &p_input->stream.stream_lock );
618         msg_Err( p_input, "out of memory" );
619         return( -1 );
620     }
621     p_demux->p_es->i_stream_id = 1;
622     p_demux->p_es->i_fourcc = VLC_FOURCC('m','p','g','a');
623     p_demux->p_es->i_cat = AUDIO_ES;
624
625     input_SelectES( p_input, p_demux->p_es );
626
627     p_input->stream.p_selected_program->b_is_ok = 1;
628     vlc_mutex_unlock( &p_input->stream.stream_lock );
629
630
631     if( i_found )
632     {
633         /* parse Xing Header if present */
634         ExtractXingHeader( p_input, &p_demux->xingheader );
635     
636         vlc_mutex_lock( &p_input->stream.stream_lock );
637         p_input->stream.i_mux_rate = p_demux->xingheader.i_avgbitrate / 50 / 8;
638         vlc_mutex_unlock( &p_input->stream.stream_lock );
639
640
641         /* all is ok :)) */
642         msg_Dbg( p_input, "audio MPEG-%d layer %d %s %dHz %dKb/s %s",
643                 p_demux->mpeg.i_version + 1,
644                 p_demux->mpeg.i_layer + 1,
645                 mpegaudio_mode[p_demux->mpeg.i_mode],
646                 p_demux->mpeg.i_samplerate,
647                 p_demux->xingheader.i_avgbitrate / 1000,
648                 p_demux->xingheader.i_flags ?
649                         "VBR (Xing)" : "" 
650                     );
651
652         vlc_mutex_lock( &p_input->stream.stream_lock );
653         p_category = input_InfoCategory( p_input, "mpeg" );
654         input_AddInfo( p_category, "input type", "audio MPEG-%d",
655                        p_demux->mpeg.i_version +1 );
656         input_AddInfo( p_category, "layer", "%d", p_demux->mpeg.i_layer + 1 );
657         input_AddInfo( p_category, "mode", 
658                        mpegaudio_mode[p_demux->mpeg.i_mode] );
659         input_AddInfo( p_category, "sample rate", "%dHz",
660                        p_demux->mpeg.i_samplerate );
661         input_AddInfo( p_category, "average bitrate", "%dKb/s",
662                        p_demux->xingheader.i_avgbitrate / 1000 );
663         vlc_mutex_unlock( &p_input->stream.stream_lock );
664     }
665     else
666     {
667         msg_Dbg( p_input, 
668                  "assuming audio MPEG, but not frame header yet found" );
669         vlc_mutex_lock( &p_input->stream.stream_lock );
670         p_category = input_InfoCategory( p_input, "mpeg" );
671         input_AddInfo( p_category, "input type", "audio MPEG-?" );
672         vlc_mutex_unlock( &p_input->stream.stream_lock );
673
674     }
675 #if 0
676     /* seems now to be ok */
677
678     /* FIXME FIXME FIXME FIXME FIXME FIXME FIXME */
679     /* if i don't do that, it don't work correctly but why ??? */
680
681     /* XXX Sigmund : if you want to seek use this :) 
682        but it work only with file .... ( http doesn't like seeking */
683     if( p_input->stream.b_seekable )
684     {
685         p_input->pf_seek( p_input, 0 ); // 0 -> seek at position 0
686         input_AccessReinit( p_input );
687     }
688 #endif
689
690     return( 0 );
691 }
692
693 /*****************************************************************************
694  * Demux: reads and demuxes data packets
695  *****************************************************************************
696  * Returns -1 in case of error, 0 in case of EOF, 1 otherwise
697  *****************************************************************************/
698 static int Demux( input_thread_t * p_input )
699 {
700     demux_sys_t  *p_demux = p_input->p_demux_data;
701     pes_packet_t *p_pes;
702     int          i_skip;
703     
704     if( !GetHeader( p_input, 
705                     &p_demux->mpeg,
706                     8192,
707                     &i_skip ) )
708     {
709         if( i_skip > 0)
710         {
711             msg_Dbg( p_input,
712                      "skipping %d bytes (garbage ?)",
713                      i_skip );
714             SkipBytes( p_input, i_skip );
715             return( 1 );
716         }
717         else
718         {
719             msg_Dbg( p_input,
720                      "cannot find next frame (EOF ?)" );
721             return( 0 );
722         }
723     }
724
725     ExtractConfiguration( p_demux );
726      
727     input_ClockManageRef( p_input,
728                           p_input->stream.p_selected_program,
729                           p_demux->i_pts );
730    
731     /*
732      * For layer 1 and 2 i_skip is garbage but for layer 3 it is not.
733      * Since mad accept without to much trouble garbage I don't skip
734      * it ( in case I misdetect garbage ... )
735      *
736      */
737     if( !ReadPES( p_input, &p_pes, p_demux->i_framelength + i_skip) )
738     {
739         msg_Err( p_input,
740                 "cannot read data" );
741         return( -1 );
742     }
743     
744     p_pes->i_dts =
745         p_pes->i_pts = input_ClockGetTS( p_input,
746                                          p_input->stream.p_selected_program,
747                                          p_demux->i_pts );
748
749     if( !p_demux->p_es->p_decoder_fifo )
750     {
751         msg_Err( p_input, "no audio decoder" );
752         input_DeletePES( p_input->p_method_data, p_pes );
753         return( -1 ); /* perhaps not, it's my choice */
754     }
755     else
756     {
757         input_DecodePES( p_demux->p_es->p_decoder_fifo, p_pes );
758     }
759     p_demux->i_pts += (mtime_t)90000 * 
760                       (mtime_t)p_demux->i_samplelength /
761                       (mtime_t)p_demux->i_samplerate;
762     return( 1 );
763    
764 }
765
766