summaryrefslogtreecommitdiff
path: root/ext/gtk/gstgtkglsink.c
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2015-06-17 09:36:40 -0400
committerMatthew Waters <matthew@centricular.com>2015-07-09 16:40:19 +1000
commitb71b7dc9e60bc37a5143310b1bf00658de9a7a8b (patch)
tree44a00a5c4e5624b53ac4f4a637f0e6efaadb37e4 /ext/gtk/gstgtkglsink.c
parent72b48a39d809115df6c9465081f983c874fd4025 (diff)
downloadgstreamer-plugins-bad-b71b7dc9e60bc37a5143310b1bf00658de9a7a8b.tar.gz
GstGtkGLSink: Post error if widget gets destroyed
https://bugzilla.gnome.org/show_bug.cgi?id=751104
Diffstat (limited to 'ext/gtk/gstgtkglsink.c')
-rw-r--r--ext/gtk/gstgtkglsink.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/ext/gtk/gstgtkglsink.c b/ext/gtk/gstgtkglsink.c
index cee44ba6a..6f7c2b5c3 100644
--- a/ext/gtk/gstgtkglsink.c
+++ b/ext/gtk/gstgtkglsink.c
@@ -161,6 +161,12 @@ gst_gtk_gl_sink_finalize (GObject * object)
G_OBJECT_CLASS (parent_class)->finalize (object);
}
+static void
+widget_destroy_cb (GtkWidget * widget, GstGtkGLSink * gtk_sink)
+{
+ g_atomic_int_set (&gtk_sink->widget_destroyed, 1);
+}
+
static GtkGstGLWidget *
gst_gtk_gl_sink_get_widget (GstGtkGLSink * gtk_sink)
{
@@ -188,6 +194,8 @@ gst_gtk_gl_sink_get_widget (GstGtkGLSink * gtk_sink)
/* Take the floating ref, otherwise the destruction of the container will
* make this widget disapear possibly before we are done. */
gst_object_ref_sink (gtk_sink->widget);
+ g_signal_connect (gtk_sink->widget, "destroy",
+ G_CALLBACK (widget_destroy_cb), gtk_sink);
return gtk_sink->widget;
}
@@ -426,6 +434,12 @@ gst_gtk_gl_sink_show_frame (GstVideoSink * vsink, GstBuffer * buf)
gtk_gst_gl_widget_set_buffer (gtk_sink->widget, buf);
+ if (g_atomic_int_get (&gtk_sink->widget_destroyed)) {
+ GST_ELEMENT_ERROR (gtk_sink, RESOURCE, NOT_FOUND,
+ ("%s", "Output widget was destroyed"), (NULL));
+ return GST_FLOW_ERROR;
+ }
+
return GST_FLOW_OK;
}