X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Fwestley%2Fproducer_westley.c;h=e32b62ba6d7a25e8d1d9df49ee017bca2e578f36;hb=8de8411c3af4b5746e9040a67e928364be9ac058;hp=1f1d6dcc609866313f979e7b660eae350ff2b2e3;hpb=1d3ab5568258841b1741b8c2fc88ce4e958e6fc6;p=melted diff --git a/src/modules/westley/producer_westley.c b/src/modules/westley/producer_westley.c index 1f1d6dc..e32b62b 100644 --- a/src/modules/westley/producer_westley.c +++ b/src/modules/westley/producer_westley.c @@ -53,6 +53,7 @@ struct deserialise_context_s xmlNodePtr stack_node[ STACK_SIZE ]; int stack_node_size; xmlDocPtr entity_doc; + int entity_is_replace; int depth; int branch[ STACK_SIZE ]; const xmlChar *publicId; @@ -140,6 +141,33 @@ static void track_service( mlt_properties properties, void *service, mlt_destruc } +// Prepend the property value with the server root +static inline void qualify_property( deserialise_context context, mlt_properties properties, char *name ) +{ + char *resource = mlt_properties_get( properties, name ); + if ( resource != NULL ) + { + // Qualify file name properties + char *root = mlt_properties_get( context->producer_map, "_root" ); + if ( root != NULL ) + { + char *full_resource = malloc( strlen( root ) + strlen( resource ) + 1 ); + if ( resource[ 0 ] != '/' ) + { + strcpy( full_resource, root ); + strcat( full_resource, resource ); + } + else + { + strcpy( full_resource, resource ); + } + mlt_properties_set( properties, name, full_resource ); + free( full_resource ); + } + } +} + + // Forward declarations static void on_end_track( deserialise_context context, const xmlChar *name ); static void on_end_entry( deserialise_context context, const xmlChar *name ); @@ -637,11 +665,15 @@ static void on_end_producer( deserialise_context context, const xmlChar *name ) if ( properties == NULL ) return; + qualify_property( context, properties, "resource" ); char *resource = mlt_properties_get( properties, "resource" ); // Let Kino-SMIL src be a synonym for resource if ( resource == NULL ) + { + qualify_property( context, properties, "src" ); resource = mlt_properties_get( properties, "src" ); - + } + // Instantiate the producer if ( mlt_properties_get( properties, "mlt_service" ) != NULL ) { @@ -656,20 +688,9 @@ static void on_end_producer( deserialise_context context, const xmlChar *name ) } if ( service == NULL && resource != NULL ) { - char *root = mlt_properties_get( context->producer_map, "_root" ); - char *full_resource = malloc( strlen( root ) + strlen( resource ) + 1 ); - if ( resource[ 0 ] != '/' ) - { - strcpy( full_resource, root ); - strcat( full_resource, resource ); - } - else - { - strcpy( full_resource, resource ); - } - service = MLT_SERVICE( mlt_factory_producer( "fezzik", full_resource ) ); - free( full_resource ); + service = MLT_SERVICE( mlt_factory_producer( "fezzik", resource ) ); } + if ( service == NULL ) return; track_service( context->destructors, service, (mlt_destructor) mlt_producer_close ); @@ -792,6 +813,11 @@ static void on_end_filter( deserialise_context context, const xmlChar *name ) mlt_properties_set_position( properties, "out", mlt_producer_get_out( MLT_PRODUCER( producer ) ) ); // Propogate the properties + qualify_property( context, properties, "resource" ); + qualify_property( context, properties, "luma" ); + qualify_property( context, properties, "luma.resource" ); + qualify_property( context, properties, "composite.luma" ); + qualify_property( context, properties, "producer.resource" ); mlt_properties_inherit( mlt_service_properties( service ), properties ); mlt_properties_close( properties ); context->producer_properties = NULL; @@ -860,6 +886,11 @@ static void on_end_transition( deserialise_context context, const xmlChar *name track_service( context->destructors, service, (mlt_destructor) mlt_transition_close ); // Propogate the properties + qualify_property( context, properties, "resource" ); + qualify_property( context, properties, "luma" ); + qualify_property( context, properties, "luma.resource" ); + qualify_property( context, properties, "composite.luma" ); + qualify_property( context, properties, "producer.resource" ); mlt_properties_inherit( mlt_service_properties( service ), properties ); mlt_properties_close( properties ); context->producer_properties = NULL; @@ -978,12 +1009,30 @@ static void on_characters( void *ctx, const xmlChar *ch, int len ) value[ len ] = 0; strncpy( value, (const char*) ch, len ); - + if ( context->stack_node_size > 0 ) xmlNodeAddContent( context->stack_node[ context->stack_node_size - 1 ], ( xmlChar* )value ); - else if ( context->property != NULL && context->producer_properties != NULL ) - mlt_properties_set( context->producer_properties, context->property, value ); + // libxml2 generates an on_characters immediately after a get_entity within + // an element value, and we ignore it because it is called again during + // actual substitution. + else if ( context->property != NULL && context->producer_properties != NULL + && context->entity_is_replace == 0 ) + { + char *s = mlt_properties_get( context->producer_properties, context->property ); + if ( s != NULL ) + { + // Append new text to existing content + char *new = calloc( strlen( s ) + len + 1, 1 ); + strcat( new, s ); + strcat( new, value ); + mlt_properties_set( context->producer_properties, context->property, new ); + free( new ); + } + else + mlt_properties_set( context->producer_properties, context->property, value ); + } + context->entity_is_replace = 0; free( value); } @@ -1038,6 +1087,7 @@ xmlEntityPtr on_get_entity( void *ctx, const xmlChar* name ) { struct _xmlParserCtxt *xmlcontext = ( struct _xmlParserCtxt* )ctx; deserialise_context context = ( deserialise_context )( xmlcontext->_private ); + xmlEntityPtr e = NULL; // Setup for entity declarations if not ready if ( xmlGetIntSubset( context->entity_doc ) == NULL ) @@ -1050,7 +1100,13 @@ xmlEntityPtr on_get_entity( void *ctx, const xmlChar* name ) // Add our parameters if not already params_to_entities( context ); - return xmlGetDocEntity( context->entity_doc, name ); + e = xmlGetDocEntity( context->entity_doc, name ); + + // Send signal to on_characters that an entity substitutin is pending + if ( e != NULL ) + context->entity_is_replace = 1; + + return e; } /** Convert a hexadecimal character to its value. @@ -1122,6 +1178,8 @@ static void parse_url( mlt_properties properties, char *url ) mlt_producer producer_westley_init( char *url ) { + if ( url == NULL ) + return NULL; xmlSAXHandler *sax = calloc( 1, sizeof( xmlSAXHandler ) ); struct deserialise_context_s *context = calloc( 1, sizeof( struct deserialise_context_s ) ); mlt_properties properties = NULL;