// 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>
#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
const xmlChar *publicId;
const xmlChar *systemId;
mlt_properties params;
+ mlt_profile profile;
};
typedef struct deserialise_context_s *deserialise_context;
// 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" );
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;
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 );
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 );
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 )
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
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 );
if ( strchr( mlt_properties_get( properties, "clipBegin" ), ':' ) )
// Parse clock value
in = parse_clock_value( mlt_properties_get( properties, "clipBegin" ),
- mlt_properties_get_double( mlt_producer_properties( MLT_PRODUCER( producer ) ), "fps" ) );
+ mlt_producer_get_fps( MLT_PRODUCER( producer ) ) );
else
// Parse frames value
in = mlt_properties_get_position( properties, "clipBegin" );
if ( strchr( mlt_properties_get( properties, "clipEnd" ), ':' ) )
// Parse clock value
out = parse_clock_value( mlt_properties_get( properties, "clipEnd" ),
- mlt_properties_get_double( mlt_producer_properties( MLT_PRODUCER( producer ) ), "fps" ) );
+ mlt_producer_get_fps( MLT_PRODUCER( producer ) ) );
else
// Parse frames value
out = mlt_properties_get_position( properties, "clipEnd" );
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 );
}
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 );
}
// 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 )
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 );
// 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 )
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 );
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 )
{
}
else
{
- fprintf( stderr, "Property without a service '%s'?\n", ( char * )name );
+ fprintf( stderr, "Property without a service '%s'?\n", ( const char * )name );
}
}
}
else
{
- fprintf( stderr, "Property without a service '%s'??\n", (char *)name );
+ fprintf( stderr, "Property without a service '%s'??\n", (const char *)name );
}
}
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 )
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 ) );
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;
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", "" );