[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gstreamer-cvs
Subject:    gstreamer: baseparse: answer position query in stream time and try
From:       tpm () kemper ! freedesktop ! org (Tim Müller)
Date:       2011-09-30 14:28:48
Message-ID: 20110930142848.E281410009 () kemper ! freedesktop ! org
[Download RAW message or body]

Module: gstreamer
Branch: master
Commit: f94701261aeba3a9eaa9abee5ff644bcc627fa15
URL:    http://cgit.freedesktop.org/gstreamer/gstreamer/commit/?id=f94701261aeba3a9eaa9abee5ff644bcc627fa15


Author: Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Date:   Mon Sep 26 13:14:42 2011 +0100

baseparse: answer position query in stream time and try upstream first

Let the demuxer have first say as well.

https://bugzilla.gnome.org/show_bug.cgi?id=659485

---

 libs/gst/base/gstbaseparse.c |   34 ++++++++++++++++++----------------
 1 files changed, 18 insertions(+), 16 deletions(-)

diff --git a/libs/gst/base/gstbaseparse.c b/libs/gst/base/gstbaseparse.c
index 67e380a..f95c3aa 100644
--- a/libs/gst/base/gstbaseparse.c
+++ b/libs/gst/base/gstbaseparse.c
@@ -3148,22 +3148,24 @@ gst_base_parse_query (GstPad * pad, GstQuery * query)
       GST_DEBUG_OBJECT (parse, "position query");
       gst_query_parse_position (query, &format, NULL);
 
-      GST_OBJECT_LOCK (parse);
-      if (format == GST_FORMAT_BYTES) {
-        dest_value = parse->priv->offset;
-        res = TRUE;
-      } else if (format == parse->segment.format &&
-          GST_CLOCK_TIME_IS_VALID (parse->segment.last_stop)) {
-        dest_value = parse->segment.last_stop;
-        res = TRUE;
-      }
-      GST_OBJECT_UNLOCK (parse);
-
-      if (res)
-        gst_query_set_position (query, format, dest_value);
-      else {
-        res = gst_pad_query_default (pad, query);
-        if (!res) {
+      /* try upstream first */
+      res = gst_pad_query_default (pad, query);
+      if (!res) {
+        /* Fall back on interpreting segment */
+        GST_OBJECT_LOCK (parse);
+        if (format == GST_FORMAT_BYTES) {
+          dest_value = parse->priv->offset;
+          res = TRUE;
+        } else if (format == parse->segment.format &&
+            GST_CLOCK_TIME_IS_VALID (parse->segment.last_stop)) {
+          dest_value = gst_segment_to_stream_time (&parse->segment,
+              parse->segment.format, parse->segment.last_stop);
+          res = TRUE;
+        }
+        GST_OBJECT_UNLOCK (parse);
+        if (res)
+          gst_query_set_position (query, format, dest_value);
+        else {
           /* no precise result, upstream no idea either, then best estimate */
           /* priv->offset is updated in both PUSH/PULL modes */
           res = gst_base_parse_convert (parse,

_______________________________________________
gstreamer-commits mailing list
gstreamer-commits@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/gstreamer-commits


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic