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.
This commit is contained in:
Edgard Lima 2005-11-29 02:55:18 +00:00
parent 07e2ec5f95
commit 85d3362e34
8 changed files with 140 additions and 133 deletions

View file

@ -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):

View file

@ -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)

2
common

@ -1 +1 @@
Subproject commit f31468e933b5b980398cf636a37abf16ca46c4a0
Subproject commit 33084fbe0531733bc02aa1d9de608206d5553a15

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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 <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;
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;

View file

@ -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);