From 8c392fb6113f23cc05720613c9d88f70b065a018 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Tue, 15 Nov 2005 18:11:17 +0000 Subject: [PATCH] ext/ogg/gstoggdemux.c: Implement GstElement::send_event, so we can send seek events in GST_STATE_READY Original commit message from CVS: * ext/ogg/gstoggdemux.c: (gst_ogg_demux_receive_event), (gst_ogg_demux_class_init): Implement GstElement::send_event, so we can send seek events in GST_STATE_READY --- ChangeLog | 7 ++++++ ext/ogg/gstoggdemux.c | 51 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/ChangeLog b/ChangeLog index 936edd2526..c2acb172d7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2005-11-15 Edward Hervey + + * ext/ogg/gstoggdemux.c: (gst_ogg_demux_receive_event), + (gst_ogg_demux_class_init): + Implement GstElement::send_event, so we can send seek events + in GST_STATE_READY + 2005-11-14 Julien MOUTTE * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xwindow_new): diff --git a/ext/ogg/gstoggdemux.c b/ext/ogg/gstoggdemux.c index 7ae8d2ca47..bc306f6afc 100644 --- a/ext/ogg/gstoggdemux.c +++ b/ext/ogg/gstoggdemux.c @@ -185,6 +185,8 @@ static gboolean gst_ogg_demux_activate_chain (GstOggDemux * ogg, static gboolean gst_ogg_demux_configure_segment (GstOggDemux * ogg, GstEvent * event, gboolean * running); static gboolean gst_ogg_demux_perform_seek (GstOggDemux * ogg); +static gboolean gst_ogg_demux_receive_event (GstElement * element, + GstEvent * event); static void gst_ogg_pad_class_init (GstOggPadClass * klass); static void gst_ogg_pad_init (GstOggPad * pad); @@ -385,6 +387,54 @@ done: return res; } +static gboolean +gst_ogg_demux_receive_event (GstElement * element, GstEvent * event) +{ + gboolean res; + GstOggDemux *ogg; + + ogg = GST_OGG_DEMUX (element); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + { + gboolean running; + + /* can't seek if we are not seekable, FIXME could pass the + * seek query upstream after converting it to bytes using + * the average bitrate of the stream. */ + if (!ogg->seekable) { + GST_DEBUG ("seek on non seekable stream"); + goto error; + } + + if (!gst_ogg_demux_configure_segment (ogg, event, &running)) { + GST_DEBUG ("configure segment failed"); + goto error; + } + + /* now do the seek */ + if (running) { + res = gst_ogg_demux_perform_seek (ogg); + } else + res = TRUE; + break; + + } + default: + GST_DEBUG ("We only handle seek events here"); + goto error; + break; + } + + return res; + +error: + GST_DEBUG ("error handling event"); + gst_event_unref (event); + return FALSE; +} + static gboolean gst_ogg_pad_event (GstPad * pad, GstEvent * event) { @@ -1072,6 +1122,7 @@ gst_ogg_demux_class_init (GstOggDemuxClass * klass) GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gstelement_class->change_state = gst_ogg_demux_change_state; + gstelement_class->send_event = gst_ogg_demux_receive_event; gobject_class->finalize = gst_ogg_demux_finalize; }