From c11c102d64ee3b368c62ce838b6ae03d183b3aa9 Mon Sep 17 00:00:00 2001 From: lilo_booter Date: Mon, 26 Jul 2004 15:44:27 +0000 Subject: [PATCH] Allow attached filters when used in playlists git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@341 d19143bc-622f-0410-bfdd-b5b2a6649095 --- src/framework/mlt_playlist.c | 25 +++++++++++++++++++++---- src/framework/mlt_playlist.h | 1 + 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/framework/mlt_playlist.c b/src/framework/mlt_playlist.c index acf0fd2..2b14358 100644 --- a/src/framework/mlt_playlist.c +++ b/src/framework/mlt_playlist.c @@ -193,10 +193,11 @@ static int mlt_playlist_virtual_append( mlt_playlist this, mlt_producer producer /** Seek in the virtual playlist. */ -static mlt_producer mlt_playlist_virtual_seek( mlt_playlist this ) +static mlt_service mlt_playlist_virtual_seek( mlt_playlist this ) { // Default producer to blank mlt_producer producer = NULL; + mlt_service service = NULL; // Map playlist position to real producer in virtual playlist mlt_position position = mlt_producer_frame( &this->parent ); @@ -264,7 +265,14 @@ static mlt_producer mlt_playlist_virtual_seek( mlt_playlist this ) producer = &this->blank; } - return producer; + if ( producer != NULL ) + { + service = mlt_producer_service( producer ); + while ( mlt_service_consumer( service ) != NULL ) + service = mlt_service_consumer( service ); + } + + return service; } /** Invoked when a producer indicates that it has prematurely reached its end. @@ -409,6 +417,15 @@ int mlt_playlist_get_clip_info( mlt_playlist this, mlt_playlist_clip_info *info, info->length = mlt_producer_get_length( producer ); info->fps = mlt_producer_get_fps( producer ); } + + // Determine the consuming filter service + if ( info->producer != NULL ) + { + info->service = mlt_producer_service( info->producer ); + while ( mlt_service_consumer( info->service ) != NULL ) + info->service = mlt_service_consumer( info->service ); + } + return error; } @@ -612,10 +629,10 @@ static int producer_get_frame( mlt_producer producer, mlt_frame_ptr frame, int i mlt_playlist this = producer->child; // Get the real producer - mlt_producer real = mlt_playlist_virtual_seek( this ); + mlt_service real = mlt_playlist_virtual_seek( this ); // Get the frame - mlt_service_get_frame( mlt_producer_service( real ), frame, index ); + mlt_service_get_frame( real, frame, index ); // Check if we're at the end of the clip mlt_properties properties = mlt_frame_properties( *frame ); diff --git a/src/framework/mlt_playlist.h b/src/framework/mlt_playlist.h index b370dc3..913b608 100644 --- a/src/framework/mlt_playlist.h +++ b/src/framework/mlt_playlist.h @@ -30,6 +30,7 @@ typedef struct { int clip; mlt_producer producer; + mlt_service service; mlt_position start; char *resource; mlt_position frame_in; -- 1.7.4.4