]> git.sesse.net Git - mlt/commitdiff
mlt_playlist.c: added an "autoclose" property for sequential processing of very large...
authorddennedy <ddennedy@d19143bc-622f-0410-bfdd-b5b2a6649095>
Wed, 4 Jun 2008 08:16:54 +0000 (08:16 +0000)
committerddennedy <ddennedy@d19143bc-622f-0410-bfdd-b5b2a6649095>
Wed, 4 Jun 2008 08:16:54 +0000 (08:16 +0000)
git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@1134 d19143bc-622f-0410-bfdd-b5b2a6649095

src/framework/mlt_playlist.c

index e2adc630c024717b028cf090762c3f465d314f41..418350687b06d46df2f14076f2b6dc94fdb00778 100644 (file)
@@ -333,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" );