[gst-devel] patch integrating request pads in gst_element_connect

Leif Morgan Johnson lmjohns3 at eos.ncsu.edu
Sun Jan 13 18:10:02 CET 2002


Hi folks -

I've just finished hacking a little patch (against the CVS gstreamer
source as of 2002/01/14 02:02:18) that includes support for request pads
in the normal gst_element_connect function. gst_element_connect now calls
gst_element_request_pad_by_name itself if it can't find the pad
directly. As a result, gst_element_request_pad_by_name is now a static
function, and I went ahead and changed all the references I could find in
the source tree (using grep -r request_pad_by_name *) to use (e.g.)

gst_element_connect(elema, "src%d", elemb, "sink")

instead of

pad = gst_element_request_pad_by_name(elema, "src%d")
gst_pad_connect(pad, gst_element_get_pad(elemb, "sink")

I hope this is agreeable. Wingo and I think it makes the API a little
cleaner. Also included in this patch are two very minor typo fixes that
might have been pretty important : changing "src" to "dest" in the
gst_element_connect and gst_element_disconnect functions ... cheers !

leif

-- 
! Leif Morgan Johnson
!
! North Carolina State University
! computer science / math / cognitive science
! ACM undergraduate research officer
! IAESTE reception officer
!
! lmjohns3 at eos.ncsu.edu
! http://ambient.2y.net/leif/
-------------- next part --------------
? acinclude.m4
? compile
? depcomp
? gst-getting-pads.patch
? gstelement.patch
? install-sh
? mkinstalldirs
? reg.xml
? stamp-h1
? tests/lat
? tests/bufspeed/test1
? tests/bufspeed/test2
? tests/memchunk/gmemchunktest
? tests/memchunk/gstmemchunktest
? tests/sched/dynamic-pipeline
? tools/gst-complete
? tools/gst-compprep
? tools/gst-inspect
? tools/gst-launch
? tools/gst-register
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/14 02:02:18
@@ -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.103
diff -u -r1.103 gstelement.c
--- gst/gstelement.c	2002/01/13 22:22:42	1.103
+++ gst/gstelement.c	2002/01/14 02:02:19
@@ -63,6 +63,8 @@
 static GstElementStateReturn	gst_element_change_state	(GstElement *element);
 static void 			gst_element_send_event_func 	(GstElement *element, GstEvent *event);
 
+static GstPad*			gst_element_request_pad_by_name	(GstElement *element, const gchar *name);
+
 #ifndef GST_DISABLE_LOADSAVE
 static xmlNodePtr		gst_element_save_thyself	(GstObject *object, xmlNodePtr parent);
 static void			gst_element_restore_thyself 	(GstObject *parent, xmlNodePtr self);
@@ -440,8 +442,9 @@
     walk = g_list_next (walk);
   }
 
+  /* if we can't find it, look it up by name. */
   GST_INFO(GST_CAT_ELEMENT_PADS,"no such pad '%s' in element \"%s\"",name,GST_ELEMENT_NAME(element));
-  return NULL;
+  return gst_element_request_pad_by_name(element, name);
 }
 
 /**
@@ -650,7 +653,7 @@
  *
  * Returns: the new pad that was created.
  */
-GstPad*
+static GstPad*
 gst_element_request_pad_by_name (GstElement *element, const gchar *name)
 {
   GstPadTemplate *templ = NULL;
@@ -726,7 +729,7 @@
     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;
   }
@@ -785,7 +788,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/14 02:02:20
@@ -198,7 +198,6 @@
 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.37
diff -u -r1.37 gstparse.c
--- gst/gstparse.c	2002/01/04 19:47:16	1.37
+++ gst/gstparse.c	2002/01/14 02:02:20
@@ -211,11 +211,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));
 	  }
@@ -378,11 +373,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));
 	  }
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/14 02:02:22
@@ -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