diff -r 76b9c97faada -r 5ee8c970d982 gmyth-stream/gmemcoder/src/gmencoder.c --- a/gmyth-stream/gmemcoder/src/gmencoder.c Tue May 15 20:16:26 2007 +0100 +++ b/gmyth-stream/gmemcoder/src/gmencoder.c Wed May 16 18:47:09 2007 +0100 @@ -40,6 +40,7 @@ GstElement *abin; GstElement *vbin; GstElement *sink; + GstElement *src; gboolean ready; SetupInfo *info; GstClockTime videot; @@ -47,6 +48,7 @@ gint fd; gint sources; gint tick_id; + gint64 duration; }; enum { @@ -238,8 +240,6 @@ GstElement *ret; int i; - g_debug ("Creating element: %s", factory_name); - ret = gst_element_factory_make (factory_name, element_name); if (ret == NULL) return NULL; @@ -521,6 +521,8 @@ if (src == NULL) return FALSE; + priv->src = gst_bin_get_by_name (GST_BIN (src), "src"); + gst_bin_add (GST_BIN (priv->pipe), src); #ifdef SUPPORT_MULT_INPUT @@ -802,12 +804,12 @@ _create_source (const gchar* uri) { - GstElement *bsrc; - GstElement *src; - GstElement *aqueue; - GstElement *vqueue; - GstElement *decode; - GstPad *src_pad; + GstElement *bsrc = NULL; + GstElement *src = NULL; + GstElement *aqueue = NULL; + GstElement *vqueue = NULL; + GstElement *decode = NULL; + GstPad *src_pad = NULL; bsrc = gst_bin_new (NULL); @@ -949,7 +951,15 @@ priv->ready = FALSE; g_signal_emit (user_data, g_mencoder_signals[EOS], 0); break; - + case GST_MESSAGE_DURATION: + { + GstFormat format; + gint64 duration; + gst_message_parse_duration (msg, &format, &duration); + if (format == GST_FORMAT_BYTES) + priv->duration = duration; + break; + } default: { break; @@ -1004,15 +1014,20 @@ static gboolean _tick_cb (gpointer user_data) { - GstFormat format = GST_FORMAT_TIME; + GstFormat format = GST_FORMAT_BYTES; gint64 cur = 0; - gint64 duration = 0; GMencoderPrivate *priv = G_MENCODER_GET_PRIVATE (user_data); - if (gst_element_query_duration (priv->pipe, &format, &duration)) { - gst_element_query_position (priv->pipe, &format, &cur); - g_print ("PROGRESS:%lli%\n", (100 * cur) / duration); + if (priv->duration == 0) { + gint64 d = 0; + if (gst_element_query_duration (priv->src, &format, &d)) + priv->duration = d; + } + + if (priv->duration != 0) { + gst_element_query_position (priv->src, &format, &cur); + g_print ("PROGRESS:%lli\n", (99 * cur) / priv->duration); } return TRUE;