summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan Pablo Ugarte <juanpablougarte@gmail.com>2017-02-10 10:29:49 -0300
committerSebastian Dröge <sebastian@centricular.com>2017-02-19 12:51:43 +0200
commitf97f87857a63e67d8ecfd44197829a741467804c (patch)
tree5d7ea6152187370bff8c4ade2bddaa40071cec16
parent136379a2842033828de659a440cda41574f7366d (diff)
downloadgstreamer-plugins-bad-f97f87857a63e67d8ecfd44197829a741467804c.tar.gz
GstGLSinkBin: fixed sink property leak
No need to keep an extra reference to sink since an indirect one is added by gst_bin_add() https://bugzilla.gnome.org/show_bug.cgi?id=778452
-rw-r--r--ext/gl/gstglsinkbin.c50
1 files changed, 24 insertions, 26 deletions
diff --git a/ext/gl/gstglsinkbin.c b/ext/gl/gstglsinkbin.c
index c9c5a7239..b6b50bda1 100644
--- a/ext/gl/gstglsinkbin.c
+++ b/ext/gl/gstglsinkbin.c
@@ -265,31 +265,38 @@ gst_gl_sink_bin_init (GstGLSinkBin * self)
static gboolean
_connect_sink_element (GstGLSinkBin * self)
{
- gboolean res = TRUE;
-
gst_object_set_name (GST_OBJECT (self->sink), "sink");
- res &= gst_bin_add (GST_BIN (self), self->sink);
- res &= gst_element_link_pads (self->balance, "src", self->sink, "sink");
+ if (gst_bin_add (GST_BIN (self), self->sink) &&
+ gst_element_link_pads (self->balance, "src", self->sink, "sink"))
+ return TRUE;
- if (!res)
- GST_ERROR_OBJECT (self, "Failed to link sink element into the pipeline");
+ GST_ERROR_OBJECT (self, "Failed to link sink element into the pipeline");
+ return FALSE;
+}
+
+static void
+gst_gl_sink_bin_set_sink (GstGLSinkBin * self, GstElement * sink)
+{
+ g_return_if_fail (GST_IS_ELEMENT (sink));
+
+ if (self->sink) {
+ gst_bin_remove (GST_BIN (self), self->sink);
+ self->sink = NULL;
+ }
- return res;
+ /* We keep an indirect reference when the element is added */
+ self->sink = sink;
+
+ if (sink && !_connect_sink_element (self))
+ self->sink = NULL;
}
void
gst_gl_sink_bin_finish_init_with_element (GstGLSinkBin * self,
GstElement * element)
{
- g_return_if_fail (GST_IS_ELEMENT (element));
-
- self->sink = element;
-
- if (!_connect_sink_element (self)) {
- gst_object_unref (self->sink);
- self->sink = NULL;
- }
+ gst_gl_sink_bin_set_sink (self, element);
}
void
@@ -302,7 +309,7 @@ gst_gl_sink_bin_finish_init (GstGLSinkBin * self)
element = klass->create_element ();
if (element)
- gst_gl_sink_bin_finish_init_with_element (self, element);
+ gst_gl_sink_bin_set_sink (self, element);
}
static void
@@ -313,17 +320,8 @@ gst_gl_sink_bin_set_property (GObject * object, guint prop_id,
switch (prop_id) {
case PROP_SINK:
- {
- GstElement *sink = g_value_get_object (value);
- if (self->sink)
- gst_bin_remove (GST_BIN (self), self->sink);
- self->sink = sink;
- if (sink) {
- gst_object_ref_sink (sink);
- _connect_sink_element (self);
- }
+ gst_gl_sink_bin_set_sink (self, g_value_get_object (value));
break;
- }
case PROP_CONTRAST:
case PROP_BRIGHTNESS:
case PROP_HUE: