X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fframework%2Fmlt_multitrack.c;h=432b90c9a103dc8e28d4c2a95f32a555e7d2eb32;hb=793ea0cb67a2766b1294249a0b77508cfb93b35d;hp=6b21a2b76798dbb80b7efe2b4d5d03356e755040;hpb=bf3264b9e340ba5c11cbf59835a8af3db94e0cc2;p=melted diff --git a/src/framework/mlt_multitrack.c b/src/framework/mlt_multitrack.c index 6b21a2b..432b90c 100644 --- a/src/framework/mlt_multitrack.c +++ b/src/framework/mlt_multitrack.c @@ -1,7 +1,9 @@ -/* - * mlt_multitrack.c -- multitrack service class - * Copyright (C) 2003-2004 Ushodaya Enterprises Limited - * Author: Charles Yates +/** + * \file mlt_multitrack.c + * \brief multitrack service class + * + * Copyright (C) 2003-2008 Ushodaya Enterprises Limited + * \author Charles Yates * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,8 +20,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include "config.h" - #include "mlt_multitrack.h" #include "mlt_playlist.h" #include "mlt_frame.h" @@ -61,7 +61,7 @@ mlt_multitrack mlt_multitrack_init( ) this = NULL; } } - + return this; } @@ -102,9 +102,6 @@ void mlt_multitrack_refresh( mlt_multitrack this ) // We need to ensure that the multitrack reports the longest track as its length mlt_position length = 0; - // We need to ensure that fps are the same on all services - double fps = 0; - // Obtain stats on all connected services for ( i = 0; i < this->count; i ++ ) { @@ -118,25 +115,10 @@ void mlt_multitrack_refresh( mlt_multitrack this ) // If we have more than 1 track, we must be in continue mode if ( this->count > 1 ) mlt_properties_set( MLT_PRODUCER_PROPERTIES( producer ), "eof", "continue" ); - + // Determine the longest length //if ( !mlt_properties_get_int( MLT_PRODUCER_PROPERTIES( producer ), "hide" ) ) length = mlt_producer_get_playtime( producer ) > length ? mlt_producer_get_playtime( producer ) : length; - - // Handle fps - if ( fps == 0 ) - { - // This is the first producer, so it controls the fps - fps = mlt_producer_get_fps( producer ); - } - else if ( fps != mlt_producer_get_fps( producer ) ) - { - // Generate a warning for now - the following attempt to fix may fail - fprintf( stderr, "Warning: fps mismatch on track %d\n", i ); - - // It should be safe to impose fps on an image producer, but not necessarily safe for video - mlt_properties_set_double( MLT_PRODUCER_PROPERTIES( producer ), "fps", fps ); - } } } @@ -145,7 +127,6 @@ void mlt_multitrack_refresh( mlt_multitrack this ) mlt_properties_set_position( properties, "length", length ); mlt_events_unblock( properties, properties ); mlt_properties_set_position( properties, "out", length - 1 ); - mlt_properties_set_double( properties, "fps", fps ); } /** Listener for producers on the playlist. @@ -191,15 +172,15 @@ int mlt_multitrack_connect( mlt_multitrack this, mlt_producer producer, int trac // Assign the track in our list here this->list[ track ]->producer = producer; - this->list[ track ]->event = mlt_events_listen( MLT_PRODUCER_PROPERTIES( producer ), this, + this->list[ track ]->event = mlt_events_listen( MLT_PRODUCER_PROPERTIES( producer ), this, "producer-changed", ( mlt_listener )mlt_multitrack_listener ); mlt_properties_inc_ref( MLT_PRODUCER_PROPERTIES( producer ) ); mlt_event_inc_ref( this->list[ track ]->event ); - + // Increment the track count if need be if ( track >= this->count ) this->count = track + 1; - + // Refresh our stats mlt_multitrack_refresh( this ); } @@ -212,7 +193,7 @@ int mlt_multitrack_connect( mlt_multitrack this, mlt_producer producer, int trac int mlt_multitrack_count( mlt_multitrack this ) { - return this->count; + return this->count; } /** Get an individual track as a producer. @@ -221,7 +202,7 @@ int mlt_multitrack_count( mlt_multitrack this ) mlt_producer mlt_multitrack_track( mlt_multitrack this, int track ) { mlt_producer producer = NULL; - + if ( this->list != NULL && track < this->count ) producer = this->list[ track ]->producer; @@ -246,9 +227,9 @@ static int add_unique( mlt_position *array, int size, mlt_position position ) /** Determine the clip point. - Special case here: a 'producer' has no concept of multiple clips - only the - playlist and multitrack producers have clip functionality. Further to that a - multitrack determines clip information from any connected tracks that happen + Special case here: a 'producer' has no concept of multiple clips - only the + playlist and multitrack producers have clip functionality. Further to that a + multitrack determines clip information from any connected tracks that happen to be playlists. Additionally, it must locate clips in the correct order, for example, consider @@ -316,7 +297,7 @@ mlt_position mlt_multitrack_clip( mlt_multitrack this, mlt_whence whence, int in case mlt_whence_relative_current: position = mlt_producer_position( MLT_MULTITRACK_PRODUCER( this ) ); - for ( i = 0; i < count - 2; i ++ ) + for ( i = 0; i < count - 2; i ++ ) if ( position >= map[ i ] && position < map[ i + 1 ] ) break; index += i; @@ -351,10 +332,10 @@ mlt_position mlt_multitrack_clip( mlt_multitrack this, mlt_whence whence, int in Producer2 - multitrack - { filters/transitions } - tractor - consumer Producer3 / - The get_frame of a tractor pulls frames from it's connected service on all tracks and - will terminate as soon as it receives a test card with a last_track property. The + The get_frame of a tractor pulls frames from it's connected service on all tracks and + will terminate as soon as it receives a test card with a last_track property. The important case here is that the mulitrack does not move to the next frame until all - tracks have been pulled. + tracks have been pulled. Reasoning: In order to seek on a network such as above, the multitrack needs to ensure that all producers are positioned on the same frame. It uses the 'last track' logic @@ -405,7 +386,7 @@ static int producer_get_frame( mlt_producer parent, mlt_frame_ptr frame, int ind else { // Generate a test frame - *frame = mlt_frame_init( ); + *frame = mlt_frame_init( MLT_PRODUCER_SERVICE( parent ) ); // Update position on the frame we're creating mlt_frame_set_position( *frame, mlt_producer_position( parent ) );