dvdemux: Implement SEEKING query so we can actually seek if upstream can't seek in...
authorSebastian Dröge <sebastian@centricular.com>
Fri, 3 Jun 2016 06:54:53 +0000 (09:54 +0300)
committerSebastian Dröge <sebastian@centricular.com>
Fri, 3 Jun 2016 10:13:20 +0000 (13:13 +0300)
https://bugzilla.gnome.org/show_bug.cgi?id=767157

ext/dv/gstdvdemux.c

index 5ef4f63..3ac61b7 100644 (file)
@@ -637,6 +637,57 @@ gst_dvdemux_src_query (GstPad * pad, GstObject * parent, GstQuery * query)
       gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
       break;
     }
+    case GST_QUERY_SEEKING:
+    {
+      GstFormat fmt;
+      GstQuery *peerquery;
+      gboolean seekable;
+
+      gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL);
+
+      /* We can only handle TIME seeks really */
+      if (fmt != GST_FORMAT_TIME) {
+        gst_query_set_seeking (query, fmt, FALSE, -1, -1);
+        break;
+      }
+
+      /* First ask upstream */
+      if (gst_pad_peer_query (dvdemux->sinkpad, query)) {
+        gst_query_parse_seeking (query, NULL, &seekable, NULL, NULL);
+        if (seekable) {
+          res = TRUE;
+          break;
+        }
+      }
+
+      res = TRUE;
+
+      peerquery = gst_query_new_seeking (GST_FORMAT_BYTES);
+      seekable = gst_pad_peer_query (dvdemux->sinkpad, peerquery);
+
+      if (seekable)
+        gst_query_parse_seeking (peerquery, NULL, &seekable, NULL, NULL);
+      gst_query_unref (peerquery);
+
+      if (seekable) {
+        peerquery = gst_query_new_duration (GST_FORMAT_TIME);
+        seekable = gst_dvdemux_src_query (pad, parent, peerquery);
+
+        if (seekable) {
+          gint64 duration;
+
+          gst_query_parse_duration (peerquery, NULL, &duration);
+          gst_query_set_seeking (query, GST_FORMAT_TIME, seekable, 0, duration);
+        } else {
+          gst_query_set_seeking (query, GST_FORMAT_TIME, FALSE, -1, -1);
+        }
+
+        gst_query_unref (peerquery);
+      } else {
+        gst_query_set_seeking (query, GST_FORMAT_TIME, FALSE, -1, -1);
+      }
+      break;
+    }
     default:
       res = gst_pad_query_default (pad, parent, query);
       break;