#ifndef _VLC_MAD_ADEC_H_
#define _VLC_MAD_ADEC_H_
+
/*****************************************************************************
* mad_adec_thread_t : mad decoder thread descriptor
*****************************************************************************/
-// FIXME: Ugly define inside a decoder
-#define ADEC_FRAME_SIZE (2*1152)
-// MAD_BUFFER_MDLEN (511 + 2048 + MAD_BUFLEN_GUARD) and MAD_BUFLEN_GUARD is 8
-#define MAD_BUFFER_SIZE (MAD_BUFFER_MDLEN)
-//#define MAD_BUFFER_SIZE (ADEC_FRAME_SIZE*2)
-#define MAD_OUTPUT_SIZE (ADEC_FRAME_SIZE*2)
-
typedef struct mad_adec_thread_s
{
/*
*/
struct mad_decoder *libmad_decoder;
mad_timer_t libmad_timer;
- byte_t buffer[MAD_BUFFER_SIZE];
+ byte_t buffer[MAD_BUFFER_MDLEN];
/*
* Thread properties
Remaining );
}
ReadStart=p_mad_adec->buffer+Remaining;
- ReadSize=(MAD_BUFFER_SIZE)-Remaining;
+ ReadSize=(MAD_BUFFER_MDLEN)-Remaining;
/* Store time stamp of next frame */
p_mad_adec->i_current_pts = p_mad_adec->i_next_pts;
}
else
{
- ReadSize=(MAD_BUFFER_SIZE);
+ ReadSize=(MAD_BUFFER_MDLEN);
ReadStart=p_mad_adec->buffer;
Remaining=0;
p_mad_adec->i_next_pts = 0;
* intf_ErrMsg( "mad_adec: libmad_header samplerate %d", p_libmad_header->samplerate);
*
* p_mad_adec->p_aout_fifo->i_rate = p_libmad_header->samplerate;
- * mad_timer_add(&p_mad_adec->libmad_timer,p_libmad_header->duration);
+ * // mad_timer_add(&p_mad_adec->libmad_timer,p_libmad_header->duration);
*
* return MAD_FLOW_CONTINUE;
*}
AOUT_FIFO_PCM, /* fifo type */
p_libmad_pcm->channels, /* nr. of channels */
p_libmad_pcm->samplerate, /* frame rate in Hz ?*/
- ADEC_FRAME_SIZE, /* frame size */
+ p_libmad_pcm->length*2, /* length of output buffer *2 channels*/
NULL ); /* buffer */
if ( p_mad_adec->p_aout_fifo == NULL )
return( -1 );
}
- intf_ErrMsg("mad_adec debug: in libmad_output aout fifo created");
+ intf_ErrMsg("mad_adec debug: in libmad_output aout fifo created");
}
if (p_mad_adec->p_aout_fifo->i_rate != p_libmad_pcm->samplerate)
{
- intf_ErrMsg( "mad_adec: libmad_output samplerate is changing from [%d] Hz to [%d] Hz, sample size [%d], error_code [%0x]",
- p_mad_adec->p_aout_fifo->i_rate, p_libmad_pcm->samplerate,
- p_libmad_pcm->length, p_mad_adec->libmad_decoder->sync->stream.error);
- p_mad_adec->p_aout_fifo->i_rate = p_libmad_pcm->samplerate;
+ intf_ErrMsg( "mad_adec: libmad_output samplerate is changing from [%d] Hz to [%d] Hz, sample size [%d], error_code [%0x]",
+ p_mad_adec->p_aout_fifo->i_rate, p_libmad_pcm->samplerate,
+ p_libmad_pcm->length, p_mad_adec->libmad_decoder->sync->stream.error);
+ p_mad_adec->p_aout_fifo->i_rate = p_libmad_pcm->samplerate;
}
if( p_mad_adec->i_current_pts )
p_mad_adec->p_aout_fifo->date[p_mad_adec->p_aout_fifo->i_end_frame]
= LAST_MDATE;
}
- mad_timer_add(&p_mad_adec->libmad_timer,p_libmad_header->duration);
+// mad_timer_add(&p_mad_adec->libmad_timer,p_libmad_header->duration);
- buffer = ((byte_t *)p_mad_adec->p_aout_fifo->buffer) + (p_mad_adec->p_aout_fifo->i_end_frame * MAD_OUTPUT_SIZE);
+ buffer = ((byte_t *)p_mad_adec->p_aout_fifo->buffer) + (p_mad_adec->p_aout_fifo->i_end_frame * (p_libmad_pcm->length*4));
while (nsamples--)
{
#ifdef MPG321_ROUTINES
sample = audio_linear_dither(16, *left_ch++, &dither);
#else
- sample = s24_to_s16_pcm(*left_ch++);
+ sample = s24_to_s16_pcm(*left_ch++);
#endif
#ifndef WORDS_BIGENDIAN
*buffer++ = (byte_t) (sample >> 0);
*buffer++ = (byte_t) (sample >> 8);
#else
- *buffer++ = (byte_t) (sample >> 8);
- *buffer++ = (byte_t) (sample >> 0);
+ *buffer++ = (byte_t) (sample >> 8);
+ *buffer++ = (byte_t) (sample >> 0);
#endif
- if (p_libmad_pcm->channels == 2) {
-
- /* right audio channel */
+ if (p_libmad_pcm->channels == 2)
+ {
+ /* right audio channel */
#ifdef MPG321_ROUTINES
sample = audio_linear_dither(16, *right_ch++, &dither);
#else
*buffer++ = (byte_t) (sample >> 0);
#endif
}
- else {
- /* Somethimes a single channel frame is found, while the rest of the movie are
+ else {
+ /* Somethimes a single channel frame is found, while the rest of the movie are
* stereo channel frames. How to deal with this ??
* One solution is to silence the second channel.
*/
*buffer++ = (byte_t) (0);
*buffer++ = (byte_t) (0);
- }
+ }
}
/* DEBUG */
if (p_libmad_pcm->channels == 1) {