From 9cb62f69e3386e0e6a4be6f4108ddbdeee1e6079 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Wed, 13 Jul 2005 16:26:07 +0000 Subject: [PATCH] gst/base/gstbasesrc.c (gst_base_src_start): Post an error if the source couldn't negotiate. Original commit message from CVS: 2005-07-13 Andy Wingo * gst/base/gstbasesrc.c (gst_base_src_start): Post an error if the source couldn't negotiate. --- ChangeLog | 12 ++++++++ docs/gst/tmpl/gstminiobject.sgml | 3 ++ gst/base/gstbasesrc.c | 3 ++ gst/gstutils.c | 64 +++++++++++++++++++++++++++++++++++++++- gst/gstutils.h | 4 +++ gst/parse/grammar.y | 9 +++--- libs/gst/base/gstbasesrc.c | 3 ++ 7 files changed, 93 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 154f987..c513de3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2005-07-13 Andy Wingo + + * gst/base/gstbasesrc.c (gst_base_src_start): Post an error if the + source couldn't negotiate. + + * gst/parse/grammar.y: Revert 1.54->1.55, so we now do filtered + connections again. + + * gst/gstutils.h: + * gst/gstutils.c (gst_element_link_pads_filtered): New old + function. I am channeling Hades. Put your boots on suckers!!! + 2005-07-13 Thomas Vander Stichele * testsuite/caps/Makefile.am: diff --git a/docs/gst/tmpl/gstminiobject.sgml b/docs/gst/tmpl/gstminiobject.sgml index 5481e39..ff0a8f1 100644 --- a/docs/gst/tmpl/gstminiobject.sgml +++ b/docs/gst/tmpl/gstminiobject.sgml @@ -14,6 +14,9 @@ GstMiniObject + + + diff --git a/gst/base/gstbasesrc.c b/gst/base/gstbasesrc.c index 197a4dd..cb05690 100644 --- a/gst/base/gstbasesrc.c +++ b/gst/base/gstbasesrc.c @@ -883,6 +883,9 @@ could_not_start: could_not_negotiate: { GST_DEBUG_OBJECT (basesrc, "could not negotiate, stopping"); + GST_ELEMENT_ERROR (basesrc, STREAM, FORMAT, + ("Could not connect source to pipeline"), + ("Check your filtered caps, if any")); gst_base_src_stop (basesrc); return FALSE; } diff --git a/gst/gstutils.c b/gst/gstutils.c index 2657da0..15023f5 100644 --- a/gst/gstutils.c +++ b/gst/gstutils.c @@ -1229,6 +1229,68 @@ gst_element_link_pads (GstElement * src, const gchar * srcpadname, } /** + * gst_element_link_pads_filtered: + * @src: a #GstElement containing the source pad. + * @srcpadname: the name of the #GstPad in source element or NULL for any pad. + * @dest: the #GstElement containing the destination pad. + * @destpadname: the name of the #GstPad in destination element or NULL for any pad. + * @caps: the #GstCaps to filter the link, or #NULL for no filter. + * + * Links the two named pads of the source and destination elements. Side effect + * is that if one of the pads has no parent, it becomes a child of the parent of + * the other element. If they have different parents, the link fails. If @caps + * is not #NULL, makes sure that the caps of the link is a subset of @caps. + * + * Returns: TRUE if the pads could be linked, FALSE otherwise. + */ +gboolean +gst_element_link_pads_filtered (GstElement * src, const gchar * srcpadname, + GstElement * dest, const gchar * destpadname, GstCaps * filter) +{ + /* checks */ + g_return_val_if_fail (GST_IS_ELEMENT (src), FALSE); + g_return_val_if_fail (GST_IS_ELEMENT (dest), FALSE); + g_return_val_if_fail (filter == NULL || GST_IS_CAPS (filter), FALSE); + + if (filter) { + GstElement *capsfilter; + GstObject *parent; + + capsfilter = gst_element_factory_make ("capsfilter", NULL); + if (!capsfilter) { + GST_ERROR ("Could not make a capsfilter"); + return FALSE; + } + + parent = gst_object_get_parent (GST_OBJECT (src)); + g_return_val_if_fail (GST_IS_BIN (parent), FALSE); + + if (!gst_bin_add (GST_BIN (parent), capsfilter)) { + GST_ERROR ("Could not add capsfilter"); + gst_object_unref (capsfilter); + gst_object_unref (parent); + return FALSE; + } + + gst_object_unref (parent); + + g_object_set (capsfilter, "filter-caps", filter, NULL); + + if (gst_element_link_pads (src, srcpadname, capsfilter, "sink") + && gst_element_link_pads (capsfilter, "src", dest, destpadname)) { + return TRUE; + } else { + GST_INFO ("Could not link elements"); + gst_bin_remove (GST_BIN (GST_OBJECT_PARENT (capsfilter)), capsfilter); + /* will unref and unlink as appropriate */ + return FALSE; + } + } else { + return gst_element_link_pads (src, srcpadname, dest, destpadname); + } +} + +/** * gst_element_link: * @src: a #GstElement containing the source pad. * @dest: the #GstElement containing the destination pad. @@ -1243,7 +1305,7 @@ gst_element_link_pads (GstElement * src, const gchar * srcpadname, gboolean gst_element_link (GstElement * src, GstElement * dest) { - return gst_element_link_pads (src, NULL, dest, NULL); + return gst_element_link_pads_filtered (src, NULL, dest, NULL, NULL); } /** diff --git a/gst/gstutils.h b/gst/gstutils.h index 05c01e6..a5f78a3 100644 --- a/gst/gstutils.h +++ b/gst/gstutils.h @@ -252,6 +252,10 @@ gboolean gst_element_link_pads (GstElement *src, const gchar *srcpadn void gst_element_unlink_pads (GstElement *src, const gchar *srcpadname, GstElement *dest, const gchar *destpadname); +gboolean gst_element_link_pads_filtered (GstElement * src, const gchar * srcpadname, + GstElement * dest, const gchar * destpadname, + GstCaps *filter); + /* util elementfactory functions */ gboolean gst_element_factory_can_src_caps(GstElementFactory *factory, const GstCaps *caps); gboolean gst_element_factory_can_sink_caps(GstElementFactory *factory, const GstCaps *caps); diff --git a/gst/parse/grammar.y b/gst/parse/grammar.y index dea8fae..7561fa1 100644 --- a/gst/parse/grammar.y +++ b/gst/parse/grammar.y @@ -377,7 +377,7 @@ gst_parse_found_pad (GstElement *src, GstPad *pad, gpointer data) GST_ELEMENT_NAME (src), link->src_pad, GST_ELEMENT_NAME (link->sink), link->sink_pad); - if (gst_element_link_pads (src, link->src_pad, link->sink, link->sink_pad)) { + if (gst_element_link_pads_filtered (src, link->src_pad, link->sink, link->sink_pad, link->caps)) { /* do this here, we don't want to get any problems later on when unlocking states */ GST_CAT_DEBUG (GST_CAT_PIPELINE, "delayed linking %s:%s to %s:%s worked", GST_ELEMENT_NAME (src), link->src_pad, @@ -447,8 +447,9 @@ gst_parse_perform_link (link_t *link, graph_t *graph) link->caps); if (!srcs || !sinks) { - if (gst_element_link_pads (src, srcs ? (const gchar *) srcs->data : NULL, - sink, sinks ? (const gchar *) sinks->data : NULL)) { + if (gst_element_link_pads_filtered (src, srcs ? (const gchar *) srcs->data : NULL, + sink, sinks ? (const gchar *) sinks->data : NULL, + link->caps)) { gst_parse_element_lock (sink, gst_element_is_locked_state (src)); goto success; } else { @@ -470,7 +471,7 @@ gst_parse_perform_link (link_t *link, graph_t *graph) const gchar *sink_pad = (const gchar *) sinks->data; srcs = g_slist_next (srcs); sinks = g_slist_next (sinks); - if (gst_element_link_pads (src, src_pad, sink, sink_pad)) { + if (gst_element_link_pads_filtered (src, src_pad, sink, sink_pad, link->caps)) { gst_parse_element_lock (sink, gst_element_is_locked_state (src)); continue; } else { diff --git a/libs/gst/base/gstbasesrc.c b/libs/gst/base/gstbasesrc.c index 197a4dd..cb05690 100644 --- a/libs/gst/base/gstbasesrc.c +++ b/libs/gst/base/gstbasesrc.c @@ -883,6 +883,9 @@ could_not_start: could_not_negotiate: { GST_DEBUG_OBJECT (basesrc, "could not negotiate, stopping"); + GST_ELEMENT_ERROR (basesrc, STREAM, FORMAT, + ("Could not connect source to pipeline"), + ("Check your filtered caps, if any")); gst_base_src_stop (basesrc); return FALSE; } -- 2.7.4