Merge branch 'review-1' of git://github.com/rayl/mlt
[melted] / src / modules / westley / producer_westley.c
index b440761..35f7739 100644 (file)
@@ -21,7 +21,6 @@
 // TODO: destroy unreferenced producers (they are currently destroyed
 //       when the returned producer is closed).
 
-#include "producer_westley.h"
 #include <framework/mlt.h>
 #include <stdlib.h>
 #include <string.h>
@@ -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", "" );