+/** Split a clip on the playlist at the given position.
+*/
+
+int mlt_playlist_split( mlt_playlist this, int clip, mlt_position position )
+{
+ int error = clip < 0 || clip >= this->count;
+ if ( error == 0 )
+ {
+ playlist_entry *entry = this->list[ clip ];
+ if ( position > 0 && position < entry->frame_count )
+ {
+ int in = entry->frame_in;
+ int out = entry->frame_out;
+ mlt_playlist_resize_clip( this, clip, in, in + position );
+ mlt_playlist_insert( this, entry->producer, clip + 1, in + position + 1, out );
+ }
+ else
+ {
+ error = 1;
+ }
+ }
+ return error;
+}
+
+/** Join 1 or more consecutive clips.
+*/
+
+int mlt_playlist_join( mlt_playlist this, int clip, int count, int merge )
+{
+ int error = clip < 0 || ( clip + 1 ) >= this->count;
+ if ( error == 0 )
+ {
+ int i = clip;
+ mlt_playlist new_clip = mlt_playlist_init( );
+ if ( clip + count >= this->count )
+ count = this->count - clip;
+ for ( i = 0; i <= count; i ++ )
+ {
+ playlist_entry *entry = this->list[ clip ];
+ char *resource = mlt_properties_get( mlt_producer_properties( entry->producer ), "resource" );
+ if ( merge && resource != NULL && !strcmp( resource, "<playlist>" ) )
+ {
+ mlt_playlist old_clip = ( mlt_playlist )entry->producer;
+ while( old_clip->count )
+ {
+ entry = old_clip->list[ 0 ];
+ mlt_playlist_append_io( new_clip, entry->producer, entry->frame_in, entry->frame_out );
+ mlt_playlist_remove( old_clip, 0 );
+ }
+ }
+ else
+ {
+ mlt_playlist_append_io( new_clip, entry->producer, entry->frame_in, entry->frame_out );
+ }
+ mlt_playlist_remove( this, clip );
+ }
+ mlt_playlist_insert( this, mlt_playlist_producer( new_clip ), clip, 0, -1 );
+ mlt_playlist_close( new_clip );
+ }
+ return error;
+}
+