From 479a3bab18276197fbf6a21359c549706f7e3b6e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 3 Jun 2016 09:54:53 +0300 Subject: [PATCH] dvdemux: Implement SEEKING query so we can actually seek if upstream can't seek in TIME https://bugzilla.gnome.org/show_bug.cgi?id=767157 --- ext/dv/gstdvdemux.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/ext/dv/gstdvdemux.c b/ext/dv/gstdvdemux.c index 5ef4f63..3ac61b7 100644 --- a/ext/dv/gstdvdemux.c +++ b/ext/dv/gstdvdemux.c @@ -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; -- 2.7.4