From 85d3362e3426775100ac58890709f15bbabd49f3 Mon Sep 17 00:00:00 2001 From: Edgard Lima Date: Tue, 29 Nov 2005 02:55:18 +0000 Subject: libmm ported to 0.9. It works fine, but print some error messages. I'll fix them soon. Tested with mmssrc location=m... Original commit message from CVS: libmm ported to 0.9. It works fine, but print some error messages. I'll fix them soon. Tested with mmssrc location=mms:// ! filesink. --- ext/libmms/Makefile.am | 4 +- ext/libmms/gstmms.c | 230 +++++++++++++++++++++++-------------------------- ext/libmms/gstmms.h | 7 +- 3 files changed, 113 insertions(+), 128 deletions(-) (limited to 'ext/libmms') diff --git a/ext/libmms/Makefile.am b/ext/libmms/Makefile.am index 0a4a68bd..ace85adb 100644 --- a/ext/libmms/Makefile.am +++ b/ext/libmms/Makefile.am @@ -2,8 +2,8 @@ plugin_LTLIBRARIES = libgstmms.la libgstmms_la_SOURCES = gstmms.c -libgstmms_la_CFLAGS = $(GST_CFLAGS) $(LIBMMS_CFLAGS) -libgstmms_la_LIBADD = $(GST_LIBS) $(LIBMMS_LIBS) +libgstmms_la_CFLAGS = $(GST_CFLAGS) $(LIBMMS_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) +libgstmms_la_LIBADD = $(GST_LIBS) $(LIBMMS_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) libgstmms_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) noinst_HEADERS = gstmms.h diff --git a/ext/libmms/gstmms.c b/ext/libmms/gstmms.c index fb514cd4..91bd9d15 100644 --- a/ext/libmms/gstmms.c +++ b/ext/libmms/gstmms.c @@ -52,8 +52,8 @@ static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", ); static void gst_mms_class_init (GstMMSClass * klass); -static void gst_mms_base_init (GstMMSClass * klass); -static void gst_mms_init (GstMMS * mmssrc); +static void gst_mms_base_init (gpointer g_class); +static void gst_mms_init (GstMMS * mmssrc, GstMMSClass * g_class); static void gst_mms_uri_handler_init (gpointer g_iface, gpointer iface_data); @@ -64,14 +64,11 @@ static void gst_mms_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static const GstQueryType *gst_mms_get_query_types (GstPad * pad); -static const GstFormat *gst_mms_get_formats (GstPad * pad); -static gboolean gst_mms_srcpad_query (GstPad * pad, GstQueryType type, - GstFormat * fmt, gint64 * value); -static GstStateChangeReturn gst_mms_change_state (GstElement * elem); +static gboolean gst_mms_src_query (GstPad * pad, GstQuery * query); -static GstData *gst_mms_get (GstPad * pad); -static GstElementClass *parent_class = NULL; +static gboolean gst_mms_start (GstBaseSrc * bsrc); +static GstFlowReturn gst_mms_create (GstPushSrc * psrc, GstBuffer ** buf); static void _urihandler_init (GType mms_type) @@ -84,34 +81,15 @@ _urihandler_init (GType mms_type) g_type_add_interface_static (mms_type, GST_TYPE_URI_HANDLER, &urihandler_info); -} - -GType -gst_mms_get_type (void) -{ - static GType plugin_type = 0; - - if (!plugin_type) { - static const GTypeInfo plugin_info = { - sizeof (GstMMSClass), - (GBaseInitFunc) gst_mms_base_init, - NULL, - (GClassInitFunc) gst_mms_class_init, - NULL, - NULL, - sizeof (GstMMS), - 0, - (GInstanceInitFunc) gst_mms_init, - }; - plugin_type = g_type_register_static (GST_TYPE_ELEMENT, - "GstMMS", &plugin_info, 0); - } - return plugin_type; + GST_DEBUG_CATEGORY_INIT (mmssrc_debug, "mmssrc", 0, "MMS Source Element"); } +GST_BOILERPLATE_FULL (GstMMS, gst_mms, GstPushSrc, GST_TYPE_PUSH_SRC, + _urihandler_init); + static void -gst_mms_base_init (GstMMSClass * klass) +gst_mms_base_init (gpointer g_class) { static GstElementDetails plugin_details = { "MMS streaming protocol support", @@ -119,9 +97,7 @@ gst_mms_base_init (GstMMSClass * klass) "Receive data streamed via MSFT Multi Media Server protocol", "Maciej Katafiasz " }; - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - - GST_DEBUG_CATEGORY_INIT (mmssrc_debug, "mmssrc", 0, "MMS Source Element"); + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&src_factory)); @@ -133,14 +109,15 @@ static void gst_mms_class_init (GstMMSClass * klass) { GObjectClass *gobject_class; - GstElementClass *gstelement_class; + GstBaseSrcClass *gstbasesrc_class; + GstPushSrcClass *gstpushsrc_class; gobject_class = (GObjectClass *) klass; - gstelement_class = (GstElementClass *) klass; - - parent_class = g_type_class_ref (GST_TYPE_ELEMENT); + gstbasesrc_class = (GstBaseSrcClass *) klass; + gstpushsrc_class = (GstPushSrcClass *) klass; - _urihandler_init (GST_TYPE_MMS); + gobject_class->set_property = gst_mms_set_property; + gobject_class->get_property = gst_mms_get_property; g_object_class_install_property (gobject_class, ARG_LOCATION, g_param_spec_string ("location", "location", @@ -153,9 +130,10 @@ gst_mms_class_init (GstMMSClass * klass) "How many bytes should be read at once", 0, 65536, 2048, G_PARAM_READWRITE)); - gobject_class->set_property = gst_mms_set_property; - gobject_class->get_property = gst_mms_get_property; - gstelement_class->change_state = gst_mms_change_state; + gstbasesrc_class->start = gst_mms_start; + + gstpushsrc_class->create = gst_mms_create; + } /* initialize the new element @@ -164,18 +142,13 @@ gst_mms_class_init (GstMMSClass * klass) * initialize structure */ static void -gst_mms_init (GstMMS * mmssrc) +gst_mms_init (GstMMS * mmssrc, GstMMSClass * g_class) { - GstElementClass *klass = GST_ELEMENT_GET_CLASS (mmssrc); + gst_base_src_set_live (GST_BASE_SRC (mmssrc), TRUE); - mmssrc->srcpad = - gst_pad_new_from_template (gst_element_class_get_pad_template (klass, - "src"), "src"); - gst_pad_set_get_function (mmssrc->srcpad, gst_mms_get); - gst_pad_set_query_function (mmssrc->srcpad, gst_mms_srcpad_query); - gst_pad_set_query_type_function (mmssrc->srcpad, gst_mms_get_query_types); - gst_pad_set_formats_function (mmssrc->srcpad, gst_mms_get_formats); - gst_element_add_pad (GST_ELEMENT (mmssrc), mmssrc->srcpad); + gst_pad_set_query_function (GST_BASE_SRC (mmssrc)->srcpad, gst_mms_src_query); + gst_pad_set_query_type_function (GST_BASE_SRC (mmssrc)->srcpad, + gst_mms_get_query_types); mmssrc->uri_name = NULL; mmssrc->connection = NULL; @@ -190,131 +163,145 @@ static const GstQueryType * gst_mms_get_query_types (GstPad * pad) { static const GstQueryType types[] = { - GST_QUERY_TOTAL, GST_QUERY_POSITION, + GST_QUERY_DURATION, 0 }; return types; } -static const GstFormat * -gst_mms_get_formats (GstPad * pad) -{ - static const GstFormat formats[] = { - GST_FORMAT_BYTES, - 0, - }; - - return formats; -} - static gboolean -gst_mms_srcpad_query (GstPad * pad, GstQueryType type, - GstFormat * format, gint64 * value) +gst_mms_src_query (GstPad * pad, GstQuery * query) { + GstMMS *mmssrc = GST_MMS (gst_pad_get_parent (pad)); gboolean res = TRUE; + GstFormat format; + gint64 value; - if (*format != GST_FORMAT_BYTES) - return FALSE; - - switch (type) { - case GST_QUERY_TOTAL: - *value = (gint64) mms_get_length (mmssrc->connection); - break; + switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: - *value = (gint64) mms_get_current_pos (mmssrc->connection); + gst_query_parse_position (query, &format, &value); + if (format != GST_FORMAT_BYTES) { + res = FALSE; + break; + } + value = (gint64) mms_get_current_pos (mmssrc->connection); + gst_query_set_position (query, format, value); + break; + case GST_QUERY_DURATION: + gst_query_parse_duration (query, &format, &value); + if (format != GST_FORMAT_BYTES) { + res = FALSE; + break; + } + value = (gint64) mms_get_length (mmssrc->connection); + gst_query_set_duration (query, format, value); break; default: res = FALSE; break; } + g_object_unref (mmssrc); return res; + } /* get function * this function generates new data when needed */ -static GstData * -gst_mms_get (GstPad * pad) + +static GstFlowReturn +gst_mms_create (GstPushSrc * psrc, GstBuffer ** buf) { GstMMS *mmssrc; - GstBuffer *buf; guint8 *data; gint result; + GstFlowReturn ret = GST_FLOW_OK; /* DEBUG */ GstFormat fmt = GST_FORMAT_BYTES; gint64 query_res; + GstQuery *query; - g_return_val_if_fail (GST_IS_PAD (pad), NULL); + *buf = NULL; + mmssrc = GST_MMS (psrc); + *buf = gst_buffer_new (); - mmssrc = GST_MMS (GST_OBJECT_PARENT (pad)); - g_return_val_if_fail (GST_IS_MMS (mmssrc), NULL); - - buf = gst_buffer_new (); - g_return_val_if_fail (buf, NULL); + if (NULL == *buf) { + ret = GST_FLOW_ERROR; + goto done; + } data = g_malloc0 (mmssrc->blocksize); - GST_BUFFER_DATA (buf) = data; + GST_BUFFER_DATA (*buf) = data; GST_DEBUG ("mms: data: %p\n", data); - g_return_val_if_fail (GST_BUFFER_DATA (buf) != NULL, NULL); - GST_BUFFER_SIZE (buf) = 0; + if (NULL == GST_BUFFER_DATA (*buf)) { + ret = GST_FLOW_ERROR; + gst_buffer_unref (*buf); + *buf = NULL; + goto done; + } + + GST_BUFFER_SIZE (*buf) = 0; GST_DEBUG ("reading %d bytes", mmssrc->blocksize); - result = mms_read (NULL, mmssrc->connection, data, mmssrc->blocksize); - GST_BUFFER_OFFSET (buf) = mms_get_current_pos (mmssrc->connection) - result; - GST_BUFFER_SIZE (buf) = result; + result = + mms_read (NULL, mmssrc->connection, (char *) data, mmssrc->blocksize); + GST_BUFFER_OFFSET (*buf) = mms_get_current_pos (mmssrc->connection) - result; + GST_BUFFER_SIZE (*buf) = result; /* DEBUG */ - gst_pad_query (gst_element_get_pad (GST_ELEMENT (mmssrc), "src"), - GST_QUERY_POSITION, &fmt, &query_res); + query = gst_query_new_position (GST_QUERY_POSITION); + gst_pad_query (GST_BASE_SRC (mmssrc)->srcpad, query); + gst_query_parse_position (query, &fmt, &query_res); + gst_query_unref (query); GST_DEBUG ("mms position: %lld\n", query_res); + /* EOS? */ if (result == 0) { - gst_buffer_unref (buf); + gst_buffer_unref (*buf); + *buf = NULL; GST_DEBUG ("Returning EOS"); - gst_element_set_eos (GST_ELEMENT (mmssrc)); - return GST_DATA (gst_event_new (GST_EVENT_EOS)); + if (!gst_pad_send_event (GST_BASE_SRC (mmssrc)->srcpad, + gst_event_new_eos ())) { + ret = GST_FLOW_ERROR; + goto done; + } } - return GST_DATA (buf); +done: + + return ret; } -static GstStateChangeReturn -gst_mms_change_state (GstElement * elem) +static gboolean +gst_mms_start (GstBaseSrc * bsrc) { - GstMMS *mms = GST_MMS (elem); + GstMMS *mms; + gboolean ret = TRUE; - switch (GST_STATE_TRANSITION (elem)) { - case GST_STATE_CHANGE_NULL_TO_READY: - break; - case GST_STATE_CHANGE_READY_TO_NULL: - break; - case GST_STATE_CHANGE_READY_TO_PAUSED: - if (!mms->uri_name) - return GST_STATE_CHANGE_FAILURE; - /* FIXME: pass some sane arguments here */ - mms->connection = mms_connect (NULL, NULL, mms->uri_name, 128 * 1024); - if (!mms->connection) { - return GST_STATE_CHANGE_FAILURE; - } - break; - case GST_STATE_CHANGE_PAUSED_TO_PLAYING: - break; - default: - break; + mms = GST_MMS (bsrc); + + if (!mms->uri_name) { + ret = FALSE; + goto done; + } + /* FIXME: pass some sane arguments here */ + mms->connection = mms_connect (NULL, NULL, mms->uri_name, 128 * 1024); + if (!mms->connection) { + ret = FALSE; + goto done; } - if (GST_ELEMENT_CLASS (parent_class)->change_state) - return GST_ELEMENT_CLASS (parent_class)->change_state (elem); +done: + return ret; - return GST_STATE_CHANGE_SUCCESS; } static void @@ -323,7 +310,6 @@ gst_mms_set_property (GObject * object, guint prop_id, { GstMMS *mmssrc; - g_return_if_fail (GST_IS_MMS (object)); mmssrc = GST_MMS (object); switch (prop_id) { @@ -345,7 +331,6 @@ gst_mms_get_property (GObject * object, guint prop_id, { GstMMS *mmssrc; - g_return_if_fail (GST_IS_MMS (object)); mmssrc = GST_MMS (object); switch (prop_id) { @@ -389,6 +374,7 @@ gst_mms_uri_get_protocols (void) static const gchar * gst_mms_uri_get_uri (GstURIHandler * handler) { + GstMMS *src = GST_MMS (handler); return src->uri_name; diff --git a/ext/libmms/gstmms.h b/ext/libmms/gstmms.h index 13954f14..114390d1 100644 --- a/ext/libmms/gstmms.h +++ b/ext/libmms/gstmms.h @@ -7,6 +7,7 @@ #include #include +#include G_BEGIN_DECLS @@ -27,9 +28,7 @@ typedef struct _GstMMSClass GstMMSClass; struct _GstMMS { - GstElement element; - - GstPad *srcpad; + GstPushSrc parent; gchar *uri_name; gpointer connection; @@ -38,7 +37,7 @@ struct _GstMMS struct _GstMMSClass { - GstElementClass parent_class; + GstPushSrcClass parent_class; }; GType gst_mms_get_type (void); -- cgit v1.2.1