diff options
author | Juan Pablo Ugarte <juanpablougarte@gmail.com> | 2017-02-10 10:29:49 -0300 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2017-02-14 12:16:44 +0200 |
commit | ef739e726fb52305245f8bbf7d26f8e2ae0f71e2 (patch) | |
tree | 993c7aa9827f3e9beb87e4d104d14774c2cdd014 /ext | |
parent | 0102caf06ddaa92ef4633924040464dcd9257529 (diff) | |
download | gstreamer-plugins-bad-ef739e726fb52305245f8bbf7d26f8e2ae0f71e2.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
Diffstat (limited to 'ext')
-rw-r--r-- | ext/gl/gstglsinkbin.c | 50 |
1 files changed, 24 insertions, 26 deletions
diff --git a/ext/gl/gstglsinkbin.c b/ext/gl/gstglsinkbin.c index 8477d73f1..310634c32 100644 --- a/ext/gl/gstglsinkbin.c +++ b/ext/gl/gstglsinkbin.c @@ -267,31 +267,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 @@ -304,7 +311,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 @@ -315,17 +322,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: |