summaryrefslogtreecommitdiffstats
path: root/libhb
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2011-02-12 21:38:34 +0000
committerjstebbins <[email protected]>2011-02-12 21:38:34 +0000
commit8bf55ae1a275b3576971c4596c4b0b1090902364 (patch)
tree754846425d4660147e7d658cf500359c7298866d /libhb
parent335e7e305d59063132ddae2fff76e7c6c7b02d47 (diff)
plug some memory leaks.
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@3797 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'libhb')
-rw-r--r--libhb/decavcodec.c5
-rw-r--r--libhb/decmpeg2.c2
-rw-r--r--libhb/fifo.c20
-rw-r--r--libhb/reader.c5
-rw-r--r--libhb/work.c16
5 files changed, 36 insertions, 12 deletions
diff --git a/libhb/decavcodec.c b/libhb/decavcodec.c
index 298fba69d..612991c79 100644
--- a/libhb/decavcodec.c
+++ b/libhb/decavcodec.c
@@ -64,6 +64,7 @@
#include "downmix.h"
#include "libavcodec/audioconvert.h"
+static void flushDelayQueue( hb_work_private_t *pv );
static int decavcodecInit( hb_work_object_t *, hb_job_t * );
static int decavcodecWork( hb_work_object_t *, hb_buffer_t **, hb_buffer_t ** );
static void decavcodecClose( hb_work_object_t * );
@@ -271,6 +272,8 @@ static void closePrivData( hb_work_private_t ** ppv )
if ( pv )
{
+ flushDelayQueue( pv );
+
if ( pv->job && pv->context && pv->context->codec )
{
hb_log( "%s-decoder done: %u frames, %u decoder errors, %u drops",
@@ -291,7 +294,7 @@ static void closePrivData( hb_work_private_t ** ppv )
}
if ( pv->list )
{
- hb_list_close( &pv->list );
+ hb_list_empty( &pv->list );
}
if ( pv->buffer )
{
diff --git a/libhb/decmpeg2.c b/libhb/decmpeg2.c
index 1d2d059b8..6604ac1ea 100644
--- a/libhb/decmpeg2.c
+++ b/libhb/decmpeg2.c
@@ -834,7 +834,7 @@ static void decmpeg2Close( hb_work_object_t * w )
{
hb_log( "mpeg2 done: %d frames", pv->libmpeg2->nframes );
}
- hb_list_close( &pv->list );
+ hb_list_empty( &pv->list );
if ( pv->libmpeg2->list_subtitle )
{
hb_list_close( &pv->libmpeg2->list_subtitle );
diff --git a/libhb/fifo.c b/libhb/fifo.c
index a29e84696..755a6d164 100644
--- a/libhb/fifo.c
+++ b/libhb/fifo.c
@@ -193,18 +193,22 @@ void hb_buffer_realloc( hb_buffer_t * b, int size )
void hb_buffer_close( hb_buffer_t ** _b )
{
hb_buffer_t * b = *_b;
- hb_fifo_t *buffer_pool = size_to_pool( b->alloc );
- if( buffer_pool && b->data && !hb_fifo_is_full( buffer_pool ) )
- {
- hb_fifo_push_head( buffer_pool, b );
- *_b = NULL;
- return;
- }
- /* either the pool is full or this size doesn't use a pool - free the buf */
while( b )
{
hb_buffer_t * next = b->next;
+ hb_fifo_t *buffer_pool = size_to_pool( b->alloc );
+
+ b->next = NULL;
+
+ if( buffer_pool && b->data && !hb_fifo_is_full( buffer_pool ) )
+ {
+ hb_fifo_push_head( buffer_pool, b );
+ b = next;
+ continue;
+ }
+ // either the pool is full or this size doesn't use a pool
+ // free the buf
if( b->data )
{
free( b->data );
diff --git a/libhb/reader.c b/libhb/reader.c
index 783535492..bd3758eea 100644
--- a/libhb/reader.c
+++ b/libhb/reader.c
@@ -84,9 +84,14 @@ static void push_buf( const hb_reader_t *r, hb_fifo_t *fifo, hb_buffer_t *buf )
if ( hb_fifo_full_wait( fifo ) )
{
hb_fifo_push( fifo, buf );
+ buf = NULL;
break;
}
}
+ if ( buf )
+ {
+ hb_buffer_close( &buf );
+ }
}
static int is_audio( hb_reader_t *r, int id )
diff --git a/libhb/work.c b/libhb/work.c
index 045f5b9bb..e3d094542 100644
--- a/libhb/work.c
+++ b/libhb/work.c
@@ -984,10 +984,10 @@ static void do_job( hb_job_t * job, int cpu_count )
w = muxer;
}
+ hb_buffer_t * buf_in, * buf_out;
+
while ( !*job->die && !*w->done && w->status != HB_WORK_DONE )
{
- hb_buffer_t * buf_in, * buf_out;
-
buf_in = hb_fifo_get_wait( w->fifo_in );
if ( buf_in == NULL )
continue;
@@ -1018,12 +1018,18 @@ static void do_job( hb_job_t * job, int cpu_count )
if ( hb_fifo_full_wait( w->fifo_out ) )
{
hb_fifo_push( w->fifo_out, buf_out );
+ buf_out = NULL;
break;
}
}
}
}
+ if ( buf_out )
+ {
+ hb_buffer_close( &buf_out );
+ }
+
hb_handle_t * h = job->h;
hb_state_t state;
hb_get_state( h, &state );
@@ -1253,11 +1259,17 @@ static void work_loop( void * _w )
if ( hb_fifo_full_wait( w->fifo_out ) )
{
hb_fifo_push( w->fifo_out, buf_out );
+ buf_out = NULL;
break;
}
}
}
}
+ if ( buf_out )
+ {
+ hb_buffer_close( &buf_out );
+ }
+
// Consume data in incoming fifo till job complete so that
// residual data does not stall the pipeline
while( !*w->done )