X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Ffezzik%2Fproducer_fezzik.c;h=2eafbc6582f1e38a8d4e276c77eed5b067a06c2a;hb=845797debbd5cfdc3dc515595afa572727842bf2;hp=e409afc6e42cca5887bd82e4e0da0d513edbf041;hpb=b49b8059af440b18c427842272f57808fc465c4f;p=melted diff --git a/src/modules/fezzik/producer_fezzik.c b/src/modules/fezzik/producer_fezzik.c index e409afc..2eafbc6 100644 --- a/src/modules/fezzik/producer_fezzik.c +++ b/src/modules/fezzik/producer_fezzik.c @@ -23,9 +23,13 @@ #include #include #include +#include +#include #include +static mlt_properties dictionary = NULL; + static void track_service( mlt_tractor tractor, void *service, mlt_destructor destructor ) { mlt_properties properties = mlt_tractor_properties( tractor ); @@ -38,64 +42,76 @@ static void track_service( mlt_tractor tractor, void *service, mlt_destructor de free( real ); } +static mlt_producer create_from( char *file, char *services ) +{ + mlt_producer producer = NULL; + char *temp = strdup( services ); + char *service = temp; + do + { + char *p = strchr( service, ',' ); + if ( p != NULL ) + *p ++ = '\0'; + producer = mlt_factory_producer( service, file ); + service = p; + } + while ( producer == NULL && service != NULL ); + free( temp ); + return producer; +} + static mlt_producer create_producer( char *file ) { mlt_producer result = NULL; - // 1st Line preferences - if ( strstr( file, ".inigo" ) ) - result = mlt_factory_producer( "inigo_file", file ); - else if ( strstr( file, ".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, ".svg" ) ) - result = mlt_factory_producer( "pixbuf", file ); - else if ( strstr( file, ".txt" ) ) - result = mlt_factory_producer( "pango", file ); - else if ( strstr( file, ".westley" ) ) - result = mlt_factory_producer( "westley", file ); - else if ( strstr( file, ".ogg" ) ) - result = mlt_factory_producer( "vorbis", file ); - - // 2nd Line fallbacks - if ( result == NULL ) + // 1st Line - check for service:resource handling + if ( strchr( file, ':' ) ) { - if ( strstr( file, ".dv" ) ) - result = mlt_factory_producer( "libdv", file ); - else if ( strstr( file, ".dif" ) ) - result = mlt_factory_producer( "libdv", file ); + char *temp = strdup( file ); + char *service = temp; + char *resource = strchr( temp, ':' ); + *resource ++ = '\0'; + result = mlt_factory_producer( service, resource ); + free( temp ); } - // 3rd line fallbacks - if ( result == NULL ) - result = mlt_factory_producer( "avformat", file + - ( strncmp( file, "avformat:", 9 ) ? 0 : 9 ) ); - - // 4th - allow explicit construction + // 2nd Line preferences if ( result == NULL ) { - char *arg = strchr( file, ':' ); - if ( arg ) + int i = 0; + char *lookup = strdup( file ); + char *p = lookup; + + // We only need to load the dictionary once + if ( dictionary == NULL ) { - arg[0] = 0; - arg++; + char temp[ 1024 ]; + sprintf( temp, "%s/fezzik.dict", mlt_factory_prefix( ) ); + dictionary = mlt_properties_load( temp ); } - result = mlt_factory_producer( file, arg ); + + // Convert the lookup string to lower case + while ( *p ) + { + *p = tolower( *p ); + p ++; + } + + // Iterate through the dictionary + for ( i = 0; result == NULL && i < mlt_properties_count( dictionary ); i ++ ) + { + char *name = mlt_properties_get_name( dictionary, i ); + if ( fnmatch( name, lookup, 0 ) == 0 ) + result = create_from( file, mlt_properties_get_value( dictionary, i ) ); + } + + free( lookup ); } + // Finally, try just loading as service + if ( result == NULL ) + result = mlt_factory_producer( file, NULL ); + return result; } @@ -120,6 +136,7 @@ mlt_producer producer_fezzik_init( char *arg ) { // Create the producer that the tractor will contain mlt_producer producer = NULL; + if ( arg != NULL ) producer = create_producer( arg ); @@ -166,6 +183,9 @@ mlt_producer producer_fezzik_init( char *arg ) // We need to ensure that all further properties are mirrored in the producer mlt_properties_mirror( properties, mlt_producer_properties( producer ) ); + // Ensure that the inner producer ignores the in point + mlt_properties_set_int( mlt_producer_properties( producer ), "ignore_points", 1 ); + // Now, we return the producer of the tractor producer = mlt_tractor_producer( tractor ); }