/* handle */
GnomeVFSHandle *handle;
+ /* Seek stuff */
+ gboolean seek_happened;
+ gboolean need_flush;
/* local filename */
gchar *local_name;
static void gst_gnomevfssrc_close_file(GstGnomeVFSSrc *src);
static gboolean gst_gnomevfssrc_open_file(GstGnomeVFSSrc *src);
+static gboolean gst_gnomevfssrc_srcpad_event (GstPad *pad, GstEvent *event);
static GstElementClass *parent_class = NULL;
if (!gnomevfssrc_type) {
static const GTypeInfo gnomevfssrc_info = {
- sizeof(GstGnomeVFSSrcClass), NULL,
- NULL,
- (GClassInitFunc) gst_gnomevfssrc_class_init,
- NULL,
- NULL,
- sizeof(GstGnomeVFSSrc),
- 0,
- (GInstanceInitFunc) gst_gnomevfssrc_init,
+ sizeof(GstGnomeVFSSrcClass), NULL,
+ NULL,
+ (GClassInitFunc) gst_gnomevfssrc_class_init,
+ NULL,
+ NULL,
+ sizeof(GstGnomeVFSSrc),
+ 0,
+ (GInstanceInitFunc) gst_gnomevfssrc_init,
};
gnomevfssrc_type =
- g_type_register_static(GST_TYPE_ELEMENT, "GstGnomeVFSSrc", &gnomevfssrc_info, 0);
+ g_type_register_static(GST_TYPE_ELEMENT,
+ "GstGnomeVFSSrc",
+ &gnomevfssrc_info,
+ 0);
}
return gnomevfssrc_type;
}
gnomevfssrc->srcpad = gst_pad_new("src", GST_PAD_SRC);
gst_pad_set_get_function(gnomevfssrc->srcpad, gst_gnomevfssrc_get);
+ gst_pad_set_event_function (gnomevfssrc->srcpad,
+ gst_gnomevfssrc_srcpad_event);
gst_element_add_pad(GST_ELEMENT(gnomevfssrc), gnomevfssrc->srcpad);
gnomevfssrc->filename = NULL;
g_return_if_fail((GST_STATE(src) < GST_STATE_PLAYING)
|| (GST_STATE(src) == GST_STATE_PAUSED));
- if (src->filename)
- g_free(src->filename);
+ g_free(src->filename);
/* clear the filename if we get a NULL (is that possible?) */
if (g_value_get_string (value) == NULL) {
/* zero out a lot of our state */
src->is_local = FALSE;
- if (src->uri)
- g_free(src->uri);
- if (src->handle)
- g_free(src->handle);
- if (src->local_name)
- g_free(src->local_name);
+ g_free(src->uri);
+ g_free(src->handle);
+ g_free(src->local_name);
src->fd = 0;
src->map = NULL;
src->size = 0;
g_return_val_if_fail(GST_IS_GNOMEVFSSRC(element),
GST_STATE_FAILURE);
- if (GST_STATE_TRANSITION(element) == GST_STATE_NULL_TO_READY) {
+ switch (GST_STATE_TRANSITION (element)) {
+ case GST_STATE_NULL_TO_READY:
if (!GST_FLAG_IS_SET(element, GST_GNOMEVFSSRC_OPEN)) {
if (!gst_gnomevfssrc_open_file
- (GST_GNOMEVFSSRC(element)))
+ (GST_GNOMEVFSSRC(element)))
return GST_STATE_FAILURE;
}
- } else if (GST_STATE_TRANSITION(element) ==
- GST_STATE_READY_TO_NULL) {
+ break;
+ case GST_STATE_READY_TO_NULL:
if (GST_FLAG_IS_SET(element, GST_GNOMEVFSSRC_OPEN))
gst_gnomevfssrc_close_file(GST_GNOMEVFSSRC
- (element));
+ (element));
+ break;
+ case GST_STATE_READY_TO_PAUSED:
+ case GST_STATE_PAUSED_TO_READY:
+ default:
+ break;
}
if (GST_ELEMENT_CLASS(parent_class)->change_state)
return TRUE;
}
+static gboolean
+gst_gnomevfssrc_srcpad_event (GstPad *pad, GstEvent *event)
+{
+ GstGnomeVFSSrc *src = GST_GNOMEVFSSRC(GST_PAD_PARENT(pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEEK:
+ switch (GST_EVENT_SEEK_TYPE (event)) {
+ case GST_SEEK_BYTEOFFSET_SET:
+ src->curoffset = (guint64) GST_EVENT_SEEK_OFFSET (event);
+ break;
+ case GST_SEEK_BYTEOFFSET_CUR:
+ src->curoffset += GST_EVENT_SEEK_OFFSET (event);
+ break;
+ case GST_SEEK_BYTEOFFSET_END:
+ src->curoffset = src->size - ABS (GST_EVENT_SEEK_OFFSET (event));
+ break;
+ default:
+ return FALSE;
+ break;
+ }
+ g_object_notify (G_OBJECT (src), "offset");
+ src->seek_happened = TRUE;
+ src->need_flush = GST_EVENT_SEEK_FLUSH(event);
+ gst_event_free (event);
+ /* push a discontinuous event? */
+ break;
+ case GST_EVENT_FLUSH:
+ src->need_flush = TRUE;
+ break;
+ default:
+ return FALSE;
+ break;
+ }
+
+ return TRUE;
+}
+
GstPluginDesc plugin_desc = {
GST_VERSION_MAJOR,
GST_VERSION_MINOR,