]> git.sesse.net Git - vlc/blob - modules/codec/mad/libmad.c
* Fixed filters which couldn't work with more than 2 channels ;
[vlc] / modules / codec / mad / libmad.c
1 /***************************************************************************
2              libmad.c  -  description
3                -------------------
4     Functions that are called by libmad to communicate with vlc decoder
5     infrastructure.
6
7     begin                : Mon Nov 5 2001
8     copyright            : (C) 2001 by Jean-Paul Saman
9     email                : jpsaman@wxs.nl
10  ***************************************************************************/
11
12 /***************************************************************************
13  *                                                                         *
14  *   This program is free software; you can redistribute it and/or modify  *
15  *   it under the terms of the GNU General Public License as published by  *
16  *   the Free Software Foundation; either version 2 of the License, or     *
17  *   (at your option) any later version.                                   *
18  *                                                                         *
19  ***************************************************************************/
20
21 /*****************************************************************************
22  * Preamble
23  *****************************************************************************/
24 #include <stdlib.h>                                      /* malloc(), free() */
25 #include <string.h>                                              /* strdup() */
26
27 #include <vlc/vlc.h>
28 #include <vlc/aout.h>
29 #include <vlc/decoder.h>
30
31 /*****************************************************************************
32  * Libmad includes files
33  *****************************************************************************/
34 #include <mad.h>
35 #include "decoder.h"
36 #include "libmad.h"
37
38 static void PrintFrameInfo(struct mad_header *Header);
39
40 /*****************************************************************************
41  * libmad_input: this function is called by libmad when the input buffer needs
42  * to be filled.
43  *****************************************************************************/
44 enum mad_flow libmad_input( void *p_data, struct mad_stream *p_stream )
45 {
46     mad_adec_thread_t * p_dec = (mad_adec_thread_t *) p_data;
47     size_t   i_wanted, i_left;
48
49     if ( p_dec->p_fifo->b_die )
50     {
51         msg_Dbg( p_dec->p_fifo, "stopping libmad decoder" );
52         return MAD_FLOW_STOP;
53     }
54
55     if ( p_dec->p_fifo->b_error )
56     {
57         msg_Warn( p_dec->p_fifo, "ignoring current audio frame" );
58         return MAD_FLOW_IGNORE;
59     }
60
61     /* libmad_stream_buffer does not consume the total buffer, it consumes
62      * only data for one frame only. So all data left in the buffer should
63      * be put back in front. */
64     if ( !p_stream->buffer || p_stream->error == MAD_ERROR_BUFLEN )
65     {
66        /* libmad does not consume all the buffer it's given. Some data,
67         * part of a truncated frame, is left unused at the end of the
68         * buffer. Those datas must be put back at the beginning of the
69         * buffer and taken in account for refilling the buffer. This
70         * means that the input buffer must be large enough to hold a
71         * complete frame at the highest observable bit-rate (currently
72         * 448 kb/s). XXX=XXX Is 2016 bytes the size of the largest frame?
73         * (448000*(1152/32000))/8 */
74         if( p_stream->next_frame )
75         {
76             i_left = p_stream->bufend - p_stream->next_frame;
77             if( p_dec->buffer != p_stream->next_frame )
78             {
79                 memcpy( p_dec->buffer, p_stream->next_frame, i_left );
80             }
81             i_wanted = MAD_BUFFER_MDLEN - i_left;
82
83             /* Store timestamp for next frame */
84             p_dec->i_next_pts = p_dec->p_fifo->p_first->i_pts;
85         }
86         else
87         {
88             i_wanted = MAD_BUFFER_MDLEN;
89             i_left = 0;
90
91             /* Store timestamp for this frame */
92             p_dec->i_current_pts = p_dec->p_fifo->p_first->i_pts;
93         }
94         p_dec->p_fifo->p_first->i_pts = 0;
95
96         /* Fill-in the buffer. If an error occurs print a message and leave
97          * the decoding loop. If the end of stream is reached we also leave
98          * the loop but the return status is left untouched. */
99         if( i_wanted > p_dec->p_data->p_payload_end
100                         - p_dec->p_data->p_payload_start )
101         {
102             i_wanted = p_dec->p_data->p_payload_end
103                         - p_dec->p_data->p_payload_start;
104             memcpy( p_dec->buffer + i_left,
105                     p_dec->p_data->p_payload_start, i_wanted );
106             NextDataPacket( p_dec->p_fifo, &p_dec->p_data );
107         }
108         else
109         {
110             memcpy( p_dec->buffer + i_left,
111                     p_dec->p_data->p_payload_start, i_wanted );
112             p_dec->p_data->p_payload_start += i_wanted;
113         }
114
115         if ( p_dec->p_fifo->b_die )
116         {
117             msg_Dbg( p_dec->p_fifo, "stopping libmad decoder" );
118             return MAD_FLOW_STOP;
119         }
120
121         if ( p_dec->p_fifo->b_error )
122         {
123             msg_Warn( p_dec->p_fifo, "ignoring current audio frame" );    
124             return MAD_FLOW_IGNORE;
125         }
126
127         /* Pipe the new buffer content to libmad's stream decoder facility.
128          * Libmad never copies the buffer, but just references it. So keep
129          * it in mad_adec_thread_t structure. */
130         mad_stream_buffer( p_stream, (unsigned char*) &p_dec->buffer,
131                            i_left + i_wanted );
132         p_stream->error = 0;
133     }
134
135     return MAD_FLOW_CONTINUE;
136 }
137
138 /*****************************************************************************
139  * libmad_output: this function is called just after the frame is decoded
140  *****************************************************************************/
141 enum mad_flow libmad_output( void *p_data, struct mad_header const *p_header,
142                              struct mad_pcm *p_pcm )
143 {
144     mad_adec_thread_t * p_dec = (mad_adec_thread_t *) p_data;
145     aout_buffer_t *     p_buffer;
146     mad_fixed_t const * p_left = p_pcm->samples[0];
147     mad_fixed_t const * p_right = p_pcm->samples[1];
148     int                 i_samples = p_pcm->length;
149     mad_fixed_t *       p_samples;
150     int                 i_channels = (p_pcm->channels == 2) ? AOUT_CHAN_STEREO :
151                                      AOUT_CHAN_MONO;
152
153     /* Creating the audio output fifo. Assume the samplerate and nr of channels
154      * from the first decoded frame is right for the entire audio track. */
155     if( (p_dec->p_aout_input != NULL) &&
156         (p_dec->output_format.i_rate != p_pcm->samplerate
157            || p_dec->output_format.i_channels != i_channels) )
158     {
159         /* Parameters changed - this should not happen. */
160         aout_DecDelete( p_dec->p_aout, p_dec->p_aout_input );
161         p_dec->p_aout_input = NULL;
162     }
163
164     /* Creating the audio input if not created yet. */
165     if( p_dec->p_aout_input == NULL )
166     {
167         p_dec->output_format.i_rate = p_pcm->samplerate;
168         p_dec->output_format.i_channels = i_channels;
169         aout_DateInit( &p_dec->end_date, p_pcm->samplerate );
170         p_dec->p_aout_input = aout_DecNew( p_dec->p_fifo,
171                                            &p_dec->p_aout,
172                                            &p_dec->output_format );
173
174         if ( p_dec->p_aout_input == NULL )
175         {
176             p_dec->p_fifo->b_error = VLC_TRUE;
177             return MAD_FLOW_BREAK;
178         }
179     }
180
181     if( p_dec->i_current_pts )
182     {
183         /* Set the Presentation Time Stamp */
184         if( p_dec->i_current_pts != aout_DateGet( &p_dec->end_date ) )
185         {
186             aout_DateSet( &p_dec->end_date, p_dec->i_current_pts );
187         }
188
189         p_dec->i_current_pts = 0;
190     }
191     else if( p_dec->i_next_pts )
192     {
193         /* No PTS this time, but it'll be for next frame */
194         p_dec->i_current_pts = p_dec->i_next_pts;
195         p_dec->i_next_pts = 0;
196     }
197
198     if( !aout_DateGet( &p_dec->end_date ) )
199     {
200         /* No date available yet, wait for the first PTS. */
201         return MAD_FLOW_CONTINUE;
202     }
203
204     p_buffer = aout_DecNewBuffer( p_dec->p_aout, p_dec->p_aout_input, i_samples );
205
206     if ( p_buffer == NULL )
207     {
208         msg_Err( p_dec->p_fifo, "allocating new buffer failed" );
209         return MAD_FLOW_BREAK;
210     }
211
212     p_buffer->start_date = aout_DateGet( &p_dec->end_date );
213     p_buffer->end_date = aout_DateIncrement( &p_dec->end_date, i_samples );
214
215     /* Interleave and keep buffers in mad_fixed_t format */
216     p_samples = (mad_fixed_t *)p_buffer->p_buffer;
217
218     switch( p_pcm->channels )
219     {
220     case 2:
221         while( i_samples-- )
222         {
223             *p_samples++ = *p_left++;
224             *p_samples++ = *p_right++;
225         }
226         break;
227
228     case 1:
229         p_dec->p_fifo->p_vlc->pf_memcpy( p_samples, p_left,
230                                          i_samples * sizeof(mad_fixed_t) );
231         break;
232
233     default:
234         msg_Err( p_dec->p_fifo, "cannot interleave %i channels",
235                                 p_pcm->channels );
236     }
237
238     aout_DecPlay( p_dec->p_aout, p_dec->p_aout_input, p_buffer );
239
240     return MAD_FLOW_CONTINUE;
241 }
242
243 /*****************************************************************************
244  * libmad_error: this function is called when an error occurs during decoding
245  *****************************************************************************/
246 enum mad_flow libmad_error( void *data, struct mad_stream *p_libmad_stream,
247                             struct mad_frame *p_libmad_frame )
248 {
249     mad_adec_thread_t *p_dec = (mad_adec_thread_t *) data;
250     enum mad_flow result = MAD_FLOW_CONTINUE;
251
252     switch (p_libmad_stream->error)
253     {             
254     case MAD_ERROR_BUFLEN:                /* input buffer too small (or EOF) */
255         msg_Err( p_dec->p_fifo, "input buffer too small (or EOF)" );
256         result = MAD_FLOW_CONTINUE;
257         break;
258     case MAD_ERROR_BUFPTR:                /* invalid (null) buffer pointer */
259         msg_Err( p_dec->p_fifo, "invalid (null) buffer pointer" );
260         result = MAD_FLOW_STOP;
261         break;
262     case MAD_ERROR_NOMEM:                 /* not enough memory */
263         msg_Err( p_dec->p_fifo, "invalid (null) buffer pointer" );
264         result = MAD_FLOW_STOP;
265         break;
266     case MAD_ERROR_LOSTSYNC:            /* lost synchronization */
267         msg_Err( p_dec->p_fifo, "lost synchronization" );
268         mad_stream_sync(p_libmad_stream);
269         result = MAD_FLOW_CONTINUE;
270         break;
271     case MAD_ERROR_BADLAYER:            /* reserved header layer value */
272         msg_Err( p_dec->p_fifo, "reserved header layer value" );
273         result = MAD_FLOW_CONTINUE;
274         break;
275     case MAD_ERROR_BADBITRATE:        /* forbidden bitrate value */
276         msg_Err( p_dec->p_fifo, "forbidden bitrate value" );
277         result = MAD_FLOW_CONTINUE;
278         break;
279     case MAD_ERROR_BADSAMPLERATE: /* reserved sample frequency value */
280         msg_Err( p_dec->p_fifo, "reserved sample frequency value" );
281         result = MAD_FLOW_CONTINUE;
282         break;
283     case MAD_ERROR_BADEMPHASIS:     /* reserved emphasis value */
284         msg_Err( p_dec->p_fifo, "reserverd emphasis value" );
285         result = MAD_FLOW_CONTINUE;
286         break;
287     case MAD_ERROR_BADCRC:                /* CRC check failed */
288         msg_Err( p_dec->p_fifo, "CRC check failed" );
289         result = MAD_FLOW_CONTINUE;
290         break;
291     case MAD_ERROR_BADBITALLOC:     /* forbidden bit allocation value */
292         msg_Err( p_dec->p_fifo, "forbidden bit allocation value" );
293         result = MAD_FLOW_IGNORE;
294         break;
295     case MAD_ERROR_BADSCALEFACTOR:/* bad scalefactor index */
296         msg_Err( p_dec->p_fifo, "bad scalefactor index" );
297         result = MAD_FLOW_CONTINUE;
298         break;
299     case MAD_ERROR_BADFRAMELEN:     /* bad frame length */
300         msg_Err( p_dec->p_fifo, "bad frame length" );
301         result = MAD_FLOW_CONTINUE;
302         break;
303     case MAD_ERROR_BADBIGVALUES:    /* bad big_values count */
304         msg_Err( p_dec->p_fifo, "bad big values count" );
305         result = MAD_FLOW_IGNORE;
306         break;
307     case MAD_ERROR_BADBLOCKTYPE:    /* reserved block_type */
308         msg_Err( p_dec->p_fifo, "reserverd block_type" );
309         result = MAD_FLOW_IGNORE;
310         break;
311     case MAD_ERROR_BADSCFSI:            /* bad scalefactor selection info */
312         msg_Err( p_dec->p_fifo, "bad scalefactor selection info" );
313         result = MAD_FLOW_CONTINUE;
314         break;
315     case MAD_ERROR_BADDATAPTR:        /* bad main_data_begin pointer */
316         msg_Err( p_dec->p_fifo, "bad main_data_begin pointer" );
317         result = MAD_FLOW_STOP;
318         break;
319     case MAD_ERROR_BADPART3LEN:     /* bad audio data length */
320         msg_Err( p_dec->p_fifo, "bad audio data length" );
321         result = MAD_FLOW_IGNORE;
322         break;
323     case MAD_ERROR_BADHUFFTABLE:    /* bad Huffman table select */
324         msg_Err( p_dec->p_fifo, "bad Huffman table select" );
325         result = MAD_FLOW_IGNORE;
326         break;
327     case MAD_ERROR_BADHUFFDATA:     /* Huffman data overrun */
328         msg_Err( p_dec->p_fifo, "Huffman data overrun" );
329         result = MAD_FLOW_IGNORE;
330         break;
331     case MAD_ERROR_BADSTEREO:         /* incompatible block_type for JS */
332         msg_Err( p_dec->p_fifo, "incompatible block_type for JS" );
333         result = MAD_FLOW_IGNORE;
334         break;
335     default:
336         msg_Err( p_dec->p_fifo, "unknown error occured stopping decoder" );
337         result = MAD_FLOW_STOP;
338         break;
339     }
340     
341     return (MAD_RECOVERABLE(p_libmad_stream->error)? result: MAD_FLOW_STOP);
342     //return (MAD_FLOW_CONTINUE);
343 }
344
345 /*****************************************************************************
346  * libmad_message: this function is called to send a message
347  *****************************************************************************/
348 /* enum mad_flow libmad_message(void *, void*, unsigned int*)
349  * {
350  *     return MAD_FLOW_CONTINUE;
351  * }
352  */
353
354
355
356 /****************************************************************************
357  * Print human readable informations about an audio MPEG frame.                         *
358  ****************************************************************************/
359 static void PrintFrameInfo(struct mad_header *Header)
360 {
361         const char      *Layer,
362                         *Mode,
363                         *Emphasis;
364
365         /* Convert the layer number to its printed representation. */
366         switch(Header->layer)
367         {
368                 case MAD_LAYER_I:
369                         Layer="I";
370                         break;
371                 case MAD_LAYER_II:
372                         Layer="II";
373                         break;
374                 case MAD_LAYER_III:
375                         Layer="III";
376                         break;
377                 default:
378                         Layer="(unexpected layer value)";
379                         break;
380         }
381
382         /* Convert the audio mode to its printed representation. */
383         switch(Header->mode)
384         {
385                 case MAD_MODE_SINGLE_CHANNEL:
386                         Mode="single channel";
387                         break;
388                 case MAD_MODE_DUAL_CHANNEL:
389                         Mode="dual channel";
390                         break;
391                 case MAD_MODE_JOINT_STEREO:
392                         Mode="joint (MS/intensity) stereo";
393                         break;
394                 case MAD_MODE_STEREO:
395                         Mode="normal LR stereo";
396                         break;
397                 default:
398                         Mode="(unexpected mode value)";
399                         break;
400         }
401
402         /* Convert the emphasis to its printed representation. */
403         switch(Header->emphasis)
404         {
405                 case MAD_EMPHASIS_NONE:
406                         Emphasis="no";
407                         break;
408                 case MAD_EMPHASIS_50_15_US:
409                         Emphasis="50/15 us";
410                         break;
411                 case MAD_EMPHASIS_CCITT_J_17:
412                         Emphasis="CCITT J.17";
413                         break;
414                 default:
415                         Emphasis="(unexpected emphasis value)";
416                         break;
417         }
418
419 //X     msg_Err("statistics: %lu kb/s audio mpeg layer %s stream %s crc, "
420 //X                     "%s with %s emphasis at %d Hz sample rate\n",
421 //X                     Header->bitrate,Layer,
422 //X                     Header->flags&MAD_FLAG_PROTECTION?"with":"without",
423 //X                     Mode,Emphasis,Header->samplerate);
424 }