]> git.sesse.net Git - mlt/commitdiff
Add locking to opengl services for thread protection.
authorDan Dennedy <dan@dennedy.org>
Fri, 8 Mar 2013 03:56:16 +0000 (19:56 -0800)
committerDan Dennedy <dan@dennedy.org>
Fri, 8 Mar 2013 03:56:16 +0000 (19:56 -0800)
src/modules/opengl/filter_movit_crop.cpp
src/modules/opengl/filter_movit_opacity.cpp
src/modules/opengl/filter_movit_resample.cpp
src/modules/opengl/filter_movit_resize.cpp
src/modules/opengl/transition_movit_mix.cpp
src/modules/opengl/transition_movit_overlay.cpp

index 1bacd1a71230b8f581f7ce0174e41486cad7e9a7..d56eefe1cc9736af1ec45541a807bdebb4869aa5 100644 (file)
@@ -74,6 +74,7 @@ static int get_image( mlt_frame frame, uint8_t **image, mlt_image_format *format
 
                mlt_log_debug( MLT_FILTER_SERVICE(filter), "%dx%d -> %dx%d\n", *width, *height, owidth, oheight);
 
+               GlslManager::get_instance()->lock_service( frame );
                Effect* effect = GlslManager::get_effect( filter, frame );
                if ( effect ) {
                        bool ok = effect->set_int( "width", owidth );
@@ -84,6 +85,7 @@ static int get_image( mlt_frame frame, uint8_t **image, mlt_image_format *format
                        *width = owidth;
                        *height = oheight;
                }
+               GlslManager::get_instance()->unlock_service( frame );
        }
 
        return error;
index 6a7333d17be4fa93cd3e611a5378496005b2608f..8586182a9a0f2c2c3913597463506d821dd5a040 100644 (file)
@@ -28,9 +28,13 @@ static int get_image( mlt_frame frame, uint8_t **image, mlt_image_format *format
 {
        mlt_filter filter = (mlt_filter) mlt_frame_pop_service( frame );
        mlt_properties properties = MLT_FILTER_PROPERTIES( filter );
+       GlslManager::get_instance()->lock_service( frame );
        Effect* effect = GlslManager::get_effect( filter, frame );
-       bool ok = effect->set_float( "strength_first", mlt_properties_get_double( properties, "opacity" ) );
-       assert(ok);
+       if ( effect ) {
+               bool ok = effect->set_float( "strength_first", mlt_properties_get_double( properties, "opacity" ) );
+               assert(ok);
+       }
+       GlslManager::get_instance()->unlock_service( frame );
        *format = mlt_image_glsl;
        return mlt_frame_get_image( frame, image, format, width, height, writable );
 }
index 5ecdfbbd17bf6991b9a9c714266600caff18a54b..3375b2862828889d492d101a8324d799d57b2d44 100644 (file)
@@ -65,6 +65,7 @@ static int get_image( mlt_frame frame, uint8_t **image, mlt_image_format *format
                *format = mlt_image_glsl;
        error = mlt_frame_get_image( frame, image, format, &iwidth, &iheight, writable );
        if ( !error ) {
+               GlslManager::get_instance()->lock_service( frame );
                Effect* effect = GlslManager::get_effect( filter, frame );
                if ( effect ) {
                        bool ok = effect->set_int( "width", owidth );
@@ -73,6 +74,7 @@ static int get_image( mlt_frame frame, uint8_t **image, mlt_image_format *format
                        *width = owidth;
                        *height = oheight;
                }
+               GlslManager::get_instance()->unlock_service( frame );
        }
 
        return error;
index eb433febc4d1ba18f49a9c315b840be797c466ff..cb1c542f9ea1a480a15b5428a355ac953c107360 100644 (file)
@@ -174,6 +174,7 @@ static int get_image( mlt_frame frame, uint8_t **image, mlt_image_format *format
        }
 
        if ( !error ) {
+               GlslManager::get_instance()->lock_service( frame );
                Effect* effect = GlslManager::get_effect( filter, frame );
                if ( effect ) {
                        bool ok = effect->set_int( "width", *width );
@@ -182,6 +183,7 @@ static int get_image( mlt_frame frame, uint8_t **image, mlt_image_format *format
                        ok |= effect->set_float( "top", geometry_item.y );
                        assert(ok);
                }
+               GlslManager::get_instance()->unlock_service( frame );
        }
 
        return error;
index 05d0ce78b9cc9665f3dd1df47a845e8a6b8b190f..176798a52440ea3f9bb06a09009058fe1993d047 100644 (file)
@@ -48,12 +48,18 @@ static int get_image( mlt_frame a_frame, uint8_t **image, mlt_image_format *form
 
        // Get the movit objects
        mlt_service service = MLT_TRANSITION_SERVICE( transition );
+       mlt_service_lock( service );
        EffectChain* chain = GlslManager::get_chain( service );
        Effect* effect = (Effect*) mlt_properties_get_data( properties, "movit effect", NULL );
        MltInput* a_input = GlslManager::get_input( service );
        MltInput* b_input = (MltInput*) mlt_properties_get_data( properties, "movit input B", NULL );
        mlt_image_format output_format = *format;
 
+       if ( !chain || !a_input ) {
+               mlt_service_unlock( service );
+               return 2;
+       }
+
        // Get the transition parameters
        int reverse = mlt_properties_get_int( properties, "reverse" );
        double mix = mlt_properties_get( properties, "mix" ) ?
@@ -158,6 +164,7 @@ static int get_image( mlt_frame a_frame, uint8_t **image, mlt_image_format *form
                }
        }
        if ( fbo ) GlslManager::release_fbo( fbo );
+       mlt_service_unlock( service );
 
        return error;
 }
index 7ff55c830505ed5d64cebdf3efac27fd0ddc5da1..a877514868940eef169e1042b10542c3c5e22920 100644 (file)
@@ -48,11 +48,17 @@ static int get_image( mlt_frame a_frame, uint8_t **image, mlt_image_format *form
 
        // Get the movit objects
        mlt_service service = MLT_TRANSITION_SERVICE( transition );
+       mlt_service_lock( service );
        EffectChain* chain = GlslManager::get_chain( service );
        MltInput* a_input = GlslManager::get_input( service );
        MltInput* b_input = (MltInput*) mlt_properties_get_data( properties, "movit input B", NULL );
        mlt_image_format output_format = *format;
 
+       if ( !chain || !a_input ) {
+               mlt_service_unlock( service );
+               return 2;
+       }
+
        // Get the frames' textures
        GLuint* texture_id[2] = {0, 0};
        *format = mlt_image_glsl_texture;
@@ -145,6 +151,7 @@ static int get_image( mlt_frame a_frame, uint8_t **image, mlt_image_format *form
                }
        }
        if ( fbo ) GlslManager::release_fbo( fbo );
+       mlt_service_lock( service );
 
        return error;
 }