1 /***************************************************************************
2 mad_libmad.c - description
4 Functions that are called by libmad to communicate with vlc decoder
8 copyright : (C) 2001 by Jean-Paul Saman
10 ***************************************************************************/
12 /***************************************************************************
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. *
19 ***************************************************************************/
21 /*****************************************************************************
23 *****************************************************************************/
27 #include <stdlib.h> /* malloc(), free() */
28 #include <string.h> /* strdup() */
31 #include "common.h" /* boolean_t, byte_t */
37 #include "audio_output.h"
40 #include "modules_export.h"
42 #include "stream_control.h"
43 #include "input_ext-dec.h"
47 /*****************************************************************************
48 * Libmad includes files
49 *****************************************************************************/
53 #include "mad_libmad.h"
55 /*****************************************************************************
56 * libmad_input: this function is called by libmad when the input buffer needs
58 *****************************************************************************/
59 enum mad_flow libmad_input(void *data, struct mad_stream *p_libmad_stream)
61 mad_adec_thread_t *p_mad_adec = (mad_adec_thread_t *) data;
62 byte_t buffer[ADEC_FRAME_SIZE];
64 /* Store time stamp of current frame */
65 if ( DECODER_FIFO_START(*p_mad_adec->p_fifo)->i_pts ) {
66 p_mad_adec->i_pts_save = DECODER_FIFO_START(*p_mad_adec->p_fifo)->i_pts;
67 DECODER_FIFO_START(*p_mad_adec->p_fifo)->i_pts = 0;
70 p_mad_adec->i_pts_save = LAST_MDATE;
73 GetChunk( &p_mad_adec->bit_stream, buffer, ADEC_FRAME_SIZE );
75 if ( p_mad_adec->p_fifo->b_die == 1 ) {
76 intf_ErrMsg( "mad_adec error: libmad_input stopping libmad decoder" );
80 if ( p_mad_adec->p_fifo->b_error == 1 ) {
81 intf_ErrMsg( "mad_adec error: libmad_input ignoring current audio frame" );
82 return MAD_FLOW_IGNORE;
85 /* the length meant to be in bytes */
86 mad_stream_buffer(p_libmad_stream, (unsigned char*) &buffer, ADEC_FRAME_SIZE );
88 return MAD_FLOW_CONTINUE;
91 /*****************************************************************************
92 * libmad_header: this function is called just after the header of a frame is
94 *****************************************************************************/
95 enum mad_flow libmad_header(void *data, struct mad_header const *p_libmad_header)
97 mad_adec_thread_t *p_mad_adec = (mad_adec_thread_t *) data;
99 vlc_mutex_lock (&p_mad_adec->p_aout_fifo->data_lock);
101 intf_ErrMsg( "mad_adec: libmad_header samplerate %d", p_libmad_header->samplerate);
102 intf_DbgMsg( "mad_adec: libmad_header bitrate %d", p_libmad_header->bitrate);
104 p_mad_adec->p_aout_fifo->l_rate = p_libmad_header->samplerate;
105 vlc_cond_signal (&p_mad_adec->p_aout_fifo->data_wait);
106 vlc_mutex_unlock (&p_mad_adec->p_aout_fifo->data_lock);
108 return MAD_FLOW_CONTINUE;
111 /*****************************************************************************
112 * lib_mad_filter: this function is called to filter data of a frame
113 *****************************************************************************/
114 /* enum mad_flow libmad_filter(void *data, struct mad_stream const *p_libmad_stream, struct mad_frame *p_libmad_frame)
116 * return MAD_FLOW_CONTINUE;
120 /*****************************************************************************
121 * support routines borrowed from mpg321 (file: mad.c), which is distributed
124 * mpg321 was written by Joe Drew <drew@debian.org>, and based upon 'plaympeg'
125 * from the smpeg sources, which was written by various people from Loki Software
126 * (http://www.lokigames.com).
128 * It also incorporates some source from mad, written by Robert Leslie
129 *****************************************************************************/
131 /* The following two routines and data structure are from the ever-brilliant
135 struct audio_dither {
136 mad_fixed_t error[3];
142 * DESCRIPTION: 32-bit pseudo-random number generator
144 static __inline__ unsigned long prng(unsigned long state)
146 return (state * 0x0019660dL + 0x3c6ef35fL) & 0xffffffffL;
150 * NAME: audio_linear_dither()
151 * DESCRIPTION: generic linear sample quantize and dither routine
153 static __inline__ signed long audio_linear_dither(unsigned int bits, mad_fixed_t sample,
154 struct audio_dither *dither)
156 unsigned int scalebits;
157 mad_fixed_t output, mask, random;
165 sample += dither->error[0] - dither->error[1] + dither->error[2];
167 dither->error[2] = dither->error[1];
168 dither->error[1] = dither->error[0] / 2;
171 output = sample + (1L << (MAD_F_FRACBITS + 1 - bits - 1));
173 scalebits = MAD_F_FRACBITS + 1 - bits;
174 mask = (1L << scalebits) - 1;
177 random = prng(dither->random);
178 output += (random & mask) - (dither->random & mask);
180 dither->random = random;
189 else if (output < MIN) {
200 dither->error[0] = sample - output;
203 return output >> scalebits;
206 /*****************************************************************************
207 * libmad_ouput: this function is called just after the frame is decoded
208 *****************************************************************************/
209 enum mad_flow libmad_output(void *data, struct mad_header const *p_libmad_header, struct mad_pcm *p_libmad_pcm)
211 mad_adec_thread_t *p_mad_adec= (mad_adec_thread_t *) data;
214 mad_fixed_t const *left_ch = p_libmad_pcm->samples[0], *right_ch = p_libmad_pcm->samples[1];
216 * 1152 because that's what mad has as a max; *4 because
217 * there are 4 distinct bytes per sample (in 2 channel case)
219 static unsigned char stream[ADEC_FRAME_SIZE];
220 register int nsamples = p_libmad_pcm->length;
221 static struct audio_dither dither;
223 register char * ptr = stream;
224 register signed int sample;
226 /* Set timestamp to synchronize audio and video decoder fifo's */
227 vlc_mutex_lock (&p_mad_adec->p_aout_fifo->data_lock);
228 p_mad_adec->p_aout_fifo->date[p_mad_adec->p_aout_fifo->l_end_frame] = p_mad_adec->i_pts_save;
230 buffer = ((byte_t *)p_mad_adec->p_aout_fifo->buffer) + (p_mad_adec->p_aout_fifo->l_end_frame * ADEC_FRAME_SIZE);
232 if (p_libmad_pcm->channels == 2)
236 sample = (signed int) audio_linear_dither(16, *left_ch++, &dither);
237 #ifndef WORDS_BIGENDIAN
238 *ptr++ = (unsigned char) (sample >> 0);
239 *ptr++ = (unsigned char) (sample >> 8);
241 *ptr++ = (unsigned char) (sample >> 8);
242 *ptr++ = (unsigned char) (sample >> 0);
245 sample = (signed int) audio_linear_dither(16, *right_ch++, &dither);
246 #ifndef WORDS_BIGENDIAN
247 *ptr++ = (unsigned char) (sample >> 0);
248 *ptr++ = (unsigned char) (sample >> 8);
250 *ptr++ = (unsigned char) (sample >> 8);
251 *ptr++ = (unsigned char) (sample >> 0);
254 buffer = memcpy(buffer,stream,p_libmad_pcm->length*4);
255 vlc_cond_signal (&p_mad_adec->p_aout_fifo->data_wait);
261 sample = (signed int) audio_linear_dither(16, *left_ch++, &dither);
263 #ifndef WORDS_BIGENDIAN
264 *ptr++ = (unsigned char) (sample >> 0);
265 *ptr++ = (unsigned char) (sample >> 8);
267 *ptr++ = (unsigned char) (sample >> 8);
268 *ptr++ = (unsigned char) (sample >> 0);
271 buffer = memcpy(buffer,stream,p_libmad_pcm->length*2);
272 vlc_cond_signal (&p_mad_adec->p_aout_fifo->data_wait);
274 vlc_mutex_unlock (&p_mad_adec->p_aout_fifo->data_lock);
276 vlc_mutex_lock (&p_mad_adec->p_aout_fifo->data_lock);
277 p_mad_adec->p_aout_fifo->l_end_frame = (p_mad_adec->p_aout_fifo->l_end_frame + 1) & AOUT_FIFO_SIZE;
278 vlc_cond_signal (&p_mad_adec->p_aout_fifo->data_wait);
279 vlc_mutex_unlock (&p_mad_adec->p_aout_fifo->data_lock);
281 return MAD_FLOW_CONTINUE;
284 /*****************************************************************************
285 * libmad_error: this function is called when an error occurs during decoding
286 *****************************************************************************/
287 enum mad_flow libmad_error(void *data, struct mad_stream *p_libmad_stream, struct mad_frame *p_libmad_frame)
289 enum mad_flow result = MAD_FLOW_CONTINUE;
291 switch (p_libmad_stream->error)
293 case MAD_ERROR_BUFLEN: /* input buffer too small (or EOF) */
294 intf_ErrMsg("libmad error: input buffer too small (or EOF)");
295 result = MAD_FLOW_CONTINUE;
297 case MAD_ERROR_BUFPTR: /* invalid (null) buffer pointer */
298 intf_ErrMsg("libmad error: invalid (null) buffer pointer");
299 result = MAD_FLOW_STOP;
301 case MAD_ERROR_NOMEM: /* not enough memory */
302 intf_ErrMsg("libmad error: invalid (null) buffer pointer");
303 result = MAD_FLOW_STOP;
305 case MAD_ERROR_LOSTSYNC: /* lost synchronization */
306 intf_ErrMsg("libmad error: lost synchronization");
307 mad_stream_sync(p_libmad_stream);
308 result = MAD_FLOW_CONTINUE;
310 case MAD_ERROR_BADLAYER: /* reserved header layer value */
311 intf_ErrMsg("libmad error: reserved header layer value");
312 result = MAD_FLOW_CONTINUE;
314 case MAD_ERROR_BADBITRATE: /* forbidden bitrate value */
315 intf_ErrMsg("libmad error: forbidden bitrate value");
316 result = MAD_FLOW_CONTINUE;
318 case MAD_ERROR_BADSAMPLERATE: /* reserved sample frequency value */
319 intf_ErrMsg("libmad error: reserved sample frequency value");
320 result = MAD_FLOW_CONTINUE;
322 case MAD_ERROR_BADEMPHASIS: /* reserved emphasis value */
323 intf_ErrMsg("libmad error: reserverd emphasis value");
324 result = MAD_FLOW_CONTINUE;
326 case MAD_ERROR_BADCRC: /* CRC check failed */
327 intf_ErrMsg("libmad error: CRC check failed");
328 result = MAD_FLOW_CONTINUE;
330 case MAD_ERROR_BADBITALLOC: /* forbidden bit allocation value */
331 intf_ErrMsg("libmad error: forbidden bit allocation value");
332 result = MAD_FLOW_IGNORE;
334 case MAD_ERROR_BADSCALEFACTOR:/* bad scalefactor index */
335 intf_ErrMsg("libmad error: bad scalefactor index");
336 result = MAD_FLOW_CONTINUE;
338 case MAD_ERROR_BADFRAMELEN: /* bad frame length */
339 intf_ErrMsg("libmad error: bad frame length");
340 result = MAD_FLOW_CONTINUE;
342 case MAD_ERROR_BADBIGVALUES: /* bad big_values count */
343 intf_ErrMsg("libmad error: bad big values count");
344 result = MAD_FLOW_IGNORE;
346 case MAD_ERROR_BADBLOCKTYPE: /* reserved block_type */
347 intf_ErrMsg("libmad error: reserverd block_type");
348 result = MAD_FLOW_IGNORE;
350 case MAD_ERROR_BADSCFSI: /* bad scalefactor selection info */
351 intf_ErrMsg("libmad error: bad scalefactor selection info");
352 result = MAD_FLOW_CONTINUE;
354 case MAD_ERROR_BADDATAPTR: /* bad main_data_begin pointer */
355 intf_ErrMsg("libmad error: bad main_data_begin pointer");
356 result = MAD_FLOW_STOP;
358 case MAD_ERROR_BADPART3LEN: /* bad audio data length */
359 intf_ErrMsg("libmad error: bad audio data length");
360 result = MAD_FLOW_IGNORE;
362 case MAD_ERROR_BADHUFFTABLE: /* bad Huffman table select */
363 intf_ErrMsg("libmad error: bad Huffman table select");
364 result = MAD_FLOW_IGNORE;
366 case MAD_ERROR_BADHUFFDATA: /* Huffman data overrun */
367 intf_ErrMsg("libmad error: Huffman data overrun");
368 result = MAD_FLOW_IGNORE;
370 case MAD_ERROR_BADSTEREO: /* incompatible block_type for JS */
371 intf_ErrMsg("libmad error: incompatible block_type for JS");
372 result = MAD_FLOW_IGNORE;
375 intf_ErrMsg("libmad error: unknown error occured stopping decoder");
376 result = MAD_FLOW_STOP;
380 //return (MAD_RECOVERABLE(p_libmad_stream->error)? result: MAD_FLOW_STOP);
381 return (MAD_FLOW_CONTINUE);
384 /*****************************************************************************
385 * libmad_message: this function is called to send a message
386 *****************************************************************************/
387 /* enum mad_flow libmad_message(void *, void*, unsigned int*)
389 * return MAD_FLOW_CONTINUE;