inigo rewrite, producer, serialise and deserialise
authorlilo_booter <lilo_booter@d19143bc-622f-0410-bfdd-b5b2a6649095>
Mon, 12 Jan 2004 11:16:10 +0000 (11:16 +0000)
committerlilo_booter <lilo_booter@d19143bc-622f-0410-bfdd-b5b2a6649095>
Mon, 12 Jan 2004 11:16:10 +0000 (11:16 +0000)
git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@62 d19143bc-622f-0410-bfdd-b5b2a6649095

28 files changed:
docs/services.txt
docs/testing-20040110.txt
mlt/docs/services.txt
mlt/docs/testing-20040110.txt
mlt/src/framework/mlt_frame.c
mlt/src/framework/mlt_playlist.c
mlt/src/inigo/inigo.c
mlt/src/miracle/miracle_unit.c
mlt/src/modules/Makefile
mlt/src/modules/ffmpeg/producer_ffmpeg.c
mlt/src/modules/inigo/Makefile [new file with mode: 0644]
mlt/src/modules/inigo/configure [new file with mode: 0755]
mlt/src/modules/inigo/factory.c [new file with mode: 0644]
mlt/src/modules/inigo/producer_inigo.c [new file with mode: 0644]
mlt/src/modules/inigo/producer_inigo.h [new file with mode: 0644]
mlt/src/modules/sdl/consumer_sdl.c
src/framework/mlt_frame.c
src/framework/mlt_playlist.c
src/inigo/inigo.c
src/miracle/miracle_unit.c
src/modules/Makefile
src/modules/ffmpeg/producer_ffmpeg.c
src/modules/inigo/Makefile [new file with mode: 0644]
src/modules/inigo/configure [new file with mode: 0755]
src/modules/inigo/factory.c [new file with mode: 0644]
src/modules/inigo/producer_inigo.c [new file with mode: 0644]
src/modules/inigo/producer_inigo.h [new file with mode: 0644]
src/modules/sdl/consumer_sdl.c

index f7dbbee..92eb64e 100644 (file)
@@ -237,7 +237,7 @@ Producers
 
                Known Bugs
 
-                       none
+                       in/out settings are incorrectly handled.
 
        ppm
                Description
@@ -429,5 +429,6 @@ Consumers
                
                Known Bugs
 
-                       ?
+                       NTSC handling needs tightening up - sdl:NTSC is the only valid
+                       constructor for NTSC playback at the moment.
 
index f7eb4f0..83a9473 100644 (file)
@@ -1,11 +1,22 @@
 On 1/10/2004, Dan Dennedy ran the dv1394d/docs/testing.txt against
 mlt albino and miracle.
 
-Not Implemented/Completely Broken
+
+NOTE: Discrepancies cited here may have impact on related functionality.
+
+
+General
 ------------------------------------------------------------------------------
-NLS
-UADD {offline unit} -- to be supported?
+Server side error checks and related response error codes are not stringently enforced.
+
 
+Not Implemented
+------------------------------------------------------------------------------
+NLS
+INSERT
+MOVE
+REMOVE
+USET points=ignore
 
 
 Incorrect Behaviour
@@ -15,9 +26,15 @@ LOAD commences play
 STOP does not play the test card (white silence) (=pause)
 USTA when stopped reports "paused"
 REW when stopped does not rewind to the beginning of the clip.
+CLEAN removes all clips (as opposed to leaving the currently playing one)
 
 
 Different Intentional Behaviour
 ------------------------------------------------------------------------------
 STOP does not terminate audio/video output
 
+
+MLT Bugs
+------------------------------------------------------------------------------
+Please check the services.txt doc for known bugs related to MLT components.
+
index f7dbbee..92eb64e 100644 (file)
@@ -237,7 +237,7 @@ Producers
 
                Known Bugs
 
-                       none
+                       in/out settings are incorrectly handled.
 
        ppm
                Description
@@ -429,5 +429,6 @@ Consumers
                
                Known Bugs
 
-                       ?
+                       NTSC handling needs tightening up - sdl:NTSC is the only valid
+                       constructor for NTSC playback at the moment.
 
index f7eb4f0..83a9473 100644 (file)
@@ -1,11 +1,22 @@
 On 1/10/2004, Dan Dennedy ran the dv1394d/docs/testing.txt against
 mlt albino and miracle.
 
-Not Implemented/Completely Broken
+
+NOTE: Discrepancies cited here may have impact on related functionality.
+
+
+General
 ------------------------------------------------------------------------------
-NLS
-UADD {offline unit} -- to be supported?
+Server side error checks and related response error codes are not stringently enforced.
+
 
+Not Implemented
+------------------------------------------------------------------------------
+NLS
+INSERT
+MOVE
+REMOVE
+USET points=ignore
 
 
 Incorrect Behaviour
@@ -15,9 +26,15 @@ LOAD commences play
 STOP does not play the test card (white silence) (=pause)
 USTA when stopped reports "paused"
 REW when stopped does not rewind to the beginning of the clip.
+CLEAN removes all clips (as opposed to leaving the currently playing one)
 
 
 Different Intentional Behaviour
 ------------------------------------------------------------------------------
 STOP does not terminate audio/video output
 
+
+MLT Bugs
+------------------------------------------------------------------------------
+Please check the services.txt doc for known bugs related to MLT components.
+
index 64ec68d..a51fb7e 100644 (file)
@@ -245,7 +245,7 @@ int mlt_frame_get_audio( mlt_frame this, int16_t **buffer, mlt_audio_format *for
                        *channels = 2;
                if ( *frequency <= 0 )
                        *frequency = 48000;
-               if ( test_card.afmt != *format )
+               if ( test_card.audio == NULL || test_card.afmt != *format )
                {
                        test_card.afmt = *format;
                        test_card.audio = realloc( test_card.audio, *samples * *channels * sizeof( int16_t ) );
@@ -701,7 +701,7 @@ int mlt_frame_mix_audio( mlt_frame this, mlt_frame that, float weight, int16_t *
        int ret = 0;
        int16_t *p_src, *p_dest;
        int16_t *src, *dest;
-       static int16_t *extra_src = NULL, *extra_dest = NULL;
+       //static int16_t *extra_src = NULL, *extra_dest = NULL;
        static int extra_src_samples = 0, extra_dest_samples = 0;
        int frequency_src = 0, frequency_dest = 0;
        int channels_src = 0, channels_dest = 0;
index 7daa7c9..1ed7603 100644 (file)
@@ -432,7 +432,7 @@ int mlt_playlist_append_io( mlt_playlist this, mlt_producer producer, double in,
        {
                int64_t fin = mlt_producer_frame_position( producer, in );
                int64_t fout = mlt_producer_frame_position( producer, out );
-               return mlt_playlist_virtual_append( this, producer, 0, fout - fin );
+               return mlt_playlist_virtual_append( this, producer, fin, fout );
        }
        else
        {
index 5fd647a..38e0d13 100644 (file)
@@ -6,44 +6,7 @@
 
 #include "io.h"
 
-mlt_producer create_producer( char *file )
-{
-       mlt_producer result = NULL;
-
-       // 1st Line preferences
-       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, ".txt" ) )
-               result = mlt_factory_producer( "pango", 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( "ffmpeg", file );
-
-       return result;
-}
-
-void transport_action( mlt_producer producer, char *value )
+static void transport_action( mlt_producer producer, char *value )
 {
        mlt_properties properties = mlt_producer_properties( producer );
        mlt_multitrack multitrack = mlt_properties_get_data( properties, "multitrack", NULL );
@@ -75,6 +38,7 @@ void transport_action( mlt_producer producer, char *value )
                                mlt_producer_set_speed( producer, 0 );
                                break;
                        case '6':
+                       case ' ':
                                mlt_producer_set_speed( producer, 1 );
                                break;
                        case '7':
@@ -86,32 +50,50 @@ void transport_action( mlt_producer producer, char *value )
                        case '9':
                                mlt_producer_set_speed( producer, 10 );
                                break;
+                       case 'g':
+                               if ( multitrack != NULL )
+                               {
+                                       mlt_timecode time = mlt_multitrack_clip( multitrack, mlt_whence_relative_current, 0 );
+                                       mlt_producer_seek( producer, time );
+                               }
+                               break;
+                       case 'h':
+                               if ( multitrack != NULL )
+                               {
+                                       mlt_producer producer = mlt_multitrack_producer( multitrack );
+                                       int64_t position = mlt_producer_frame_position( producer, mlt_producer_position( producer ) );
+                                       mlt_producer_set_speed( producer, 0 );
+                                       mlt_producer_seek_frame( producer, position - 1 >= 0 ? position - 1 : 0 );
+                               }
+                               break;
                        case 'j':
                                if ( multitrack != NULL )
                                {
-                                       mlt_timecode time = mlt_multitrack_clip( multitrack, mlt_whence_relative_current, -1 );
+                                       mlt_timecode time = mlt_multitrack_clip( multitrack, mlt_whence_relative_current, 1 );
                                        mlt_producer_seek( producer, time );
                                }
                                break;
                        case 'k':
                                if ( multitrack != NULL )
                                {
-                                       mlt_timecode time = mlt_multitrack_clip( multitrack, mlt_whence_relative_current, 0 );
+                                       mlt_timecode time = mlt_multitrack_clip( multitrack, mlt_whence_relative_current, -1 );
                                        mlt_producer_seek( producer, time );
                                }
                                break;
                        case 'l':
                                if ( multitrack != NULL )
                                {
-                                       mlt_timecode time = mlt_multitrack_clip( multitrack, mlt_whence_relative_current, 1 );
-                                       mlt_producer_seek( producer, time );
+                                       mlt_producer producer = mlt_multitrack_producer( multitrack );
+                                       int64_t position = mlt_producer_frame_position( producer, mlt_producer_position( producer ) );
+                                       mlt_producer_set_speed( producer, 0 );
+                                       mlt_producer_seek_frame( producer, position + 1 );
                                }
                                break;
                }
        }
 }
 
-mlt_consumer create_consumer( char *id, mlt_producer producer )
+static mlt_consumer create_consumer( char *id, mlt_producer producer )
 {
        char *arg = strchr( id, ':' );
        if ( arg != NULL )
@@ -126,49 +108,7 @@ mlt_consumer create_consumer( char *id, mlt_producer producer )
        return consumer;
 }
 
-void track_service( mlt_field field, void *service, mlt_destructor destructor )
-{
-       mlt_properties properties = mlt_field_properties( field );
-       int registered = mlt_properties_get_int( properties, "registered" );
-       char *key = mlt_properties_get( properties, "registered" );
-       mlt_properties_set_data( properties, key, service, 0, destructor, NULL );
-       mlt_properties_set_int( properties, "registered", ++ registered );
-}
-
-mlt_filter create_filter( mlt_field field, char *id, int track )
-{
-       char *arg = strchr( id, ':' );
-       if ( arg != NULL )
-               *arg ++ = '\0';
-       mlt_filter filter = mlt_factory_filter( id, arg );
-       if ( filter != NULL )
-       {
-               mlt_field_plant_filter( field, filter, track );
-               track_service( field, filter, ( mlt_destructor )mlt_filter_close );
-       }
-       return filter;
-}
-
-mlt_transition create_transition( mlt_field field, char *id, int track )
-{
-       char *arg = strchr( id, ':' );
-       if ( arg != NULL )
-               *arg ++ = '\0';
-       mlt_transition transition = mlt_factory_transition( id, arg );
-       if ( transition != NULL )
-       {
-               mlt_field_plant_transition( field, transition, track, track + 1 );
-               track_service( field, transition, ( mlt_destructor )mlt_transition_close );
-       }
-       return transition;
-}
-
-void set_properties( mlt_properties properties, char *namevalue )
-{
-       mlt_properties_parse( properties, namevalue );
-}
-
-void transport( mlt_producer producer )
+static void transport( mlt_producer producer )
 {
        mlt_properties properties = mlt_producer_properties( producer );
 
@@ -179,8 +119,9 @@ void transport( mlt_producer producer )
        fprintf( stderr, "+-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+\n" );
 
        fprintf( stderr, "+---------------------------------------------------------------------+\n" );
-       fprintf( stderr, "|             j = previous, k = restart current, l = next             |\n" );
-       fprintf( stderr, "|                       0 = restart, q = quit                         |\n" );
+       fprintf( stderr, "|                      h = previous,  l = next                        |\n" );
+       fprintf( stderr, "|           g = start of clip, j = next clip, k = previous clip       |\n" );
+       fprintf( stderr, "|                0 = restart, q = quit, space = play                  |\n" );
        fprintf( stderr, "+---------------------------------------------------------------------+\n" );
 
        while( mlt_properties_get_int( properties, "done" ) == 0 )
@@ -194,125 +135,93 @@ void transport( mlt_producer producer )
 int main( int argc, char **argv )
 {
        int i;
-       int track = 0;
        mlt_consumer consumer = NULL;
-       mlt_producer producer = NULL;
-       mlt_playlist playlist = mlt_playlist_init( );
-       mlt_properties group = mlt_properties_new( );
-       mlt_properties properties = group;
-       mlt_field field = mlt_field_init( );
-       mlt_properties field_properties = mlt_field_properties( field );
-       mlt_multitrack multitrack = mlt_field_multitrack( field );
+       mlt_producer inigo = NULL;
+       FILE *store = NULL;
+       char *name = NULL;
 
        // Construct the factory
        mlt_factory_init( getenv( "MLT_REPOSITORY" ) );
 
-       // We need to track the number of registered filters
-       mlt_properties_set_int( field_properties, "registered", 0 );
-
-       // Parse the arguments
        for ( i = 1; i < argc; i ++ )
        {
-               if ( !strcmp( argv[ i ], "-consumer" ) )
+               if ( !strcmp( argv[ i ], "-serialise" ) )
                {
-                       consumer = create_consumer( argv[ ++ i ], mlt_multitrack_producer( multitrack ) );
-                       if ( consumer != NULL )
-                       {
-                               properties = mlt_consumer_properties( consumer );
-                               mlt_properties_inherit( properties, group );
-                       }
+                       name = argv[ ++ i ];
+                       if ( strstr( name, ".inigo" ) )
+                               store = fopen( name, "w" );
                }
-               else if ( !strcmp( argv[ i ], "-group" ) )
-               {
-                       if ( mlt_properties_count( group ) != 0 )
-                       {
-                               mlt_properties_close( group );
-                               group = mlt_properties_new( );
-                       }
-                       if ( group != NULL )
-                               properties = group;
-               }
-               else if ( !strcmp( argv[ i ], "-filter" ) )
+       }
+
+       // Get inigo producer
+       inigo = mlt_factory_producer( "inigo", &argv[ 1 ] );
+
+       if ( inigo != NULL && mlt_producer_get_length( inigo ) > 0 )
+       {
+               // Get inigo's properties
+               mlt_properties inigo_props = mlt_producer_properties( inigo );
+
+               // Get the field service from inigo
+               mlt_field field = mlt_properties_get_data( inigo_props, "field", 0 );
+
+               // Get the last group
+               mlt_properties group = mlt_properties_get_data( inigo_props, "group", 0 );
+
+               // Parse the arguments
+               for ( i = 1; i < argc; i ++ )
                {
-                       mlt_filter filter = create_filter( field, argv[ ++ i ], track );
-                       if ( filter != NULL )
+                       if ( !strcmp( argv[ i ], "-serialise" ) )
                        {
-                               properties = mlt_filter_properties( filter );
-                               mlt_properties_inherit( properties, group );
+                               i ++;
                        }
-               }
-               else if ( !strcmp( argv[ i ], "-transition" ) )
-               {
-                       mlt_transition transition = create_transition( field, argv[ ++ i ], track );
-                       if ( transition != NULL )
+                       else if ( !strcmp( argv[ i ], "-consumer" ) )
                        {
-                               properties = mlt_transition_properties( transition );
-                               mlt_properties_inherit( properties, group );
+                               consumer = create_consumer( argv[ ++ i ], inigo );
+                               while ( strstr( argv[ ++ i ], "=" ) )
+                                       mlt_properties_parse( group, argv[ i ] );
+                               i --;
                        }
-               }
-               else if ( !strcmp( argv[ i ], "-blank" ) )
-               {
-                       if ( producer != NULL )
-                               mlt_playlist_append( playlist, producer );
-                       producer = NULL;
-                       mlt_playlist_blank( playlist, atof( argv[ ++ i ] ) );
-               }
-               else if ( !strcmp( argv[ i ], "-track" ) )
-               {
-                       if ( producer != NULL )
-                               mlt_playlist_append( playlist, producer );
-                       producer = NULL;
-                       mlt_multitrack_connect( multitrack, mlt_playlist_producer( playlist ), track ++ );
-                       playlist = mlt_playlist_init( );
-               }
-               else if ( !strstr( argv[ i ], "=" ) )
-               {
-                       if ( producer != NULL )
-                               mlt_playlist_append( playlist, producer );
-                       producer = create_producer( argv[ i ] );
-                       if ( producer != NULL )
+                       else
                        {
-                               properties = mlt_producer_properties( producer );
-                               mlt_properties_inherit( properties, group );
+                               if ( store != NULL )
+                                       fprintf( store, "%s\n", argv[ i ] );
+                               while ( argv[ i ] != NULL && argv[ i ][ 0 ] != '-' )
+                               {
+                                       i ++;
+                                       if ( store != NULL && argv[ i ] != NULL && argv[ i ][ 0 ] != '-' )
+                                               fprintf( store, "%s\n", argv[ i ] );
+                               }
+                               i --;
                        }
                }
-               else
-               {
-                       set_properties( properties, argv[ i ] );
-               }
-       }
-
-       // Connect producer to playlist
-       if ( producer != NULL )
-               mlt_playlist_append( playlist, producer );
 
-
-       // We must have a producer at this point
-       if ( mlt_playlist_count( playlist ) > 0 )
-       {
                // If we have no consumer, default to sdl
-               if ( consumer == NULL )
+               if ( store == NULL && consumer == NULL )
+                       consumer = create_consumer( "sdl", inigo );
+
+               if ( consumer != NULL && store == NULL )
                {
-                       consumer = create_consumer( "sdl", mlt_multitrack_producer( multitrack ) );
-                       if ( consumer != NULL )
-                       {
-                               properties = mlt_consumer_properties( consumer );
-                               mlt_properties_inherit( properties, group );
-                       }
+                       // Apply group settings
+                       mlt_properties properties = mlt_consumer_properties( consumer );
+                       mlt_properties_inherit( properties, group );
+
+                       // Connect consumer to tractor
+                       mlt_consumer_connect( consumer, mlt_field_service( field ) );
+
+                       // Transport functionality
+                       transport( inigo );
+                       
+                       // Close the consumer
+                       mlt_consumer_close( consumer );
+               }
+               else if ( store != NULL )
+               {
+                       fprintf( stderr, "Project saved as %s.\n", name );
+                       fclose( store );
                }
 
-               // Connect multitrack to producer
-               mlt_multitrack_connect( multitrack, mlt_playlist_producer( playlist ), track );
-
-               // Connect consumer to tractor
-               mlt_consumer_connect( consumer, mlt_field_service( field ) );
-
-               // Transport functionality
-               transport( mlt_multitrack_producer( multitrack ) );
-
-               // Close the services
-               mlt_consumer_close( consumer );
-               mlt_producer_close( producer );
+               // Close the producer
+               mlt_producer_close( inigo );
        }
        else
        {
@@ -324,12 +233,6 @@ int main( int argc, char **argv )
                                         "             [ producer [ name=value ] * ]+\n" );
        }
 
-       // Close the field
-       mlt_field_close( field );
-
-       // Close the group
-       mlt_properties_close( group );
-
        // Close the factory
        mlt_factory_close( );
 
index aa81efc..479ed71 100644 (file)
@@ -140,7 +140,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 );
index 4ed8429..2179c42 100644 (file)
@@ -1,4 +1,4 @@
-SUBDIRS = core gtk2 dv sdl mainconcept bluefish ffmpeg
+SUBDIRS = core gtk2 dv sdl mainconcept bluefish ffmpeg inigo
 
 all clean depend install:
        list='$(SUBDIRS)'; \
index 662b1e4..9233bb3 100644 (file)
@@ -30,6 +30,7 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <unistd.h>
+#include <sys/stat.h>
 
 typedef struct producer_ffmpeg_s *producer_ffmpeg;
 
@@ -160,6 +161,8 @@ mlt_producer producer_ffmpeg_init( char *file )
        producer_ffmpeg this = calloc( sizeof( struct producer_ffmpeg_s ), 1 );
        if ( file != NULL && this != NULL && mlt_producer_init( &this->parent, this ) == 0 )
        {
+               int usable = 1;
+
                // Get the producer
                mlt_producer producer = &this->parent;
 
@@ -183,6 +186,9 @@ mlt_producer producer_ffmpeg_init( char *file )
                }
                else
                {
+                       struct stat buf;
+                       if ( stat( file, &buf ) != 0 || !S_ISREG( buf.st_mode ) )
+                               usable = 0;
                        mlt_properties_set( properties, "video_type", "file" );
                        mlt_properties_set( properties, "video_file", file );
                        mlt_properties_set( properties, "video_size", "" );
@@ -199,6 +205,12 @@ mlt_producer producer_ffmpeg_init( char *file )
 
                this->buffer = malloc( 1024 * 1024 * 2 );
 
+               if ( !usable )
+               {
+                       mlt_producer_close( &this->parent );
+                       producer = NULL;
+               }
+
                return producer;
        }
        free( this );
diff --git a/mlt/src/modules/inigo/Makefile b/mlt/src/modules/inigo/Makefile
new file mode 100644 (file)
index 0000000..c52ae1d
--- /dev/null
@@ -0,0 +1,27 @@
+
+TARGET = ../libinigo.so
+
+OBJS = factory.o \
+          producer_inigo.o 
+
+CFLAGS = -I../../ -Wall -g -D_FILE_OFFSET_BITS=64 -pthread
+
+SRCS := $(OBJS:.o=.c)
+
+all:   $(TARGET)
+
+$(TARGET): $(OBJS)
+               $(CC) -shared -o $@ $(OBJS) $(LDFLAGS)
+
+depend:        $(SRCS)
+               $(CC) -MM $(CFLAGS) $^ 1>.depend
+
+dist-clean:    clean
+               rm -f .depend
+
+clean: 
+               rm -f $(OBJS) $(TARGET) 
+
+ifneq ($(wildcard .depend),)
+include .depend
+endif
diff --git a/mlt/src/modules/inigo/configure b/mlt/src/modules/inigo/configure
new file mode 100755 (executable)
index 0000000..617ee0a
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+if [ "$help" != "1" ]
+then
+
+cat << EOF >> ../producers.dat
+inigo                  libinigo.so
+EOF
+
+fi
+
diff --git a/mlt/src/modules/inigo/factory.c b/mlt/src/modules/inigo/factory.c
new file mode 100644 (file)
index 0000000..29320a8
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * factory.c -- the factory method interfaces
+ * Copyright (C) 2003-2004 Ushodaya Enterprises Limited
+ * Author: Charles Yates <charles.yates@pandora.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <string.h>
+
+#include "producer_inigo.h"
+
+void *mlt_create_producer( char *id, void *arg )
+{
+       if ( !strcmp( id, "inigo" ) )
+               return producer_inigo_init( arg );
+       return NULL;
+}
+
+void *mlt_create_filter( char *id, void *arg )
+{
+       return NULL;
+}
+
+void *mlt_create_transition( char *id, void *arg )
+{
+       return NULL;
+}
+
+void *mlt_create_consumer( char *id, void *arg )
+{
+       return NULL;
+}
+
diff --git a/mlt/src/modules/inigo/producer_inigo.c b/mlt/src/modules/inigo/producer_inigo.c
new file mode 100644 (file)
index 0000000..a3dbc10
--- /dev/null
@@ -0,0 +1,248 @@
+/*
+ * producer_inigo.c -- simple inigo test case
+ * Copyright (C) 2003-2004 Ushodaya Enterprises Limited
+ * Author: Charles Yates <charles.yates@pandora.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "producer_inigo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <framework/mlt.h>
+
+static mlt_producer parse_inigo( char *file )
+{
+       FILE *input = fopen( file, "r" );
+       char **args = calloc( sizeof( char * ), 1000 );
+       int count = 0;
+       char temp[ 2048 ];
+
+       if ( input != NULL )
+       {
+               while( fgets( temp, 2048, input ) )
+               {
+                       temp[ strlen( temp ) - 1 ] = '\0';
+                       if ( strcmp( temp, "" ) )
+                               args[ count ++ ] = strdup( temp );
+               }
+       }
+
+       mlt_producer result = producer_inigo_init( args );
+       if ( result != NULL )
+       {
+               mlt_properties properties = mlt_producer_properties( result );
+               mlt_field field = mlt_properties_get_data( properties, "field", NULL );
+               mlt_properties_set( properties, "resource", file );
+               mlt_properties_set( mlt_field_properties( field ), "resource", file );
+       }
+
+       while( count -- )
+               free( args[ count ] );
+       free( args );
+
+       return result;
+}
+
+static mlt_producer create_producer( char *file )
+{
+       mlt_producer result = NULL;
+
+       // 1st Line preferences
+       if ( strstr( file, ".inigo" ) )
+               result = parse_inigo( 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, ".txt" ) )
+               result = mlt_factory_producer( "pango", 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( "ffmpeg", file );
+
+       return result;
+}
+
+static void track_service( mlt_field field, void *service, mlt_destructor destructor )
+{
+       mlt_properties properties = mlt_field_properties( field );
+       int registered = mlt_properties_get_int( properties, "registered" );
+       char *key = mlt_properties_get( properties, "registered" );
+       mlt_properties_set_data( properties, key, service, 0, destructor, NULL );
+       mlt_properties_set_int( properties, "registered", ++ registered );
+}
+
+static mlt_filter create_filter( mlt_field field, char *id, int track )
+{
+       char *arg = strchr( id, ':' );
+       if ( arg != NULL )
+               *arg ++ = '\0';
+       mlt_filter filter = mlt_factory_filter( id, arg );
+       if ( filter != NULL )
+       {
+               mlt_field_plant_filter( field, filter, track );
+               track_service( field, filter, ( mlt_destructor )mlt_filter_close );
+       }
+       return filter;
+}
+
+static mlt_transition create_transition( mlt_field field, char *id, int track )
+{
+       char *arg = strchr( id, ':' );
+       if ( arg != NULL )
+               *arg ++ = '\0';
+       mlt_transition transition = mlt_factory_transition( id, arg );
+       if ( transition != NULL )
+       {
+               mlt_field_plant_transition( field, transition, track, track + 1 );
+               track_service( field, transition, ( mlt_destructor )mlt_transition_close );
+       }
+       return transition;
+}
+
+static void set_properties( mlt_properties properties, char *namevalue )
+{
+       mlt_properties_parse( properties, namevalue );
+}
+
+mlt_producer producer_inigo_init( char **argv )
+{
+       int i;
+       int track = 0;
+       mlt_producer producer = NULL;
+       mlt_playlist playlist = mlt_playlist_init( );
+       mlt_properties group = mlt_properties_new( );
+       mlt_properties properties = group;
+       mlt_field field = mlt_field_init( );
+       mlt_properties field_properties = mlt_field_properties( field );
+       mlt_multitrack multitrack = mlt_field_multitrack( field );
+
+       // We need to track the number of registered filters
+       mlt_properties_set_int( field_properties, "registered", 0 );
+
+       // Parse the arguments
+       for ( i = 0; argv[ i ] != NULL; i ++ )
+       {
+               if ( !strcmp( argv[ i ], "-serialise" ) )
+               {
+                       i ++;
+               }
+               else if ( !strcmp( argv[ i ], "-group" ) )
+               {
+                       if ( mlt_properties_count( group ) != 0 )
+                       {
+                               mlt_properties_close( group );
+                               group = mlt_properties_new( );
+                       }
+                       if ( group != NULL )
+                               properties = group;
+               }
+               else if ( !strcmp( argv[ i ], "-filter" ) )
+               {
+                       mlt_filter filter = create_filter( field, argv[ ++ i ], track );
+                       if ( filter != NULL )
+                       {
+                               properties = mlt_filter_properties( filter );
+                               mlt_properties_inherit( properties, group );
+                       }
+               }
+               else if ( !strcmp( argv[ i ], "-transition" ) )
+               {
+                       mlt_transition transition = create_transition( field, argv[ ++ i ], track );
+                       if ( transition != NULL )
+                       {
+                               properties = mlt_transition_properties( transition );
+                               mlt_properties_inherit( properties, group );
+                       }
+               }
+               else if ( !strcmp( argv[ i ], "-blank" ) )
+               {
+                       if ( producer != NULL )
+                               mlt_playlist_append( playlist, producer );
+                       producer = NULL;
+                       mlt_playlist_blank( playlist, atof( argv[ ++ i ] ) );
+               }
+               else if ( !strcmp( argv[ i ], "-track" ) )
+               {
+                       if ( producer != NULL )
+                               mlt_playlist_append( playlist, producer );
+                       producer = NULL;
+                       mlt_multitrack_connect( multitrack, mlt_playlist_producer( playlist ), track ++ );
+                       playlist = mlt_playlist_init( );
+               }
+               else if ( strstr( argv[ i ], "=" ) )
+               {
+                       set_properties( properties, argv[ i ] );
+               }
+               else if ( argv[ i ][ 0 ] != '-' )
+               {
+                       if ( producer != NULL )
+                               mlt_playlist_append( playlist, producer );
+                       producer = create_producer( argv[ i ] );
+                       if ( producer != NULL )
+                       {
+                               properties = mlt_producer_properties( producer );
+                               mlt_properties_inherit( properties, group );
+                       }
+               }
+               else
+               {
+                       while ( argv[ i ] != NULL && argv[ i ][ 0 ] != '-' )
+                               i ++;
+                       i --;
+               }
+       }
+
+       // Connect producer to playlist
+       if ( producer != NULL )
+               mlt_playlist_append( playlist, producer );
+
+       // We must have a producer at this point
+       if ( mlt_playlist_count( playlist ) > 0 )
+       {
+               // Connect multitrack to producer
+               mlt_multitrack_connect( multitrack, mlt_playlist_producer( playlist ), track );
+       }
+
+       mlt_properties props = mlt_multitrack_properties( multitrack );
+       mlt_properties_set_data( props, "field", field, 0, NULL, NULL );
+       mlt_properties_set_data( props, "group", group, 0, NULL, NULL );
+
+       return mlt_multitrack_producer( multitrack );
+}
+
diff --git a/mlt/src/modules/inigo/producer_inigo.h b/mlt/src/modules/inigo/producer_inigo.h
new file mode 100644 (file)
index 0000000..be65692
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * producer_inigo.h -- simple inigo test case
+ * Copyright (C) 2003-2004 Ushodaya Enterprises Limited
+ * Author: Charles Yates <charles.yates@pandora.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _PRODUCER_INIGO_H_
+#define _PRODUCER_INIGO_H_
+
+#include <framework/mlt_producer.h>
+
+extern mlt_producer producer_inigo_init( char **args );
+
+#endif
index 943a0d1..803e96e 100644 (file)
@@ -96,6 +96,9 @@ mlt_consumer consumer_sdl_init( char *arg )
                pthread_mutex_init( &this->audio_mutex, NULL );
                pthread_cond_init( &this->audio_cond, NULL);
                
+               // Default fps
+               mlt_properties_set_double( this->properties, "fps", 25 );
+
                // process actual param
                if ( arg == NULL || !strcmp( arg, "PAL" ) )
                {
@@ -106,6 +109,7 @@ mlt_consumer consumer_sdl_init( char *arg )
                {
                        this->width = 720;
                        this->height = 480;
+                       mlt_properties_set_double( this->properties, "fps", 29.97 );
                }
                else if ( sscanf( arg, "%dx%d", &this->width, &this->height ) != 2 )
                {
@@ -204,7 +208,7 @@ static int consumer_play_audio( consumer_sdl this, mlt_frame frame, int init_aud
        int channels = 2;
        int frequency = 48000;
        static int counter = 0;
-       int samples = mlt_sample_calculator( ( this->height < 576 ? 29.97 : 25 ), frequency, counter++ );
+       int samples = mlt_sample_calculator( mlt_properties_get_double( this->properties, "fps" ), frequency, counter++ );
        
        int16_t *pcm;
        int bytes;
@@ -222,6 +226,8 @@ static int consumer_play_audio( consumer_sdl this, mlt_frame frame, int init_aud
                SDL_AudioSpec request;
                SDL_AudioSpec got;
 
+               SDL_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL );
+
                // specify audio format
                memset( &request, 0, sizeof( SDL_AudioSpec ) );
                this->playing = 0;
@@ -322,8 +328,10 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame )
                                                {
                                                        mlt_producer producer = mlt_properties_get_data( properties, "transport_producer", NULL );
                                                        void (*callback)( mlt_producer, char * ) = mlt_properties_get_data( properties, "transport_callback", NULL );
-                                                       if ( callback != NULL && producer != NULL )
+                                                       if ( callback != NULL && producer != NULL && strcmp( SDL_GetKeyName(event.key.keysym.sym), "space" ) )
                                                                callback( producer, SDL_GetKeyName(event.key.keysym.sym) );
+                                                       else if ( callback != NULL && producer != NULL && !strcmp( SDL_GetKeyName(event.key.keysym.sym), "space" ) )
+                                                               callback( producer, " " );
                                                }
                                                break;
                                }
index 64ec68d..a51fb7e 100644 (file)
@@ -245,7 +245,7 @@ int mlt_frame_get_audio( mlt_frame this, int16_t **buffer, mlt_audio_format *for
                        *channels = 2;
                if ( *frequency <= 0 )
                        *frequency = 48000;
-               if ( test_card.afmt != *format )
+               if ( test_card.audio == NULL || test_card.afmt != *format )
                {
                        test_card.afmt = *format;
                        test_card.audio = realloc( test_card.audio, *samples * *channels * sizeof( int16_t ) );
@@ -701,7 +701,7 @@ int mlt_frame_mix_audio( mlt_frame this, mlt_frame that, float weight, int16_t *
        int ret = 0;
        int16_t *p_src, *p_dest;
        int16_t *src, *dest;
-       static int16_t *extra_src = NULL, *extra_dest = NULL;
+       //static int16_t *extra_src = NULL, *extra_dest = NULL;
        static int extra_src_samples = 0, extra_dest_samples = 0;
        int frequency_src = 0, frequency_dest = 0;
        int channels_src = 0, channels_dest = 0;
index 7daa7c9..1ed7603 100644 (file)
@@ -432,7 +432,7 @@ int mlt_playlist_append_io( mlt_playlist this, mlt_producer producer, double in,
        {
                int64_t fin = mlt_producer_frame_position( producer, in );
                int64_t fout = mlt_producer_frame_position( producer, out );
-               return mlt_playlist_virtual_append( this, producer, 0, fout - fin );
+               return mlt_playlist_virtual_append( this, producer, fin, fout );
        }
        else
        {
index 5fd647a..38e0d13 100644 (file)
@@ -6,44 +6,7 @@
 
 #include "io.h"
 
-mlt_producer create_producer( char *file )
-{
-       mlt_producer result = NULL;
-
-       // 1st Line preferences
-       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, ".txt" ) )
-               result = mlt_factory_producer( "pango", 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( "ffmpeg", file );
-
-       return result;
-}
-
-void transport_action( mlt_producer producer, char *value )
+static void transport_action( mlt_producer producer, char *value )
 {
        mlt_properties properties = mlt_producer_properties( producer );
        mlt_multitrack multitrack = mlt_properties_get_data( properties, "multitrack", NULL );
@@ -75,6 +38,7 @@ void transport_action( mlt_producer producer, char *value )
                                mlt_producer_set_speed( producer, 0 );
                                break;
                        case '6':
+                       case ' ':
                                mlt_producer_set_speed( producer, 1 );
                                break;
                        case '7':
@@ -86,32 +50,50 @@ void transport_action( mlt_producer producer, char *value )
                        case '9':
                                mlt_producer_set_speed( producer, 10 );
                                break;
+                       case 'g':
+                               if ( multitrack != NULL )
+                               {
+                                       mlt_timecode time = mlt_multitrack_clip( multitrack, mlt_whence_relative_current, 0 );
+                                       mlt_producer_seek( producer, time );
+                               }
+                               break;
+                       case 'h':
+                               if ( multitrack != NULL )
+                               {
+                                       mlt_producer producer = mlt_multitrack_producer( multitrack );
+                                       int64_t position = mlt_producer_frame_position( producer, mlt_producer_position( producer ) );
+                                       mlt_producer_set_speed( producer, 0 );
+                                       mlt_producer_seek_frame( producer, position - 1 >= 0 ? position - 1 : 0 );
+                               }
+                               break;
                        case 'j':
                                if ( multitrack != NULL )
                                {
-                                       mlt_timecode time = mlt_multitrack_clip( multitrack, mlt_whence_relative_current, -1 );
+                                       mlt_timecode time = mlt_multitrack_clip( multitrack, mlt_whence_relative_current, 1 );
                                        mlt_producer_seek( producer, time );
                                }
                                break;
                        case 'k':
                                if ( multitrack != NULL )
                                {
-                                       mlt_timecode time = mlt_multitrack_clip( multitrack, mlt_whence_relative_current, 0 );
+                                       mlt_timecode time = mlt_multitrack_clip( multitrack, mlt_whence_relative_current, -1 );
                                        mlt_producer_seek( producer, time );
                                }
                                break;
                        case 'l':
                                if ( multitrack != NULL )
                                {
-                                       mlt_timecode time = mlt_multitrack_clip( multitrack, mlt_whence_relative_current, 1 );
-                                       mlt_producer_seek( producer, time );
+                                       mlt_producer producer = mlt_multitrack_producer( multitrack );
+                                       int64_t position = mlt_producer_frame_position( producer, mlt_producer_position( producer ) );
+                                       mlt_producer_set_speed( producer, 0 );
+                                       mlt_producer_seek_frame( producer, position + 1 );
                                }
                                break;
                }
        }
 }
 
-mlt_consumer create_consumer( char *id, mlt_producer producer )
+static mlt_consumer create_consumer( char *id, mlt_producer producer )
 {
        char *arg = strchr( id, ':' );
        if ( arg != NULL )
@@ -126,49 +108,7 @@ mlt_consumer create_consumer( char *id, mlt_producer producer )
        return consumer;
 }
 
-void track_service( mlt_field field, void *service, mlt_destructor destructor )
-{
-       mlt_properties properties = mlt_field_properties( field );
-       int registered = mlt_properties_get_int( properties, "registered" );
-       char *key = mlt_properties_get( properties, "registered" );
-       mlt_properties_set_data( properties, key, service, 0, destructor, NULL );
-       mlt_properties_set_int( properties, "registered", ++ registered );
-}
-
-mlt_filter create_filter( mlt_field field, char *id, int track )
-{
-       char *arg = strchr( id, ':' );
-       if ( arg != NULL )
-               *arg ++ = '\0';
-       mlt_filter filter = mlt_factory_filter( id, arg );
-       if ( filter != NULL )
-       {
-               mlt_field_plant_filter( field, filter, track );
-               track_service( field, filter, ( mlt_destructor )mlt_filter_close );
-       }
-       return filter;
-}
-
-mlt_transition create_transition( mlt_field field, char *id, int track )
-{
-       char *arg = strchr( id, ':' );
-       if ( arg != NULL )
-               *arg ++ = '\0';
-       mlt_transition transition = mlt_factory_transition( id, arg );
-       if ( transition != NULL )
-       {
-               mlt_field_plant_transition( field, transition, track, track + 1 );
-               track_service( field, transition, ( mlt_destructor )mlt_transition_close );
-       }
-       return transition;
-}
-
-void set_properties( mlt_properties properties, char *namevalue )
-{
-       mlt_properties_parse( properties, namevalue );
-}
-
-void transport( mlt_producer producer )
+static void transport( mlt_producer producer )
 {
        mlt_properties properties = mlt_producer_properties( producer );
 
@@ -179,8 +119,9 @@ void transport( mlt_producer producer )
        fprintf( stderr, "+-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+\n" );
 
        fprintf( stderr, "+---------------------------------------------------------------------+\n" );
-       fprintf( stderr, "|             j = previous, k = restart current, l = next             |\n" );
-       fprintf( stderr, "|                       0 = restart, q = quit                         |\n" );
+       fprintf( stderr, "|                      h = previous,  l = next                        |\n" );
+       fprintf( stderr, "|           g = start of clip, j = next clip, k = previous clip       |\n" );
+       fprintf( stderr, "|                0 = restart, q = quit, space = play                  |\n" );
        fprintf( stderr, "+---------------------------------------------------------------------+\n" );
 
        while( mlt_properties_get_int( properties, "done" ) == 0 )
@@ -194,125 +135,93 @@ void transport( mlt_producer producer )
 int main( int argc, char **argv )
 {
        int i;
-       int track = 0;
        mlt_consumer consumer = NULL;
-       mlt_producer producer = NULL;
-       mlt_playlist playlist = mlt_playlist_init( );
-       mlt_properties group = mlt_properties_new( );
-       mlt_properties properties = group;
-       mlt_field field = mlt_field_init( );
-       mlt_properties field_properties = mlt_field_properties( field );
-       mlt_multitrack multitrack = mlt_field_multitrack( field );
+       mlt_producer inigo = NULL;
+       FILE *store = NULL;
+       char *name = NULL;
 
        // Construct the factory
        mlt_factory_init( getenv( "MLT_REPOSITORY" ) );
 
-       // We need to track the number of registered filters
-       mlt_properties_set_int( field_properties, "registered", 0 );
-
-       // Parse the arguments
        for ( i = 1; i < argc; i ++ )
        {
-               if ( !strcmp( argv[ i ], "-consumer" ) )
+               if ( !strcmp( argv[ i ], "-serialise" ) )
                {
-                       consumer = create_consumer( argv[ ++ i ], mlt_multitrack_producer( multitrack ) );
-                       if ( consumer != NULL )
-                       {
-                               properties = mlt_consumer_properties( consumer );
-                               mlt_properties_inherit( properties, group );
-                       }
+                       name = argv[ ++ i ];
+                       if ( strstr( name, ".inigo" ) )
+                               store = fopen( name, "w" );
                }
-               else if ( !strcmp( argv[ i ], "-group" ) )
-               {
-                       if ( mlt_properties_count( group ) != 0 )
-                       {
-                               mlt_properties_close( group );
-                               group = mlt_properties_new( );
-                       }
-                       if ( group != NULL )
-                               properties = group;
-               }
-               else if ( !strcmp( argv[ i ], "-filter" ) )
+       }
+
+       // Get inigo producer
+       inigo = mlt_factory_producer( "inigo", &argv[ 1 ] );
+
+       if ( inigo != NULL && mlt_producer_get_length( inigo ) > 0 )
+       {
+               // Get inigo's properties
+               mlt_properties inigo_props = mlt_producer_properties( inigo );
+
+               // Get the field service from inigo
+               mlt_field field = mlt_properties_get_data( inigo_props, "field", 0 );
+
+               // Get the last group
+               mlt_properties group = mlt_properties_get_data( inigo_props, "group", 0 );
+
+               // Parse the arguments
+               for ( i = 1; i < argc; i ++ )
                {
-                       mlt_filter filter = create_filter( field, argv[ ++ i ], track );
-                       if ( filter != NULL )
+                       if ( !strcmp( argv[ i ], "-serialise" ) )
                        {
-                               properties = mlt_filter_properties( filter );
-                               mlt_properties_inherit( properties, group );
+                               i ++;
                        }
-               }
-               else if ( !strcmp( argv[ i ], "-transition" ) )
-               {
-                       mlt_transition transition = create_transition( field, argv[ ++ i ], track );
-                       if ( transition != NULL )
+                       else if ( !strcmp( argv[ i ], "-consumer" ) )
                        {
-                               properties = mlt_transition_properties( transition );
-                               mlt_properties_inherit( properties, group );
+                               consumer = create_consumer( argv[ ++ i ], inigo );
+                               while ( strstr( argv[ ++ i ], "=" ) )
+                                       mlt_properties_parse( group, argv[ i ] );
+                               i --;
                        }
-               }
-               else if ( !strcmp( argv[ i ], "-blank" ) )
-               {
-                       if ( producer != NULL )
-                               mlt_playlist_append( playlist, producer );
-                       producer = NULL;
-                       mlt_playlist_blank( playlist, atof( argv[ ++ i ] ) );
-               }
-               else if ( !strcmp( argv[ i ], "-track" ) )
-               {
-                       if ( producer != NULL )
-                               mlt_playlist_append( playlist, producer );
-                       producer = NULL;
-                       mlt_multitrack_connect( multitrack, mlt_playlist_producer( playlist ), track ++ );
-                       playlist = mlt_playlist_init( );
-               }
-               else if ( !strstr( argv[ i ], "=" ) )
-               {
-                       if ( producer != NULL )
-                               mlt_playlist_append( playlist, producer );
-                       producer = create_producer( argv[ i ] );
-                       if ( producer != NULL )
+                       else
                        {
-                               properties = mlt_producer_properties( producer );
-                               mlt_properties_inherit( properties, group );
+                               if ( store != NULL )
+                                       fprintf( store, "%s\n", argv[ i ] );
+                               while ( argv[ i ] != NULL && argv[ i ][ 0 ] != '-' )
+                               {
+                                       i ++;
+                                       if ( store != NULL && argv[ i ] != NULL && argv[ i ][ 0 ] != '-' )
+                                               fprintf( store, "%s\n", argv[ i ] );
+                               }
+                               i --;
                        }
                }
-               else
-               {
-                       set_properties( properties, argv[ i ] );
-               }
-       }
-
-       // Connect producer to playlist
-       if ( producer != NULL )
-               mlt_playlist_append( playlist, producer );
 
-
-       // We must have a producer at this point
-       if ( mlt_playlist_count( playlist ) > 0 )
-       {
                // If we have no consumer, default to sdl
-               if ( consumer == NULL )
+               if ( store == NULL && consumer == NULL )
+                       consumer = create_consumer( "sdl", inigo );
+
+               if ( consumer != NULL && store == NULL )
                {
-                       consumer = create_consumer( "sdl", mlt_multitrack_producer( multitrack ) );
-                       if ( consumer != NULL )
-                       {
-                               properties = mlt_consumer_properties( consumer );
-                               mlt_properties_inherit( properties, group );
-                       }
+                       // Apply group settings
+                       mlt_properties properties = mlt_consumer_properties( consumer );
+                       mlt_properties_inherit( properties, group );
+
+                       // Connect consumer to tractor
+                       mlt_consumer_connect( consumer, mlt_field_service( field ) );
+
+                       // Transport functionality
+                       transport( inigo );
+                       
+                       // Close the consumer
+                       mlt_consumer_close( consumer );
+               }
+               else if ( store != NULL )
+               {
+                       fprintf( stderr, "Project saved as %s.\n", name );
+                       fclose( store );
                }
 
-               // Connect multitrack to producer
-               mlt_multitrack_connect( multitrack, mlt_playlist_producer( playlist ), track );
-
-               // Connect consumer to tractor
-               mlt_consumer_connect( consumer, mlt_field_service( field ) );
-
-               // Transport functionality
-               transport( mlt_multitrack_producer( multitrack ) );
-
-               // Close the services
-               mlt_consumer_close( consumer );
-               mlt_producer_close( producer );
+               // Close the producer
+               mlt_producer_close( inigo );
        }
        else
        {
@@ -324,12 +233,6 @@ int main( int argc, char **argv )
                                         "             [ producer [ name=value ] * ]+\n" );
        }
 
-       // Close the field
-       mlt_field_close( field );
-
-       // Close the group
-       mlt_properties_close( group );
-
        // Close the factory
        mlt_factory_close( );
 
index aa81efc..479ed71 100644 (file)
@@ -140,7 +140,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 );
index 4ed8429..2179c42 100644 (file)
@@ -1,4 +1,4 @@
-SUBDIRS = core gtk2 dv sdl mainconcept bluefish ffmpeg
+SUBDIRS = core gtk2 dv sdl mainconcept bluefish ffmpeg inigo
 
 all clean depend install:
        list='$(SUBDIRS)'; \
index 662b1e4..9233bb3 100644 (file)
@@ -30,6 +30,7 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <unistd.h>
+#include <sys/stat.h>
 
 typedef struct producer_ffmpeg_s *producer_ffmpeg;
 
@@ -160,6 +161,8 @@ mlt_producer producer_ffmpeg_init( char *file )
        producer_ffmpeg this = calloc( sizeof( struct producer_ffmpeg_s ), 1 );
        if ( file != NULL && this != NULL && mlt_producer_init( &this->parent, this ) == 0 )
        {
+               int usable = 1;
+
                // Get the producer
                mlt_producer producer = &this->parent;
 
@@ -183,6 +186,9 @@ mlt_producer producer_ffmpeg_init( char *file )
                }
                else
                {
+                       struct stat buf;
+                       if ( stat( file, &buf ) != 0 || !S_ISREG( buf.st_mode ) )
+                               usable = 0;
                        mlt_properties_set( properties, "video_type", "file" );
                        mlt_properties_set( properties, "video_file", file );
                        mlt_properties_set( properties, "video_size", "" );
@@ -199,6 +205,12 @@ mlt_producer producer_ffmpeg_init( char *file )
 
                this->buffer = malloc( 1024 * 1024 * 2 );
 
+               if ( !usable )
+               {
+                       mlt_producer_close( &this->parent );
+                       producer = NULL;
+               }
+
                return producer;
        }
        free( this );
diff --git a/src/modules/inigo/Makefile b/src/modules/inigo/Makefile
new file mode 100644 (file)
index 0000000..c52ae1d
--- /dev/null
@@ -0,0 +1,27 @@
+
+TARGET = ../libinigo.so
+
+OBJS = factory.o \
+          producer_inigo.o 
+
+CFLAGS = -I../../ -Wall -g -D_FILE_OFFSET_BITS=64 -pthread
+
+SRCS := $(OBJS:.o=.c)
+
+all:   $(TARGET)
+
+$(TARGET): $(OBJS)
+               $(CC) -shared -o $@ $(OBJS) $(LDFLAGS)
+
+depend:        $(SRCS)
+               $(CC) -MM $(CFLAGS) $^ 1>.depend
+
+dist-clean:    clean
+               rm -f .depend
+
+clean: 
+               rm -f $(OBJS) $(TARGET) 
+
+ifneq ($(wildcard .depend),)
+include .depend
+endif
diff --git a/src/modules/inigo/configure b/src/modules/inigo/configure
new file mode 100755 (executable)
index 0000000..617ee0a
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+if [ "$help" != "1" ]
+then
+
+cat << EOF >> ../producers.dat
+inigo                  libinigo.so
+EOF
+
+fi
+
diff --git a/src/modules/inigo/factory.c b/src/modules/inigo/factory.c
new file mode 100644 (file)
index 0000000..29320a8
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * factory.c -- the factory method interfaces
+ * Copyright (C) 2003-2004 Ushodaya Enterprises Limited
+ * Author: Charles Yates <charles.yates@pandora.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <string.h>
+
+#include "producer_inigo.h"
+
+void *mlt_create_producer( char *id, void *arg )
+{
+       if ( !strcmp( id, "inigo" ) )
+               return producer_inigo_init( arg );
+       return NULL;
+}
+
+void *mlt_create_filter( char *id, void *arg )
+{
+       return NULL;
+}
+
+void *mlt_create_transition( char *id, void *arg )
+{
+       return NULL;
+}
+
+void *mlt_create_consumer( char *id, void *arg )
+{
+       return NULL;
+}
+
diff --git a/src/modules/inigo/producer_inigo.c b/src/modules/inigo/producer_inigo.c
new file mode 100644 (file)
index 0000000..a3dbc10
--- /dev/null
@@ -0,0 +1,248 @@
+/*
+ * producer_inigo.c -- simple inigo test case
+ * Copyright (C) 2003-2004 Ushodaya Enterprises Limited
+ * Author: Charles Yates <charles.yates@pandora.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "producer_inigo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <framework/mlt.h>
+
+static mlt_producer parse_inigo( char *file )
+{
+       FILE *input = fopen( file, "r" );
+       char **args = calloc( sizeof( char * ), 1000 );
+       int count = 0;
+       char temp[ 2048 ];
+
+       if ( input != NULL )
+       {
+               while( fgets( temp, 2048, input ) )
+               {
+                       temp[ strlen( temp ) - 1 ] = '\0';
+                       if ( strcmp( temp, "" ) )
+                               args[ count ++ ] = strdup( temp );
+               }
+       }
+
+       mlt_producer result = producer_inigo_init( args );
+       if ( result != NULL )
+       {
+               mlt_properties properties = mlt_producer_properties( result );
+               mlt_field field = mlt_properties_get_data( properties, "field", NULL );
+               mlt_properties_set( properties, "resource", file );
+               mlt_properties_set( mlt_field_properties( field ), "resource", file );
+       }
+
+       while( count -- )
+               free( args[ count ] );
+       free( args );
+
+       return result;
+}
+
+static mlt_producer create_producer( char *file )
+{
+       mlt_producer result = NULL;
+
+       // 1st Line preferences
+       if ( strstr( file, ".inigo" ) )
+               result = parse_inigo( 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, ".txt" ) )
+               result = mlt_factory_producer( "pango", 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( "ffmpeg", file );
+
+       return result;
+}
+
+static void track_service( mlt_field field, void *service, mlt_destructor destructor )
+{
+       mlt_properties properties = mlt_field_properties( field );
+       int registered = mlt_properties_get_int( properties, "registered" );
+       char *key = mlt_properties_get( properties, "registered" );
+       mlt_properties_set_data( properties, key, service, 0, destructor, NULL );
+       mlt_properties_set_int( properties, "registered", ++ registered );
+}
+
+static mlt_filter create_filter( mlt_field field, char *id, int track )
+{
+       char *arg = strchr( id, ':' );
+       if ( arg != NULL )
+               *arg ++ = '\0';
+       mlt_filter filter = mlt_factory_filter( id, arg );
+       if ( filter != NULL )
+       {
+               mlt_field_plant_filter( field, filter, track );
+               track_service( field, filter, ( mlt_destructor )mlt_filter_close );
+       }
+       return filter;
+}
+
+static mlt_transition create_transition( mlt_field field, char *id, int track )
+{
+       char *arg = strchr( id, ':' );
+       if ( arg != NULL )
+               *arg ++ = '\0';
+       mlt_transition transition = mlt_factory_transition( id, arg );
+       if ( transition != NULL )
+       {
+               mlt_field_plant_transition( field, transition, track, track + 1 );
+               track_service( field, transition, ( mlt_destructor )mlt_transition_close );
+       }
+       return transition;
+}
+
+static void set_properties( mlt_properties properties, char *namevalue )
+{
+       mlt_properties_parse( properties, namevalue );
+}
+
+mlt_producer producer_inigo_init( char **argv )
+{
+       int i;
+       int track = 0;
+       mlt_producer producer = NULL;
+       mlt_playlist playlist = mlt_playlist_init( );
+       mlt_properties group = mlt_properties_new( );
+       mlt_properties properties = group;
+       mlt_field field = mlt_field_init( );
+       mlt_properties field_properties = mlt_field_properties( field );
+       mlt_multitrack multitrack = mlt_field_multitrack( field );
+
+       // We need to track the number of registered filters
+       mlt_properties_set_int( field_properties, "registered", 0 );
+
+       // Parse the arguments
+       for ( i = 0; argv[ i ] != NULL; i ++ )
+       {
+               if ( !strcmp( argv[ i ], "-serialise" ) )
+               {
+                       i ++;
+               }
+               else if ( !strcmp( argv[ i ], "-group" ) )
+               {
+                       if ( mlt_properties_count( group ) != 0 )
+                       {
+                               mlt_properties_close( group );
+                               group = mlt_properties_new( );
+                       }
+                       if ( group != NULL )
+                               properties = group;
+               }
+               else if ( !strcmp( argv[ i ], "-filter" ) )
+               {
+                       mlt_filter filter = create_filter( field, argv[ ++ i ], track );
+                       if ( filter != NULL )
+                       {
+                               properties = mlt_filter_properties( filter );
+                               mlt_properties_inherit( properties, group );
+                       }
+               }
+               else if ( !strcmp( argv[ i ], "-transition" ) )
+               {
+                       mlt_transition transition = create_transition( field, argv[ ++ i ], track );
+                       if ( transition != NULL )
+                       {
+                               properties = mlt_transition_properties( transition );
+                               mlt_properties_inherit( properties, group );
+                       }
+               }
+               else if ( !strcmp( argv[ i ], "-blank" ) )
+               {
+                       if ( producer != NULL )
+                               mlt_playlist_append( playlist, producer );
+                       producer = NULL;
+                       mlt_playlist_blank( playlist, atof( argv[ ++ i ] ) );
+               }
+               else if ( !strcmp( argv[ i ], "-track" ) )
+               {
+                       if ( producer != NULL )
+                               mlt_playlist_append( playlist, producer );
+                       producer = NULL;
+                       mlt_multitrack_connect( multitrack, mlt_playlist_producer( playlist ), track ++ );
+                       playlist = mlt_playlist_init( );
+               }
+               else if ( strstr( argv[ i ], "=" ) )
+               {
+                       set_properties( properties, argv[ i ] );
+               }
+               else if ( argv[ i ][ 0 ] != '-' )
+               {
+                       if ( producer != NULL )
+                               mlt_playlist_append( playlist, producer );
+                       producer = create_producer( argv[ i ] );
+                       if ( producer != NULL )
+                       {
+                               properties = mlt_producer_properties( producer );
+                               mlt_properties_inherit( properties, group );
+                       }
+               }
+               else
+               {
+                       while ( argv[ i ] != NULL && argv[ i ][ 0 ] != '-' )
+                               i ++;
+                       i --;
+               }
+       }
+
+       // Connect producer to playlist
+       if ( producer != NULL )
+               mlt_playlist_append( playlist, producer );
+
+       // We must have a producer at this point
+       if ( mlt_playlist_count( playlist ) > 0 )
+       {
+               // Connect multitrack to producer
+               mlt_multitrack_connect( multitrack, mlt_playlist_producer( playlist ), track );
+       }
+
+       mlt_properties props = mlt_multitrack_properties( multitrack );
+       mlt_properties_set_data( props, "field", field, 0, NULL, NULL );
+       mlt_properties_set_data( props, "group", group, 0, NULL, NULL );
+
+       return mlt_multitrack_producer( multitrack );
+}
+
diff --git a/src/modules/inigo/producer_inigo.h b/src/modules/inigo/producer_inigo.h
new file mode 100644 (file)
index 0000000..be65692
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * producer_inigo.h -- simple inigo test case
+ * Copyright (C) 2003-2004 Ushodaya Enterprises Limited
+ * Author: Charles Yates <charles.yates@pandora.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _PRODUCER_INIGO_H_
+#define _PRODUCER_INIGO_H_
+
+#include <framework/mlt_producer.h>
+
+extern mlt_producer producer_inigo_init( char **args );
+
+#endif
index 943a0d1..803e96e 100644 (file)
@@ -96,6 +96,9 @@ mlt_consumer consumer_sdl_init( char *arg )
                pthread_mutex_init( &this->audio_mutex, NULL );
                pthread_cond_init( &this->audio_cond, NULL);
                
+               // Default fps
+               mlt_properties_set_double( this->properties, "fps", 25 );
+
                // process actual param
                if ( arg == NULL || !strcmp( arg, "PAL" ) )
                {
@@ -106,6 +109,7 @@ mlt_consumer consumer_sdl_init( char *arg )
                {
                        this->width = 720;
                        this->height = 480;
+                       mlt_properties_set_double( this->properties, "fps", 29.97 );
                }
                else if ( sscanf( arg, "%dx%d", &this->width, &this->height ) != 2 )
                {
@@ -204,7 +208,7 @@ static int consumer_play_audio( consumer_sdl this, mlt_frame frame, int init_aud
        int channels = 2;
        int frequency = 48000;
        static int counter = 0;
-       int samples = mlt_sample_calculator( ( this->height < 576 ? 29.97 : 25 ), frequency, counter++ );
+       int samples = mlt_sample_calculator( mlt_properties_get_double( this->properties, "fps" ), frequency, counter++ );
        
        int16_t *pcm;
        int bytes;
@@ -222,6 +226,8 @@ static int consumer_play_audio( consumer_sdl this, mlt_frame frame, int init_aud
                SDL_AudioSpec request;
                SDL_AudioSpec got;
 
+               SDL_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL );
+
                // specify audio format
                memset( &request, 0, sizeof( SDL_AudioSpec ) );
                this->playing = 0;
@@ -322,8 +328,10 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame )
                                                {
                                                        mlt_producer producer = mlt_properties_get_data( properties, "transport_producer", NULL );
                                                        void (*callback)( mlt_producer, char * ) = mlt_properties_get_data( properties, "transport_callback", NULL );
-                                                       if ( callback != NULL && producer != NULL )
+                                                       if ( callback != NULL && producer != NULL && strcmp( SDL_GetKeyName(event.key.keysym.sym), "space" ) )
                                                                callback( producer, SDL_GetKeyName(event.key.keysym.sym) );
+                                                       else if ( callback != NULL && producer != NULL && !strcmp( SDL_GetKeyName(event.key.keysym.sym), "space" ) )
+                                                               callback( producer, " " );
                                                }
                                                break;
                                }