summaryrefslogtreecommitdiffstats
path: root/libhb
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2010-03-26 14:54:05 +0000
committerjstebbins <[email protected]>2010-03-26 14:54:05 +0000
commitff1bc2964476e2cbf22ed3dd7aa249a9cc77368b (patch)
tree66d27421270e27e82469b6076fca037e448a68dc /libhb
parent8101df03de52879c876ca73b02a627baa4d09c4a (diff)
make it possible to dynamically create and close multiple libhb instances
tweaks to make libhb more usable from a C# app remove pointers from preview filenames, replaces with hb instance and title id's removes only previews upon hb_close, leaves temp dir for hb_global_close git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@3170 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'libhb')
-rw-r--r--libhb/hb.c102
-rw-r--r--libhb/hb.h8
-rw-r--r--libhb/ports.c9
-rw-r--r--libhb/ports.h4
-rw-r--r--libhb/scan.c4
5 files changed, 85 insertions, 42 deletions
diff --git a/libhb/hb.c b/libhb/hb.c
index 0541b9fa7..6f1e1ff37 100644
--- a/libhb/hb.c
+++ b/libhb/hb.c
@@ -3,6 +3,8 @@
struct hb_handle_s
{
+ int id;
+
/* The "Check for update" thread */
int build;
char version[32];
@@ -49,6 +51,7 @@ struct hb_handle_s
hb_lock_t *hb_avcodec_lock;
hb_work_object_t * hb_objects = NULL;
+int hb_instance_counter = 0;
int hb_process_initialized = 0;
static void thread_func( void * );
@@ -95,16 +98,16 @@ void hb_register( hb_work_object_t * w )
*/
hb_handle_t * hb_init( int verbose, int update_check )
{
- if (!hb_process_initialized)
- {
+ if (!hb_process_initialized)
+ {
#ifdef USE_PTHREAD
#if defined( _WIN32 ) || defined( __MINGW32__ )
- pthread_win32_process_attach_np();
+ pthread_win32_process_attach_np();
#endif
#endif
- hb_process_initialized =1;
- }
-
+ hb_process_initialized =1;
+ }
+
hb_handle_t * h = calloc( sizeof( hb_handle_t ), 1 );
uint64_t date;
@@ -112,7 +115,9 @@ hb_handle_t * hb_init( int verbose, int update_check )
global_verbosity_level = verbose;
if( verbose )
putenv( "HB_DEBUG=1" );
-
+
+ h->id = hb_instance_counter++;
+
/* Check for an update on the website if asked to */
h->build = -1;
@@ -194,7 +199,7 @@ hb_handle_t * hb_init( int verbose, int update_check )
#ifdef __APPLE__
hb_register( &hb_encca_aac );
#endif
-
+
return h;
}
@@ -216,6 +221,8 @@ hb_handle_t * hb_init_dl( int verbose, int update_check )
putenv( "HB_DEBUG=1" );
}
+ h->id = hb_instance_counter++;
+
/* Check for an update on the website if asked to */
h->build = -1;
@@ -356,7 +363,7 @@ void hb_remove_previews( hb_handle_t * h )
struct dirent * entry;
memset( dirname, 0, 1024 );
- hb_get_tempory_directory( h, dirname );
+ hb_get_temporary_directory( dirname );
dir = opendir( dirname );
if (dir == NULL) return;
@@ -370,7 +377,7 @@ void hb_remove_previews( hb_handle_t * h )
for( i = 0; i < count; i++ )
{
title = hb_list_item( h->list_title, i );
- len = snprintf( filename, 1024, "%" PRIxPTR, (intptr_t) title );
+ len = snprintf( filename, 1024, "%d_%d", h->id, title->index );
if (strncmp(entry->d_name, filename, len) == 0)
{
snprintf( filename, 1024, "%s/%s", dirname, entry->d_name );
@@ -461,8 +468,8 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
memset( filename, 0, 1024 );
- hb_get_tempory_filename( h, filename, "%" PRIxPTR "%d",
- (intptr_t) title, picture );
+ hb_get_tempory_filename( h, filename, "%d_%d_%d",
+ h->id, title->index, picture );
file = fopen( filename, "rb" );
if( !file )
@@ -1314,6 +1321,7 @@ void hb_close( hb_handle_t ** _h )
hb_title_t * title;
h->die = 1;
+
hb_thread_close( &h->main_thread );
while( ( title = hb_list_item( h->list_title, 0 ) ) )
@@ -1331,9 +1339,41 @@ void hb_close( hb_handle_t ** _h )
hb_list_close( &h->jobs );
hb_lock_close( &h->state_lock );
hb_lock_close( &h->pause_lock );
+
free( h );
*_h = NULL;
+}
+
+/**
+ * Cleans up libhb at a process level. Call before the app closes. Removes preview directory.
+ */
+void hb_global_close()
+{
+ char dirname[1024];
+ DIR * dir;
+ struct dirent * entry;
+
+ /* Find and remove temp folder */
+ memset( dirname, 0, 1024 );
+ hb_get_temporary_directory( dirname );
+ dir = opendir( dirname );
+ if (dir)
+ {
+ while( ( entry = readdir( dir ) ) )
+ {
+ char filename[1024];
+ if( entry->d_name[0] == '.' )
+ {
+ continue;
+ }
+ memset( filename, 0, 1024 );
+ snprintf( filename, 1023, "%s/%s", dirname, entry->d_name );
+ unlink( filename );
+ }
+ closedir( dir );
+ rmdir( dirname );
+ }
}
/**
@@ -1346,14 +1386,12 @@ static void thread_func( void * _h )
{
hb_handle_t * h = (hb_handle_t *) _h;
char dirname[1024];
- DIR * dir;
- struct dirent * entry;
h->pid = getpid();
/* Create folder for temporary files */
memset( dirname, 0, 1024 );
- hb_get_tempory_directory( h, dirname );
+ hb_get_temporary_directory( dirname );
hb_mkdir( dirname );
@@ -1420,30 +1458,17 @@ static void thread_func( void * _h )
hb_snooze( 50 );
}
+ if( h->scan_thread )
+ {
+ hb_scan_stop( h );
+ hb_thread_close( &h->scan_thread );
+ }
if( h->work_thread )
{
hb_stop( h );
hb_thread_close( &h->work_thread );
}
-
- /* Remove temp folder */
- dir = opendir( dirname );
- if (dir)
- {
- while( ( entry = readdir( dir ) ) )
- {
- char filename[1024];
- if( entry->d_name[0] == '.' )
- {
- continue;
- }
- memset( filename, 0, 1024 );
- snprintf( filename, 1023, "%s/%s", dirname, entry->d_name );
- unlink( filename );
- }
- closedir( dir );
- rmdir( dirname );
- }
+ hb_remove_previews( h );
}
/**
@@ -1456,6 +1481,15 @@ int hb_get_pid( hb_handle_t * h )
}
/**
+ * Returns the id for the given instance.
+ * @param h Handle to hb_handle_t
+ */
+int hb_get_instance_id( hb_handle_t * h )
+{
+ return h->id;
+}
+
+/**
* Sets the current state.
* @param h Handle to hb_handle_t
* @param s Handle to new hb_state_t
diff --git a/libhb/hb.h b/libhb/hb.h
index 04d87b2be..036546b1d 100644
--- a/libhb/hb.h
+++ b/libhb/hb.h
@@ -99,6 +99,14 @@ int hb_get_scancount( hb_handle_t * );
Aborts all current jobs if any, frees memory. */
void hb_close( hb_handle_t ** );
+/* hb_global_close()
+ Performs final cleanup for the process. */
+void hb_global_close();
+
+/* hb_get_instance_id()
+ Return the unique instance id of an libhb instance created by hb_init. */
+int hb_get_instance_id( hb_handle_t * h );
+
#ifdef __cplusplus
}
#endif
diff --git a/libhb/ports.c b/libhb/ports.c
index 85e009a36..b29368e07 100644
--- a/libhb/ports.c
+++ b/libhb/ports.c
@@ -65,6 +65,7 @@
#endif
#include <stddef.h>
+#include <unistd.h>
#include "hb.h"
@@ -225,9 +226,9 @@ int hb_get_cpu_count()
}
/************************************************************************
- * Get a tempory directory for HB
+ * Get a temporary directory for HB
***********************************************************************/
-void hb_get_tempory_directory( hb_handle_t * h, char path[512] )
+void hb_get_temporary_directory( char path[512] )
{
char base[512];
@@ -251,7 +252,7 @@ void hb_get_tempory_directory( hb_handle_t * h, char path[512] )
if( base[strlen(base)-1] == '/' )
base[strlen(base)-1] = '\0';
- snprintf( path, 512, "%s/hb.%d", base, hb_get_pid( h ) );
+ snprintf( path, 512, "%s/hb.%d", base, getpid() );
}
/************************************************************************
@@ -262,7 +263,7 @@ void hb_get_tempory_filename( hb_handle_t * h, char name[1024],
{
va_list args;
- hb_get_tempory_directory( h, name );
+ hb_get_temporary_directory( name );
strcat( name, "/" );
va_start( args, fmt );
diff --git a/libhb/ports.h b/libhb/ports.h
index bc671b960..6f451b42b 100644
--- a/libhb/ports.h
+++ b/libhb/ports.h
@@ -30,9 +30,9 @@ int hb_get_cpu_count();
int hb_dvd_region(char *device, int *region_mask);
/************************************************************************
- * Files utils
+ * File utils
***********************************************************************/
-void hb_get_tempory_directory( hb_handle_t * h, char path[512] );
+void hb_get_temporary_directory( char path[512] );
void hb_get_tempory_filename( hb_handle_t *, char name[1024],
char * fmt, ... );
void hb_mkdir( char * name );
diff --git a/libhb/scan.c b/libhb/scan.c
index 66afb2a21..e14e6712b 100644
--- a/libhb/scan.c
+++ b/libhb/scan.c
@@ -609,8 +609,8 @@ static int DecodePreviews( hb_scan_t * data, hb_title_t * title )
if( data->store_previews )
{
- hb_get_tempory_filename( data->h, filename, "%" PRIxPTR "%d",
- (intptr_t)title, i );
+ hb_get_tempory_filename( data->h, filename, "%d_%d_%d",
+ hb_get_instance_id(data->h), title->index, i );
file_preview = fopen( filename, "wb" );
if( file_preview )