From 2a2669b620e293e8963205c86606618789951eed Mon Sep 17 00:00:00 2001 From: lilo_booter Date: Sun, 13 Mar 2005 10:04:51 +0000 Subject: [PATCH] Threading considerations and DVCP WIPE introduced git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@685 d19143bc-622f-0410-bfdd-b5b2a6649095 --- docs/dvcp.txt | 3 ++ src/miracle/miracle_local.c | 1 + src/miracle/miracle_unit.c | 75 +++++++++++++++++++++-------- src/miracle/miracle_unit.h | 2 +- src/miracle/miracle_unit_commands.c | 14 ++++++ src/miracle/miracle_unit_commands.h | 1 + src/modules/avformat/factory.c | 1 + src/valerie/valerie.c | 8 +++ src/valerie/valerie.h | 1 + 9 files changed, 86 insertions(+), 20 deletions(-) diff --git a/docs/dvcp.txt b/docs/dvcp.txt index d565c7f7..acbded59 100644 --- a/docs/dvcp.txt +++ b/docs/dvcp.txt @@ -233,6 +233,9 @@ REMOVE {unit} [ [+|-]clip ] CLEAN {unit} Removes all by the playing clip. +WIPE {unit} + Removes all clips before the playing clip. + MOVE {unit} [+|-]clip [ [+|-]clip ] Move a clip in the playlist to position specified or position relative to the currently playing clip. diff --git a/src/miracle/miracle_local.c b/src/miracle/miracle_local.c index c0917f37..143f101d 100644 --- a/src/miracle/miracle_local.c +++ b/src/miracle/miracle_local.c @@ -182,6 +182,7 @@ static command_t vocabulary[] = {"INSERT", miracle_insert, 1, ATYPE_STRING, "Insert a clip at the given clip index."}, {"REMOVE", miracle_remove, 1, ATYPE_NONE, "Remove a clip at the given clip index."}, {"CLEAN", miracle_clean, 1, ATYPE_NONE, "Clean a unit by removing all but the currently playing clip."}, + {"WIPE", miracle_wipe, 1, ATYPE_NONE, "Clean a unit by removing everything before the currently playing clip."}, {"CLEAR", miracle_clear, 1, ATYPE_NONE, "Clear a unit by removing all clips."}, {"MOVE", miracle_move, 1, ATYPE_INT, "Move a clip to another clip index."}, {"APND", miracle_append, 1, ATYPE_STRING, "Append a clip specified in absolute filename argument."}, diff --git a/src/miracle/miracle_unit.c b/src/miracle/miracle_unit.c index 370eb11e..a6cb7845 100644 --- a/src/miracle/miracle_unit.c +++ b/src/miracle/miracle_unit.c @@ -69,7 +69,6 @@ miracle_unit miracle_unit_init( int index, char *constructor ) mlt_playlist playlist = mlt_playlist_init( ); this = calloc( sizeof( miracle_unit_t ), 1 ); this->properties = mlt_properties_new( ); - this->old_playlist = mlt_playlist_init( ); mlt_properties_init( this->properties, this ); mlt_properties_set_int( this->properties, "unit", index ); mlt_properties_set_int( this->properties, "generation", 0 ); @@ -84,19 +83,6 @@ miracle_unit miracle_unit_init( int index, char *constructor ) return this; } -static void copy_playlist( mlt_playlist dest, mlt_playlist src ) -{ - int i; - - for ( i = 0; i < mlt_playlist_count( src ); i ++ ) - { - mlt_playlist_clip_info info; - mlt_playlist_get_clip_info( src, &info, i ); - if ( info.producer != NULL ) - mlt_playlist_append_io( dest, info.producer, info.frame_in, info.frame_out ); - } -} - static char *strip_root( miracle_unit unit, char *file ) { mlt_properties properties = unit->properties; @@ -182,10 +168,10 @@ static void clear_unit( miracle_unit unit ) mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL ); mlt_producer producer = MLT_PLAYLIST_PRODUCER( playlist ); - mlt_playlist_clear( unit->old_playlist ); - copy_playlist( unit->old_playlist, playlist ); + mlt_service_lock( MLT_PLAYLIST_SERVICE( playlist ) ); mlt_playlist_clear( playlist ); mlt_producer_seek( producer, 0 ); + mlt_service_unlock( MLT_PLAYLIST_SERVICE( playlist ) ); update_generation( unit ); } @@ -209,15 +195,38 @@ static void clean_unit( miracle_unit unit ) mlt_properties_inc_ref( MLT_PRODUCER_PROPERTIES( info.producer ) ); position -= info.start; clear_unit( unit ); + mlt_service_lock( MLT_PLAYLIST_SERVICE( playlist ) ); mlt_playlist_append_io( playlist, info.producer, info.frame_in, info.frame_out ); mlt_producer_seek( producer, position ); mlt_producer_set_speed( producer, speed ); + mlt_service_unlock( MLT_PLAYLIST_SERVICE( playlist ) ); mlt_producer_close( info.producer ); } update_generation( unit ); } +/** Remove everything up to the current clip from the unit. +*/ + +static void wipe_unit( miracle_unit unit ) +{ + mlt_properties properties = unit->properties; + mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL ); + mlt_playlist_clip_info info; + int current = mlt_playlist_current_clip( playlist ); + mlt_playlist_get_clip_info( playlist, &info, current ); + + if ( info.producer != NULL && info.start > 0 ) + { + mlt_service_lock( MLT_PLAYLIST_SERVICE( playlist ) ); + mlt_playlist_remove_region( playlist, 0, info.start - 1 ); + mlt_service_unlock( MLT_PLAYLIST_SERVICE( playlist ) ); + } + + update_generation( unit ); +} + /** Generate a report on all loaded clips. */ @@ -269,8 +278,10 @@ valerie_error_code miracle_unit_load( miracle_unit unit, char *clip, int32_t in, mlt_properties properties = unit->properties; mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL ); int original = mlt_producer_get_playtime( MLT_PLAYLIST_PRODUCER( playlist ) ); + mlt_service_lock( MLT_PLAYLIST_SERVICE( playlist ) ); mlt_playlist_append_io( playlist, instance, in, out ); mlt_playlist_remove_region( playlist, 0, original ); + mlt_service_unlock( MLT_PLAYLIST_SERVICE( playlist ) ); miracle_log( LOG_DEBUG, "loaded clip %s", clip ); update_generation( unit ); miracle_unit_status_communicate( unit ); @@ -290,7 +301,9 @@ valerie_error_code miracle_unit_insert( miracle_unit unit, char *clip, int index mlt_properties properties = unit->properties; mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL ); fprintf( stderr, "inserting clip %s before %d\n", clip, index ); + mlt_service_lock( MLT_PLAYLIST_SERVICE( playlist ) ); mlt_playlist_insert( playlist, instance, index, in, out ); + mlt_service_unlock( MLT_PLAYLIST_SERVICE( playlist ) ); miracle_log( LOG_DEBUG, "inserted clip %s at %d", clip, index ); update_generation( unit ); miracle_unit_status_communicate( unit ); @@ -305,7 +318,9 @@ valerie_error_code miracle_unit_remove( miracle_unit unit, int index ) { mlt_properties properties = unit->properties; mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL ); + mlt_service_lock( MLT_PLAYLIST_SERVICE( playlist ) ); mlt_playlist_remove( playlist, index ); + mlt_service_unlock( MLT_PLAYLIST_SERVICE( playlist ) ); miracle_log( LOG_DEBUG, "removed clip at %d", index ); update_generation( unit ); miracle_unit_status_communicate( unit ); @@ -320,6 +335,14 @@ valerie_error_code miracle_unit_clean( miracle_unit unit ) return valerie_ok; } +valerie_error_code miracle_unit_wipe( miracle_unit unit ) +{ + wipe_unit( unit ); + miracle_log( LOG_DEBUG, "Wiped playlist" ); + miracle_unit_status_communicate( unit ); + return valerie_ok; +} + valerie_error_code miracle_unit_clear( miracle_unit unit ) { mlt_consumer consumer = mlt_properties_get_data( unit->properties, "consumer", NULL ); @@ -334,7 +357,9 @@ valerie_error_code miracle_unit_move( miracle_unit unit, int src, int dest ) { mlt_properties properties = unit->properties; mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL ); + mlt_service_lock( MLT_PLAYLIST_SERVICE( playlist ) ); mlt_playlist_move( playlist, src, dest ); + mlt_service_unlock( MLT_PLAYLIST_SERVICE( playlist ) ); miracle_log( LOG_DEBUG, "moved clip %d to %d", src, dest ); update_generation( unit ); miracle_unit_status_communicate( unit ); @@ -358,8 +383,10 @@ valerie_error_code miracle_unit_append( miracle_unit unit, char *clip, int32_t i { mlt_properties properties = unit->properties; mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL ); + mlt_service_lock( MLT_PLAYLIST_SERVICE( playlist ) ); mlt_playlist_append_io( playlist, instance, in, out ); miracle_log( LOG_DEBUG, "appended clip %s", clip ); + mlt_service_unlock( MLT_PLAYLIST_SERVICE( playlist ) ); update_generation( unit ); miracle_unit_status_communicate( unit ); mlt_producer_close( instance ); @@ -379,7 +406,9 @@ valerie_error_code miracle_unit_append_service( miracle_unit unit, mlt_service s { mlt_properties properties = unit->properties; mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL ); + mlt_service_lock( MLT_PLAYLIST_SERVICE( playlist ) ); mlt_playlist_append( playlist, ( mlt_producer )service ); + mlt_service_unlock( MLT_PLAYLIST_SERVICE( playlist ) ); miracle_log( LOG_DEBUG, "appended clip" ); update_generation( unit ); miracle_unit_status_communicate( unit ); @@ -456,6 +485,8 @@ int miracle_unit_transfer( miracle_unit dest_unit, miracle_unit src_unit ) clear_unit( src_unit ); + mlt_service_lock( MLT_PLAYLIST_SERVICE( dest_playlist ) ); + for ( i = 0; i < mlt_playlist_count( tmp_playlist ); i ++ ) { mlt_playlist_clip_info info; @@ -464,7 +495,10 @@ int miracle_unit_transfer( miracle_unit dest_unit, miracle_unit src_unit ) mlt_playlist_append_io( dest_playlist, info.producer, info.frame_in, info.frame_out ); } + mlt_service_unlock( MLT_PLAYLIST_SERVICE( dest_playlist ) ); + update_generation( dest_unit ); + miracle_unit_status_communicate( dest_unit ); mlt_playlist_close( tmp_playlist ); @@ -509,12 +543,12 @@ int miracle_unit_get_status( miracle_unit unit, valerie_status status ) status->fps = mlt_producer_get_fps( producer ); status->in = info.frame_in; status->out = info.frame_out; - status->position = mlt_producer_position( clip ); + status->position = mlt_producer_frame( clip ); status->length = mlt_producer_get_length( clip ); strncpy( status->tail_clip, title, sizeof( status->tail_clip ) ); status->tail_in = info.frame_in; status->tail_out = info.frame_out; - status->tail_position = mlt_producer_position( clip ); + status->tail_position = mlt_producer_frame( clip ); status->tail_length = mlt_producer_get_length( clip ); status->clip_index = mlt_playlist_current_clip( playlist ); status->seek_flag = 1; @@ -604,7 +638,9 @@ int miracle_unit_set_clip_in( miracle_unit unit, int index, int32_t position ) if ( error == 0 ) { miracle_unit_play( unit, 0 ); + mlt_service_lock( MLT_PLAYLIST_SERVICE( playlist ) ); error = mlt_playlist_resize_clip( playlist, index, position, info.frame_out ); + mlt_service_unlock( MLT_PLAYLIST_SERVICE( playlist ) ); update_generation( unit ); miracle_unit_change_position( unit, index, 0 ); } @@ -625,7 +661,9 @@ int miracle_unit_set_clip_out( miracle_unit unit, int index, int32_t position ) if ( error == 0 ) { miracle_unit_play( unit, 0 ); + mlt_service_lock( MLT_PLAYLIST_SERVICE( playlist ) ); error = mlt_playlist_resize_clip( playlist, index, info.frame_in, position ); + mlt_service_unlock( MLT_PLAYLIST_SERVICE( playlist ) ); update_generation( unit ); miracle_unit_status_communicate( unit ); miracle_unit_change_position( unit, index, -1 ); @@ -723,7 +761,6 @@ void miracle_unit_close( miracle_unit unit ) { miracle_log( LOG_DEBUG, "closing unit..." ); miracle_unit_terminate( unit ); - mlt_playlist_close( unit->old_playlist ); mlt_properties_close( unit->properties ); free( unit ); miracle_log( LOG_DEBUG, "... unit closed." ); diff --git a/src/miracle/miracle_unit.h b/src/miracle/miracle_unit.h index 78792681..1e6289ff 100644 --- a/src/miracle/miracle_unit.h +++ b/src/miracle/miracle_unit.h @@ -34,7 +34,6 @@ extern "C" typedef struct { mlt_properties properties; - mlt_playlist old_playlist; } miracle_unit_t, *miracle_unit; @@ -47,6 +46,7 @@ extern valerie_error_code miracle_unit_append( miracle_unit unit, char *clip, extern valerie_error_code miracle_unit_append_service( miracle_unit unit, mlt_service service ); extern valerie_error_code miracle_unit_remove( miracle_unit unit, int index ); extern valerie_error_code miracle_unit_clean( miracle_unit unit ); +extern valerie_error_code miracle_unit_wipe( miracle_unit unit ); extern valerie_error_code miracle_unit_clear( miracle_unit unit ); extern valerie_error_code miracle_unit_move( miracle_unit unit, int src, int dest ); extern int miracle_unit_transfer( miracle_unit dest_unit, miracle_unit src_unit ); diff --git a/src/miracle/miracle_unit_commands.c b/src/miracle/miracle_unit_commands.c index 98a420d5..81e439c2 100644 --- a/src/miracle/miracle_unit_commands.c +++ b/src/miracle/miracle_unit_commands.c @@ -181,6 +181,20 @@ int miracle_clean( command_argument cmd_arg ) return RESPONSE_SUCCESS; } +int miracle_wipe( command_argument cmd_arg ) +{ + miracle_unit unit = miracle_get_unit(cmd_arg->unit); + + if (unit == NULL) + return RESPONSE_INVALID_UNIT; + else + { + if ( miracle_unit_wipe( unit ) != valerie_ok ) + return RESPONSE_BAD_FILE; + } + return RESPONSE_SUCCESS; +} + int miracle_clear( command_argument cmd_arg ) { miracle_unit unit = miracle_get_unit(cmd_arg->unit); diff --git a/src/miracle/miracle_unit_commands.h b/src/miracle/miracle_unit_commands.h index ad1316c1..cfd51a71 100644 --- a/src/miracle/miracle_unit_commands.h +++ b/src/miracle/miracle_unit_commands.h @@ -34,6 +34,7 @@ extern response_codes miracle_load( command_argument ); extern response_codes miracle_insert( command_argument ); extern response_codes miracle_remove( command_argument ); extern response_codes miracle_clean( command_argument ); +extern response_codes miracle_wipe( command_argument ); extern response_codes miracle_clear( command_argument ); extern response_codes miracle_move( command_argument ); extern response_codes miracle_append( command_argument ); diff --git a/src/modules/avformat/factory.c b/src/modules/avformat/factory.c index 4ec946cc..3247532e 100644 --- a/src/modules/avformat/factory.c +++ b/src/modules/avformat/factory.c @@ -87,6 +87,7 @@ static void avformat_init( ) pthread_mutex_init( &avformat_mutex, NULL ); av_register_all( ); mlt_factory_register_for_clean_up( NULL, avformat_destroy ); + av_log_set_level( -1 ); } } diff --git a/src/valerie/valerie.c b/src/valerie/valerie.c index c76112d8..f6a79d8c 100644 --- a/src/valerie/valerie.c +++ b/src/valerie/valerie.c @@ -346,6 +346,14 @@ valerie_error_code valerie_unit_clear( valerie this, int unit ) return valerie_execute( this, 1024, "CLEAR U%d", unit ); } +/** Wipe the unit - this function removes all clips before the current one. +*/ + +valerie_error_code valerie_unit_wipe( valerie this, int unit ) +{ + return valerie_execute( this, 1024, "WIPE U%d", unit ); +} + /** Move clips on the units playlist. */ diff --git a/src/valerie/valerie.h b/src/valerie/valerie.h index 29d4fd32..daa400bf 100644 --- a/src/valerie/valerie.h +++ b/src/valerie/valerie.h @@ -100,6 +100,7 @@ extern valerie_error_code valerie_unit_append( valerie, int, char *, int32_t, in extern valerie_error_code valerie_unit_receive( valerie, int, char *, char * ); extern valerie_error_code valerie_unit_push( valerie, int, char *, mlt_service ); extern valerie_error_code valerie_unit_clean( valerie, int ); +extern valerie_error_code valerie_unit_wipe( valerie, int ); extern valerie_error_code valerie_unit_clear( valerie, int ); extern valerie_error_code valerie_unit_clip_move( valerie, int, valerie_clip_offset, int, valerie_clip_offset, int ); extern valerie_error_code valerie_unit_clip_remove( valerie, int, valerie_clip_offset, int ); -- 2.39.2