egl: Add destroy notify instead of always calling eglTerminate() on the display
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Fri, 10 May 2013 10:49:06 +0000 (12:49 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Fri, 10 May 2013 10:50:05 +0000 (12:50 +0200)
In some scenarios, for example in QtWebKit, might be difficult to obtain full
control on the egl display and it might be only accessible indirectly via
eglGetCurrentDisplay().

https://bugzilla.gnome.org/show_bug.cgi?id=700058

ext/eglgles/gstegladaptation_egl.c
gst-libs/gst/egl/egl.c
gst-libs/gst/egl/egl.h

index f54fb11..cecbcd4 100644 (file)
@@ -168,7 +168,7 @@ gst_egl_adaptation_init_egl_display (GstEglAdaptationContext * ctx)
       GST_ERROR_OBJECT (ctx->element, "Could not get EGL display connection");
       goto HANDLE_ERROR;        /* No EGL error is set by eglGetDisplay() */
     }
-    ctx->display = gst_egl_display_new (display);
+    ctx->display = gst_egl_display_new (display, (GDestroyNotify) eglTerminate);
 
     context = gst_context_new ();
     gst_context_set_egl_display (context, ctx->display);
index 1c5d04c..0b0ebcc 100644 (file)
@@ -328,16 +328,18 @@ struct _GstEGLDisplay
 {
   EGLDisplay display;
   volatile gint refcount;
+  GDestroyNotify destroy_notify;
 };
 
 GstEGLDisplay *
-gst_egl_display_new (EGLDisplay display)
+gst_egl_display_new (EGLDisplay display, GDestroyNotify destroy_notify)
 {
   GstEGLDisplay *gdisplay;
 
   gdisplay = g_slice_new (GstEGLDisplay);
   gdisplay->display = display;
   gdisplay->refcount = 1;
+  gdisplay->destroy_notify = destroy_notify;
 
   return gdisplay;
 }
@@ -358,8 +360,8 @@ gst_egl_display_unref (GstEGLDisplay * display)
   g_return_if_fail (display != NULL);
 
   if (g_atomic_int_dec_and_test (&display->refcount)) {
-    if (display->display != EGL_NO_DISPLAY)
-      eglTerminate (display->display);
+    if (display->destroy_notify)
+      display->destroy_notify (display->display);
     g_slice_free (GstEGLDisplay, display);
   }
 }
index fa6464e..ebc6233 100644 (file)
@@ -65,7 +65,7 @@ gboolean gst_context_get_egl_display (GstContext * context,
 #define GST_TYPE_EGL_DISPLAY (gst_egl_display_get_type())
 GType gst_egl_display_get_type (void);
 
-GstEGLDisplay *gst_egl_display_new (EGLDisplay display);
+GstEGLDisplay *gst_egl_display_new (EGLDisplay display, GDestroyNotify destroy_notify);
 GstEGLDisplay *gst_egl_display_ref (GstEGLDisplay * display);
 void gst_egl_display_unref (GstEGLDisplay * display);
 EGLDisplay gst_egl_display_get (GstEGLDisplay * display);