summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gst/gstevent.c9
-rw-r--r--gst/gstevent.h67
-rw-r--r--gst/gstinfo.c6
-rw-r--r--gst/gstpad.c33
-rw-r--r--gst/gstpad.h1
5 files changed, 62 insertions, 54 deletions
diff --git a/gst/gstevent.c b/gst/gstevent.c
index d55c4fe0d5..ec20f2319f 100644
--- a/gst/gstevent.c
+++ b/gst/gstevent.c
@@ -184,7 +184,7 @@ gst_event_type_get_flags (GstEventType type)
{
GstEventTypeFlags ret;
- ret = type & ((1 << GST_EVENT_TYPE_SHIFT) - 1);
+ ret = type & ((1 << GST_EVENT_STICKY_SHIFT) - 1);
return ret;
}
@@ -207,10 +207,6 @@ _gst_event_free (GstEvent * event)
GST_CAT_LOG (GST_CAT_EVENT, "freeing event %p type %s", event,
GST_EVENT_TYPE_NAME (event));
- if (GST_EVENT_SRC (event)) {
- gst_object_unref (GST_EVENT_SRC (event));
- GST_EVENT_SRC (event) = NULL;
- }
if (event->structure) {
gst_structure_set_parent_refcount (event->structure, NULL);
gst_structure_free (event->structure);
@@ -233,9 +229,6 @@ _gst_event_copy (GstEvent * event)
GST_EVENT_TIMESTAMP (copy) = GST_EVENT_TIMESTAMP (event);
GST_EVENT_SEQNUM (copy) = GST_EVENT_SEQNUM (event);
- if (GST_EVENT_SRC (event)) {
- GST_EVENT_SRC (copy) = gst_object_ref (GST_EVENT_SRC (event));
- }
if (event->structure) {
copy->structure = gst_structure_copy (event->structure);
gst_structure_set_parent_refcount (copy->structure,
diff --git a/gst/gstevent.h b/gst/gstevent.h
index 0d96e26c75..53210bf05e 100644
--- a/gst/gstevent.h
+++ b/gst/gstevent.h
@@ -40,6 +40,7 @@ G_BEGIN_DECLS
* @GST_EVENT_TYPE_DOWNSTREAM: Set if the event can travel downstream.
* @GST_EVENT_TYPE_SERIALIZED: Set if the event should be serialized with data
* flow.
+ * @GST_EVENT_TYPE_STICKY: Set if the event is sticky on the pads.
*
* #GstEventTypeFlags indicate the aspects of the different #GstEventType
* values. You can get the type flags of a #GstEventType with the
@@ -48,7 +49,8 @@ G_BEGIN_DECLS
typedef enum {
GST_EVENT_TYPE_UPSTREAM = 1 << 0,
GST_EVENT_TYPE_DOWNSTREAM = 1 << 1,
- GST_EVENT_TYPE_SERIALIZED = 1 << 2
+ GST_EVENT_TYPE_SERIALIZED = 1 << 2,
+ GST_EVENT_TYPE_STICKY = 1 << 3
} GstEventTypeFlags;
/**
@@ -59,21 +61,25 @@ typedef enum {
#define GST_EVENT_TYPE_BOTH \
(GST_EVENT_TYPE_UPSTREAM | GST_EVENT_TYPE_DOWNSTREAM)
-#define GST_EVENT_TYPE_SHIFT 4
+#define GST_EVENT_STICKY_SHIFT 8
+#define GST_EVENT_NUM_SHIFT 16
/**
* GST_EVENT_MAKE_TYPE:
* @num: the event number to create
+ * @idx: the index in the sticky array
* @flags: the event flags
*
* when making custom event types, use this macro with the num and
* the given flags
*/
-#define GST_EVENT_MAKE_TYPE(num,flags) \
- (((num) << GST_EVENT_TYPE_SHIFT) | (flags))
+#define GST_EVENT_MAKE_TYPE(num,idx,flags) \
+ (((num) << GST_EVENT_NUM_SHIFT) | ((idx) << GST_EVENT_STICKY_SHIFT) | (flags))
#define FLAG(name) GST_EVENT_TYPE_##name
+#define GST_EVENT_STICKY_IDX(ev) ((GST_EVENT_TYPE(ev) >> GST_EVENT_STICKY_SHIFT) & 0xff)
+
/**
* GstEventType:
* @GST_EVENT_UNKNOWN: unknown event.
@@ -124,29 +130,29 @@ typedef enum {
*/
/* NOTE: keep in sync with quark registration in gstevent.c */
typedef enum {
- GST_EVENT_UNKNOWN = GST_EVENT_MAKE_TYPE (0, 0),
+ GST_EVENT_UNKNOWN = GST_EVENT_MAKE_TYPE (0, 0, 0),
/* bidirectional events */
- GST_EVENT_FLUSH_START = GST_EVENT_MAKE_TYPE (1, FLAG(BOTH)),
- GST_EVENT_FLUSH_STOP = GST_EVENT_MAKE_TYPE (2, FLAG(BOTH) | FLAG(SERIALIZED)),
+ GST_EVENT_FLUSH_START = GST_EVENT_MAKE_TYPE (1, 0, FLAG(BOTH)),
+ GST_EVENT_FLUSH_STOP = GST_EVENT_MAKE_TYPE (2, 0, FLAG(BOTH) | FLAG(SERIALIZED)),
/* downstream serialized events */
- GST_EVENT_EOS = GST_EVENT_MAKE_TYPE (5, FLAG(DOWNSTREAM) | FLAG(SERIALIZED)),
- GST_EVENT_NEWSEGMENT = GST_EVENT_MAKE_TYPE (6, FLAG(DOWNSTREAM) | FLAG(SERIALIZED)),
- GST_EVENT_TAG = GST_EVENT_MAKE_TYPE (7, FLAG(DOWNSTREAM) | FLAG(SERIALIZED)),
- GST_EVENT_BUFFERSIZE = GST_EVENT_MAKE_TYPE (8, FLAG(DOWNSTREAM) | FLAG(SERIALIZED)),
- GST_EVENT_SINK_MESSAGE = GST_EVENT_MAKE_TYPE (9, FLAG(DOWNSTREAM) | FLAG(SERIALIZED)),
+ GST_EVENT_EOS = GST_EVENT_MAKE_TYPE (5, 0, FLAG(DOWNSTREAM) | FLAG(SERIALIZED) | FLAG(STICKY)),
+ GST_EVENT_NEWSEGMENT = GST_EVENT_MAKE_TYPE (6, 1, FLAG(DOWNSTREAM) | FLAG(SERIALIZED) | FLAG(STICKY)),
+ GST_EVENT_TAG = GST_EVENT_MAKE_TYPE (7, 2, FLAG(DOWNSTREAM) | FLAG(SERIALIZED) | FLAG(STICKY)),
+ GST_EVENT_BUFFERSIZE = GST_EVENT_MAKE_TYPE (8, 3, FLAG(DOWNSTREAM) | FLAG(SERIALIZED) | FLAG(STICKY)),
+ GST_EVENT_SINK_MESSAGE = GST_EVENT_MAKE_TYPE (9, 4, FLAG(DOWNSTREAM) | FLAG(SERIALIZED) | FLAG(STICKY)),
/* upstream events */
- GST_EVENT_QOS = GST_EVENT_MAKE_TYPE (15, FLAG(UPSTREAM)),
- GST_EVENT_SEEK = GST_EVENT_MAKE_TYPE (16, FLAG(UPSTREAM)),
- GST_EVENT_NAVIGATION = GST_EVENT_MAKE_TYPE (17, FLAG(UPSTREAM)),
- GST_EVENT_LATENCY = GST_EVENT_MAKE_TYPE (18, FLAG(UPSTREAM)),
- GST_EVENT_STEP = GST_EVENT_MAKE_TYPE (19, FLAG(UPSTREAM)),
+ GST_EVENT_QOS = GST_EVENT_MAKE_TYPE (15, 0, FLAG(UPSTREAM)),
+ GST_EVENT_SEEK = GST_EVENT_MAKE_TYPE (16, 0, FLAG(UPSTREAM)),
+ GST_EVENT_NAVIGATION = GST_EVENT_MAKE_TYPE (17, 0, FLAG(UPSTREAM)),
+ GST_EVENT_LATENCY = GST_EVENT_MAKE_TYPE (18, 0, FLAG(UPSTREAM)),
+ GST_EVENT_STEP = GST_EVENT_MAKE_TYPE (19, 0, FLAG(UPSTREAM)),
/* custom events start here */
- GST_EVENT_CUSTOM_UPSTREAM = GST_EVENT_MAKE_TYPE (32, FLAG(UPSTREAM)),
- GST_EVENT_CUSTOM_DOWNSTREAM = GST_EVENT_MAKE_TYPE (32, FLAG(DOWNSTREAM) | FLAG(SERIALIZED)),
- GST_EVENT_CUSTOM_DOWNSTREAM_OOB = GST_EVENT_MAKE_TYPE (32, FLAG(DOWNSTREAM)),
- GST_EVENT_CUSTOM_BOTH = GST_EVENT_MAKE_TYPE (32, FLAG(BOTH) | FLAG(SERIALIZED)),
- GST_EVENT_CUSTOM_BOTH_OOB = GST_EVENT_MAKE_TYPE (32, FLAG(BOTH))
+ GST_EVENT_CUSTOM_UPSTREAM = GST_EVENT_MAKE_TYPE (32, 0, FLAG(UPSTREAM)),
+ GST_EVENT_CUSTOM_DOWNSTREAM = GST_EVENT_MAKE_TYPE (32, 0, FLAG(DOWNSTREAM) | FLAG(SERIALIZED)),
+ GST_EVENT_CUSTOM_DOWNSTREAM_OOB = GST_EVENT_MAKE_TYPE (32, 0, FLAG(DOWNSTREAM)),
+ GST_EVENT_CUSTOM_BOTH = GST_EVENT_MAKE_TYPE (32, 0, FLAG(BOTH) | FLAG(SERIALIZED)),
+ GST_EVENT_CUSTOM_BOTH_OOB = GST_EVENT_MAKE_TYPE (32, 0, FLAG(BOTH))
} GstEventType;
#undef FLAG
@@ -190,14 +196,6 @@ typedef struct _GstEvent GstEvent;
#define GST_EVENT_TIMESTAMP(event) (GST_EVENT_CAST(event)->timestamp)
/**
- * GST_EVENT_SRC:
- * @event: the event to query
- *
- * The source #GstObject that generated this event.
- */
-#define GST_EVENT_SRC(event) (GST_EVENT_CAST(event)->src)
-
-/**
* GST_EVENT_SEQNUM:
* @event: the event to query
*
@@ -226,6 +224,13 @@ typedef struct _GstEvent GstEvent;
* Check if an event is serialized with the data stream.
*/
#define GST_EVENT_IS_SERIALIZED(ev) !!(GST_EVENT_TYPE (ev) & GST_EVENT_TYPE_SERIALIZED)
+/**
+ * GST_EVENT_IS_STICKY:
+ * @ev: the event to query
+ *
+ * Check if an event is sticky on the pads.
+ */
+#define GST_EVENT_IS_STICKY(ev) !!(GST_EVENT_TYPE (ev) & GST_EVENT_TYPE_STICKY)
/**
* gst_event_replace:
@@ -345,7 +350,6 @@ typedef enum {
* @mini_object: the parent structure
* @type: the #GstEventType of the event
* @timestamp: the timestamp of the event
- * @src: the src of the event
* @structure: the #GstStructure containing the event info.
*
* A #GstEvent.
@@ -356,7 +360,6 @@ struct _GstEvent {
/*< public >*/ /* with COW */
GstEventType type;
guint64 timestamp;
- GstObject *src;
guint32 seqnum;
GstStructure *structure;
diff --git a/gst/gstinfo.c b/gst/gstinfo.c
index 36fe1ac988..340e34163f 100644
--- a/gst/gstinfo.c
+++ b/gst/gstinfo.c
@@ -688,11 +688,9 @@ gst_debug_print_object (gpointer ptr)
s = g_strdup ("(NULL)");
}
- ret = g_strdup_printf ("%s event from '%s' at time %"
+ ret = g_strdup_printf ("%s event at time %"
GST_TIME_FORMAT ": %s",
- GST_EVENT_TYPE_NAME (event), (event->src != NULL) ?
- GST_OBJECT_NAME (event->src) : "(NULL)",
- GST_TIME_ARGS (event->timestamp), s);
+ GST_EVENT_TYPE_NAME (event), GST_TIME_ARGS (event->timestamp), s);
g_free (s);
return ret;
}
diff --git a/gst/gstpad.c b/gst/gstpad.c
index a4ec61d755..a0d809150e 100644
--- a/gst/gstpad.c
+++ b/gst/gstpad.c
@@ -374,6 +374,17 @@ gst_pad_init (GstPad * pad)
}
static void
+clear_sticky_events (GstPad * pad)
+{
+ guint i;
+
+ for (i = 0; i < 16; i++) {
+ GstEvent **eventp = &pad->sticky[i];
+ gst_event_replace (eventp, NULL);
+ }
+}
+
+static void
gst_pad_dispose (GObject * object)
{
GstPad *pad = GST_PAD_CAST (object);
@@ -404,6 +415,8 @@ gst_pad_dispose (GObject * object)
pad->block_data = NULL;
}
+ clear_sticky_events (pad);
+
G_OBJECT_CLASS (parent_class)->dispose (object);
}
@@ -614,6 +627,7 @@ post_activate (GstPad * pad, GstActivateMode new_mode)
/* ensures that streaming stops */
GST_PAD_STREAM_LOCK (pad);
GST_DEBUG_OBJECT (pad, "stopped streaming");
+ clear_sticky_events (pad);
GST_PAD_STREAM_UNLOCK (pad);
break;
}
@@ -4438,11 +4452,6 @@ gst_pad_push_event (GstPad * pad, GstEvent * event)
break;
}
- if (G_UNLIKELY (GST_EVENT_SRC (event) == NULL)) {
- GST_LOG_OBJECT (pad, "event had no source, setting pad as event source");
- GST_EVENT_SRC (event) = gst_object_ref (pad);
- }
-
if (G_UNLIKELY (GST_PAD_DO_EVENT_SIGNALS (pad) > 0)) {
GST_OBJECT_UNLOCK (pad);
@@ -4451,6 +4460,15 @@ gst_pad_push_event (GstPad * pad, GstEvent * event)
GST_OBJECT_LOCK (pad);
}
+
+ /* store the event on the pad, but only on srcpads */
+ if (GST_PAD_IS_SRC (pad) && GST_EVENT_IS_STICKY (event)) {
+ GstEvent **eventp = &pad->sticky[GST_EVENT_STICKY_IDX (event)];
+ GST_LOG_OBJECT (pad, "storing sticky event %s",
+ GST_EVENT_TYPE_NAME (event));
+ gst_event_replace (eventp, event);
+ }
+
peerpad = GST_PAD_PEER (pad);
if (peerpad == NULL)
goto not_linked;
@@ -4544,11 +4562,6 @@ gst_pad_send_event (GstPad * pad, GstEvent * event)
} else
goto unknown_direction;
- if (G_UNLIKELY (GST_EVENT_SRC (event) == NULL)) {
- GST_LOG_OBJECT (pad, "event had no source, setting pad as event source");
- GST_EVENT_SRC (event) = gst_object_ref (pad);
- }
-
/* pad signals */
if (G_UNLIKELY (GST_PAD_DO_EVENT_SIGNALS (pad) > 0)) {
GST_OBJECT_UNLOCK (pad);
diff --git a/gst/gstpad.h b/gst/gstpad.h
index 949e625bc4..19def6b33e 100644
--- a/gst/gstpad.h
+++ b/gst/gstpad.h
@@ -614,6 +614,7 @@ struct _GstPad {
GstPadCheckGetRangeFunction checkgetrangefunc;
GstPadGetRangeFunction getrangefunc;
GstPadEventFunction eventfunc;
+ GstEvent *sticky[16];
GstActivateMode mode;