]> git.sesse.net Git - vlc/blob - modules/codec/mpeg_audio.c
* modules/codec/mpeg_audio.c: debug_message--;
[vlc] / modules / codec / mpeg_audio.c
1 /*****************************************************************************
2  * mpeg_audio.c: parse MPEG audio sync info and packetize the stream
3  *****************************************************************************
4  * Copyright (C) 2001-2003 VideoLAN
5  * $Id: mpeg_audio.c,v 1.21 2003/10/23 21:28:11 gbazin Exp $
6  *
7  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8  *          Eric Petit <titer@videolan.org>
9  *          Christophe Massiot <massiot@via.ecp.fr>
10  *          Gildas Bazin <gbazin@netcourrier.com>
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License as published by
14  * the Free Software Foundation; either version 2 of the License, or
15  * (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
25  *****************************************************************************/
26
27 /*****************************************************************************
28  * Preamble
29  *****************************************************************************/
30 #include <stdlib.h>                                      /* malloc(), free() */
31 #include <string.h>                                              /* strdup() */
32
33 #include <vlc/vlc.h>
34 #include <vlc/decoder.h>
35 #include <vlc/input.h>
36 #include <vlc/aout.h>
37 #include <vlc/sout.h>
38
39 #include "vlc_block_helper.h"
40
41 /*****************************************************************************
42  * decoder_sys_t : decoder descriptor
43  *****************************************************************************/
44 struct decoder_sys_t
45 {
46     /* Module mode */
47     vlc_bool_t b_packetizer;
48
49     /*
50      * Input properties
51      */
52     int        i_state;
53
54     block_t *p_chain;
55     block_bytestream_t bytestream;
56
57     /*
58      * Decoder output properties
59      */
60     aout_instance_t *     p_aout;                                  /* opaque */
61     aout_input_t *        p_aout_input;                            /* opaque */
62     audio_sample_format_t aout_format;
63     aout_buffer_t *       p_aout_buffer; /* current aout buffer being filled */
64
65     /*
66      * Packetizer output properties
67      */
68     sout_packetizer_input_t *p_sout_input;
69     sout_format_t           sout_format;
70     sout_buffer_t *         p_sout_buffer;            /* current sout buffer */
71
72     /*
73      * Common properties
74      */
75     uint8_t               *p_out_buffer;                    /* output buffer */
76     audio_date_t          end_date;
77     unsigned int          i_current_layer;
78
79     mtime_t pts;
80
81     int i_frame_size, i_free_frame_size;
82     unsigned int i_channels_conf, i_channels;
83     unsigned int i_rate, i_max_frame_size, i_frame_length;
84     unsigned int i_layer, i_bit_rate;
85 };
86
87 enum {
88
89     STATE_NOSYNC,
90     STATE_SYNC,
91     STATE_HEADER,
92     STATE_NEXT_SYNC,
93     STATE_DATA
94 };
95
96 /* This isn't the place to put mad-specific stuff. However, it makes the
97  * mad plug-in's life much easier if we put 8 extra bytes at the end of the
98  * buffer, because that way it doesn't have to copy the aout_buffer_t to a
99  * bigger buffer. This has no implication on other plug-ins, and we only
100  * lose 8 bytes per frame. --Meuuh */
101 #define MAD_BUFFER_GUARD 8
102 #define MPGA_HEADER_SIZE 4
103
104 /****************************************************************************
105  * Local prototypes
106  ****************************************************************************/
107 static int OpenDecoder   ( vlc_object_t * );
108 static int OpenPacketizer( vlc_object_t * );
109
110 static int InitDecoder   ( decoder_t * );
111 static int RunDecoder    ( decoder_t *, block_t * );
112 static int EndDecoder    ( decoder_t * );
113
114 static int GetOutBuffer ( decoder_t *, uint8_t ** );
115 static int GetAoutBuffer( decoder_t *, aout_buffer_t ** );
116 static int GetSoutBuffer( decoder_t *, sout_buffer_t ** );
117 static int SendOutBuffer( decoder_t * );
118
119 static int SyncInfo( uint32_t i_header, unsigned int * pi_channels,
120                      unsigned int * pi_channels_conf,
121                      unsigned int * pi_sample_rate, unsigned int * pi_bit_rate,
122                      unsigned int * pi_frame_length,
123                      unsigned int * pi_max_frame_size,
124                      unsigned int * pi_layer );
125
126 /*****************************************************************************
127  * Module descriptor
128  *****************************************************************************/
129 vlc_module_begin();
130     set_description( _("MPEG audio layer I/II/III parser") );
131     set_capability( "decoder", 100 );
132     set_callbacks( OpenDecoder, NULL );
133
134     add_submodule();
135     set_description( _("MPEG audio layer I/II/III packetizer") );
136     set_capability( "packetizer", 10 );
137     set_callbacks( OpenPacketizer, NULL );
138 vlc_module_end();
139
140 /*****************************************************************************
141  * OpenDecoder: probe the decoder and return score
142  *****************************************************************************/
143 static int OpenDecoder( vlc_object_t *p_this )
144 {
145     decoder_t *p_dec = (decoder_t*)p_this;
146
147     if( p_dec->p_fifo->i_fourcc != VLC_FOURCC( 'm', 'p', 'g', 'a') )
148     {
149         return VLC_EGENERIC;
150     }
151
152     p_dec->pf_init = InitDecoder;
153     p_dec->pf_decode = RunDecoder;
154     p_dec->pf_end = EndDecoder;
155
156     /* Allocate the memory needed to store the decoder's structure */
157     if( ( p_dec->p_sys =
158           (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
159     {
160         msg_Err( p_dec, "out of memory" );
161         return VLC_EGENERIC;
162     }
163     p_dec->p_sys->b_packetizer = VLC_FALSE;
164
165     return VLC_SUCCESS;
166 }
167
168 static int OpenPacketizer( vlc_object_t *p_this )
169 {
170     decoder_t *p_dec = (decoder_t*)p_this;
171
172     int i_ret = OpenDecoder( p_this );
173
174     if( i_ret == VLC_SUCCESS ) p_dec->p_sys->b_packetizer = VLC_TRUE;
175
176     return i_ret;
177 }
178
179 /*****************************************************************************
180  * InitDecoder: Initalize the decoder
181  *****************************************************************************/
182 static int InitDecoder( decoder_t *p_dec )
183 {
184     p_dec->p_sys->i_state = STATE_NOSYNC;
185
186     p_dec->p_sys->p_out_buffer = NULL;
187     aout_DateSet( &p_dec->p_sys->end_date, 0 );
188
189     p_dec->p_sys->p_aout = NULL;
190     p_dec->p_sys->p_aout_input = NULL;
191     p_dec->p_sys->p_aout_buffer = NULL;
192     p_dec->p_sys->aout_format.i_format = VLC_FOURCC('m','p','g','a');
193
194     p_dec->p_sys->p_sout_input = NULL;
195     p_dec->p_sys->p_sout_buffer = NULL;
196     p_dec->p_sys->sout_format.i_cat = AUDIO_ES;
197     p_dec->p_sys->sout_format.i_fourcc = VLC_FOURCC('m','p','g','a');
198
199     /* Start with the minimum size for a free bitrate frame */
200     p_dec->p_sys->i_free_frame_size = MPGA_HEADER_SIZE;
201
202     p_dec->p_sys->p_chain = NULL;
203
204     return VLC_SUCCESS;
205 }
206
207 /****************************************************************************
208  * RunDecoder: the whole thing
209  ****************************************************************************
210  * This function is called just after the thread is launched.
211  ****************************************************************************/
212 static int RunDecoder( decoder_t *p_dec, block_t *p_block )
213 {
214     decoder_sys_t *p_sys = p_dec->p_sys;
215     uint8_t p_header[MAD_BUFFER_GUARD];
216     uint32_t i_header;
217
218     if( !aout_DateGet( &p_sys->end_date ) && !p_block->i_pts )
219     {
220         /* We've just started the stream, wait for the first PTS. */
221         block_Release( p_block );
222         return VLC_SUCCESS;
223     }
224
225     if( p_block->b_discontinuity )
226     {
227         p_sys->i_state = STATE_SYNC;
228     }
229
230     if( p_sys->p_chain )
231     {
232         block_ChainAppend( &p_sys->p_chain, p_block );
233     }
234     else
235     {
236         block_ChainAppend( &p_sys->p_chain, p_block );
237         p_sys->bytestream = block_BytestreamInit( p_dec, p_sys->p_chain, 0 );
238     }
239
240     while( 1 )
241     {
242         switch( p_sys->i_state )
243         {
244
245         case STATE_NOSYNC:
246             while( block_PeekBytes( &p_sys->bytestream, p_header, 2 )
247                    == VLC_SUCCESS )
248             {
249                 /* Look for sync word - should be 0xffe */
250                 if( p_header[0] == 0xff && (p_header[1] & 0xe0) == 0xe0 )
251                 {
252                     p_sys->i_state = STATE_SYNC;
253                     break;
254                 }
255                 block_SkipByte( &p_sys->bytestream );
256             }
257             if( p_sys->i_state != STATE_SYNC )
258             {
259                 if( block_PeekByte( &p_sys->bytestream, p_header )
260                     == VLC_SUCCESS && p_header[0] == 0xff )
261                 {
262                     /* Start of a sync word, need more data */
263                     return VLC_SUCCESS;
264                 }
265
266                 block_ChainRelease( p_sys->p_chain );
267                 p_sys->p_chain = NULL;
268
269                 /* Need more data */
270                 return VLC_SUCCESS;
271             }
272
273         case STATE_SYNC:
274             /* New frame, set the Presentation Time Stamp */
275             p_sys->pts = p_sys->bytestream.p_block->i_pts;
276             if( p_sys->pts != 0 &&
277                 p_sys->pts != aout_DateGet( &p_sys->end_date ) )
278             {
279                 aout_DateSet( &p_sys->end_date, p_sys->pts );
280             }
281             p_sys->i_state = STATE_HEADER;
282             break;
283
284         case STATE_HEADER:
285             /* Get MPGA frame header (MPGA_HEADER_SIZE bytes) */
286             if( block_PeekBytes( &p_sys->bytestream, p_header,
287                                  MPGA_HEADER_SIZE ) != VLC_SUCCESS )
288             {
289                 /* Need more data */
290                 return VLC_SUCCESS;
291             }
292
293             /* Build frame header */
294             i_header = (p_header[0]<<24)|(p_header[1]<<16)|(p_header[2]<<8)
295                        |p_header[3];
296
297             /* Check if frame is valid and get frame info */
298             p_sys->i_frame_size = SyncInfo( i_header,
299                                             &p_sys->i_channels,
300                                             &p_sys->i_channels_conf,
301                                             &p_sys->i_rate,
302                                             &p_sys->i_bit_rate,
303                                             &p_sys->i_frame_length,
304                                             &p_sys->i_max_frame_size,
305                                             &p_sys->i_layer );
306
307             if( p_sys->i_frame_size == -1 )
308             {
309                 msg_Dbg( p_dec, "emulated start code" );
310                 block_SkipByte( &p_sys->bytestream );
311                 p_sys->i_state = STATE_NOSYNC;
312                 break;
313             }
314
315             if( p_sys->i_bit_rate == 0 )
316             {
317                 /* Free birate, but 99% emulated startcode :( */
318                 if( p_dec->p_sys->i_free_frame_size == MPGA_HEADER_SIZE )
319                 {
320                     msg_Dbg( p_dec, "free bitrate mode");
321                 }
322                 p_sys->i_frame_size = p_sys->i_free_frame_size;
323             }
324
325             p_sys->i_state = STATE_NEXT_SYNC;
326
327         case STATE_NEXT_SYNC:
328             /* TODO: If p_block == NULL, flush the buffer without checking the
329              * next sync word */
330
331             /* Check if next expected frame contains the sync word */
332             if( block_PeekOffsetBytes( &p_sys->bytestream,
333                                        p_sys->i_frame_size, p_header,
334                                        MAD_BUFFER_GUARD ) != VLC_SUCCESS )
335             {
336                 /* Need more data */
337                 return VLC_SUCCESS;
338             }
339
340             if( p_header[0] == 0xff && (p_header[1] & 0xe0) == 0xe0 )
341             {
342                 /* Startcode is fine, let's try the header as an extra check */
343                 int i_next_frame_size;
344                 unsigned int i_next_channels, i_next_channels_conf;
345                 unsigned int i_next_rate, i_next_bit_rate;
346                 unsigned int i_next_frame_length, i_next_max_frame_size;
347                 unsigned int i_next_layer;
348
349                 /* Build frame header */
350                 i_header = (p_header[0]<<24)|(p_header[1]<<16)|(p_header[2]<<8)
351                            |p_header[3];
352
353                 i_next_frame_size = SyncInfo( i_header,
354                                               &i_next_channels,
355                                               &i_next_channels_conf,
356                                               &i_next_rate,
357                                               &i_next_bit_rate,
358                                               &i_next_frame_length,
359                                               &i_next_max_frame_size,
360                                               &i_next_layer );
361
362                 if( i_next_frame_size == -1 )
363                 {
364                     msg_Dbg( p_dec, "emulated start code on next frame" );
365                     block_SkipByte( &p_sys->bytestream );
366                     p_sys->i_state = STATE_NOSYNC;
367                     break;
368                 }
369
370                 /* Free bitrate only */
371                 if( p_sys->i_bit_rate == 0 )
372                 {
373                     if( i_next_bit_rate != 0 )
374                     {
375                         p_sys->i_frame_size++;
376                         break;
377                     }
378
379                     if( (unsigned int)p_sys->i_frame_size >
380                         p_sys->i_max_frame_size )
381                     {
382                         msg_Dbg( p_dec, "frame too big %d > %d "
383                                  "(emulated startcode ?)", p_sys->i_frame_size,
384                                  p_sys->i_max_frame_size );
385                         block_SkipByte( &p_sys->bytestream );
386                         p_sys->i_state = STATE_NOSYNC;
387                         p_sys->i_free_frame_size = MPGA_HEADER_SIZE;
388                         break;
389                     }
390                 }
391
392                 /* Check info is in sync with previous one */
393                 if( i_next_channels_conf != p_sys->i_channels_conf ||
394                     i_next_rate != p_sys->i_rate ||
395                     i_next_layer != p_sys->i_layer ||
396                     i_next_frame_length != p_sys->i_frame_length )
397                 {
398                     /* Free bitrate only */
399                     if( p_sys->i_bit_rate == 0 )
400                     {
401                         p_sys->i_frame_size++;
402                         break;
403                     }
404
405                     msg_Dbg( p_dec, "parameters changed unexpectedly "
406                              "(emulated startcode ?)" );
407                     block_SkipByte( &p_sys->bytestream );
408                     p_sys->i_state = STATE_NOSYNC;
409                     break;
410                 }
411             }
412             else
413             {
414                 /* Free bitrate only */
415                 if( p_sys->i_bit_rate == 0 )
416                 {
417                     p_sys->i_frame_size++;
418                     break;
419                 }
420
421                 msg_Dbg( p_dec, "emulated startcode "
422                          "(no startcode on following frame)" );
423                 p_sys->i_state = STATE_NOSYNC;
424                 block_SkipByte( &p_sys->bytestream );
425                 break;
426             }
427
428             if( GetOutBuffer( p_dec, &p_sys->p_out_buffer ) != VLC_SUCCESS )
429             {
430                 return VLC_EGENERIC;
431             }
432
433             /* Free bitrate only */
434             if( p_sys->i_bit_rate == 0 )
435             {
436                 p_sys->i_free_frame_size = p_sys->i_frame_size;
437             }
438
439             p_sys->i_state = STATE_DATA;
440
441         case STATE_DATA:
442             /* Copy the whole frame into the buffer */
443             if( block_GetBytes( &p_sys->bytestream, p_sys->p_out_buffer,
444                                 p_sys->i_frame_size ) != VLC_SUCCESS )
445             {
446                 /* Need more data */
447                 return VLC_SUCCESS;
448             }
449
450             p_sys->p_chain = block_BytestreamFlush( &p_sys->bytestream );
451
452             /* Get beginning of next frame for libmad */
453             if( !p_sys->b_packetizer )
454             {
455                 memcpy( p_sys->p_out_buffer + p_sys->i_frame_size,
456                         p_header, MAD_BUFFER_GUARD );
457             }
458
459             SendOutBuffer( p_dec );
460             p_sys->i_state = STATE_NOSYNC;
461
462             /* Make sure we don't reuse the same pts twice */
463             if( p_sys->pts == p_sys->bytestream.p_block->i_pts )
464                 p_sys->pts = p_sys->bytestream.p_block->i_pts = 0;
465         }
466     }
467
468     return VLC_SUCCESS;
469 }
470
471 /*****************************************************************************
472  * GetOutBuffer:
473  *****************************************************************************/
474 static int GetOutBuffer( decoder_t *p_dec, uint8_t **pp_out_buffer )
475 {
476     decoder_sys_t *p_sys = p_dec->p_sys;
477     int i_ret;
478
479     if( p_sys->b_packetizer )
480     {
481         i_ret = GetSoutBuffer( p_dec, &p_sys->p_sout_buffer );
482         *pp_out_buffer =
483             p_sys->p_sout_buffer ? p_sys->p_sout_buffer->p_buffer : NULL;
484     }
485     else
486     {
487         i_ret = GetAoutBuffer( p_dec, &p_sys->p_aout_buffer );
488         *pp_out_buffer =
489             p_sys->p_aout_buffer ? p_sys->p_aout_buffer->p_buffer : NULL;
490     }
491
492     return i_ret;
493 }
494
495 /*****************************************************************************
496  * GetAoutBuffer:
497  *****************************************************************************/
498 static int GetAoutBuffer( decoder_t *p_dec, aout_buffer_t **pp_buffer )
499 {
500     decoder_sys_t *p_sys = p_dec->p_sys;
501
502     if( p_sys->p_aout_input != NULL &&
503         ( p_sys->aout_format.i_rate != p_sys->i_rate
504         || p_sys->aout_format.i_original_channels != p_sys->i_channels_conf
505         || p_sys->aout_format.i_bytes_per_frame !=
506            p_sys->i_max_frame_size + MAD_BUFFER_GUARD
507         || p_sys->aout_format.i_frame_length != p_sys->i_frame_length
508         || p_sys->i_current_layer != p_sys->i_layer ) )
509     {
510         /* Parameters changed - this should not happen. */
511         aout_DecDelete( p_sys->p_aout, p_sys->p_aout_input );
512         p_sys->p_aout_input = NULL;
513     }
514
515     /* Creating the audio input if not created yet. */
516     if( p_sys->p_aout_input == NULL )
517     {
518         p_sys->i_current_layer = p_sys->i_layer;
519         if( p_sys->i_layer == 3 )
520         {
521             p_sys->aout_format.i_format = VLC_FOURCC('m','p','g','3');
522         }
523         else
524         {
525             p_sys->aout_format.i_format = VLC_FOURCC('m','p','g','a');
526         }
527
528         p_sys->aout_format.i_rate = p_sys->i_rate;
529         p_sys->aout_format.i_original_channels = p_sys->i_channels_conf;
530         p_sys->aout_format.i_physical_channels
531             = p_sys->i_channels_conf & AOUT_CHAN_PHYSMASK;
532         p_sys->aout_format.i_bytes_per_frame = p_sys->i_max_frame_size
533             + MAD_BUFFER_GUARD;
534         p_sys->aout_format.i_frame_length = p_sys->i_frame_length;
535         aout_DateInit( &p_sys->end_date, p_sys->i_rate );
536         aout_DateSet( &p_sys->end_date, p_sys->pts );
537         p_sys->p_aout_input = aout_DecNew( p_dec,
538                                            &p_sys->p_aout,
539                                            &p_sys->aout_format );
540         if( p_sys->p_aout_input == NULL )
541         {
542             *pp_buffer = NULL;
543             return VLC_EGENERIC;
544         }
545     }
546
547     *pp_buffer = aout_DecNewBuffer( p_sys->p_aout, p_sys->p_aout_input,
548                                     p_sys->i_frame_length );
549     if( *pp_buffer == NULL )
550     {
551         return VLC_EGENERIC;
552     }
553
554     (*pp_buffer)->start_date = aout_DateGet( &p_sys->end_date );
555     (*pp_buffer)->end_date =
556          aout_DateIncrement( &p_sys->end_date, p_sys->i_frame_length );
557
558     return VLC_SUCCESS;
559 }
560
561 /*****************************************************************************
562  * GetSoutBuffer:
563  *****************************************************************************/
564 static int GetSoutBuffer( decoder_t *p_dec, sout_buffer_t **pp_buffer )
565 {
566     decoder_sys_t *p_sys = p_dec->p_sys;
567
568     if( p_sys->p_sout_input != NULL &&
569         ( p_sys->sout_format.i_sample_rate != (int)p_sys->i_rate
570           || p_sys->sout_format.i_channels != (int)p_sys->i_channels ) )
571     {
572         /* Parameters changed - this should not happen. */
573     }
574
575     /* Creating the sout input if not created yet. */
576     if( p_sys->p_sout_input == NULL )
577     {
578         p_sys->sout_format.i_sample_rate = p_sys->i_rate;
579         p_sys->sout_format.i_channels    = p_sys->i_channels;
580         p_sys->sout_format.i_block_align = 0;
581         p_sys->sout_format.i_bitrate     = p_sys->i_bit_rate;
582         p_sys->sout_format.i_extra_data  = 0;
583         p_sys->sout_format.p_extra_data  = NULL;
584
585         aout_DateInit( &p_sys->end_date, p_sys->i_rate );
586         aout_DateSet( &p_sys->end_date, p_sys->pts );
587
588         p_sys->p_sout_input = sout_InputNew( p_dec, &p_sys->sout_format );
589         if( p_sys->p_sout_input == NULL )
590         {
591             msg_Err( p_dec, "cannot add a new stream" );
592             *pp_buffer = NULL;
593             return VLC_EGENERIC;
594         }
595         msg_Info( p_dec, "MPGA channels:%d samplerate:%d bitrate:%d",
596                   p_sys->i_channels, p_sys->i_rate, p_sys->i_bit_rate );
597     }
598
599     *pp_buffer = sout_BufferNew( p_sys->p_sout_input->p_sout,
600                                  p_sys->i_frame_size );
601     if( *pp_buffer == NULL )
602     {
603         return VLC_EGENERIC;
604     }
605
606     (*pp_buffer)->i_pts =
607         (*pp_buffer)->i_dts = aout_DateGet( &p_sys->end_date );
608
609     (*pp_buffer)->i_length =
610         aout_DateIncrement( &p_sys->end_date, p_sys->i_frame_length )
611         - (*pp_buffer)->i_pts;
612
613     return VLC_SUCCESS;
614 }
615
616 /*****************************************************************************
617  * SendOutBuffer:
618  *****************************************************************************/
619 static int SendOutBuffer( decoder_t *p_dec )
620 {
621     decoder_sys_t *p_sys = p_dec->p_sys;
622
623     if( p_sys->b_packetizer )
624     {
625         sout_InputSendBuffer( p_sys->p_sout_input, p_sys->p_sout_buffer );
626         p_sys->p_sout_buffer = NULL;
627     }
628     else
629     {
630         /* We have all we need, send the buffer to the aout core. */
631         p_sys->p_aout_buffer->i_nb_bytes =
632             p_sys->i_frame_size + MAD_BUFFER_GUARD;
633         aout_DecPlay( p_sys->p_aout, p_sys->p_aout_input,
634                       p_sys->p_aout_buffer );
635         p_sys->p_aout_buffer = NULL;
636     }
637
638     p_sys->p_out_buffer = NULL;
639
640     return VLC_SUCCESS;
641 }
642
643 /*****************************************************************************
644  * EndDecoder: clean up the decoder
645  *****************************************************************************/
646 static int EndDecoder( decoder_t *p_dec )
647 {
648     if( p_dec->p_sys->p_aout_input != NULL )
649     {
650         if( p_dec->p_sys->p_aout_buffer )
651         {
652             aout_DecDeleteBuffer( p_dec->p_sys->p_aout,
653                                   p_dec->p_sys->p_aout_input,
654                                   p_dec->p_sys->p_aout_buffer );
655         }
656
657         aout_DecDelete( p_dec->p_sys->p_aout, p_dec->p_sys->p_aout_input );
658     }
659
660     if( p_dec->p_sys->p_sout_input != NULL )
661     {
662         if( p_dec->p_sys->p_sout_buffer )
663         {
664             sout_BufferDelete( p_dec->p_sys->p_sout_input->p_sout,
665                                p_dec->p_sys->p_sout_buffer );
666         }
667
668         sout_InputDelete( p_dec->p_sys->p_sout_input );
669     }
670
671     if( p_dec->p_sys->p_chain ) block_ChainRelease( p_dec->p_sys->p_chain );
672
673     free( p_dec->p_sys );
674
675     return VLC_SUCCESS;
676 }
677
678 /*****************************************************************************
679  * SyncInfo: parse MPEG audio sync info
680  *****************************************************************************/
681 static int SyncInfo( uint32_t i_header, unsigned int * pi_channels,
682                      unsigned int * pi_channels_conf,
683                      unsigned int * pi_sample_rate, unsigned int * pi_bit_rate,
684                      unsigned int * pi_frame_length,
685                      unsigned int * pi_max_frame_size, unsigned int * pi_layer)
686 {
687     static const int ppi_bitrate[2][3][16] =
688     {
689         {
690             /* v1 l1 */
691             { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384,
692               416, 448, 0},
693             /* v1 l2 */
694             { 0, 32, 48, 56,  64,  80,  96, 112, 128, 160, 192, 224, 256,
695               320, 384, 0},
696             /* v1 l3 */
697             { 0, 32, 40, 48,  56,  64,  80,  96, 112, 128, 160, 192, 224,
698               256, 320, 0}
699         },
700
701         {
702             /* v2 l1 */
703             { 0, 32, 48, 56,  64,  80,  96, 112, 128, 144, 160, 176, 192,
704               224, 256, 0},
705             /* v2 l2 */
706             { 0,  8, 16, 24,  32,  40,  48,  56,  64,  80,  96, 112, 128,
707               144, 160, 0},
708             /* v2 l3 */
709             { 0,  8, 16, 24,  32,  40,  48,  56,  64,  80,  96, 112, 128,
710               144, 160, 0}
711         }
712     };
713
714     static const int ppi_samplerate[2][4] = /* version 1 then 2 */
715     {
716         { 44100, 48000, 32000, 0 },
717         { 22050, 24000, 16000, 0 }
718     };
719
720     int i_version, i_mode, i_emphasis;
721     vlc_bool_t b_padding, b_mpeg_2_5, b_crc;
722     int i_frame_size = 0;
723     int i_bitrate_index, i_samplerate_index;
724     int i_max_bit_rate;
725
726     b_mpeg_2_5  = 1 - ((i_header & 0x100000) >> 20);
727     i_version   = 1 - ((i_header & 0x80000) >> 19);
728     *pi_layer   = 4 - ((i_header & 0x60000) >> 17);
729     b_crc = !((i_header >> 16) & 0x01);
730     i_bitrate_index = (i_header & 0xf000) >> 12;
731     i_samplerate_index = (i_header & 0xc00) >> 10;
732     b_padding   = (i_header & 0x200) >> 9;
733     /* Extension */
734     i_mode      = (i_header & 0xc0) >> 6;
735     /* Modeext, copyright & original */
736     i_emphasis  = i_header & 0x3;
737
738     if( *pi_layer != 4 &&
739         i_bitrate_index < 0x0f &&
740         i_samplerate_index != 0x03 &&
741         i_emphasis != 0x02 )
742     {
743         switch ( i_mode )
744         {
745         case 0: /* stereo */
746         case 1: /* joint stereo */
747             *pi_channels = 2;
748             *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
749             break;
750         case 2: /* dual-mono */
751             *pi_channels = 2;
752             *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT
753                                 | AOUT_CHAN_DUALMONO;
754             break;
755         case 3: /* mono */
756             *pi_channels = 1;
757             *pi_channels_conf = AOUT_CHAN_CENTER;
758             break;
759         }
760         *pi_bit_rate = ppi_bitrate[i_version][*pi_layer-1][i_bitrate_index];
761         i_max_bit_rate = ppi_bitrate[i_version][*pi_layer-1][14];
762         *pi_sample_rate = ppi_samplerate[i_version][i_samplerate_index];
763
764         if ( b_mpeg_2_5 )
765         {
766             *pi_sample_rate >>= 1;
767         }
768
769         switch( *pi_layer )
770         {
771         case 1:
772             i_frame_size = ( 12000 * *pi_bit_rate / *pi_sample_rate +
773                            b_padding ) * 4;
774             *pi_max_frame_size = ( 12000 * i_max_bit_rate /
775                                  *pi_sample_rate + 1 ) * 4;
776             *pi_frame_length = 384;
777             break;
778
779         case 2:
780             i_frame_size = 144000 * *pi_bit_rate / *pi_sample_rate + b_padding;
781             *pi_max_frame_size = 144000 * i_max_bit_rate / *pi_sample_rate + 1;
782             *pi_frame_length = 1152;
783             break;
784
785         case 3:
786             i_frame_size = ( i_version ? 72000 : 144000 ) *
787                            *pi_bit_rate / *pi_sample_rate + b_padding;
788             *pi_max_frame_size = ( i_version ? 72000 : 144000 ) *
789                                  i_max_bit_rate / *pi_sample_rate + 1;
790             *pi_frame_length = i_version ? 576 : 1152;
791             break;
792
793         default:
794             break;
795         }
796     }
797     else
798     {
799         return -1;
800     }
801
802     return i_frame_size;
803 }