static gboolean _src_event (GstAggregator * self, GstEvent * event) { gboolean res = TRUE; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: { gst_event_ref (event); res = _do_seek (self, event); if (res) self->priv->seqnum = gst_event_get_seqnum (event); gst_event_unref (event); event = NULL; goto done; } case GST_EVENT_NAVIGATION: { /* navigation is rather pointless. */ res = FALSE; gst_event_unref (event); goto done; } default: { break; } } return _forward_event_to_all_sinkpads (self, event, FALSE); done: return res; }
static gboolean _src_event (GstAggregator * self, GstEvent * event) { EventData evdata; gboolean res = TRUE; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: { gst_event_ref (event); res = _do_seek (self, event); gst_event_unref (event); event = NULL; goto done; } case GST_EVENT_NAVIGATION: { /* navigation is rather pointless. */ res = FALSE; gst_event_unref (event); goto done; } default: { break; } } evdata = _forward_event_to_all_sinkpads (self, event, FALSE); res = evdata.result; done: return res; }
static gboolean _do_seek (GstAggregator * self, GstEvent * event) { gdouble rate; GstFormat fmt; GstSeekFlags flags; GstSeekType start_type, stop_type; gint64 start, stop; gboolean flush; gboolean res; GstAggregatorPrivate *priv = self->priv; gst_event_parse_seek (event, &rate, &fmt, &flags, &start_type, &start, &stop_type, &stop); GST_INFO_OBJECT (self, "starting SEEK"); flush = flags & GST_SEEK_FLAG_FLUSH; if (flush) { g_atomic_int_set (&priv->pending_flush_start, TRUE); g_atomic_int_set (&priv->flush_seeking, TRUE); } gst_segment_do_seek (&self->segment, rate, fmt, flags, start_type, start, stop_type, stop, NULL); /* forward the seek upstream */ res = _forward_event_to_all_sinkpads (self, event, flush); event = NULL; if (!res) { g_atomic_int_set (&priv->flush_seeking, FALSE); g_atomic_int_set (&priv->pending_flush_start, FALSE); } GST_INFO_OBJECT (self, "seek done, result: %d", res); return res; }