diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2016-03-12 19:45:26 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2016-03-14 12:45:29 +0200 |
commit | 001c7f04a06e261cebd191a541c1f23d13e01022 (patch) | |
tree | 9ec74b398b3559a2d67d2b1ce65ef63447669307 | |
parent | 0a434e9c6c14250caab497cbab541116d9b942d0 (diff) | |
download | gstreamer-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.c | 7 |
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; } |