/***** Start with the base GstPad class *****/
static void gst_pad_class_init (GstPadClass *klass);
static void gst_pad_init (GstPad *pad);
+static void gst_pad_dispose (GObject *object);
static gboolean gst_pad_try_relink_filtered_func (GstRealPad *srcpad, GstRealPad *sinkpad,
GstCaps *caps, gboolean clear);
+static void gst_pad_set_pad_template (GstPad *pad, GstPadTemplate *templ);
#ifndef GST_DISABLE_LOADSAVE
static xmlNodePtr gst_pad_save_thyself (GstObject *object, xmlNodePtr parent);
static void
gst_pad_class_init (GstPadClass *klass)
{
+ GObjectClass *gobject_class;
+
+ gobject_class = (GObjectClass*) klass;
+
pad_parent_class = g_type_class_ref (GST_TYPE_OBJECT);
+
+ gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_pad_dispose);
}
static void
gst_pad_init (GstPad *pad)
{
- pad->element_private = NULL;
+ /* all structs are initialized to NULL by glib */
+}
+static void
+gst_pad_dispose (GObject *object)
+{
+ GstPad *pad = GST_PAD (object);
+
+ gst_pad_set_pad_template (pad, NULL);
- pad->padtemplate = NULL;
+ G_OBJECT_CLASS (pad_parent_class)->dispose (object);
}
static void gst_real_pad_class_init (GstRealPadClass *klass);
static void gst_real_pad_init (GstRealPad *pad);
+static void gst_real_pad_dispose (GObject *object);
static void gst_real_pad_set_property (GObject *object, guint prop_id,
const GValue *value,
GValue *value,
GParamSpec *pspec);
-static void gst_real_pad_dispose (GObject *object);
-
GType _gst_real_pad_type = 0;
static GstPad *real_pad_parent_class = NULL;
g_return_val_if_fail (templ != NULL, NULL);
pad = gst_pad_new (name, templ->direction);
-
- gst_object_ref (GST_OBJECT (templ));
- GST_PAD_PAD_TEMPLATE (pad) = templ;
+ gst_pad_set_pad_template (pad, templ);
- g_signal_emit (G_OBJECT (templ), gst_pad_template_signals[TEMPL_PAD_CREATED], 0, pad);
-
return pad;
}
return GST_PAD_PARENT (pad);
}
+static void
+gst_pad_set_pad_template (GstPad *pad, GstPadTemplate *templ)
+{
+ /* this function would need checks if it weren't static */
+
+ gst_object_replace ((GstObject **) &pad->padtemplate, (GstObject *) templ);
+
+ if (templ)
+ g_signal_emit (G_OBJECT (templ), gst_pad_template_signals[TEMPL_PAD_CREATED], 0, pad);
+}
/**
* gst_pad_get_pad_template:
* @pad: a #GstPad to get the pad template of.
{
GstRealPad *realpad;
- g_return_if_fail (pad != NULL);
g_return_if_fail (GST_IS_PAD (pad));
- g_return_if_fail (ghostpad != NULL);
g_return_if_fail (GST_IS_GHOST_PAD (ghostpad));
-
realpad = GST_PAD_REALIZE (pad);
+ g_return_if_fail (GST_GPAD_REALPAD (ghostpad) == realpad);
realpad->ghostpads = g_list_remove (realpad->ghostpads, ghostpad);
+ GST_GPAD_REALPAD (ghostpad) = NULL;
}
/**
GST_DEBUG (GST_CAT_REFCOUNTING, "dispose %s:%s", GST_DEBUG_PAD_NAME(pad));
- if (GST_PAD_PAD_TEMPLATE (pad)){
- GST_DEBUG (GST_CAT_REFCOUNTING, "unreffing padtemplate'%s'",
- GST_OBJECT_NAME (GST_PAD_PAD_TEMPLATE (pad)));
- gst_object_unref (GST_OBJECT (GST_PAD_PAD_TEMPLATE (pad)));
- GST_PAD_PAD_TEMPLATE (pad) = NULL;
- }
-
/* we destroy the ghostpads, because they are nothing without the real pad */
if (GST_REAL_PAD (pad)->ghostpads) {
GList *orig, *ghostpads;
/***** ghost pads *****/
GType _gst_ghost_pad_type = 0;
-static void gst_ghost_pad_class_init (GstGhostPadClass *klass);
-static void gst_ghost_pad_init (GstGhostPad *pad);
+static void gst_ghost_pad_class_init (GstGhostPadClass *klass);
+static void gst_ghost_pad_init (GstGhostPad *pad);
+static void gst_ghost_pad_dispose (GObject *object);
static GstPad *ghost_pad_parent_class = NULL;
/* static guint gst_ghost_pad_signals[LAST_SIGNAL] = { 0 }; */
gobject_class = (GObjectClass*) klass;
ghost_pad_parent_class = g_type_class_ref (GST_TYPE_PAD);
+
+ gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_ghost_pad_dispose);
}
static void
gst_ghost_pad_init (GstGhostPad *pad)
{
- pad->realpad = NULL;
+ /* zeroed by glib */
+}
+static void
+gst_ghost_pad_dispose (GObject *object)
+{
+ GstGhostPad *pad = GST_GHOST_PAD (object);
+
+ if (pad->realpad)
+ gst_pad_remove_ghost_pad((GstPad *) pad->realpad, (GstPad *) pad);
+
+ G_OBJECT_CLASS (ghost_pad_parent_class)->dispose (object);
}
/**
realpad = GST_PAD_REALIZE (realpad);
}
GST_GPAD_REALPAD (ghostpad) = realpad;
- GST_PAD_PAD_TEMPLATE (ghostpad) = GST_PAD_PAD_TEMPLATE (pad);
+ gst_pad_set_pad_template (GST_PAD (ghostpad), GST_PAD_PAD_TEMPLATE (pad));
/* add ourselves to the real pad's list of ghostpads */
gst_pad_add_ghost_pad (pad, GST_PAD (ghostpad));