From 275e104be637325ac005062817a7d6a48914776d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 10 May 2013 12:49:06 +0200 Subject: [PATCH] egl: Add destroy notify instead of always calling eglTerminate() on the display 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 | 2 +- gst-libs/gst/egl/egl.c | 8 +++++--- gst-libs/gst/egl/egl.h | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/ext/eglgles/gstegladaptation_egl.c b/ext/eglgles/gstegladaptation_egl.c index f54fb11d3b..cecbcd4ab9 100644 --- a/ext/eglgles/gstegladaptation_egl.c +++ b/ext/eglgles/gstegladaptation_egl.c @@ -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); diff --git a/gst-libs/gst/egl/egl.c b/gst-libs/gst/egl/egl.c index 1c5d04c517..0b0ebcc247 100644 --- a/gst-libs/gst/egl/egl.c +++ b/gst-libs/gst/egl/egl.c @@ -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); } } diff --git a/gst-libs/gst/egl/egl.h b/gst-libs/gst/egl/egl.h index fa6464ee4b..ebc623322b 100644 --- a/gst-libs/gst/egl/egl.h +++ b/gst-libs/gst/egl/egl.h @@ -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);