From 3b89d8a23c76aaa7cb79a53a807e87638f9b9917 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Fri, 24 Jul 2015 17:00:27 +1000 Subject: [PATCH] glwindow: pass display to implementation's _new() So they have to opportunity to fail if they cannot handle the display connection. https://bugzilla.gnome.org/show_bug.cgi?id=752743 --- .../gst/gl/android/gstglwindow_android_egl.c | 10 ++--- .../gst/gl/android/gstglwindow_android_egl.h | 2 +- gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h | 2 +- gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m | 9 +++-- .../gl/dispmanx/gstglwindow_dispmanx_egl.c | 37 +++++++++---------- .../gl/dispmanx/gstglwindow_dispmanx_egl.h | 2 +- gst-libs/gst/gl/eagl/gstglwindow_eagl.h | 2 +- gst-libs/gst/gl/eagl/gstglwindow_eagl.m | 7 ++-- gst-libs/gst/gl/gstglwindow.c | 12 +++--- .../gst/gl/wayland/gstglwindow_wayland_egl.c | 15 ++++---- .../gst/gl/wayland/gstglwindow_wayland_egl.h | 2 +- gst-libs/gst/gl/win32/gstglwindow_win32.c | 7 +++- gst-libs/gst/gl/win32/gstglwindow_win32.h | 2 +- gst-libs/gst/gl/x11/gstglwindow_x11.c | 9 ++--- 14 files changed, 59 insertions(+), 59 deletions(-) diff --git a/gst-libs/gst/gl/android/gstglwindow_android_egl.c b/gst-libs/gst/gl/android/gstglwindow_android_egl.c index 14e07e19af..4e57f4c90e 100644 --- a/gst-libs/gst/gl/android/gstglwindow_android_egl.c +++ b/gst-libs/gst/gl/android/gstglwindow_android_egl.c @@ -69,15 +69,15 @@ gst_gl_window_android_egl_init (GstGLWindowAndroidEGL * window) /* Must be called in the gl thread */ GstGLWindowAndroidEGL * -gst_gl_window_android_egl_new (void) +gst_gl_window_android_egl_new (GstGLDisplay * display) { - GstGLWindowAndroidEGL *window; + if ((gst_gl_display_get_handle_type (display) & GST_GL_DISPLAY_TYPE_EGL) == 0) + /* we require an egl display to create android windows */ + return NULL; GST_DEBUG ("creating Android EGL window"); - window = g_object_new (GST_GL_TYPE_WINDOW_ANDROID_EGL, NULL); - - return window; + return g_object_new (GST_GL_TYPE_WINDOW_ANDROID_EGL, NULL); } static void diff --git a/gst-libs/gst/gl/android/gstglwindow_android_egl.h b/gst-libs/gst/gl/android/gstglwindow_android_egl.h index b0a44e02b2..eaada441ec 100644 --- a/gst-libs/gst/gl/android/gstglwindow_android_egl.h +++ b/gst-libs/gst/gl/android/gstglwindow_android_egl.h @@ -58,7 +58,7 @@ struct _GstGLWindowAndroidEGLClass { GType gst_gl_window_android_egl_get_type (void); -GstGLWindowAndroidEGL * gst_gl_window_android_egl_new (void); +GstGLWindowAndroidEGL * gst_gl_window_android_egl_new (GstGLDisplay * display); G_END_DECLS diff --git a/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h b/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h index 775c2916fe..21c59173b2 100644 --- a/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h +++ b/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h @@ -58,7 +58,7 @@ struct _GstGLWindowCocoaClass { GType gst_gl_window_cocoa_get_type (void); -GstGLWindowCocoa * gst_gl_window_cocoa_new (void); +GstGLWindowCocoa * gst_gl_window_cocoa_new (GstGLDisplay * display); void gst_gl_window_cocoa_draw_thread (GstGLWindowCocoa *window_cocoa); diff --git a/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m b/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m index 52abfca7cd..975fe5a902 100644 --- a/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m +++ b/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m @@ -129,13 +129,14 @@ gst_gl_window_cocoa_finalize (GObject * object) G_OBJECT_CLASS (parent_class)->finalize (object); } -/* Must be called in the gl thread */ GstGLWindowCocoa * -gst_gl_window_cocoa_new (void) +gst_gl_window_cocoa_new (GstGLDisplay * display) { - GstGLWindowCocoa *window = g_object_new (GST_GL_TYPE_WINDOW_COCOA, NULL); + if ((gst_gl_display_get_handle_type (display) & GST_GL_DISPLAY_TYPE_COCOA) == 0) + /* we require an cocoa display to create CGL windows */ + return NULL; - return window; + return g_object_new (GST_GL_TYPE_WINDOW_COCOA, NULL); } /* Must be called from the main thread */ diff --git a/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c b/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c index a1be53d3f7..99fd7414b9 100644 --- a/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c +++ b/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c @@ -83,29 +83,28 @@ gst_gl_window_dispmanx_egl_class_init (GstGLWindowDispmanxEGLClass * klass) static void gst_gl_window_dispmanx_egl_init (GstGLWindowDispmanxEGL * window_egl) { + window_egl->egldisplay = EGL_DEFAULT_DISPLAY; + + window_egl->visible = FALSE; + window_egl->display = 0; + window_egl->dp_width = 0; + window_egl->dp_height = 0; + window_egl->native.element = 0; + window_egl->native.width = 0; + window_egl->native.height = 0; } /* Must be called in the gl thread */ GstGLWindowDispmanxEGL * -gst_gl_window_dispmanx_egl_new (void) +gst_gl_window_dispmanx_egl_new (GstGLDisplay * display) { - GstGLWindowDispmanxEGL *window; + if ((gst_gl_display_get_handle_type (display) & GST_GL_DISPLAY_TYPE_EGL) == 0) + /* we require an egl display to create dispmanx windows */ + return NULL; GST_DEBUG ("creating Dispmanx EGL window"); - window = g_object_new (GST_GL_TYPE_WINDOW_DISPMANX_EGL, NULL); - - window->egldisplay = EGL_DEFAULT_DISPLAY; - - window->visible = FALSE; - window->display = 0; - window->dp_width = 0; - window->dp_height = 0; - window->native.element = 0; - window->native.width = 0; - window->native.height = 0; - - return window; + return g_object_new (GST_GL_TYPE_WINDOW_DISPMANX_EGL, NULL); } static void @@ -133,8 +132,8 @@ gst_gl_window_dispmanx_egl_open (GstGLWindow * window, GError ** error) gint ret = graphics_get_display_size (0, &window_egl->dp_width, &window_egl->dp_height); if (ret < 0) { - g_set_error (error, GST_GL_WINDOW_ERROR, GST_GL_WINDOW_ERROR_RESOURCE_UNAVAILABLE, - "Can't open display"); + g_set_error (error, GST_GL_WINDOW_ERROR, + GST_GL_WINDOW_ERROR_RESOURCE_UNAVAILABLE, "Can't open display"); return FALSE; } GST_DEBUG ("Got display size: %dx%d\n", window_egl->dp_width, @@ -236,8 +235,8 @@ window_resize (GstGLWindowDispmanxEGL * window_egl, guint width, guint height, vc_dispmanx_update_submit_sync (dispman_update); if (GST_GL_WINDOW (window_egl)->resize) - GST_GL_WINDOW (window_egl)->resize (GST_GL_WINDOW (window_egl)-> - resize_data, width, height); + GST_GL_WINDOW (window_egl)-> + resize (GST_GL_WINDOW (window_egl)->resize_data, width, height); } window_egl->native.width = width; diff --git a/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h b/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h index bf5161357c..df23eb5f37 100644 --- a/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h +++ b/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h @@ -83,7 +83,7 @@ struct _GstGLWindowDispmanxEGLClass { GType gst_gl_window_dispmanx_egl_get_type (void); -GstGLWindowDispmanxEGL * gst_gl_window_dispmanx_egl_new (void); +GstGLWindowDispmanxEGL * gst_gl_window_dispmanx_egl_new (GstGLDisplay * display); gboolean gst_gl_window_dispmanx_egl_create_window (GstGLWindowDispmanxEGL * window_egl); G_END_DECLS diff --git a/gst-libs/gst/gl/eagl/gstglwindow_eagl.h b/gst-libs/gst/gl/eagl/gstglwindow_eagl.h index 6e71b7e3c0..ce3d0b3946 100644 --- a/gst-libs/gst/gl/eagl/gstglwindow_eagl.h +++ b/gst-libs/gst/gl/eagl/gstglwindow_eagl.h @@ -57,7 +57,7 @@ struct _GstGLWindowEaglClass { GType gst_gl_window_eagl_get_type (void); -GstGLWindowEagl * gst_gl_window_eagl_new (void); +GstGLWindowEagl * gst_gl_window_eagl_new (GstGLDisplay * display); G_END_DECLS diff --git a/gst-libs/gst/gl/eagl/gstglwindow_eagl.m b/gst-libs/gst/gl/eagl/gstglwindow_eagl.m index 7ccffa80c0..359b2b59a7 100644 --- a/gst-libs/gst/gl/eagl/gstglwindow_eagl.m +++ b/gst-libs/gst/gl/eagl/gstglwindow_eagl.m @@ -84,11 +84,10 @@ gst_gl_window_eagl_init (GstGLWindowEagl * window) /* Must be called in the gl thread */ GstGLWindowEagl * -gst_gl_window_eagl_new (void) +gst_gl_window_eagl_new (GstGLDisplay * display) { - GstGLWindowEagl *window = g_object_new (GST_GL_TYPE_WINDOW_EAGL, NULL); - - return window; + /* there isn't an eagl display type */ + return g_object_new (GST_GL_TYPE_WINDOW_EAGL, NULL); } static guintptr diff --git a/gst-libs/gst/gl/gstglwindow.c b/gst-libs/gst/gl/gstglwindow.c index 403eed65b7..a69b10d10b 100644 --- a/gst-libs/gst/gl/gstglwindow.c +++ b/gst-libs/gst/gl/gstglwindow.c @@ -272,7 +272,7 @@ gst_gl_window_new (GstGLDisplay * display) #if GST_GL_HAVE_WINDOW_COCOA if (!window && (!user_choice || g_strstr_len (user_choice, 5, "cocoa"))) - window = GST_GL_WINDOW (gst_gl_window_cocoa_new ()); + window = GST_GL_WINDOW (gst_gl_window_cocoa_new (display)); #endif #if GST_GL_HAVE_WINDOW_X11 if (!window && (!user_choice || g_strstr_len (user_choice, 3, "x11"))) @@ -280,23 +280,23 @@ gst_gl_window_new (GstGLDisplay * display) #endif #if GST_GL_HAVE_WINDOW_WIN32 if (!window && (!user_choice || g_strstr_len (user_choice, 5, "win32"))) - window = GST_GL_WINDOW (gst_gl_window_win32_new ()); + window = GST_GL_WINDOW (gst_gl_window_win32_new (display)); #endif #if GST_GL_HAVE_WINDOW_WAYLAND if (!window && (!user_choice || g_strstr_len (user_choice, 7, "wayland"))) - window = GST_GL_WINDOW (gst_gl_window_wayland_egl_new ()); + window = GST_GL_WINDOW (gst_gl_window_wayland_egl_new (display)); #endif #if GST_GL_HAVE_WINDOW_DISPMANX if (!window && (!user_choice || g_strstr_len (user_choice, 8, "dispmanx"))) - window = GST_GL_WINDOW (gst_gl_window_dispmanx_egl_new ()); + window = GST_GL_WINDOW (gst_gl_window_dispmanx_egl_new (display)); #endif #if GST_GL_HAVE_WINDOW_ANDROID if (!window && (!user_choice || g_strstr_len (user_choice, 7, "android"))) - window = GST_GL_WINDOW (gst_gl_window_android_egl_new ()); + window = GST_GL_WINDOW (gst_gl_window_android_egl_new (display)); #endif #if GST_GL_HAVE_WINDOW_EAGL if (!window && (!user_choice || g_strstr_len (user_choice, 4, "eagl"))) - window = GST_GL_WINDOW (gst_gl_window_eagl_new ()); + window = GST_GL_WINDOW (gst_gl_window_eagl_new (display)); #endif if (!window) { /* subclass returned a NULL window */ diff --git a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c index bfa7741a47..07beb3dd7f 100644 --- a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c +++ b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c @@ -290,8 +290,8 @@ create_surfaces (GstGLWindowWaylandEGL * window_egl) wl_shell_get_shell_surface (display->shell, window_egl->window.surface); if (window_egl->window.queue) - wl_proxy_set_queue ((struct wl_proxy *) window_egl-> - window.shell_surface, window_egl->window.queue); + wl_proxy_set_queue ((struct wl_proxy *) window_egl->window. + shell_surface, window_egl->window.queue); wl_shell_surface_add_listener (window_egl->window.shell_surface, &shell_surface_listener, window_egl); @@ -351,15 +351,16 @@ gst_gl_window_wayland_egl_init (GstGLWindowWaylandEGL * window) /* Must be called in the gl thread */ GstGLWindowWaylandEGL * -gst_gl_window_wayland_egl_new (void) +gst_gl_window_wayland_egl_new (GstGLDisplay * display) { - GstGLWindowWaylandEGL *window; + if ((gst_gl_display_get_handle_type (display) & GST_GL_DISPLAY_TYPE_WAYLAND) + == 0) + /* we require a wayland display to create wayland surfaces */ + return NULL; GST_DEBUG ("creating Wayland EGL window"); - window = g_object_new (GST_GL_TYPE_WINDOW_WAYLAND_EGL, NULL); - - return window; + return g_object_new (GST_GL_TYPE_WINDOW_WAYLAND_EGL, NULL); } static void diff --git a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h index c7889e13ee..f76b5b0021 100644 --- a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h +++ b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h @@ -97,7 +97,7 @@ struct _GstGLWindowWaylandEGLClass { GType gst_gl_window_wayland_egl_get_type (void); -GstGLWindowWaylandEGL * gst_gl_window_wayland_egl_new (void); +GstGLWindowWaylandEGL * gst_gl_window_wayland_egl_new (GstGLDisplay * display); void gst_gl_window_wayland_egl_create_window (GstGLWindowWaylandEGL * window_egl); diff --git a/gst-libs/gst/gl/win32/gstglwindow_win32.c b/gst-libs/gst/gl/win32/gstglwindow_win32.c index 7d93305afa..5eb5134fc0 100644 --- a/gst-libs/gst/gl/win32/gstglwindow_win32.c +++ b/gst-libs/gst/gl/win32/gstglwindow_win32.c @@ -94,9 +94,12 @@ gst_gl_window_win32_init (GstGLWindowWin32 * window) GstGLWindowWin32 * gst_gl_window_win32_new (void) { - GstGLWindowWin32 *window = g_object_new (GST_GL_TYPE_WINDOW_WIN32, NULL); + if ((gst_gl_display_get_handle_type (display) & GST_GL_DISPLAY_TYPE_WIN32) == + 0) + /* we require an win32 display to create win32 windows */ + return NULL; - return window; + return g_object_new (GST_GL_TYPE_WINDOW_WIN32, NULL); } static void diff --git a/gst-libs/gst/gl/win32/gstglwindow_win32.h b/gst-libs/gst/gl/win32/gstglwindow_win32.h index 50a90fb6a4..080a4d49c4 100644 --- a/gst-libs/gst/gl/win32/gstglwindow_win32.h +++ b/gst-libs/gst/gl/win32/gstglwindow_win32.h @@ -77,7 +77,7 @@ struct _GstGLWindowWin32Class { GType gst_gl_window_win32_get_type (void); -GstGLWindowWin32 * gst_gl_window_win32_new (void); +GstGLWindowWin32 * gst_gl_window_win32_new (GstGLDisplay * display); gboolean gst_gl_window_win32_create_window (GstGLWindowWin32 * window_win32, GError ** error); diff --git a/gst-libs/gst/gl/x11/gstglwindow_x11.c b/gst-libs/gst/gl/x11/gstglwindow_x11.c index 5782eeaca1..e9d5391379 100644 --- a/gst-libs/gst/gl/x11/gstglwindow_x11.c +++ b/gst-libs/gst/gl/x11/gstglwindow_x11.c @@ -130,17 +130,14 @@ gst_gl_window_x11_init (GstGLWindowX11 * window) GstGLWindowX11 * gst_gl_window_x11_new (GstGLDisplay * display) { - GstGLWindowX11 *window = NULL; - - if ((display->type & GST_GL_DISPLAY_TYPE_X11) == GST_GL_DISPLAY_TYPE_NONE) { + if ((gst_gl_display_get_handle_type (display) & GST_GL_DISPLAY_TYPE_X11) + == GST_GL_DISPLAY_TYPE_NONE) { GST_INFO ("Wrong display type %u for this window type %u", display->type, GST_GL_DISPLAY_TYPE_X11); return NULL; } - window = g_object_new (GST_GL_TYPE_WINDOW_X11, NULL); - - return window; + return g_object_new (GST_GL_TYPE_WINDOW_X11, NULL); } gboolean