#include <string.h>
#include <errno.h>
#include <signal.h>
+#include <limits.h>
#include <sys/mman.h>
if ( result == NULL )
{
// 1st Line preferences
- if ( strstr( file, ".mpg" ) )
+ if ( strstr( file, ".inigo" ) )
+ {
+ char *args[ 2 ] = { file, NULL };
+ result = mlt_factory_producer( "inigo", args );
+ }
+ else if ( strstr( file, ".mpg" ) )
result = mlt_factory_producer( "mcmpeg", file );
else if ( strstr( file, ".mpeg" ) )
result = mlt_factory_producer( "mcmpeg", file );
result = mlt_factory_producer( "pixbuf", file );
else if ( strstr( file, ".png" ) )
result = mlt_factory_producer( "pixbuf", file );
+ else if ( strstr( file, ".tga" ) )
+ result = mlt_factory_producer( "pixbuf", file );
+ else if ( strstr( file, ".txt" ) )
+ result = mlt_factory_producer( "pango", file );
// 2nd Line fallbacks
if ( result == NULL && strstr( file, ".dv" ) )
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 );
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 );
}
}
{
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, "loaded clip %s", clip );
miracle_unit_status_communicate( unit );
return valerie_ok;
{
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 );
{
clear_unit( unit );
miracle_log( LOG_DEBUG, "Cleaned playlist" );
+ miracle_unit_status_communicate( unit );
return valerie_ok;
}
{
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 );
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.
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 );
}
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.
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
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;
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 );
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 );
}
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;
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.
//return dv_player_get_eof_action( player );
//}
+int miracle_unit_set( miracle_unit unit, char *name_value )
+{
+ mlt_playlist playlist = mlt_properties_get_data( unit->properties, "playlist", NULL );
+ mlt_properties properties = mlt_playlist_properties( playlist );
+ 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