basetransform: improve propose_allocation

Always call the propose_allocation method and provide a default implementation
that passes the query on in passthrough mode so that subclasses can also call
this. Also pass if the transform is in passthrough mode so that the
implementation can adjust its algorithm.
This commit is contained in:
Wim Taymans 2012-02-22 15:26:05 +01:00
parent 90a82c7e81
commit f3ca3f89f7
2 changed files with 33 additions and 12 deletions

View file

@ -330,6 +330,8 @@ static gboolean gst_base_transform_acceptcaps_default (GstBaseTransform * trans,
GstPadDirection direction, GstCaps * caps); GstPadDirection direction, GstCaps * caps);
static gboolean gst_base_transform_setcaps (GstBaseTransform * trans, static gboolean gst_base_transform_setcaps (GstBaseTransform * trans,
GstPad * pad, GstCaps * caps); GstPad * pad, GstCaps * caps);
static gboolean gst_base_transform_default_propose_allocation (GstBaseTransform
* trans, gboolean passthrough, GstQuery * query);
static gboolean gst_base_transform_query (GstPad * pad, GstObject * parent, static gboolean gst_base_transform_query (GstPad * pad, GstObject * parent,
GstQuery * query); GstQuery * query);
static gboolean gst_base_transform_default_query (GstBaseTransform * trans, static gboolean gst_base_transform_default_query (GstBaseTransform * trans,
@ -392,6 +394,8 @@ gst_base_transform_class_init (GstBaseTransformClass * klass)
klass->accept_caps = klass->accept_caps =
GST_DEBUG_FUNCPTR (gst_base_transform_acceptcaps_default); GST_DEBUG_FUNCPTR (gst_base_transform_acceptcaps_default);
klass->query = GST_DEBUG_FUNCPTR (gst_base_transform_default_query); klass->query = GST_DEBUG_FUNCPTR (gst_base_transform_default_query);
klass->propose_allocation =
GST_DEBUG_FUNCPTR (gst_base_transform_default_propose_allocation);
klass->transform_size = klass->transform_size =
GST_DEBUG_FUNCPTR (gst_base_transform_default_transform_size); GST_DEBUG_FUNCPTR (gst_base_transform_default_transform_size);
@ -807,7 +811,7 @@ gst_base_transform_do_bufferpool (GstBaseTransform * trans, GstCaps * outcaps)
* 2) we need to do a transform, we need to get a bufferpool from downstream * 2) we need to do a transform, we need to get a bufferpool from downstream
* and configure it. When upstream does the ALLOCATION query, the * and configure it. When upstream does the ALLOCATION query, the
* propose_allocation vmethod will be called and we will configure the * propose_allocation vmethod will be called and we will configure the
* upstream allocator with our porposed values then. * upstream allocator with our proposed values then.
*/ */
/* clear old pool */ /* clear old pool */
@ -1303,6 +1307,21 @@ failed_configure:
} }
} }
static gboolean
gst_base_transform_default_propose_allocation (GstBaseTransform * trans,
gboolean passthrough, GstQuery * query)
{
gboolean ret;
if (passthrough) {
GST_DEBUG_OBJECT (trans, "doing passthrough query");
ret = gst_pad_peer_query (trans->srcpad, query);
} else {
ret = FALSE;
}
return ret;
}
static gboolean static gboolean
gst_base_transform_default_query (GstBaseTransform * trans, gst_base_transform_default_query (GstBaseTransform * trans,
GstPadDirection direction, GstQuery * query) GstPadDirection direction, GstQuery * query)
@ -1334,16 +1353,15 @@ gst_base_transform_default_query (GstBaseTransform * trans,
passthrough = trans->passthrough; passthrough = trans->passthrough;
GST_BASE_TRANSFORM_UNLOCK (trans); GST_BASE_TRANSFORM_UNLOCK (trans);
GST_DEBUG_OBJECT (trans, "propose allocation values"); GST_DEBUG_OBJECT (trans, "propose %spassthrough allocation values",
(passthrough ? "" : "non-"));
/* pass the query to the propose_allocation vmethod if any */ /* pass the query to the propose_allocation vmethod if any */
if (G_LIKELY (klass->propose_allocation)) { if (G_LIKELY (klass->propose_allocation))
ret = klass->propose_allocation (trans, query); ret = klass->propose_allocation (trans, passthrough, query);
} else if (passthrough) { else
GST_DEBUG_OBJECT (trans, "doing passthrough query");
ret = gst_pad_peer_query (otherpad, query);
} else {
ret = FALSE; ret = FALSE;
}
GST_DEBUG_OBJECT (trans, "ALLOCATION ret %d, %" GST_PTR_FORMAT, ret, GST_DEBUG_OBJECT (trans, "ALLOCATION ret %d, %" GST_PTR_FORMAT, ret,
query); query);
break; break;

View file

@ -162,7 +162,9 @@ struct _GstBaseTransform {
* query * query
* @propose_allocation: Propose buffer allocation parameters for upstream elements. * @propose_allocation: Propose buffer allocation parameters for upstream elements.
* This function must be implemented if the element reads or * This function must be implemented if the element reads or
* writes the buffer content. The default implementation is NULL. * writes the buffer content. In passthrough mode, the
* default implementation will forward the ALLOCATION query
* downstream.
* @decide_allocation: Setup the allocation parameters for allocating output * @decide_allocation: Setup the allocation parameters for allocating output
* buffers. The passed in query contains the result of the * buffers. The passed in query contains the result of the
* downstream allocation query. This function is only called * downstream allocation query. This function is only called
@ -237,9 +239,10 @@ struct _GstBaseTransformClass {
GstQuery *query); GstQuery *query);
/* propose allocation query parameters for input buffers */ /* propose allocation query parameters for input buffers */
gboolean (*propose_allocation) (GstBaseTransform *trans, GstQuery *query); gboolean (*propose_allocation) (GstBaseTransform *trans, gboolean passthrough,
GstQuery *query);
/* decide allocation query for output buffers */ /* decide allocation query for output buffers */
gboolean (*decide_allocation) (GstBaseTransform *trans, GstQuery *query); gboolean (*decide_allocation) (GstBaseTransform *trans, GstQuery *query);
/* transform size */ /* transform size */
gboolean (*transform_size) (GstBaseTransform *trans, gboolean (*transform_size) (GstBaseTransform *trans,