]> git.sesse.net Git - mlt/blobdiff - src/miracle/miracle_unit.c
inigo docs load/stop corrections
[mlt] / src / miracle / miracle_unit.c
index ba8bf09839b6f94afa982450f48358815d879dee..f7023d058e45e0f9ee1dd0186a784854f89919da 100644 (file)
@@ -33,6 +33,7 @@
 #include <string.h>
 #include <errno.h>
 #include <signal.h>
+#include <limits.h>
 
 #include <sys/mman.h>
 
@@ -140,7 +141,12 @@ static mlt_producer create_producer( miracle_unit unit, char *file )
        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 );
@@ -156,6 +162,10 @@ static mlt_producer create_producer( miracle_unit unit, char *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" ) )
@@ -213,7 +223,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 );
                
@@ -225,8 +234,8 @@ void miracle_unit_report_list( miracle_unit unit, valerie_response response )
                                                                 i, info.resource, 
                                                                 info.frame_in, 
                                                                 info.frame_out,
-                                                                mlt_producer_frame_position( producer, info.playtime )
-                                                                mlt_producer_frame_position( producer, info.length )
+                                                                info.frame_count
+                                                                info.length
                                                                 info.fps );
        }
 }
@@ -252,7 +261,7 @@ valerie_error_code miracle_unit_load( miracle_unit unit, char *clip, int64_t in,
        {
                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;
@@ -269,7 +278,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 );
-               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 +303,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;
 }
 
@@ -325,7 +335,7 @@ valerie_error_code miracle_unit_append( miracle_unit unit, char *clip, int64_t i
        {
                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 +345,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 +358,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 +373,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 +386,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
@@ -419,20 +433,22 @@ int miracle_unit_get_status( miracle_unit unit, valerie_status status )
                        status->fps = mlt_producer_get_fps( producer );
                        status->in = info.frame_in;
                        status->out = info.frame_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->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 = info.frame_in;
                        status->tail_out = info.frame_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_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;
@@ -467,12 +483,12 @@ void miracle_unit_change_position( miracle_unit unit, int clip, int64_t position
        else if ( clip >= mlt_playlist_count( playlist ) )
        {
                clip = mlt_playlist_count( playlist ) - 1;
-               position = 999999999999;
+               position = LONG_MAX;
        }
 
        if ( mlt_playlist_get_clip_info( playlist, &info, clip ) == 0 )
        {
-               int64_t frame_start = mlt_producer_frame_position( info.producer, info.start );
+               int64_t frame_start = info.start;
                int64_t frame_offset = position;
 
                if ( frame_offset < 0 )
@@ -482,7 +498,7 @@ void miracle_unit_change_position( miracle_unit unit, int clip, int64_t position
                if ( frame_offset >= info.frame_out )
                        frame_offset = info.frame_out;
                
-               mlt_producer_seek_frame( producer, frame_start + frame_offset - info.frame_in );
+               mlt_producer_seek( producer, frame_start + frame_offset - info.frame_in );
        }
 
        miracle_unit_status_communicate( unit );
@@ -511,8 +527,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 );
        }
@@ -532,8 +548,8 @@ 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, -1 );
@@ -550,8 +566,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_frame( producer, mlt_producer_frame_position( producer, position ) + 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.
@@ -593,6 +609,20 @@ 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_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