X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Fwestley%2Fproducer_westley.c;h=35f77393e873cbc020d5332a93d924695e6c81f2;hb=d5d878221c3123ef1d3a335dbc2b1878b3fdb983;hp=b440761693fb0323eacad8577139bc21a671f0c0;hpb=a07c3da76259d6ba479d800ffecc5617a9ad158f;p=melted diff --git a/src/modules/westley/producer_westley.c b/src/modules/westley/producer_westley.c index b440761..35f7739 100644 --- a/src/modules/westley/producer_westley.c +++ b/src/modules/westley/producer_westley.c @@ -21,7 +21,6 @@ // TODO: destroy unreferenced producers (they are currently destroyed // when the returned producer is closed). -#include "producer_westley.h" #include #include #include @@ -36,8 +35,8 @@ #define STACK_SIZE 1000 #define BRANCH_SIG_LEN 4000 -#define _x (xmlChar*) -#define _s (char*) +#define _x (const xmlChar*) +#define _s (const char*) #undef DEBUG #ifdef DEBUG @@ -82,6 +81,7 @@ struct deserialise_context_s const xmlChar *publicId; const xmlChar *systemId; mlt_properties params; + mlt_profile profile; }; typedef struct deserialise_context_s *deserialise_context; @@ -170,10 +170,10 @@ static void track_service( mlt_properties properties, void *service, mlt_destruc // Prepend the property value with the document root -static inline void qualify_property( deserialise_context context, mlt_properties properties, char *name ) +static inline void qualify_property( deserialise_context context, mlt_properties properties, const char *name ) { char *resource = mlt_properties_get( properties, name ); - if ( resource != NULL ) + if ( resource != NULL && resource[0] ) { // Qualify file name properties char *root = mlt_properties_get( context->producer_map, "root" ); @@ -207,7 +207,7 @@ static int add_producer( deserialise_context context, mlt_service service, mlt_p int result = 0; // Get the parent producer - enum service_type type; + enum service_type type = mlt_invalid_type; mlt_service container = context_pop_service( context, &type ); int contained = 0; @@ -297,7 +297,7 @@ static void on_start_tractor( deserialise_context context, const xmlChar *name, track_service( context->destructors, service, (mlt_destructor) mlt_tractor_close ); for ( ; atts != NULL && *atts != NULL; atts += 2 ) - mlt_properties_set( MLT_SERVICE_PROPERTIES( service ), (char*) atts[0], atts[1] == NULL ? "" : (char*) atts[1] ); + mlt_properties_set( MLT_SERVICE_PROPERTIES( service ), (const char*) atts[0], atts[1] == NULL ? "" : (const char*) atts[1] ); mlt_properties_set_int( MLT_TRACTOR_PROPERTIES( tractor ), "global_feed", 1 ); @@ -353,7 +353,7 @@ static void on_start_multitrack( deserialise_context context, const xmlChar *nam mlt_service service = MLT_SERVICE( mlt_tractor_multitrack( MLT_TRACTOR( parent ) ) ); mlt_properties properties = MLT_SERVICE_PROPERTIES( service ); for ( ; atts != NULL && *atts != NULL; atts += 2 ) - mlt_properties_set( properties, (char*) atts[0], atts[1] == NULL ? "" : (char*) atts[1] ); + mlt_properties_set( properties, (const char*) atts[0], atts[1] == NULL ? "" : (const char*) atts[1] ); if ( mlt_properties_get( properties, "id" ) != NULL ) mlt_properties_set_data( context->producer_map, mlt_properties_get( properties,"id" ), service, 0, NULL, NULL ); @@ -387,11 +387,11 @@ static void on_start_playlist( deserialise_context context, const xmlChar *name, for ( ; atts != NULL && *atts != NULL; atts += 2 ) { - mlt_properties_set( properties, (char*) atts[0], atts[1] == NULL ? "" : (char*) atts[1] ); + mlt_properties_set( properties, (const char*) atts[0], atts[1] == NULL ? "" : (const char*) atts[1] ); // Out will be overwritten later as we append, so we need to save it if ( xmlStrcmp( atts[ 0 ], _x("out") ) == 0 ) - mlt_properties_set( properties, "_westley.out", ( char* )atts[ 1 ] ); + mlt_properties_set( properties, "_westley.out", ( const char* )atts[ 1 ] ); } if ( mlt_properties_get( properties, "id" ) != NULL ) @@ -433,7 +433,7 @@ static void on_start_producer( deserialise_context context, const xmlChar *name, context_push_service( context, service, mlt_dummy_producer_type ); for ( ; atts != NULL && *atts != NULL; atts += 2 ) - mlt_properties_set( properties, (char*) atts[0], atts[1] == NULL ? "" : (char*) atts[1] ); + mlt_properties_set( properties, (const char*) atts[0], atts[1] == NULL ? "" : (const char*) atts[1] ); } // Parse a SMIL clock value (as produced by Kino 0.9.1) and return position in frames @@ -504,18 +504,18 @@ static void on_end_producer( deserialise_context context, const xmlChar *name ) strcat( temp, ":" ); strncat( temp, resource, 1023 - strlen( temp ) ); } - producer = MLT_SERVICE( mlt_factory_producer( "fezzik", temp ) ); + producer = MLT_SERVICE( mlt_factory_producer( context->profile, "fezzik", temp ) ); } // Just in case the plugin requested doesn't exist... if ( producer == NULL && resource != NULL ) - producer = MLT_SERVICE( mlt_factory_producer( "fezzik", resource ) ); + producer = MLT_SERVICE( mlt_factory_producer( context->profile, "fezzik", resource ) ); if ( producer == NULL ) - producer = MLT_SERVICE( mlt_factory_producer( "fezzik", "+INVALID.txt" ) ); + producer = MLT_SERVICE( mlt_factory_producer( context->profile, "fezzik", "+INVALID.txt" ) ); if ( producer == NULL ) - producer = MLT_SERVICE( mlt_factory_producer( "fezzik", "colour:red" ) ); + producer = MLT_SERVICE( mlt_factory_producer( context->profile, "fezzik", "colour:red" ) ); // Track this producer track_service( context->destructors, producer, (mlt_destructor) mlt_producer_close ); @@ -657,12 +657,12 @@ static void on_start_entry( deserialise_context context, const xmlChar *name, co for ( ; atts != NULL && *atts != NULL; atts += 2 ) { - mlt_properties_set( temp, (char*) atts[0], atts[1] == NULL ? "" : (char*) atts[1] ); + mlt_properties_set( temp, (const char*) atts[0], atts[1] == NULL ? "" : (const char*) atts[1] ); // Look for the producer attribute if ( xmlStrcmp( atts[ 0 ], _x("producer") ) == 0 ) { - mlt_producer producer = mlt_properties_get_data( context->producer_map, (char*) atts[1], NULL ); + mlt_producer producer = mlt_properties_get_data( context->producer_map, (const char*) atts[1], NULL ); if ( producer != NULL ) mlt_properties_set_data( temp, "producer", producer, 0, NULL, NULL ); } @@ -740,12 +740,12 @@ static void on_start_track( deserialise_context context, const xmlChar *name, co for ( ; atts != NULL && *atts != NULL; atts += 2 ) { - mlt_properties_set( MLT_SERVICE_PROPERTIES( service ), (char*) atts[0], atts[1] == NULL ? "" : (char*) atts[1] ); + mlt_properties_set( MLT_SERVICE_PROPERTIES( service ), (const char*) atts[0], atts[1] == NULL ? "" : (const char*) atts[1] ); // Look for the producer attribute if ( xmlStrcmp( atts[ 0 ], _x("producer") ) == 0 ) { - mlt_producer producer = mlt_properties_get_data( context->producer_map, (char*) atts[1], NULL ); + mlt_producer producer = mlt_properties_get_data( context->producer_map, (const char*) atts[1], NULL ); if ( producer != NULL ) mlt_properties_set_data( MLT_SERVICE_PROPERTIES( service ), "producer", producer, 0, NULL, NULL ); } @@ -830,7 +830,7 @@ static void on_start_filter( deserialise_context context, const xmlChar *name, c // Set the properties for ( ; atts != NULL && *atts != NULL; atts += 2 ) - mlt_properties_set( properties, (char*) atts[0], (char*) atts[1] ); + mlt_properties_set( properties, (const char*) atts[0], (const char*) atts[1] ); } static void on_end_filter( deserialise_context context, const xmlChar *name ) @@ -844,7 +844,7 @@ static void on_end_filter( deserialise_context context, const xmlChar *name ) if ( service != NULL && type == mlt_dummy_filter_type ) { - mlt_service filter = MLT_SERVICE( mlt_factory_filter( mlt_properties_get( properties, "mlt_service" ), NULL ) ); + mlt_service filter = MLT_SERVICE( mlt_factory_filter( context->profile, mlt_properties_get( properties, "mlt_service" ), NULL ) ); mlt_properties filter_props = MLT_SERVICE_PROPERTIES( filter ); track_service( context->destructors, filter, (mlt_destructor) mlt_filter_close ); @@ -905,7 +905,7 @@ static void on_start_transition( deserialise_context context, const xmlChar *nam // Set the properties for ( ; atts != NULL && *atts != NULL; atts += 2 ) - mlt_properties_set( properties, (char*) atts[0], (char*) atts[1] ); + mlt_properties_set( properties, (const char*) atts[0], (const char*) atts[1] ); } static void on_end_transition( deserialise_context context, const xmlChar *name ) @@ -919,7 +919,8 @@ static void on_end_transition( deserialise_context context, const xmlChar *name if ( service != NULL && type == mlt_dummy_transition_type ) { - mlt_service effect = MLT_SERVICE( mlt_factory_transition(mlt_properties_get(properties,"mlt_service"), NULL ) ); + char *id = mlt_properties_get( properties, "mlt_service" ); + mlt_service effect = MLT_SERVICE( mlt_factory_transition( context->profile, id, NULL ) ); mlt_properties effect_props = MLT_SERVICE_PROPERTIES( effect ); track_service( context->destructors, effect, (mlt_destructor) mlt_transition_close ); @@ -977,7 +978,7 @@ static void on_start_property( deserialise_context context, const xmlChar *name, enum service_type type; mlt_service service = context_pop_service( context, &type ); mlt_properties properties = MLT_SERVICE_PROPERTIES( service ); - char *value = NULL; + const char *value = NULL; if ( service != NULL ) { @@ -1000,7 +1001,7 @@ static void on_start_property( deserialise_context context, const xmlChar *name, } else { - fprintf( stderr, "Property without a service '%s'?\n", ( char * )name ); + fprintf( stderr, "Property without a service '%s'?\n", ( const char * )name ); } } @@ -1037,7 +1038,7 @@ static void on_end_property( deserialise_context context, const xmlChar *name ) } else { - fprintf( stderr, "Property without a service '%s'??\n", (char *)name ); + fprintf( stderr, "Property without a service '%s'??\n", (const char *)name ); } } @@ -1094,7 +1095,7 @@ static void on_start_element( void *ctx, const xmlChar *name, const xmlChar **at on_start_property( context, name, atts ); else if ( xmlStrcmp( name, _x("westley") ) == 0 ) for ( ; atts != NULL && *atts != NULL; atts += 2 ) - mlt_properties_set( context->producer_map, ( char * )atts[ 0 ], ( char * )atts[ 1 ] ); + mlt_properties_set( context->producer_map, ( const char * )atts[ 0 ], ( const char * )atts[ 1 ] ); } static void on_end_element( void *ctx, const xmlChar *name ) @@ -1332,7 +1333,7 @@ static int file_exists( char *file ) return exists; } -mlt_producer producer_westley_init( int info, char *data ) +mlt_producer producer_westley_init( mlt_profile profile, mlt_service_type servtype, const char *id, char *data ) { xmlSAXHandler *sax = calloc( 1, sizeof( xmlSAXHandler ) ); struct deserialise_context_s *context = calloc( 1, sizeof( struct deserialise_context_s ) ); @@ -1341,6 +1342,7 @@ mlt_producer producer_westley_init( int info, char *data ) struct _xmlParserCtxt *xmlcontext; int well_formed = 0; char *filename = NULL; + int info = strcmp( id, "westley-xml" ) ? 0 : 1; if ( data == NULL || !strcmp( data, "" ) || ( info == 0 && !file_exists( data ) ) ) return NULL; @@ -1352,6 +1354,7 @@ mlt_producer producer_westley_init( int info, char *data ) context->producer_map = mlt_properties_new(); context->destructors = mlt_properties_new(); context->params = mlt_properties_new(); + context->profile = profile; // Decode URL and parse parameters mlt_properties_set( context->producer_map, "root", "" );