Commit cf7a11cd authored by Jean-Paul Saman's avatar Jean-Paul Saman

Aout fifo adapts it size according to the length of the first frame.

The change is needed for MPEG1/2 layer III, because the size of output pcm from mad_decoder is different.
Sadly, the buffer underruns are back ;-(.
parent 71865b97
...@@ -181,7 +181,7 @@ static int InitThread( mad_adec_thread_t * p_mad_adec ) ...@@ -181,7 +181,7 @@ static int InitThread( mad_adec_thread_t * p_mad_adec )
0); /* message */ 0); /* message */
mad_decoder_options(p_mad_adec->libmad_decoder, MAD_OPTION_IGNORECRC); mad_decoder_options(p_mad_adec->libmad_decoder, MAD_OPTION_IGNORECRC);
mad_timer_reset(&p_mad_adec->libmad_timer); // mad_timer_reset(&p_mad_adec->libmad_timer);
/* /*
* Initialize the output properties * Initialize the output properties
......
...@@ -17,17 +17,11 @@ ...@@ -17,17 +17,11 @@
#ifndef _VLC_MAD_ADEC_H_ #ifndef _VLC_MAD_ADEC_H_
#define _VLC_MAD_ADEC_H_ #define _VLC_MAD_ADEC_H_
/***************************************************************************** /*****************************************************************************
* mad_adec_thread_t : mad decoder thread descriptor * 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 typedef struct mad_adec_thread_s
{ {
/* /*
...@@ -35,7 +29,7 @@ typedef struct mad_adec_thread_s ...@@ -35,7 +29,7 @@ typedef struct mad_adec_thread_s
*/ */
struct mad_decoder *libmad_decoder; struct mad_decoder *libmad_decoder;
mad_timer_t libmad_timer; mad_timer_t libmad_timer;
byte_t buffer[MAD_BUFFER_SIZE]; byte_t buffer[MAD_BUFFER_MDLEN];
/* /*
* Thread properties * Thread properties
......
...@@ -82,7 +82,7 @@ enum mad_flow libmad_input(void *data, struct mad_stream *p_libmad_stream) ...@@ -82,7 +82,7 @@ enum mad_flow libmad_input(void *data, struct mad_stream *p_libmad_stream)
Remaining ); Remaining );
} }
ReadStart=p_mad_adec->buffer+Remaining; ReadStart=p_mad_adec->buffer+Remaining;
ReadSize=(MAD_BUFFER_SIZE)-Remaining; ReadSize=(MAD_BUFFER_MDLEN)-Remaining;
/* Store time stamp of next frame */ /* Store time stamp of next frame */
p_mad_adec->i_current_pts = p_mad_adec->i_next_pts; p_mad_adec->i_current_pts = p_mad_adec->i_next_pts;
...@@ -90,7 +90,7 @@ enum mad_flow libmad_input(void *data, struct mad_stream *p_libmad_stream) ...@@ -90,7 +90,7 @@ enum mad_flow libmad_input(void *data, struct mad_stream *p_libmad_stream)
} }
else else
{ {
ReadSize=(MAD_BUFFER_SIZE); ReadSize=(MAD_BUFFER_MDLEN);
ReadStart=p_mad_adec->buffer; ReadStart=p_mad_adec->buffer;
Remaining=0; Remaining=0;
p_mad_adec->i_next_pts = 0; p_mad_adec->i_next_pts = 0;
...@@ -154,7 +154,7 @@ enum mad_flow libmad_input(void *data, struct mad_stream *p_libmad_stream) ...@@ -154,7 +154,7 @@ enum mad_flow libmad_input(void *data, struct mad_stream *p_libmad_stream)
* intf_ErrMsg( "mad_adec: libmad_header samplerate %d", p_libmad_header->samplerate); * intf_ErrMsg( "mad_adec: libmad_header samplerate %d", p_libmad_header->samplerate);
* *
* p_mad_adec->p_aout_fifo->i_rate = 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; * return MAD_FLOW_CONTINUE;
*} *}
...@@ -301,7 +301,7 @@ enum mad_flow libmad_output(void *data, struct mad_header const *p_libmad_header ...@@ -301,7 +301,7 @@ enum mad_flow libmad_output(void *data, struct mad_header const *p_libmad_header
AOUT_FIFO_PCM, /* fifo type */ AOUT_FIFO_PCM, /* fifo type */
p_libmad_pcm->channels, /* nr. of channels */ p_libmad_pcm->channels, /* nr. of channels */
p_libmad_pcm->samplerate, /* frame rate in Hz ?*/ 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 */ NULL ); /* buffer */
if ( p_mad_adec->p_aout_fifo == NULL ) if ( p_mad_adec->p_aout_fifo == NULL )
...@@ -309,15 +309,15 @@ enum mad_flow libmad_output(void *data, struct mad_header const *p_libmad_header ...@@ -309,15 +309,15 @@ enum mad_flow libmad_output(void *data, struct mad_header const *p_libmad_header
return( -1 ); 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) 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]", 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_mad_adec->p_aout_fifo->i_rate, p_libmad_pcm->samplerate,
p_libmad_pcm->length, p_mad_adec->libmad_decoder->sync->stream.error); p_libmad_pcm->length, p_mad_adec->libmad_decoder->sync->stream.error);
p_mad_adec->p_aout_fifo->i_rate = p_libmad_pcm->samplerate; p_mad_adec->p_aout_fifo->i_rate = p_libmad_pcm->samplerate;
} }
if( p_mad_adec->i_current_pts ) if( p_mad_adec->i_current_pts )
...@@ -330,28 +330,28 @@ enum mad_flow libmad_output(void *data, struct mad_header const *p_libmad_header ...@@ -330,28 +330,28 @@ enum mad_flow libmad_output(void *data, struct mad_header const *p_libmad_header
p_mad_adec->p_aout_fifo->date[p_mad_adec->p_aout_fifo->i_end_frame] p_mad_adec->p_aout_fifo->date[p_mad_adec->p_aout_fifo->i_end_frame]
= LAST_MDATE; = 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--) while (nsamples--)
{ {
#ifdef MPG321_ROUTINES #ifdef MPG321_ROUTINES
sample = audio_linear_dither(16, *left_ch++, &dither); sample = audio_linear_dither(16, *left_ch++, &dither);
#else #else
sample = s24_to_s16_pcm(*left_ch++); sample = s24_to_s16_pcm(*left_ch++);
#endif #endif
#ifndef WORDS_BIGENDIAN #ifndef WORDS_BIGENDIAN
*buffer++ = (byte_t) (sample >> 0); *buffer++ = (byte_t) (sample >> 0);
*buffer++ = (byte_t) (sample >> 8); *buffer++ = (byte_t) (sample >> 8);
#else #else
*buffer++ = (byte_t) (sample >> 8); *buffer++ = (byte_t) (sample >> 8);
*buffer++ = (byte_t) (sample >> 0); *buffer++ = (byte_t) (sample >> 0);
#endif #endif
if (p_libmad_pcm->channels == 2) { if (p_libmad_pcm->channels == 2)
{
/* right audio channel */ /* right audio channel */
#ifdef MPG321_ROUTINES #ifdef MPG321_ROUTINES
sample = audio_linear_dither(16, *right_ch++, &dither); sample = audio_linear_dither(16, *right_ch++, &dither);
#else #else
...@@ -366,14 +366,14 @@ enum mad_flow libmad_output(void *data, struct mad_header const *p_libmad_header ...@@ -366,14 +366,14 @@ enum mad_flow libmad_output(void *data, struct mad_header const *p_libmad_header
*buffer++ = (byte_t) (sample >> 0); *buffer++ = (byte_t) (sample >> 0);
#endif #endif
} }
else { else {
/* Somethimes a single channel frame is found, while the rest of the movie are /* Somethimes a single channel frame is found, while the rest of the movie are
* stereo channel frames. How to deal with this ?? * stereo channel frames. How to deal with this ??
* One solution is to silence the second channel. * One solution is to silence the second channel.
*/ */
*buffer++ = (byte_t) (0); *buffer++ = (byte_t) (0);
*buffer++ = (byte_t) (0); *buffer++ = (byte_t) (0);
} }
} }
/* DEBUG */ /* DEBUG */
if (p_libmad_pcm->channels == 1) { if (p_libmad_pcm->channels == 1) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment