mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-09-29 23:32:33 +00:00
gst/gstutils.c: Handle RESYNC correctly in _proxy_getcaps.
Original commit message from CVS: * gst/gstutils.c: (gst_pad_proxy_getcaps): Handle RESYNC correctly in _proxy_getcaps.
This commit is contained in:
parent
ef9253d99c
commit
ca915c1969
3 changed files with 38 additions and 10 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2006-08-23 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
|
* gst/gstutils.c: (gst_pad_proxy_getcaps):
|
||||||
|
Handle RESYNC correctly in _proxy_getcaps.
|
||||||
|
|
||||||
2006-08-21 Tim-Philipp Müller <tim at centricular dot net>
|
2006-08-21 Tim-Philipp Müller <tim at centricular dot net>
|
||||||
|
|
||||||
* gst/gstxml.c: (gst_xml_dispose), (gst_xml_parse_file),
|
* gst/gstxml.c: (gst_xml_dispose), (gst_xml_parse_file),
|
||||||
|
|
2
common
2
common
|
@ -1 +1 @@
|
||||||
Subproject commit e9ea99f6e89d7e1af3a0a859bfeb0ed6ecf2e3a9
|
Subproject commit d287125f93da692bc25d53b0b7b0e2f90424a212
|
|
@ -2432,18 +2432,40 @@ gst_pad_proxy_getcaps (GstPad * pad)
|
||||||
if (element == NULL)
|
if (element == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
iter = gst_element_iterate_pads (element);
|
/* value to hold the return, by default it holds ANY, the ref is taken by
|
||||||
|
* the GValue. */
|
||||||
g_value_init (&ret, G_TYPE_POINTER);
|
g_value_init (&ret, G_TYPE_POINTER);
|
||||||
g_value_set_pointer (&ret, gst_caps_new_any ());
|
g_value_set_pointer (&ret, gst_caps_new_any ());
|
||||||
|
|
||||||
res = gst_iterator_fold (iter, (GstIteratorFoldFunction) intersect_caps_func,
|
iter = gst_element_iterate_pads (element);
|
||||||
|
while (1) {
|
||||||
|
res =
|
||||||
|
gst_iterator_fold (iter, (GstIteratorFoldFunction) intersect_caps_func,
|
||||||
&ret, pad);
|
&ret, pad);
|
||||||
|
switch (res) {
|
||||||
|
case GST_ITERATOR_RESYNC:
|
||||||
|
/* unref any value stored */
|
||||||
|
if ((caps = g_value_get_pointer (&ret)))
|
||||||
|
gst_caps_unref (caps);
|
||||||
|
/* need to reset the result again to ANY */
|
||||||
|
g_value_set_pointer (&ret, gst_caps_new_any ());
|
||||||
|
gst_iterator_resync (iter);
|
||||||
|
break;
|
||||||
|
case GST_ITERATOR_DONE:
|
||||||
|
/* all pads iterated, return collected value */
|
||||||
|
goto done;
|
||||||
|
default:
|
||||||
|
/* iterator returned _ERROR or premature end with _OK,
|
||||||
|
* mark an error and exit */
|
||||||
|
if ((caps = g_value_get_pointer (&ret)))
|
||||||
|
gst_caps_unref (caps);
|
||||||
|
g_value_set_pointer (&ret, NULL);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
done:
|
||||||
gst_iterator_free (iter);
|
gst_iterator_free (iter);
|
||||||
|
|
||||||
if (res != GST_ITERATOR_DONE)
|
|
||||||
goto pads_changed;
|
|
||||||
|
|
||||||
gst_object_unref (element);
|
gst_object_unref (element);
|
||||||
|
|
||||||
caps = g_value_get_pointer (&ret);
|
caps = g_value_get_pointer (&ret);
|
||||||
|
@ -2455,10 +2477,11 @@ gst_pad_proxy_getcaps (GstPad * pad)
|
||||||
return intersected;
|
return intersected;
|
||||||
|
|
||||||
/* ERRORS */
|
/* ERRORS */
|
||||||
pads_changed:
|
error:
|
||||||
{
|
{
|
||||||
g_warning ("Pad list changed during capsnego for element %s",
|
g_warning ("Pad list returned error on element %s",
|
||||||
GST_ELEMENT_NAME (element));
|
GST_ELEMENT_NAME (element));
|
||||||
|
gst_iterator_free (iter);
|
||||||
gst_object_unref (element);
|
gst_object_unref (element);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue