decodebin2: fix deadlock on chain shutdown
authorVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Wed, 25 Mar 2015 15:36:38 +0000 (15:36 +0000)
committerVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Fri, 3 Apr 2015 14:42:49 +0000 (15:42 +0100)
When shutting down the chain, we can get a deadlock when removing
a pad, if that chain was being busy streaming but blocked (eg, while
waiting for a queue to have free space).

https://bugzilla.gnome.org/show_bug.cgi?id=746480

gst/playback/gstdecodebin2.c

index dc61d8998a854b3b6cd81dfe77e1a45e79dcc83c..0cfb4ea2fb0b79319e9deabbbfb751945a0595ed 100644 (file)
@@ -3247,8 +3247,10 @@ gst_decode_chain_free_internal (GstDecodeChain * chain, gboolean hide)
 
   if (chain->endpad) {
     if (chain->endpad->exposed) {
-      gst_element_remove_pad (GST_ELEMENT_CAST (chain->dbin),
-          GST_PAD_CAST (chain->endpad));
+      GstPad *endpad = GST_PAD_CAST (chain->endpad);
+      gst_pad_push_event (endpad, gst_event_new_flush_start ());
+      gst_pad_push_event (endpad, gst_event_new_flush_stop (FALSE));
+      gst_element_remove_pad (GST_ELEMENT_CAST (chain->dbin), endpad);
     }
 
     decode_pad_set_target (chain->endpad, NULL);