playback/player: don't unref a contained widget
authorVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Fri, 28 Apr 2017 15:12:25 +0000 (17:12 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Tue, 2 May 2017 11:11:30 +0000 (14:11 +0300)
In the GTK+ model, when a wiget is created, it is floating, thus
when it is added to a widget container, this container is the owner
of the widget.

The video_area widget is created in two different paths:

1\ when the renderer element is also a GTK+ widget and we are
   the owners.
2\ when the renderer element is an overlay an video area a new
   widget owned by the container.

In the first code path, there was a memory leak fixed on commit
f8d4796a, but it didn't consider the second path, leading to a
segmentation fault because the owner of the widget is not us.

This patch unrefs early the video area widget in the first path
avoiding to unref it twice in the second path.

https://bugzilla.gnome.org/show_bug.cgi?id=781904

playback/player/gtk/gtk-play.c

index 8ae0fea..c961198 100644 (file)
@@ -1425,6 +1425,7 @@ create_ui (GtkPlay * play)
     play->video_area =
         gst_player_gtk_video_renderer_get_widget (GST_PLAYER_GTK_VIDEO_RENDERER
         (play->renderer));
+    g_object_unref (play->video_area);
   } else {
     play->renderer = gst_player_video_overlay_video_renderer_new (NULL);
 
@@ -1778,7 +1779,6 @@ gtk_play_dispose (GObject * object)
     g_object_unref (self->player);
   }
   self->player = NULL;
-  g_clear_object (&self->video_area);
 
   G_OBJECT_CLASS (gtk_play_parent_class)->dispose (object);
 }