melted only supports explicit profiles, not auto-profile
[melted] / src / melted / melted_unit.c
index 8a86764..3f09def 100644 (file)
@@ -55,6 +55,7 @@ melted_unit melted_unit_init( int index, char *constructor )
 {
        melted_unit this = NULL;
        mlt_consumer consumer = NULL;
+       mlt_profile profile = mlt_profile_init( NULL );
 
        char *id = strdup( constructor );
        char *arg = strchr( id, ':' );
@@ -62,7 +63,8 @@ melted_unit melted_unit_init( int index, char *constructor )
        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 )
        {
@@ -75,6 +77,7 @@ melted_unit melted_unit_init( int index, char *constructor )
                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 ) );
@@ -148,13 +151,23 @@ static mlt_producer locate_producer( melted_unit unit, char *file )
 {
        // 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, "fezzik", 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.
@@ -174,11 +187,13 @@ static void clear_unit( melted_unit unit )
 {
        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 );
@@ -191,6 +206,7 @@ static void clean_unit( melted_unit 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 );
@@ -207,6 +223,7 @@ static void clean_unit( melted_unit unit )
                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 );
        }
@@ -439,6 +456,7 @@ void melted_unit_play( melted_unit_t *unit, int speed )
        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 );
 }
 
@@ -548,7 +566,7 @@ int melted_unit_get_status( melted_unit unit, mvcp_status status )
                                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 );
@@ -608,6 +626,7 @@ void melted_unit_change_position( melted_unit unit, int clip, int32_t position )
        {
                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;
@@ -617,6 +636,7 @@ void melted_unit_change_position( melted_unit unit, int clip, int32_t position )
                        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 );
@@ -688,8 +708,10 @@ void melted_unit_step( melted_unit unit, int32_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_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.
@@ -737,8 +759,16 @@ int melted_unit_set( melted_unit unit, char *name_value )
 
        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
        {