X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmodules%2Fcore%2Fconsumer_multi.c;h=ffcc608619a7bc4b50967861c72efe769bb2cd5e;hb=6f8293d53fc21742d9d43f94f0e590e1bfcb8ee0;hp=1cf6593a17ec45754ca5a60991d52d8f139f2fe2;hpb=7ae60e5c2cdbcfe17255694521a0ac941552b258;p=mlt diff --git a/src/modules/core/consumer_multi.c b/src/modules/core/consumer_multi.c index 1cf6593a..ffcc6086 100644 --- a/src/modules/core/consumer_multi.c +++ b/src/modules/core/consumer_multi.c @@ -30,6 +30,7 @@ static int stop( mlt_consumer consumer ); static int is_stopped( mlt_consumer consumer ); static void *consumer_thread( void *arg ); static void consumer_close( mlt_consumer consumer ); +static void purge( mlt_consumer consumer ); static mlt_properties normalisers = NULL; @@ -57,6 +58,7 @@ mlt_consumer consumer_multi_init( mlt_profile profile, mlt_service_type type, co consumer->start = start; consumer->stop = stop; consumer->is_stopped = is_stopped; + consumer->purge = purge; } return consumer; @@ -363,6 +365,7 @@ static void foreach_consumer_put( mlt_consumer consumer, mlt_frame frame ) // put ideal number of samples into cloned frame int deeply = index > 1 ? 1 : 0; mlt_frame clone_frame = mlt_frame_clone( frame, deeply ); + mlt_properties clone_props = MLT_FRAME_PROPERTIES( clone_frame ); int nested_samples = mlt_sample_calculator( nested_fps, frequency, nested_pos ); // -10 is an optimization to avoid tiny amounts of leftover samples nested_samples = nested_samples > current_samples - 10 ? current_samples : nested_samples; @@ -378,15 +381,21 @@ static void foreach_consumer_put( mlt_consumer consumer, mlt_frame frame ) nested_size = 0; } mlt_frame_set_audio( clone_frame, prev_buffer, format, nested_size, mlt_pool_release ); - mlt_properties_set_int( MLT_FRAME_PROPERTIES(clone_frame), "audio_samples", nested_samples ); - mlt_properties_set_int( MLT_FRAME_PROPERTIES(clone_frame), "audio_frequency", frequency ); - mlt_properties_set_int( MLT_FRAME_PROPERTIES(clone_frame), "audio_channels", channels ); + mlt_properties_set_int( clone_props, "audio_samples", nested_samples ); + mlt_properties_set_int( clone_props, "audio_frequency", frequency ); + mlt_properties_set_int( clone_props, "audio_channels", channels ); // chomp the audio current_samples -= nested_samples; current_size -= nested_size; buffer += nested_size; + // Fix some things + mlt_properties_set_int( clone_props, "meta.media.width", + mlt_properties_get_int( MLT_FRAME_PROPERTIES(frame), "width" ) ); + mlt_properties_set_int( clone_props, "meta.media.height", + mlt_properties_get_int( MLT_FRAME_PROPERTIES(frame), "height" ) ); + // send frame to nested consumer mlt_consumer_put_frame( nested, clone_frame ); mlt_properties_set_position( nested_props, "_multi_position", ++nested_pos ); @@ -507,6 +516,27 @@ static int is_stopped( mlt_consumer consumer ) return !mlt_properties_get_int( MLT_CONSUMER_PROPERTIES( consumer ), "running" ); } +/** Purge each of the child consumers. +*/ + +static void purge( mlt_consumer consumer ) +{ + mlt_properties properties = MLT_CONSUMER_PROPERTIES( consumer ); + if ( mlt_properties_get_int( properties, "running" ) ) + { + mlt_consumer nested = NULL; + char key[30]; + int index = 0; + + do { + snprintf( key, sizeof(key), "%d.consumer", index++ ); + nested = mlt_properties_get_data( properties, key, NULL ); + if ( nested ) + mlt_consumer_purge( nested ); + } while ( nested ); + } +} + /** The main thread - the argument is simply the consumer. */