mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 11:45:25 +00:00
gst/gstpad.c: Revert a patch from 21 months ago that broke caps negotiation in pull mode. Basically, having a buffer ...
Original commit message from CVS: * gst/gstpad.c: (gst_pad_get_range), (gst_pad_pull_range): Revert a patch from 21 months ago that broke caps negotiation in pull mode. Basically, having a buffer pass over a pad will trigger the setcaps function when caps change, just like in push mode.
This commit is contained in:
parent
a739ae387d
commit
401cc7fe6a
2 changed files with 52 additions and 52 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2008-10-10 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
|
* gst/gstpad.c: (gst_pad_get_range), (gst_pad_pull_range):
|
||||||
|
Revert a patch from 21 months ago that broke caps negotiation in pull
|
||||||
|
mode. Basically, having a buffer pass over a pad will trigger the
|
||||||
|
setcaps function when caps change, just like in push mode.
|
||||||
|
|
||||||
2008-10-10 Wim Taymans <wim.taymans@collabora.co.uk>
|
2008-10-10 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
* docs/design/part-negotiation.txt:
|
* docs/design/part-negotiation.txt:
|
||||||
|
|
71
gst/gstpad.c
71
gst/gstpad.c
|
@ -4177,10 +4177,6 @@ not_connected:
|
||||||
* installed (see gst_pad_set_getrange_function()) this function returns
|
* installed (see gst_pad_set_getrange_function()) this function returns
|
||||||
* #GST_FLOW_NOT_SUPPORTED.
|
* #GST_FLOW_NOT_SUPPORTED.
|
||||||
*
|
*
|
||||||
* @buffer's caps must either be unset or the same as what is already
|
|
||||||
* configured on @pad. Renegotiation within a running pull-mode pipeline is not
|
|
||||||
* supported.
|
|
||||||
*
|
|
||||||
* This is a lowlevel function. Usualy gst_pad_pull_range() is used.
|
* This is a lowlevel function. Usualy gst_pad_pull_range() is used.
|
||||||
*
|
*
|
||||||
* Returns: a #GstFlowReturn from the pad.
|
* Returns: a #GstFlowReturn from the pad.
|
||||||
|
@ -4194,6 +4190,8 @@ gst_pad_get_range (GstPad * pad, guint64 offset, guint size,
|
||||||
GstFlowReturn ret;
|
GstFlowReturn ret;
|
||||||
GstPadGetRangeFunction getrangefunc;
|
GstPadGetRangeFunction getrangefunc;
|
||||||
gboolean emit_signal;
|
gboolean emit_signal;
|
||||||
|
GstCaps *caps;
|
||||||
|
gboolean caps_changed;
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
|
g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
|
||||||
g_return_val_if_fail (GST_PAD_IS_SRC (pad), GST_FLOW_ERROR);
|
g_return_val_if_fail (GST_PAD_IS_SRC (pad), GST_FLOW_ERROR);
|
||||||
|
@ -4226,9 +4224,8 @@ gst_pad_get_range (GstPad * pad, guint64 offset, guint size,
|
||||||
|
|
||||||
GST_PAD_STREAM_UNLOCK (pad);
|
GST_PAD_STREAM_UNLOCK (pad);
|
||||||
|
|
||||||
if (G_LIKELY (ret == GST_FLOW_OK)) {
|
if (G_UNLIKELY (ret != GST_FLOW_OK))
|
||||||
GstCaps *caps;
|
goto get_range_failed;
|
||||||
gboolean caps_changed;
|
|
||||||
|
|
||||||
GST_OBJECT_LOCK (pad);
|
GST_OBJECT_LOCK (pad);
|
||||||
/* Before pushing the buffer to the peer pad, ensure that caps
|
/* Before pushing the buffer to the peer pad, ensure that caps
|
||||||
|
@ -4237,12 +4234,12 @@ gst_pad_get_range (GstPad * pad, guint64 offset, guint size,
|
||||||
caps_changed = caps && caps != GST_PAD_CAPS (pad);
|
caps_changed = caps && caps != GST_PAD_CAPS (pad);
|
||||||
GST_OBJECT_UNLOCK (pad);
|
GST_OBJECT_UNLOCK (pad);
|
||||||
|
|
||||||
/* we got a new datatype from the pad not supported in a running pull-mode
|
if (G_UNLIKELY (caps_changed)) {
|
||||||
* pipeline */
|
GST_DEBUG_OBJECT (pad, "caps changed to %p %" GST_PTR_FORMAT, caps, caps);
|
||||||
if (G_UNLIKELY (caps_changed))
|
/* this should usually work because the element produced the buffer */
|
||||||
|
if (G_UNLIKELY (!gst_pad_configure_src (pad, caps, TRUE)))
|
||||||
goto not_negotiated;
|
goto not_negotiated;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
/* ERRORS */
|
/* ERRORS */
|
||||||
|
@ -4271,23 +4268,20 @@ dropping:
|
||||||
*buffer = NULL;
|
*buffer = NULL;
|
||||||
return GST_FLOW_UNEXPECTED;
|
return GST_FLOW_UNEXPECTED;
|
||||||
}
|
}
|
||||||
|
get_range_failed:
|
||||||
|
{
|
||||||
|
*buffer = NULL;
|
||||||
|
GST_CAT_WARNING_OBJECT (GST_CAT_SCHEDULING, pad,
|
||||||
|
"getrange failed %s", gst_flow_get_name (ret));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
not_negotiated:
|
not_negotiated:
|
||||||
{
|
{
|
||||||
/* ideally we want to use the commented-out code, but currently demuxers
|
|
||||||
* and typefind do not follow part-negotiation.txt. When switching into
|
|
||||||
* pull mode, typefind should probably return the found caps from
|
|
||||||
* getcaps(), and demuxers should do the setcaps(). */
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
gst_buffer_unref (*buffer);
|
gst_buffer_unref (*buffer);
|
||||||
*buffer = NULL;
|
*buffer = NULL;
|
||||||
GST_CAT_WARNING_OBJECT (GST_CAT_SCHEDULING, pad,
|
GST_CAT_WARNING_OBJECT (GST_CAT_SCHEDULING, pad,
|
||||||
"getrange returned buffer of different caps");
|
"getrange returned buffer of unaccaptable caps");
|
||||||
return GST_FLOW_NOT_NEGOTIATED;
|
return GST_FLOW_NOT_NEGOTIATED;
|
||||||
#endif
|
|
||||||
GST_CAT_DEBUG_OBJECT (GST_CAT_SCHEDULING, pad,
|
|
||||||
"getrange returned buffer of different caps");
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4328,6 +4322,8 @@ gst_pad_pull_range (GstPad * pad, guint64 offset, guint size,
|
||||||
GstPad *peer;
|
GstPad *peer;
|
||||||
GstFlowReturn ret;
|
GstFlowReturn ret;
|
||||||
gboolean emit_signal;
|
gboolean emit_signal;
|
||||||
|
GstCaps *caps;
|
||||||
|
gboolean caps_changed;
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
|
g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
|
||||||
g_return_val_if_fail (GST_PAD_IS_SINK (pad), GST_FLOW_ERROR);
|
g_return_val_if_fail (GST_PAD_IS_SINK (pad), GST_FLOW_ERROR);
|
||||||
|
@ -4352,16 +4348,15 @@ gst_pad_pull_range (GstPad * pad, guint64 offset, guint size,
|
||||||
|
|
||||||
gst_object_unref (peer);
|
gst_object_unref (peer);
|
||||||
|
|
||||||
|
if (G_UNLIKELY (ret != GST_FLOW_OK))
|
||||||
|
goto pull_range_failed;
|
||||||
|
|
||||||
/* can only fire the signal if we have a valid buffer */
|
/* can only fire the signal if we have a valid buffer */
|
||||||
if (G_UNLIKELY (emit_signal) && (ret == GST_FLOW_OK)) {
|
if (G_UNLIKELY (emit_signal)) {
|
||||||
if (!gst_pad_emit_have_data_signal (pad, GST_MINI_OBJECT (*buffer)))
|
if (!gst_pad_emit_have_data_signal (pad, GST_MINI_OBJECT (*buffer)))
|
||||||
goto dropping;
|
goto dropping;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (G_LIKELY (ret == GST_FLOW_OK)) {
|
|
||||||
GstCaps *caps;
|
|
||||||
gboolean caps_changed;
|
|
||||||
|
|
||||||
GST_OBJECT_LOCK (pad);
|
GST_OBJECT_LOCK (pad);
|
||||||
/* 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 */
|
||||||
|
@ -4370,10 +4365,11 @@ gst_pad_pull_range (GstPad * pad, guint64 offset, guint size,
|
||||||
GST_OBJECT_UNLOCK (pad);
|
GST_OBJECT_UNLOCK (pad);
|
||||||
|
|
||||||
/* we got a new datatype on the pad, see if it can handle it */
|
/* we got a new datatype on the pad, see if it can handle it */
|
||||||
if (G_UNLIKELY (caps_changed))
|
if (G_UNLIKELY (caps_changed)) {
|
||||||
|
GST_DEBUG_OBJECT (pad, "caps changed to %p %" GST_PTR_FORMAT, caps, caps);
|
||||||
|
if (G_UNLIKELY (!gst_pad_configure_sink (pad, caps)))
|
||||||
goto not_negotiated;
|
goto not_negotiated;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
/* ERROR recovery here */
|
/* ERROR recovery here */
|
||||||
|
@ -4384,6 +4380,13 @@ not_connected:
|
||||||
GST_OBJECT_UNLOCK (pad);
|
GST_OBJECT_UNLOCK (pad);
|
||||||
return GST_FLOW_NOT_LINKED;
|
return GST_FLOW_NOT_LINKED;
|
||||||
}
|
}
|
||||||
|
pull_range_failed:
|
||||||
|
{
|
||||||
|
*buffer = NULL;
|
||||||
|
GST_CAT_WARNING_OBJECT (GST_CAT_SCHEDULING, pad,
|
||||||
|
"pullrange failed %s", gst_flow_get_name (ret));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
dropping:
|
dropping:
|
||||||
{
|
{
|
||||||
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
|
||||||
|
@ -4394,21 +4397,11 @@ dropping:
|
||||||
}
|
}
|
||||||
not_negotiated:
|
not_negotiated:
|
||||||
{
|
{
|
||||||
/* ideally we want to use the commented-out code, but currently demuxers
|
|
||||||
* and typefind do not follow part-negotiation.txt. When switching into
|
|
||||||
* pull mode, typefind should probably return the found caps from
|
|
||||||
* getcaps(), and demuxers should do the setcaps(). */
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
gst_buffer_unref (*buffer);
|
gst_buffer_unref (*buffer);
|
||||||
*buffer = NULL;
|
*buffer = NULL;
|
||||||
GST_CAT_WARNING_OBJECT (GST_CAT_SCHEDULING, pad,
|
GST_CAT_WARNING_OBJECT (GST_CAT_SCHEDULING, pad,
|
||||||
"pullrange returned buffer of different caps");
|
"pullrange returned buffer of different caps");
|
||||||
return GST_FLOW_NOT_NEGOTIATED;
|
return GST_FLOW_NOT_NEGOTIATED;
|
||||||
#endif
|
|
||||||
GST_CAT_DEBUG_OBJECT (GST_CAT_SCHEDULING, pad,
|
|
||||||
"pullrange returned buffer of different caps");
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue