From 3a0830989b99178eec0ab334ea8dea36c4cc429c Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sat, 25 Jan 2014 00:59:51 +0100 Subject: [PATCH] Propertly refcount the GlslManager. Makes sure it is not deleted before all the associated services connected to it are. --- src/modules/opengl/filter_glsl_manager.cpp | 16 ++++++++++++---- src/modules/opengl/filter_glsl_manager.h | 1 + src/modules/opengl/filter_movit_blur.cpp | 1 + src/modules/opengl/filter_movit_convert.cpp | 2 ++ src/modules/opengl/filter_movit_crop.cpp | 2 ++ .../filter_movit_deconvolution_sharpen.cpp | 1 + src/modules/opengl/filter_movit_diffusion.cpp | 1 + src/modules/opengl/filter_movit_glow.cpp | 1 + .../opengl/filter_movit_lift_gamma_gain.cpp | 1 + src/modules/opengl/filter_movit_mirror.cpp | 2 ++ src/modules/opengl/filter_movit_opacity.cpp | 1 + src/modules/opengl/filter_movit_rect.cpp | 2 ++ src/modules/opengl/filter_movit_resample.cpp | 2 ++ src/modules/opengl/filter_movit_resize.cpp | 2 ++ src/modules/opengl/filter_movit_saturation.cpp | 1 + src/modules/opengl/filter_movit_vignette.cpp | 2 ++ .../opengl/filter_movit_white_balance.cpp | 1 + 17 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/modules/opengl/filter_glsl_manager.cpp b/src/modules/opengl/filter_glsl_manager.cpp index d941f8e9..e9924de0 100644 --- a/src/modules/opengl/filter_glsl_manager.cpp +++ b/src/modules/opengl/filter_glsl_manager.cpp @@ -41,9 +41,11 @@ extern "C" { #include #endif -void deleteManager(GlslManager *p) +void dec_ref_and_delete(GlslManager *p) { - delete p; + if (p->dec_ref() == 0) { + delete p; + } } GlslManager::GlslManager() @@ -57,8 +59,7 @@ GlslManager::GlslManager() if ( filter ) { // Set the mlt_filter child in case we choose to override virtual functions. filter->child = this; - mlt_properties_set_data(mlt_global_properties(), "glslManager", this, 0, - (mlt_destructor) deleteManager, NULL); + add_ref(mlt_global_properties()); mlt_events_register( get_properties(), "init glsl", NULL ); mlt_events_register( get_properties(), "close glsl", NULL ); @@ -86,6 +87,13 @@ GlslManager::~GlslManager() } } +void GlslManager::add_ref(mlt_properties properties) +{ + inc_ref(); + mlt_properties_set_data(properties, "glslManager", this, 0, + (mlt_destructor) dec_ref_and_delete, NULL); +} + GlslManager* GlslManager::get_instance() { return (GlslManager*) mlt_properties_get_data(mlt_global_properties(), "glslManager", 0); diff --git a/src/modules/opengl/filter_glsl_manager.h b/src/modules/opengl/filter_glsl_manager.h index c850c86a..496e1922 100644 --- a/src/modules/opengl/filter_glsl_manager.h +++ b/src/modules/opengl/filter_glsl_manager.h @@ -88,6 +88,7 @@ class GlslManager : public Mlt::Filter public: GlslManager(); ~GlslManager(); + void add_ref(mlt_properties properties); static GlslManager* get_instance(); glsl_fbo get_fbo(int width, int height); diff --git a/src/modules/opengl/filter_movit_blur.cpp b/src/modules/opengl/filter_movit_blur.cpp index 79acaaae..e89a09da 100644 --- a/src/modules/opengl/filter_movit_blur.cpp +++ b/src/modules/opengl/filter_movit_blur.cpp @@ -59,6 +59,7 @@ mlt_filter filter_movit_blur_init( mlt_profile profile, mlt_service_type type, c if ( glsl && ( filter = mlt_filter_new() ) ) { mlt_properties properties = MLT_FILTER_PROPERTIES( filter ); + glsl->add_ref( properties ); mlt_properties_set_double( properties, "radius", 3 ); filter->process = process; } diff --git a/src/modules/opengl/filter_movit_convert.cpp b/src/modules/opengl/filter_movit_convert.cpp index c35b546d..dab3eae4 100644 --- a/src/modules/opengl/filter_movit_convert.cpp +++ b/src/modules/opengl/filter_movit_convert.cpp @@ -547,6 +547,8 @@ mlt_filter filter_movit_convert_init( mlt_profile profile, mlt_service_type type if ( glsl && ( filter = mlt_filter_new() ) ) { + mlt_properties properties = MLT_FILTER_PROPERTIES( filter ); + glsl->add_ref( properties ); #ifdef WIN32 // XXX avcolor_space is crashing on Windows in this context! mlt_filter cpu_csc = NULL; diff --git a/src/modules/opengl/filter_movit_crop.cpp b/src/modules/opengl/filter_movit_crop.cpp index 7f5381ec..120bbca9 100644 --- a/src/modules/opengl/filter_movit_crop.cpp +++ b/src/modules/opengl/filter_movit_crop.cpp @@ -114,6 +114,8 @@ mlt_filter filter_movit_crop_init( mlt_profile profile, mlt_service_type type, c GlslManager* glsl = GlslManager::get_instance(); if ( glsl && ( filter = mlt_filter_new() ) ) { + mlt_properties properties = MLT_FILTER_PROPERTIES( filter ); + glsl->add_ref( properties ); filter->process = process; } return filter; diff --git a/src/modules/opengl/filter_movit_deconvolution_sharpen.cpp b/src/modules/opengl/filter_movit_deconvolution_sharpen.cpp index 34d779e0..20edea67 100644 --- a/src/modules/opengl/filter_movit_deconvolution_sharpen.cpp +++ b/src/modules/opengl/filter_movit_deconvolution_sharpen.cpp @@ -73,6 +73,7 @@ mlt_filter filter_deconvolution_sharpen_init( mlt_profile profile, mlt_service_t if ( glsl && ( filter = mlt_filter_new() ) ) { mlt_properties properties = MLT_FILTER_PROPERTIES( filter ); + glsl->add_ref( properties ); mlt_properties_set_int( properties, "matrix_size", 5 ); mlt_properties_set_double( properties, "circle_radius", 2.0 ); mlt_properties_set_double( properties, "gaussian_radius", 0.0 ); diff --git a/src/modules/opengl/filter_movit_diffusion.cpp b/src/modules/opengl/filter_movit_diffusion.cpp index c04c2ce4..0ffdf7bb 100644 --- a/src/modules/opengl/filter_movit_diffusion.cpp +++ b/src/modules/opengl/filter_movit_diffusion.cpp @@ -60,6 +60,7 @@ mlt_filter filter_movit_diffusion_init( mlt_profile profile, mlt_service_type ty if ( glsl && ( filter = mlt_filter_new() ) ) { mlt_properties properties = MLT_FILTER_PROPERTIES( filter ); + glsl->add_ref( properties ); mlt_properties_set_double( properties, "radius", 3.0 ); mlt_properties_set_double( properties, "mix", 0.3 ); filter->process = process; diff --git a/src/modules/opengl/filter_movit_glow.cpp b/src/modules/opengl/filter_movit_glow.cpp index ab9ea0c5..3d5f198f 100644 --- a/src/modules/opengl/filter_movit_glow.cpp +++ b/src/modules/opengl/filter_movit_glow.cpp @@ -62,6 +62,7 @@ mlt_filter filter_movit_glow_init( mlt_profile profile, mlt_service_type type, c if ( glsl && ( filter = mlt_filter_new() ) ) { mlt_properties properties = MLT_FILTER_PROPERTIES( filter ); + glsl->add_ref( properties ); mlt_properties_set_double( properties, "radius", 20.0 ); mlt_properties_set_double( properties, "blur_mix", 1.0 ); mlt_properties_set_double( properties, "highlight_cutoff", 0.2 ); diff --git a/src/modules/opengl/filter_movit_lift_gamma_gain.cpp b/src/modules/opengl/filter_movit_lift_gamma_gain.cpp index de934d03..a45d87b3 100644 --- a/src/modules/opengl/filter_movit_lift_gamma_gain.cpp +++ b/src/modules/opengl/filter_movit_lift_gamma_gain.cpp @@ -74,6 +74,7 @@ mlt_filter filter_lift_gamma_gain_init( mlt_profile profile, mlt_service_type ty if ( glsl && ( filter = mlt_filter_new() ) ) { mlt_properties properties = MLT_FILTER_PROPERTIES( filter ); + glsl->add_ref( properties ); mlt_properties_set_double( properties, "lift_r", 0.0 ); mlt_properties_set_double( properties, "lift_g", 0.0 ); mlt_properties_set_double( properties, "lift_b", 0.0 ); diff --git a/src/modules/opengl/filter_movit_mirror.cpp b/src/modules/opengl/filter_movit_mirror.cpp index 12d8d271..6c7b6132 100644 --- a/src/modules/opengl/filter_movit_mirror.cpp +++ b/src/modules/opengl/filter_movit_mirror.cpp @@ -50,6 +50,8 @@ mlt_filter filter_movit_mirror_init( mlt_profile profile, mlt_service_type type, GlslManager* glsl = GlslManager::get_instance(); if ( glsl && ( filter = mlt_filter_new() ) ) { + mlt_properties properties = MLT_FILTER_PROPERTIES( filter ); + glsl->add_ref( properties ); filter->process = process; } return filter; diff --git a/src/modules/opengl/filter_movit_opacity.cpp b/src/modules/opengl/filter_movit_opacity.cpp index 5916c34e..3cdb8ab3 100644 --- a/src/modules/opengl/filter_movit_opacity.cpp +++ b/src/modules/opengl/filter_movit_opacity.cpp @@ -60,6 +60,7 @@ mlt_filter filter_movit_opacity_init( mlt_profile profile, mlt_service_type type if ( glsl && ( filter = mlt_filter_new() ) ) { mlt_properties properties = MLT_FILTER_PROPERTIES( filter ); + glsl->add_ref( properties ); mlt_properties_set( properties, "opacity", arg? arg : "1" ); filter->process = process; } diff --git a/src/modules/opengl/filter_movit_rect.cpp b/src/modules/opengl/filter_movit_rect.cpp index 7f2386eb..110fd8f0 100644 --- a/src/modules/opengl/filter_movit_rect.cpp +++ b/src/modules/opengl/filter_movit_rect.cpp @@ -39,6 +39,8 @@ mlt_filter filter_movit_rect_init( mlt_profile profile, mlt_service_type type, c GlslManager* glsl = GlslManager::get_instance(); if ( glsl && ( filter = mlt_filter_new() ) ) { + mlt_properties properties = MLT_FILTER_PROPERTIES( filter ); + glsl->add_ref( properties ); mlt_properties_set( MLT_FILTER_PROPERTIES(filter), "rect", arg ); mlt_properties_set_int( MLT_FILTER_PROPERTIES(filter), "fill", 1 ); filter->process = process; diff --git a/src/modules/opengl/filter_movit_resample.cpp b/src/modules/opengl/filter_movit_resample.cpp index ea6df48f..74dd55a9 100644 --- a/src/modules/opengl/filter_movit_resample.cpp +++ b/src/modules/opengl/filter_movit_resample.cpp @@ -100,6 +100,8 @@ mlt_filter filter_movit_resample_init( mlt_profile profile, mlt_service_type typ GlslManager* glsl = GlslManager::get_instance(); if ( glsl && ( filter = mlt_filter_new() ) ) { + mlt_properties properties = MLT_FILTER_PROPERTIES( filter ); + glsl->add_ref( properties ); filter->process = process; } return filter; diff --git a/src/modules/opengl/filter_movit_resize.cpp b/src/modules/opengl/filter_movit_resize.cpp index 15480d12..c5f2835f 100644 --- a/src/modules/opengl/filter_movit_resize.cpp +++ b/src/modules/opengl/filter_movit_resize.cpp @@ -193,6 +193,8 @@ mlt_filter filter_movit_resize_init( mlt_profile profile, mlt_service_type type, if ( glsl && ( filter = mlt_filter_new() ) ) { + mlt_properties properties = MLT_FILTER_PROPERTIES( filter ); + glsl->add_ref( properties ); filter->process = process; } return filter; diff --git a/src/modules/opengl/filter_movit_saturation.cpp b/src/modules/opengl/filter_movit_saturation.cpp index d23a0503..fa8a7e7d 100644 --- a/src/modules/opengl/filter_movit_saturation.cpp +++ b/src/modules/opengl/filter_movit_saturation.cpp @@ -58,6 +58,7 @@ mlt_filter filter_movit_saturation_init( mlt_profile profile, mlt_service_type t if ( glsl && ( filter = mlt_filter_new() ) ) { mlt_properties properties = MLT_FILTER_PROPERTIES( filter ); + glsl->add_ref( properties ); mlt_properties_set( properties, "saturation", arg? arg : "1.0" ); filter->process = process; } diff --git a/src/modules/opengl/filter_movit_vignette.cpp b/src/modules/opengl/filter_movit_vignette.cpp index bdcb8a28..f4ff63d9 100644 --- a/src/modules/opengl/filter_movit_vignette.cpp +++ b/src/modules/opengl/filter_movit_vignette.cpp @@ -59,6 +59,8 @@ mlt_filter filter_movit_vignette_init( mlt_profile profile, mlt_service_type typ GlslManager* glsl = GlslManager::get_instance(); if ( glsl && ( filter = mlt_filter_new() ) ) { + mlt_properties properties = MLT_FILTER_PROPERTIES( filter ); + glsl->add_ref( properties ); filter->process = process; mlt_properties_set_double( MLT_FILTER_PROPERTIES(filter), "radius", 0.3 ); mlt_properties_set_double( MLT_FILTER_PROPERTIES(filter), "inner_radius", 0.3 ); diff --git a/src/modules/opengl/filter_movit_white_balance.cpp b/src/modules/opengl/filter_movit_white_balance.cpp index 71a325d5..d2301ee7 100644 --- a/src/modules/opengl/filter_movit_white_balance.cpp +++ b/src/modules/opengl/filter_movit_white_balance.cpp @@ -80,6 +80,7 @@ mlt_filter filter_white_balance_init( mlt_profile profile, mlt_service_type type if ( glsl && ( filter = mlt_filter_new() ) ) { mlt_properties properties = MLT_FILTER_PROPERTIES( filter ); + glsl->add_ref( properties ); mlt_properties_set( properties, "neutral_color", arg? arg : "#7f7f7f" ); mlt_properties_set_double( properties, "color_temperature", 6500.0 ); filter->process = process; -- 2.39.2