X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Fwestley%2Fconsumer_westley.c;h=63e320e5b7342bf3f282bae8c3003042d2fef6d6;hb=026972a9994471c1c1e5a714ac29d9d638cef027;hp=4d095f8809051af76f6e55181014a0b91c8f9256;hpb=8cf0f77981284b7549c811b67283eb73d0c520d6;p=melted diff --git a/src/modules/westley/consumer_westley.c b/src/modules/westley/consumer_westley.c index 4d095f8..63e320e 100644 --- a/src/modules/westley/consumer_westley.c +++ b/src/modules/westley/consumer_westley.c @@ -236,12 +236,13 @@ static inline void serialise_service_filters( serialise_context context, mlt_ser static void serialise_producer( serialise_context context, mlt_service service, xmlNode *node ) { xmlNode *child = node; - mlt_properties properties = mlt_service_properties( service ); + mlt_service parent = MLT_SERVICE( mlt_producer_cut_parent( MLT_PRODUCER( service ) ) ); if ( context->pass == 0 ) { + mlt_properties properties = mlt_service_properties( parent ); // Get a new id - if already allocated, do nothing - char *id = westley_get_id( context, service, westley_producer ); + char *id = westley_get_id( context, parent, westley_producer ); if ( id == NULL ) return; @@ -249,6 +250,8 @@ static void serialise_producer( serialise_context context, mlt_service service, // Set the id xmlNewProp( child, "id", id ); + xmlNewProp( child, "in", mlt_properties_get( properties, "in" ) ); + xmlNewProp( child, "out", mlt_properties_get( properties, "out" ) ); serialise_properties( context, properties, child ); serialise_service_filters( context, service, child ); @@ -257,12 +260,16 @@ static void serialise_producer( serialise_context context, mlt_service service, } else { - // Get a new id - if already allocated, do nothing - char *id = westley_get_id( context, service, westley_existing ); - xmlNewProp( node, "producer", id ); + char *id = westley_get_id( context, parent, westley_existing ); + mlt_properties properties = mlt_service_properties( service ); + xmlNewProp( node, "parent", id ); + xmlNewProp( node, "in", mlt_properties_get( properties, "in" ) ); + xmlNewProp( node, "out", mlt_properties_get( properties, "out" ) ); } } +static void serialise_tractor( serialise_context context, mlt_service service, xmlNode *node ); + static void serialise_multitrack( serialise_context context, mlt_service service, xmlNode *node ) { int i; @@ -271,7 +278,10 @@ static void serialise_multitrack( serialise_context context, mlt_service service { // Iterate over the tracks to collect the producers for ( i = 0; i < mlt_multitrack_count( MLT_MULTITRACK( service ) ); i++ ) - serialise_service( context, MLT_SERVICE( mlt_multitrack_track( MLT_MULTITRACK( service ), i ) ), node ); + { + mlt_producer producer = mlt_producer_cut_parent( mlt_multitrack_track( MLT_MULTITRACK( service ), i ) ); + serialise_service( context, MLT_SERVICE( producer ), node ); + } } else { @@ -286,9 +296,17 @@ static void serialise_multitrack( serialise_context context, mlt_service service xmlNode *track = xmlNewChild( node, NULL, "track", NULL ); int hide = 0; mlt_producer producer = mlt_multitrack_track( MLT_MULTITRACK( service ), i ); + mlt_properties properties = mlt_producer_properties( producer ); + + mlt_service parent = MLT_SERVICE( mlt_producer_cut_parent( producer ) ); - char *id = westley_get_id( context, MLT_SERVICE( producer ), westley_existing ); + char *id = westley_get_id( context, MLT_SERVICE( parent ), westley_existing ); xmlNewProp( track, "producer", id ); + if ( mlt_properties_get_int( properties, "_cut" ) == 1 ) + { + xmlNewProp( track, "in", mlt_properties_get( properties, "in" ) ); + xmlNewProp( track, "out", mlt_properties_get( properties, "out" ) ); + } hide = mlt_properties_get_int( context->hide_map, id ); if ( hide ) @@ -298,8 +316,6 @@ static void serialise_multitrack( serialise_context context, mlt_service service } } -static void serialise_tractor( serialise_context context, mlt_service service, xmlNode *node ); - static void serialise_playlist( serialise_context context, mlt_service service, xmlNode *node ) { int i; @@ -321,19 +337,13 @@ static void serialise_playlist( serialise_context context, mlt_service service, { if ( info.producer != NULL ) { - char *service_s = mlt_properties_get( mlt_producer_properties( info.producer ), "mlt_service" ); - char *resource_s = mlt_properties_get( mlt_producer_properties( info.producer ), "resource" ); - if ( resource_s != NULL && !strcmp( resource_s, "" ) ) - { - serialise_tractor( context, MLT_SERVICE( info.producer ), node ); - context->pass ++; - serialise_tractor( context, MLT_SERVICE( info.producer ), node ); - context->pass --; - } + mlt_producer producer = mlt_producer_cut_parent( info.producer ); + char *service_s = mlt_properties_get( mlt_producer_properties( producer ), "mlt_service" ); + char *resource_s = mlt_properties_get( mlt_producer_properties( producer ), "resource" ); + if ( resource_s != NULL && !strcmp( resource_s, "" ) ) + serialise_playlist( context, MLT_SERVICE( producer ), node ); else if ( service_s != NULL && strcmp( service_s, "blank" ) != 0 ) - serialise_service( context, MLT_SERVICE( info.producer ), node ); - else if ( resource_s != NULL && !strcmp( resource_s, "" ) ) - serialise_playlist( context, MLT_SERVICE( info.producer ), node ); + serialise_service( context, MLT_SERVICE( producer ), node ); } } } @@ -351,7 +361,8 @@ static void serialise_playlist( serialise_context context, mlt_service service, { if ( ! mlt_playlist_get_clip_info( MLT_PLAYLIST( service ), &info, i ) ) { - char *service_s = mlt_properties_get( mlt_producer_properties( info.producer ), "mlt_service" ); + mlt_producer producer = mlt_producer_cut_parent( info.producer ); + char *service_s = mlt_properties_get( mlt_producer_properties( producer ), "mlt_service" ); if ( service_s != NULL && strcmp( service_s, "blank" ) == 0 ) { char length[ 20 ]; @@ -364,12 +375,19 @@ static void serialise_playlist( serialise_context context, mlt_service service, { char temp[ 20 ]; xmlNode *entry = xmlNewChild( child, NULL, "entry", NULL ); - id = westley_get_id( context, MLT_SERVICE( info.producer ), westley_existing ); + id = westley_get_id( context, MLT_SERVICE( producer ), westley_existing ); xmlNewProp( entry, "producer", id ); sprintf( temp, "%d", info.frame_in ); xmlNewProp( entry, "in", temp ); sprintf( temp, "%d", info.frame_out ); xmlNewProp( entry, "out", temp ); + if ( info.repeat > 1 ) + { + sprintf( temp, "%d", info.repeat ); + xmlNewProp( entry, "repeat", temp ); + } + if ( mlt_producer_is_cut( info.cut ) ) + serialise_service_filters( context, mlt_producer_service( info.cut ), entry ); } } } @@ -478,7 +496,20 @@ static void serialise_service( serialise_context context, mlt_service service, x // Tell about the producer if ( strcmp( mlt_type, "producer" ) == 0 ) { - serialise_producer( context, service, node ); + char *mlt_service = mlt_properties_get( properties, "mlt_service" ); + if ( mlt_properties_get( properties, "westley" ) == NULL && !strcmp( mlt_service, "tractor" ) ) + { + context->pass = 0; + serialise_tractor( context, service, node ); + context->pass = 1; + serialise_tractor( context, service, node ); + context->pass = 0; + break; + } + else + { + serialise_producer( context, service, node ); + } if ( mlt_properties_get( properties, "westley" ) != NULL ) break; } @@ -504,7 +535,11 @@ static void serialise_service( serialise_context context, mlt_service service, x // Recurse on tractor's producer else if ( strcmp( resource, "" ) == 0 ) { + context->pass = 0; + serialise_tractor( context, service, node ); + context->pass = 1; serialise_tractor( context, service, node ); + context->pass = 0; break; } @@ -621,12 +656,13 @@ static int consumer_start( mlt_consumer this ) { xmlDocFormatDump( stdout, doc, 1 ); } - else if ( !strcmp( resource, "buffer" ) ) + else if ( strchr( resource, '.' ) == NULL ) { xmlChar *buffer = NULL; int length = 0; xmlDocDumpMemory( doc, &buffer, &length ); - mlt_properties_set_data( properties, "buffer", buffer, length, xmlFree, NULL ); + mlt_properties_set( properties, resource, buffer ); + xmlFree( buffer ); } else {