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
This commit is contained in:
Juan Pablo Ugarte 2017-02-10 10:29:49 -03:00 committed by Sebastian Dröge
parent 0102caf06d
commit ef739e726f

View file

@ -267,31 +267,38 @@ gst_gl_sink_bin_init (GstGLSinkBin * self)
static gboolean static gboolean
_connect_sink_element (GstGLSinkBin * self) _connect_sink_element (GstGLSinkBin * self)
{ {
gboolean res = TRUE;
gst_object_set_name (GST_OBJECT (self->sink), "sink"); 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;
}
return res; 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;
}
/* We keep an indirect reference when the element is added */
self->sink = sink;
if (sink && !_connect_sink_element (self))
self->sink = NULL;
} }
void void
gst_gl_sink_bin_finish_init_with_element (GstGLSinkBin * self, gst_gl_sink_bin_finish_init_with_element (GstGLSinkBin * self,
GstElement * element) GstElement * element)
{ {
g_return_if_fail (GST_IS_ELEMENT (element)); gst_gl_sink_bin_set_sink (self, element);
self->sink = element;
if (!_connect_sink_element (self)) {
gst_object_unref (self->sink);
self->sink = NULL;
}
} }
void void
@ -304,7 +311,7 @@ gst_gl_sink_bin_finish_init (GstGLSinkBin * self)
element = klass->create_element (); element = klass->create_element ();
if (element) if (element)
gst_gl_sink_bin_finish_init_with_element (self, element); gst_gl_sink_bin_set_sink (self, element);
} }
static void static void
@ -315,17 +322,8 @@ gst_gl_sink_bin_set_property (GObject * object, guint prop_id,
switch (prop_id) { switch (prop_id) {
case PROP_SINK: case PROP_SINK:
{ gst_gl_sink_bin_set_sink (self, g_value_get_object (value));
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);
}
break; break;
}
case PROP_CONTRAST: case PROP_CONTRAST:
case PROP_BRIGHTNESS: case PROP_BRIGHTNESS:
case PROP_HUE: case PROP_HUE: