gst/gstelement.c: Fix to allow DELAYED to indicate that linking was successful.

Original commit message from CVS:
* gst/gstelement.c: (gst_element_link_pads_filtered),
(gst_element_negotiate_pads): Fix to allow DELAYED to indicate
that linking was successful.
* gst/gstpad.c: (gst_pad_link_free),
(gst_pad_link_call_link_functions), (gst_pad_link_negotiate),
(gst_pad_link_try), (gst_pad_link_unnegotiate),
(gst_pad_unnegotiate), (gst_pad_set_explicit_caps): Pass
GstPadLinkReturn correctly between functions, and don't fail
when DELAYED is used (DELAYED is very important).  Better
cleanup on unlinking and unnegotiation.  Should fix some spider
bugs.
This commit is contained in:
David Schleef 2004-01-03 09:25:04 +00:00
parent f69c95d94c
commit d4142ec0a0
3 changed files with 54 additions and 23 deletions

View file

@ -1,3 +1,17 @@
2004-01-03 David Schleef <ds@schleef.org>
* gst/gstelement.c: (gst_element_link_pads_filtered),
(gst_element_negotiate_pads): Fix to allow DELAYED to indicate
that linking was successful.
* gst/gstpad.c: (gst_pad_link_free),
(gst_pad_link_call_link_functions), (gst_pad_link_negotiate),
(gst_pad_link_try), (gst_pad_link_unnegotiate),
(gst_pad_unnegotiate), (gst_pad_set_explicit_caps): Pass
GstPadLinkReturn correctly between functions, and don't fail
when DELAYED is used (DELAYED is very important). Better
cleanup on unlinking and unnegotiation. Should fix some spider
bugs.
2004-01-02 David Schleef <ds@schleef.org> 2004-01-02 David Schleef <ds@schleef.org>
* gst/gstelement.c: (gst_element_class_init), * gst/gstelement.c: (gst_element_class_init),

View file

@ -2500,7 +2500,7 @@ gst_element_negotiate_pads (GstElement *element)
"perform negotiate for %s:%s and %s:%s", "perform negotiate for %s:%s and %s:%s",
GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (srcpad),
GST_DEBUG_PAD_NAME (sinkpad)); GST_DEBUG_PAD_NAME (sinkpad));
if (!gst_pad_renegotiate (pad)) if (gst_pad_renegotiate (pad) == GST_PAD_LINK_REFUSED)
return FALSE; return FALSE;
} }
else { else {

View file

@ -993,6 +993,11 @@ gst_pad_link_free (GstPadLink *link)
if (link->sinkcaps) gst_caps_free (link->sinkcaps); if (link->sinkcaps) gst_caps_free (link->sinkcaps);
if (link->filtercaps) gst_caps_free (link->filtercaps); if (link->filtercaps) gst_caps_free (link->filtercaps);
if (link->caps) gst_caps_free (link->caps); if (link->caps) gst_caps_free (link->caps);
GST_RPAD_LINK (link->srcpad) = NULL;
GST_RPAD_LINK (link->sinkpad) = NULL;
#ifdef USE_POISONING
memset(link,0xff, sizeof(*link));
#endif
g_free (link); g_free (link);
} }
@ -1091,7 +1096,7 @@ gst_pad_link_fixate (GstPadLink *link)
link->caps = caps; link->caps = caps;
} }
static gboolean static GstPadLinkReturn
gst_pad_link_call_link_functions (GstPadLink *link) gst_pad_link_call_link_functions (GstPadLink *link)
{ {
gboolean negotiating; gboolean negotiating;
@ -1119,7 +1124,7 @@ gst_pad_link_call_link_functions (GstPadLink *link)
if (GST_PAD_LINK_FAILED (res)) { if (GST_PAD_LINK_FAILED (res)) {
GST_CAT_INFO (GST_CAT_CAPS, "pad %s:%s doesn't accept caps", GST_CAT_INFO (GST_CAT_CAPS, "pad %s:%s doesn't accept caps",
GST_DEBUG_PAD_NAME (link->srcpad)); GST_DEBUG_PAD_NAME (link->srcpad));
return FALSE; return res;
} }
} }
@ -1145,11 +1150,11 @@ gst_pad_link_call_link_functions (GstPadLink *link)
if (GST_PAD_LINK_FAILED (res)) { if (GST_PAD_LINK_FAILED (res)) {
GST_CAT_INFO (GST_CAT_CAPS, "pad %s:%s doesn't accept caps", GST_CAT_INFO (GST_CAT_CAPS, "pad %s:%s doesn't accept caps",
GST_DEBUG_PAD_NAME (link->sinkpad)); GST_DEBUG_PAD_NAME (link->sinkpad));
return FALSE; return res;
} }
} }
return TRUE; return GST_PAD_LINK_OK;
} }
static GstPadLinkReturn static GstPadLinkReturn
@ -1170,11 +1175,7 @@ gst_pad_link_negotiate (GstPadLink *link)
if (gst_caps_is_empty (link->caps)) if (gst_caps_is_empty (link->caps))
return GST_PAD_LINK_REFUSED; return GST_PAD_LINK_REFUSED;
if (!gst_pad_link_call_link_functions (link)) { return gst_pad_link_call_link_functions (link);
return GST_PAD_LINK_REFUSED;
}
return GST_PAD_LINK_OK;
} }
/** /**
@ -1204,17 +1205,20 @@ gst_pad_link_try (GstPadLink *link)
g_assert (oldlink == GST_RPAD_LINK (sinkpad)); g_assert (oldlink == GST_RPAD_LINK (sinkpad));
ret = gst_pad_link_negotiate (link); ret = gst_pad_link_negotiate (link);
if (ret == GST_PAD_LINK_REFUSED) { if (GST_PAD_LINK_FAILED (ret) && oldlink && oldlink->caps) {
if (oldlink && oldlink->caps) {
oldlink->srcnotify = link->srcnotify; oldlink->srcnotify = link->srcnotify;
oldlink->sinknotify = link->sinknotify; oldlink->sinknotify = link->sinknotify;
if (!gst_pad_link_call_link_functions (oldlink)) { if (GST_PAD_LINK_FAILED (gst_pad_link_call_link_functions (oldlink))) {
g_warning ("pads don't accept old caps. We assume they did though"); g_warning ("pads don't accept old caps. We assume they did though");
} }
} }
if (ret == GST_PAD_LINK_REFUSED) {
gst_pad_link_free (link); gst_pad_link_free (link);
return ret; return ret;
} }
if (ret == GST_PAD_LINK_DELAYED) {
gst_caps_replace (&link->caps, NULL);
}
GST_RPAD_PEER (srcpad) = GST_REAL_PAD(link->sinkpad); GST_RPAD_PEER (srcpad) = GST_REAL_PAD(link->sinkpad);
GST_RPAD_PEER (sinkpad) = GST_REAL_PAD(link->srcpad); GST_RPAD_PEER (sinkpad) = GST_REAL_PAD(link->srcpad);
@ -1222,8 +1226,10 @@ gst_pad_link_try (GstPadLink *link)
gst_pad_link_free (oldlink); gst_pad_link_free (oldlink);
GST_RPAD_LINK (srcpad) = link; GST_RPAD_LINK (srcpad) = link;
GST_RPAD_LINK (sinkpad) = link; GST_RPAD_LINK (sinkpad) = link;
if (ret == GST_PAD_LINK_OK) {
g_object_notify (G_OBJECT (srcpad), "caps"); g_object_notify (G_OBJECT (srcpad), "caps");
g_object_notify (G_OBJECT (sinkpad), "caps"); g_object_notify (G_OBJECT (sinkpad), "caps");
}
return ret; return ret;
} }
@ -1849,6 +1855,8 @@ gst_pad_perform_negotiate (GstPad *srcpad, GstPad *sinkpad)
void void
gst_pad_link_unnegotiate (GstPadLink *link) gst_pad_link_unnegotiate (GstPadLink *link)
{ {
g_return_if_fail (link != NULL);
if (link->caps) { if (link->caps) {
gst_caps_free (link->caps); gst_caps_free (link->caps);
link->caps = NULL; link->caps = NULL;
@ -1875,10 +1883,13 @@ gst_pad_link_unnegotiate (GstPadLink *link)
void void
gst_pad_unnegotiate (GstPad *pad) gst_pad_unnegotiate (GstPad *pad)
{ {
GstPadLink *link;
g_return_if_fail (GST_IS_PAD (pad)); g_return_if_fail (GST_IS_PAD (pad));
if (GST_RPAD_LINK (pad)) link = GST_RPAD_LINK (GST_PAD_REALIZE (pad));
gst_pad_link_unnegotiate (GST_RPAD_LINK (pad)); if (link)
gst_pad_link_unnegotiate (link);
} }
/** /**
@ -2132,7 +2143,13 @@ gst_pad_set_explicit_caps (GstPad *pad, GstCaps *caps)
gst_caps_replace (&GST_RPAD_EXPLICIT_CAPS (pad), caps); gst_caps_replace (&GST_RPAD_EXPLICIT_CAPS (pad), caps);
if (caps == NULL || !GST_PAD_IS_LINKED (pad)) { if (caps == NULL) {
GST_CAT_DEBUG (GST_CAT_PADS, "caps is NULL");
return TRUE;
}
if (!GST_PAD_IS_LINKED (pad)) {
GST_CAT_DEBUG (GST_CAT_PADS, "pad is not linked");
return TRUE; return TRUE;
} }
link_ret = gst_pad_try_set_caps (pad, caps); link_ret = gst_pad_try_set_caps (pad, caps);