X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmiracle%2Fmiracle_unit.c;h=18f19acab386a937c051e249b4ae4fdb3259888f;hb=529670db145a8731d56a8fc5fc43b8aa480f7f1f;hp=e7d6a2ac562ddae82bff30662e994e6cd9df3ec2;hpb=281579567f77944a2130b00e91ca8b8142df6e0b;p=melted diff --git a/src/miracle/miracle_unit.c b/src/miracle/miracle_unit.c index e7d6a2a..18f19ac 100644 --- a/src/miracle/miracle_unit.c +++ b/src/miracle/miracle_unit.c @@ -69,7 +69,7 @@ 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->producers = 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,6 +84,19 @@ 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; @@ -142,33 +155,12 @@ void miracle_unit_set_notifier( miracle_unit this, valerie_notifier notifier, ch miracle_unit_status_communicate( this ); } -static mlt_producer create_producer( char *file ) -{ - return mlt_factory_producer( "fezzik", file ); -} - /** Create or locate a producer for the file specified. */ static mlt_producer locate_producer( miracle_unit unit, char *file ) { - // Get the unit properties - mlt_properties properties = unit->producers; - - // Check if we already have loaded this file - mlt_producer result = mlt_properties_get_data( properties, file, NULL ); - - if ( result == NULL ) - { - // Create the producer - result = create_producer( file ); - - // Now store the result - if ( result != NULL ) - mlt_properties_set_data( properties, file, result, 0, ( mlt_destructor )mlt_producer_close, NULL ); - } - - return result; + return mlt_factory_producer( "fezzik", file ); } /** Update the generation count. @@ -190,14 +182,11 @@ 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_playlist_clear( playlist ); mlt_producer_seek( producer, 0 ); - if ( unit->old_producers != NULL ) - mlt_properties_close( unit->old_producers ); - unit->old_producers = unit->producers; - unit->producers = mlt_properties_new( ); - update_generation( unit ); } @@ -215,16 +204,15 @@ static void clean_unit( miracle_unit unit ) double speed = mlt_producer_get_speed( producer ); mlt_playlist_get_clip_info( playlist, &info, current ); - if ( info.resource != NULL ) + if ( info.producer != NULL ) { - void *instance = mlt_properties_get_data( unit->producers, info.resource, NULL ); + mlt_properties_inc_ref( mlt_producer_properties( info.producer ) ); position -= info.start; - mlt_properties_set_data( unit->producers, info.resource, instance, 0, NULL, NULL ); clear_unit( unit ); - mlt_playlist_append_io( playlist, instance, info.frame_in, info.frame_out ); - mlt_properties_set_data( unit->producers, info.resource, instance, 0, ( mlt_destructor )mlt_producer_close, NULL ); + 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_producer_close( info.producer ); } update_generation( unit ); @@ -245,10 +233,14 @@ void miracle_unit_report_list( miracle_unit unit, valerie_response response ) for ( i = 0; i < mlt_playlist_count( playlist ); i ++ ) { mlt_playlist_clip_info info; + char *title; mlt_playlist_get_clip_info( playlist , &info, i ); - valerie_response_printf( response, 10240, "%d \"%s\" %lld %lld %lld %lld %.2f\n", + title = mlt_properties_get( mlt_producer_properties( info.producer ), "title" ); + if ( title == NULL ) + title = strip_root( unit, info.resource ); + valerie_response_printf( response, 10240, "%d \"%s\" %d %d %d %d %.2f\n", i, - strip_root( unit, info.resource ), + title, info.frame_in, info.frame_out, info.frame_count, @@ -267,27 +259,29 @@ void miracle_unit_report_list( miracle_unit unit, valerie_response response ) \param out The ending frame (-1 for maximum) */ -valerie_error_code miracle_unit_load( miracle_unit unit, char *clip, int64_t in, int64_t out, int flush ) +valerie_error_code miracle_unit_load( miracle_unit unit, char *clip, int32_t in, int32_t out, int flush ) { - // Now try to create an producer - mlt_producer instance = create_producer( clip ); + // Now try to create a producer + mlt_producer instance = locate_producer( unit, clip ); if ( instance != NULL ) { clear_unit( unit ); mlt_properties properties = unit->properties; - mlt_properties_set_data( unit->producers, clip, instance, 0, ( mlt_destructor )mlt_producer_close, NULL ); mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL ); + mlt_consumer consumer = mlt_properties_get_data( unit->properties, "consumer", NULL ); + mlt_consumer_purge( consumer ); mlt_playlist_append_io( playlist, instance, in, out ); miracle_log( LOG_DEBUG, "loaded clip %s", clip ); miracle_unit_status_communicate( unit ); + mlt_producer_close( instance ); return valerie_ok; } return valerie_invalid_file; } -valerie_error_code miracle_unit_insert( miracle_unit unit, char *clip, int index, int64_t in, int64_t out ) +valerie_error_code miracle_unit_insert( miracle_unit unit, char *clip, int index, int32_t in, int32_t out ) { mlt_producer instance = locate_producer( unit, clip ); @@ -300,6 +294,7 @@ valerie_error_code miracle_unit_insert( miracle_unit unit, char *clip, int index miracle_log( LOG_DEBUG, "inserted clip %s at %d", clip, index ); update_generation( unit ); miracle_unit_status_communicate( unit ); + mlt_producer_close( instance ); return valerie_ok; } @@ -325,6 +320,16 @@ valerie_error_code miracle_unit_clean( miracle_unit unit ) return valerie_ok; } +valerie_error_code miracle_unit_clear( miracle_unit unit ) +{ + mlt_consumer consumer = mlt_properties_get_data( unit->properties, "consumer", NULL ); + clear_unit( unit ); + mlt_consumer_purge( consumer ); + miracle_log( LOG_DEBUG, "Cleared playlist" ); + miracle_unit_status_communicate( unit ); + return valerie_ok; +} + valerie_error_code miracle_unit_move( miracle_unit unit, int src, int dest ) { mlt_properties properties = unit->properties; @@ -345,7 +350,7 @@ valerie_error_code miracle_unit_move( miracle_unit unit, int src, int dest ) \param out The ending frame (-1 for maximum) */ -valerie_error_code miracle_unit_append( miracle_unit unit, char *clip, int64_t in, int64_t out ) +valerie_error_code miracle_unit_append( miracle_unit unit, char *clip, int32_t in, int32_t out ) { mlt_producer instance = locate_producer( unit, clip ); @@ -357,12 +362,30 @@ valerie_error_code miracle_unit_append( miracle_unit unit, char *clip, int64_t i miracle_log( LOG_DEBUG, "appended clip %s", clip ); update_generation( unit ); miracle_unit_status_communicate( unit ); + mlt_producer_close( instance ); return valerie_ok; } return valerie_invalid_file; } +/** Add an mlt_service to the playlist + + \param unit A miracle_unit handle. + \param service the service to add +*/ + +valerie_error_code miracle_unit_append_service( miracle_unit unit, mlt_service service ) +{ + mlt_properties properties = unit->properties; + mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL ); + mlt_playlist_append( playlist, ( mlt_producer )service ); + miracle_log( LOG_DEBUG, "appended clip" ); + update_generation( unit ); + miracle_unit_status_communicate( unit ); + return valerie_ok; +} + /** Start playing the unit. \todo error handling @@ -392,6 +415,9 @@ void miracle_unit_play( miracle_unit_t *unit, int speed ) void miracle_unit_terminate( miracle_unit unit ) { mlt_consumer consumer = mlt_properties_get_data( unit->properties, "consumer", NULL ); + mlt_playlist playlist = mlt_properties_get_data( unit->properties, "playlist", NULL ); + mlt_producer producer = mlt_playlist_producer( playlist ); + mlt_producer_set_speed( producer, 0 ); mlt_consumer_stop( consumer ); miracle_unit_status_communicate( unit ); } @@ -418,23 +444,28 @@ int miracle_unit_transfer( miracle_unit dest_unit, miracle_unit src_unit ) mlt_playlist dest_playlist = mlt_properties_get_data( dest_properties, "playlist", NULL ); mlt_properties src_properties = src_unit->properties; mlt_playlist src_playlist = mlt_properties_get_data( src_properties, "playlist", NULL ); + mlt_playlist tmp_playlist = mlt_playlist_init( ); for ( i = 0; i < mlt_playlist_count( src_playlist ); i ++ ) { mlt_playlist_clip_info info; mlt_playlist_get_clip_info( src_playlist, &info, i ); - mlt_producer producer = locate_producer( dest_unit, info.resource ); - if ( producer != NULL ) - { - mlt_playlist_append_io( dest_playlist, producer, info.frame_in, info.frame_out ); - if ( i == 0 ) - { - miracle_unit_change_position( dest_unit, mlt_playlist_count( dest_playlist ) - 1, 0 ); - clean_unit( dest_unit ); - } - } + if ( info.producer != NULL ) + mlt_playlist_append_io( tmp_playlist, info.producer, info.frame_in, info.frame_out ); } + clear_unit( src_unit ); + + for ( i = 0; i < mlt_playlist_count( tmp_playlist ); i ++ ) + { + mlt_playlist_clip_info info; + mlt_playlist_get_clip_info( tmp_playlist, &info, i ); + if ( info.producer != NULL ) + mlt_playlist_append_io( dest_playlist, info.producer, info.frame_in, info.frame_out ); + } + + mlt_playlist_close( tmp_playlist ); + return 0; } @@ -468,14 +499,17 @@ int miracle_unit_get_status( miracle_unit unit, valerie_status status ) if ( info.resource != NULL && strcmp( info.resource, "" ) ) { - strncpy( status->clip, strip_root( unit, info.resource ), sizeof( status->clip ) ); + char *title = mlt_properties_get( mlt_producer_properties( info.producer ), "title" ); + if ( title == NULL ) + title = strip_root( unit, info.resource ); + strncpy( status->clip, title, sizeof( status->clip ) ); status->speed = (int)( mlt_producer_get_speed( producer ) * 1000.0 ); status->fps = mlt_producer_get_fps( producer ); status->in = info.frame_in; status->out = info.frame_out; status->position = mlt_producer_position( clip ); status->length = mlt_producer_get_length( clip ); - strncpy( status->tail_clip, strip_root( unit, info.resource ), sizeof( status->tail_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 ); @@ -508,7 +542,7 @@ int miracle_unit_get_status( miracle_unit unit, valerie_status status ) /** Change position in the playlist. */ -void miracle_unit_change_position( miracle_unit unit, int clip, int64_t position ) +void miracle_unit_change_position( miracle_unit unit, int clip, int32_t position ) { mlt_properties properties = unit->properties; mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL ); @@ -528,8 +562,8 @@ void miracle_unit_change_position( miracle_unit unit, int clip, int64_t position if ( mlt_playlist_get_clip_info( playlist, &info, clip ) == 0 ) { - int64_t frame_start = info.start; - int64_t frame_offset = position; + int32_t frame_start = info.start; + int32_t frame_offset = position; if ( frame_offset < 0 ) frame_offset = info.frame_out; @@ -558,7 +592,7 @@ int miracle_unit_get_current_clip( miracle_unit unit ) /** Set a clip's in point */ -int miracle_unit_set_clip_in( miracle_unit unit, int index, int64_t position ) +int miracle_unit_set_clip_in( miracle_unit unit, int index, int32_t position ) { mlt_properties properties = unit->properties; mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL ); @@ -579,7 +613,7 @@ int miracle_unit_set_clip_in( miracle_unit unit, int index, int64_t position ) /** Set a clip's out point. */ -int miracle_unit_set_clip_out( miracle_unit unit, int index, int64_t position ) +int miracle_unit_set_clip_out( miracle_unit unit, int index, int32_t position ) { mlt_properties properties = unit->properties; mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL ); @@ -601,7 +635,7 @@ int miracle_unit_set_clip_out( miracle_unit unit, int index, int64_t position ) /** Step by specified position. */ -void miracle_unit_step( miracle_unit unit, int64_t offset ) +void miracle_unit_step( miracle_unit unit, int32_t offset ) { mlt_properties properties = unit->properties; mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL ); @@ -686,10 +720,9 @@ void miracle_unit_close( miracle_unit unit ) if ( unit != NULL ) { miracle_log( LOG_DEBUG, "closing unit..." ); - if ( unit->old_producers != NULL ) - mlt_properties_close( unit->old_producers ); + miracle_unit_terminate( unit ); + mlt_playlist_close( unit->old_playlist ); mlt_properties_close( unit->properties ); - mlt_properties_close( unit->producers ); free( unit ); miracle_log( LOG_DEBUG, "... unit closed." ); }