return ret;
}
+static gboolean
+clear_sticky_events (GstPad * pad, GstEvent ** event, gpointer user_data)
+{
+ GST_DEBUG_OBJECT (pad, "clearing sticky event %" GST_PTR_FORMAT, *event);
+ gst_event_unref (*event);
+ *event = NULL;
+ return TRUE;
+}
+
+static gboolean
+copy_sticky_events (GstPad * pad, GstEvent ** event, gpointer user_data)
+{
+ GstPad *internal = GST_PAD_CAST (user_data);
+
+ GST_DEBUG_OBJECT (internal, "store sticky event %" GST_PTR_FORMAT, *event);
+ gst_pad_store_sticky_event (internal, *event);
+
+ return TRUE;
+}
+
/**
* gst_ghost_pad_set_target:
* @gpad: the #GstGhostPad
gst_pad_unlink (internal, oldtarget);
else
gst_pad_unlink (oldtarget, internal);
+
+ if (GST_PAD_IS_SRC (gpad)) {
+ /* only clear the events on the SRC ghostpad. We don't clear sink
+ * ghostpads, they got their events from downstream and we want to
+ * set the same events on the target later. */
+ gst_pad_sticky_events_foreach (GST_PAD_CAST (gpad), clear_sticky_events,
+ NULL);
+ }
} else {
GST_OBJECT_UNLOCK (gpad);
}
if (lret != GST_PAD_LINK_OK)
goto link_failed;
+
+ if (GST_PAD_IS_SRC (gpad)) {
+ /* only copy the events to the SRC ghostpad. We don't copy to sink
+ * ghostpads, they got their events from downstream and we don't want
+ * to overwrite those with events from this new target. */
+ gst_pad_sticky_events_foreach (newtarget, copy_sticky_events, gpad);
+ }
}
return TRUE;