mlt_playlist.c: return error on mlt_playlist_get_clip_info if producer is null.
[melted] / src / framework / mlt_playlist.c
index b5e7fb3..0847f39 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"
@@ -134,28 +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;
-
-               // 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
@@ -335,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" );
 
@@ -499,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 )
        {