mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
pad: Set caps on pad before checking if the pad is linked
This allows the setcaps handler and notify::caps to link the pad downstream and doesn't require hacks to always provide a peer to the pad, like in decodebin2.
This commit is contained in:
parent
7be3899653
commit
b090a376d4
1 changed files with 10 additions and 8 deletions
18
gst/gstpad.c
18
gst/gstpad.c
|
@ -4479,27 +4479,30 @@ gst_pad_push_data (GstPad * pad, gboolean is_buffer, void *data,
|
||||||
GST_OBJECT_LOCK (pad);
|
GST_OBJECT_LOCK (pad);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (G_UNLIKELY ((peer = GST_PAD_PEER (pad)) == NULL))
|
|
||||||
goto not_linked;
|
|
||||||
|
|
||||||
/* Before pushing the buffer to the peer pad, ensure that caps
|
/* Before pushing the buffer to the peer pad, ensure that caps
|
||||||
* are set on this pad */
|
* are set on this pad */
|
||||||
caps = gst_pad_data_get_caps (is_buffer, data);
|
caps = gst_pad_data_get_caps (is_buffer, data);
|
||||||
caps_changed = caps && caps != GST_PAD_CAPS (pad);
|
caps_changed = caps && caps != GST_PAD_CAPS (pad);
|
||||||
|
|
||||||
/* take ref to peer pad before releasing the lock */
|
|
||||||
gst_object_ref (peer);
|
|
||||||
GST_OBJECT_UNLOCK (pad);
|
|
||||||
|
|
||||||
/* we got a new datatype from the pad, it had better handle it */
|
/* we got a new datatype from the pad, it had better handle it */
|
||||||
if (G_UNLIKELY (caps_changed)) {
|
if (G_UNLIKELY (caps_changed)) {
|
||||||
|
/* unlock before setting */
|
||||||
|
GST_OBJECT_UNLOCK (pad);
|
||||||
GST_DEBUG_OBJECT (pad,
|
GST_DEBUG_OBJECT (pad,
|
||||||
"caps changed from %" GST_PTR_FORMAT " to %p %" GST_PTR_FORMAT,
|
"caps changed from %" GST_PTR_FORMAT " to %p %" GST_PTR_FORMAT,
|
||||||
GST_PAD_CAPS (pad), caps, caps);
|
GST_PAD_CAPS (pad), caps, caps);
|
||||||
if (G_UNLIKELY (!gst_pad_set_caps (pad, caps)))
|
if (G_UNLIKELY (!gst_pad_set_caps (pad, caps)))
|
||||||
goto not_negotiated;
|
goto not_negotiated;
|
||||||
|
GST_OBJECT_LOCK (pad);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (G_UNLIKELY ((peer = GST_PAD_PEER (pad)) == NULL))
|
||||||
|
goto not_linked;
|
||||||
|
|
||||||
|
/* take ref to peer pad before releasing the lock */
|
||||||
|
gst_object_ref (peer);
|
||||||
|
GST_OBJECT_UNLOCK (pad);
|
||||||
|
|
||||||
ret = gst_pad_chain_data_unchecked (peer, is_buffer, data, cache);
|
ret = gst_pad_chain_data_unchecked (peer, is_buffer, data, cache);
|
||||||
|
|
||||||
gst_object_unref (peer);
|
gst_object_unref (peer);
|
||||||
|
@ -4564,7 +4567,6 @@ not_linked:
|
||||||
not_negotiated:
|
not_negotiated:
|
||||||
{
|
{
|
||||||
gst_pad_data_unref (is_buffer, data);
|
gst_pad_data_unref (is_buffer, data);
|
||||||
gst_object_unref (peer);
|
|
||||||
GST_CAT_DEBUG_OBJECT (GST_CAT_SCHEDULING, pad,
|
GST_CAT_DEBUG_OBJECT (GST_CAT_SCHEDULING, pad,
|
||||||
"element pushed data then refused to accept the caps");
|
"element pushed data then refused to accept the caps");
|
||||||
return GST_FLOW_NOT_NEGOTIATED;
|
return GST_FLOW_NOT_NEGOTIATED;
|
||||||
|
|
Loading…
Reference in a new issue