mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-30 12:10:37 +00:00
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
This commit is contained in:
parent
db3d5f92d6
commit
275e104be6
3 changed files with 7 additions and 5 deletions
|
@ -168,7 +168,7 @@ gst_egl_adaptation_init_egl_display (GstEglAdaptationContext * ctx)
|
||||||
GST_ERROR_OBJECT (ctx->element, "Could not get EGL display connection");
|
GST_ERROR_OBJECT (ctx->element, "Could not get EGL display connection");
|
||||||
goto HANDLE_ERROR; /* No EGL error is set by eglGetDisplay() */
|
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 ();
|
context = gst_context_new ();
|
||||||
gst_context_set_egl_display (context, ctx->display);
|
gst_context_set_egl_display (context, ctx->display);
|
||||||
|
|
|
@ -328,16 +328,18 @@ struct _GstEGLDisplay
|
||||||
{
|
{
|
||||||
EGLDisplay display;
|
EGLDisplay display;
|
||||||
volatile gint refcount;
|
volatile gint refcount;
|
||||||
|
GDestroyNotify destroy_notify;
|
||||||
};
|
};
|
||||||
|
|
||||||
GstEGLDisplay *
|
GstEGLDisplay *
|
||||||
gst_egl_display_new (EGLDisplay display)
|
gst_egl_display_new (EGLDisplay display, GDestroyNotify destroy_notify)
|
||||||
{
|
{
|
||||||
GstEGLDisplay *gdisplay;
|
GstEGLDisplay *gdisplay;
|
||||||
|
|
||||||
gdisplay = g_slice_new (GstEGLDisplay);
|
gdisplay = g_slice_new (GstEGLDisplay);
|
||||||
gdisplay->display = display;
|
gdisplay->display = display;
|
||||||
gdisplay->refcount = 1;
|
gdisplay->refcount = 1;
|
||||||
|
gdisplay->destroy_notify = destroy_notify;
|
||||||
|
|
||||||
return gdisplay;
|
return gdisplay;
|
||||||
}
|
}
|
||||||
|
@ -358,8 +360,8 @@ gst_egl_display_unref (GstEGLDisplay * display)
|
||||||
g_return_if_fail (display != NULL);
|
g_return_if_fail (display != NULL);
|
||||||
|
|
||||||
if (g_atomic_int_dec_and_test (&display->refcount)) {
|
if (g_atomic_int_dec_and_test (&display->refcount)) {
|
||||||
if (display->display != EGL_NO_DISPLAY)
|
if (display->destroy_notify)
|
||||||
eglTerminate (display->display);
|
display->destroy_notify (display->display);
|
||||||
g_slice_free (GstEGLDisplay, display);
|
g_slice_free (GstEGLDisplay, display);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,7 +65,7 @@ gboolean gst_context_get_egl_display (GstContext * context,
|
||||||
#define GST_TYPE_EGL_DISPLAY (gst_egl_display_get_type())
|
#define GST_TYPE_EGL_DISPLAY (gst_egl_display_get_type())
|
||||||
GType gst_egl_display_get_type (void);
|
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);
|
GstEGLDisplay *gst_egl_display_ref (GstEGLDisplay * display);
|
||||||
void gst_egl_display_unref (GstEGLDisplay * display);
|
void gst_egl_display_unref (GstEGLDisplay * display);
|
||||||
EGLDisplay gst_egl_display_get (GstEGLDisplay * display);
|
EGLDisplay gst_egl_display_get (GstEGLDisplay * display);
|
||||||
|
|
Loading…
Reference in a new issue