api changes and render/ghost functions
authorThomas Vander Stichele <thomas@apestaart.org>
Fri, 12 Jul 2002 09:41:25 +0000 (09:41 +0000)
committerThomas Vander Stichele <thomas@apestaart.org>
Fri, 12 Jul 2002 09:41:25 +0000 (09:41 +0000)
Original commit message from CVS:
api changes and render/ghost functions

gst-libs/gst/gconf/Makefile.am
gst-libs/gst/gconf/gconf.c
gst-libs/gst/gconf/gconf.h

index 0514c53..63641bd 100644 (file)
@@ -1,4 +1,4 @@
-librarydir = $(prefix)/lib/gst
+librarydir = $(prefix)/lib
 
 library_LTLIBRARIES = libgstgconf.la
 
index 6463039..60ad07c 100644 (file)
@@ -19,6 +19,44 @@ gst_gconf_get_client (void)
 
   return _gst_gconf_client;
 }
+/* go through a bin, finding the one pad that is unconnected in the given
+ *  * direction, and return that pad */
+GstPad *
+gst_bin_find_unconnected_pad (GstBin *bin, GstPadDirection direction)
+{
+  GstPad *pad = NULL;
+  GList *elements = NULL;
+  GList *pads = NULL;
+  GstElement *element = NULL;
+
+  g_print ("DEBUG: find_unconnected start\n");
+  elements = (GList *) gst_bin_get_list (bin);
+  /* traverse all elements looking for unconnected pads */
+  while (elements && pad == NULL)
+  {
+    element = GST_ELEMENT (elements->data);
+    g_print ("DEBUG: looking in element %s\n", gst_element_get_name (element));
+    pads = gst_element_get_pad_list (element);
+    while (pads)
+    {
+      /* check if the direction matches */
+      if (GST_PAD_DIRECTION (GST_PAD (pads->data)) == direction)
+      {
+        if (GST_PAD_PEER (GST_PAD (pads->data)) == NULL)
+        {
+          /* found it ! */
+         g_print ("DEBUG: found an unconnected pad !\n");
+         pad = GST_PAD (pads->data);
+       }
+      }
+      if (pad) break; /* found one already */
+      pads = g_list_next (pads);
+    }
+    elements = g_list_next (elements);
+  }
+  g_print ("DEBUG: find_unconnected stop\n");
+  return pad;
+}
 
 /* external functions */
 
@@ -47,27 +85,47 @@ gst_gconf_set_string (const gchar *key, const gchar *value)
   gconf_client_set_string (gst_gconf_get_client (), key, value, NULL);
 }
 
-gboolean
-gst_gconf_render_bin (const gchar *key, GstElement **element)
+/* this function renders the given description to a bin,
+ * and ghosts at most one unconnected src pad and one unconnected sink pad */
+GstElement *
+gst_gconf_render_bin_from_description (const gchar *description)
 {
-  GstElement *bin;
-  gchar *pipeline;
+  GstElement *bin = NULL;
+  GstPad *pad = NULL;
   GError *error = NULL;
-  gchar *value = NULL;
-  
-  value = gst_gconf_get_string (key);
 
-  pipeline = g_strdup_printf ("bin.( %s )", value);
-  bin = GST_ELEMENT (gst_parse_launch (pipeline, &error));
+  /* parse the pipeline */
+  bin = GST_ELEMENT (gst_parse_launch (description, &error));
   if (error)
   {
     g_print ("DEBUG: gstgconf: error parsing pipeline %s\n%s\n",
-            pipeline, error->message);
+            description, error->message);
     g_error_free (error);
-    return FALSE;
+    return NULL;
   }
-  *element = bin;
-  return TRUE;
+
+  /* find pads and ghost them if necessary */
+  if ((pad = gst_bin_find_unconnected_pad (GST_BIN (bin), GST_PAD_SRC)))
+    gst_element_add_ghost_pad (bin, pad, "src");
+  if ((pad = gst_bin_find_unconnected_pad (GST_BIN (bin), GST_PAD_SINK)))
+    gst_element_add_ghost_pad (bin, pad, "sink");
+  return bin;
+}
+
+/* this function reads the gconf key, parses the pipeline bit to a bin,
+ * and ghosts at most one unconnected src pad and one unconnected sink pad */
+GstElement *
+gst_gconf_render_bin_from_key (const gchar *key)
+{
+  GstElement *bin;
+  gchar *description;
+  gchar *value = NULL;
+  
+  value = gst_gconf_get_string (key);
+  description = g_strdup_printf ("bin.( %s )", value);
+  bin = gst_gconf_render_bin_from_description (description);
+  g_free (description);
+  return bin;
 }
 
 /*
index 5367854..a054dc3 100644 (file)
@@ -12,8 +12,8 @@ gchar *               gst_gconf_get_string            (const gchar *key);
 void           gst_gconf_set_string            (const gchar *key, 
                                                  const gchar *value);
 
-gboolean       gst_gconf_render_bin            (const gchar *key,
-                                                GstElement **element);
+GstElement *   gst_gconf_render_bin_from_key           (const gchar *key);
+GstElement *   gst_gconf_render_bin_from_description   (const gchar *description);
 
 /*
 guint          gst_gconf_notify_add            (const gchar *key,