wtay's fix

Original commit message from CVS:
wtay's fix
This commit is contained in:
Thomas Vander Stichele 2002-04-14 12:09:49 +00:00
parent f0720a83a1
commit 3150ffce7e

View file

@ -37,7 +37,8 @@ struct _gst_parse_delayed_pad
typedef struct
{
gchar *srcpadname;
GstPad *target;
GstPad *target_pad;
GstElement *target_element;
GstElement *pipeline;
}
dynamic_connection_t;
@ -56,12 +57,32 @@ G_GNUC_UNUSED static void
dynamic_connect (GstElement * element, GstPad * newpad, gpointer data)
{
dynamic_connection_t *dc = (dynamic_connection_t *) data;
gboolean warn = TRUE;
if (!strcmp (gst_pad_get_name (newpad), dc->srcpadname)) {
/* do we know the exact srcpadname? */
if (dc->srcpadname) {
/* see if this is the one */
if (strcmp (gst_pad_get_name (newpad), dc->srcpadname)) {
return;
}
}
/* try to find a target pad if we don't know it yet */
if (!dc->target_pad) {
if (!GST_PAD_IS_CONNECTED (newpad)) {
dc->target_pad = gst_element_get_compatible_pad (dc->target_element, newpad);
warn = FALSE;
}
else {
return;
}
}
if (!GST_PAD_IS_CONNECTED (dc->target_pad)) {
gst_element_set_state (dc->pipeline, GST_STATE_PAUSED);
if (!gst_pad_connect (newpad, dc->target))
if (!gst_pad_connect (newpad, dc->target_pad) && warn) {
g_warning ("could not connect %s:%s to %s:%s", GST_DEBUG_PAD_NAME (newpad),
GST_DEBUG_PAD_NAME (dc->target));
GST_DEBUG_PAD_NAME (dc->target_pad));
}
gst_element_set_state (dc->pipeline, GST_STATE_PLAYING);
}
}
@ -249,7 +270,8 @@ make_connections (graph_t *g, GError **error)
pt1->presence == GST_PAD_SOMETIMES) {
dc = g_new0 (dynamic_connection_t, 1);
dc->srcpadname = (gchar*)a->data;
dc->target = p2;
dc->target_pad = p2;
dc->target_element = sink;
dc->pipeline = g->bin;
GST_DEBUG (GST_CAT_PIPELINE, "setting up dynamic connection %s:%s and %s:%s",
@ -277,7 +299,8 @@ make_connections (graph_t *g, GError **error)
// g_print ("got the pad\n");
dc = g_new0 (dynamic_connection_t, 1);
dc->srcpadname = (gchar*)a->data;
dc->target = p2;
dc->target_pad = p2;
dc->target_element = NULL;
dc->pipeline = g->bin;
GST_DEBUG (GST_CAT_PIPELINE, "setting up dynamic connection %s:%s and %s:%s",
@ -285,17 +308,29 @@ make_connections (graph_t *g, GError **error)
(gchar*)a->data, GST_DEBUG_PAD_NAME (p2));
g_signal_connect (G_OBJECT (src), "new_pad", G_CALLBACK (dynamic_connect), dc);
goto next;
} else {
/* both pt1 and pt2 are sometimes templates. sheesh. */
goto both_templates_have_sometimes_presence;
}
} else {
goto could_not_get_compatible_to_a;
/* if the target pad has no padtemplate we will figure out a target
* pad later on */
dc = g_new0 (dynamic_connection_t, 1);
dc->srcpadname = NULL;
dc->target_pad = NULL;
dc->target_element = sink;
dc->pipeline = g->bin;
GST_DEBUG (GST_CAT_PIPELINE, "setting up dynamic connection %s:%s, and some pad in %s",
GST_OBJECT_NAME (GST_OBJECT (src)),
(gchar*)a->data, GST_OBJECT_NAME (sink));
g_signal_connect (G_OBJECT (src), "new_pad", G_CALLBACK (dynamic_connect), dc);
goto next;
}
} else {
if (!(p2 = gst_element_get_compatible_pad (sink, p1))) {
goto could_not_get_compatible_to_a;
}
goto could_not_get_compatible_to_a;
}
} else {
goto could_not_get_pad_a;
@ -323,6 +358,7 @@ make_connections (graph_t *g, GError **error)
goto could_not_connect_elements;
}
}
next:
l = g_list_next (l);
}