@ -586,6 +586,9 @@ static int vmdaudio_decode_frame(AVCodecContext *avctx, void *data,
/* ensure output buffer is large enough */
audio_chunks = buf_size / s - > chunk_size ;
/* drop incomplete chunks */
buf_size = audio_chunks * s - > chunk_size ;
/* get output buffer */
frame - > nb_samples = ( ( silent_chunks + audio_chunks ) * avctx - > block_align ) /
avctx - > channels ;
@ -598,7 +601,8 @@ static int vmdaudio_decode_frame(AVCodecContext *avctx, void *data,
/* decode silent chunks */
if ( silent_chunks > 0 ) {
int silent_size = avctx - > block_align * silent_chunks ;
int silent_size = FFMIN ( avctx - > block_align * silent_chunks ,
frame - > nb_samples * avctx - > channels ) ;
if ( s - > out_bps = = 2 ) {
memset ( output_samples_s16 , 0x00 , silent_size * 2 ) ;
output_samples_s16 + = silent_size ;
@ -610,7 +614,7 @@ static int vmdaudio_decode_frame(AVCodecContext *avctx, void *data,
/* decode audio chunks */
if ( audio_chunks > 0 ) {
buf_end = buf + buf_size ;
buf_end = buf + ( buf_size & ~ ( avctx - > channels > 1 ) ) ;
while ( buf + s - > chunk_size < = buf_end ) {
if ( s - > out_bps = = 2 ) {
decode_audio_s16 ( output_samples_s16 , buf , s - > chunk_size ,