]> git.sesse.net Git - mlt/commitdiff
Threading considerations and DVCP WIPE introduced
authorlilo_booter <lilo_booter@d19143bc-622f-0410-bfdd-b5b2a6649095>
Sun, 13 Mar 2005 10:04:51 +0000 (10:04 +0000)
committerlilo_booter <lilo_booter@d19143bc-622f-0410-bfdd-b5b2a6649095>
Sun, 13 Mar 2005 10:04:51 +0000 (10:04 +0000)
git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@685 d19143bc-622f-0410-bfdd-b5b2a6649095

docs/dvcp.txt
src/miracle/miracle_local.c
src/miracle/miracle_unit.c
src/miracle/miracle_unit.h
src/miracle/miracle_unit_commands.c
src/miracle/miracle_unit_commands.h
src/modules/avformat/factory.c
src/valerie/valerie.c
src/valerie/valerie.h

index d565c7f71870fcbbd062287205889fa28b12ec40..acbded595096f88e5a6dcbc6cb4f061293c45acd 100644 (file)
@@ -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.
index c0917f3701cdcfceb5ec51b24891205325b46f42..143f101d50b8ecbfda217adc45ef84d04dab5576 100644 (file)
@@ -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."},
index 370eb11e40eaff0c26ace6d06684462f48037b7d..a6cb7845d7908a4fae5472e9de99dfbf6e301d1b 100644 (file)
@@ -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." );
index 7879268135f114067ff4e6c7ccbf21a4c87003e2..1e6289ff81f9a0d3daddd336ebf1978a128e75d0 100644 (file)
@@ -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 );
index 98a420d5886044e89113e47436a14e16d5145f04..81e439c2a5c21740060a515d64fe9903abce8846 100644 (file)
@@ -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);
index ad1316c18d8e49f2542021759439a7d1f8ead34f..cfd51a71fa5d10c65c0de7821ce4f58d7a4004d3 100644 (file)
@@ -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 );
index 4ec946cc685b52330233c5f560aa002007ea3f92..3247532e44ab62ead833ea1c8adb292235853fbb 100644 (file)
@@ -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 );
        }
 }
 
index c76112d8e015e1f593371510c82f60ab0a06fd32..f6a79d8c0302588c0bf76323f9b8f6a3fe2021eb 100644 (file)
@@ -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.
 */
 
index 29d4fd328325699603629061a708908f733773cf..daa400bfb78fd53741812f3e62cd49ce822a7e11 100644 (file)
@@ -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 );