From 85d3362e3426775100ac58890709f15bbabd49f3 Mon Sep 17 00:00:00 2001 From: Edgard Lima Date: Tue, 29 Nov 2005 02:55:18 +0000 Subject: [PATCH] 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. --- ChangeLog | 11 ++ PORTED_09 | 1 + common | 2 +- configure.ac | 9 ++ ext/Makefile.am | 9 +- ext/libmms/Makefile.am | 4 +- ext/libmms/gstmms.c | 230 +++++++++++++++++++---------------------- ext/libmms/gstmms.h | 7 +- 8 files changed, 140 insertions(+), 133 deletions(-) diff --git a/ChangeLog b/ChangeLog index 73897bfd99..d2a10050c4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2005-11-28 Edgard Lima + + * PORTED_09: + * configure.ac: + * ext/Makefile.am: + * ext/libmms/Makefile.am: + * ext/libmms/gstmms.c: + * ext/libmms/gstmms.h: + libmm ported to 0.9. It works fine, but print some error messages. I + ll fix them soon. Tested with mmssrc location=mms:// ! filesink. + 2005-11-28 Edward Hervey * ext/faad/gstfaad.c: (gst_faad_srcgetcaps): diff --git a/PORTED_09 b/PORTED_09 index 52de38f4fe..b9bdd8ab7b 100644 --- a/PORTED_09 +++ b/PORTED_09 @@ -1,6 +1,7 @@ When porting a plugin start with 0.8 CVS head, not the old code in this module. There are many bugfixes which have gone into 0.8 which you want to keep. List of ported plugins (update when you commit a ported plugin): +libmms (alima) wavpack (alima) musepack (alima) ivorbis (alima) diff --git a/common b/common index f31468e933..33084fbe05 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit f31468e933b5b980398cf636a37abf16ca46c4a0 +Subproject commit 33084fbe0531733bc02aa1d9de608206d5553a15 diff --git a/configure.ac b/configure.ac index ce1fcea5bc..eb9ad1f584 100644 --- a/configure.ac +++ b/configure.ac @@ -411,6 +411,14 @@ GST_CHECK_FEATURE(MUSEPACK, [musepackdec], musepack, [ AC_LANG_C ]) +dnl *** libmms *** +translit(dnm, m, l) AM_CONDITIONAL(USE_LIBMMS, true) +GST_CHECK_FEATURE(LIBMMS, [mms protocol library], libmms, [ + dnl check with pkg-config first + PKG_CHECK_MODULES(LIBMMS, libmms >= 0.1, HAVE_LIBMMS="yes", HAVE_LIBMMS="no") +]) +AC_SUBST(LIBMMS_LIBS) + dnl *** SDL *** translit(dnm, m, l) AM_CONDITIONAL(USE_SDL, true) @@ -530,6 +538,7 @@ ext/faad/Makefile ext/wavpack/Makefile ext/ivorbis/Makefile ext/gsm/Makefile +ext/libmms/Makefile ext/musepack/Makefile ext/sdl/Makefile docs/Makefile diff --git a/ext/Makefile.am b/ext/Makefile.am index 16d56191bc..716b687ed3 100644 --- a/ext/Makefile.am +++ b/ext/Makefile.am @@ -106,11 +106,11 @@ LCS_DIR= LIBFAME_DIR= # endif -# if USE_LIBMMS -# LIBMMS_DIR=libmms -# else +if USE_LIBMMS +LIBMMS_DIR=libmms +else LIBMMS_DIR= -# endif +endif # if USE_MPEG2ENC # MPEG2ENC_DIR=mpeg2enc @@ -236,6 +236,7 @@ DIST_SUBDIRS= \ faad \ gsm \ ivorbis \ + libmms \ musepack \ sdl \ wavpack diff --git a/ext/libmms/Makefile.am b/ext/libmms/Makefile.am index 0a4a68bde2..ace85adb52 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 fb514cd41d..91bd9d15cd 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); + + GST_DEBUG_CATEGORY_INIT (mmssrc_debug, "mmssrc", 0, "MMS Source Element"); } - -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_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; + gstbasesrc_class = (GstBaseSrcClass *) klass; + gstpushsrc_class = (GstPushSrcClass *) klass; - parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - - _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 13954f145a..114390d1ba 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);