summaryrefslogtreecommitdiffstats
path: root/ext/libmms
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 /ext/libmms
parent07e2ec5f9574095e71c2208779c719574bb135ab (diff)
downloadgst-plugins-bad-85d3362e3426775100ac58890709f15bbabd49f3.tar.gz
gst-plugins-bad-85d3362e3426775100ac58890709f15bbabd49f3.tar.bz2
gst-plugins-bad-85d3362e3426775100ac58890709f15bbabd49f3.zip
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.
Diffstat (limited to 'ext/libmms')
-rw-r--r--ext/libmms/Makefile.am4
-rw-r--r--ext/libmms/gstmms.c230
-rw-r--r--ext/libmms/gstmms.h7
3 files changed, 113 insertions, 128 deletions
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 <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 13954f14..114390d1 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);