loadsave: fix requestpad handling and serialisation order.
authorHannes Bistry <bistry@informatik.uni-hamburg.de>
Wed, 20 May 2009 07:56:11 +0000 (10:56 +0300)
committerStefan Kost <ensonic@users.sf.net>
Wed, 20 May 2009 07:58:59 +0000 (10:58 +0300)
Support request pads when loading. Reverse pad serialisation order to
preserve it when recreating the pipeline.

gst/gstbin.c
gst/gstelement.c
gst/gstpad.c

index 6f67e5d..435bb49 100644 (file)
@@ -3611,12 +3611,12 @@ gst_bin_save_thyself (GstObject * object, xmlNodePtr parent)
   GST_CAT_INFO (GST_CAT_XML, "[%s]: saving %d children",
       GST_ELEMENT_NAME (bin), bin->numchildren);
 
-  children = bin->children;
+  children = g_list_last (bin->children);
   while (children) {
     child = GST_ELEMENT (children->data);
     elementnode = xmlNewChild (childlist, NULL, (xmlChar *) "element", NULL);
     gst_object_save_thyself (GST_OBJECT (child), elementnode);
-    children = g_list_next (children);
+    children = g_list_previous (children);
   }
   return childlist;
 }
index 9bd65da..2d65794 100644 (file)
@@ -2886,7 +2886,7 @@ gst_element_save_thyself (GstObject * object, xmlNodePtr parent)
 
   g_free (specs);
 
-  pads = GST_ELEMENT_PADS (element);
+  pads = g_list_last (GST_ELEMENT_PADS (element));
 
   while (pads) {
     GstPad *pad = GST_PAD_CAST (pads->data);
@@ -2897,7 +2897,7 @@ gst_element_save_thyself (GstObject * object, xmlNodePtr parent)
 
       gst_object_save_thyself (GST_OBJECT_CAST (pad), padtag);
     }
-    pads = g_list_next (pads);
+    pads = g_list_previous (pads);
   }
 
   return parent;
index 724d087..2dd07f3 100644 (file)
@@ -3645,6 +3645,7 @@ gst_pad_load_and_link (xmlNodePtr self, GstObject * parent)
 {
   xmlNodePtr field = self->xmlChildrenNode;
   GstPad *pad = NULL, *targetpad;
+  GstPadTemplate *tmpl;
   gchar *peer = NULL;
   gchar **split;
   GstElement *target;
@@ -3655,7 +3656,8 @@ gst_pad_load_and_link (xmlNodePtr self, GstObject * parent)
     if (!strcmp ((char *) field->name, "name")) {
       name = (gchar *) xmlNodeGetContent (field);
       pad = gst_element_get_static_pad (GST_ELEMENT (parent), name);
-      if (!pad)
+      if ((!pad) || ((tmpl = gst_pad_get_pad_template (pad))
+              && (GST_PAD_REQUEST == GST_PAD_TEMPLATE_PRESENCE (tmpl))))
         pad = gst_element_get_request_pad (GST_ELEMENT (parent), name);
       g_free (name);
     } else if (!strcmp ((char *) field->name, "peer")) {
@@ -3699,7 +3701,10 @@ gst_pad_load_and_link (xmlNodePtr self, GstObject * parent)
   if (targetpad == NULL)
     goto cleanup;
 
-  gst_pad_link (pad, targetpad);
+  if (gst_pad_get_direction (pad) == GST_PAD_SRC)
+    gst_pad_link (pad, targetpad);
+  else
+    gst_pad_link (targetpad, pad);
 
 cleanup:
   g_strfreev (split);