]> git.sesse.net Git - mlt/blobdiff - src/framework/mlt_factory.c
Add 'boolean' and 'argument' to service metadata schema.
[mlt] / src / framework / mlt_factory.c
index cdefa8c76f001c5ecb45830323b410b1d060aad6..5c0c877f744c81b0c466e92f8699a5bb748386fa 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 #include <locale.h>
+#include <libgen.h>
 
 #ifdef WIN32
 #include <windows.h>
 /** the default subdirectory of the libdir for holding modules (plugins) */
-#define PREFIX_LIB "lib\\mlt"
+#define PREFIX_LIB "\\lib\\mlt"
 /** the default subdirectory of the install prefix for holding module (plugin) data */
-#define PREFIX_DATA "share\\mlt"
-#else
+#define PREFIX_DATA "\\share\\mlt"
+#elif defined(__DARWIN__) && defined(RELOCATABLE)
+#include <mach-o/dyld.h>
 /** the default subdirectory of the libdir for holding modules (plugins) */
-#define PREFIX_LIB LIBDIR "/mlt"
+#define PREFIX_LIB "/lib/mlt"
 /** the default subdirectory of the install prefix for holding module (plugin) data */
-#define PREFIX_DATA PREFIX "/share/mlt"
+#define PREFIX_DATA "/share/mlt"
 #endif
 
 /** holds the full path to the modules directory - initialized and retained for the entire session */
@@ -117,8 +119,22 @@ mlt_repository mlt_factory_init( const char *directory )
                mlt_properties_set_or_default( global_properties, "MLT_CONSUMER", getenv( "MLT_CONSUMER" ), "sdl" );
                mlt_properties_set( global_properties, "MLT_TEST_CARD", getenv( "MLT_TEST_CARD" ) );
                mlt_properties_set_or_default( global_properties, "MLT_PROFILE", getenv( "MLT_PROFILE" ), "dv_pal" );
-
                mlt_properties_set_or_default( global_properties, "MLT_DATA", getenv( "MLT_DATA" ), PREFIX_DATA );
+#if defined(WIN32)
+               char path[1024];
+               DWORD size = sizeof( path );
+               GetModuleFileName( NULL, path, size );
+#elif defined(__DARWIN__)  && defined(RELOCATABLE)
+               char path[1024];
+               uint32_t size = sizeof( path );
+               _NSGetExecutablePath( path, &size );
+#endif
+#if defined(WIN32) || (defined(__DARWIN__) && defined(RELOCATABLE))
+               char *path2 = strdup( path );
+               char *appdir = dirname( path2 );
+               mlt_properties_set( global_properties, "MLT_APPDIR", appdir );
+               free( path2 );
+#endif
        }
 
        // Only initialise once
@@ -133,8 +149,24 @@ mlt_repository mlt_factory_init( const char *directory )
                        directory = PREFIX_LIB;
 
                // Store the prefix for later retrieval
+#if defined(WIN32) || (defined(__DARWIN__) && defined(RELOCATABLE))
+               char *exedir = mlt_environment( "MLT_APPDIR" );
+               size_t size = strlen( exedir );
+               if ( global_properties && !getenv( "MLT_DATA" ) )
+               {
+                       mlt_directory = calloc( 1, size + strlen( PREFIX_DATA ) + 1 );
+                       strcpy( mlt_directory, exedir );
+                       strcat( mlt_directory, PREFIX_DATA );
+                       mlt_properties_set( global_properties, "MLT_DATA", mlt_directory );
+                       free( mlt_directory );
+               }
+               mlt_directory = calloc( 1, size + strlen( directory ) + 1 );
+               strcpy( mlt_directory, exedir );
+               strcat( mlt_directory, directory );
+#else
                mlt_directory = strdup( directory );
-
+#endif
+               
                // Initialise the pool
                mlt_pool_init( );
 
@@ -151,7 +183,7 @@ mlt_repository mlt_factory_init( const char *directory )
                mlt_events_register( event_object, "consumer-create-done", ( mlt_transmitter )mlt_factory_create_done );
 
                // Create the repository of services
-               repository = mlt_repository_init( directory );
+               repository = mlt_repository_init( mlt_directory );
 
                // Force a clean up when app closes
                atexit( mlt_factory_close );