From 6db19b953c0610dbbae5871d04027cad23ed486c Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 24 Jul 2002 21:08:43 +0000 Subject: [PATCH] - Implemented seekmasks, query types and formats in various plugins Original commit message from CVS: - Implemented seekmasks, query types and formats in various plugins - use GST_PAD_IS_USABLE if possible --- gst/elements/gstfakesrc.c | 15 +++++++++++- gst/elements/gstfilesink.c | 18 ++++++++++++++ gst/elements/gstfilesrc.c | 44 +++++++++++++++++++++++++++++++++- gst/elements/gsttee.c | 4 ++-- plugins/elements/gstfakesrc.c | 15 +++++++++++- plugins/elements/gstfilesink.c | 18 ++++++++++++++ plugins/elements/gstfilesrc.c | 44 +++++++++++++++++++++++++++++++++- plugins/elements/gsttee.c | 4 ++-- 8 files changed, 154 insertions(+), 8 deletions(-) diff --git a/gst/elements/gstfakesrc.c b/gst/elements/gstfakesrc.c index 0e5bb7d1a0..2752433011 100644 --- a/gst/elements/gstfakesrc.c +++ b/gst/elements/gstfakesrc.c @@ -338,6 +338,18 @@ gst_fakesrc_event_handler (GstPad *pad, GstEvent *event) return TRUE; } +static const GstEventMask* +gst_fakesrc_get_event_mask (GstPad *pad) +{ + static const GstEventMask gst_fakesrc_event_mask[] = { + { GST_EVENT_SEEK, GST_SEEK_FLAG_FLUSH }, + { GST_EVENT_FLUSH, 0 }, + { 0, } + }; + + return gst_fakesrc_event_mask; +} + static void gst_fakesrc_update_functions (GstFakeSrc *src) { @@ -362,6 +374,7 @@ gst_fakesrc_update_functions (GstFakeSrc *src) } gst_pad_set_event_function (pad, gst_fakesrc_event_handler); + gst_pad_set_event_mask_function (pad, gst_fakesrc_get_event_mask); pads = g_list_next (pads); } } @@ -412,7 +425,7 @@ gst_fakesrc_set_property (GObject *object, guint prop_id, const GValue *value, G if (src->sizetype != FAKESRC_SIZETYPE_FIXED) g_object_set (src, "sizetype", FAKESRC_SIZETYPE_FIXED, NULL); - if (!src->pool) + if (!src->pool) src->pool = gst_buffer_pool_get_default (src->sizemax, 10); } else { if (src->pool) { diff --git a/gst/elements/gstfilesink.c b/gst/elements/gstfilesink.c index d147f45001..3a08cd04cd 100644 --- a/gst/elements/gstfilesink.c +++ b/gst/elements/gstfilesink.c @@ -121,6 +121,23 @@ gst_filesink_class_init (GstFileSinkClass *klass) gstelement_class->change_state = gst_filesink_change_state; } +static const GstEventMask* +gst_filesink_get_event_mask (GstPad *pad) +{ + static GstEventMask gst_filesink_event_mask[] = { + { GST_EVENT_SEEK, GST_SEEK_METHOD_CUR | + GST_SEEK_METHOD_SET | + GST_SEEK_METHOD_END | + GST_SEEK_FLAG_FLUSH }, + { GST_EVENT_FLUSH, 0 }, + { GST_EVENT_DISCONTINUOUS, 0 }, + { GST_EVENT_NEW_MEDIA, 0 }, + { 0, } + }; + + return gst_filesink_event_mask; +} + static void gst_filesink_init (GstFileSink *filesink) { @@ -132,6 +149,7 @@ gst_filesink_init (GstFileSink *filesink) GST_FLAG_SET (GST_ELEMENT(filesink), GST_ELEMENT_EVENT_AWARE); gst_pad_set_event_function(pad, gst_filesink_handle_event); + gst_pad_set_event_mask_function(pad, gst_filesink_get_event_mask); filesink->filename = NULL; filesink->file = NULL; diff --git a/gst/elements/gstfilesrc.c b/gst/elements/gstfilesrc.c index f22741fa9d..da725b641b 100644 --- a/gst/elements/gstfilesrc.c +++ b/gst/elements/gstfilesrc.c @@ -98,7 +98,6 @@ enum { ARG_TOUCH, }; - static void gst_filesrc_class_init (GstFileSrcClass *klass); static void gst_filesrc_init (GstFileSrc *filesrc); static void gst_filesrc_dispose (GObject *object); @@ -109,6 +108,7 @@ static void gst_filesrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); static GstBuffer * gst_filesrc_get (GstPad *pad); +static const GstFormat* gst_filesrc_get_formats (GstPad *pad); static gboolean gst_filesrc_srcpad_event (GstPad *pad, GstEvent *event); static gboolean gst_filesrc_srcpad_query (GstPad *pad, GstPadQueryType type, GstSeekType *format, gint64 *value); @@ -182,13 +182,44 @@ gst_filesrc_bufcmp (gconstpointer a, gconstpointer b) else return 0; } +static const GstEventMask* +gst_filesrc_get_event_mask (GstPad *pad) +{ + static GstEventMask gst_filesrc_event_mask[] = { + { GST_EVENT_SEEK, GST_SEEK_METHOD_CUR | + GST_SEEK_METHOD_SET | + GST_SEEK_METHOD_END | + GST_SEEK_FLAG_FLUSH }, + { GST_EVENT_FLUSH, 0 }, + { GST_EVENT_SIZE, 0 }, + { 0, } + }; + + return gst_filesrc_event_mask; +} + +static const GstPadQueryType* +gst_filesrc_get_query_types (GstPad *pad) +{ + static GstPadQueryType gst_filesrc_query_types[] = { + GST_PAD_QUERY_TOTAL, + GST_PAD_QUERY_POSITION, + 0 + }; + + return gst_filesrc_query_types; +} + static void gst_filesrc_init (GstFileSrc *src) { src->srcpad = gst_pad_new ("src", GST_PAD_SRC); gst_pad_set_get_function (src->srcpad, gst_filesrc_get); gst_pad_set_event_function (src->srcpad, gst_filesrc_srcpad_event); + gst_pad_set_event_mask_function (src->srcpad, gst_filesrc_get_event_mask); gst_pad_set_query_function (src->srcpad, gst_filesrc_srcpad_query); + gst_pad_set_query_type_function (src->srcpad, gst_filesrc_get_query_types); + gst_pad_set_formats_function (src->srcpad, gst_filesrc_get_formats); gst_element_add_pad (GST_ELEMENT (src), src->srcpad); src->pagesize = getpagesize(); @@ -681,6 +712,17 @@ gst_filesrc_change_state (GstElement *element) return GST_STATE_SUCCESS; } +static const GstFormat* +gst_filesrc_get_formats (GstPad *pad) +{ + static const GstFormat gst_filesrc_formats[] = { + GST_FORMAT_BYTES, + 0 + }; + + return gst_filesrc_formats; +} + static gboolean gst_filesrc_srcpad_query (GstPad *pad, GstPadQueryType type, GstFormat *format, gint64 *value) diff --git a/gst/elements/gsttee.c b/gst/elements/gsttee.c index e9c37dc401..d886206fb1 100644 --- a/gst/elements/gsttee.c +++ b/gst/elements/gsttee.c @@ -137,7 +137,7 @@ gst_tee_sinkconnect (GstPad *pad, GstCaps *caps) GstPad *outpad = GST_PAD (pads->data); pads = g_list_next (pads); - if (GST_PAD_DIRECTION (outpad) != GST_PAD_SRC || !GST_PAD_IS_CONNECTED (outpad)) + if (GST_PAD_DIRECTION (outpad) != GST_PAD_SRC || !GST_PAD_IS_USABLE (outpad)) continue; if (!(gst_pad_try_set_caps (outpad, caps))) { @@ -304,7 +304,7 @@ gst_tee_chain (GstPad *pad, GstBuffer *buf) g_object_notify (G_OBJECT (tee), "last_message"); } - if (GST_PAD_IS_CONNECTED (outpad)) + if (GST_PAD_IS_USABLE (outpad)) gst_pad_push (outpad, buf); else gst_buffer_unref (buf); diff --git a/plugins/elements/gstfakesrc.c b/plugins/elements/gstfakesrc.c index 0e5bb7d1a0..2752433011 100644 --- a/plugins/elements/gstfakesrc.c +++ b/plugins/elements/gstfakesrc.c @@ -338,6 +338,18 @@ gst_fakesrc_event_handler (GstPad *pad, GstEvent *event) return TRUE; } +static const GstEventMask* +gst_fakesrc_get_event_mask (GstPad *pad) +{ + static const GstEventMask gst_fakesrc_event_mask[] = { + { GST_EVENT_SEEK, GST_SEEK_FLAG_FLUSH }, + { GST_EVENT_FLUSH, 0 }, + { 0, } + }; + + return gst_fakesrc_event_mask; +} + static void gst_fakesrc_update_functions (GstFakeSrc *src) { @@ -362,6 +374,7 @@ gst_fakesrc_update_functions (GstFakeSrc *src) } gst_pad_set_event_function (pad, gst_fakesrc_event_handler); + gst_pad_set_event_mask_function (pad, gst_fakesrc_get_event_mask); pads = g_list_next (pads); } } @@ -412,7 +425,7 @@ gst_fakesrc_set_property (GObject *object, guint prop_id, const GValue *value, G if (src->sizetype != FAKESRC_SIZETYPE_FIXED) g_object_set (src, "sizetype", FAKESRC_SIZETYPE_FIXED, NULL); - if (!src->pool) + if (!src->pool) src->pool = gst_buffer_pool_get_default (src->sizemax, 10); } else { if (src->pool) { diff --git a/plugins/elements/gstfilesink.c b/plugins/elements/gstfilesink.c index d147f45001..3a08cd04cd 100644 --- a/plugins/elements/gstfilesink.c +++ b/plugins/elements/gstfilesink.c @@ -121,6 +121,23 @@ gst_filesink_class_init (GstFileSinkClass *klass) gstelement_class->change_state = gst_filesink_change_state; } +static const GstEventMask* +gst_filesink_get_event_mask (GstPad *pad) +{ + static GstEventMask gst_filesink_event_mask[] = { + { GST_EVENT_SEEK, GST_SEEK_METHOD_CUR | + GST_SEEK_METHOD_SET | + GST_SEEK_METHOD_END | + GST_SEEK_FLAG_FLUSH }, + { GST_EVENT_FLUSH, 0 }, + { GST_EVENT_DISCONTINUOUS, 0 }, + { GST_EVENT_NEW_MEDIA, 0 }, + { 0, } + }; + + return gst_filesink_event_mask; +} + static void gst_filesink_init (GstFileSink *filesink) { @@ -132,6 +149,7 @@ gst_filesink_init (GstFileSink *filesink) GST_FLAG_SET (GST_ELEMENT(filesink), GST_ELEMENT_EVENT_AWARE); gst_pad_set_event_function(pad, gst_filesink_handle_event); + gst_pad_set_event_mask_function(pad, gst_filesink_get_event_mask); filesink->filename = NULL; filesink->file = NULL; diff --git a/plugins/elements/gstfilesrc.c b/plugins/elements/gstfilesrc.c index f22741fa9d..da725b641b 100644 --- a/plugins/elements/gstfilesrc.c +++ b/plugins/elements/gstfilesrc.c @@ -98,7 +98,6 @@ enum { ARG_TOUCH, }; - static void gst_filesrc_class_init (GstFileSrcClass *klass); static void gst_filesrc_init (GstFileSrc *filesrc); static void gst_filesrc_dispose (GObject *object); @@ -109,6 +108,7 @@ static void gst_filesrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); static GstBuffer * gst_filesrc_get (GstPad *pad); +static const GstFormat* gst_filesrc_get_formats (GstPad *pad); static gboolean gst_filesrc_srcpad_event (GstPad *pad, GstEvent *event); static gboolean gst_filesrc_srcpad_query (GstPad *pad, GstPadQueryType type, GstSeekType *format, gint64 *value); @@ -182,13 +182,44 @@ gst_filesrc_bufcmp (gconstpointer a, gconstpointer b) else return 0; } +static const GstEventMask* +gst_filesrc_get_event_mask (GstPad *pad) +{ + static GstEventMask gst_filesrc_event_mask[] = { + { GST_EVENT_SEEK, GST_SEEK_METHOD_CUR | + GST_SEEK_METHOD_SET | + GST_SEEK_METHOD_END | + GST_SEEK_FLAG_FLUSH }, + { GST_EVENT_FLUSH, 0 }, + { GST_EVENT_SIZE, 0 }, + { 0, } + }; + + return gst_filesrc_event_mask; +} + +static const GstPadQueryType* +gst_filesrc_get_query_types (GstPad *pad) +{ + static GstPadQueryType gst_filesrc_query_types[] = { + GST_PAD_QUERY_TOTAL, + GST_PAD_QUERY_POSITION, + 0 + }; + + return gst_filesrc_query_types; +} + static void gst_filesrc_init (GstFileSrc *src) { src->srcpad = gst_pad_new ("src", GST_PAD_SRC); gst_pad_set_get_function (src->srcpad, gst_filesrc_get); gst_pad_set_event_function (src->srcpad, gst_filesrc_srcpad_event); + gst_pad_set_event_mask_function (src->srcpad, gst_filesrc_get_event_mask); gst_pad_set_query_function (src->srcpad, gst_filesrc_srcpad_query); + gst_pad_set_query_type_function (src->srcpad, gst_filesrc_get_query_types); + gst_pad_set_formats_function (src->srcpad, gst_filesrc_get_formats); gst_element_add_pad (GST_ELEMENT (src), src->srcpad); src->pagesize = getpagesize(); @@ -681,6 +712,17 @@ gst_filesrc_change_state (GstElement *element) return GST_STATE_SUCCESS; } +static const GstFormat* +gst_filesrc_get_formats (GstPad *pad) +{ + static const GstFormat gst_filesrc_formats[] = { + GST_FORMAT_BYTES, + 0 + }; + + return gst_filesrc_formats; +} + static gboolean gst_filesrc_srcpad_query (GstPad *pad, GstPadQueryType type, GstFormat *format, gint64 *value) diff --git a/plugins/elements/gsttee.c b/plugins/elements/gsttee.c index e9c37dc401..d886206fb1 100644 --- a/plugins/elements/gsttee.c +++ b/plugins/elements/gsttee.c @@ -137,7 +137,7 @@ gst_tee_sinkconnect (GstPad *pad, GstCaps *caps) GstPad *outpad = GST_PAD (pads->data); pads = g_list_next (pads); - if (GST_PAD_DIRECTION (outpad) != GST_PAD_SRC || !GST_PAD_IS_CONNECTED (outpad)) + if (GST_PAD_DIRECTION (outpad) != GST_PAD_SRC || !GST_PAD_IS_USABLE (outpad)) continue; if (!(gst_pad_try_set_caps (outpad, caps))) { @@ -304,7 +304,7 @@ gst_tee_chain (GstPad *pad, GstBuffer *buf) g_object_notify (G_OBJECT (tee), "last_message"); } - if (GST_PAD_IS_CONNECTED (outpad)) + if (GST_PAD_IS_USABLE (outpad)) gst_pad_push (outpad, buf); else gst_buffer_unref (buf);