summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2016-03-12 19:45:26 +0200
committerSebastian Dröge <sebastian@centricular.com>2016-03-14 12:45:29 +0200
commit001c7f04a06e261cebd191a541c1f23d13e01022 (patch)
tree9ec74b398b3559a2d67d2b1ce65ef63447669307
parent0a434e9c6c14250caab497cbab541116d9b942d0 (diff)
downloadgstreamer-plugins-base-001c7f04a06e261cebd191a541c1f23d13e01022.tar.gz
decodebin: Don't hold EXPOSE_LOCK in type_found() outside the stream lock
In other places we lock it the other way around, leading to possible deadlocks. Also this will deadlock if analyze_pad() causes a new element to be autoplugged that adds new pads on itself when its state is changed. https://bugzilla.gnome.org/show_bug.cgi?id=763491
-rw-r--r--gst/playback/gstdecodebin2.c7
1 files changed, 2 insertions, 5 deletions
diff --git a/gst/playback/gstdecodebin2.c b/gst/playback/gstdecodebin2.c
index 1dfe6a31f..a3bc61947 100644
--- a/gst/playback/gstdecodebin2.c
+++ b/gst/playback/gstdecodebin2.c
@@ -2841,7 +2841,6 @@ type_found (GstElement * typefind, guint probability,
goto exit;
}
- EXPOSE_LOCK (decode_bin);
pad = gst_element_get_static_pad (typefind, "src");
sink_pad = gst_element_get_static_pad (typefind, "sink");
@@ -2862,17 +2861,15 @@ type_found (GstElement * typefind, guint probability,
if (analyze_new_pad (decode_bin, typefind, pad, caps,
decode_bin->decode_chain, NULL))
expose_pad (decode_bin, typefind, decode_bin->decode_chain->current_pad,
- pad, caps, decode_bin->decode_chain, FALSE);
+ pad, caps, decode_bin->decode_chain, TRUE);
+
gst_decode_chain_unref (chain);
}
GST_PAD_STREAM_UNLOCK (sink_pad);
-
gst_object_unref (sink_pad);
gst_object_unref (pad);
- EXPOSE_UNLOCK (decode_bin);
-
exit:
return;
}