]> git.sesse.net Git - mlt/commitdiff
mlt_consumer.[hc]: added new functions mlt_repository_consumers, mlt_repository_filters,
authorddennedy <ddennedy@d19143bc-622f-0410-bfdd-b5b2a6649095>
Sat, 16 Feb 2008 05:08:46 +0000 (05:08 +0000)
committerddennedy <ddennedy@d19143bc-622f-0410-bfdd-b5b2a6649095>
Sat, 16 Feb 2008 05:08:46 +0000 (05:08 +0000)
mlt_repository_producers, mlt_repository_transitions, mlt_repository_register_metadata, and mlt_repository_metadata

git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@1072 d19143bc-622f-0410-bfdd-b5b2a6649095

src/framework/mlt_repository.c
src/framework/mlt_repository.h

index 3ab95bed696fe384b960f6fa31b0d34f093e22aa..b271a85e25ccbe8d87e281c651fa4a4fd5f7b719 100644 (file)
@@ -35,6 +35,9 @@ struct mlt_repository_s
        mlt_properties transitions;
 };
 
+/** Construct a new repository
+*/
+
 mlt_repository mlt_repository_init( const char *directory )
 {
        // Safety check
@@ -90,55 +93,84 @@ mlt_repository mlt_repository_init( const char *directory )
        return this;
 }
 
+static mlt_properties new_service( void *symbol )
+{
+       mlt_properties properties = mlt_properties_new();
+       mlt_properties_set_data( properties, "symbol", symbol, 0, NULL, NULL );
+       return properties;
+}
+
+/** Register a service with the repository
+    Typically, this is invoked by a module within its mlt_register().
+*/
+
 void mlt_repository_register( mlt_repository this, mlt_service_type service_type, const char *service, void *symbol )
 {
        // Add the entry point to the corresponding service list
        switch ( service_type )
        {
                case consumer_type:
-                       mlt_properties_set_data( this->consumers, service, symbol, 0, NULL, NULL );
+                       mlt_properties_set_data( this->consumers, service, new_service( symbol ), 0, ( mlt_destructor )mlt_properties_close, NULL );
                        break;
                case filter_type:
-                       mlt_properties_set_data( this->filters, service, symbol, 0, NULL, NULL );
+                       mlt_properties_set_data( this->filters, service, new_service( symbol ), 0, ( mlt_destructor )mlt_properties_close, NULL );
                        break;
                case producer_type:
-                       mlt_properties_set_data( this->producers, service, symbol, 0, NULL, NULL );
+                       mlt_properties_set_data( this->producers, service, new_service( symbol ), 0, ( mlt_destructor )mlt_properties_close, NULL );
                        break;
                case transition_type:
-                       mlt_properties_set_data( this->transitions, service, symbol, 0, NULL, NULL );
+                       mlt_properties_set_data( this->transitions, service, new_service( symbol ), 0, ( mlt_destructor )mlt_properties_close, NULL );
                        break;
                default:
                        break;
        }
 }
 
-void *mlt_repository_create( mlt_repository this, mlt_profile profile, mlt_service_type type, const char *service, void *input )
+static mlt_properties get_service_properties( mlt_repository this, mlt_service_type type, const char *service )
 {
-       void *( *symbol_ptr )( mlt_profile, mlt_service_type, const char *, void * ) = NULL;
+       mlt_properties service_properties = NULL;
 
        // Get the entry point from the corresponding service list
        switch ( type )
        {
                case consumer_type:
-                       symbol_ptr = mlt_properties_get_data( this->consumers, service, NULL );
+                       service_properties = mlt_properties_get_data( this->consumers, service, NULL );
                        break;
                case filter_type:
-                       symbol_ptr = mlt_properties_get_data( this->filters, service, NULL );
+                       service_properties = mlt_properties_get_data( this->filters, service, NULL );
                        break;
                case producer_type:
-                       symbol_ptr = mlt_properties_get_data( this->producers, service, NULL );
+                       service_properties = mlt_properties_get_data( this->producers, service, NULL );
                        break;
                case transition_type:
-                       symbol_ptr = mlt_properties_get_data( this->transitions, service, NULL );
+                       service_properties = mlt_properties_get_data( this->transitions, service, NULL );
                        break;
                default:
                        break;
        }
+       return service_properties;
+}
+
+/** Construct a new instance of a service
+*/
+
+void *mlt_repository_create( mlt_repository this, mlt_profile profile, mlt_service_type type, const char *service, void *input )
+{
+       mlt_properties properties = get_service_properties( this, type, service );
+       if ( properties != NULL )
+       {
+               void *( *symbol_ptr )( mlt_profile, mlt_service_type, const char *, void * ) =
+                       mlt_properties_get_data( properties, "symbol", NULL );
        
-       // Construct the service
-       return ( symbol_ptr != NULL ) ? symbol_ptr( profile, type, service, input ) : NULL;
+               // Construct the service
+               return ( symbol_ptr != NULL ) ? symbol_ptr( profile, type, service, input ) : NULL;
+       }
+       return NULL;
 }
 
+/** Destroy a repository
+*/
+
 void mlt_repository_close( mlt_repository this )
 {
        mlt_properties_close( this->consumers );
@@ -148,3 +180,53 @@ void mlt_repository_close( mlt_repository this )
        mlt_properties_close( &this->parent );
        free( this );
 }
+
+/** Get the list of registered consumers
+*/
+
+mlt_properties mlt_repository_consumers( mlt_repository self )
+{
+       return self->consumers;
+}
+
+/** Get the list of registered filters
+*/
+
+mlt_properties mlt_repository_filters( mlt_repository self )
+{
+       return self->filters;
+}
+
+/** Get the list of registered producers
+*/
+
+mlt_properties mlt_repository_producers( mlt_repository self )
+{
+       return self->producers;
+}
+
+/** Get the list of registered transitions
+*/
+
+mlt_properties mlt_repository_transitions( mlt_repository self )
+{
+       return self->transitions;
+}
+
+/** Register the metadata for a service
+    IMPORTANT: mlt_repository will take responsibility for deallocating the metadata properties that you supply!
+*/
+void mlt_repository_register_metadata( mlt_repository self, mlt_service_type type, const char *service, mlt_properties metadata )
+{
+       mlt_properties service_properties = get_service_properties( self, type, service );
+       mlt_properties_set_data( service_properties, "metadata", metadata, 0, ( mlt_destructor )mlt_properties_close, NULL );
+}
+
+/** Get the metadata about a service
+*/
+
+mlt_properties mlt_repository_metadata( mlt_repository self, mlt_service_type type, const char *service )
+{
+       mlt_properties properties = get_service_properties( self, type, service );
+       return mlt_properties_get_data( properties, "metadata", NULL );
+}
index d8d65b13f00d60bc42f2cb5d0a643fb77ba32365..651703029a2a5dd427ca1f30d17f90cc81ed73c4 100644 (file)
@@ -34,14 +34,21 @@ typedef struct mlt_repository_s *mlt_repository;
 */
 #define MLT_REPOSITORY void mlt_register( mlt_repository repository )
 #define MLT_REGISTER( type, service, symbol  ) ( mlt_repository_register( repository, (type), (service), (symbol) ) )
+#define MLT_REGISTER_METADATA( type, service, properties  ) ( mlt_repository_register_metadata( repository, (type), (service), (properties) ) )
 
 /** Public functions.
 */
 
 extern mlt_repository mlt_repository_init( const char *directory );
 extern void mlt_repository_register( mlt_repository self, mlt_service_type service_type, const char *service, void *symbol );
-extern void *mlt_repository_create( mlt_repository self, mlt_profile profile, mlt_service_type type, const char *service, void *arg );
+extern void *mlt_repository_create( mlt_repository self, mlt_profile profile, mlt_service_type type, const char *service, void *arg ); 
 extern void mlt_repository_close( mlt_repository self );
+extern mlt_properties mlt_repository_consumers( mlt_repository self );
+extern mlt_properties mlt_repository_filters( mlt_repository self );
+extern mlt_properties mlt_repository_producers( mlt_repository self );
+extern mlt_properties mlt_repository_transitions( mlt_repository self );
+extern void mlt_repository_register_metadata( mlt_repository self, mlt_service_type type, const char *service, mlt_properties metadata );
+extern mlt_properties mlt_repository_metadata( mlt_repository self, mlt_service_type type, const char *service );
 
 #endif