]> granicus.if.org Git - handbrake/commitdiff
make it possible to dynamically create and close multiple libhb instances
authorjstebbins <jstebbins.hb@gmail.com>
Fri, 26 Mar 2010 14:54:05 +0000 (14:54 +0000)
committerjstebbins <jstebbins.hb@gmail.com>
Fri, 26 Mar 2010 14:54:05 +0000 (14:54 +0000)
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

gtk/src/hb-backend.c
gtk/src/preview.c
libhb/hb.c
libhb/hb.h
libhb/ports.c
libhb/ports.h
libhb/scan.c
test/test.c

index 49962bd2162adcba2fd728783f3a7acf8f8303d9..53b71fd2d7f42877c6ed710577af5e5cc518acd9 100644 (file)
@@ -1095,14 +1095,14 @@ get_amix_value(gint val)
 static hb_handle_t * h_scan = NULL;
 static hb_handle_t * h_queue = NULL;
 
-extern void hb_get_tempory_directory(hb_handle_t *h, char path[512]);
+extern void hb_get_temporary_directory(char path[512]);
 
 gchar*
 ghb_get_tmp_dir()
 {
        char dir[512];
 
-       hb_get_tempory_directory(h_scan, dir);
+       hb_get_temporary_directory(dir);
        return g_strdup(dir);
 }
 
@@ -1111,7 +1111,7 @@ ghb_hb_cleanup(gboolean partial)
 {
        char dir[512];
 
-       hb_get_tempory_directory(h_scan, dir);
+       hb_get_temporary_directory(dir);
        del_tree(dir, !partial);
 }
 
@@ -2948,6 +2948,7 @@ ghb_backend_close()
 {
        hb_close(&h_queue);
        hb_close(&h_scan);
+       hb_global_close();
 }
 
 void ghb_backend_scan_stop()
index 2171f8ac84c9e91f85505ff45cc6c7247c24cb0a..4ed717bb1d56834e7ccec3413b76cd5f51b3bc9f 100644 (file)
@@ -533,8 +533,6 @@ ghb_live_reset(signal_user_data_t *ud)
                ghb_set_preview_image(ud);
 }
 
-extern void hb_get_tempory_directory(hb_handle_t *h, char path[512]);
-
 G_MODULE_EXPORT void
 live_preview_start_cb(GtkWidget *xwidget, signal_user_data_t *ud)
 {
index 0541b9fa7d26e7b38c5abec59e61f15f48a1db14..6f1e1ff371a92014f1d3d3de68def6d5048f4dd5 100644 (file)
@@ -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 );
 }
 
 /**
@@ -1455,6 +1480,15 @@ int hb_get_pid( hb_handle_t * h )
     return h->pid;
 }
 
+/**
+ * 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
index 04d87b2be3dc21d39d16481e85c531f5b1c33c15..036546b1d66dbfd482373aa8cee579ea54fa5b44 100644 (file)
@@ -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
index 85e009a366114d0d31fa726525a07e2072899f2a..b29368e075b3a9002ea012170ba0db091041f658 100644 (file)
@@ -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 );
index bc671b960e15018b0a0193d79cc895b6c3122921..6f451b42b0de9622cb0984e8ace615a6c7074797 100644 (file)
@@ -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 );
index 66afb2a210dd214750d4b68c2dd9f34ee7be4610..e14e6712b05c33dcf866a1252499bbc99b197f5a 100644 (file)
@@ -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 )
index bb2730182da36773809cc0964ab8a165916796c0..015e13da44ca42ff58a9928ffd8df4d5f0512f63 100644 (file)
@@ -213,6 +213,7 @@ int main( int argc, char ** argv )
                      "date.\n" );
         }
         hb_close( &h );
+        hb_global_close();
         return 0;
     }
 
@@ -324,6 +325,7 @@ int main( int argc, char ** argv )
 
     /* Clean up */
     hb_close( &h );
+    hb_global_close();
     if( input )  free( input );
     if( output ) free( output );
     if( format ) free( format );