basetransform fix for upstream caps-renegotiation
authorRob Clark <rob@ti.com>
Sat, 22 May 2010 21:33:11 +0000 (16:33 -0500)
committerWim Taymans <wim.taymans@collabora.co.uk>
Tue, 27 Jul 2010 15:34:49 +0000 (17:34 +0200)
commit29289ee79e1b49b6dcbb314bee8c760395e5c8e9
tree15c3b8d72751061259cb08cb429ddcc1242f54c0
parent6f0da67002e3ba53aa830e56b219dbeec654f699
basetransform fix for upstream caps-renegotiation

If initially pass-through caps are negotiated between a transform element's
sink and src pads, but then the downstream element returns different caps
on a buffer from pad_alloc(), basetransform gets stuck with proxy_alloc=TRUE
even though the upstream peer doesn't accept the caps, causing
gst_pad_peer_accept_caps() to be called on each buffer in _buffer_alloc():

    if (!gst_caps_is_equal (newcaps, caps)) {
      GST_DEBUG_OBJECT (trans, "caps are new");
      /* we have new caps, see if we can proxy downstream */
>>    if (gst_pad_peer_accept_caps (pad, newcaps)) {
        /* peer accepts the caps, return a buffer in this format */
        GST_DEBUG_OBJECT (trans, "peer accepted new caps");

which is taking ~40ms/frame.

This patch does two things.  (1) if the buffer returned from pad_alloc() has
new caps, trigger the decision whether to proxy the buffer-alloc to be
revisited, and (2) disable proxy if peer does not accept new caps.  (The first
part may not be strictly needed, but seemed like a good idea.)

Note that this issue would not arise except in case of downstream elements
who have on their template-caps, some that would be suitable for pass-through,
but at runtime pick more restrictive caps (for ex, after querying a driver for
what formats it actually supports).
libs/gst/base/gstbasetransform.c