X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fframework%2Fmlt_factory.c;h=dee338e3bab2d36d0716568c8db2791c48454de4;hb=2a800ec4c840132c7a629b764b673dce09771637;hp=5d7187b3b2e61e4f99fe3a07f0baa66c6ce6f3e9;hpb=4ed2712bbdac2182c7c0d6477ac77c9f92aaf02a;p=melted diff --git a/src/framework/mlt_factory.c b/src/framework/mlt_factory.c index 5d7187b..dee338e 100644 --- a/src/framework/mlt_factory.c +++ b/src/framework/mlt_factory.c @@ -19,41 +19,80 @@ */ #include "config.h" -#include "mlt_factory.h" +#include "mlt.h" #include "mlt_repository.h" -#include "mlt_properties.h" +#include #include +#include /** Singleton repositories */ +static char *mlt_prefix = NULL; +static mlt_properties global_properties = NULL; static mlt_properties object_list = NULL; static mlt_repository producers = NULL; static mlt_repository filters = NULL; static mlt_repository transitions = NULL; static mlt_repository consumers = NULL; +static int unique_id = 0; /** Construct the factories. */ int mlt_factory_init( char *prefix ) { - // If no directory is specified, default to install directory - if ( prefix == NULL ) - prefix = PREFIX_DATA; + // Only initialise once + if ( mlt_prefix == NULL ) + { + // Allow user over rides + if ( prefix == NULL ) + prefix = getenv( "MLT_REPOSITORY" ); + + // If no directory is specified, default to install directory + if ( prefix == NULL ) + prefix = PREFIX_DATA; + + // Store the prefix for later retrieval + mlt_prefix = strdup( prefix ); + + // Initialise the pool + mlt_pool_init( ); + + // Create the global properties + global_properties = mlt_properties_new( ); + mlt_properties_set_or_default( global_properties, "MLT_NORMALISATION", getenv( "MLT_NORMALISATION" ), "PAL" ); + mlt_properties_set_or_default( global_properties, "MLT_PRODUCER", getenv( "MLT_PRODUCER" ), "fezzik" ); + mlt_properties_set_or_default( global_properties, "MLT_CONSUMER", getenv( "MLT_CONSUMER" ), "sdl" ); + + // Create the object list. + object_list = mlt_properties_new( ); + + // Create a repository for each service type + producers = mlt_repository_init( object_list, prefix, "producers.dat", "mlt_create_producer" ); + filters = mlt_repository_init( object_list, prefix, "filters.dat", "mlt_create_filter" ); + transitions = mlt_repository_init( object_list, prefix, "transitions.dat", "mlt_create_transition" ); + consumers = mlt_repository_init( object_list, prefix, "consumers.dat", "mlt_create_consumer" ); + } - // Create the object list. - object_list = calloc( sizeof( struct mlt_properties_s ), 1 ); - mlt_properties_init( object_list, NULL ); + return 0; +} - // Create a repository for each service type - producers = mlt_repository_init( object_list, prefix, "producers.dat", "mlt_create_producer" ); - filters = mlt_repository_init( object_list, prefix, "filters.dat", "mlt_create_filter" ); - transitions = mlt_repository_init( object_list, prefix, "transitions.dat", "mlt_create_transition" ); - consumers = mlt_repository_init( object_list, prefix, "consumers.dat", "mlt_create_consumer" ); +/** Fetch the prefix used in this instance. +*/ - return 0; +const char *mlt_factory_prefix( ) +{ + return mlt_prefix; +} + +/** Get a value from the environment. +*/ + +char *mlt_environment( char *name ) +{ + return mlt_properties_get( global_properties, name ); } /** Fetch a producer from the repository. @@ -61,7 +100,24 @@ int mlt_factory_init( char *prefix ) mlt_producer mlt_factory_producer( char *service, void *input ) { - return ( mlt_producer )mlt_repository_fetch( producers, service, input ); + mlt_producer obj = NULL; + + // Pick up the default normalising producer if necessary + if ( service == NULL ) + service = mlt_environment( "MLT_PRODUCER" ); + + // Try to instantiate via the specified service + obj = mlt_repository_fetch( producers, service, input ); + + if ( obj != NULL ) + { + mlt_properties properties = mlt_producer_properties( obj ); + mlt_properties_set_int( properties, "_unique_id", ++ unique_id ); + mlt_properties_set( properties, "mlt_type", "producer" ); + if ( mlt_properties_get_int( properties, "_mlt_service_hidden" ) == 0 ) + mlt_properties_set( properties, "mlt_service", service ); + } + return obj; } /** Fetch a filter from the repository. @@ -69,7 +125,15 @@ mlt_producer mlt_factory_producer( char *service, void *input ) mlt_filter mlt_factory_filter( char *service, void *input ) { - return ( mlt_filter )mlt_repository_fetch( filters, service, input ); + mlt_filter obj = mlt_repository_fetch( filters, service, input ); + if ( obj != NULL ) + { + mlt_properties properties = mlt_filter_properties( obj ); + mlt_properties_set_int( properties, "_unique_id", ++ unique_id ); + mlt_properties_set( properties, "mlt_type", "filter" ); + mlt_properties_set( properties, "mlt_service", service ); + } + return obj; } /** Fetch a transition from the repository. @@ -77,7 +141,15 @@ mlt_filter mlt_factory_filter( char *service, void *input ) mlt_transition mlt_factory_transition( char *service, void *input ) { - return ( mlt_transition )mlt_repository_fetch( transitions, service, input ); + mlt_transition obj = mlt_repository_fetch( transitions, service, input ); + if ( obj != NULL ) + { + mlt_properties properties = mlt_transition_properties( obj ); + mlt_properties_set_int( properties, "_unique_id", ++ unique_id ); + mlt_properties_set( properties, "mlt_type", "transition" ); + mlt_properties_set( properties, "mlt_service", service ); + } + return obj; } /** Fetch a consumer from the repository @@ -85,7 +157,21 @@ mlt_transition mlt_factory_transition( char *service, void *input ) mlt_consumer mlt_factory_consumer( char *service, void *input ) { - return ( mlt_consumer )mlt_repository_fetch( consumers, service, input ); + mlt_consumer obj = NULL; + + if ( service == NULL ) + service = mlt_environment( "MLT_CONSUMER" ); + + obj = mlt_repository_fetch( consumers, service, input ); + + if ( obj != NULL ) + { + mlt_properties properties = mlt_consumer_properties( obj ); + mlt_properties_set_int( properties, "_unique_id", ++ unique_id ); + mlt_properties_set( properties, "mlt_type", "consumer" ); + mlt_properties_set( properties, "mlt_service", service ); + } + return obj; } /** Close the factory. @@ -93,11 +179,17 @@ mlt_consumer mlt_factory_consumer( char *service, void *input ) void mlt_factory_close( ) { - mlt_repository_close( producers ); - mlt_repository_close( filters ); - mlt_repository_close( transitions ); - mlt_repository_close( consumers ); - mlt_properties_close( object_list ); - free( object_list ); + if ( mlt_prefix != NULL ) + { + mlt_repository_close( producers ); + mlt_repository_close( filters ); + mlt_repository_close( transitions ); + mlt_repository_close( consumers ); + mlt_properties_close( object_list ); + mlt_properties_close( global_properties ); + free( mlt_prefix ); + mlt_prefix = NULL; + mlt_pool_close( ); + } }