#include <errno.h>
#include <signal.h>
#include <limits.h>
-#include <time.h>
#include <sys/mman.h>
{
melted_unit this = NULL;
mlt_consumer consumer = NULL;
+ mlt_profile profile = mlt_profile_init( NULL );
char *id = strdup( constructor );
char *arg = strchr( id, ':' );
if ( arg != NULL )
*arg ++ = '\0';
- consumer = mlt_factory_consumer( NULL, id, arg );
+ profile->is_explicit = 1;
+ consumer = mlt_factory_consumer( profile, id, arg );
if ( consumer != NULL )
{
mlt_properties_set( this->properties, "constructor", constructor );
mlt_properties_set( this->properties, "id", id );
mlt_properties_set( this->properties, "arg", arg );
+ mlt_properties_set_data( this->properties, "producer", mlt_properties_new( ), 0, ( mlt_destructor )mlt_properties_close, NULL );
mlt_properties_set_data( this->properties, "consumer", consumer, 0, ( mlt_destructor )mlt_consumer_close, NULL );
mlt_properties_set_data( this->properties, "playlist", playlist, 0, ( mlt_destructor )mlt_playlist_close, NULL );
mlt_consumer_connect( consumer, MLT_PLAYLIST_SERVICE( playlist ) );
{
// Try to get the profile from the consumer
mlt_consumer consumer = mlt_properties_get_data( unit->properties, "consumer", NULL );
+ mlt_properties m_prop = mlt_properties_get_data( unit->properties, "producer", NULL );
+ mlt_producer producer;
mlt_profile profile = NULL;
if ( consumer != NULL )
{
profile = mlt_service_profile( MLT_CONSUMER_SERVICE( consumer ) );
}
- return mlt_factory_producer( profile, NULL, file );
+
+ producer = mlt_factory_producer( profile, NULL, file );
+ if( producer )
+ {
+ mlt_properties p_prop = mlt_producer_properties( producer );
+ mlt_properties_inherit ( p_prop, m_prop );
+ }
+
+ return producer;
}
/** Update the generation count.
{
mlt_properties properties = unit->properties;
mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL );
+ mlt_consumer consumer = mlt_properties_get_data( unit->properties, "consumer", NULL );
mlt_producer producer = MLT_PLAYLIST_PRODUCER( playlist );
mlt_service_lock( MLT_PLAYLIST_SERVICE( playlist ) );
mlt_playlist_clear( playlist );
mlt_producer_seek( producer, 0 );
+ mlt_properties_set_int( MLT_CONSUMER_PROPERTIES(consumer), "refresh", 1 );
mlt_service_unlock( MLT_PLAYLIST_SERVICE( playlist ) );
update_generation( unit );
{
mlt_properties properties = unit->properties;
mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL );
+ mlt_consumer consumer = mlt_properties_get_data( properties, "consumer", NULL );
mlt_playlist_clip_info info;
int current = mlt_playlist_current_clip( playlist );
mlt_producer producer = MLT_PLAYLIST_PRODUCER( 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_properties_set_int( MLT_CONSUMER_PROPERTIES(consumer), "refresh", 1 );
mlt_service_unlock( MLT_PLAYLIST_SERVICE( playlist ) );
mlt_producer_close( info.producer );
}
{
mlt_properties properties = unit->properties;
mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL );
- mlt_producer producer = MLT_PLAYLIST_PRODUCER( playlist );
- int original = mlt_producer_get_playtime( producer );
- mlt_consumer consumer = mlt_properties_get_data( unit->properties, "consumer", NULL );
- double speed = mlt_producer_get_speed( producer );
- struct timespec tm = { 1, 0 };
-
+ 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 ) );
- // We try to ensure all frames from producers that will be removed are closed.
- mlt_producer_seek( producer, original );
- mlt_consumer_purge( consumer );
-
melted_log( LOG_DEBUG, "loaded clip %s", clip );
update_generation( unit );
melted_unit_status_communicate( unit );
mlt_producer_close( instance );
-
- // Give more time for those frames to be closed - there could still be some
- // in the consumer plugin that were not purged from the base consumer buffer.
- nanosleep( &tm, NULL );
- mlt_service_lock( MLT_PLAYLIST_SERVICE( playlist ) );
- mlt_playlist_remove_region( playlist, 0, original );
- mlt_service_unlock( MLT_PLAYLIST_SERVICE( playlist ) );
-
return mvcp_ok;
}
mlt_consumer consumer = mlt_properties_get_data( unit->properties, "consumer", NULL );
mlt_producer_set_speed( producer, ( double )speed / 1000 );
mlt_consumer_start( consumer );
+ mlt_properties_set_int( MLT_CONSUMER_PROPERTIES(consumer), "refresh", 1 );
melted_unit_status_communicate( unit );
}
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->fps = info.fps;
status->in = info.frame_in;
status->out = info.frame_out;
status->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;
+ status->dur = mlt_producer_get_length( producer );
+ status->start = info.start;
}
status->generation = mlt_properties_get_int( properties, "generation" );
{
int32_t frame_start = info.start;
int32_t frame_offset = position;
+ mlt_consumer consumer = mlt_properties_get_data( unit->properties, "consumer", NULL );
if ( frame_offset < 0 )
frame_offset = info.frame_out;
frame_offset = info.frame_out;
mlt_producer_seek( producer, frame_start + frame_offset - info.frame_in );
+ mlt_properties_set_int( MLT_CONSUMER_PROPERTIES(consumer), "refresh", 1 );
}
melted_unit_status_communicate( unit );
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_position position = mlt_producer_frame( producer );
mlt_producer_seek( producer, position + offset );
+ mlt_properties_set_int( MLT_CONSUMER_PROPERTIES(consumer), "refresh", 1 );
}
/** Set the unit's clip mode regarding in and out points.
if ( strncmp( name_value, "consumer.", 9 ) )
{
- mlt_playlist playlist = mlt_properties_get_data( unit->properties, "playlist", NULL );
- properties = MLT_PLAYLIST_PROPERTIES( playlist );
+ if ( strncmp( name_value, "producer.", 9 ) )
+ {
+ mlt_playlist playlist = mlt_properties_get_data( unit->properties, "playlist", NULL );
+ properties = MLT_PLAYLIST_PROPERTIES( playlist );
+ }
+ else
+ {
+ properties = mlt_properties_get_data( unit->properties, "producer", NULL );
+ name_value += 9;
+ }
}
else
{