Transitions reworked (always_active capabilities); remaining audio handling switched...
[melted] / src / framework / mlt_producer.c
index 6dc08e1..55f85ad 100644 (file)
@@ -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 );
                }
        }
 }