From 3b33a072eba3428710b5a1c86409fc99cbb2d2bc Mon Sep 17 00:00:00 2001 From: ddennedy Date: Wed, 9 Aug 2006 06:55:47 +0000 Subject: [PATCH] enhance producer_westley to parse Kino 0.9.1 SMIL (clock) time values. git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@920 d19143bc-622f-0410-bfdd-b5b2a6649095 --- src/modules/westley/producer_westley.c | 59 ++++++++++++++++++++++++++++++-- 1 files changed, 56 insertions(+), 3 deletions(-) diff --git a/src/modules/westley/producer_westley.c b/src/modules/westley/producer_westley.c index c9fe9bf..626be13 100644 --- a/src/modules/westley/producer_westley.c +++ b/src/modules/westley/producer_westley.c @@ -433,6 +433,44 @@ static void on_start_producer( deserialise_context context, const xmlChar *name, mlt_properties_set( properties, (char*) atts[0], atts[1] == NULL ? "" : (char*) atts[1] ); } +// Parse a SMIL clock value (as produced by Kino 0.9.1) and return position in frames +static mlt_position parse_clock_value( char *value, double fps ) +{ + // This implementation expects a fully specified clock value - no optional + // parts (e.g. 1:05) + char *pos, *copy = strdup( value ); + int hh, mm, ss, ms; + mlt_position result = -1; + + value = copy; + pos = strchr( value, ':' ); + if ( !pos ) + return result; + *pos = '\0'; + hh = atoi( value ); + value = pos + 1; + + pos = strchr( value, ':' ); + if ( !pos ) + return result; + *pos = '\0'; + mm = atoi( value ); + value = pos + 1; + + pos = strchr( value, '.' ); + if ( !pos ) + return result; + *pos = '\0'; + ss = atoi( value ); + value = pos + 1; + + ms = atoi( value ); + free( copy ); + result = ( fps * ( ( (hh * 3600) + (mm * 60) + ss ) * 1000 + ms ) / 1000 + 0.5 ); + + return result; +} + static void on_end_producer( deserialise_context context, const xmlChar *name ) { enum service_type type; @@ -495,14 +533,29 @@ static void on_end_producer( deserialise_context context, const xmlChar *name ) in = mlt_properties_get_position( properties, "in" ); // Let Kino-SMIL clipBegin be a synonym for in if ( mlt_properties_get( properties, "clipBegin" ) != NULL ) - in = mlt_properties_get_position( properties, "clipBegin" ); + { + if ( strchr( mlt_properties_get( properties, "clipBegin" ), ':' ) ) + // Parse clock value + in = parse_clock_value( mlt_properties_get( properties, "clipBegin" ), + mlt_properties_get_double( mlt_producer_properties( MLT_PRODUCER( producer ) ), "fps" ) ); + else + // Parse frames value + in = mlt_properties_get_position( properties, "clipBegin" ); + } // Get out if ( mlt_properties_get( properties, "out" ) != NULL ) out = mlt_properties_get_position( properties, "out" ); // Let Kino-SMIL clipEnd be a synonym for out if ( mlt_properties_get( properties, "clipEnd" ) != NULL ) - out = mlt_properties_get_position( properties, "clipEnd" ); - + { + if ( strchr( mlt_properties_get( properties, "clipEnd" ), ':' ) ) + // Parse clock value + out = parse_clock_value( mlt_properties_get( properties, "clipEnd" ), + mlt_properties_get_double( mlt_producer_properties( MLT_PRODUCER( producer ) ), "fps" ) ); + else + // Parse frames value + out = mlt_properties_get_position( properties, "clipEnd" ); + } // Remove in and out mlt_properties_set( properties, "in", NULL ); mlt_properties_set( properties, "out", NULL ); -- 1.7.4.4