feeble attempts to handle dynamic connections

Original commit message from CVS:
feeble attempts to handle dynamic connections
This commit is contained in:
Andy Wingo 2002-04-12 20:06:14 +00:00
parent 49324d840c
commit 9ec888681f
3 changed files with 104 additions and 82 deletions

View file

@ -704,7 +704,7 @@ gst_element_get_pad_template (GstElement *element, const guchar *name)
}
/**
* gst_element_get_pad_template_by_compatible:
* gst_element_get_compatible_pad_template:
* @element: element to get padtemplate of
* @templ: a template to find a compatible template for
*
@ -713,8 +713,8 @@ gst_element_get_pad_template (GstElement *element, const guchar *name)
*
* Returns: the padtemplate. No unreferencing is necessary.
*/
static GstPadTemplate*
gst_element_get_pad_template_by_compatible (GstElement *element, GstPadTemplate *compattempl)
GstPadTemplate*
gst_element_get_compatible_pad_template (GstElement *element, GstPadTemplate *compattempl)
{
GstPadTemplate *newtempl = NULL;
GList *padlist;
@ -784,7 +784,7 @@ gst_element_request_compatible_pad (GstElement *element, GstPadTemplate *templ)
g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
g_return_val_if_fail (templ != NULL, NULL);
templ_new = gst_element_get_pad_template_by_compatible (element, templ);
templ_new = gst_element_get_compatible_pad_template (element, templ);
if (templ_new != NULL)
pad = gst_element_request_pad (element, templ_new, NULL);

View file

@ -205,14 +205,17 @@ GstPad* gst_element_get_static_pad (GstElement *element, const gchar *name);
GstPad* gst_element_get_request_pad (GstElement *element, const gchar *name);
GList* gst_element_get_pad_list (GstElement *element);
GList* gst_element_get_pad_template_list (GstElement *element);
GstPadTemplate* gst_element_get_pad_template (GstElement *element, const guchar *name);
GstPad* gst_element_get_compatible_pad (GstElement *element, GstPad *pad);
GstPad* gst_element_get_compatible_pad_filtered (GstElement *element, GstPad *pad,
GstCaps *filtercaps);
/* unimplemented
GstPad* gst_element_get_compatible_request_pad (GstElement *element, GstPadTemplate *templ);
GstPad* gst_element_get_compatible_static_pad (GstElement *element, GstPadTemplate *templ);
*/
GstPadTemplate* gst_element_get_pad_template (GstElement *element, const guchar *name);
GList* gst_element_get_pad_template_list (GstElement *element);
GstPadTemplate* gst_element_get_compatible_pad_template (GstElement *element, GstPadTemplate *compattempl);
gboolean gst_element_connect (GstElement *src, GstElement *dest);
gboolean gst_element_connect_many (GstElement *element_1, GstElement *element_2, ...);

View file

@ -198,9 +198,10 @@ make_connections (graph_t *g, GError **error)
{
GList *l, *a, *b;
connection_t *c;
dynamic_connection_t *dc;
GstElement *src, *sink;
GstPad *p1, *p2;
GstPadTemplate *pt1;
GstPadTemplate *pt1, *pt2;
l = g->connections;
while (l) {
@ -240,9 +241,12 @@ make_connections (graph_t *g, GError **error)
p1 = gst_element_get_pad (src, (gchar*)a->data);
p2 = gst_element_get_pad (sink, (gchar*)b->data);
if (!p2)
goto could_not_get_pad_b;
if (!p1 && p2 && (pt1 = gst_element_get_pad_template (src, (gchar*)a->data)) &&
pt1->presence == GST_PAD_SOMETIMES) {
dynamic_connection_t *dc = g_new0 (dynamic_connection_t, 1);
dc = g_new0 (dynamic_connection_t, 1);
dc->srcpadname = (gchar*)a->data;
dc->target = p2;
dc->pipeline = g->bin;
@ -252,14 +256,10 @@ 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);
} else if (!p1 || !p2 || !gst_pad_connect (p1, p2)) {
g_set_error (error,
GST_PARSE_ERROR,
GST_PARSE_ERROR_CONNECT,
"Could not connect %s:%s to %s:%s",
GST_OBJECT_NAME (src), (gchar*)a->data,
GST_OBJECT_NAME (sink), (gchar*)b->data);
return FALSE;
} else if (!p1) {
goto could_not_get_pad_a;
} else if (!gst_pad_connect (p1, p2)) {
goto could_not_connect_pads;
}
a = g_list_next (a);
b = g_list_next (b);
@ -268,9 +268,10 @@ make_connections (graph_t *g, GError **error)
if ((pt1 = gst_element_get_pad_template (src, (gchar*)a->data))) {
if ((p1 = gst_element_get_pad (src, (gchar*)a->data)) || pt1->presence == GST_PAD_SOMETIMES) {
if (!p1) {
/*
if ((p2 = gst_element_get_pad (sink, (gchar*)a->data))) {
dynamic_connection_t *dc = g_new0 (dynamic_connection_t, 1);
/* sigh, a hack until i fix the gstelement api... */
if ((pt2 = gst_element_get_compatible_pad_template (sink, pt1))) {
if ((p2 = gst_element_get_pad (sink, pt2->name_template))) {
dc = g_new0 (dynamic_connection_t, 1);
dc->srcpadname = (gchar*)a->data;
dc->target = p2;
dc->pipeline = g->bin;
@ -280,76 +281,42 @@ 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);
*/
} else {
/* both pt1 and pt2 are sometimes templates. sheesh. */
goto both_templates_have_sometimes_presence;
}
} else {
g_set_error (error,
GST_PARSE_ERROR,
GST_PARSE_ERROR_CONNECT,
"Could not get a pad %s from element %s",
(gchar*)a->data, GST_OBJECT_NAME (src));
return FALSE;
goto could_not_get_compatible_to_a;
}
} else {
g_set_error (error,
GST_PARSE_ERROR,
GST_PARSE_ERROR_CONNECT,
"Could not get a pad %s from element %s",
(gchar*)a->data, GST_OBJECT_NAME (src));
return FALSE;
if (!(p2 = gst_element_get_compatible_pad (sink, p1))) {
goto could_not_get_compatible_to_a;
}
}
} else {
goto could_not_get_pad_a;
}
} else {
goto could_not_get_pad_a;
}
if (!(p2 = gst_element_get_compatible_pad (sink, p1))) {
g_set_error (error,
GST_PARSE_ERROR,
GST_PARSE_ERROR_CONNECT,
"Could not find a compatible pad in element %s to for %s:%s",
GST_OBJECT_NAME (sink), GST_OBJECT_NAME (src), (gchar*)a->data);
return FALSE;
}
if (!gst_pad_connect (p1, p2)) {
g_set_error (error,
GST_PARSE_ERROR,
GST_PARSE_ERROR_CONNECT,
"Could not connect %s:%s to %s:%s",
GST_OBJECT_NAME (src), GST_OBJECT_NAME (p1),
GST_OBJECT_NAME (sink), GST_OBJECT_NAME (p1));
return FALSE;
goto could_not_connect_pads;
}
} else if (b) {
/* we don't support dynamic connections on this side yet, if ever */
if (!(p2 = gst_element_get_pad (sink, (gchar*)b->data))) {
g_set_error (error,
GST_PARSE_ERROR,
GST_PARSE_ERROR_CONNECT,
"Could not get a pad %s from element %s",
(gchar*)b->data, GST_OBJECT_NAME (sink));
return FALSE;
goto could_not_get_pad_b;
}
if (!(p1 = gst_element_get_compatible_pad (src, p2))) {
g_set_error (error,
GST_PARSE_ERROR,
GST_PARSE_ERROR_CONNECT,
"Could not find a compatible pad in element %s to for %s:%s",
GST_OBJECT_NAME (src), GST_OBJECT_NAME (sink), (gchar*)b->data);
return FALSE;
goto could_not_get_compatible_to_b;
}
if (!gst_pad_connect (p1, p2)) {
g_set_error (error,
GST_PARSE_ERROR,
GST_PARSE_ERROR_CONNECT,
"Could not connect %s:%s to %s:%s",
GST_OBJECT_NAME (src), GST_OBJECT_NAME (p1),
GST_OBJECT_NAME (sink), GST_OBJECT_NAME (p1));
return FALSE;
goto could_not_connect_pads;
}
} else {
if (!gst_element_connect (src, sink)) {
g_set_error (error,
GST_PARSE_ERROR,
GST_PARSE_ERROR_CONNECT,
"Could not connect %s to %s",
GST_OBJECT_NAME (src), GST_OBJECT_NAME (sink));
return FALSE;
goto could_not_connect_elements;
}
}
l = g_list_next (l);
@ -363,6 +330,58 @@ make_connections (graph_t *g, GError **error)
}
return TRUE;
could_not_get_pad_a:
g_set_error (error,
GST_PARSE_ERROR,
GST_PARSE_ERROR_CONNECT,
"Could not get a pad %s from element %s",
(gchar*)a->data, GST_OBJECT_NAME (src));
return FALSE;
could_not_get_pad_b:
g_set_error (error,
GST_PARSE_ERROR,
GST_PARSE_ERROR_CONNECT,
"Could not get a pad %s from element %s",
(gchar*)b->data, GST_OBJECT_NAME (sink));
return FALSE;
could_not_get_compatible_to_a:
g_set_error (error,
GST_PARSE_ERROR,
GST_PARSE_ERROR_CONNECT,
"Could not find a compatible pad in element %s to for %s:%s",
GST_OBJECT_NAME (sink), GST_OBJECT_NAME (src), (gchar*)a->data);
return FALSE;
could_not_get_compatible_to_b:
g_set_error (error,
GST_PARSE_ERROR,
GST_PARSE_ERROR_CONNECT,
"Could not find a compatible pad in element %s to for %s:%s",
GST_OBJECT_NAME (src), GST_OBJECT_NAME (sink), (gchar*)b->data);
return FALSE;
both_templates_have_sometimes_presence:
g_set_error (error,
GST_PARSE_ERROR,
GST_PARSE_ERROR_CONNECT,
"Both %s:%s and %s:%s have GST_PAD_SOMETIMES presence, operation not supported",
GST_OBJECT_NAME (src), pt1->name_template, GST_OBJECT_NAME (sink), pt2->name_template);
return FALSE;
could_not_connect_pads:
g_set_error (error,
GST_PARSE_ERROR,
GST_PARSE_ERROR_CONNECT,
"Could not connect %s:%s to %s:%s",
GST_DEBUG_PAD_NAME (p1),
GST_DEBUG_PAD_NAME (p2));
return FALSE;
could_not_connect_elements:
g_set_error (error,
GST_PARSE_ERROR,
GST_PARSE_ERROR_CONNECT,
"Could not connect element %s to %s",
GST_OBJECT_NAME (src),
GST_OBJECT_NAME (sink));
return FALSE;
}
static GstBin*