[gst-devel] patch on gst_element_connect

Leif Morgan Johnson lmjohns3 at eos.ncsu.edu
Mon Jan 21 18:06:03 CET 2002


Hi all -

I'm submitting a patch on gst_element_connect() once again ... this time
it's a little bit more refined, though. The idea is that
gst_element_connect() should work with both normal (e.g., "src", "sink")
pads as well as request (e.g., "src%d", "channel%d") pads. The problem is
that, if we want to use gst_element_connect to connect certain pads, there
might be times when one would want gst_element_connect() to only look for
static (non-request) pads.

So the solution we've come up with so far is :
- rename gst_element_get_pad() to gst_element_get_static_pad()
- rename gst_element_request_pad_by_name() and
  gst_element_request_compatible_pad() to gst_element_get_request_pad()
  and gst_element_get_compatible_pad(), respectively. "request" becomes a
  dedicated adjective instead of an adjective/verb hybrid.
- make a new gst_element_get_pad() that calls
  gst_element_get_static_pad(); if that returns NULL, then it calls
  gst_element_get_request_pad().

We might want to add a gst_element_connect_static() that only uses
gst_element_get_static_pad(), or we could use gst_pad_connect() for those
instances where we know which pads we want to connect.

Comments ? The patch includes some minor fixes to remove
gst_element_request_pad_by_name() from the rest of the core gstreamer
tree.

leif

-------------- next part --------------
Index: examples/mixer/mixer.c
===================================================================
RCS file: /cvsroot/gstreamer/gstreamer/examples/mixer/mixer.c,v
retrieving revision 1.15
diff -u -r1.15 mixer.c
--- examples/mixer/mixer.c	2002/01/11 15:49:46	1.15
+++ examples/mixer/mixer.c	2002/01/22 01:48:17
@@ -55,8 +55,7 @@
   typefind = gst_elementfactory_make ("typefind", "typefind");
   g_return_val_if_fail (typefind != NULL, FALSE);
 
-  gst_pad_connect (gst_element_get_pad (element, "src"),
-                   gst_element_get_pad (typefind, "sink"));
+  gst_element_connect (element, "src", typefind, "sink");
   gst_bin_add (bin, typefind);
   gst_bin_add (GST_BIN (pipeline), GST_ELEMENT (bin));
   
@@ -69,8 +68,7 @@
 
   caps = gst_pad_get_caps (gst_element_get_pad (element, "src"));
 
-  gst_pad_disconnect (gst_element_get_pad (element, "src"),
-                      gst_element_get_pad (typefind, "sink"));
+  gst_element_disconnect (element, "src", typefind, "sink");
   gst_bin_remove (bin, typefind);
   gst_bin_remove (GST_BIN (pipeline), GST_ELEMENT (bin));
   gst_object_unref (GST_OBJECT (typefind));
@@ -94,8 +92,6 @@
   GstElement *adder;
   GstElement *audiosink;
 
-  GstPad *pad; /* to request pads for the adder */
-
   gst_init(&argc,&argv);
 
   if (argc == 1) {
@@ -122,9 +118,7 @@
   gst_bin_add (GST_BIN(main_bin), audiosink);
 
   /* connect adder and audiosink */
-
-  gst_pad_connect(gst_element_get_pad(adder,"src"),
-                  gst_element_get_pad(audiosink,"sink"));
+  gst_element_connect(adder,"src", audiosink,"sink");
   
   /* start looping */
   input_channels = NULL;
@@ -138,12 +132,9 @@
     if (i > 1) gst_element_set_state (main_bin, GST_STATE_PAUSED);
     gst_bin_add (GST_BIN(main_bin), channel_in->pipe);
 
-    /* request pads and connect to adder */
-    GST_INFO (0, "requesting pad\n");
-    pad = gst_element_request_pad_by_name (adder, "sink%d");
-    printf ("\tGot new adder sink pad %s\n", gst_pad_get_name (pad));
+    /* connect to adder */
     sprintf (buffer, "channel%d", i);
-    gst_pad_connect (gst_element_get_pad (channel_in->pipe, buffer), pad);
+    gst_element_connect (channel_in->pipe, buffer, adder, "sink%d");
 
     /* register a volume envelope */
     printf ("\tregistering volume envelope...\n");
Index: gst/gstelement.c
===================================================================
RCS file: /cvsroot/gstreamer/gstreamer/gst/gstelement.c,v
retrieving revision 1.105
diff -u -r1.105 gstelement.c
--- gst/gstelement.c	2002/01/20 16:04:16	1.105
+++ gst/gstelement.c	2002/01/22 01:48:17
@@ -406,19 +406,48 @@
   gst_element_remove_pad (element, pad);
 }
 
-
 /**
  * gst_element_get_pad:
  * @element: element to find pad of
  * @name: name of pad to retrieve
  *
- * Retrieve a pad from the element by name.
+ * Retrieve a static pad or a request pad from the element by name.
  *
  * Returns: requested pad if found, otherwise NULL.
  */
 GstPad*
 gst_element_get_pad (GstElement *element, const gchar *name)
 {
+  GstPad *pad;
+  
+  g_return_val_if_fail (element != NULL, NULL);
+  g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+  g_return_val_if_fail (name != NULL, NULL);
+
+  /* try requesting a static pad first */
+  pad = gst_element_get_static_pad (element, name);
+
+  if (pad == NULL) {
+    /* if that didn't work, use request pads instead */
+    return gst_element_get_request_pad (element, name);
+  } else {
+    return pad;
+  }
+}
+
+/**
+ * gst_element_get_static_pad:
+ * @element: element to find pad of
+ * @name: name of pad to retrieve
+ *
+ * Retrieve a static pad (one that is always present)
+ * from the element by name.
+ *
+ * Returns: requested pad if found, otherwise NULL.
+ */
+GstPad*
+gst_element_get_static_pad (GstElement *element, const gchar *name)
+{
   GList *walk;
 
   g_return_val_if_fail (element != NULL, NULL);
@@ -606,11 +635,11 @@
 }
 
 /**
- * gst_element_request_compatible_pad:
- * @element: element to request a new pad from
+ * gst_element_get_compatible_pad:
+ * @element: element to get a new pad from
  * @templ: a pad template to which the new pad should be able to connect
  *
- * Request a new pad from the element. The template will
+ * Get a new pad from the element. The template will
  * be used to decide what type of pad to create. This function
  * is typically used for elements with a padtemplate with presence
  * GST_PAD_REQUEST.
@@ -618,7 +647,7 @@
  * Returns: the new pad that was created.
  */
 GstPad*
-gst_element_request_compatible_pad (GstElement *element, GstPadTemplate *templ)
+gst_element_get_compatible_pad (GstElement *element, GstPadTemplate *templ)
 {
   GstPadTemplate *templ_new;
   GstPad *pad = NULL;
@@ -635,19 +664,19 @@
 }
 
 /**
- * gst_element_request_pad_by_name:
- * @element: element to request a new pad from
- * @name: the name of the padtemplate to use.
+ * gst_element_get_request_pad:
+ * @element: element to get a new pad from
+ * @name: the name of the padtemplate to use
  *
- * Request a new pad from the element. The name argument will
+ * Get a new pad from the element. The name argument will
  * be used to decide what padtemplate to use. This function
  * is typically used for elements with a padtemplate with presence
  * GST_PAD_REQUEST.
  *
- * Returns: the new pad that was created.
+ * Returns: the new pad that was created
  */
 GstPad*
-gst_element_request_pad_by_name (GstElement *element, const gchar *name)
+gst_element_get_request_pad (GstElement *element, const gchar *name)
 {
   GstPadTemplate *templ = NULL;
   GstPad *pad;
@@ -720,9 +749,9 @@
   if (srcpad == NULL) {
     GST_ERROR (src, "source element has no pad \"%s\"", srcpadname);
     return FALSE;
-  }
+  }  
   destpad = gst_element_get_pad (dest, destpadname);
-  if (srcpad == NULL) {
+  if (destpad == NULL) {
     GST_ERROR (dest, "destination element has no pad \"%s\"", destpadname);
     return FALSE;
   }
@@ -781,7 +810,7 @@
     return;
   }
   destpad = gst_element_get_pad (dest, destpadname);
-  if (srcpad == NULL) {
+  if (destpad == NULL) {
     GST_ERROR(dest,"destination element has no pad \"%s\"",destpadname);
     return;
   }
Index: gst/gstelement.h
===================================================================
RCS file: /cvsroot/gstreamer/gstreamer/gst/gstelement.h,v
retrieving revision 1.76
diff -u -r1.76 gstelement.h
--- gst/gstelement.h	2002/01/13 22:22:42	1.76
+++ gst/gstelement.h	2002/01/22 01:48:17
@@ -190,15 +190,18 @@
 
 void			gst_element_add_pad		(GstElement *element, GstPad *pad);
 void			gst_element_remove_pad		(GstElement *element, GstPad *pad);
+
 GstPad*			gst_element_get_pad		(GstElement *element, const gchar *name);
+GstPad*			gst_element_get_static_pad	(GstElement *element, const gchar *name);
+GstPad*			gst_element_get_request_pad	(GstElement *element, const gchar *name);
+GstPad*			gst_element_get_compatible_pad	(GstElement *element, GstPadTemplate *templ);
+
 GList*			gst_element_get_pad_list	(GstElement *element);
 GList*			gst_element_get_padtemplate_list	(GstElement *element);
 GstPadTemplate*		gst_element_get_padtemplate_by_name	(GstElement *element, const guchar *name);
+
 void			gst_element_add_ghost_pad	(GstElement *element, GstPad *pad, gchar *name);
 void			gst_element_remove_ghost_pad	(GstElement *element, GstPad *pad);
-
-GstPad*			gst_element_request_compatible_pad (GstElement *element, GstPadTemplate *templ);
-GstPad*			gst_element_request_pad_by_name	(GstElement *element, const gchar *name);
 
 gboolean		gst_element_connect		(GstElement *src, const gchar *srcpadname,
 							 GstElement *dest, const gchar *destpadname);
Index: gst/gstparse.c
===================================================================
RCS file: /cvsroot/gstreamer/gstreamer/gst/gstparse.c,v
retrieving revision 1.39
diff -u -r1.39 gstparse.c
--- gst/gstparse.c	2002/01/18 22:44:19	1.39
+++ gst/gstparse.c	2002/01/22 01:48:17
@@ -203,11 +203,6 @@
 	    numsrcpads++;
 	  }
 
-	  /* try to create a pad using that padtemplate name */
-	  else if ((temppad = gst_element_request_pad_by_name (previous, tempname))) {
-	    srcpads = g_slist_append (srcpads, temppad);
-	    numsrcpads++;
-	  }
 	  if (!temppad) {
 	    GST_DEBUG (0, "NO SUCH pad %s in element %s\n", tempname, GST_ELEMENT_NAME (previous));
 	  } else {
@@ -372,11 +367,6 @@
             numsinkpads++;
           }
           
-          /* try to create a pad using that padtemplate name */
-          else if ((temppad = gst_element_request_pad_by_name (element, tempname))) {
-            sinkpads = g_slist_append (sinkpads, temppad);
-            numsinkpads++;
-          }
           if (!temppad) {
             GST_DEBUG (0, "NO SUCH pad %s in element %s\n", tempname, GST_ELEMENT_NAME (element));
           } else {
Index: tests/muxing/case1.c
===================================================================
RCS file: /cvsroot/gstreamer/gstreamer/tests/muxing/case1.c,v
retrieving revision 1.5
diff -u -r1.5 case1.c
--- tests/muxing/case1.c	2002/01/01 13:57:18	1.5
+++ tests/muxing/case1.c	2002/01/22 01:48:17
@@ -52,14 +52,10 @@
   gst_bin_add (pipeline, GST_ELEMENT (sink));
 
   gst_element_connect (src, "src", tee, "sink");
-  gst_pad_connect (gst_element_request_pad_by_name (tee, "src%d"),
-		   gst_element_get_pad (identity1, "sink"));
-  gst_pad_connect (gst_element_request_pad_by_name (tee, "src%d"),
-		   gst_element_get_pad (identity2, "sink"));
-  gst_pad_connect (gst_element_get_pad (identity1, "src"),
-  		   gst_element_request_pad_by_name (aggregator, "sink%d"));
-  gst_pad_connect (gst_element_get_pad (identity2, "src"),
-  		   gst_element_request_pad_by_name (aggregator, "sink%d"));
+  gst_element_connect (tee, "src%d", identity1, "sink");
+  gst_element_connect (tee, "src%d", identity2, "sink");
+  gst_element_connect (identity1, "src", aggregator, "sink%d");
+  gst_element_connect (identity2, "src", aggregator, "sink%d");
   gst_element_connect (aggregator, "src", sink, "sink");
 
   g_signal_connect (G_OBJECT (src), "eos",


More information about the gstreamer-devel mailing list