From 61bef2b28ed7caa4c5869c0bc5b042136bc82c1d Mon Sep 17 00:00:00 2001 From: jstebbins Date: Tue, 29 Sep 2009 23:31:57 +0000 Subject: [PATCH] flush lame encoder The last mp3 frame was not complete. Most players ignore the broken frame, but a user ran across some software that handled it badly and crashed. git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@2852 b64f7644-9d1e-0410-96f1-a4d463321fa5 --- libhb/enclame.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/libhb/enclame.c b/libhb/enclame.c index 8f4defcc5..027aa3add 100644 --- a/libhb/enclame.c +++ b/libhb/enclame.c @@ -28,6 +28,7 @@ struct hb_work_private_s /* LAME handle */ lame_global_flags * lame; + int done; unsigned long input_samples; unsigned long output_bytes; uint8_t * buf; @@ -138,14 +139,33 @@ int enclameWork( hb_work_object_t * w, hb_buffer_t ** buf_in, hb_buffer_t ** buf_out ) { hb_work_private_t * pv = w->private_data; + hb_buffer_t * in = *buf_in; hb_buffer_t * buf; if ( (*buf_in)->size <= 0 ) { /* EOF on input - send it downstream & say we're done */ - *buf_out = *buf_in; - *buf_in = NULL; - return HB_WORK_DONE; + if ( pv->done ) + { + *buf_out = *buf_in; + *buf_in = NULL; + return HB_WORK_DONE; + } + else + { + pv->done = 1; + hb_fifo_push( w->fifo_in, in); + *buf_in = NULL; + + buf = hb_buffer_init( pv->output_bytes ); + buf->size = lame_encode_flush( pv->lame, buf->data, LAME_MAXMP3BUFFER ); + if( buf->size <= 0 ) + { + hb_buffer_close( &buf ); + } + *buf_out = buf; + return HB_WORK_OK; + } } hb_list_add( pv->list, *buf_in ); -- 2.40.0