From 091e9065c24ede24d42c2a473a9c6f1e6d837f47 Mon Sep 17 00:00:00 2001 From: lilo_booter Date: Wed, 22 Sep 2004 10:32:29 +0000 Subject: [PATCH] Fix to compositing/watermark; miracle/mlt shutdown cleanup git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@434 d19143bc-622f-0410-bfdd-b5b2a6649095 --- src/framework/mlt_factory.c | 3 +++ src/framework/mlt_properties.c | 2 +- src/miracle/miracle.c | 4 +++- src/miracle/miracle_local.c | 4 ++-- src/miracle/miracle_server.c | 15 ++++++++++++++- src/miracle/miracle_server.h | 1 + src/modules/core/filter_watermark.c | 11 +++++++---- src/modules/core/transition_composite.c | 1 + 8 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/framework/mlt_factory.c b/src/framework/mlt_factory.c index 699dca30..ae0bade1 100644 --- a/src/framework/mlt_factory.c +++ b/src/framework/mlt_factory.c @@ -75,6 +75,9 @@ int mlt_factory_init( char *prefix ) filters = mlt_repository_init( object_list, prefix, "filters", "mlt_create_filter" ); transitions = mlt_repository_init( object_list, prefix, "transitions", "mlt_create_transition" ); consumers = mlt_repository_init( object_list, prefix, "consumers", "mlt_create_consumer" ); + + // Force a clean up when app closes + atexit( mlt_factory_close ); } return 0; diff --git a/src/framework/mlt_properties.c b/src/framework/mlt_properties.c index 1d137146..972ad939 100644 --- a/src/framework/mlt_properties.c +++ b/src/framework/mlt_properties.c @@ -47,7 +47,7 @@ property_list; /** Memory leak checks. */ -//#define _MLT_PROPERTY_CHECKS_ +#define _MLT_PROPERTY_CHECKS_ #ifdef _MLT_PROPERTY_CHECKS_ static int properties_created = 0; diff --git a/src/miracle/miracle.c b/src/miracle/miracle.c index 2e098307..913f7855 100644 --- a/src/miracle/miracle.c +++ b/src/miracle/miracle.c @@ -45,7 +45,7 @@ static miracle_server server = NULL; static void main_cleanup( ) { - miracle_server_shutdown( server ); + miracle_server_close( server ); } /** Report usage and exit. @@ -67,6 +67,8 @@ int main( int argc, char **argv ) int background = 1; struct timespec tm = { 5, 0 }; + mlt_factory_init( NULL ); + server = miracle_server_init( argv[ 0 ] ); for ( index = 1; index < argc; index ++ ) diff --git a/src/miracle/miracle_local.c b/src/miracle/miracle_local.c index 9f3e706e..30567447 100644 --- a/src/miracle/miracle_local.c +++ b/src/miracle/miracle_local.c @@ -548,7 +548,7 @@ static void miracle_local_close( miracle_local local ) #ifdef linux //pthread_kill_other_threads_np(); miracle_log( LOG_DEBUG, "Clean shutdown." ); - free( local ); - mlt_factory_close( ); + //free( local ); + //mlt_factory_close( ); #endif } diff --git a/src/miracle/miracle_server.c b/src/miracle/miracle_server.c index 50d5bf04..c5a00eea 100644 --- a/src/miracle/miracle_server.c +++ b/src/miracle/miracle_server.c @@ -275,8 +275,21 @@ void miracle_server_shutdown( miracle_server server ) { server->shutdown = 1; pthread_join( server->thread, NULL ); - valerie_parser_close( server->parser ); miracle_server_set_config( server, NULL ); + valerie_parser_close( server->parser ); + server->parser = NULL; close( server->socket ); } } + +/** Close the server. +*/ + +void miracle_server_close( miracle_server server ) +{ + if ( server != NULL ) + { + miracle_server_shutdown( server ); + free( server ); + } +} diff --git a/src/miracle/miracle_server.h b/src/miracle/miracle_server.h index d79b9873..5ed27986 100644 --- a/src/miracle/miracle_server.h +++ b/src/miracle/miracle_server.h @@ -64,6 +64,7 @@ extern void miracle_server_set_port( miracle_server, int ); extern void miracle_server_set_proxy( miracle_server, char * ); extern int miracle_server_execute( miracle_server ); extern void miracle_server_shutdown( miracle_server ); +extern void miracle_server_close( miracle_server ); #ifdef __cplusplus } diff --git a/src/modules/core/filter_watermark.c b/src/modules/core/filter_watermark.c index 33df73a2..cfd9e82e 100644 --- a/src/modules/core/filter_watermark.c +++ b/src/modules/core/filter_watermark.c @@ -132,8 +132,14 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format // Get the b frame and process with composite if successful if ( mlt_service_get_frame( service, &b_frame, 0 ) == 0 ) { - // Set the b frame to be in the same position + // Get the a and b frame properties + mlt_properties a_props = mlt_frame_properties( frame ); + mlt_properties b_props = mlt_frame_properties( b_frame ); + + // Set the b frame to be in the same position and have same consumer requirements mlt_frame_set_position( b_frame, position ); + mlt_properties_set_double( b_props, "consumer_aspect_ratio", mlt_properties_get_double( a_props, "consumer_aspect_ratio" ) ); + mlt_properties_set_int( b_props, "consumer_progressive", mlt_properties_get_double( a_props, "consumer_progressive" ) ); if ( mlt_properties_get_int( properties, "reverse" ) == 0 ) { @@ -148,12 +154,9 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format } else { - mlt_properties a_props = mlt_frame_properties( frame ); - mlt_properties b_props = mlt_frame_properties( b_frame ); mlt_transition_process( composite, b_frame, frame ); mlt_properties_set( a_props, "rescale.interp", "nearest" ); mlt_properties_set( b_props, "rescale.interp", "nearest" ); - mlt_properties_set_int( b_props, "consumer_aspect_ratio", mlt_properties_get_double( a_props, "consumer_aspect_ratio" ) ); mlt_service_apply_filters( mlt_filter_service( this ), frame, 0 ); error = mlt_frame_get_image( b_frame, image, format, width, height, 1 ); mlt_properties_set_data( b_props, "image", *image, 0, NULL, NULL ); diff --git a/src/modules/core/transition_composite.c b/src/modules/core/transition_composite.c index 4ffb3d5d..e7376718 100644 --- a/src/modules/core/transition_composite.c +++ b/src/modules/core/transition_composite.c @@ -573,6 +573,7 @@ static int composite_yuv( uint8_t *p_dest, int width_dest, int height_dest, uint { y_src = -y; height_src -= y_src; + y = 0; } // crop overlay below bottom edge of frame -- 2.39.2