From 2ff111fe322cfdea5b879dd7912a8a375af62aff Mon Sep 17 00:00:00 2001 From: lilo_booter Date: Thu, 15 Jul 2004 21:34:15 +0000 Subject: [PATCH] Filter cleanup and fixes git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@337 d19143bc-622f-0410-bfdd-b5b2a6649095 --- src/framework/mlt_consumer.c | 1 - src/framework/mlt_factory.c | 2 +- src/framework/mlt_filter.c | 8 +++++--- src/framework/mlt_filter.h | 3 --- src/framework/mlt_service.c | 31 +++++++++++++++++++++++++++++-- src/framework/mlt_service.h | 2 ++ src/modules/westley/consumer_westley.c | 2 +- 7 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/framework/mlt_consumer.c b/src/framework/mlt_consumer.c index cfdc4ac..e6e5caf 100644 --- a/src/framework/mlt_consumer.c +++ b/src/framework/mlt_consumer.c @@ -155,7 +155,6 @@ int mlt_consumer_start( mlt_consumer this ) // Set the test card on the consumer mlt_properties_set_data( properties, "test_card_producer", producer, 0, ( mlt_destructor )mlt_producer_close, NULL ); } - } } else diff --git a/src/framework/mlt_factory.c b/src/framework/mlt_factory.c index e7aac0f..699dca3 100644 --- a/src/framework/mlt_factory.c +++ b/src/framework/mlt_factory.c @@ -47,7 +47,7 @@ int mlt_factory_init( char *prefix ) if ( mlt_prefix == NULL ) { // Allow user over rides - if ( prefix == NULL ) + if ( prefix == NULL || !strcmp( prefix, "" ) ) prefix = getenv( "MLT_REPOSITORY" ); // If no directory is specified, default to install directory diff --git a/src/framework/mlt_filter.c b/src/framework/mlt_filter.c index 6e82f5e..5aefd13 100644 --- a/src/framework/mlt_filter.c +++ b/src/framework/mlt_filter.c @@ -93,7 +93,6 @@ int mlt_filter_connect( mlt_filter this, mlt_service producer, int index ) if ( ret == 0 ) { mlt_properties properties = mlt_service_properties( &this->parent ); - this->producer = producer; mlt_properties_set_position( properties, "in", 0 ); mlt_properties_set_position( properties, "out", 0 ); mlt_properties_set_int( properties, "track", index ); @@ -162,10 +161,13 @@ static int filter_get_frame( mlt_service service, mlt_frame_ptr frame, int index int in = mlt_filter_get_in( this ); int out = mlt_filter_get_out( this ); + // Get the producer this is connected to + mlt_service producer = mlt_service_producer( &this->parent ); + // If the frame request is for this filters track, we need to process it if ( index == track ) { - int ret = mlt_service_get_frame( this->producer, frame, index ); + int ret = mlt_service_get_frame( producer, frame, index ); if ( ret == 0 ) { mlt_position position = mlt_frame_get_position( *frame ); @@ -181,7 +183,7 @@ static int filter_get_frame( mlt_service service, mlt_frame_ptr frame, int index } else { - return mlt_service_get_frame( this->producer, frame, index ); + return mlt_service_get_frame( producer, frame, index ); } } diff --git a/src/framework/mlt_filter.h b/src/framework/mlt_filter.h index 6d87933..20b119b 100644 --- a/src/framework/mlt_filter.h +++ b/src/framework/mlt_filter.h @@ -37,9 +37,6 @@ struct mlt_filter_s // protected filter method mlt_frame ( *process )( mlt_filter, mlt_frame ); - // track and in/out points - mlt_service producer; - // Protected void *child; }; diff --git a/src/framework/mlt_service.c b/src/framework/mlt_service.c index dcd0742..0509b76 100644 --- a/src/framework/mlt_service.c +++ b/src/framework/mlt_service.c @@ -144,7 +144,31 @@ static void mlt_service_disconnect( mlt_service this ) base->out = NULL; } -/** Associate this service to the its consumer. +/** Obtain the consumer this service is connected to. +*/ + +mlt_service mlt_service_consumer( mlt_service this ) +{ + // Get the service base + mlt_service_base *base = this->local; + + // Return the connected consumer + return base->out; +} + +/** Obtain the producer this service is connected to. +*/ + +mlt_service mlt_service_producer( mlt_service this ) +{ + // Get the service base + mlt_service_base *base = this->local; + + // Return the connected producer + return base->count > 0 ? base->in[ base->count - 1 ] : NULL; +} + +/** Associate this service to the consumer. */ static void mlt_service_connect( mlt_service this, mlt_service that ) @@ -201,7 +225,10 @@ mlt_properties mlt_service_properties( mlt_service self ) int mlt_service_get_frame( mlt_service this, mlt_frame_ptr frame, int index ) { - return this->get_frame( this, frame, index ); + if ( this != NULL ) + return this->get_frame( this, frame, index ); + *frame = mlt_frame_init( ); + return 0; } /** Close the service. diff --git a/src/framework/mlt_service.h b/src/framework/mlt_service.h index 98ef43a..627bbbe 100644 --- a/src/framework/mlt_service.h +++ b/src/framework/mlt_service.h @@ -46,6 +46,8 @@ extern int mlt_service_init( mlt_service self, void *child ); extern int mlt_service_connect_producer( mlt_service self, mlt_service producer, int index ); extern int mlt_service_get_frame( mlt_service self, mlt_frame_ptr frame, int index ); extern mlt_properties mlt_service_properties( mlt_service self ); +extern mlt_service mlt_service_consumer( mlt_service self ); +extern mlt_service mlt_service_producer( mlt_service self ); extern void mlt_service_close( mlt_service self ); // I'm not sure about self one - leaving it out of docs for now (only used in consumer_westley) diff --git a/src/modules/westley/consumer_westley.c b/src/modules/westley/consumer_westley.c index 0b15204..85f21c8 100644 --- a/src/modules/westley/consumer_westley.c +++ b/src/modules/westley/consumer_westley.c @@ -300,7 +300,7 @@ static void serialise_filter( serialise_context context, mlt_service service, xm id[ ID_SIZE ] = '\0'; // Recurse on connected producer - serialise_service( context, MLT_SERVICE( MLT_FILTER( service )->producer ), node ); + serialise_service( context, mlt_service_producer( service ), node ); if ( context->pass == 1 ) { -- 1.7.4.4