consumer read ahead and int32_t migration
[melted] / src / miracle / miracle_unit.c
index 0469ae5..83f0f02 100644 (file)
@@ -84,6 +84,21 @@ miracle_unit miracle_unit_init( int index, char *constructor )
        return this;
 }
 
+static char *strip_root( miracle_unit unit, char *file )
+{
+       mlt_properties properties = unit->properties;
+       char *root = mlt_properties_get( properties, "root" );
+       if ( file != NULL && root != NULL )
+       {
+               int length = strlen( root );
+               if ( root[ length - 1 ] == '/' )
+                       length --;
+               if ( !strncmp( file, root, length ) )
+                       file += length;
+       }
+       return file;
+}
+
 /** Communicate the current status to all threads waiting on the notifier.
 */
 
@@ -129,51 +144,7 @@ void miracle_unit_set_notifier( miracle_unit this, valerie_notifier notifier, ch
 
 static mlt_producer create_producer( char *file )
 {
-       mlt_producer result = NULL;
-
-       // 1st Line preferences
-       if ( strstr( file, ".inigo" ) )
-               result = mlt_factory_producer( "inigo_file", file );
-       else if ( strstr( file, ".westley" ) )
-               result = mlt_factory_producer( "westley", file );
-       else 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 );
-       else if ( strstr( file, ".tga" ) )
-               result = mlt_factory_producer( "pixbuf", file );
-       else if ( strstr( file, ".txt" ) )
-               result = mlt_factory_producer( "pango", file );
-       else if ( strstr( file, ".ogg" ) )
-               result = mlt_factory_producer( "vorbis", 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( "avformat", file );
-
-       // 4th line fallbacks 
-       if ( result == NULL )
-               result = mlt_factory_producer( "ffmpeg", file );
-
-       return result;
+       return mlt_factory_producer( "fezzik", file );
 }
 
 /** Create or locate a producer for the file specified.
@@ -230,6 +201,35 @@ static void clear_unit( miracle_unit unit )
        update_generation( unit );
 }
 
+/** Wipe all but the playing clip from the unit.
+*/
+
+static void clean_unit( miracle_unit unit )
+{
+       mlt_properties properties = unit->properties;
+       mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL );
+       mlt_playlist_clip_info info;
+       int current = mlt_playlist_current_clip( playlist );
+       mlt_producer producer = mlt_playlist_producer( playlist );
+       mlt_position position = mlt_producer_frame( producer );
+       double speed = mlt_producer_get_speed( producer );
+       mlt_playlist_get_clip_info( playlist, &info, current );
+
+       if ( info.resource != NULL )
+       {
+               void *instance = mlt_properties_get_data( unit->producers, info.resource, NULL );
+               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_producer_seek( producer, position );
+               mlt_producer_set_speed( producer, speed );
+       }
+       
+       update_generation( unit );
+}
+
 /** Generate a report on all loaded clips.
 */
 
@@ -246,14 +246,16 @@ void miracle_unit_report_list( miracle_unit unit, valerie_response response )
        {
                mlt_playlist_clip_info info;
                mlt_playlist_get_clip_info( playlist , &info, i );
-               valerie_response_printf( response, 10240, "%d \"%s\" %lld %lld %lld %lld %.2f\n", 
-                                                                i, info.resource, 
+               valerie_response_printf( response, 10240, "%d \"%s\" %d %d %d %d %.2f\n", 
+                                                                i, 
+                                                                strip_root( unit, info.resource ), 
                                                                 info.frame_in, 
                                                                 info.frame_out,
                                                                 info.frame_count, 
                                                                 info.length, 
                                                                 info.fps );
        }
+       valerie_response_printf( response, 1024, "\n" );
 }
 
 /** Load a clip into the unit clearing existing play list.
@@ -265,7 +267,7 @@ 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 );
@@ -285,7 +287,7 @@ valerie_error_code miracle_unit_load( miracle_unit unit, char *clip, int64_t in,
        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 );
 
@@ -293,6 +295,7 @@ valerie_error_code miracle_unit_insert( miracle_unit unit, char *clip, int index
        {
                mlt_properties properties = unit->properties;
                mlt_playlist playlist = mlt_properties_get_data( properties, "playlist", NULL );
+               fprintf( stderr, "inserting clip %s before %d\n", clip, index );
                mlt_playlist_insert( playlist, instance, index, in, out );
                miracle_log( LOG_DEBUG, "inserted clip %s at %d", clip, index );
                update_generation( unit );
@@ -316,7 +319,7 @@ valerie_error_code miracle_unit_remove( miracle_unit unit, int index )
 
 valerie_error_code miracle_unit_clean( miracle_unit unit )
 {
-       clear_unit( unit );
+       clean_unit( unit );
        miracle_log( LOG_DEBUG, "Cleaned playlist" );
        miracle_unit_status_communicate( unit );
        return valerie_ok;
@@ -342,7 +345,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 );
 
@@ -389,6 +392,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 );
 }
@@ -410,6 +416,28 @@ int miracle_unit_has_terminated( miracle_unit unit )
 
 int miracle_unit_transfer( miracle_unit dest_unit, miracle_unit src_unit )
 {
+       int i;
+       mlt_properties dest_properties = dest_unit->properties;
+       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 );
+
+       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 );
+                       }
+               }
+       }
+
        return 0;
 }
 
@@ -443,14 +471,14 @@ int miracle_unit_get_status( miracle_unit unit, valerie_status status )
 
                if ( info.resource != NULL && strcmp( info.resource, "" ) )
                {
-                       strncpy( status->clip, info.resource, sizeof( status->clip ) );
+                       strncpy( status->clip, strip_root( unit, info.resource ), 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, info.resource, sizeof( status->tail_clip ) );
+                       strncpy( status->tail_clip, strip_root( unit, info.resource ), sizeof( status->tail_clip ) );
                        status->tail_in = info.frame_in;
                        status->tail_out = info.frame_out;
                        status->tail_position = mlt_producer_position( clip );
@@ -483,7 +511,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 );
@@ -503,8 +531,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;
@@ -533,7 +561,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 );
@@ -554,7 +582,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 );
@@ -576,7 +604,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 );
@@ -626,8 +654,20 @@ void miracle_unit_step( miracle_unit unit, int64_t offset )
 
 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 );
+       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 );
 }