[399/906] glmixer: fix when no more gl elements after it
authorJulien Isorce <julien.isorce@gmail.com>
Wed, 4 Nov 2009 22:44:46 +0000 (23:44 +0100)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 9 Dec 2017 19:31:22 +0000 (19:31 +0000)
For example:
videotestsrc ! glupload ! ... ! glfiter ! ... ! glmosaic ! fakesink
Usefull when using glmixer inside cluttershare or sdlshare cases.

gst-libs/gst/gl/gstglmixer.c

index e93dc5a..44930a0 100644 (file)
@@ -597,12 +597,22 @@ gst_gl_mixer_query (GstPad * pad, GstQuery * query)
           gst_structure_get_name (structure)) == 0;
 
       if (!res) {
-        /* id_value is set by upstream element of itself when going to paused state */
-        const GValue *id_value =
+        GstGLDisplay *foreign_display = NULL;
+        gulong foreign_gl_context = 0;
+
+        if (mix->display) {
+          /* this gl filter is a sink in terms of the gl chain */
+          foreign_display = mix->display;
+        } else {
+          /* at least one gl element is after in our gl chain */
+          /* id_value is set by upstream element of itself when going
+           * to paused state */
+          const GValue *id_value =
             gst_structure_get_value (structure, "gstgldisplay");
-        GstGLDisplay *foreign_display =
-            GST_GL_DISPLAY (g_value_get_pointer (id_value));
-        gulong foreign_gl_context =
+          foreign_display = GST_GL_DISPLAY (g_value_get_pointer (id_value));
+        }
+        
+        foreign_gl_context =
             gst_gl_display_get_internal_gl_context (foreign_display);
 
         /* iterate on each sink pad until reaching the gl element
@@ -1230,10 +1240,11 @@ gst_gl_mixer_change_state (GstElement * element, GstStateChange transition)
           /* at least one gl element is after in our gl chain */
           mix->display =
               g_object_ref (GST_GL_DISPLAY (g_value_get_pointer (id_value)));
-        else
+        else {
           /* this gl filter is a sink in terms of the gl chain */
           mix->display = gst_gl_display_new ();
-        gst_gl_display_create_context (mix->display, 0);
+          gst_gl_display_create_context (mix->display, 0);
+        }
       }
 
       gst_query_unref (query);