aggregator: cleanup event forwarding

Don't copy the whole event struct. Set the input params when we call the
forwarding helper. Initialize the internal fields and return values in the
helper.
This commit is contained in:
Stefan Sauer 2017-10-03 12:36:10 +02:00 committed by Tim-Philipp Müller
parent a82e6bc650
commit 4808f4836c

View file

@ -320,13 +320,16 @@ struct _GstAggregatorPrivate
gint64 latency; /* protected by both src_lock and all pad locks */ gint64 latency; /* protected by both src_lock and all pad locks */
}; };
/* Seek event forwarding helper */
typedef struct typedef struct
{ {
/* parameters */
GstEvent *event; GstEvent *event;
gboolean result;
gboolean flush; gboolean flush;
gboolean only_to_active_pads; gboolean only_to_active_pads;
/* results */
gboolean result;
gboolean one_actually_seeked; gboolean one_actually_seeked;
} EventData; } EventData;
@ -1944,22 +1947,17 @@ gst_aggregator_event_forward_func (GstPad * pad, gpointer user_data)
return FALSE; return FALSE;
} }
static EventData static void
gst_aggregator_forward_event_to_all_sinkpads (GstAggregator * self, gst_aggregator_forward_event_to_all_sinkpads (GstAggregator * self,
GstEvent * event, gboolean flush, gboolean only_to_active_pads) EventData * evdata)
{ {
EventData evdata; evdata->result = TRUE;
evdata->one_actually_seeked = FALSE;
evdata.event = event;
evdata.result = TRUE;
evdata.flush = flush;
evdata.one_actually_seeked = FALSE;
evdata.only_to_active_pads = only_to_active_pads;
/* We first need to set all pads as flushing in a first pass /* We first need to set all pads as flushing in a first pass
* as flush_start flush_stop is sometimes sent synchronously * as flush_start flush_stop is sometimes sent synchronously
* while we send the seek event */ * while we send the seek event */
if (flush) { if (evdata->flush) {
GList *l; GList *l;
GST_OBJECT_LOCK (self); GST_OBJECT_LOCK (self);
@ -1974,11 +1972,9 @@ gst_aggregator_forward_event_to_all_sinkpads (GstAggregator * self,
GST_OBJECT_UNLOCK (self); GST_OBJECT_UNLOCK (self);
} }
gst_pad_forward (self->srcpad, gst_aggregator_event_forward_func, &evdata); gst_pad_forward (self->srcpad, gst_aggregator_event_forward_func, evdata);
gst_event_unref (event); gst_event_unref (evdata->event);
return evdata;
} }
static gboolean static gboolean
@ -1990,7 +1986,7 @@ gst_aggregator_do_seek (GstAggregator * self, GstEvent * event)
GstSeekType start_type, stop_type; GstSeekType start_type, stop_type;
gint64 start, stop; gint64 start, stop;
gboolean flush; gboolean flush;
EventData evdata; EventData evdata = { 0, };
GstAggregatorPrivate *priv = self->priv; GstAggregatorPrivate *priv = self->priv;
gst_event_parse_seek (event, &rate, &fmt, &flags, &start_type, gst_event_parse_seek (event, &rate, &fmt, &flags, &start_type,
@ -2014,8 +2010,10 @@ gst_aggregator_do_seek (GstAggregator * self, GstEvent * event)
GST_OBJECT_UNLOCK (self); GST_OBJECT_UNLOCK (self);
/* forward the seek upstream */ /* forward the seek upstream */
evdata = evdata.event = event;
gst_aggregator_forward_event_to_all_sinkpads (self, event, flush, FALSE); evdata.flush = flush;
evdata.only_to_active_pads = FALSE;
gst_aggregator_forward_event_to_all_sinkpads (self, &evdata);
event = NULL; event = NULL;
if (!evdata.result || !evdata.one_actually_seeked) { if (!evdata.result || !evdata.one_actually_seeked) {
@ -2033,7 +2031,7 @@ gst_aggregator_do_seek (GstAggregator * self, GstEvent * event)
static gboolean static gboolean
gst_aggregator_default_src_event (GstAggregator * self, GstEvent * event) gst_aggregator_default_src_event (GstAggregator * self, GstEvent * event)
{ {
EventData evdata; EventData evdata = { 0, };
switch (GST_EVENT_TYPE (event)) { switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_SEEK: case GST_EVENT_SEEK:
@ -2050,9 +2048,10 @@ gst_aggregator_default_src_event (GstAggregator * self, GstEvent * event)
/* Don't forward QOS events to pads that had no active buffer yet. Otherwise /* Don't forward QOS events to pads that had no active buffer yet. Otherwise
* they will receive a QOS event that has earliest_time=0 (because we can't * they will receive a QOS event that has earliest_time=0 (because we can't
* have negative timestamps), and consider their buffer as too late */ * have negative timestamps), and consider their buffer as too late */
evdata = evdata.event = event;
gst_aggregator_forward_event_to_all_sinkpads (self, event, FALSE, evdata.flush = FALSE;
GST_EVENT_TYPE (event) == GST_EVENT_QOS); evdata.only_to_active_pads = GST_EVENT_TYPE (event) == GST_EVENT_QOS;
gst_aggregator_forward_event_to_all_sinkpads (self, &evdata);
return evdata.result; return evdata.result;
} }