Commit 5964d906 authored by Laurent Aimar's avatar Laurent Aimar

Fixed avcodec audio decoder after API behavior change.

It fixes at least WMAP decoding.
parent d210da89
...@@ -306,45 +306,49 @@ aout_buffer_t * DecodeAudio ( decoder_t *p_dec, block_t **pp_block ) ...@@ -306,45 +306,49 @@ aout_buffer_t * DecodeAudio ( decoder_t *p_dec, block_t **pp_block )
return NULL; return NULL;
} }
i_output = __MAX( p_block->i_buffer, p_sys->i_output_max );
if( i_output > p_sys->i_output_max )
{
/* Grow output buffer if necessary (eg. for PCM data) */
p_sys->p_output = av_realloc( p_sys->p_output, i_output );
}
*pp_block = p_block = block_Realloc( p_block, 0, p_block->i_buffer + FF_INPUT_BUFFER_PADDING_SIZE ); *pp_block = p_block = block_Realloc( p_block, 0, p_block->i_buffer + FF_INPUT_BUFFER_PADDING_SIZE );
if( !p_block ) if( !p_block )
return NULL; return NULL;
p_block->i_buffer -= FF_INPUT_BUFFER_PADDING_SIZE; p_block->i_buffer -= FF_INPUT_BUFFER_PADDING_SIZE;
memset( &p_block->p_buffer[p_block->i_buffer], 0, FF_INPUT_BUFFER_PADDING_SIZE ); memset( &p_block->p_buffer[p_block->i_buffer], 0, FF_INPUT_BUFFER_PADDING_SIZE );
do
{
i_output = __MAX( p_block->i_buffer, p_sys->i_output_max );
if( i_output > p_sys->i_output_max )
{
/* Grow output buffer if necessary (eg. for PCM data) */
p_sys->p_output = av_realloc( p_sys->p_output, i_output );
}
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT( 52, 0, 0 ) #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT( 52, 0, 0 )
i_used = avcodec_decode_audio2( p_sys->p_context, i_used = avcodec_decode_audio2( p_sys->p_context,
(int16_t*)p_sys->p_output, &i_output, (int16_t*)p_sys->p_output, &i_output,
p_block->p_buffer, p_block->i_buffer ); p_block->p_buffer, p_block->i_buffer );
#else #else
i_used = avcodec_decode_audio( p_sys->p_context, i_used = avcodec_decode_audio( p_sys->p_context,
(int16_t*)p_sys->p_output, &i_output, (int16_t*)p_sys->p_output, &i_output,
p_block->p_buffer, p_block->i_buffer ); p_block->p_buffer, p_block->i_buffer );
#endif #endif
if( i_used < 0 || i_output < 0 ) if( i_used < 0 || i_output < 0 )
{ {
if( i_used < 0 ) if( i_used < 0 )
msg_Warn( p_dec, "cannot decode one frame (%zu bytes)", msg_Warn( p_dec, "cannot decode one frame (%zu bytes)",
p_block->i_buffer ); p_block->i_buffer );
block_Release( p_block ); block_Release( p_block );
return NULL; return NULL;
} }
else if( (size_t)i_used > p_block->i_buffer ) else if( (size_t)i_used > p_block->i_buffer )
{ {
i_used = p_block->i_buffer; i_used = p_block->i_buffer;
} }
p_block->i_buffer -= i_used;
p_block->p_buffer += i_used;
p_block->i_buffer -= i_used; } while( p_block->i_buffer > 0 && i_output <= 0 );
p_block->p_buffer += i_used;
if( p_sys->p_context->channels <= 0 || p_sys->p_context->channels > 8 || if( p_sys->p_context->channels <= 0 || p_sys->p_context->channels > 8 ||
p_sys->p_context->sample_rate <= 0 ) p_sys->p_context->sample_rate <= 0 )
......
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