// 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 );
mlt_properties_set_int( MLT_FILTER_PROPERTIES( filter ), "_fezzik", 1 );
mlt_producer_attach( result, filter );
mlt_filter_close( filter );
- filter = mlt_factory_filter( "data_show", "%obscure.properties" );
- 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;
}
mlt_producer_seek( mlt_producer_cut_parent( this ), position + mlt_producer_get_in( this ) );
// Check bounds
- if ( position < 0 )
+ if ( position < 0 || mlt_producer_get_playtime( this ) == 0 )
{
position = 0;
}
// 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 );
}
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 ) );
}
}
}
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 );
#endif
mlt_service_close( &this->parent );
+
+ if ( destroy )
+ free( this );
}
}
}