From fbbf1ac324cc0c43c471fb704e65aae352cd8195 Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Thu, 4 Jun 2015 12:16:35 +1000 Subject: [PATCH] gl/window: use the default main loop implementation for all backends fixes glimagsink being unable to display. https://bugzilla.gnome.org/show_bug.cgi?id=750337 --- gst-libs/gst/gl/android/gstglwindow_android_egl.c | 106 ----------------- gst-libs/gst/gl/android/gstglwindow_android_egl.h | 3 - .../gst/gl/dispmanx/gstglwindow_dispmanx_egl.c | 132 ++------------------- .../gst/gl/dispmanx/gstglwindow_dispmanx_egl.h | 3 - gst-libs/gst/gl/eagl/gstglwindow_eagl.m | 108 ----------------- gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c | 97 +-------------- gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h | 2 - gst-libs/gst/gl/win32/gstglwindow_win32.c | 97 ++------------- gst-libs/gst/gl/win32/gstglwindow_win32.h | 2 - 9 files changed, 21 insertions(+), 529 deletions(-) diff --git a/gst-libs/gst/gl/android/gstglwindow_android_egl.c b/gst-libs/gst/gl/android/gstglwindow_android_egl.c index f3c5436..14e07e1 100644 --- a/gst-libs/gst/gl/android/gstglwindow_android_egl.c +++ b/gst-libs/gst/gl/android/gstglwindow_android_egl.c @@ -38,7 +38,6 @@ #define gst_gl_window_android_egl_parent_class parent_class G_DEFINE_TYPE (GstGLWindowAndroidEGL, gst_gl_window_android_egl, GST_GL_TYPE_WINDOW); -static void gst_gl_window_android_egl_finalize (GObject * object); static guintptr gst_gl_window_android_egl_get_display (GstGLWindow * window); static guintptr gst_gl_window_android_egl_get_window_handle (GstGLWindow * @@ -46,19 +45,11 @@ static guintptr gst_gl_window_android_egl_get_window_handle (GstGLWindow * static void gst_gl_window_android_egl_set_window_handle (GstGLWindow * window, guintptr handle); static void gst_gl_window_android_egl_draw (GstGLWindow * window); -static void gst_gl_window_android_egl_run (GstGLWindow * window); -static void gst_gl_window_android_egl_quit (GstGLWindow * window); -static void gst_gl_window_android_egl_send_message_async (GstGLWindow * window, - GstGLWindowCB callback, gpointer data, GDestroyNotify destroy); -static gboolean gst_gl_window_android_egl_open (GstGLWindow * window, - GError ** error); -static void gst_gl_window_android_egl_close (GstGLWindow * window); static void gst_gl_window_android_egl_class_init (GstGLWindowAndroidEGLClass * klass) { GstGLWindowClass *window_class = (GstGLWindowClass *) klass; - GObjectClass *gobject_class = (GObjectClass *) klass; window_class->get_display = GST_DEBUG_FUNCPTR (gst_gl_window_android_egl_get_display); @@ -69,32 +60,11 @@ gst_gl_window_android_egl_class_init (GstGLWindowAndroidEGLClass * klass) window_class->draw_unlocked = GST_DEBUG_FUNCPTR (gst_gl_window_android_egl_draw); window_class->draw = GST_DEBUG_FUNCPTR (gst_gl_window_android_egl_draw); - window_class->run = GST_DEBUG_FUNCPTR (gst_gl_window_android_egl_run); - window_class->quit = GST_DEBUG_FUNCPTR (gst_gl_window_android_egl_quit); - window_class->send_message_async = - GST_DEBUG_FUNCPTR (gst_gl_window_android_egl_send_message_async); - window_class->open = GST_DEBUG_FUNCPTR (gst_gl_window_android_egl_open); - window_class->close = GST_DEBUG_FUNCPTR (gst_gl_window_android_egl_close); - - gobject_class->finalize = gst_gl_window_android_egl_finalize; } static void gst_gl_window_android_egl_init (GstGLWindowAndroidEGL * window) { - window->main_context = g_main_context_new (); - window->loop = g_main_loop_new (window->main_context, FALSE); -} - -static void -gst_gl_window_android_egl_finalize (GObject * object) -{ - GstGLWindowAndroidEGL *window_egl = GST_GL_WINDOW_ANDROID_EGL (object); - - g_main_loop_unref (window_egl->loop); - g_main_context_unref (window_egl->main_context); - - G_OBJECT_CLASS (parent_class)->finalize (object); } /* Must be called in the gl thread */ @@ -110,82 +80,6 @@ gst_gl_window_android_egl_new (void) return window; } -static gboolean -gst_gl_window_android_egl_open (GstGLWindow * window, GError ** error) -{ - return TRUE; -} - -static void -gst_gl_window_android_egl_close (GstGLWindow * window) -{ -} - -static void -gst_gl_window_android_egl_run (GstGLWindow * window) -{ - GstGLWindowAndroidEGL *window_egl; - - window_egl = GST_GL_WINDOW_ANDROID_EGL (window); - - GST_LOG ("starting main loop"); - g_main_loop_run (window_egl->loop); - GST_LOG ("exiting main loop"); -} - -static void -gst_gl_window_android_egl_quit (GstGLWindow * window) -{ - GstGLWindowAndroidEGL *window_egl; - - window_egl = GST_GL_WINDOW_ANDROID_EGL (window); - - GST_LOG ("sending quit"); - - g_main_loop_quit (window_egl->loop); - - GST_LOG ("quit sent"); -} - -typedef struct _GstGLMessage -{ - GstGLWindowCB callback; - gpointer data; - GDestroyNotify destroy; -} GstGLMessage; - -static gboolean -_run_message (GstGLMessage * message) -{ - if (message->callback) - message->callback (message->data); - - if (message->destroy) - message->destroy (message->data); - - g_slice_free (GstGLMessage, message); - - return FALSE; -} - -static void -gst_gl_window_android_egl_send_message_async (GstGLWindow * window, - GstGLWindowCB callback, gpointer data, GDestroyNotify destroy) -{ - GstGLWindowAndroidEGL *window_egl; - GstGLMessage *message; - - window_egl = GST_GL_WINDOW_ANDROID_EGL (window); - message = g_slice_new (GstGLMessage); - - message->callback = callback; - message->data = data; - message->destroy = destroy; - - g_main_context_invoke (window_egl->main_context, (GSourceFunc) _run_message, - message); -} - static void gst_gl_window_android_egl_set_window_handle (GstGLWindow * window, guintptr handle) diff --git a/gst-libs/gst/gl/android/gstglwindow_android_egl.h b/gst-libs/gst/gl/android/gstglwindow_android_egl.h index 0e927e3..341cd20 100644 --- a/gst-libs/gst/gl/android/gstglwindow_android_egl.h +++ b/gst-libs/gst/gl/android/gstglwindow_android_egl.h @@ -44,9 +44,6 @@ struct _GstGLWindowAndroidEGL { EGLNativeWindowType native_window; gint window_width, window_height; - GMainContext *main_context; - GMainLoop *loop; - gpointer _reserved[GST_PADDING]; }; diff --git a/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c b/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c index 0adbfb6..3f024aa 100644 --- a/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c +++ b/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.c @@ -46,7 +46,6 @@ G_DEFINE_TYPE (GstGLWindowDispmanxEGL, gst_gl_window_dispmanx_egl, GST_GL_TYPE_WINDOW); -static void gst_gl_window_dispmanx_egl_finalize (GObject * object); static guintptr gst_gl_window_dispmanx_egl_get_window_handle (GstGLWindow * window); static void gst_gl_window_dispmanx_egl_set_window_handle (GstGLWindow * window, @@ -55,10 +54,6 @@ static void gst_gl_window_dispmanx_egl_set_preferred_size (GstGLWindow * window, gint width, gint height); static void gst_gl_window_dispmanx_egl_show (GstGLWindow * window); static void gst_gl_window_dispmanx_egl_draw (GstGLWindow * window); -static void gst_gl_window_dispmanx_egl_run (GstGLWindow * window); -static void gst_gl_window_dispmanx_egl_quit (GstGLWindow * window); -static void gst_gl_window_dispmanx_egl_send_message_async (GstGLWindow * window, - GstGLWindowCB callback, gpointer data, GDestroyNotify destroy); static void gst_gl_window_dispmanx_egl_close (GstGLWindow * window); static gboolean gst_gl_window_dispmanx_egl_open (GstGLWindow * window, GError ** error); @@ -72,46 +67,23 @@ static void gst_gl_window_dispmanx_egl_class_init (GstGLWindowDispmanxEGLClass * klass) { GstGLWindowClass *window_class = (GstGLWindowClass *) klass; - GObjectClass *gobject_class = (GObjectClass *) klass; window_class->get_window_handle = GST_DEBUG_FUNCPTR (gst_gl_window_dispmanx_egl_get_window_handle); window_class->set_window_handle = GST_DEBUG_FUNCPTR (gst_gl_window_dispmanx_egl_set_window_handle); window_class->show = GST_DEBUG_FUNCPTR (gst_gl_window_dispmanx_egl_show); - window_class->draw_unlocked = - GST_DEBUG_FUNCPTR (gst_gl_window_dispmanx_egl_draw); - window_class->draw = GST_DEBUG_FUNCPTR (gst_gl_window_dispmanx_egl_draw); - window_class->run = GST_DEBUG_FUNCPTR (gst_gl_window_dispmanx_egl_run); - window_class->quit = GST_DEBUG_FUNCPTR (gst_gl_window_dispmanx_egl_quit); - window_class->send_message_async = - GST_DEBUG_FUNCPTR (gst_gl_window_dispmanx_egl_send_message_async); window_class->close = GST_DEBUG_FUNCPTR (gst_gl_window_dispmanx_egl_close); window_class->open = GST_DEBUG_FUNCPTR (gst_gl_window_dispmanx_egl_open); window_class->get_display = GST_DEBUG_FUNCPTR (gst_gl_window_dispmanx_egl_get_display); window_class->set_preferred_size = GST_DEBUG_FUNCPTR (gst_gl_window_dispmanx_egl_set_preferred_size); - - gobject_class->finalize = gst_gl_window_dispmanx_egl_finalize; } static void gst_gl_window_dispmanx_egl_init (GstGLWindowDispmanxEGL * window_egl) { - window_egl->main_context = g_main_context_new (); - window_egl->loop = g_main_loop_new (window_egl->main_context, FALSE); -} - -static void -gst_gl_window_dispmanx_egl_finalize (GObject * object) -{ - GstGLWindowDispmanxEGL *window_egl = GST_GL_WINDOW_DISPMANX_EGL (object); - - g_main_loop_unref (window_egl->loop); - g_main_context_unref (window_egl->main_context); - - G_OBJECT_CLASS (parent_class)->finalize (object); } /* Must be called in the gl thread */ @@ -152,10 +124,7 @@ gst_gl_window_dispmanx_egl_close (GstGLWindow * window) } vc_dispmanx_display_close (window_egl->display); - g_main_loop_unref (window_egl->loop); - window_egl->loop = NULL; - g_main_context_unref (window_egl->main_context); - window_egl->main_context = NULL; + GST_GL_WINDOW_CLASS (parent_class)->close (window); } static gboolean @@ -165,7 +134,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) { - GST_ERROR ("Can't open display"); + g_set_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, @@ -173,7 +143,7 @@ gst_gl_window_dispmanx_egl_open (GstGLWindow * window, GError ** error) window_egl->native.element = 0; - return TRUE; + return GST_GL_WINDOW_CLASS (parent_class)->open (window, error); } gboolean @@ -186,71 +156,6 @@ gst_gl_window_dispmanx_egl_create_window (GstGLWindowDispmanxEGL * window_egl) return TRUE; } -static void -gst_gl_window_dispmanx_egl_run (GstGLWindow * window) -{ - GstGLWindowDispmanxEGL *window_egl; - - window_egl = GST_GL_WINDOW_DISPMANX_EGL (window); - - GST_LOG ("starting main loop"); - g_main_loop_run (window_egl->loop); - GST_LOG ("exiting main loop"); -} - -static void -gst_gl_window_dispmanx_egl_quit (GstGLWindow * window) -{ - GstGLWindowDispmanxEGL *window_egl; - - window_egl = GST_GL_WINDOW_DISPMANX_EGL (window); - - GST_LOG ("sending quit"); - - g_main_loop_quit (window_egl->loop); - - GST_LOG ("quit sent"); -} - -typedef struct _GstGLMessage -{ - GstGLWindowCB callback; - gpointer data; - GDestroyNotify destroy; -} GstGLMessage; - -static gboolean -_run_message (GstGLMessage * message) -{ - if (message->callback) - message->callback (message->data); - - if (message->destroy) - message->destroy (message->data); - - g_slice_free (GstGLMessage, message); - - return FALSE; -} - -static void -gst_gl_window_dispmanx_egl_send_message_async (GstGLWindow * window, - GstGLWindowCB callback, gpointer data, GDestroyNotify destroy) -{ - GstGLWindowDispmanxEGL *window_egl; - GstGLMessage *message; - - window_egl = GST_GL_WINDOW_DISPMANX_EGL (window); - message = g_slice_new (GstGLMessage); - - message->callback = callback; - message->data = data; - message->destroy = destroy; - - g_main_context_invoke (window_egl->main_context, (GSourceFunc) _run_message, - message); -} - static guintptr gst_gl_window_dispmanx_egl_get_window_handle (GstGLWindow * window) { @@ -332,8 +237,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; @@ -346,33 +251,12 @@ gst_gl_window_dispmanx_egl_show (GstGLWindow * window) GstGLWindowDispmanxEGL *window_egl = GST_GL_WINDOW_DISPMANX_EGL (window); if (!window_egl->visible) { - window_resize (window_egl, window_egl->preferred_width, window_egl->preferred_height, TRUE); + window_resize (window_egl, window_egl->preferred_width, + window_egl->preferred_height, TRUE); window_egl->visible = TRUE; } } -static void -draw_cb (gpointer data) -{ - GstGLWindowDispmanxEGL *window_egl = data; - GstGLWindow *window = GST_GL_WINDOW (window_egl); - GstGLContext *context = gst_gl_window_get_context (window); - GstGLContextClass *context_class = GST_GL_CONTEXT_GET_CLASS (context); - - if (window->draw) - window->draw (window->draw_data); - - context_class->swap_buffers (context); - - gst_object_unref (context); -} - -static void -gst_gl_window_dispmanx_egl_draw (GstGLWindow * window) -{ - gst_gl_window_send_message (window, (GstGLWindowCB) draw_cb, window); -} - static guintptr gst_gl_window_dispmanx_egl_get_display (GstGLWindow * window) { diff --git a/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h b/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h index 1572bd5..b25c219 100644 --- a/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h +++ b/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h @@ -51,9 +51,6 @@ struct _GstGLWindowDispmanxEGL { gint preferred_width; gint preferred_height; - GMainContext *main_context; - GMainLoop *loop; - gboolean visible; gpointer _reserved[GST_PADDING]; diff --git a/gst-libs/gst/gl/eagl/gstglwindow_eagl.m b/gst-libs/gst/gl/eagl/gstglwindow_eagl.m index e1d06fd..7ccffa8 100644 --- a/gst-libs/gst/gl/eagl/gstglwindow_eagl.m +++ b/gst-libs/gst/gl/eagl/gstglwindow_eagl.m @@ -40,7 +40,6 @@ GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); #define gst_gl_window_eagl_parent_class parent_class G_DEFINE_TYPE_WITH_CODE (GstGLWindowEagl, gst_gl_window_eagl, GST_GL_TYPE_WINDOW, DEBUG_INIT); -static void gst_gl_window_eagl_finalize (GObject * object); static guintptr gst_gl_window_eagl_get_display (GstGLWindow * window); static guintptr gst_gl_window_eagl_get_window_handle (GstGLWindow * window); @@ -49,28 +48,18 @@ static void gst_gl_window_eagl_set_window_handle (GstGLWindow * window, static void gst_gl_window_eagl_set_preferred_size (GstGLWindow * window, gint width, gint height); static void gst_gl_window_eagl_draw (GstGLWindow * window); -static void gst_gl_window_eagl_run (GstGLWindow * window); -static void gst_gl_window_eagl_quit (GstGLWindow * window); -static void gst_gl_window_eagl_send_message_async (GstGLWindow * window, - GstGLWindowCB callback, gpointer data, GDestroyNotify destroy); -static gboolean gst_gl_window_eagl_open (GstGLWindow * window, GError ** error); -static void gst_gl_window_eagl_close (GstGLWindow * window); struct _GstGLWindowEaglPrivate { UIView *view; gint window_width, window_height; gint preferred_width, preferred_height; - - GMainContext *main_context; - GMainLoop *loop; }; static void gst_gl_window_eagl_class_init (GstGLWindowEaglClass * klass) { GstGLWindowClass *window_class = (GstGLWindowClass *) klass; - GObjectClass *gobject_class = (GObjectClass *) klass; g_type_class_add_private (klass, sizeof (GstGLWindowEaglPrivate)); @@ -82,16 +71,8 @@ gst_gl_window_eagl_class_init (GstGLWindowEaglClass * klass) GST_DEBUG_FUNCPTR (gst_gl_window_eagl_set_window_handle); window_class->draw_unlocked = GST_DEBUG_FUNCPTR (gst_gl_window_eagl_draw); window_class->draw = GST_DEBUG_FUNCPTR (gst_gl_window_eagl_draw); - window_class->run = GST_DEBUG_FUNCPTR (gst_gl_window_eagl_run); - window_class->quit = GST_DEBUG_FUNCPTR (gst_gl_window_eagl_quit); - window_class->send_message_async = - GST_DEBUG_FUNCPTR (gst_gl_window_eagl_send_message_async); - window_class->open = GST_DEBUG_FUNCPTR (gst_gl_window_eagl_open); - window_class->close = GST_DEBUG_FUNCPTR (gst_gl_window_eagl_close); window_class->set_preferred_size = GST_DEBUG_FUNCPTR (gst_gl_window_eagl_set_preferred_size); - - gobject_class->finalize = gst_gl_window_eagl_finalize; } static void @@ -99,19 +80,6 @@ gst_gl_window_eagl_init (GstGLWindowEagl * window) { window->priv = GST_GL_WINDOW_EAGL_GET_PRIVATE (window); - window->priv->main_context = g_main_context_new (); - window->priv->loop = g_main_loop_new (window->priv->main_context, FALSE); -} - -static void -gst_gl_window_eagl_finalize (GObject * object) -{ - GstGLWindowEagl *window_eagl = GST_GL_WINDOW_EAGL (object); - - g_main_loop_unref (window_eagl->priv->loop); - g_main_context_unref (window_eagl->priv->main_context); - - G_OBJECT_CLASS (parent_class)->finalize (object); } /* Must be called in the gl thread */ @@ -149,82 +117,6 @@ gst_gl_window_eagl_set_window_handle (GstGLWindow * window, guintptr handle) gst_gl_context_eagl_update_layer (context); } -static gboolean -gst_gl_window_eagl_open (GstGLWindow * window, GError ** error) -{ - return TRUE; -} - -static void -gst_gl_window_eagl_close (GstGLWindow * window) -{ -} - -static void -gst_gl_window_eagl_run (GstGLWindow * window) -{ - GstGLWindowEagl *window_eagl; - - window_eagl = GST_GL_WINDOW_EAGL (window); - - GST_LOG ("starting main loop"); - g_main_loop_run (window_eagl->priv->loop); - GST_LOG ("exiting main loop"); -} - -static void -gst_gl_window_eagl_quit (GstGLWindow * window) -{ - GstGLWindowEagl *window_eagl; - - window_eagl = GST_GL_WINDOW_EAGL (window); - - GST_LOG ("sending quit"); - - g_main_loop_quit (window_eagl->priv->loop); - - GST_LOG ("quit sent"); -} - -typedef struct _GstGLMessage -{ - GstGLWindowCB callback; - gpointer data; - GDestroyNotify destroy; -} GstGLMessage; - -static gboolean -_run_message (GstGLMessage * message) -{ - if (message->callback) - message->callback (message->data); - - if (message->destroy) - message->destroy (message->data); - - g_slice_free (GstGLMessage, message); - - return FALSE; -} - -static void -gst_gl_window_eagl_send_message_async (GstGLWindow * window, - GstGLWindowCB callback, gpointer data, GDestroyNotify destroy) -{ - GstGLWindowEagl *window_eagl; - GstGLMessage *message; - - window_eagl = GST_GL_WINDOW_EAGL (window); - message = g_slice_new (GstGLMessage); - - message->callback = callback; - message->data = data; - message->destroy = destroy; - - g_main_context_invoke (window_eagl->priv->main_context, - (GSourceFunc) _run_message, message); -} - static void gst_gl_window_eagl_set_preferred_size (GstGLWindow * window, gint width, gint height) { diff --git a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c index 3cf2cca..4adcc12 100644 --- a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c +++ b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c @@ -42,7 +42,6 @@ const gchar *WlEGLErrorString (); #define gst_gl_window_wayland_egl_parent_class parent_class G_DEFINE_TYPE (GstGLWindowWaylandEGL, gst_gl_window_wayland_egl, GST_GL_TYPE_WINDOW); -static void gst_gl_window_wayland_egl_finalize (GObject * object); static guintptr gst_gl_window_wayland_egl_get_window_handle (GstGLWindow * window); @@ -50,10 +49,6 @@ static void gst_gl_window_wayland_egl_set_window_handle (GstGLWindow * window, guintptr handle); static void gst_gl_window_wayland_egl_show (GstGLWindow * window); static void gst_gl_window_wayland_egl_draw (GstGLWindow * window); -static void gst_gl_window_wayland_egl_run (GstGLWindow * window); -static void gst_gl_window_wayland_egl_quit (GstGLWindow * window); -static void gst_gl_window_wayland_egl_send_message_async (GstGLWindow * window, - GstGLWindowCB callback, gpointer data, GDestroyNotify destroy); static void gst_gl_window_wayland_egl_close (GstGLWindow * window); static gboolean gst_gl_window_wayland_egl_open (GstGLWindow * window, GError ** error); @@ -332,7 +327,6 @@ static void gst_gl_window_wayland_egl_class_init (GstGLWindowWaylandEGLClass * klass) { GstGLWindowClass *window_class = (GstGLWindowClass *) klass; - GObjectClass *gobject_class = (GObjectClass *) klass; window_class->get_window_handle = GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_get_window_handle); @@ -342,36 +336,17 @@ gst_gl_window_wayland_egl_class_init (GstGLWindowWaylandEGLClass * klass) GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_draw); window_class->show = GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_show); window_class->draw = GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_draw); - window_class->run = GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_run); - window_class->quit = GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_quit); - window_class->send_message_async = - GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_send_message_async); window_class->close = GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_close); window_class->open = GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_open); window_class->get_display = GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_get_display); window_class->set_render_rectangle = GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_set_render_rectangle); - - gobject_class->finalize = gst_gl_window_wayland_egl_finalize; } static void gst_gl_window_wayland_egl_init (GstGLWindowWaylandEGL * window) { - window->main_context = g_main_context_new (); - window->loop = g_main_loop_new (window->main_context, FALSE); -} - -static void -gst_gl_window_wayland_egl_finalize (GObject * object) -{ - GstGLWindowWaylandEGL *window_egl = GST_GL_WINDOW_WAYLAND_EGL (object); - - g_main_loop_unref (window_egl->loop); - g_main_context_unref (window_egl->main_context); - - G_OBJECT_CLASS (parent_class)->finalize (object); } /* Must be called in the gl thread */ @@ -399,6 +374,8 @@ gst_gl_window_wayland_egl_close (GstGLWindow * window) g_source_destroy (window_egl->wl_source); g_source_unref (window_egl->wl_source); window_egl->wl_source = NULL; + + GST_GL_WINDOW_CLASS (parent_class)->close (window); } static gboolean @@ -419,74 +396,12 @@ gst_gl_window_wayland_egl_open (GstGLWindow * window, GError ** error) window_egl->wl_source = wayland_event_source_new (display->display, window_egl->window.queue); - g_source_attach (window_egl->wl_source, window_egl->main_context); - - return TRUE; -} - -static void -gst_gl_window_wayland_egl_run (GstGLWindow * window) -{ - GstGLWindowWaylandEGL *window_egl; - - window_egl = GST_GL_WINDOW_WAYLAND_EGL (window); - - GST_LOG ("starting main loop"); - g_main_loop_run (window_egl->loop); - GST_LOG ("exiting main loop"); -} - -static void -gst_gl_window_wayland_egl_quit (GstGLWindow * window) -{ - GstGLWindowWaylandEGL *window_egl; - - window_egl = GST_GL_WINDOW_WAYLAND_EGL (window); - - GST_LOG ("sending quit"); - - g_main_loop_quit (window_egl->loop); - - GST_LOG ("quit sent"); -} - -typedef struct _GstGLMessage -{ - GstGLWindowCB callback; - gpointer data; - GDestroyNotify destroy; -} GstGLMessage; - -static gboolean -_run_message (GstGLMessage * message) -{ - if (message->callback) - message->callback (message->data); - - if (message->destroy) - message->destroy (message->data); - - g_slice_free (GstGLMessage, message); - - return FALSE; -} - -static void -gst_gl_window_wayland_egl_send_message_async (GstGLWindow * window, - GstGLWindowCB callback, gpointer data, GDestroyNotify destroy) -{ - GstGLWindowWaylandEGL *window_egl; - GstGLMessage *message; - - window_egl = GST_GL_WINDOW_WAYLAND_EGL (window); - message = g_slice_new (GstGLMessage); + if (!GST_GL_WINDOW_CLASS (parent_class)->open (window, error)) + return FALSE; - message->callback = callback; - message->data = data; - message->destroy = destroy; + g_source_attach (window_egl->wl_source, g_main_context_get_thread_default ()); - g_main_context_invoke (window_egl->main_context, (GSourceFunc) _run_message, - message); + return TRUE; } void diff --git a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h index ee23ed8..c7889e1 100644 --- a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h +++ b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h @@ -83,8 +83,6 @@ struct _GstGLWindowWaylandEGL { struct window window; GSource *wl_source; - GMainContext *main_context; - GMainLoop *loop; gpointer _reserved[GST_PADDING]; }; diff --git a/gst-libs/gst/gl/win32/gstglwindow_win32.c b/gst-libs/gst/gl/win32/gstglwindow_win32.c index bead38b..7d93305 100644 --- a/gst-libs/gst/gl/win32/gstglwindow_win32.c +++ b/gst-libs/gst/gl/win32/gstglwindow_win32.c @@ -61,49 +61,21 @@ static void gst_gl_window_win32_set_preferred_size (GstGLWindow * window, gint width, gint height); static void gst_gl_window_win32_show (GstGLWindow * window); static void gst_gl_window_win32_draw (GstGLWindow * window); -static void gst_gl_window_win32_run (GstGLWindow * window); -static void gst_gl_window_win32_quit (GstGLWindow * window); -static void gst_gl_window_win32_send_message_async (GstGLWindow * window, - GstGLWindowCB callback, gpointer data, GDestroyNotify destroy); gboolean gst_gl_window_win32_open (GstGLWindow * window, GError ** error); void gst_gl_window_win32_close (GstGLWindow * window); static void release_parent_win_id (GstGLWindowWin32 * window_win32); static void -gst_gl_window_win32_finalize (GObject * object) -{ - GstGLWindowWin32 *window_win32 = GST_GL_WINDOW_WIN32 (object); - - if (window_win32->loop) { - g_main_loop_unref (window_win32->loop); - window_win32->loop = NULL; - } - if (window_win32->main_context) { - g_main_context_unref (window_win32->main_context); - window_win32->main_context = NULL; - } - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static void gst_gl_window_win32_class_init (GstGLWindowWin32Class * klass) { - GObjectClass *obj_class = G_OBJECT_CLASS (klass); GstGLWindowClass *window_class = (GstGLWindowClass *) klass; g_type_class_add_private (klass, sizeof (GstGLWindowWin32Private)); - obj_class->finalize = gst_gl_window_win32_finalize; - window_class->set_window_handle = GST_DEBUG_FUNCPTR (gst_gl_window_win32_set_window_handle); window_class->draw_unlocked = GST_DEBUG_FUNCPTR (gst_gl_window_win32_draw); window_class->draw = GST_DEBUG_FUNCPTR (gst_gl_window_win32_draw); - window_class->run = GST_DEBUG_FUNCPTR (gst_gl_window_win32_run); - window_class->quit = GST_DEBUG_FUNCPTR (gst_gl_window_win32_quit); - window_class->send_message_async = - GST_DEBUG_FUNCPTR (gst_gl_window_win32_send_message_async); window_class->get_display = GST_DEBUG_FUNCPTR (gst_gl_window_win32_get_display); window_class->set_preferred_size = @@ -117,12 +89,8 @@ static void gst_gl_window_win32_init (GstGLWindowWin32 * window) { window->priv = GST_GL_WINDOW_WIN32_GET_PRIVATE (window); - - window->main_context = g_main_context_new (); - window->loop = g_main_loop_new (window->main_context, FALSE); } -/* Must be called in the gl thread */ GstGLWindowWin32 * gst_gl_window_win32_new (void) { @@ -144,10 +112,14 @@ gst_gl_window_win32_open (GstGLWindow * window, GError ** error) { GstGLWindowWin32 *window_win32 = GST_GL_WINDOW_WIN32 (window); + if (!GST_GL_WINDOW_CLASS (parent_class)->open (window, error)) + return FALSE; + window_win32->msg_source = win32_message_source_new (window_win32); g_source_set_callback (window_win32->msg_source, (GSourceFunc) msg_cb, NULL, NULL); - g_source_attach (window_win32->msg_source, window_win32->main_context); + g_source_attach (window_win32->msg_source, + g_main_context_get_thread_default ()); return TRUE; } @@ -170,6 +142,8 @@ gst_gl_window_win32_close (GstGLWindow * window) g_source_destroy (window_win32->msg_source); g_source_unref (window_win32->msg_source); window_win32->msg_source = NULL; + + GST_GL_WINDOW_CLASS (parent_class)->close (window); } static void @@ -397,63 +371,6 @@ gst_gl_window_win32_draw (GstGLWindow * window) RDW_NOERASE | RDW_INTERNALPAINT | RDW_INVALIDATE); } -static void -gst_gl_window_win32_run (GstGLWindow * window) -{ - GstGLWindowWin32 *window_win32 = GST_GL_WINDOW_WIN32 (window); - - g_main_loop_run (window_win32->loop); -} - -/* Thread safe */ -static void -gst_gl_window_win32_quit (GstGLWindow * window) -{ - GstGLWindowWin32 *window_win32 = GST_GL_WINDOW_WIN32 (window); - - g_main_loop_quit (window_win32->loop); -} - -typedef struct _GstGLMessage -{ - GstGLWindowCB callback; - gpointer data; - GDestroyNotify destroy; -} GstGLMessage; - -static gboolean -_run_message (GstGLMessage * message) -{ - if (message->callback) - message->callback (message->data); - - if (message->destroy) - message->destroy (message->data); - - g_slice_free (GstGLMessage, message); - - return FALSE; -} - -/* Thread safe */ -static void -gst_gl_window_win32_send_message_async (GstGLWindow * window, - GstGLWindowCB callback, gpointer data, GDestroyNotify destroy) -{ - GstGLWindowWin32 *window_win32; - GstGLMessage *message; - - window_win32 = GST_GL_WINDOW_WIN32 (window); - message = g_slice_new (GstGLMessage); - - message->callback = callback; - message->data = data; - message->destroy = destroy; - - g_main_context_invoke (window_win32->main_context, (GSourceFunc) _run_message, - message); -} - /* PRIVATE */ LRESULT CALLBACK diff --git a/gst-libs/gst/gl/win32/gstglwindow_win32.h b/gst-libs/gst/gl/win32/gstglwindow_win32.h index 76e1d93..50a90fb 100644 --- a/gst-libs/gst/gl/win32/gstglwindow_win32.h +++ b/gst-libs/gst/gl/win32/gstglwindow_win32.h @@ -51,8 +51,6 @@ struct _GstGLWindowWin32 { gboolean visible; GSource *msg_source; - GMainContext *main_context; - GMainLoop *loop; /*< private >*/ GstGLWindowWin32Private *priv; -- 2.7.4