summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdgard Lima <edgard.lima@indt.org.br>2005-11-29 02:55:18 +0000
committerEdgard Lima <edgard.lima@indt.org.br>2005-11-29 02:55:18 +0000
commit85d3362e3426775100ac58890709f15bbabd49f3 (patch)
tree34653e7583b158734fbe4f8b7244185758b72197
parent07e2ec5f9574095e71c2208779c719574bb135ab (diff)
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.
-rw-r--r--ChangeLog11
-rw-r--r--PORTED_091
m---------common0
-rw-r--r--configure.ac9
-rw-r--r--ext/Makefile.am9
-rw-r--r--ext/libmms/Makefile.am4
-rw-r--r--ext/libmms/gstmms.c230
-rw-r--r--ext/libmms/gstmms.h7
8 files changed, 139 insertions, 132 deletions
diff --git a/ChangeLog b/ChangeLog
index 73897bfd99..d2a10050c4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2005-11-28 Edgard Lima <edgard.lima@indt.org.br>
+
+ * 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 <edward@fluendo.com>
* 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
-Subproject f31468e933b5b980398cf636a37abf16ca46c4a
+Subproject 33084fbe0531733bc02aa1d9de608206d5553a1
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);
-}
-
-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 <mathrick@users.sourceforge.net>"
};
- 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 13954f145a..114390d1ba 100644
--- a/ext/libmms/gstmms.h
+++ b/ext/libmms/gstmms.h
@@ -7,6 +7,7 @@
#include <gst/gst.h>
#include <libmms/mms.h>
+#include <gst/base/gstpushsrc.h>
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);