[0.11] gstreamer: element: call ->release_pad() to clean up pad

Tim Müller tpm at kemper.freedesktop.org
Thu Jan 26 07:44:25 PST 2012


Module: gstreamer
Branch: 0.11
Commit: 9048b4dc2af3d80ff696280565143975da80d017
URL:    http://cgit.freedesktop.org/gstreamer/gstreamer/commit/?id=9048b4dc2af3d80ff696280565143975da80d017

Author: David Schleef <ds at schleef.org>
Date:   Sat Dec  4 18:53:55 2010 -0800

element: call ->release_pad() to clean up pad

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

---

 gst/gstelement.c |   14 +++++++++++++-
 1 files changed, 13 insertions(+), 1 deletions(-)

diff --git a/gst/gstelement.c b/gst/gstelement.c
index 91a4c4c..30c73f2 100644
--- a/gst/gstelement.c
+++ b/gst/gstelement.c
@@ -316,6 +316,8 @@ gst_element_release_request_pad (GstElement * element, GstPad * pad)
 
   g_return_if_fail (GST_IS_ELEMENT (element));
   g_return_if_fail (GST_IS_PAD (pad));
+  g_return_if_fail (GST_PAD_TEMPLATE_PRESENCE (GST_PAD_PAD_TEMPLATE (pad))
+      == GST_PAD_REQUEST);
 
   oclass = GST_ELEMENT_GET_CLASS (element);
 
@@ -2747,6 +2749,9 @@ gst_element_dispose (GObject * object)
   GstElement *element = GST_ELEMENT_CAST (object);
   GstClock **clock_p;
   GstBus **bus_p;
+  GstElementClass *oclass;
+
+  oclass = GST_ELEMENT_GET_CLASS (element);
 
   GST_CAT_INFO_OBJECT (GST_CAT_REFCOUNTING, element, "dispose");
 
@@ -2757,8 +2762,15 @@ gst_element_dispose (GObject * object)
       "removing %d pads", g_list_length (element->pads));
   /* first we break all our links with the outside */
   while (element->pads && element->pads->data) {
+    GstPad *pad = GST_PAD_CAST (element->pads->data);
+
     /* don't call _remove_pad with NULL */
-    gst_element_remove_pad (element, GST_PAD_CAST (element->pads->data));
+    if (oclass->release_pad && GST_PAD_PAD_TEMPLATE (pad) &&
+        GST_PAD_TEMPLATE_PRESENCE (GST_PAD_PAD_TEMPLATE (pad))
+        == GST_PAD_REQUEST)
+      (oclass->release_pad) (element, GST_PAD_CAST (element->pads->data));
+    else
+      gst_element_remove_pad (element, GST_PAD_CAST (element->pads->data));
   }
   if (G_UNLIKELY (element->pads != NULL)) {
     g_critical ("could not remove pads from element %s",



More information about the gstreamer-commits mailing list