[vlc-devel] commit: Fixed avcodec audio decoder after API behavior change. ( Laurent Aimar )
git version control
git at videolan.org
Thu Oct 8 22:32:21 CEST 2009
vlc | branch: 1.0-bugfix | Laurent Aimar <fenrir at videolan.org> | Thu Oct 8 21:12:01 2009 +0200| [29372c90602c8fb11be11f11381d6fd4df1696b7] | committer: Laurent Aimar
Fixed avcodec audio decoder after API behavior change.
It fixes at least WMAP decoding.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=29372c90602c8fb11be11f11381d6fd4df1696b7
---
modules/codec/avcodec/audio.c | 60 ++++++++++++++++++++++-------------------
1 files changed, 32 insertions(+), 28 deletions(-)
diff --git a/modules/codec/avcodec/audio.c b/modules/codec/avcodec/audio.c
index ae640e3..7e552d4 100644
--- a/modules/codec/avcodec/audio.c
+++ b/modules/codec/avcodec/audio.c
@@ -306,45 +306,49 @@ aout_buffer_t * DecodeAudio ( decoder_t *p_dec, block_t **pp_block )
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 );
if( !p_block )
return NULL;
p_block->i_buffer -= FF_INPUT_BUFFER_PADDING_SIZE;
memset( &p_block->p_buffer[p_block->i_buffer], 0, FF_INPUT_BUFFER_PADDING_SIZE );
-#if LIBAVCODEC_VERSION_INT >= ((52<<16)+(0<<8)+0)
- i_used = avcodec_decode_audio2( p_sys->p_context,
- (int16_t*)p_sys->p_output, &i_output,
- p_block->p_buffer, p_block->i_buffer );
+ 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 )
+ i_used = avcodec_decode_audio2( p_sys->p_context,
+ (int16_t*)p_sys->p_output, &i_output,
+ p_block->p_buffer, p_block->i_buffer );
#else
- i_used = avcodec_decode_audio( p_sys->p_context,
- (int16_t*)p_sys->p_output, &i_output,
- p_block->p_buffer, p_block->i_buffer );
+ i_used = avcodec_decode_audio( p_sys->p_context,
+ (int16_t*)p_sys->p_output, &i_output,
+ p_block->p_buffer, p_block->i_buffer );
#endif
- if( i_used < 0 || i_output < 0 )
- {
- if( i_used < 0 )
- msg_Warn( p_dec, "cannot decode one frame (%zu bytes)",
- p_block->i_buffer );
+ if( i_used < 0 || i_output < 0 )
+ {
+ if( i_used < 0 )
+ msg_Warn( p_dec, "cannot decode one frame (%zu bytes)",
+ p_block->i_buffer );
- block_Release( p_block );
- return NULL;
- }
- else if( (size_t)i_used > p_block->i_buffer )
- {
- i_used = p_block->i_buffer;
- }
+ block_Release( p_block );
+ return NULL;
+ }
+ else if( (size_t)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;
- p_block->p_buffer += i_used;
+ } while( p_block->i_buffer > 0 && i_output <= 0 );
if( p_sys->p_context->channels <= 0 || p_sys->p_context->channels > 8 ||
p_sys->p_context->sample_rate <= 0 )
More information about the vlc-devel
mailing list