summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@collabora.co.uk>2010-01-28 17:12:34 +0100
committerWim Taymans <wim.taymans@collabora.co.uk>2010-01-28 17:43:47 +0100
commitb44a5c8dc769b951a0d02cc55225652fdfc23402 (patch)
tree496b7bdfa583f05b245a925d8d13bc6ff3e9fd28
parent70511545b214559903caddfb002b5f9339d4b71c (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.c19
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);