From: Mark Nauwelaerts Date: Mon, 13 Sep 2010 08:02:44 +0000 (+0200) Subject: decodebin2: prevent another race with shutdown state change X-Git-Tag: RELEASE-0.10.31~224 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=60cad9f0072c88a1d1e26ecc5d0e017b59cdcd21;p=platform%2Fupstream%2Fgst-plugins-base.git decodebin2: prevent another race with shutdown state change --- 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: