[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