From 60cad9f0072c88a1d1e26ecc5d0e017b59cdcd21 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Mon, 13 Sep 2010 10:02:44 +0200 Subject: [PATCH] decodebin2: prevent another race with shutdown state change --- gst/playback/gstdecodebin2.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/gst/playback/gstdecodebin2.c b/gst/playback/gstdecodebin2.c index eab089f..60285e2 100644 --- a/gst/playback/gstdecodebin2.c +++ b/gst/playback/gstdecodebin2.c @@ -1939,7 +1939,7 @@ static void type_found (GstElement * typefind, guint probability, GstCaps * caps, GstDecodeBin * decode_bin) { - GstPad *pad; + GstPad *pad, *sink_pad; GST_DEBUG_OBJECT (decode_bin, "typefind found caps %" GST_PTR_FORMAT, caps); @@ -1961,10 +1961,18 @@ type_found (GstElement * typefind, guint probability, decode_bin->have_type = TRUE; pad = gst_element_get_static_pad (typefind, "src"); + sink_pad = gst_element_get_static_pad (typefind, "sink"); + /* need some lock here to prevent race with shutdown state change + * which might yank away e.g. decode_chain while building stuff here. + * In typical cases, STREAM_LOCK is held and handles that, it need not + * be held (if called from a proxied setcaps), so grab it anyway */ + GST_PAD_STREAM_LOCK (sink_pad); decode_bin->decode_chain = gst_decode_chain_new (decode_bin, NULL, pad); analyze_new_pad (decode_bin, typefind, pad, caps, decode_bin->decode_chain); + GST_PAD_STREAM_UNLOCK (sink_pad); + gst_object_unref (sink_pad); gst_object_unref (pad); exit: -- 2.7.4