From: Wim Taymans Date: Thu, 6 May 2010 14:41:09 +0000 (+0200) Subject: Revert "pad: don't check twice for changed caps per push" X-Git-Tag: RELEASE-0.10.30~182 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=60499306a6cd0c56a723ec14007103d732014a15;p=platform%2Fupstream%2Fgstreamer.git Revert "pad: don't check twice for changed caps per push" We need to check the pad caps on the srcpad as well as on the sinkpad. Revert this commit as it removes the check on the srcpad and can leave the srcpad unnegotiated (or negotiated with wrong caps) This reverts commit 07dc1e5b49580a89bfef27ff27476d51fb3ce2c2. --- diff --git a/gst/gstpad.c b/gst/gstpad.c index 3d1c520330..00dca74af8 100644 --- a/gst/gstpad.c +++ b/gst/gstpad.c @@ -4307,6 +4307,8 @@ gst_pad_push_data (GstPad * pad, gboolean is_buffer, void *data) { GstPad *peer; GstFlowReturn ret; + GstCaps *caps; + gboolean caps_changed; GST_OBJECT_LOCK (pad); @@ -4337,11 +4339,25 @@ gst_pad_push_data (GstPad * pad, gboolean is_buffer, void *data) if (G_UNLIKELY ((peer = GST_PAD_PEER (pad)) == NULL)) goto not_linked; + /* Before pushing the buffer to the peer pad, ensure that caps + * are set on this pad */ + caps = gst_pad_data_get_caps (is_buffer, data); + 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 */ + if (G_UNLIKELY (caps_changed)) { + GST_DEBUG_OBJECT (pad, + "caps changed from %" GST_PTR_FORMAT " to %p %" GST_PTR_FORMAT, + GST_PAD_CAPS (pad), caps, caps); + if (G_UNLIKELY (!gst_pad_set_caps (pad, caps))) + goto not_negotiated; + } + ret = gst_pad_chain_data_unchecked (peer, is_buffer, data); gst_object_unref (peer); @@ -4403,6 +4419,14 @@ not_linked: GST_OBJECT_UNLOCK (pad); return GST_FLOW_NOT_LINKED; } +not_negotiated: + { + gst_pad_data_unref (is_buffer, data); + gst_object_unref (peer); + GST_CAT_DEBUG_OBJECT (GST_CAT_SCHEDULING, pad, + "element pushed data then refused to accept the caps"); + return GST_FLOW_NOT_NEGOTIATED; + } } /**