* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-// TODO: destroy unreferenced producers
+// TODO: destroy unreferenced producers (they are currently destroyed
+// when the returned producer is closed).
+// TODO: try using XmlReader interface to avoid global context issues in sax.
#include "producer_westley.h"
#include <framework/mlt.h>
mlt_properties_set_position( properties, "length", length );
}
+ if ( mlt_properties_get( properties, "id" ) != NULL )
+ mlt_properties_set_data( context->producer_map, mlt_properties_get( properties, "id" ), service, 0, NULL, NULL );
+
context_push_service( context, service );
}
if ( properties == NULL )
return;
- // Instatiate the producer
- if ( mlt_properties_get( properties, "resource" ) != NULL )
- service = MLT_SERVICE( mlt_factory_producer( "fezzik", mlt_properties_get( properties, "resource" ) ) );
- if ( service == NULL && mlt_properties_get( properties, "mlt_service" ) != NULL )
+ // Instantiate the producer
+ if ( mlt_properties_get( properties, "mlt_service" ) != NULL )
+ {
+ service = MLT_SERVICE( mlt_factory_producer( "fezzik", mlt_properties_get( properties, "mlt_service" ) ) );
+ }
+ if ( service == NULL && mlt_properties_get( properties, "resource" ) != NULL )
{
- service = MLT_SERVICE( mlt_factory_producer( mlt_properties_get( properties, "mlt_service" ),
- mlt_properties_get( properties, "resource" ) ) );
+ char *root = mlt_properties_get( context->producer_map, "_root" );
+ char *resource = mlt_properties_get( properties, "resource" );
+ 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 );
}
track_service( context->destructors, service, (mlt_destructor) mlt_producer_close );
properties = mlt_service_properties( service );
// Set in and out
-//fprintf( stderr, "setting filter in %lld out %lld\n", mlt_properties_get_position( properties, "in" ), mlt_properties_get_position( properties, "out" ) );
+//fprintf( stderr, "setting filter in %d out %d\n", mlt_properties_get_position( properties, "in" ), mlt_properties_get_position( properties, "out" ) );
mlt_filter_set_in_and_out( MLT_FILTER( service ),
mlt_properties_get_position( properties, "in" ),
mlt_properties_get_position( properties, "out" ) );
context_push_service( context, tractor );
}
-//fprintf( stderr, "setting filter in %lld out %lld\n", mlt_properties_get_position( properties, "in" ), mlt_properties_get_position( properties, "out" ) );
+//fprintf( stderr, "setting filter in %d out %d\n", mlt_properties_get_position( properties, "in" ), mlt_properties_get_position( properties, "out" ) );
// If a producer alias is in the producer_map, get it
snprintf( key, 10, "%p", producer );
if ( mlt_properties_get_data( context->producer_map, key, NULL ) != NULL )
mlt_producer producer_westley_init( char *filename )
{
- static int init = 0;
xmlSAXHandler *sax = calloc( 1, sizeof( xmlSAXHandler ) );
struct deserialise_context_s *context = calloc( 1, sizeof( struct deserialise_context_s ) );
mlt_properties properties = NULL;
context->producer_map = mlt_properties_new();
context->destructors = mlt_properties_new();
+
// We need to track the number of registered filters
mlt_properties_set_int( context->destructors, "registered", 0 );
+
+ // We need the directory prefix which was used for the westley
+ mlt_properties_set( context->producer_map, "_root", "" );
+ if ( strchr( filename, '/' ) )
+ {
+ char *root = NULL;
+ mlt_properties_set( context->producer_map, "_root", filename );
+ root = mlt_properties_get( context->producer_map, "_root" );
+ *( strrchr( root, '/' ) + 1 ) = '\0';
+ }
+
sax->startElement = on_start_element;
sax->endElement = on_end_element;
sax->characters = on_characters;
+ sax->cdataBlock = on_characters;
- if ( !init )
- {
- xmlInitParser();
- //init = 1;
- }
+ // I REALLY DON'T GET THIS - HOW THE HELL CAN YOU REFERENCE A WESTLEY IN A WESTLEY???
+ xmlInitParser();
xmlSAXUserParseFile( sax, context, filename );
mlt_properties_close( context->producer_map );
//free( context );
free( sax );
- xmlCleanupParser();
+ //xmlCleanupParser();
xmlMemoryDump( );
return MLT_PRODUCER( service );
}
-