mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-20 04:56:24 +00:00
glwindow: remove the navigation thread
This functionality can now effectively be implemented with the display event thread.
This commit is contained in:
parent
0e56bead42
commit
4abca9f5d0
2 changed files with 51 additions and 227 deletions
|
@ -84,7 +84,6 @@ static void gst_gl_window_default_send_message (GstGLWindow * window,
|
||||||
GstGLWindowCB callback, gpointer data);
|
GstGLWindowCB callback, gpointer data);
|
||||||
static void gst_gl_window_default_send_message_async (GstGLWindow * window,
|
static void gst_gl_window_default_send_message_async (GstGLWindow * window,
|
||||||
GstGLWindowCB callback, gpointer data, GDestroyNotify destroy);
|
GstGLWindowCB callback, gpointer data, GDestroyNotify destroy);
|
||||||
static gpointer gst_gl_window_navigation_thread (GstGLWindow * window);
|
|
||||||
|
|
||||||
struct _GstGLWindowPrivate
|
struct _GstGLWindowPrivate
|
||||||
{
|
{
|
||||||
|
@ -96,13 +95,6 @@ struct _GstGLWindowPrivate
|
||||||
|
|
||||||
gboolean alive;
|
gboolean alive;
|
||||||
|
|
||||||
GThread *navigation_thread;
|
|
||||||
GMainContext *navigation_context;
|
|
||||||
GMainLoop *navigation_loop;
|
|
||||||
GMutex nav_lock;
|
|
||||||
GCond nav_create_cond;
|
|
||||||
GCond nav_destroy_cond;
|
|
||||||
gboolean nav_alive;
|
|
||||||
GMutex sync_message_lock;
|
GMutex sync_message_lock;
|
||||||
GCond sync_message_cond;
|
GCond sync_message_cond;
|
||||||
};
|
};
|
||||||
|
@ -194,10 +186,6 @@ gst_gl_window_init (GstGLWindow * window)
|
||||||
g_mutex_init (&window->lock);
|
g_mutex_init (&window->lock);
|
||||||
window->is_drawing = FALSE;
|
window->is_drawing = FALSE;
|
||||||
|
|
||||||
g_mutex_init (&window->priv->nav_lock);
|
|
||||||
g_cond_init (&window->priv->nav_create_cond);
|
|
||||||
window->priv->nav_alive = FALSE;
|
|
||||||
|
|
||||||
g_weak_ref_init (&window->context_ref, NULL);
|
g_weak_ref_init (&window->context_ref, NULL);
|
||||||
|
|
||||||
g_mutex_init (&window->priv->sync_message_lock);
|
g_mutex_init (&window->priv->sync_message_lock);
|
||||||
|
@ -205,7 +193,6 @@ gst_gl_window_init (GstGLWindow * window)
|
||||||
|
|
||||||
priv->main_context = g_main_context_new ();
|
priv->main_context = g_main_context_new ();
|
||||||
priv->loop = g_main_loop_new (priv->main_context, FALSE);
|
priv->loop = g_main_loop_new (priv->main_context, FALSE);
|
||||||
priv->navigation_loop = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -318,14 +305,6 @@ gst_gl_window_new (GstGLDisplay * display)
|
||||||
|
|
||||||
window->display = gst_object_ref (display);
|
window->display = gst_object_ref (display);
|
||||||
|
|
||||||
g_mutex_lock (&window->priv->nav_lock);
|
|
||||||
window->priv->navigation_thread = g_thread_new ("gstglnavigation",
|
|
||||||
(GThreadFunc) gst_gl_window_navigation_thread, window);
|
|
||||||
|
|
||||||
while (!window->priv->nav_alive)
|
|
||||||
g_cond_wait (&window->priv->nav_create_cond, &window->priv->nav_lock);
|
|
||||||
g_mutex_unlock (&window->priv->nav_lock);
|
|
||||||
|
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,18 +314,6 @@ gst_gl_window_finalize (GObject * object)
|
||||||
GstGLWindow *window = GST_GL_WINDOW (object);
|
GstGLWindow *window = GST_GL_WINDOW (object);
|
||||||
GstGLWindowPrivate *priv = window->priv;
|
GstGLWindowPrivate *priv = window->priv;
|
||||||
|
|
||||||
GST_INFO ("quit navigation loop");
|
|
||||||
|
|
||||||
g_mutex_lock (&window->priv->nav_lock);
|
|
||||||
if (window->priv->navigation_loop) {
|
|
||||||
g_main_loop_quit (window->priv->navigation_loop);
|
|
||||||
/* wait until navigation thread finished */
|
|
||||||
while (window->priv->nav_alive)
|
|
||||||
g_cond_wait (&window->priv->nav_destroy_cond, &window->priv->nav_lock);
|
|
||||||
window->priv->navigation_thread = NULL;
|
|
||||||
}
|
|
||||||
g_mutex_unlock (&window->priv->nav_lock);
|
|
||||||
|
|
||||||
if (priv->loop)
|
if (priv->loop)
|
||||||
g_main_loop_unref (priv->loop);
|
g_main_loop_unref (priv->loop);
|
||||||
|
|
||||||
|
@ -356,9 +323,6 @@ gst_gl_window_finalize (GObject * object)
|
||||||
g_weak_ref_clear (&window->context_ref);
|
g_weak_ref_clear (&window->context_ref);
|
||||||
|
|
||||||
g_mutex_clear (&window->lock);
|
g_mutex_clear (&window->lock);
|
||||||
g_mutex_clear (&window->priv->nav_lock);
|
|
||||||
g_cond_clear (&window->priv->nav_create_cond);
|
|
||||||
g_cond_clear (&window->priv->nav_destroy_cond);
|
|
||||||
g_mutex_clear (&window->priv->sync_message_lock);
|
g_mutex_clear (&window->priv->sync_message_lock);
|
||||||
g_cond_clear (&window->priv->sync_message_cond);
|
g_cond_clear (&window->priv->sync_message_cond);
|
||||||
gst_object_unref (window->display);
|
gst_object_unref (window->display);
|
||||||
|
@ -908,107 +872,6 @@ gst_gl_window_get_surface_dimensions (GstGLWindow * window, guint * width,
|
||||||
*height = window->priv->surface_height;
|
*height = window->priv->surface_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
GType gst_gl_dummy_window_get_type (void);
|
|
||||||
|
|
||||||
G_DEFINE_TYPE (GstGLDummyWindow, gst_gl_dummy_window, GST_TYPE_GL_WINDOW);
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_gl_window_navigation_started (gpointer data)
|
|
||||||
{
|
|
||||||
GstGLWindow *window = data;
|
|
||||||
|
|
||||||
g_mutex_lock (&window->priv->nav_lock);
|
|
||||||
window->priv->nav_alive = TRUE;
|
|
||||||
g_cond_signal (&window->priv->nav_create_cond);
|
|
||||||
g_mutex_unlock (&window->priv->nav_lock);
|
|
||||||
|
|
||||||
return G_SOURCE_REMOVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gpointer
|
|
||||||
gst_gl_window_navigation_thread (GstGLWindow * window)
|
|
||||||
{
|
|
||||||
GSource *source;
|
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_GL_WINDOW (window), NULL);
|
|
||||||
|
|
||||||
window->priv->navigation_context = g_main_context_new ();
|
|
||||||
window->priv->navigation_loop =
|
|
||||||
g_main_loop_new (window->priv->navigation_context, FALSE);
|
|
||||||
g_main_context_push_thread_default (window->priv->navigation_context);
|
|
||||||
|
|
||||||
source = g_idle_source_new ();
|
|
||||||
g_source_set_callback (source, (GSourceFunc) gst_gl_window_navigation_started,
|
|
||||||
window, NULL);
|
|
||||||
g_source_attach (source, window->priv->navigation_context);
|
|
||||||
g_source_unref (source);
|
|
||||||
|
|
||||||
g_main_loop_run (window->priv->navigation_loop);
|
|
||||||
|
|
||||||
g_mutex_lock (&window->priv->nav_lock);
|
|
||||||
g_main_context_pop_thread_default (window->priv->navigation_context);
|
|
||||||
|
|
||||||
g_main_loop_unref (window->priv->navigation_loop);
|
|
||||||
g_main_context_unref (window->priv->navigation_context);
|
|
||||||
window->priv->navigation_loop = NULL;
|
|
||||||
window->priv->navigation_context = NULL;
|
|
||||||
|
|
||||||
window->priv->nav_alive = FALSE;
|
|
||||||
g_cond_signal (&window->priv->nav_destroy_cond);
|
|
||||||
g_mutex_unlock (&window->priv->nav_lock);
|
|
||||||
|
|
||||||
GST_INFO ("navigation loop exited\n");
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_gl_dummy_window_set_window_handle (GstGLWindow * window, guintptr handle)
|
|
||||||
{
|
|
||||||
GstGLDummyWindow *dummy = (GstGLDummyWindow *) window;
|
|
||||||
|
|
||||||
dummy->handle = handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
static guintptr
|
|
||||||
gst_gl_dummy_window_get_window_handle (GstGLWindow * window)
|
|
||||||
{
|
|
||||||
GstGLDummyWindow *dummy = (GstGLDummyWindow *) window;
|
|
||||||
|
|
||||||
return (guintptr) dummy->handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
static guintptr
|
|
||||||
gst_gl_dummy_window_get_display (GstGLWindow * window)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_gl_dummy_window_class_init (GstGLDummyWindowClass * klass)
|
|
||||||
{
|
|
||||||
GstGLWindowClass *window_class = (GstGLWindowClass *) klass;
|
|
||||||
|
|
||||||
window_class->get_display =
|
|
||||||
GST_DEBUG_FUNCPTR (gst_gl_dummy_window_get_display);
|
|
||||||
window_class->get_window_handle =
|
|
||||||
GST_DEBUG_FUNCPTR (gst_gl_dummy_window_get_window_handle);
|
|
||||||
window_class->set_window_handle =
|
|
||||||
GST_DEBUG_FUNCPTR (gst_gl_dummy_window_set_window_handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gst_gl_dummy_window_init (GstGLDummyWindow * dummy)
|
|
||||||
{
|
|
||||||
dummy->handle = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
GstGLDummyWindow *
|
|
||||||
gst_gl_dummy_window_new (void)
|
|
||||||
{
|
|
||||||
return g_object_new (gst_gl_dummy_window_get_type (), NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
gst_gl_window_send_key_event (GstGLWindow * window, const char *event_type,
|
gst_gl_window_send_key_event (GstGLWindow * window, const char *event_type,
|
||||||
const char *key_str)
|
const char *key_str)
|
||||||
|
@ -1017,44 +880,6 @@ gst_gl_window_send_key_event (GstGLWindow * window, const char *event_type,
|
||||||
event_type, key_str);
|
event_type, key_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
GstGLWindow *window;
|
|
||||||
const char *event_type;
|
|
||||||
const char *key_str;
|
|
||||||
} KeyEventData;
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_gl_window_key_event_cb (gpointer data)
|
|
||||||
{
|
|
||||||
KeyEventData *key_data = data;
|
|
||||||
|
|
||||||
GST_DEBUG
|
|
||||||
("%s called data struct %p window %p key %s event %s ",
|
|
||||||
__func__, key_data, key_data->window, key_data->key_str,
|
|
||||||
key_data->event_type);
|
|
||||||
|
|
||||||
gst_gl_window_send_key_event (GST_GL_WINDOW (key_data->window),
|
|
||||||
key_data->event_type, key_data->key_str);
|
|
||||||
|
|
||||||
return G_SOURCE_REMOVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_gl_window_send_key_event_async (GstGLWindow * window,
|
|
||||||
const char *event_type, const char *key_str)
|
|
||||||
{
|
|
||||||
KeyEventData *key_data = g_new0 (KeyEventData, 1);
|
|
||||||
|
|
||||||
key_data->window = window;
|
|
||||||
key_data->key_str = key_str;
|
|
||||||
key_data->event_type = event_type;
|
|
||||||
|
|
||||||
g_main_context_invoke_full (window->priv->navigation_context,
|
|
||||||
G_PRIORITY_DEFAULT, (GSourceFunc) gst_gl_window_key_event_cb, key_data,
|
|
||||||
(GDestroyNotify) g_free);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
gst_gl_window_send_mouse_event (GstGLWindow * window, const char *event_type,
|
gst_gl_window_send_mouse_event (GstGLWindow * window, const char *event_type,
|
||||||
int button, double posx, double posy)
|
int button, double posx, double posy)
|
||||||
|
@ -1063,48 +888,6 @@ gst_gl_window_send_mouse_event (GstGLWindow * window, const char *event_type,
|
||||||
event_type, button, posx, posy);
|
event_type, button, posx, posy);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
GstGLWindow *window;
|
|
||||||
const char *event_type;
|
|
||||||
int button;
|
|
||||||
double posx;
|
|
||||||
double posy;
|
|
||||||
} MouseEventData;
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
gst_gl_window_mouse_event_cb (gpointer data)
|
|
||||||
{
|
|
||||||
MouseEventData *mouse_data = data;
|
|
||||||
|
|
||||||
GST_DEBUG ("%s called data struct %p mouse event %s button %d at %g, %g",
|
|
||||||
__func__, mouse_data, mouse_data->event_type, mouse_data->button,
|
|
||||||
mouse_data->posx, mouse_data->posy);
|
|
||||||
|
|
||||||
gst_gl_window_send_mouse_event (GST_GL_WINDOW (mouse_data->window),
|
|
||||||
mouse_data->event_type, mouse_data->button, mouse_data->posx,
|
|
||||||
mouse_data->posy);
|
|
||||||
|
|
||||||
return G_SOURCE_REMOVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_gl_window_send_mouse_event_async (GstGLWindow * window,
|
|
||||||
const char *event_type, int button, double posx, double posy)
|
|
||||||
{
|
|
||||||
MouseEventData *mouse_data = g_new0 (MouseEventData, 1);
|
|
||||||
|
|
||||||
mouse_data->window = window;
|
|
||||||
mouse_data->event_type = event_type;
|
|
||||||
mouse_data->button = button;
|
|
||||||
mouse_data->posx = posx;
|
|
||||||
mouse_data->posy = posy;
|
|
||||||
|
|
||||||
g_main_context_invoke_full (window->priv->navigation_context,
|
|
||||||
G_PRIORITY_DEFAULT, (GSourceFunc) gst_gl_window_mouse_event_cb,
|
|
||||||
mouse_data, (GDestroyNotify) g_free);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_gl_window_handle_events:
|
* gst_gl_window_handle_events:
|
||||||
* @window: a #GstGLWindow
|
* @window: a #GstGLWindow
|
||||||
|
@ -1208,3 +991,54 @@ gst_gl_window_resize (GstGLWindow * window, guint width, guint height)
|
||||||
|
|
||||||
window->queue_resize = FALSE;
|
window->queue_resize = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GType gst_gl_dummy_window_get_type (void);
|
||||||
|
|
||||||
|
G_DEFINE_TYPE (GstGLDummyWindow, gst_gl_dummy_window, GST_TYPE_GL_WINDOW);
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_gl_dummy_window_set_window_handle (GstGLWindow * window, guintptr handle)
|
||||||
|
{
|
||||||
|
GstGLDummyWindow *dummy = (GstGLDummyWindow *) window;
|
||||||
|
|
||||||
|
dummy->handle = handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
static guintptr
|
||||||
|
gst_gl_dummy_window_get_window_handle (GstGLWindow * window)
|
||||||
|
{
|
||||||
|
GstGLDummyWindow *dummy = (GstGLDummyWindow *) window;
|
||||||
|
|
||||||
|
return (guintptr) dummy->handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
static guintptr
|
||||||
|
gst_gl_dummy_window_get_display (GstGLWindow * window)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_gl_dummy_window_class_init (GstGLDummyWindowClass * klass)
|
||||||
|
{
|
||||||
|
GstGLWindowClass *window_class = (GstGLWindowClass *) klass;
|
||||||
|
|
||||||
|
window_class->get_display =
|
||||||
|
GST_DEBUG_FUNCPTR (gst_gl_dummy_window_get_display);
|
||||||
|
window_class->get_window_handle =
|
||||||
|
GST_DEBUG_FUNCPTR (gst_gl_dummy_window_get_window_handle);
|
||||||
|
window_class->set_window_handle =
|
||||||
|
GST_DEBUG_FUNCPTR (gst_gl_dummy_window_set_window_handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_gl_dummy_window_init (GstGLDummyWindow * dummy)
|
||||||
|
{
|
||||||
|
dummy->handle = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
GstGLDummyWindow *
|
||||||
|
gst_gl_dummy_window_new (void)
|
||||||
|
{
|
||||||
|
return g_object_new (gst_gl_dummy_window_get_type (), NULL);
|
||||||
|
}
|
||||||
|
|
|
@ -207,21 +207,11 @@ void gst_gl_window_send_key_event (GstGLWindow * window,
|
||||||
const char * event_type,
|
const char * event_type,
|
||||||
const char * key_str);
|
const char * key_str);
|
||||||
GST_EXPORT
|
GST_EXPORT
|
||||||
void gst_gl_window_send_key_event_async (GstGLWindow * window,
|
|
||||||
const char * event_type,
|
|
||||||
const char * key_str);
|
|
||||||
GST_EXPORT
|
|
||||||
void gst_gl_window_send_mouse_event (GstGLWindow * window,
|
void gst_gl_window_send_mouse_event (GstGLWindow * window,
|
||||||
const char * event_type,
|
const char * event_type,
|
||||||
int button,
|
int button,
|
||||||
double posx,
|
double posx,
|
||||||
double posy);
|
double posy);
|
||||||
GST_EXPORT
|
|
||||||
void gst_gl_window_send_mouse_event_async (GstGLWindow * window,
|
|
||||||
const char * event_type,
|
|
||||||
int button,
|
|
||||||
double posx,
|
|
||||||
double posy);
|
|
||||||
|
|
||||||
/* surfaces/rendering */
|
/* surfaces/rendering */
|
||||||
GST_EXPORT
|
GST_EXPORT
|
||||||
|
|
Loading…
Reference in a new issue