From: <en...@ke...> - 2010-12-13 15:04:48
|
Module: gst-plugins-base Branch: master Commit: 4e8956c9f1497ce05ae004fb929bf2c601dc5857 URL: http://cgit.freedesktop.org/gstreamer/gst-plugins-base/commit/?id=4e8956c9f1497ce05ae004fb929bf2c601dc5857 Author: Stefan Kost <en...@us...> Date: Mon Dec 13 16:20:23 2010 +0200 discoverer: query seekability Besides the duration we can also query the seekability of a stream. Use the new API in the gst-discoverer tool. API: gst_discoverer_info_get_seekable --- gst-libs/gst/pbutils/gstdiscoverer-types.c | 11 +++++++++ gst-libs/gst/pbutils/gstdiscoverer.c | 33 ++++++++++++++++++++++++--- gst-libs/gst/pbutils/gstdiscoverer.h | 1 + gst-libs/gst/pbutils/pbutils-private.h | 1 + tools/gst-discoverer.c | 10 +++++--- win32/common/libgstpbutils.def | 1 + 6 files changed, 49 insertions(+), 8 deletions(-) diff --git a/gst-libs/gst/pbutils/gstdiscoverer-types.c b/gst-libs/gst/pbutils/gstdiscoverer-types.c index c027ba4..2a5839b 100644 --- a/gst-libs/gst/pbutils/gstdiscoverer-types.c +++ b/gst-libs/gst/pbutils/gstdiscoverer-types.c @@ -898,6 +898,17 @@ gst_discoverer_info_get_stream_list (GstDiscovererInfo * info) DISCOVERER_INFO_ACCESSOR_CODE (duration, GstClockTime, GST_CLOCK_TIME_NONE); /** + * gst_discoverer_info_get_seekable: + * @info: a #GstDiscovererInfo + * + * Returns: the wheter the URI is seekable. + * + * Since: 0.10.32 + */ + +DISCOVERER_INFO_ACCESSOR_CODE (seekable, gboolean, FALSE); + +/** * gst_discoverer_info_get_misc: * @info: a #GstDiscovererInfo * diff --git a/gst-libs/gst/pbutils/gstdiscoverer.c b/gst-libs/gst/pbutils/gstdiscoverer.c index 6a3aadc..8955136 100644 --- a/gst-libs/gst/pbutils/gstdiscoverer.c +++ b/gst-libs/gst/pbutils/gstdiscoverer.c @@ -105,6 +105,9 @@ struct _GstDiscovererPrivate GMainContext *ctx; guint sourceid; guint timeoutid; + + /* reusable queries */ + GstQuery *seeking_query; }; #define DISCO_LOCK(dc) g_mutex_lock (dc->priv->lock); @@ -242,6 +245,7 @@ static void gst_discoverer_init (GstDiscoverer * dc) { GstElement *tmp; + GstFormat format = GST_FORMAT_TIME; dc->priv = G_TYPE_INSTANCE_GET_PRIVATE (dc, GST_TYPE_DISCOVERER, GstDiscovererPrivate); @@ -284,6 +288,9 @@ gst_discoverer_init (GstDiscoverer * dc) tmp = gst_element_factory_make ("decodebin2", NULL); dc->priv->decodebin2_type = G_OBJECT_TYPE (tmp); gst_object_unref (tmp); + + /* create queries */ + dc->priv->seeking_query = gst_query_new_seeking (format); } static void @@ -322,6 +329,11 @@ gst_discoverer_dispose (GObject * obj) g_mutex_free (dc->priv->lock); dc->priv->lock = NULL; } + + if (dc->priv->seeking_query) { + gst_query_unref (dc->priv->seeking_query); + dc->priv->seeking_query = NULL; + } } static void @@ -859,18 +871,31 @@ discoverer_collect (GstDiscoverer * dc) if (dc->priv->streams) { /* FIXME : Make this querying optional */ if (TRUE) { + GstElement *pipeline = (GstElement *) dc->priv->pipeline; GstFormat format = GST_FORMAT_TIME; gint64 dur; GST_DEBUG ("Attempting to query duration"); - if (gst_element_query_duration ((GstElement *) dc->priv->pipeline, - &format, &dur)) { + if (gst_element_query_duration (pipeline, &format, &dur)) { if (format == GST_FORMAT_TIME) { GST_DEBUG ("Got duration %" GST_TIME_FORMAT, GST_TIME_ARGS (dur)); dc->priv->current_info->duration = (guint64) dur; } } + + if (dc->priv->seeking_query) { + if (gst_element_query (pipeline, dc->priv->seeking_query)) { + gboolean seekable; + + gst_query_parse_seeking (dc->priv->seeking_query, &format, + &seekable, NULL, NULL); + if (format == GST_FORMAT_TIME) { + GST_DEBUG ("Got seekable %d", seekable); + dc->priv->current_info->seekable = seekable; + } + } + } } if (dc->priv->current_topology) @@ -894,8 +919,8 @@ discoverer_collect (GstDiscoverer * dc) gst_caps_get_structure (dc->priv->current_info->stream_info->caps, 0); if (g_str_has_prefix (gst_structure_get_name (st), "image/")) - ((GstDiscovererVideoInfo *) dc->priv->current_info-> - stream_info)->is_image = TRUE; + ((GstDiscovererVideoInfo *) dc->priv->current_info->stream_info)-> + is_image = TRUE; } } diff --git a/gst-libs/gst/pbutils/gstdiscoverer.h b/gst-libs/gst/pbutils/gstdiscoverer.h index 9a80de0..da8eb58 100644 --- a/gst-libs/gst/pbutils/gstdiscoverer.h +++ b/gst-libs/gst/pbutils/gstdiscoverer.h @@ -179,6 +179,7 @@ GstDiscovererResult gst_discoverer_info_get_result(const GstDiscovererInfo GstDiscovererStreamInfo* gst_discoverer_info_get_stream_info(GstDiscovererInfo* info); GList* gst_discoverer_info_get_stream_list(GstDiscovererInfo* info); GstClockTime gst_discoverer_info_get_duration(const GstDiscovererInfo* info); +gboolean gst_discoverer_info_get_seekable(const GstDiscovererInfo* info); const GstStructure* gst_discoverer_info_get_misc(const GstDiscovererInfo* info); const GstTagList* gst_discoverer_info_get_tags(const GstDiscovererInfo* info); diff --git a/gst-libs/gst/pbutils/pbutils-private.h b/gst-libs/gst/pbutils/pbutils-private.h index 04bcd4c..5031df0 100644 --- a/gst-libs/gst/pbutils/pbutils-private.h +++ b/gst-libs/gst/pbutils/pbutils-private.h @@ -78,6 +78,7 @@ struct _GstDiscovererInfo { GstClockTime duration; GstStructure *misc; GstTagList *tags; + gboolean seekable; }; /* missing-plugins.c */ diff --git a/tools/gst-discoverer.c b/tools/gst-discoverer.c index bc25409..bff1b79 100644 --- a/tools/gst-discoverer.c +++ b/tools/gst-discoverer.c @@ -241,10 +241,12 @@ print_topology (GstDiscovererStreamInfo * info, gint depth) } static void -print_duration (GstDiscovererInfo * info, gint tab) +print_properties (GstDiscovererInfo * info, gint tab) { - g_print ("%*s%" GST_TIME_FORMAT "\n", tab + 1, " ", + g_print ("%*sDuration: %" GST_TIME_FORMAT "\n", tab + 1, " ", GST_TIME_ARGS (gst_discoverer_info_get_duration (info))); + g_print ("%*sSeekable: %s\n", tab + 1, " ", + (gst_discoverer_info_get_seekable (info) ? "yes" : "no")); } static void @@ -296,8 +298,8 @@ print_info (GstDiscovererInfo * info, GError * err) if ((sinfo = gst_discoverer_info_get_stream_info (info))) { g_print ("\nTopology:\n"); print_topology (sinfo, 1); - g_print ("\nDuration:\n"); - print_duration (info, 1); + g_print ("\nProperties:\n"); + print_properties (info, 1); gst_discoverer_stream_info_unref (sinfo); } diff --git a/win32/common/libgstpbutils.def b/win32/common/libgstpbutils.def index 5f96c96..34c79dc 100644 --- a/win32/common/libgstpbutils.def +++ b/win32/common/libgstpbutils.def @@ -26,6 +26,7 @@ EXPORTS gst_discoverer_info_get_duration gst_discoverer_info_get_misc gst_discoverer_info_get_result + gst_discoverer_info_get_seekable gst_discoverer_info_get_stream_info gst_discoverer_info_get_stream_list gst_discoverer_info_get_streams |