);
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);
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)
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",
"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));
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",
"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
* 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;
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
{
GstMMS *mmssrc;
- g_return_if_fail (GST_IS_MMS (object));
mmssrc = GST_MMS (object);
switch (prop_id) {
{
GstMMS *mmssrc;
- g_return_if_fail (GST_IS_MMS (object));
mmssrc = GST_MMS (object);
switch (prop_id) {
static const gchar *
gst_mms_uri_get_uri (GstURIHandler * handler)
{
+
GstMMS *src = GST_MMS (handler);
return src->uri_name;