X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fframework%2Fmlt_playlist.c;h=c9a9d1ba1b65a3fe62e19c8f29b62042df1f26f3;hb=37149069e20cb4042ba1eb722a35b59cb946966e;hp=366b021c733cece7418ae7f98ee55324b85af4b8;hpb=a450db7b8af164bcc71255fd74d406be98c9eb21;p=melted diff --git a/src/framework/mlt_playlist.c b/src/framework/mlt_playlist.c index 366b021..c9a9d1b 100644 --- a/src/framework/mlt_playlist.c +++ b/src/framework/mlt_playlist.c @@ -772,8 +772,13 @@ int mlt_playlist_mix( mlt_playlist this, int clip, int length, mlt_transition tr mlt_playlist track_b = mlt_playlist_init( ); mlt_properties_set_int( mlt_tractor_properties( tractor ), "mlt_mix", 1 ); mlt_events_block( mlt_playlist_properties( this ), this ); - mlt_playlist_resize_clip( this, clip, clip_a->frame_in, clip_a->frame_out - length ); - mlt_playlist_resize_clip( this, clip + 1, clip_b->frame_in + length, clip_b->frame_out ); + + clip_a->frame_out = clip_a->frame_out - length; + clip_a->frame_count = clip_a->frame_out - clip_a->frame_in + 1; + + clip_b->frame_in = clip_b->frame_in + length; + clip_b->frame_count = clip_b->frame_out - clip_b->frame_in + 1; + mlt_tractor_set_track( tractor, mlt_playlist_producer( track_a ), 0 ); mlt_tractor_set_track( tractor, mlt_playlist_producer( track_b ), 1 ); mlt_playlist_append_io( track_a, clip_a->producer, clip_a->frame_out + 1, clip_a->frame_out + length ); @@ -797,6 +802,25 @@ int mlt_playlist_mix( mlt_playlist this, int clip, int length, mlt_transition tr mlt_field_plant_transition( field, transition, 0, 1 ); mlt_transition_set_in_and_out( transition, 0, length - 1 ); } + + if ( clip_b->frame_count <= 0 ) + { + mlt_properties properties = mlt_producer_properties( clip_b->producer ); + int mlt_mix = mlt_properties_get_int( properties, "mlt_mix" ); + mlt_properties_set_int( properties, "mlt_mix", 0 ); + mlt_playlist_remove( this, clip + 2 ); + mlt_properties_set_int( properties, "mlt_mix", mlt_mix ); + } + + if ( clip_a->frame_count <= 0 ) + { + mlt_properties properties = mlt_producer_properties( clip_a->producer ); + int mlt_mix = mlt_properties_get_int( properties, "mlt_mix" ); + mlt_properties_set_int( properties, "mlt_mix", 0 ); + mlt_playlist_remove( this, clip ); + mlt_properties_set_int( properties, "mlt_mix", mlt_mix ); + } + mlt_events_unblock( mlt_playlist_properties( this ), this ); mlt_events_fire( mlt_playlist_properties( this ), "producer-changed", NULL ); mlt_playlist_close( track_a ); @@ -833,6 +857,14 @@ static int mlt_playlist_unmix( mlt_playlist this, int clip ) clip_a->mix_out = NULL; clip_a->mix_out_length = 0; } + else + { + mlt_tractor tractor = ( mlt_tractor )mix->producer; + mlt_playlist playlist = ( mlt_playlist )mlt_tractor_get_track( tractor, 0 ); + mlt_producer producer = playlist->list[ 0 ]->producer; + mlt_playlist_insert( this, producer, clip, playlist->list[0]->frame_in, playlist->list[0]->frame_out ); + clip ++; + } if ( clip_b != NULL ) { @@ -841,6 +873,13 @@ static int mlt_playlist_unmix( mlt_playlist this, int clip ) clip_b->mix_in = NULL; clip_b->mix_in_length = 0; } + else + { + mlt_tractor tractor = ( mlt_tractor )mix->producer; + mlt_playlist playlist = ( mlt_playlist )mlt_tractor_get_track( tractor, 1 ); + mlt_producer producer = playlist->list[ 0 ]->producer; + mlt_playlist_insert( this, producer, clip + 1, playlist->list[0]->frame_in, playlist->list[0]->frame_out ); + } mlt_properties_set_int( mlt_producer_properties( mix->producer ), "mlt_mix", 0 ); mlt_playlist_remove( this, clip );