mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
basetrans: add an option to prefer passthrough
Basetransform attempts to do passthrough mode regardless of the order of the transform_caps method. Add a method to disable this. This is needed for elements like capsfilter that want to transform caps based on the order of the caps property.
This commit is contained in:
parent
664f7141be
commit
d5b81aba6a
2 changed files with 42 additions and 6 deletions
|
@ -255,6 +255,7 @@ struct _GstBaseTransformPrivate
|
||||||
GstPadMode pad_mode;
|
GstPadMode pad_mode;
|
||||||
|
|
||||||
gboolean gap_aware;
|
gboolean gap_aware;
|
||||||
|
gboolean prefer_passthrough;
|
||||||
|
|
||||||
/* QoS stats */
|
/* QoS stats */
|
||||||
guint64 processed;
|
guint64 processed;
|
||||||
|
@ -459,6 +460,7 @@ gst_base_transform_init (GstBaseTransform * trans,
|
||||||
priv->cache_caps2 = NULL;
|
priv->cache_caps2 = NULL;
|
||||||
priv->pad_mode = GST_PAD_MODE_NONE;
|
priv->pad_mode = GST_PAD_MODE_NONE;
|
||||||
priv->gap_aware = FALSE;
|
priv->gap_aware = FALSE;
|
||||||
|
priv->prefer_passthrough = TRUE;
|
||||||
|
|
||||||
priv->passthrough = FALSE;
|
priv->passthrough = FALSE;
|
||||||
if (bclass->transform == NULL) {
|
if (bclass->transform == NULL) {
|
||||||
|
@ -724,6 +726,7 @@ gst_base_transform_query_caps (GstBaseTransform * trans, GstPad * pad,
|
||||||
gst_caps_unref (caps);
|
gst_caps_unref (caps);
|
||||||
caps = temp;
|
caps = temp;
|
||||||
|
|
||||||
|
if (trans->priv->prefer_passthrough) {
|
||||||
/* Now try if we can put the untransformed downstream caps first */
|
/* Now try if we can put the untransformed downstream caps first */
|
||||||
temp = gst_caps_intersect_full (peercaps, caps, GST_CAPS_INTERSECT_FIRST);
|
temp = gst_caps_intersect_full (peercaps, caps, GST_CAPS_INTERSECT_FIRST);
|
||||||
if (!gst_caps_is_empty (temp)) {
|
if (!gst_caps_is_empty (temp)) {
|
||||||
|
@ -731,6 +734,7 @@ gst_base_transform_query_caps (GstBaseTransform * trans, GstPad * pad,
|
||||||
} else {
|
} else {
|
||||||
gst_caps_unref (temp);
|
gst_caps_unref (temp);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
gst_caps_unref (caps);
|
gst_caps_unref (caps);
|
||||||
/* no peer or the peer can do anything, our padtemplate is enough then */
|
/* no peer or the peer can do anything, our padtemplate is enough then */
|
||||||
|
@ -2594,6 +2598,35 @@ gst_base_transform_set_gap_aware (GstBaseTransform * trans, gboolean gap_aware)
|
||||||
GST_OBJECT_UNLOCK (trans);
|
GST_OBJECT_UNLOCK (trans);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_base_transform_set_prefer_passthrough:
|
||||||
|
* @trans: a #GstBaseTransform
|
||||||
|
* @prefer_passthrough: New state
|
||||||
|
*
|
||||||
|
* If @prefer_passthrough is %TRUE (the default), @trans will check and
|
||||||
|
* prefer passthrough caps from the list of caps returned by the
|
||||||
|
* transform_caps vmethod.
|
||||||
|
*
|
||||||
|
* If set to %FALSE, the element must order the caps returned from the
|
||||||
|
* transform_caps function in such a way that the prefered format is
|
||||||
|
* first in the list. This can be interesting for transforms that can do
|
||||||
|
* passthrough transforms but prefer to do something else, like a
|
||||||
|
* capsfilter.
|
||||||
|
*
|
||||||
|
* MT safe.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gst_base_transform_set_prefer_passthrough (GstBaseTransform * trans,
|
||||||
|
gboolean prefer_passthrough)
|
||||||
|
{
|
||||||
|
g_return_if_fail (GST_IS_BASE_TRANSFORM (trans));
|
||||||
|
|
||||||
|
GST_OBJECT_LOCK (trans);
|
||||||
|
trans->priv->prefer_passthrough = prefer_passthrough;
|
||||||
|
GST_DEBUG_OBJECT (trans, "prefer passthrough %d", prefer_passthrough);
|
||||||
|
GST_OBJECT_UNLOCK (trans);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_base_transform_reconfigure_sink:
|
* gst_base_transform_reconfigure_sink:
|
||||||
* @trans: a #GstBaseTransform
|
* @trans: a #GstBaseTransform
|
||||||
|
|
|
@ -283,6 +283,9 @@ gboolean gst_base_transform_is_qos_enabled (GstBaseTransform *trans);
|
||||||
void gst_base_transform_set_gap_aware (GstBaseTransform *trans,
|
void gst_base_transform_set_gap_aware (GstBaseTransform *trans,
|
||||||
gboolean gap_aware);
|
gboolean gap_aware);
|
||||||
|
|
||||||
|
void gst_base_transform_set_prefer_passthrough (GstBaseTransform *trans,
|
||||||
|
gboolean prefer_passthrough);
|
||||||
|
|
||||||
GstBufferPool * gst_base_transform_get_buffer_pool (GstBaseTransform *trans);
|
GstBufferPool * gst_base_transform_get_buffer_pool (GstBaseTransform *trans);
|
||||||
void gst_base_transform_get_allocator (GstBaseTransform *trans,
|
void gst_base_transform_get_allocator (GstBaseTransform *trans,
|
||||||
GstAllocator **allocator,
|
GstAllocator **allocator,
|
||||||
|
|
Loading…
Reference in a new issue