X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmiracle%2Fmiracle_unit.c;h=cacdc506cc87c250ca11ff64cef92b7cbc8ef622;hb=3ec17a7ab21b1211def9303df9e8eb638bf81504;hp=bc90d69b9a85bd27187605e701783afcdd379c3e;hpb=80a5c8297b313b09add80814a637a71ba9e0fa05;p=melted diff --git a/src/miracle/miracle_unit.c b/src/miracle/miracle_unit.c index bc90d69..cacdc50 100644 --- a/src/miracle/miracle_unit.c +++ b/src/miracle/miracle_unit.c @@ -33,6 +33,7 @@ #include #include #include +#include #include @@ -126,10 +127,15 @@ 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 create_producer( miracle_unit unit, char *file ) +static mlt_producer locate_producer( miracle_unit unit, char *file ) { // Get the unit properties mlt_properties properties = unit->producers; @@ -139,36 +145,12 @@ static mlt_producer create_producer( miracle_unit unit, char *file ) if ( result == NULL ) { - // 1st Line preferences - if ( strstr( file, ".mpg" ) ) - result = mlt_factory_producer( "mcmpeg", file ); - else if ( strstr( file, ".mpeg" ) ) - result = mlt_factory_producer( "mcmpeg", file ); - else if ( strstr( file, ".dv" ) ) - result = mlt_factory_producer( "mcdv", file ); - else if ( strstr( file, ".dif" ) ) - result = mlt_factory_producer( "mcdv", file ); - else if ( strstr( file, ".jpg" ) ) - result = mlt_factory_producer( "pixbuf", file ); - else if ( strstr( file, ".JPG" ) ) - result = mlt_factory_producer( "pixbuf", file ); - else if ( strstr( file, ".jpeg" ) ) - result = mlt_factory_producer( "pixbuf", file ); - else if ( strstr( file, ".png" ) ) - result = mlt_factory_producer( "pixbuf", file ); - - // 2nd Line fallbacks - if ( result == NULL && strstr( file, ".dv" ) ) - result = mlt_factory_producer( "libdv", file ); - else if ( result == NULL && strstr( file, ".dif" ) ) - result = mlt_factory_producer( "libdv", file ); - - // 3rd line fallbacks - if ( result == NULL ) - result = mlt_factory_producer( "ffmpeg", file ); + // Create the producer + result = create_producer( file ); // Now store the result - mlt_properties_set_data( properties, file, result, 0, ( mlt_destructor )mlt_producer_close, NULL ); + if ( result != NULL ) + mlt_properties_set_data( properties, file, result, 0, ( mlt_destructor )mlt_producer_close, NULL ); } return result; @@ -213,7 +195,6 @@ void miracle_unit_report_list( miracle_unit unit, valerie_response response ) mlt_properties properties = unit->properties; int generation = mlt_properties_get_int( properties, "generation" ); mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL ); - mlt_producer producer = mlt_playlist_producer( playlist ); valerie_response_printf( response, 1024, "%d\n", generation ); @@ -223,10 +204,10 @@ void miracle_unit_report_list( miracle_unit unit, valerie_response response ) mlt_playlist_get_clip_info( playlist , &info, i ); valerie_response_printf( response, 10240, "%d \"%s\" %lld %lld %lld %lld %.2f\n", i, info.resource, - mlt_producer_frame_position( producer, info.in ), - mlt_producer_frame_position( producer, info.out ), - mlt_producer_frame_position( producer, info.playtime ), - mlt_producer_frame_position( producer, info.length ), + info.frame_in, + info.frame_out, + info.frame_count, + info.length, info.fps ); } } @@ -242,17 +223,16 @@ void miracle_unit_report_list( miracle_unit unit, valerie_response response ) valerie_error_code miracle_unit_load( miracle_unit unit, char *clip, int64_t in, int64_t out, int flush ) { - // Have to clear the unit first - clear_unit( unit ); - // Now try to create an producer - mlt_producer instance = create_producer( unit, clip ); + mlt_producer instance = create_producer( 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_playlist_append_io( playlist, instance, mlt_producer_time( instance, in ), mlt_producer_time( instance, out ) ); + mlt_playlist_append_io( playlist, instance, in, out ); miracle_log( LOG_DEBUG, "loaded clip %s", clip ); miracle_unit_status_communicate( unit ); return valerie_ok; @@ -263,13 +243,13 @@ valerie_error_code miracle_unit_load( miracle_unit unit, char *clip, int64_t in, valerie_error_code miracle_unit_insert( miracle_unit unit, char *clip, int index, int64_t in, int64_t out ) { - mlt_producer instance = create_producer( unit, clip ); + mlt_producer instance = locate_producer( unit, clip ); if ( instance != NULL ) { mlt_properties properties = unit->properties; mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL ); - mlt_playlist_insert( playlist, instance, index, mlt_producer_time( instance, in ), mlt_producer_time( instance, out ) ); + mlt_playlist_insert( playlist, instance, index, in, out ); miracle_log( LOG_DEBUG, "inserted clip %s at %d", clip, index ); update_generation( unit ); miracle_unit_status_communicate( unit ); @@ -294,6 +274,7 @@ valerie_error_code miracle_unit_clean( miracle_unit unit ) { clear_unit( unit ); miracle_log( LOG_DEBUG, "Cleaned playlist" ); + miracle_unit_status_communicate( unit ); return valerie_ok; } @@ -319,13 +300,13 @@ valerie_error_code miracle_unit_move( miracle_unit unit, int src, int dest ) valerie_error_code miracle_unit_append( miracle_unit unit, char *clip, int64_t in, int64_t out ) { - mlt_producer instance = create_producer( unit, clip ); + mlt_producer instance = locate_producer( unit, clip ); if ( instance != NULL ) { mlt_properties properties = unit->properties; mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL ); - mlt_playlist_append_io( playlist, instance, mlt_producer_time( instance, in ), mlt_producer_time( instance, out ) ); + mlt_playlist_append_io( playlist, instance, in, out ); miracle_log( LOG_DEBUG, "appended clip %s", clip ); update_generation( unit ); miracle_unit_status_communicate( unit ); @@ -335,9 +316,7 @@ valerie_error_code miracle_unit_append( miracle_unit unit, char *clip, int64_t i return valerie_invalid_file; } -/** Start playing the clip. - - Start a dv-pump and commence dv1394 transmission. +/** Start playing the unit. \todo error handling \param unit A miracle_unit handle. @@ -350,7 +329,9 @@ void miracle_unit_play( miracle_unit_t *unit, int speed ) mlt_properties properties = unit->properties; mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL ); mlt_producer producer = mlt_playlist_producer( playlist ); + mlt_consumer consumer = mlt_properties_get_data( unit->properties, "consumer", NULL ); mlt_producer_set_speed( producer, ( double )speed / 1000 ); + mlt_consumer_start( consumer ); miracle_unit_status_communicate( unit ); } @@ -363,6 +344,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_consumer_stop( consumer ); + miracle_unit_status_communicate( unit ); } /** Query the status of unit playback. @@ -373,7 +357,8 @@ void miracle_unit_terminate( miracle_unit unit ) int miracle_unit_has_terminated( miracle_unit unit ) { - return 0; + mlt_consumer consumer = mlt_properties_get_data( unit->properties, "consumer", NULL ); + return mlt_consumer_is_stopped( consumer ); } /** Transfer the currently loaded clip to another unit @@ -417,22 +402,24 @@ int miracle_unit_get_status( miracle_unit unit, valerie_status status ) strncpy( status->clip, info.resource, sizeof( status->clip ) ); status->speed = (int)( mlt_producer_get_speed( producer ) * 1000.0 ); status->fps = mlt_producer_get_fps( producer ); - status->in = mlt_producer_frame_position( producer, info.in ); - status->out = mlt_producer_frame_position( producer, info.out ); - status->position = mlt_producer_frame_position( producer, mlt_producer_position( clip ) ); - status->length = mlt_producer_frame_position( producer, mlt_producer_get_length( clip ) ); + 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, info.resource, sizeof( status->tail_clip ) ); - status->tail_in = mlt_producer_frame_position( producer, info.in ); - status->tail_out = mlt_producer_frame_position( producer, info.out ); - status->tail_position = mlt_producer_frame_position( producer, mlt_producer_position( clip ) ); - status->tail_length = mlt_producer_frame_position( producer, mlt_producer_get_length( clip ) ); + status->tail_in = info.frame_in; + status->tail_out = info.frame_out; + status->tail_position = mlt_producer_position( clip ); + status->tail_length = mlt_producer_get_length( clip ); status->clip_index = mlt_playlist_current_clip( playlist ); status->seek_flag = 1; } status->generation = mlt_properties_get_int( properties, "generation" ); - if ( !strcmp( status->clip, "" ) ) + if ( miracle_unit_has_terminated( unit ) ) + status->status = unit_stopped; + else if ( !strcmp( status->clip, "" ) ) status->status = unit_not_loaded; else if ( status->speed == 0 ) status->status = unit_paused; @@ -460,30 +447,29 @@ void miracle_unit_change_position( miracle_unit unit, int clip, int64_t position mlt_playlist_clip_info info; if ( clip < 0 ) + { clip = 0; + position = 0; + } else if ( clip >= mlt_playlist_count( playlist ) ) - clip = mlt_playlist_count( playlist ); - - if ( mlt_playlist_get_clip_info( playlist, &info, clip ) == 0 ) { - mlt_timecode relative = mlt_producer_time( info.producer, position ); - mlt_timecode absolute = relative - info.in; - int64_t frame_start = mlt_producer_frame_position( info.producer, info.start ); - int64_t frame_offset = 0; - - if ( absolute < 0 ) - frame_offset = 0; - else if ( absolute >= info.out ) - frame_offset = mlt_producer_frame_position( info.producer, info.out ) - 1; - else - frame_offset = mlt_producer_frame_position( info.producer, absolute ); - - mlt_producer_seek_frame( producer, frame_start + frame_offset ); + clip = mlt_playlist_count( playlist ) - 1; + position = LONG_MAX; } - else + + if ( mlt_playlist_get_clip_info( playlist, &info, clip ) == 0 ) { - mlt_timecode out = mlt_producer_get_out( producer ); - mlt_producer_seek( producer, mlt_producer_frame_position( producer, out ) - 1 ); + int64_t frame_start = info.start; + int64_t frame_offset = position; + + if ( frame_offset < 0 ) + frame_offset = info.frame_out; + if ( frame_offset < info.frame_in ) + frame_offset = info.frame_in; + if ( frame_offset >= info.frame_out ) + frame_offset = info.frame_out; + + mlt_producer_seek( producer, frame_start + frame_offset - info.frame_in ); } miracle_unit_status_communicate( unit ); @@ -512,8 +498,8 @@ int miracle_unit_set_clip_in( miracle_unit unit, int index, int64_t position ) if ( error == 0 ) { - mlt_timecode in = mlt_producer_time( info.producer, position ); - error = mlt_playlist_resize_clip( playlist, index, in, info.out ); + miracle_unit_play( unit, 0 ); + error = mlt_playlist_resize_clip( playlist, index, position, info.frame_out ); update_generation( unit ); miracle_unit_change_position( unit, index, 0 ); } @@ -533,11 +519,11 @@ int miracle_unit_set_clip_out( miracle_unit unit, int index, int64_t position ) if ( error == 0 ) { - mlt_timecode out = mlt_producer_time( info.producer, position ); - error = mlt_playlist_resize_clip( playlist, index, info.in, out ); + miracle_unit_play( unit, 0 ); + error = mlt_playlist_resize_clip( playlist, index, info.frame_in, position ); update_generation( unit ); miracle_unit_status_communicate( unit ); - miracle_unit_change_position( unit, index, 0 ); + miracle_unit_change_position( unit, index, -1 ); } return error; @@ -551,8 +537,8 @@ void miracle_unit_step( miracle_unit unit, int64_t offset ) mlt_properties properties = unit->properties; mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL ); mlt_producer producer = mlt_playlist_producer( playlist ); - mlt_timecode position = mlt_producer_position( producer ); - mlt_producer_seek( producer, position + mlt_producer_time( producer, offset ) ); + mlt_position position = mlt_producer_frame( producer ); + mlt_producer_seek( producer, position + offset ); } /** Set the unit's clip mode regarding in and out points. @@ -594,6 +580,32 @@ void miracle_unit_step( miracle_unit unit, int64_t offset ) //return dv_player_get_eof_action( player ); //} +int miracle_unit_set( miracle_unit unit, char *name_value ) +{ + mlt_properties properties = NULL; + + if ( strncmp( name_value, "consumer.", 9 ) ) + { + mlt_playlist playlist = mlt_properties_get_data( unit->properties, "playlist", NULL ); + properties = mlt_playlist_properties( playlist ); + } + else + { + mlt_consumer consumer = mlt_properties_get_data( unit->properties, "consumer", NULL ); + properties = mlt_consumer_properties( consumer ); + name_value += 9; + } + + return mlt_properties_parse( properties, name_value ); +} + +char *miracle_unit_get( miracle_unit unit, char *name ) +{ + mlt_playlist playlist = mlt_properties_get_data( unit->properties, "playlist", NULL ); + mlt_properties properties = mlt_playlist_properties( playlist ); + return mlt_properties_get( properties, name ); +} + /** Release the unit \todo error handling