]> git.sesse.net Git - mlt/commitdiff
Fix OpenGL context cleanup on Windows.
authorDan Dennedy <dan@dennedy.org>
Sat, 23 Feb 2013 20:48:45 +0000 (12:48 -0800)
committerDan Dennedy <dan@dennedy.org>
Sat, 23 Feb 2013 20:48:45 +0000 (12:48 -0800)
Would crash at end of melt with qglsl.

src/melt/melt.c
src/modules/opengl/mlt_movit_input.cpp
src/modules/qimage/consumer_qglsl.cpp

index ddb33359641893a74d3fab02f98d6b9b9600e152..a5cf16537b895e3a000dd03e1eb844f0259e74db 100644 (file)
@@ -970,7 +970,10 @@ query_all:
 
        // Disconnect producer from consumer to prevent ref cycles from closing services
        if ( consumer )
+       {
                mlt_consumer_connect( consumer, NULL );
+               mlt_events_fire( MLT_CONSUMER_PROPERTIES(consumer), "consumer-cleanup", NULL);
+       }
 
        // Close the producer
        if ( melt != NULL )
index 7a1ca03c9051a8f21b56d1e4256e873cffad6b59..f4b29022eb894f2508c24fff72ca99571458634c 100644 (file)
@@ -34,7 +34,9 @@ MltInput::MltInput(unsigned width, unsigned height)
 
 MltInput::~MltInput()
 {
-       delete input;
+       // XXX: this is crashing when a producer is closed
+       // on Windows when using melt with qglsl.
+//     delete input;
 }
 
 std::string MltInput::output_fragment_shader()
index a790bb2e3d9e9ab8345c2873ad8cb091968c8bca..d87a7b75810cf1d4827ac929640add61015e509d 100644 (file)
@@ -53,20 +53,20 @@ static void onThreadStarted(mlt_properties owner, mlt_consumer consumer)
                        "OpenGL Shading Language rendering is not supported on this machine.\n" );
                mlt_events_fire(properties, "consumer-fatal-error", NULL);
        }
-    else {
-        mlt_properties_set_data(properties, "qglslRenderContext", renderContext, 0, NULL, NULL);
-    }
+       else {
+               mlt_properties_set_data(properties, "qglslRenderContext", renderContext, 0, NULL, NULL);
+       }
 }
 
-static void onThreadStopped(mlt_properties owner, mlt_consumer consumer)
+static void onCleanup(mlt_properties owner, mlt_consumer consumer)
 {
-    mlt_properties properties = MLT_CONSUMER_PROPERTIES(consumer);
-    QGLWidget* renderContext = (QGLWidget*) mlt_properties_get_data(properties, "qglslRenderContext", NULL);
-    if (renderContext) {
-        renderContext->doneCurrent();
-        delete renderContext;
-        mlt_properties_set_data(properties, "qglslRenderContext", NULL, 0, NULL, NULL);
-    }
+       QGLWidget* renderContext = (QGLWidget*) mlt_properties_get_data(
+               MLT_CONSUMER_PROPERTIES(consumer), "qglslRenderContext", NULL);
+       if (renderContext)
+               renderContext->makeCurrent();
+       delete renderContext;
+       mlt_properties_set_data(MLT_CONSUMER_PROPERTIES(consumer),
+               "qglslRenderContext", NULL, 0, NULL, NULL);
 }
 
 extern "C" {
@@ -79,8 +79,9 @@ mlt_consumer consumer_qglsl_init( mlt_profile profile, mlt_service_type type, co
                if (filter) {
                        mlt_properties properties = MLT_CONSUMER_PROPERTIES(consumer);
                        mlt_properties_set_data(properties, "glslManager", filter, 0, (mlt_destructor) mlt_filter_close, NULL);
+                       mlt_events_register( properties, "consumer-cleanup", NULL );
                        mlt_events_listen(properties, consumer, "consumer-thread-started", (mlt_listener) onThreadStarted);
-            mlt_events_listen(properties, consumer, "consumer-thread-stopped", (mlt_listener) onThreadStopped);
+                       mlt_events_listen(properties, consumer, "consumer-cleanup", (mlt_listener) onCleanup);
                        return consumer;
                }
                mlt_consumer_close(consumer);