mlt_playlist.c: added an "autoclose" property for sequential processing of very large...
[melted] / src / framework / mlt_playlist.c
index 240c523..4183506 100644 (file)
@@ -18,8 +18,6 @@
  * 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"
@@ -335,6 +333,36 @@ 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 )
+                       {
+                               mlt_properties p_properties = MLT_PRODUCER_PROPERTIES( p );
+                               // Prevent closing previously autoclosed to maintain integrity of references
+                               if ( ! mlt_properties_get_int( p_properties, "_autoclosed" ) )
+                               {
+                                       mlt_properties_set_int( p_properties, "_autoclosed", 1 );
+                                       mlt_service_unlock( MLT_PRODUCER_SERVICE( p ) );
+                                       mlt_producer_close( p );
+                                       this->list[ j ]->producer = NULL;
+                               }
+                               else
+                               {
+                                       mlt_service_unlock( MLT_PRODUCER_SERVICE( p ) );
+                               }
+                       }
+               }
+       }
+
        // Get the eof handling
        char *eof = mlt_properties_get( properties, "eof" );
 
@@ -1271,7 +1299,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
@@ -1301,8 +1329,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;
                }
@@ -1409,8 +1441,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
@@ -1425,7 +1457,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;
        }
 
@@ -1437,7 +1469,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 );