From 3ec401708043984d8f31c275abbed16162d87f84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Fri, 15 Dec 2006 18:25:17 +0000 Subject: [PATCH] gst/realmedia/rmdemux.c: Implement SEEKING query, make query function thread-safe. Original commit message from CVS: * gst/realmedia/rmdemux.c: (gst_rmdemux_src_query), (gst_rmdemux_src_query_types): Implement SEEKING query, make query function thread-safe. --- ChangeLog | 6 ++++++ gst/realmedia/rmdemux.c | 44 +++++++++++++++++++++++++++++++---------- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index e650405498..a25fd6b5bb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2006-12-15 Tim-Philipp Müller + + * gst/realmedia/rmdemux.c: (gst_rmdemux_src_query), + (gst_rmdemux_src_query_types): + Implement SEEKING query, make query function thread-safe. + 2006-12-15 Tim-Philipp Müller * gst/realmedia/rmdemux.c: (gst_rmdemux_descramble_dnet_audio): diff --git a/gst/realmedia/rmdemux.c b/gst/realmedia/rmdemux.c index 982f1e9a79..21155c2aa2 100644 --- a/gst/realmedia/rmdemux.c +++ b/gst/realmedia/rmdemux.c @@ -608,29 +608,52 @@ error: static gboolean gst_rmdemux_src_query (GstPad * pad, GstQuery * query) { - gboolean res = TRUE; + gboolean res = FALSE; GstRMDemux *rmdemux; - rmdemux = GST_RMDEMUX (GST_PAD_PARENT (pad)); + rmdemux = GST_RMDEMUX (gst_pad_get_parent (pad)); switch (GST_QUERY_TYPE (query)) { case GST_QUERY_POSITION: - GST_DEBUG_OBJECT (rmdemux, "src_query position"); - gst_query_set_position (query, GST_FORMAT_TIME, -1); GST_DEBUG_OBJECT (rmdemux, "Position query: no idea from demuxer!"); - res = FALSE; break; - case GST_QUERY_DURATION: - GST_DEBUG_OBJECT (rmdemux, "src_query duration"); - gst_query_set_duration (query, GST_FORMAT_TIME, rmdemux->duration); - GST_DEBUG_OBJECT (rmdemux, "duration set to %" G_GINT64_FORMAT, - rmdemux->duration); + case GST_QUERY_DURATION:{ + GstFormat fmt; + + gst_query_parse_duration (query, &fmt, NULL); + if (fmt == GST_FORMAT_TIME) { + GST_OBJECT_LOCK (rmdemux); + if (G_LIKELY (rmdemux->running)) { + gst_query_set_duration (query, GST_FORMAT_TIME, rmdemux->duration); + GST_DEBUG_OBJECT (rmdemux, "duration set to %" GST_TIME_FORMAT, + GST_TIME_ARGS (rmdemux->duration)); + res = TRUE; + } + GST_OBJECT_UNLOCK (rmdemux); + } break; + } + case GST_QUERY_SEEKING:{ + GstFormat fmt; + + gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL); + if (fmt == GST_FORMAT_TIME) { + GST_OBJECT_LOCK (rmdemux); + if (G_LIKELY (rmdemux->running)) { + gst_query_set_seeking (query, GST_FORMAT_TIME, rmdemux->seekable, + 0, rmdemux->duration); + res = TRUE; + } + GST_OBJECT_UNLOCK (rmdemux); + } + break; + } default: res = gst_pad_query_default (pad, query); break; } + gst_object_unref (rmdemux); return res; } @@ -640,6 +663,7 @@ gst_rmdemux_src_query_types (GstPad * pad) static const GstQueryType query_types[] = { GST_QUERY_POSITION, GST_QUERY_DURATION, + GST_QUERY_SEEKING, 0 };