summaryrefslogtreecommitdiffstats
path: root/libhb/hb.c
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/hb.c
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/hb.c')
-rw-r--r--libhb/hb.c102
1 files changed, 68 insertions, 34 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