]> git.sesse.net Git - mlt/commitdiff
Propertly refcount the GlslManager.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Fri, 24 Jan 2014 23:59:51 +0000 (00:59 +0100)
committerDan Dennedy <dan@dennedy.org>
Sun, 26 Jan 2014 19:44:10 +0000 (11:44 -0800)
Makes sure it is not deleted before all the associated services
connected to it are.

17 files changed:
src/modules/opengl/filter_glsl_manager.cpp
src/modules/opengl/filter_glsl_manager.h
src/modules/opengl/filter_movit_blur.cpp
src/modules/opengl/filter_movit_convert.cpp
src/modules/opengl/filter_movit_crop.cpp
src/modules/opengl/filter_movit_deconvolution_sharpen.cpp
src/modules/opengl/filter_movit_diffusion.cpp
src/modules/opengl/filter_movit_glow.cpp
src/modules/opengl/filter_movit_lift_gamma_gain.cpp
src/modules/opengl/filter_movit_mirror.cpp
src/modules/opengl/filter_movit_opacity.cpp
src/modules/opengl/filter_movit_rect.cpp
src/modules/opengl/filter_movit_resample.cpp
src/modules/opengl/filter_movit_resize.cpp
src/modules/opengl/filter_movit_saturation.cpp
src/modules/opengl/filter_movit_vignette.cpp
src/modules/opengl/filter_movit_white_balance.cpp

index d941f8e9f2d6ec0710b63c0e26d53cd55e609844..e9924de0b4da55bc1c0172768ec7b3c51be49d5d 100644 (file)
@@ -41,9 +41,11 @@ extern "C" {
 #include <GL/glx.h>
 #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);
index c850c86ab567a03659b2efcc22ecb288ab0ac9b4..496e1922688bce6ddf4cfe13bdb550064b279865 100644 (file)
@@ -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);
index 79acaaae3504d9360bc7085487d3e7930e54a9d3..e89a09daf61cb39dff799105704beacacd798ff7 100644 (file)
@@ -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;
        }
index c35b546dcbfb366c65b53e082445c99eab305a5c..dab3eae41dca83887bb4be161939091be89b7715 100644 (file)
@@ -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;
index 7f5381ecac664b1d423929f71e220610fab24660..120bbca9d79c67de4ed401fa3ec510999dd65376 100644 (file)
@@ -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;
index 34d779e0adf9671d878bfe353b48be454669e884..20edea67bc4c0da86d932eed03d824bd02296d25 100644 (file)
@@ -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 );
index c04c2ce4d98f1d1ed1efc06164e983e72596bf04..0ffdf7bb555867030be71c8eb2a63db58e77f9ee 100644 (file)
@@ -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;
index ab9ea0c5e7372ac53a92ec2741367b4086569a5e..3d5f198f30ba1231a1e7ced6fed056cb472c9119 100644 (file)
@@ -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 );
index de934d035aabde99c33b289e26299729255ee48d..a45d87b314b7ae355e135fdcaba76bafdb226595 100644 (file)
@@ -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 );
index 12d8d271bb58610e6922d46bdc2e97245db3b87b..6c7b61328358f1909b579dd92279ff8894834a53 100644 (file)
@@ -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;
index 5916c34e6f595d4ced4af8b5ee5c011f5bacfec8..3cdb8ab3bd1c420dd779a96735aa5ddee7a402b1 100644 (file)
@@ -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;
        }
index 7f2386eb3bb98a8d23921adb9b2751a1aa6e8bbb..110fd8f0228a7a98708f19b40cc9afccba0da6a5 100644 (file)
@@ -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;
index ea6df48f218ee734df7cd6cbd42058bcf6c5d857..74dd55a9eb2167955cb46daafd2b791860192313 100644 (file)
@@ -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;
index 15480d1208063003adce5325297ccdbc4a40a520..c5f2835f16c0a9c0ad50e0147dba6983a5956db6 100644 (file)
@@ -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;
index d23a0503063b7908616901e43e9e47ddaed230dd..fa8a7e7d5c83ed7de1f017e9eb9484ee8214929c 100644 (file)
@@ -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;
        }
index bdcb8a28b7d8b811b592f8febf2c46246e2ee906..f4ff63d9f01747d40823d6ac817ee0ecda0a5825 100644 (file)
@@ -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 );
index 71a325d51cb94f38968b4d80ad2d7d793fc818c0..d2301ee71ca6d5d43d94f5113e9a3c6792139439 100644 (file)
@@ -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;