diff options
author | Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> | 2015-08-20 17:29:36 +0100 |
---|---|---|
committer | Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> | 2015-12-01 17:36:31 +0000 |
commit | ee44337fc3e3030a5155d28b3561af157e6c6003 (patch) | |
tree | 188e646ba0f9adde97b1380d6c2d91dd5f5d8ef4 /gst/playback | |
parent | 2a70c86e85a8ba07726212c8eece10fd92c88693 (diff) | |
download | gstreamer-plugins-base-ee44337fc3e3030a5155d28b3561af157e6c6003.tar.gz |
decodebin: lock the expose lock around decode_chain use
Helps with a crash in decodebin when quickly switching states.
https://bugzilla.gnome.org/show_bug.cgi?id=752651
Diffstat (limited to 'gst/playback')
-rw-r--r-- | gst/playback/gstdecodebin2.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/gst/playback/gstdecodebin2.c b/gst/playback/gstdecodebin2.c index 99acb7796..dfe2ef3bb 100644 --- a/gst/playback/gstdecodebin2.c +++ b/gst/playback/gstdecodebin2.c @@ -1430,7 +1430,8 @@ static gboolean connect_pad (GstDecodeBin * dbin, GstElement * src, static GList *connect_element (GstDecodeBin * dbin, GstDecodeElement * delem, GstDecodeChain * chain); static void expose_pad (GstDecodeBin * dbin, GstElement * src, - GstDecodePad * dpad, GstPad * pad, GstCaps * caps, GstDecodeChain * chain); + GstDecodePad * dpad, GstPad * pad, GstCaps * caps, GstDecodeChain * chain, + gboolean lock); static void pad_added_cb (GstElement * element, GstPad * pad, GstDecodeChain * chain); @@ -2208,7 +2209,7 @@ connect_pad (GstDecodeBin * dbin, GstElement * src, GstDecodePad * dpad, case GST_AUTOPLUG_SELECT_EXPOSE: GST_DEBUG_OBJECT (dbin, "autoplug select requested expose"); /* expose the pad, we don't have the source element */ - expose_pad (dbin, src, dpad, pad, caps, chain); + expose_pad (dbin, src, dpad, pad, caps, chain, TRUE); res = TRUE; goto beach; case GST_AUTOPLUG_SELECT_SKIP: @@ -2563,7 +2564,7 @@ connect_pad (GstDecodeBin * dbin, GstElement * src, GstDecodePad * dpad, GstCaps *ocaps; ocaps = get_pad_caps (opad); - expose_pad (dbin, delem->element, dpad, opad, ocaps, chain); + expose_pad (dbin, delem->element, dpad, opad, ocaps, chain, TRUE); if (ocaps) gst_caps_unref (ocaps); @@ -2705,7 +2706,7 @@ connect_element (GstDecodeBin * dbin, GstDecodeElement * delem, */ static void expose_pad (GstDecodeBin * dbin, GstElement * src, GstDecodePad * dpad, - GstPad * pad, GstCaps * caps, GstDecodeChain * chain) + GstPad * pad, GstCaps * caps, GstDecodeChain * chain, gboolean lock) { GstPad *mqpad = NULL; @@ -2732,13 +2733,15 @@ expose_pad (GstDecodeBin * dbin, GstElement * src, GstDecodePad * dpad, chain->endpad = gst_object_ref (dpad); chain->endcaps = gst_caps_ref (caps); - EXPOSE_LOCK (dbin); + if (lock) + EXPOSE_LOCK (dbin); if (dbin->decode_chain) { if (gst_decode_chain_is_complete (dbin->decode_chain)) { gst_decode_bin_expose (dbin); } } - EXPOSE_UNLOCK (dbin); + if (lock) + EXPOSE_UNLOCK (dbin); if (mqpad) gst_object_unref (mqpad); @@ -2804,6 +2807,7 @@ type_found (GstElement * typefind, guint probability, goto exit; } + EXPOSE_LOCK (decode_bin); /* FIXME: we can only deal with one type, we don't yet support dynamically changing * caps from the typefind element */ if (decode_bin->have_type || decode_bin->decode_chain) @@ -2823,13 +2827,14 @@ 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); + pad, caps, decode_bin->decode_chain, FALSE); GST_PAD_STREAM_UNLOCK (sink_pad); gst_object_unref (sink_pad); gst_object_unref (pad); exit: + EXPOSE_UNLOCK (decode_bin); return; } @@ -2878,7 +2883,8 @@ pad_added_cb (GstElement * element, GstPad * pad, GstDecodeChain * chain) caps = get_pad_caps (pad); if (analyze_new_pad (dbin, element, pad, caps, chain, &new_chain)) - expose_pad (dbin, element, new_chain->current_pad, pad, caps, new_chain); + expose_pad (dbin, element, new_chain->current_pad, pad, caps, new_chain, + TRUE); if (caps) gst_caps_unref (caps); |