*decodebin*: don't leak pad templates set on ghostpads

https://bugzilla.gnome.org/show_bug.cgi?id=635067
This commit is contained in:
Harri Mähönen 2010-11-17 10:14:59 +02:00 committed by Tim-Philipp Müller
parent 8f039997f0
commit 7c5e39664e
3 changed files with 20 additions and 7 deletions

View file

@ -392,6 +392,7 @@ gst_decode_bin_init (GstDecodeBin * decode_bin)
g_warning ("can't find typefind element, decodebin will not work");
} else {
GstPad *pad, *gpad;
GstPadTemplate *pad_tmpl;
/* add the typefind element */
if (!gst_bin_add (GST_BIN (decode_bin), decode_bin->typefind)) {
@ -403,12 +404,15 @@ gst_decode_bin_init (GstDecodeBin * decode_bin)
/* get the sinkpad */
pad = gst_element_get_static_pad (decode_bin->typefind, "sink");
/* get the pad template */
pad_tmpl = gst_static_pad_template_get (&decoder_bin_sink_template);
/* ghost the sink pad to ourself */
gpad = gst_ghost_pad_new_from_template ("sink", pad,
gst_static_pad_template_get (&decoder_bin_sink_template));
gpad = gst_ghost_pad_new_from_template ("sink", pad, pad_tmpl);
gst_pad_set_active (gpad, TRUE);
gst_element_add_pad (GST_ELEMENT (decode_bin), gpad);
gst_object_unref (pad_tmpl);
gst_object_unref (pad);
/* connect a signal to find out when the typefind element found

View file

@ -919,6 +919,7 @@ gst_decode_bin_init (GstDecodeBin * decode_bin)
} else {
GstPad *pad;
GstPad *gpad;
GstPadTemplate *pad_tmpl;
/* add the typefind element */
if (!gst_bin_add (GST_BIN (decode_bin), decode_bin->typefind)) {
@ -930,12 +931,15 @@ gst_decode_bin_init (GstDecodeBin * decode_bin)
/* get the sinkpad */
pad = gst_element_get_static_pad (decode_bin->typefind, "sink");
/* get the pad template */
pad_tmpl = gst_static_pad_template_get (&decoder_bin_sink_template);
/* ghost the sink pad to ourself */
gpad = gst_ghost_pad_new_from_template ("sink", pad,
gst_static_pad_template_get (&decoder_bin_sink_template));
gpad = gst_ghost_pad_new_from_template ("sink", pad, pad_tmpl);
gst_pad_set_active (gpad, TRUE);
gst_element_add_pad (GST_ELEMENT (decode_bin), gpad);
gst_object_unref (pad_tmpl);
gst_object_unref (pad);
/* connect a signal to find out when the typefind element found
@ -3406,16 +3410,19 @@ static GstDecodePad *
gst_decode_pad_new (GstDecodeBin * dbin, GstPad * pad, GstDecodeChain * chain)
{
GstDecodePad *dpad;
GstPadTemplate *pad_tmpl;
GST_DEBUG_OBJECT (dbin, "making new decodepad");
pad_tmpl = gst_static_pad_template_get (&decoder_bin_src_template);
dpad =
g_object_new (GST_TYPE_DECODE_PAD, "direction", GST_PAD_DIRECTION (pad),
"template", gst_static_pad_template_get (&decoder_bin_src_template),
"template", pad_tmpl,
NULL);
gst_ghost_pad_construct (GST_GHOST_PAD_CAST (dpad));
gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (dpad), pad);
dpad->chain = chain;
dpad->dbin = dbin;
gst_object_unref (pad_tmpl);
return dpad;
}

View file

@ -832,6 +832,7 @@ new_decoded_pad_cb (GstElement * element, GstPad * pad, gboolean last,
GstURIDecodeBin * decoder)
{
GstPad *newpad;
GstPadTemplate *pad_tmpl;
gchar *padname;
GST_DEBUG_OBJECT (element, "new decoded pad, name: <%s>. Last: %d",
@ -842,8 +843,9 @@ new_decoded_pad_cb (GstElement * element, GstPad * pad, gboolean last,
decoder->numpads++;
GST_URI_DECODE_BIN_UNLOCK (decoder);
newpad = gst_ghost_pad_new_from_template (padname, pad,
gst_static_pad_template_get (&srctemplate));
pad_tmpl = gst_static_pad_template_get (&srctemplate);
newpad = gst_ghost_pad_new_from_template (padname, pad, pad_tmpl);
gst_object_unref (pad_tmpl);
g_free (padname);
/* store ref to the ghostpad so we can remove it */