eglglessink: Fix crash when closing internal X11 window
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Wed, 26 Dec 2012 09:34:21 +0000 (10:34 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Thu, 21 Mar 2013 08:58:57 +0000 (09:58 +0100)
ext/eglgles/gsteglglessink.c
ext/eglgles/gsteglglessink.h
ext/eglgles/video_platform_wrapper.c
ext/eglgles/video_platform_wrapper.h

index 570a99f66ef49e9c9edc6528e5dda71598b7a73f..95e19ed3e9a5e2f239edbec98082f0e47607cd3f 100644 (file)
@@ -810,7 +810,7 @@ gst_eglglessink_stop (GstEglGlesSink * eglglessink)
 
   if (eglglessink->using_own_window) {
     platform_destroy_native_window (eglglessink->eglglesctx.display,
-        eglglessink->eglglesctx.used_window);
+        eglglessink->eglglesctx.used_window, &eglglessink->own_window_data);
     eglglessink->eglglesctx.used_window = 0;
     eglglessink->have_window = FALSE;
   }
@@ -866,7 +866,7 @@ gst_eglglessink_create_window (GstEglGlesSink * eglglessink, gint width,
   } else
     GST_INFO_OBJECT (eglglessink, "Attempting internal window creation");
 
-  window = platform_create_native_window (width, height);
+  window = platform_create_native_window (width, height, &eglglessink->own_window_data);
   if (!window) {
     GST_ERROR_OBJECT (eglglessink, "Could not create window");
     return window;
index 3f61ec8d62d918d30de3e808a744c29948a291ee..8229d640292847350205c0b890a654194f5df1c5 100644 (file)
@@ -204,6 +204,8 @@ struct _GstEglGlesSink
   gboolean have_texture;
   gboolean egl_started;
 
+  gpointer own_window_data;
+
   GThread *thread;
   gboolean thread_running;
   GstDataQueue *queue;
index ca622ed4d60020c444a03fac7f17d9aaa9280a43..bddb59475d1ddc0a47692bb164917d7c58e91436 100644 (file)
@@ -73,13 +73,17 @@ platform_wrapper_init (void)
 }
 
 #ifdef HAVE_X11
+typedef struct {
+  Display *display;
+} X11WindowData;
+
 EGLNativeWindowType
-platform_create_native_window (gint width, gint height)
+platform_create_native_window (gint width, gint height, gpointer * window_data)
 {
   Display *d;
   Window w;
-  //XEvent e;
   int s;
+  X11WindowData *data;
 
   d = XOpenDisplay (NULL);
   if (d == NULL) {
@@ -93,15 +97,26 @@ platform_create_native_window (gint width, gint height)
   XStoreName (d, w, "eglglessink");
   XMapWindow (d, w);
   XFlush (d);
+
+  *window_data = data = g_slice_new0 (X11WindowData);
+  data->display = d;
+
   return (EGLNativeWindowType) w;
 }
 
 gboolean
 platform_destroy_native_window (EGLNativeDisplayType display,
-    EGLNativeWindowType window)
+    EGLNativeWindowType window, gpointer * window_data)
 {
+  X11WindowData *data = *window_data;
+
   /* XXX: Should proly catch BadWindow */
-  XDestroyWindow (display, window);
+  XDestroyWindow (data->display, window);
+  XSync (data->display, FALSE);
+  XCloseDisplay (data->display);
+
+  g_slice_free (X11WindowData, data);
+  *window_data = NULL;
   return TRUE;
 }
 #endif
@@ -109,7 +124,7 @@ platform_destroy_native_window (EGLNativeDisplayType display,
 #if !defined(HAVE_X11)
 /* Dummy functions for creating a native Window */
 EGLNativeWindowType
-platform_create_native_window (gint width, gint height)
+platform_create_native_window (gint width, gint height, gpointer * window_data)
 {
   GST_ERROR ("Can't create native window");
   return (EGLNativeWindowType) 0;
@@ -117,7 +132,7 @@ platform_create_native_window (gint width, gint height)
 
 gboolean
 platform_destroy_native_window (EGLNativeDisplayType display,
-    EGLNativeWindowType window)
+    EGLNativeWindowType window, gpointer * window_data)
 {
   GST_ERROR ("Can't destroy native window");
   return TRUE;
index db27c572caf9169786f6e871c0a83fb290167f47..452a4cda338ac224e1ad22b60bcfbc7148f8fcfa 100644 (file)
 #include <EGL/egl.h>
 
 gboolean platform_wrapper_init (void);
-EGLNativeWindowType platform_create_native_window (gint width, gint height);
+EGLNativeWindowType platform_create_native_window (gint width, gint height, gpointer * window_data);
 gboolean platform_destroy_native_window (EGLNativeDisplayType display,
-    EGLNativeWindowType w);
-EGLint *platform_crate_native_image_buffer (EGLNativeWindowType win,
-    EGLConfig config, EGLNativeDisplayType display, const EGLint * egl_attribs);
+    EGLNativeWindowType w, gpointer * window_data);
 
 
 #endif