X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fframework%2Fmlt_factory.c;h=419a7d324b2d7d6e3758cf7b2e826e52178a6f1b;hb=ec7f7d58e000242e918c2ae2cebd172bffe6e9d4;hp=9795770ba430f94ac293b4e3b6689bf37087d687;hpb=0cf7dff156fe3c541eb5d668e317cc73b008c7b0;p=melted diff --git a/src/framework/mlt_factory.c b/src/framework/mlt_factory.c index 9795770..419a7d3 100644 --- a/src/framework/mlt_factory.c +++ b/src/framework/mlt_factory.c @@ -19,10 +19,10 @@ */ #include "config.h" -#include "mlt_factory.h" +#include "mlt.h" #include "mlt_repository.h" -#include "mlt_properties.h" +#include #include #include @@ -41,22 +41,25 @@ static mlt_repository consumers = NULL; int mlt_factory_init( char *prefix ) { - // 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 ); - - // Create the object list. - object_list = calloc( sizeof( struct mlt_properties_s ), 1 ); - mlt_properties_init( object_list, NULL ); - - // 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" ); + // Only initialise once + if ( mlt_prefix == NULL ) + { + // 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 ); + + // 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" ); + } return 0; } @@ -74,7 +77,14 @@ const char *mlt_factory_prefix( ) mlt_producer mlt_factory_producer( char *service, void *input ) { - return ( mlt_producer )mlt_repository_fetch( producers, service, input ); + mlt_producer obj = mlt_repository_fetch( producers, service, input ); + if ( obj != NULL ) + { + mlt_properties properties = mlt_producer_properties( obj ); + mlt_properties_set( properties, "mlt_type", "producer" ); + mlt_properties_set( properties, "mlt_service", service ); + } + return obj; } /** Fetch a filter from the repository. @@ -82,7 +92,14 @@ 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( properties, "mlt_type", "filter" ); + mlt_properties_set( properties, "mlt_service", service ); + } + return obj; } /** Fetch a transition from the repository. @@ -90,7 +107,14 @@ 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( properties, "mlt_type", "transition" ); + mlt_properties_set( properties, "mlt_service", service ); + } + return obj; } /** Fetch a consumer from the repository @@ -98,7 +122,14 @@ 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 = mlt_repository_fetch( consumers, service, input ); + if ( obj != NULL ) + { + mlt_properties properties = mlt_consumer_properties( obj ); + mlt_properties_set( properties, "mlt_type", "consumer" ); + mlt_properties_set( properties, "mlt_service", service ); + } + return obj; } /** Close the factory. @@ -106,12 +137,15 @@ 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( mlt_prefix ); - 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 ); + free( mlt_prefix ); + mlt_prefix = NULL; + } }