Minor corrections and more affine experiments
[melted] / src / framework / mlt_producer.c
index c465181..b8bd2c6 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;
 }
@@ -504,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 );
        }
@@ -525,6 +528,8 @@ static int producer_get_frame( mlt_service service, mlt_frame_ptr frame, int ind
                        char *name = mlt_properties_get_name( p_props, i );
                        if ( !strncmp( name, "meta.", 5 ) )
                                mlt_properties_set( f_props, name, mlt_properties_get( p_props, name ) );
+                       else if ( !strncmp( name, "set.", 4 ) )
+                               mlt_properties_set( f_props, name + 4, mlt_properties_get( p_props, name ) );
                }
        }
 
@@ -833,6 +838,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 );
@@ -847,6 +854,9 @@ void mlt_producer_close( mlt_producer this )
 #endif
 
                        mlt_service_close( &this->parent );
+
+                       if ( destroy )
+                               free( this );
                }
        }
 }