Commit dcb53b6f authored by Gildas Bazin's avatar Gildas Bazin

* modules/codec/realaudio.c: split the audio output buffers in chunks of 1024...

* modules/codec/realaudio.c: split the audio output buffers in chunks of 1024 samples because the audio output can't deal with big chunks.
parent aed061c7
...@@ -86,7 +86,9 @@ struct decoder_sys_t ...@@ -86,7 +86,9 @@ struct decoder_sys_t
int i_frame; int i_frame;
/* Output buffer */ /* Output buffer */
char *p_out_buffer;
char *p_out; char *p_out;
unsigned int i_out;
/* Codec params */ /* Codec params */
void *context; void *context;
...@@ -238,7 +240,9 @@ static int Open( vlc_object_t *p_this ) ...@@ -238,7 +240,9 @@ static int Open( vlc_object_t *p_this )
p_sys->i_subpacket = 0; p_sys->i_subpacket = 0;
p_sys->i_frame = 0; p_sys->i_frame = 0;
p_sys->p_out = malloc( 4096 * 10 ); p_sys->p_out_buffer = malloc( 4096 * 10 );
p_sys->p_out = 0;
p_sys->i_out = 0;
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -252,7 +256,7 @@ static void Close( vlc_object_t *p_this ) ...@@ -252,7 +256,7 @@ static void Close( vlc_object_t *p_this )
CloseDll( p_dec ); CloseDll( p_dec );
if( p_dec->p_sys->p_frame ) free( p_dec->p_sys->p_frame ); if( p_dec->p_sys->p_frame ) free( p_dec->p_sys->p_frame );
if( p_dec->p_sys->p_out ) free( p_dec->p_sys->p_out ); if( p_dec->p_sys->p_out_buffer ) free( p_dec->p_sys->p_out_buffer );
free( p_dec->p_sys ); free( p_dec->p_sys );
} }
...@@ -267,8 +271,6 @@ static int OpenDll( decoder_t *p_dec ) ...@@ -267,8 +271,6 @@ static int OpenDll( decoder_t *p_dec )
char *ppsz_path[] = char *ppsz_path[] =
{ {
".", ".",
"z:\\home\\videolan\\vlc",
"/home/videolan/vlc",
#ifndef WIN32 #ifndef WIN32
"/usr/local/RealPlayer8/Codecs", "/usr/local/RealPlayer8/Codecs",
"/usr/RealPlayer8/Codecs", "/usr/RealPlayer8/Codecs",
...@@ -602,44 +604,61 @@ static aout_buffer_t *Decode( decoder_t *p_dec, block_t **pp_block ) ...@@ -602,44 +604,61 @@ static aout_buffer_t *Decode( decoder_t *p_dec, block_t **pp_block )
} }
#endif #endif
/* Output 1024 samples at a time
* (the audio output doesn't like big audio packets) */
if( p_sys->i_out )
{
int i_out;
int i_samples = p_sys->i_out * 8 /
p_dec->fmt_out.audio.i_bitspersample /
p_dec->fmt_out.audio.i_channels;
i_samples = __MIN( i_samples, 1024 );
i_out = i_samples * p_dec->fmt_out.audio.i_bitspersample *
p_dec->fmt_out.audio.i_channels / 8;
p_aout_buffer = p_dec->pf_aout_buffer_new( p_dec, i_samples );
if( p_aout_buffer == NULL ) return NULL;
memcpy( p_aout_buffer->p_buffer, p_sys->p_out, i_out );
p_sys->i_out -= i_out;
p_sys->p_out += i_out;
/* Date management */
p_aout_buffer->start_date = aout_DateGet( &p_sys->end_date );
p_aout_buffer->end_date =
aout_DateIncrement( &p_sys->end_date, i_samples );
return p_aout_buffer;
}
/* If we have a full frame ready then we can start decoding */ /* If we have a full frame ready then we can start decoding */
if( p_sys->i_frame ) if( p_sys->i_frame )
{ {
char *p_out = p_sys->p_out; unsigned int i_result;
unsigned int i_out, i_result;
int i_samples; p_sys->p_out = p_sys->p_out_buffer;
if( p_sys->dll ) if( p_sys->dll )
i_result = p_sys->raDecode( p_sys->context, p_sys->p_frame + i_result = p_sys->raDecode( p_sys->context, p_sys->p_frame +
p_sys->i_frame_size - p_sys->i_frame, p_sys->i_frame_size - p_sys->i_frame,
p_dec->fmt_in.audio.i_blockalign, p_dec->fmt_in.audio.i_blockalign,
p_out, &i_out, -1 ); p_sys->p_out, &p_sys->i_out, -1 );
else else
i_result = p_sys->wraDecode( p_sys->context, p_sys->p_frame + i_result = p_sys->wraDecode( p_sys->context, p_sys->p_frame +
p_sys->i_frame_size - p_sys->i_frame, p_sys->i_frame_size - p_sys->i_frame,
p_dec->fmt_in.audio.i_blockalign, p_dec->fmt_in.audio.i_blockalign,
p_out, &i_out, -1 ); p_sys->p_out, &p_sys->i_out, -1 );
i_samples = i_out * 8 / p_dec->fmt_out.audio.i_bitspersample /
p_dec->fmt_out.audio.i_channels;
#if 0 #if 0
msg_Err( p_dec, "decoded: %i samples (%i)", msg_Err( p_dec, "decoded: %i samples (%i)",
i_samples, i_result ); p_sys->i_out * 8 / p_dec->fmt_out.audio.i_bitspersample /
p_dec->fmt_out.audio.i_channels, i_result );
#endif #endif
p_sys->i_frame -= p_dec->fmt_in.audio.i_blockalign; p_sys->i_frame -= p_dec->fmt_in.audio.i_blockalign;
p_aout_buffer = p_dec->pf_aout_buffer_new( p_dec, i_samples ); return Decode( p_dec, pp_block );
if( p_aout_buffer == NULL ) return NULL;
memcpy( p_aout_buffer->p_buffer, p_out, i_out );
/* Date management */
p_aout_buffer->start_date = aout_DateGet( &p_sys->end_date );
p_aout_buffer->end_date =
aout_DateIncrement( &p_sys->end_date, i_samples );
return p_aout_buffer;
} }
......
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