]> git.sesse.net Git - mlt/blobdiff - src/framework/mlt_producer.c
Alphas and global feeds revisted
[mlt] / src / framework / mlt_producer.c
index 6dc08e1ce54862c01608c5c874c2ee47ce962158..1b86f6c98c0f08e5b0cf4f9baff7e183747f706e 100644 (file)
@@ -194,8 +194,8 @@ mlt_producer mlt_producer_cut( mlt_producer this, int in, int out )
        // Special case - allow for a cut of the entire producer (this will squeeze all other cuts to 0)
        if ( in <= 0 )
                in = 0;
-       if ( ( out < 0 || out >= mlt_producer_get_playtime( parent ) ) && !mlt_producer_is_blank( this ) )
-               out = mlt_producer_get_playtime( parent ) - 1;
+       if ( ( out < 0 || out >= mlt_producer_get_length( parent ) ) && !mlt_producer_is_blank( this ) )
+               out = mlt_producer_get_length( parent ) - 1;
 
        mlt_properties_inc_ref( parent_props );
        mlt_properties_set_int( properties, "_cut", 1 );
@@ -208,7 +208,6 @@ mlt_producer mlt_producer_cut( mlt_producer this, int in, int out )
        mlt_properties_set_int( MLT_FILTER_PROPERTIES( filter ), "_fezzik", 1 );
        mlt_producer_attach( result, filter );
        mlt_filter_close( filter );
-       mlt_events_unblock( MLT_PRODUCER_PROPERTIES( result ), MLT_PRODUCER_PROPERTIES( result ) );
 
        return result;
 }
@@ -399,7 +398,8 @@ mlt_position mlt_producer_get_length( mlt_producer this )
 
 void mlt_producer_prepare_next( mlt_producer this )
 {
-       mlt_producer_seek( this, mlt_producer_position( this ) + mlt_producer_get_speed( this ) );
+       if ( mlt_producer_get_speed( this ) != 0 )
+               mlt_producer_seek( this, mlt_producer_position( this ) + mlt_producer_get_speed( this ) );
 }
 
 /** Get a frame.
@@ -503,6 +503,10 @@ static int producer_get_frame( mlt_service service, mlt_frame_ptr frame, int ind
                // We're done with the clone now
                mlt_properties_set_data( parent_properties, "use_clone", NULL, 0, NULL, NULL );
 
+               // This is useful and required by always_active transitions to determine in/out points of the cut
+               if ( mlt_properties_get_data( MLT_FRAME_PROPERTIES( *frame ), "_producer", NULL ) == MLT_PRODUCER_SERVICE( parent ) )
+                       mlt_properties_set_data( MLT_FRAME_PROPERTIES( *frame ), "_producer", this, 0, NULL, NULL );
+
                mlt_properties_set_double( MLT_FRAME_PROPERTIES( *frame ), "_speed", speed );
                mlt_producer_prepare_next( this );
        }
@@ -832,6 +836,8 @@ void mlt_producer_close( mlt_producer this )
                }
                else
                {
+                       int destroy = mlt_producer_is_cut( this );
+
 #if _MLT_PRODUCER_CHECKS_ == 1
                        // Show debug info
                        mlt_properties_debug( MLT_PRODUCER_PROPERTIES( this ), "Producer closing", stderr );
@@ -846,6 +852,9 @@ void mlt_producer_close( mlt_producer this )
 #endif
 
                        mlt_service_close( &this->parent );
+
+                       if ( destroy )
+                               free( this );
                }
        }
 }