gtksink: Return reference to GtkWidget in the acquire function
authorOlivier CrĂȘte <olivier.crete@collabora.com>
Tue, 4 May 2021 17:27:30 +0000 (13:27 -0400)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Tue, 12 Oct 2021 20:27:34 +0000 (20:27 +0000)
This should ensure thread safety.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1088>

subprojects/gst-plugins-good/ext/gtk/gstgtkbasesink.c
subprojects/gst-plugins-good/ext/gtk/gstgtkglsink.c

index 2c7fec8..2f4321e 100644 (file)
@@ -178,7 +178,7 @@ static GtkGstBaseWidget *
 gst_gtk_base_sink_get_widget (GstGtkBaseSink * gtk_sink)
 {
   if (gtk_sink->widget != NULL)
-    return gtk_sink->widget;
+    return g_object_ref (gtk_sink->widget);
 
   /* Ensure GTK is initialized, this has no side effect if it was already
    * initialized. Also, we do that lazily, so the application can be first */
@@ -211,7 +211,7 @@ gst_gtk_base_sink_get_widget (GstGtkBaseSink * gtk_sink)
   gtk_gst_base_widget_set_element (GTK_GST_BASE_WIDGET (gtk_sink->widget),
       GST_ELEMENT (gtk_sink));
 
-  return gtk_sink->widget;
+  return g_object_ref (gtk_sink->widget);
 }
 
 GtkWidget *
@@ -221,7 +221,7 @@ gst_gtk_base_sink_acquire_widget (GstGtkBaseSink * gtk_sink)
 
   GST_OBJECT_LOCK (gtk_sink);
   if (gtk_sink->widget != NULL)
-    widget = gtk_sink->widget;
+    widget = g_object_ref (gtk_sink->widget);
   GST_OBJECT_UNLOCK (gtk_sink);
 
   if (!widget)
@@ -241,7 +241,7 @@ gst_gtk_base_sink_get_property (GObject * object, guint prop_id,
   switch (prop_id) {
     case PROP_WIDGET:
     {
-      g_value_set_object (value, gst_gtk_base_sink_acquire_widget (gtk_sink));
+      g_value_take_object (value, gst_gtk_base_sink_acquire_widget (gtk_sink));
       break;
     }
     case PROP_FORCE_ASPECT_RATIO:
index 84e0ffe..12ea706 100644 (file)
@@ -136,11 +136,14 @@ gst_gtk_gl_sink_set_property (GObject * object, guint prop_id,
 {
   switch (prop_id) {
     case PROP_ROTATE_METHOD:
-      gtk_gst_gl_widget_set_rotate_method (GTK_GST_GL_WIDGET
-          (gst_gtk_base_sink_acquire_widget (GST_GTK_BASE_SINK (object))),
+    {
+      GtkWidget *widget =
+          gst_gtk_base_sink_acquire_widget (GST_GTK_BASE_SINK (object));
+      gtk_gst_gl_widget_set_rotate_method (GTK_GST_GL_WIDGET (widget),
           g_value_get_enum (value), FALSE);
+      g_object_unref (widget);
       break;
-
+    }
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -154,11 +157,16 @@ gst_gtk_gl_sink_get_property (GObject * object, guint prop_id,
 {
   switch (prop_id) {
     case PROP_ROTATE_METHOD:
+    {
+      GtkWidget *widget =
+          gst_gtk_base_sink_acquire_widget (GST_GTK_BASE_SINK (object));
+
       g_value_set_enum (value,
-          gtk_gst_gl_widget_get_rotate_method (GTK_GST_GL_WIDGET
-              (gst_gtk_base_sink_acquire_widget (GST_GTK_BASE_SINK (object)))));
-      break;
+          gtk_gst_gl_widget_get_rotate_method (GTK_GST_GL_WIDGET (widget)));
+      g_object_unref (widget);
 
+      break;
+    }
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -454,6 +462,8 @@ gst_gtk_gl_sink_event (GstBaseSink * sink, GstEvent * event)
             (gst_gtk_base_sink_acquire_widget (GST_GTK_BASE_SINK (sink)));
 
         gtk_gst_gl_widget_set_rotate_method (widget, orientation, TRUE);
+
+        g_object_unref (widget);
       }
       break;
     default: