* 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"
{
// Get the producer
mlt_producer producer = this->list[ i ]->producer;
- 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 ) )
+ 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
// 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" );
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 )
{
int mlt_playlist_blank( mlt_playlist this, mlt_position length )
{
// Append to the virtual list
- return mlt_playlist_virtual_append( this, &this->blank, 0, length );
+ if (length >= 0)
+ return mlt_playlist_virtual_append( this, &this->blank, 0, length );
+ else
+ return 1;
}
/** Insert a producer into the playlist.
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
}
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;
}
// Check that we have a producer
if ( producer == NULL )
{
- *frame = mlt_frame_init( );
- return 0;
+ *frame = NULL;
+ return -1;
}
// Get this mlt_playlist
// Check that we have a producer
if ( real == NULL )
{
- *frame = mlt_frame_init( );
+ *frame = mlt_frame_init( MLT_PRODUCER_SERVICE( producer ) );
return 0;
}
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 );