X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fframework%2Fmlt_playlist.c;h=0847f393768b5ee58638ebd79ff9eb312345514b;hb=1664eeeaf8535e2b65f8715fc8ebd09c941fdee8;hp=8097fc4b4d65c168b6013f01866837021a1f9b12;hpb=1e55d8082c842d4ae2d718eb2675719eeb615c0c;p=melted diff --git a/src/framework/mlt_playlist.c b/src/framework/mlt_playlist.c index 8097fc4..0847f39 100644 --- a/src/framework/mlt_playlist.c +++ b/src/framework/mlt_playlist.c @@ -3,23 +3,21 @@ * Copyright (C) 2003-2004 Ushodaya Enterprises Limited * Author: Charles Yates * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, + * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include "config.h" - #include "mlt_playlist.h" #include "mlt_tractor.h" #include "mlt_multitrack.h" @@ -127,9 +125,6 @@ static int mlt_playlist_virtual_refresh( mlt_playlist this ) { // Obtain the properties mlt_properties properties = MLT_PLAYLIST_PROPERTIES( this ); - - // Get the fps of the first producer - double fps = mlt_properties_get_double( properties, "first_fps" ); int i = 0; mlt_position frame_count = 0; @@ -137,43 +132,31 @@ static int mlt_playlist_virtual_refresh( mlt_playlist this ) { // Get the producer mlt_producer producer = this->list[ i ]->producer; - int current_length = mlt_producer_get_out( producer ) - mlt_producer_get_in( producer ) + 1; - - // If fps is 0 - if ( fps == 0 ) - { - // Inherit it from the producer - fps = mlt_producer_get_fps( producer ); - } - else if ( fps != mlt_properties_get_double( MLT_PRODUCER_PROPERTIES( producer ), "fps" ) ) - { - // Generate a warning for now - the following attempt to fix may fail - fprintf( stderr, "Warning: fps mismatch on playlist producer %d\n", this->count ); - - // 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 ); - } - - // Check if the length of the producer has changed - if ( this->list[ i ]->frame_in != mlt_producer_get_in( producer ) || - this->list[ i ]->frame_out != mlt_producer_get_out( producer ) ) + if ( producer ) { - // This clip should be removed... - if ( current_length < 1 ) - { - this->list[ i ]->frame_in = 0; - this->list[ i ]->frame_out = -1; - this->list[ i ]->frame_count = 0; - } - else + int current_length = mlt_producer_get_out( producer ) - mlt_producer_get_in( producer ) + 1; + + // Check if the length of the producer has changed + if ( this->list[ i ]->frame_in != mlt_producer_get_in( producer ) || + this->list[ i ]->frame_out != mlt_producer_get_out( producer ) ) { - this->list[ i ]->frame_in = mlt_producer_get_in( producer ); - this->list[ i ]->frame_out = mlt_producer_get_out( producer ); - this->list[ i ]->frame_count = current_length; + // This clip should be removed... + if ( current_length < 1 ) + { + this->list[ i ]->frame_in = 0; + this->list[ i ]->frame_out = -1; + this->list[ i ]->frame_count = 0; + } + else + { + this->list[ i ]->frame_in = mlt_producer_get_in( producer ); + this->list[ i ]->frame_out = mlt_producer_get_out( producer ); + this->list[ i ]->frame_count = current_length; + } + + // Update the producer_length + this->list[ i ]->producer_length = current_length; } - - // Update the producer_length - this->list[ i ]->producer_length = current_length; } // Calculate the frame_count @@ -184,8 +167,6 @@ static int mlt_playlist_virtual_refresh( mlt_playlist this ) } // Refresh all properties - mlt_properties_set_double( properties, "first_fps", fps ); - mlt_properties_set_double( properties, "fps", fps == 0 ? 25 : fps ); mlt_events_block( properties, properties ); mlt_properties_set_position( properties, "length", frame_count ); mlt_events_unblock( properties, properties ); @@ -355,6 +336,27 @@ static mlt_service mlt_playlist_virtual_seek( mlt_playlist this, int *progressiv // Get the properties mlt_properties properties = MLT_PLAYLIST_PROPERTIES( this ); + // Automatically close previous producers if requested + if ( i > 1 // keep immediate previous in case app wants to get info about what just finished + && position < 2 // tolerate off-by-one error on going to next clip + && mlt_properties_get_int( properties, "autoclose" ) ) + { + int j; + // They might have jumped ahead! + for ( j = 0; j < i - 1; j++ ) + { + mlt_service_lock( MLT_PRODUCER_SERVICE( this->list[ j ]->producer ) ); + mlt_producer p = this->list[ j ]->producer; + if ( p ) + { + this->list[ j ]->producer = NULL; + mlt_service_unlock( MLT_PRODUCER_SERVICE( p ) ); + mlt_producer_close( p ); + } + // If p is null, the lock will not have been "taken" + } + } + // Get the eof handling char *eof = mlt_properties_get( properties, "eof" ); @@ -519,7 +521,7 @@ mlt_position mlt_playlist_clip( mlt_playlist this, mlt_whence whence, int index int mlt_playlist_get_clip_info( mlt_playlist this, mlt_playlist_clip_info *info, int index ) { - int error = index < 0 || index >= this->count; + int error = index < 0 || index >= this->count || this->list[ index ]->producer == NULL; memset( info, 0, sizeof( mlt_playlist_clip_info ) ); if ( !error ) { @@ -561,7 +563,6 @@ int mlt_playlist_clear( mlt_playlist this ) mlt_producer_close( this->list[ i ]->producer ); } this->count = 0; - mlt_properties_set_double( MLT_PLAYLIST_PROPERTIES( this ), "first_fps", 0 ); return mlt_playlist_virtual_refresh( this ); } @@ -1292,7 +1293,7 @@ int mlt_playlist_insert_at( mlt_playlist this, mlt_position position, mlt_produc if ( clip < this->count && mlt_playlist_is_blank( this, clip ) ) { // Split and move to new clip if need be - if ( position != info.start && mlt_playlist_split( this, clip, position - info.start ) == 0 ) + if ( position != info.start && mlt_playlist_split( this, clip, position - info.start - 1 ) == 0 ) mlt_playlist_get_clip_info( this, &info, ++ clip ); // Split again if need be @@ -1322,8 +1323,12 @@ int mlt_playlist_insert_at( mlt_playlist this, mlt_position position, mlt_produc } else { - if ( mode == 1 ) - mlt_playlist_blank( this, position - mlt_properties_get_int( properties, "length" ) ); + if ( mode == 1 ) { + if ( position == info.start ) + mlt_playlist_remove( this, clip ); + else + mlt_playlist_blank( this, position - mlt_properties_get_int( properties, "length" ) - 1 ); + } mlt_playlist_append( this, producer ); ret = this->count - 1; } @@ -1430,8 +1435,8 @@ static int producer_get_frame( mlt_producer producer, mlt_frame_ptr frame, int i // Check that we have a producer if ( producer == NULL ) { - *frame = mlt_frame_init( ); - return 0; + *frame = NULL; + return -1; } // Get this mlt_playlist @@ -1446,7 +1451,7 @@ static int producer_get_frame( mlt_producer producer, mlt_frame_ptr frame, int i // Check that we have a producer if ( real == NULL ) { - *frame = mlt_frame_init( ); + *frame = mlt_frame_init( MLT_PRODUCER_SERVICE( producer ) ); return 0; } @@ -1458,7 +1463,7 @@ static int producer_get_frame( mlt_producer producer, mlt_frame_ptr frame, int i else { mlt_producer parent = mlt_producer_cut_parent( ( mlt_producer )real ); - *frame = mlt_frame_init( ); + *frame = mlt_frame_init( MLT_PRODUCER_SERVICE( parent ) ); mlt_properties_set_int( MLT_FRAME_PROPERTIES( *frame ), "fx_cut", 1 ); mlt_frame_push_service( *frame, NULL ); mlt_frame_push_audio( *frame, NULL );