Known Bugs
- none
+ in/out settings are incorrectly handled.
ppm
Description
Known Bugs
- ?
+ NTSC handling needs tightening up - sdl:NTSC is the only valid
+ constructor for NTSC playback at the moment.
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
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.
+
Known Bugs
- none
+ in/out settings are incorrectly handled.
ppm
Description
Known Bugs
- ?
+ NTSC handling needs tightening up - sdl:NTSC is the only valid
+ constructor for NTSC playback at the moment.
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
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.
+
*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 ) );
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;
{
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
{
#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 );
mlt_producer_set_speed( producer, 0 );
break;
case '6':
+ case ' ':
mlt_producer_set_speed( producer, 1 );
break;
case '7':
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 )
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 );
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 )
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
{
" [ producer [ name=value ] * ]+\n" );
}
- // Close the field
- mlt_field_close( field );
-
- // Close the group
- mlt_properties_close( group );
-
// Close the factory
mlt_factory_close( );
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 );
-SUBDIRS = core gtk2 dv sdl mainconcept bluefish ffmpeg
+SUBDIRS = core gtk2 dv sdl mainconcept bluefish ffmpeg inigo
all clean depend install:
list='$(SUBDIRS)'; \
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
+#include <sys/stat.h>
typedef struct producer_ffmpeg_s *producer_ffmpeg;
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;
}
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", "" );
this->buffer = malloc( 1024 * 1024 * 2 );
+ if ( !usable )
+ {
+ mlt_producer_close( &this->parent );
+ producer = NULL;
+ }
+
return producer;
}
free( this );
--- /dev/null
+
+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
--- /dev/null
+#!/bin/bash
+
+if [ "$help" != "1" ]
+then
+
+cat << EOF >> ../producers.dat
+inigo libinigo.so
+EOF
+
+fi
+
--- /dev/null
+/*
+ * 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;
+}
+
--- /dev/null
+/*
+ * 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 );
+}
+
--- /dev/null
+/*
+ * 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
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" ) )
{
{
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 )
{
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;
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;
{
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;
}
*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 ) );
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;
{
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
{
#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 );
mlt_producer_set_speed( producer, 0 );
break;
case '6':
+ case ' ':
mlt_producer_set_speed( producer, 1 );
break;
case '7':
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 )
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 );
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 )
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
{
" [ producer [ name=value ] * ]+\n" );
}
- // Close the field
- mlt_field_close( field );
-
- // Close the group
- mlt_properties_close( group );
-
// Close the factory
mlt_factory_close( );
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 );
-SUBDIRS = core gtk2 dv sdl mainconcept bluefish ffmpeg
+SUBDIRS = core gtk2 dv sdl mainconcept bluefish ffmpeg inigo
all clean depend install:
list='$(SUBDIRS)'; \
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
+#include <sys/stat.h>
typedef struct producer_ffmpeg_s *producer_ffmpeg;
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;
}
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", "" );
this->buffer = malloc( 1024 * 1024 * 2 );
+ if ( !usable )
+ {
+ mlt_producer_close( &this->parent );
+ producer = NULL;
+ }
+
return producer;
}
free( this );
--- /dev/null
+
+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
--- /dev/null
+#!/bin/bash
+
+if [ "$help" != "1" ]
+then
+
+cat << EOF >> ../producers.dat
+inigo libinigo.so
+EOF
+
+fi
+
--- /dev/null
+/*
+ * 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;
+}
+
--- /dev/null
+/*
+ * 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 );
+}
+
--- /dev/null
+/*
+ * 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
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" ) )
{
{
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 )
{
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;
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;
{
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;
}