Add new API: gst_parse_bin_from_description() and gst_bin_find_unconnected_pad() (#329069).

Original commit message from CVS:
* docs/gst/gstreamer-sections.txt:
* gst/gstutils.c: (element_find_unconnected_pad),
(gst_bin_find_unconnected_pad), (gst_parse_bin_from_description):
* gst/gstutils.h:
Add new API: gst_parse_bin_from_description() and
gst_bin_find_unconnected_pad() (#329069).
This commit is contained in:
Tim-Philipp Müller 2006-02-02 09:51:18 +00:00
parent 7e3ec58b4d
commit cefc46ad7e
5 changed files with 197 additions and 3 deletions

View file

@ -1,3 +1,12 @@
2006-02-02 Tim-Philipp Müller <tim at centricular dot net>
* docs/gst/gstreamer-sections.txt:
* gst/gstutils.c: (element_find_unconnected_pad),
(gst_bin_find_unconnected_pad), (gst_parse_bin_from_description):
* gst/gstutils.h:
Add new API: gst_parse_bin_from_description() and
gst_bin_find_unconnected_pad() (#329069).
2006-02-01 Stefan Kost <ensonic@users.sf.net>
* docs/manual/README:

2
common

@ -1 +1 @@
Subproject commit 0b93085188e83fe678ec5ded2823cd7c24dfa843
Subproject commit 1140eabed84dd1d8d6df7df88f5c8bdf20a8faa1

View file

@ -52,6 +52,7 @@ gst_bin_iterate_all_by_interface
<SUBSECTION>
gst_bin_add_many
gst_bin_remove_many
gst_bin_find_unconnected_pad
<SUBSECTION>
GstBinFlags
@ -1383,6 +1384,7 @@ GST_PARSE_ERROR
GstParseError
gst_parse_launch
gst_parse_launchv
gst_parse_bin_from_description
<SUBSECTION Standard>
GST_TYPE_PARSE_ERROR
<SUBSECTION Private>

View file

@ -1,6 +1,7 @@
/* GStreamer
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
* 2000 Wim Taymans <wtay@chello.be>
* 2002 Thomas Vander Stichele <thomas@apestaart.org>
*
* gstutils.c: Utility functions: gtk_get_property stuff, etc.
*
@ -34,6 +35,7 @@
#include "gstghostpad.h"
#include "gstutils.h"
#include "gstinfo.h"
#include "gstparse.h"
#include "gst-i18n-lib.h"
@ -2850,3 +2852,177 @@ gst_element_found_tags (GstElement * element, GstTagList * list)
gst_element_post_message (element,
gst_message_new_tag (GST_OBJECT (element), list));
}
static GstPad *
element_find_unconnected_pad (GstElement * element, GstPadDirection direction)
{
GstIterator *iter;
GstPad *unconnected_pad = NULL;
gboolean done;
switch (direction) {
case GST_PAD_SRC:
iter = gst_element_iterate_src_pads (element);
break;
case GST_PAD_SINK:
iter = gst_element_iterate_sink_pads (element);
break;
default:
g_assert_not_reached ();
}
done = FALSE;
while (!done) {
gpointer pad;
switch (gst_iterator_next (iter, &pad)) {
case GST_ITERATOR_OK:{
GstPad *peer;
GST_CAT_LOG (GST_CAT_ELEMENT_PADS, "examining pad %s:%s",
GST_DEBUG_PAD_NAME (pad));
peer = gst_pad_get_peer (GST_PAD (pad));
if (peer == NULL) {
unconnected_pad = pad;
done = TRUE;
GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
"found existing unlinked pad %s:%s",
GST_DEBUG_PAD_NAME (unconnected_pad));
} else {
gst_object_unref (pad);
gst_object_unref (peer);
}
break;
}
case GST_ITERATOR_DONE:
done = TRUE;
break;
case GST_ITERATOR_RESYNC:
gst_iterator_resync (iter);
break;
case GST_ITERATOR_ERROR:
g_return_val_if_reached (NULL);
break;
}
}
gst_iterator_free (iter);
return unconnected_pad;
}
/**
* gst_bin_find_unconnected_pad:
* @bin: bin in which to look for elements with unconnected pads
* @direction: whether to look for an unconnected source or sink pad
*
* Recursively looks for elements with an unconnected pad of the given
* direction within the specified bin and returns an unconnected pad
* if one is found, or NULL otherwise. If a pad is found, the caller
* owns a reference to it and should use gst_object_unref() on the
* pad when it is not needed any longer.
*
* Returns: unconnected pad of the given direction, or NULL.
*
* Since: 0.10.3
*/
GstPad *
gst_bin_find_unconnected_pad (GstBin * bin, GstPadDirection direction)
{
GstIterator *iter;
gboolean done;
GstPad *pad = NULL;
g_return_val_if_fail (GST_IS_BIN (bin), NULL);
g_return_val_if_fail (direction != GST_PAD_UNKNOWN, NULL);
done = FALSE;
iter = gst_bin_iterate_recurse (bin);
while (!done) {
gpointer element;
switch (gst_iterator_next (iter, &element)) {
case GST_ITERATOR_OK:
pad = element_find_unconnected_pad (GST_ELEMENT (element), direction);
gst_object_unref (element);
if (pad != NULL)
done = TRUE;
break;
case GST_ITERATOR_DONE:
done = TRUE;
break;
case GST_ITERATOR_RESYNC:
gst_iterator_resync (iter);
break;
case GST_ITERATOR_ERROR:
g_return_val_if_reached (NULL);
break;
}
}
gst_iterator_free (iter);
return pad;
}
/**
* gst_parse_bin_from_description:
* @bin_description: command line describing the bin
* @ghost_unconnected_pads: whether to automatically create ghost pads
* for unconnected source or sink pads within
* the bin
* @err: where to store the error message in case of an error, or NULL
*
* This is a convenience wrapper around gst_parse_launch() to create a
* #GstBin from a gst-launch-style pipeline description. See
* gst_parse_launch() and the gst-launch man page for details about the
* syntax. Ghost pads on the bin for unconnected source or sink pads
* within the bin can automatically be created (but only a maximum of
* one ghost pad for each direction will be created; if you expect
* multiple unconnected source pads or multiple unconnected sink pads
* and want them all ghosted, you will have to create the ghost pads
* yourself).
*
* Returns: a newly-created bin, or NULL if an error occurred.
*
* Since: 0.10.3
*/
GstElement *
gst_parse_bin_from_description (const gchar * bin_description,
gboolean ghost_unconnected_pads, GError ** err)
{
GstPad *pad = NULL;
GstBin *bin;
gchar *desc;
g_return_val_if_fail (bin_description != NULL, NULL);
g_return_val_if_fail (err == NULL || *err == NULL, NULL);
GST_DEBUG ("Making bin from description '%s'", bin_description);
/* parse the pipeline to a bin */
desc = g_strdup_printf ("bin.( %s )", bin_description);
bin = (GstBin *) gst_parse_launch (desc, err);
g_free (desc);
if (bin == NULL || (err && *err != NULL)) {
if (bin)
gst_object_unref (bin);
return NULL;
}
/* find pads and ghost them if necessary */
if (ghost_unconnected_pads) {
if ((pad = gst_bin_find_unconnected_pad (bin, GST_PAD_SRC))) {
gst_element_add_pad (GST_ELEMENT (bin), gst_ghost_pad_new ("src", pad));
gst_object_unref (pad);
}
if ((pad = gst_bin_find_unconnected_pad (bin, GST_PAD_SINK))) {
gst_element_add_pad (GST_ELEMENT (bin), gst_ghost_pad_new ("sink", pad));
gst_object_unref (pad);
}
}
return GST_ELEMENT (bin);
}

View file

@ -1,6 +1,7 @@
/* GStreamer
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
* 2000 Wim Taymans <wtay@chello.be>
* 2002 Thomas Vander Stichele <thomas@apestaart.org>
*
* gstutils.h: Header for various utility functions
*
@ -565,8 +566,9 @@ gboolean gst_pad_query_convert (GstPad *pad, GstFormat
GstFormat *dest_format, gint64 *dest_val);
/* bin functions */
void gst_bin_add_many (GstBin *bin, GstElement *element_1, ...) G_GNUC_NULL_TERMINATED;
void gst_bin_remove_many (GstBin *bin, GstElement *element_1, ...) G_GNUC_NULL_TERMINATED;
void gst_bin_add_many (GstBin *bin, GstElement *element_1, ...) G_GNUC_NULL_TERMINATED;
void gst_bin_remove_many (GstBin *bin, GstElement *element_1, ...) G_GNUC_NULL_TERMINATED;
GstPad * gst_bin_find_unconnected_pad (GstBin *bin, GstPadDirection direction);
/* buffer functions */
GstBuffer * gst_buffer_merge (GstBuffer * buf1, GstBuffer * buf2);
@ -597,6 +599,11 @@ void gst_element_found_tags_for_pad (GstElement * element,
void gst_element_found_tags (GstElement * element,
GstTagList * list);
/* parse utility functions */
GstElement * gst_parse_bin_from_description (const gchar * bin_description,
gboolean ghost_unconnected_pads,
GError ** err);
G_END_DECLS
#endif /* __GST_UTILS_H__ */