};
-static void gst_element_class_init (GstElementClass *klass);
-static void gst_element_init (GstElement *element);
+static void gst_element_class_init (GstElementClass *klass);
+static void gst_element_init (GstElement *element);
-static void gst_element_real_destroy (GtkObject *object);
+static void gst_element_real_destroy (GtkObject *object);
-static GstElementStateReturn gst_element_change_state(GstElement *element);
+static GstElementStateReturn gst_element_change_state (GstElement *element);
+
+static xmlNodePtr gst_element_save_thyself (GstObject *object, xmlNodePtr parent);
static GstObjectClass *parent_class = NULL;
static guint gst_element_signals[LAST_SIGNAL] = { 0 };
gst_element_class_init (GstElementClass *klass)
{
GtkObjectClass *gtkobject_class;
+ GstObjectClass *gstobject_class;
- gtkobject_class = (GtkObjectClass*)klass;
+ gtkobject_class = (GtkObjectClass*) klass;
+ gstobject_class = (GstObjectClass*) klass;
parent_class = gtk_type_class(GST_TYPE_OBJECT);
gtk_object_class_add_signals (gtkobject_class, gst_element_signals, LAST_SIGNAL);
+ gtkobject_class->destroy = gst_element_real_destroy;
+
+ gstobject_class->save_thyself = gst_element_save_thyself;
+
klass->change_state = gst_element_change_state;
klass->elementfactory = NULL;
-
- gtkobject_class->destroy = gst_element_real_destroy;
}
static void
}
/**
+ * gst_element_set_name:
+ * @element: GstElement to set name of
+ * @name: new name of element
+ *
+ * Set the name of the element, getting rid of the old name if there was
+ * one.
+ */
+void
+gst_element_set_name (GstElement *element, const gchar *name)
+{
+ g_return_if_fail (element != NULL);
+ g_return_if_fail (GST_IS_ELEMENT (element));
+ g_return_if_fail (name != NULL);
+
+ gst_object_set_name (GST_OBJECT (element), name);
+}
+
+/**
+ * gst_element_get_name:
+ * @element: GstElement to get name of
+ *
+ * Get the name of the element.
+ *
+ * Returns: name of the element
+ */
+const gchar*
+gst_element_get_name (GstElement *element)
+{
+ g_return_val_if_fail (element != NULL, NULL);
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+
+ return GST_OBJECT_NAME (element);
+}
+
+/**
+ * gst_element_set_parent:
+ * @element: GstElement to set parent of
+ * @name: new parent of the object
+ *
+ * Set the parent of the element.
+ */
+void
+gst_element_set_parent (GstElement *element, GstObject *parent)
+{
+ g_return_if_fail (element != NULL);
+ g_return_if_fail (GST_IS_ELEMENT (element));
+ g_return_if_fail (GST_OBJECT_PARENT (element) == NULL);
+ g_return_if_fail (parent != NULL);
+ g_return_if_fail (GTK_IS_OBJECT (parent));
+ g_return_if_fail ((gpointer)element != (gpointer)parent);
+
+ gst_object_set_parent (GST_OBJECT (element), parent);
+}
+
+/**
+ * gst_element_get_parent:
+ * @element: GstElement to get the parent of
+ *
+ * Get the parent of the element.
+ *
+ * Returns: parent of the element
+ */
+GstObject*
+gst_element_get_parent (GstElement *element)
+{
+ g_return_val_if_fail (element != NULL, NULL);
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+
+ return GST_OBJECT_PARENT (element);
+}
+
+/**
* gst_element_add_pad:
* @element: element to add pad to
* @pad: pad to add
/* set the pad's parent */
GST_DEBUG (0,"setting parent of pad '%s'(%p) to '%s'(%p)\n",
- gst_pad_get_name(pad),pad,gst_element_get_name(element),element);
- gst_pad_set_parent (pad,GST_OBJECT (element));
+ GST_PAD_NAME (pad), pad, GST_ELEMENT_NAME (element), element);
+ gst_object_set_parent (GST_OBJECT (pad), GST_OBJECT (element));
/* add it to the list */
element->pads = g_list_append (element->pads, pad);
ghostpad = gst_ghost_pad_new (name, pad);
/* add it to the list */
- GST_DEBUG(0,"adding ghost pad %s to element %s\n",name,gst_element_get_name(element));
+ GST_DEBUG(0,"adding ghost pad %s to element %s\n", name, GST_ELEMENT_NAME (element));
element->pads = g_list_append (element->pads, ghostpad);
element->numpads++;
// set the parent of the ghostpad
- gst_pad_set_parent(ghostpad, GST_OBJECT (element));
+ gst_object_set_parent (GST_OBJECT (ghostpad), GST_OBJECT (element));
GST_DEBUG(0,"added ghostpad %s:%s\n",GST_DEBUG_PAD_NAME(ghostpad));
return NULL;
GST_DEBUG(GST_CAT_ELEMENT_PADS,"searching for pad '%s' in element %s\n",
- name,gst_element_get_name(element));
+ name, GST_ELEMENT_NAME (element));
// look through the list, matching by name
walk = element->pads;
while (walk) {
- if (!strcmp ((GST_PAD(walk->data))->name, name)) {
+ GstPad *pad = GST_PAD(walk->data);
+ if (!strcmp (gst_object_get_name (GST_OBJECT(pad)), name)) {
GST_DEBUG(GST_CAT_ELEMENT_PADS,"found pad '%s'\n",name);
- return GST_PAD(walk->data);
+ return pad;
}
walk = g_list_next (walk);
}
/*
if (srcparent != destparent) {
GST_ERROR_OBJECT(srcparent,destparent,"%s and %s have different parents",
- gst_element_get_name(src),gst_element_get_name(dest));
+ GST_ELEMENT_NAME (src),GST_ELEMENT_NAME (dest));
return;
}
*/
void
gst_element_error (GstElement *element, const gchar *error)
{
- g_error("GstElement: error in element '%s': %s\n", element->name, error);
+ g_error("GstElement: error in element '%s': %s\n", gst_object_get_name (GST_OBJECT (element)), error);
/* FIXME: this is not finished!!! */
/* if that outright didn't work, we need to bail right away */
/* NOTE: this will bail on ASYNC as well! */
if (return_val == GST_STATE_FAILURE) {
-// GST_DEBUG (0,"have async return from '%s'\n",gst_element_get_name(element));
+// GST_DEBUG (0,"have async return from '%s'\n",GST_ELEMENT_NAME (element));
return return_val;
}
}
return TRUE;
}
-/**
- * gst_element_set_name:
- * @element: GstElement to set name of
- * @name: new name of element
- *
- * Set the name of the element, getting rid of the old name if there was
- * one.
- */
-void
-gst_element_set_name (GstElement *element, const gchar *name)
-{
- g_return_if_fail (element != NULL);
- g_return_if_fail (GST_IS_ELEMENT (element));
- g_return_if_fail (name != NULL);
-
- if (element->name != NULL)
- g_free(element->name);
-
- element->name = g_strdup (name);
-}
-
-/**
- * gst_element_get_name:
- * @element: GstElement to get name of
- *
- * Get the name of the element.
- *
- * Returns: name of the element
- */
-const gchar*
-gst_element_get_name (GstElement *element)
-{
- g_return_val_if_fail (element != NULL, NULL);
- g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
-
- return element->name;
-}
-
static void
gst_element_real_destroy (GtkObject *object)
{
// g_print("in gst_element_real_destroy()\n");
- if (element->name)
- g_free (element->name);
-
pads = element->pads;
while (pads) {
pad = GST_PAD (pads->data);
*
* Returns: the new xml node
*/
-xmlNodePtr
-gst_element_save_thyself (GstElement *element,
+static xmlNodePtr
+gst_element_save_thyself (GstObject *object,
xmlNodePtr parent)
{
- xmlNodePtr self;
GList *pads;
- GstPad *pad;
GstElementClass *oclass;
- GstElementFactory *factory;
GtkType type;
+ GstElement *element;
+
+ g_return_val_if_fail (object != NULL, parent);
+ g_return_val_if_fail (GST_IS_ELEMENT (object), parent);
+ g_return_val_if_fail (parent != NULL, parent);
+
+ element = GST_ELEMENT (object);
oclass = GST_ELEMENT_CLASS (GTK_OBJECT (element)->klass);
- self = xmlNewChild (parent, NULL, "element", NULL);
- xmlNewChild(self, NULL, "name", element->name);
+ xmlNewChild(parent, NULL, "name", gst_object_get_name (GST_OBJECT (element)));
+
if (oclass->elementfactory != NULL) {
- factory = (GstElementFactory *)oclass->elementfactory;
- xmlNewChild (self, NULL, "type", factory->name);
- xmlNewChild (self, NULL, "version", factory->details->version);
+ GstElementFactory *factory = (GstElementFactory *)oclass->elementfactory;
+
+ xmlNewChild (parent, NULL, "type", factory->name);
+ xmlNewChild (parent, NULL, "version", factory->details->version);
}
// output all args to the element
for (i=0; i<num_args; i++) {
if ((args[i].type > GTK_TYPE_NONE) &&
- //(args[i].type <= GTK_TYPE_STRING) &&
(flags[i] & GTK_ARG_READABLE)) {
xmlNodePtr arg;
gtk_object_getv (GTK_OBJECT (element), 1, &args[i]);
- arg = xmlNewChild (self, NULL, "arg", NULL);
+ arg = xmlNewChild (parent, NULL, "arg", NULL);
xmlNewChild (arg, NULL, "name", args[i].name);
switch (args[i].type) {
case GTK_TYPE_CHAR:
pads = element->pads;
while (pads) {
- xmlNodePtr padtag = xmlNewChild (self, NULL, "pad", NULL);
- pad = GST_PAD (pads->data);
+ GstPad *pad = GST_PAD (pads->data);
+ xmlNodePtr padtag = xmlNewChild (parent, NULL, "pad", NULL);
// figure out if it's a direct pad or a ghostpad
- if (GST_ELEMENT (pad->parent) == element)
- gst_pad_save_thyself (pad, padtag);
+ if (GST_ELEMENT (GST_OBJECT_PARENT (pad)) == element)
+ gst_object_save_thyself (GST_OBJECT (pad), padtag);
pads = g_list_next (pads);
}
-
- if (oclass->save_thyself)
- (oclass->save_thyself)(element, self);
-
- return self;
+ return parent;
}
/**
* gst_element_load_thyself:
- * @parent: the xml parent node
+ * @self: the xml node
* @elements: a hashtable to store the elements in. This is used
* to resolve inter element dependecies during the loading.
*
* Returns: the new element
*/
GstElement*
-gst_element_load_thyself (xmlNodePtr parent,
- GHashTable *elements)
+gst_element_load_thyself (xmlNodePtr self, GstObject *parent)
{
- xmlNodePtr children = parent->xmlChildrenNode;
+ xmlNodePtr children = self->xmlChildrenNode;
GstElement *element;
- GstElementClass *oclass;
+ GstObjectClass *oclass;
guchar *name = NULL;
guchar *value = NULL;
guchar *type = NULL;
g_return_val_if_fail (element != NULL, NULL);
- g_hash_table_insert (elements, g_strdup (gst_element_get_name (element)), element);
+ // ne need to set the parent on this object bacause the pads
+ // will go through the hierarchy to connect to thier peers
+ if (parent)
+ gst_object_set_parent (GST_OBJECT (element), parent);
// we have the element now, set the arguments
- children = parent->xmlChildrenNode;
+ children = self->xmlChildrenNode;
while (children) {
if (!strcmp (children->name, "arg")) {
children = children->next;
}
// we have the element now, set the pads
- children = parent->xmlChildrenNode;
+ children = self->xmlChildrenNode;
while (children) {
if (!strcmp (children->name, "pad")) {
- gst_pad_load_and_connect (children, GST_OBJECT(element), elements);
+ gst_pad_load_and_connect (children, GST_OBJECT (element));
}
children = children->next;
}
- oclass = GST_ELEMENT_CLASS (GTK_OBJECT (element)->klass);
+ oclass = GST_OBJECT_CLASS (GTK_OBJECT (element)->klass);
if (oclass->restore_thyself)
- (oclass->restore_thyself) (element, parent, elements);
+ (oclass->restore_thyself) (GST_OBJECT (element), self);
+
+ if (parent)
+ gst_object_unparent (GST_OBJECT (element));
return element;
}