From cc8b6005abe30b5f0816b5aa6b87aa6867275228 Mon Sep 17 00:00:00 2001 From: lilo_booter Date: Mon, 12 Jan 2004 11:16:10 +0000 Subject: [PATCH] inigo rewrite, producer, serialise and deserialise git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@62 d19143bc-622f-0410-bfdd-b5b2a6649095 --- docs/services.txt | 5 +- docs/testing-20040110.txt | 23 ++- mlt/docs/services.txt | 5 +- mlt/docs/testing-20040110.txt | 23 ++- mlt/src/framework/mlt_frame.c | 4 +- mlt/src/framework/mlt_playlist.c | 2 +- mlt/src/inigo/inigo.c | 285 ++++++++++-------------------- mlt/src/miracle/miracle_unit.c | 7 +- mlt/src/modules/Makefile | 2 +- mlt/src/modules/ffmpeg/producer_ffmpeg.c | 12 ++ mlt/src/modules/inigo/Makefile | 27 +++ mlt/src/modules/inigo/configure | 11 ++ mlt/src/modules/inigo/factory.c | 46 +++++ mlt/src/modules/inigo/producer_inigo.c | 248 ++++++++++++++++++++++++++ mlt/src/modules/inigo/producer_inigo.h | 28 +++ mlt/src/modules/sdl/consumer_sdl.c | 12 +- src/framework/mlt_frame.c | 4 +- src/framework/mlt_playlist.c | 2 +- src/inigo/inigo.c | 285 ++++++++++-------------------- src/miracle/miracle_unit.c | 7 +- src/modules/Makefile | 2 +- src/modules/ffmpeg/producer_ffmpeg.c | 12 ++ src/modules/inigo/Makefile | 27 +++ src/modules/inigo/configure | 11 ++ src/modules/inigo/factory.c | 46 +++++ src/modules/inigo/producer_inigo.c | 248 ++++++++++++++++++++++++++ src/modules/inigo/producer_inigo.h | 28 +++ src/modules/sdl/consumer_sdl.c | 12 +- 28 files changed, 1018 insertions(+), 406 deletions(-) create mode 100644 mlt/src/modules/inigo/Makefile create mode 100755 mlt/src/modules/inigo/configure create mode 100644 mlt/src/modules/inigo/factory.c create mode 100644 mlt/src/modules/inigo/producer_inigo.c create mode 100644 mlt/src/modules/inigo/producer_inigo.h create mode 100644 src/modules/inigo/Makefile create mode 100755 src/modules/inigo/configure create mode 100644 src/modules/inigo/factory.c create mode 100644 src/modules/inigo/producer_inigo.c create mode 100644 src/modules/inigo/producer_inigo.h diff --git a/docs/services.txt b/docs/services.txt index f7dbbee..92eb64e 100644 --- a/docs/services.txt +++ b/docs/services.txt @@ -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. diff --git a/docs/testing-20040110.txt b/docs/testing-20040110.txt index f7eb4f0..83a9473 100644 --- a/docs/testing-20040110.txt +++ b/docs/testing-20040110.txt @@ -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. + diff --git a/mlt/docs/services.txt b/mlt/docs/services.txt index f7dbbee..92eb64e 100644 --- a/mlt/docs/services.txt +++ b/mlt/docs/services.txt @@ -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. diff --git a/mlt/docs/testing-20040110.txt b/mlt/docs/testing-20040110.txt index f7eb4f0..83a9473 100644 --- a/mlt/docs/testing-20040110.txt +++ b/mlt/docs/testing-20040110.txt @@ -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. + diff --git a/mlt/src/framework/mlt_frame.c b/mlt/src/framework/mlt_frame.c index 64ec68d..a51fb7e 100644 --- a/mlt/src/framework/mlt_frame.c +++ b/mlt/src/framework/mlt_frame.c @@ -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; diff --git a/mlt/src/framework/mlt_playlist.c b/mlt/src/framework/mlt_playlist.c index 7daa7c9..1ed7603 100644 --- a/mlt/src/framework/mlt_playlist.c +++ b/mlt/src/framework/mlt_playlist.c @@ -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 { diff --git a/mlt/src/inigo/inigo.c b/mlt/src/inigo/inigo.c index 5fd647a..38e0d13 100644 --- a/mlt/src/inigo/inigo.c +++ b/mlt/src/inigo/inigo.c @@ -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( ); diff --git a/mlt/src/miracle/miracle_unit.c b/mlt/src/miracle/miracle_unit.c index aa81efc..479ed71 100644 --- a/mlt/src/miracle/miracle_unit.c +++ b/mlt/src/miracle/miracle_unit.c @@ -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 ); diff --git a/mlt/src/modules/Makefile b/mlt/src/modules/Makefile index 4ed8429..2179c42 100644 --- a/mlt/src/modules/Makefile +++ b/mlt/src/modules/Makefile @@ -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)'; \ diff --git a/mlt/src/modules/ffmpeg/producer_ffmpeg.c b/mlt/src/modules/ffmpeg/producer_ffmpeg.c index 662b1e4..9233bb3 100644 --- a/mlt/src/modules/ffmpeg/producer_ffmpeg.c +++ b/mlt/src/modules/ffmpeg/producer_ffmpeg.c @@ -30,6 +30,7 @@ #include #include #include +#include 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 index 0000000..c52ae1d --- /dev/null +++ b/mlt/src/modules/inigo/Makefile @@ -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 index 0000000..617ee0a --- /dev/null +++ b/mlt/src/modules/inigo/configure @@ -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 index 0000000..29320a8 --- /dev/null +++ b/mlt/src/modules/inigo/factory.c @@ -0,0 +1,46 @@ +/* + * factory.c -- the factory method interfaces + * Copyright (C) 2003-2004 Ushodaya Enterprises Limited + * Author: Charles Yates + * + * 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 + +#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 index 0000000..a3dbc10 --- /dev/null +++ b/mlt/src/modules/inigo/producer_inigo.c @@ -0,0 +1,248 @@ +/* + * producer_inigo.c -- simple inigo test case + * Copyright (C) 2003-2004 Ushodaya Enterprises Limited + * Author: Charles Yates + * + * 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 +#include +#include + +#include + +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 index 0000000..be65692 --- /dev/null +++ b/mlt/src/modules/inigo/producer_inigo.h @@ -0,0 +1,28 @@ +/* + * producer_inigo.h -- simple inigo test case + * Copyright (C) 2003-2004 Ushodaya Enterprises Limited + * Author: Charles Yates + * + * 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 + +extern mlt_producer producer_inigo_init( char **args ); + +#endif diff --git a/mlt/src/modules/sdl/consumer_sdl.c b/mlt/src/modules/sdl/consumer_sdl.c index 943a0d1..803e96e 100644 --- a/mlt/src/modules/sdl/consumer_sdl.c +++ b/mlt/src/modules/sdl/consumer_sdl.c @@ -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; } diff --git a/src/framework/mlt_frame.c b/src/framework/mlt_frame.c index 64ec68d..a51fb7e 100644 --- a/src/framework/mlt_frame.c +++ b/src/framework/mlt_frame.c @@ -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; diff --git a/src/framework/mlt_playlist.c b/src/framework/mlt_playlist.c index 7daa7c9..1ed7603 100644 --- a/src/framework/mlt_playlist.c +++ b/src/framework/mlt_playlist.c @@ -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 { diff --git a/src/inigo/inigo.c b/src/inigo/inigo.c index 5fd647a..38e0d13 100644 --- a/src/inigo/inigo.c +++ b/src/inigo/inigo.c @@ -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( ); diff --git a/src/miracle/miracle_unit.c b/src/miracle/miracle_unit.c index aa81efc..479ed71 100644 --- a/src/miracle/miracle_unit.c +++ b/src/miracle/miracle_unit.c @@ -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 ); diff --git a/src/modules/Makefile b/src/modules/Makefile index 4ed8429..2179c42 100644 --- a/src/modules/Makefile +++ b/src/modules/Makefile @@ -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)'; \ diff --git a/src/modules/ffmpeg/producer_ffmpeg.c b/src/modules/ffmpeg/producer_ffmpeg.c index 662b1e4..9233bb3 100644 --- a/src/modules/ffmpeg/producer_ffmpeg.c +++ b/src/modules/ffmpeg/producer_ffmpeg.c @@ -30,6 +30,7 @@ #include #include #include +#include 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 index 0000000..c52ae1d --- /dev/null +++ b/src/modules/inigo/Makefile @@ -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 index 0000000..617ee0a --- /dev/null +++ b/src/modules/inigo/configure @@ -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 index 0000000..29320a8 --- /dev/null +++ b/src/modules/inigo/factory.c @@ -0,0 +1,46 @@ +/* + * factory.c -- the factory method interfaces + * Copyright (C) 2003-2004 Ushodaya Enterprises Limited + * Author: Charles Yates + * + * 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 + +#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 index 0000000..a3dbc10 --- /dev/null +++ b/src/modules/inigo/producer_inigo.c @@ -0,0 +1,248 @@ +/* + * producer_inigo.c -- simple inigo test case + * Copyright (C) 2003-2004 Ushodaya Enterprises Limited + * Author: Charles Yates + * + * 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 +#include +#include + +#include + +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 index 0000000..be65692 --- /dev/null +++ b/src/modules/inigo/producer_inigo.h @@ -0,0 +1,28 @@ +/* + * producer_inigo.h -- simple inigo test case + * Copyright (C) 2003-2004 Ushodaya Enterprises Limited + * Author: Charles Yates + * + * 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 + +extern mlt_producer producer_inigo_init( char **args ); + +#endif diff --git a/src/modules/sdl/consumer_sdl.c b/src/modules/sdl/consumer_sdl.c index 943a0d1..803e96e 100644 --- a/src/modules/sdl/consumer_sdl.c +++ b/src/modules/sdl/consumer_sdl.c @@ -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; } -- 1.7.4.4