diff options
author | Wim Taymans <wim.taymans@collabora.co.uk> | 2010-01-28 17:12:34 +0100 |
---|---|---|
committer | Wim Taymans <wim.taymans@collabora.co.uk> | 2010-01-28 17:43:47 +0100 |
commit | b44a5c8dc769b951a0d02cc55225652fdfc23402 (patch) | |
tree | 496b7bdfa583f05b245a925d8d13bc6ff3e9fd28 | |
parent | 70511545b214559903caddfb002b5f9339d4b71c (diff) |
adder: don't hold object lock when calling peer elements
Do not hold the object lock while we call methods on peer elements as this can
lead to deadlocks.
Fixes #608179
-rw-r--r-- | gst/adder/gstadder.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/gst/adder/gstadder.c b/gst/adder/gstadder.c index 4dc9fd42..8d0b300f 100644 --- a/gst/adder/gstadder.c +++ b/gst/adder/gstadder.c @@ -232,11 +232,16 @@ static GstCaps * gst_adder_sink_getcaps (GstPad * pad) { GstAdder *adder; - GstCaps *result, *peercaps, *sinkcaps; + GstCaps *result, *peercaps, *sinkcaps, *filter_caps; adder = GST_ADDER (GST_PAD_PARENT (pad)); GST_OBJECT_LOCK (adder); + /* take filter */ + if ((filter_caps = adder->filter_caps)) + gst_caps_ref (filter_caps); + GST_OBJECT_UNLOCK (adder); + /* get the downstream possible caps */ peercaps = gst_pad_peer_get_caps (adder->srcpad); @@ -245,9 +250,9 @@ gst_adder_sink_getcaps (GstPad * pad) sinkcaps = gst_pad_get_fixed_caps_func (pad); if (peercaps) { /* restrict with filter-caps if any */ - if (adder->filter_caps) { + if (filter_caps) { GST_DEBUG_OBJECT (adder, "filtering peer caps"); - result = gst_caps_intersect (peercaps, adder->filter_caps); + result = gst_caps_intersect (peercaps, filter_caps); gst_caps_unref (peercaps); peercaps = result; } @@ -260,16 +265,18 @@ gst_adder_sink_getcaps (GstPad * pad) /* the peer has no caps (or there is no peer), just use the allowed caps * of this sinkpad. */ /* restrict with filter-caps if any */ - if (adder->filter_caps) { + if (filter_caps) { GST_DEBUG_OBJECT (adder, "no peer caps, using filtered sinkcaps"); - result = gst_caps_intersect (sinkcaps, adder->filter_caps); + result = gst_caps_intersect (sinkcaps, filter_caps); gst_caps_unref (sinkcaps); } else { GST_DEBUG_OBJECT (adder, "no peer caps, using sinkcaps"); result = sinkcaps; } } - GST_OBJECT_UNLOCK (adder); + + if (filter_caps) + gst_caps_unref (filter_caps); GST_LOG_OBJECT (adder, "getting caps on pad %p,%s to %" GST_PTR_FORMAT, pad, GST_PAD_NAME (pad), result); |