pad: check sticky events also after pad block
authorWim Taymans <wim.taymans@collabora.co.uk>
Thu, 30 Aug 2012 17:15:42 +0000 (19:15 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Mon, 3 Sep 2012 09:07:10 +0000 (11:07 +0200)
Recheck for sticky events after doing a pad block because the pad block could
have caused a relink and then we need to resend the events to the newly linked
pad.

Fixes things like switching of visualisations.

gst/gstpad.c

index 1529528..971f84b 100644 (file)
@@ -3811,6 +3811,10 @@ gst_pad_push_data (GstPad * pad, GstPadProbeType type, void *data)
   /* do block probes */
   PROBE_PUSH (pad, type | GST_PAD_PROBE_TYPE_BLOCK, data, probe_stopped);
 
   /* do block probes */
   PROBE_PUSH (pad, type | GST_PAD_PROBE_TYPE_BLOCK, data, probe_stopped);
 
+  /* recheck sticky events because the probe might have cause a relink */
+  if (G_UNLIKELY ((ret = check_sticky (pad))) != GST_FLOW_OK)
+    goto events_error;
+
   /* do post-blocking probes */
   PROBE_PUSH (pad, type, data, probe_stopped);
 
   /* do post-blocking probes */
   PROBE_PUSH (pad, type, data, probe_stopped);
 
@@ -3993,6 +3997,10 @@ gst_pad_get_range_unchecked (GstPad * pad, guint64 offset, guint size,
   PROBE_PULL (pad, GST_PAD_PROBE_TYPE_PULL | GST_PAD_PROBE_TYPE_BLOCK,
       res_buf, offset, size, probe_stopped);
 
   PROBE_PULL (pad, GST_PAD_PROBE_TYPE_PULL | GST_PAD_PROBE_TYPE_BLOCK,
       res_buf, offset, size, probe_stopped);
 
+  /* recheck sticky events because the probe might have cause a relink */
+  if (G_UNLIKELY ((ret = check_sticky (pad))) != GST_FLOW_OK)
+    goto events_error;
+
   ACQUIRE_PARENT (pad, parent, no_parent);
   GST_OBJECT_UNLOCK (pad);
 
   ACQUIRE_PARENT (pad, parent, no_parent);
   GST_OBJECT_UNLOCK (pad);