diff --git a/ChangeLog b/ChangeLog index de49e9718f..812f0fba3f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2005-12-11 Edgard Lima + + * configure.ac: + * ext/libmms/gstmms.c: + * ext/libmms/gstmms.h: + Added suport to mmsh. There's still a sucks msg "ERROR: Pipeline cant + PREROOL..." to be fixed. + 2005-12-09 Jan Schmidt * ext/faad/gstfaad.c: (gst_faad_chanpos_to_gst), diff --git a/configure.ac b/configure.ac index c895edb319..3006c255ad 100644 --- a/configure.ac +++ b/configure.ac @@ -408,7 +408,7 @@ 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") + PKG_CHECK_MODULES(LIBMMS, libmms >= 0.2, HAVE_LIBMMS="yes", HAVE_LIBMMS="no") ]) AC_SUBST(LIBMMS_LIBS) diff --git a/ext/libmms/gstmms.c b/ext/libmms/gstmms.c index 91bd9d15cd..84a41ece1f 100644 --- a/ext/libmms/gstmms.c +++ b/ext/libmms/gstmms.c @@ -68,6 +68,7 @@ static gboolean gst_mms_src_query (GstPad * pad, GstQuery * query); static gboolean gst_mms_start (GstBaseSrc * bsrc); +static gboolean gst_mms_stop (GstBaseSrc * bsrc); static GstFlowReturn gst_mms_create (GstPushSrc * psrc, GstBuffer ** buf); static void @@ -131,6 +132,7 @@ gst_mms_class_init (GstMMSClass * klass) G_PARAM_READWRITE)); gstbasesrc_class->start = gst_mms_start; + gstbasesrc_class->stop = gst_mms_stop; gstpushsrc_class->create = gst_mms_create; @@ -152,6 +154,7 @@ gst_mms_init (GstMMS * mmssrc, GstMMSClass * g_class) mmssrc->uri_name = NULL; mmssrc->connection = NULL; + mmssrc->connection_h = NULL; mmssrc->blocksize = 2048; } @@ -187,7 +190,11 @@ gst_mms_src_query (GstPad * pad, GstQuery * query) res = FALSE; break; } - value = (gint64) mms_get_current_pos (mmssrc->connection); + if (mmssrc->connection) { + value = (gint64) mms_get_current_pos (mmssrc->connection); + } else { + value = (gint64) mmsh_get_current_pos (mmssrc->connection_h); + } gst_query_set_position (query, format, value); break; case GST_QUERY_DURATION: @@ -196,7 +203,11 @@ gst_mms_src_query (GstPad * pad, GstQuery * query) res = FALSE; break; } - value = (gint64) mms_get_length (mmssrc->connection); + if (mmssrc->connection) { + value = (gint64) mms_get_length (mmssrc->connection); + } else { + value = (gint64) mmsh_get_length (mmssrc->connection_h); + } gst_query_set_duration (query, format, value); break; default: @@ -229,15 +240,14 @@ gst_mms_create (GstPushSrc * psrc, GstBuffer ** buf) *buf = NULL; mmssrc = GST_MMS (psrc); - *buf = gst_buffer_new (); + *buf = gst_buffer_new_and_alloc (mmssrc->blocksize); if (NULL == *buf) { ret = GST_FLOW_ERROR; goto done; } - data = g_malloc0 (mmssrc->blocksize); - GST_BUFFER_DATA (*buf) = data; + data = GST_BUFFER_DATA (*buf); GST_DEBUG ("mms: data: %p\n", data); if (NULL == GST_BUFFER_DATA (*buf)) { @@ -249,11 +259,40 @@ gst_mms_create (GstPushSrc * psrc, GstBuffer ** buf) GST_BUFFER_SIZE (*buf) = 0; GST_DEBUG ("reading %d bytes", mmssrc->blocksize); - 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; + if (mmssrc->connection) { + result = + mms_read (NULL, mmssrc->connection, (char *) data, mmssrc->blocksize); + } else { + result = + mmsh_read (NULL, mmssrc->connection_h, (char *) data, + mmssrc->blocksize); + } + printf ("%d\t", result); + fflush (stdout); + /* EOS? */ + if (result == 0) { + GstPad *peer; + + gst_buffer_unref (*buf); + *buf = NULL; + GST_DEBUG ("Returning EOS"); + peer = gst_pad_get_peer (GST_BASE_SRC_PAD (mmssrc)); + if (!gst_pad_send_event (peer, gst_event_new_eos ())) { + ret = GST_FLOW_ERROR; + } + g_object_unref (peer); + goto done; + } + + if (mmssrc->connection) { + GST_BUFFER_OFFSET (*buf) = + mms_get_current_pos (mmssrc->connection) - result; + } else { + GST_BUFFER_OFFSET (*buf) = + mmsh_get_current_pos (mmssrc->connection_h) - result; + } + GST_BUFFER_SIZE (*buf) = result; /* DEBUG */ query = gst_query_new_position (GST_QUERY_POSITION); @@ -262,19 +301,6 @@ gst_mms_create (GstPushSrc * psrc, GstBuffer ** buf) gst_query_unref (query); GST_DEBUG ("mms position: %lld\n", query_res); - - /* EOS? */ - if (result == 0) { - gst_buffer_unref (*buf); - *buf = NULL; - GST_DEBUG ("Returning EOS"); - if (!gst_pad_send_event (GST_BASE_SRC (mmssrc)->srcpad, - gst_event_new_eos ())) { - ret = GST_FLOW_ERROR; - goto done; - } - } - done: return ret; @@ -284,7 +310,7 @@ static gboolean gst_mms_start (GstBaseSrc * bsrc) { GstMMS *mms; - gboolean ret = TRUE; + gboolean ret = FALSE; mms = GST_MMS (bsrc); @@ -293,10 +319,17 @@ gst_mms_start (GstBaseSrc * bsrc) goto done; } /* FIXME: pass some sane arguments here */ + gst_mms_stop (bsrc); + mms->connection = mms_connect (NULL, NULL, mms->uri_name, 128 * 1024); - if (!mms->connection) { - ret = FALSE; - goto done; + if (mms->connection) { + ret = TRUE; + } else { + mms->connection_h = mmsh_connect (NULL, NULL, mms->uri_name, 128 * 1024); + if (mms->connection_h) { + ret = TRUE; + } + } done: @@ -304,6 +337,23 @@ done: } +static gboolean +gst_mms_stop (GstBaseSrc * bsrc) +{ + GstMMS *mms; + + mms = GST_MMS (bsrc); + if (mms->connection != NULL) { + mms_close (mms->connection); + mms->connection = NULL; + } + if (mms->connection_h != NULL) { + mmsh_close (mms->connection_h); + mms->connection_h = NULL; + } + return TRUE; +} + static void gst_mms_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) @@ -387,7 +437,7 @@ gst_mms_uri_set_uri (GstURIHandler * handler, const gchar * uri) GstMMS *src = GST_MMS (handler); protocol = gst_uri_get_protocol (uri); - if (strcmp (protocol, "mms") != 0) { + if ((strcmp (protocol, "mms") != 0) && (strcmp (protocol, "mmsh") != 0)) { g_free (protocol); return FALSE; } diff --git a/ext/libmms/gstmms.h b/ext/libmms/gstmms.h index 114390d1ba..c92034bc77 100644 --- a/ext/libmms/gstmms.h +++ b/ext/libmms/gstmms.h @@ -7,6 +7,7 @@ #include #include +#include #include G_BEGIN_DECLS @@ -32,6 +33,7 @@ struct _GstMMS gchar *uri_name; gpointer connection; + gpointer connection_h; gint blocksize; };