summaryrefslogtreecommitdiff
path: root/ext/gtk/gstgtkbasesink.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/gtk/gstgtkbasesink.c')
-rw-r--r--ext/gtk/gstgtkbasesink.c64
1 files changed, 9 insertions, 55 deletions
diff --git a/ext/gtk/gstgtkbasesink.c b/ext/gtk/gstgtkbasesink.c
index 41bb7f23c..9ce6f7cc0 100644
--- a/ext/gtk/gstgtkbasesink.c
+++ b/ext/gtk/gstgtkbasesink.c
@@ -28,6 +28,7 @@
#endif
#include "gstgtkbasesink.h"
+#include "gstgtkutils.h"
GST_DEBUG_CATEGORY (gst_debug_gtk_base_sink);
#define GST_CAT_DEFAULT gst_debug_gtk_base_sink
@@ -77,53 +78,6 @@ G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstGtkBaseSink, gst_gtk_base_sink,
GST_DEBUG_CATEGORY_INIT (gst_debug_gtk_base_sink,
"gtkbasesink", 0, "Gtk Video Sink base class"));
-struct invoke_context
-{
- GThreadFunc func;
- gpointer data;
- GMutex lock;
- GCond cond;
- gboolean fired;
-
- gpointer res;
-};
-
-static gboolean
-_invoke_func (struct invoke_context *info)
-{
- g_mutex_lock (&info->lock);
- info->res = info->func (info->data);
- info->fired = TRUE;
- g_cond_signal (&info->cond);
- g_mutex_unlock (&info->lock);
-
- return G_SOURCE_REMOVE;
-}
-
-static gpointer
-_invoke_on_main (GThreadFunc func, gpointer data)
-{
- GMainContext *main_context = g_main_context_default ();
- struct invoke_context info;
-
- g_mutex_init (&info.lock);
- g_cond_init (&info.cond);
- info.fired = FALSE;
- info.func = func;
- info.data = data;
-
- g_main_context_invoke (main_context, (GSourceFunc) _invoke_func, &info);
-
- g_mutex_lock (&info.lock);
- while (!info.fired)
- g_cond_wait (&info.cond, &info.lock);
- g_mutex_unlock (&info.lock);
-
- g_mutex_clear (&info.lock);
- g_cond_clear (&info.cond);
-
- return info.res;
-}
static void
gst_gtk_base_sink_class_init (GstGtkBaseSinkClass * klass)
@@ -264,7 +218,8 @@ gst_gtk_base_sink_get_property (GObject * object, guint prop_id,
GST_OBJECT_UNLOCK (gtk_sink);
if (!widget)
- widget = _invoke_on_main ((GThreadFunc) gst_gtk_base_sink_get_widget,
+ widget =
+ gst_gtk_invoke_on_main ((GThreadFunc) gst_gtk_base_sink_get_widget,
gtk_sink);
g_value_set_object (value, widget);
@@ -366,8 +321,8 @@ gst_gtk_base_sink_start_on_main (GstBaseSink * bsink)
static gboolean
gst_gtk_base_sink_start (GstBaseSink * bsink)
{
- return ! !_invoke_on_main ((GThreadFunc) gst_gtk_base_sink_start_on_main,
- bsink);
+ return ! !gst_gtk_invoke_on_main ((GThreadFunc)
+ gst_gtk_base_sink_start_on_main, bsink);
}
static gboolean
@@ -387,12 +342,12 @@ gst_gtk_base_sink_stop_on_main (GstBaseSink * bsink)
static gboolean
gst_gtk_base_sink_stop (GstBaseSink * bsink)
{
- return ! !_invoke_on_main ((GThreadFunc) gst_gtk_base_sink_stop_on_main,
- bsink);
+ return ! !gst_gtk_invoke_on_main ((GThreadFunc)
+ gst_gtk_base_sink_stop_on_main, bsink);
}
static void
-gst_gtk_widget_show_all_and_unref (GtkWidget * widget)
+gst_gtk_widget_show_all_and_unref (GtkWidget *widget)
{
gtk_widget_show_all (widget);
g_object_unref (widget);
@@ -423,8 +378,7 @@ gst_gtk_base_sink_change_state (GstElement * element, GstStateChange transition)
GST_OBJECT_UNLOCK (gtk_sink);
if (window)
- _invoke_on_main ((GThreadFunc) gst_gtk_widget_show_all_and_unref,
- window);
+ gst_gtk_invoke_on_main ((GThreadFunc) gst_gtk_widget_show_all_and_unref, window);
break;
}