summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-10-06 11:30:14 +0200
committerLars Knoll <lars.knoll@qt.io>2021-10-12 14:00:41 +0200
commit9bb626d19f001ab7cf7719555f80ffe9837cd6b9 (patch)
treef5ff9c2e45de61d421b9b0503f7b7880dd89ef1f
parent839cb46628b197d0a851c78d518186881e047272 (diff)
Properly detect whether a stream is seekable
Don't make assumptions about the gstreamer source element, the rtspsrc is for example not a regular GstBaseSrc. Instead use a query on the pipeline to determine whether our stream is seekable. Fixes: QTBUG-97121 Change-Id: I935ea9fe399172a26b0fef6879d491cadadc47f3 Reviewed-by: Piotr Srebrny <piotr.srebrny@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp15
-rw-r--r--src/multimedia/playback/qmediaplayer.cpp3
2 files changed, 13 insertions, 5 deletions
diff --git a/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp b/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp
index 6ebfb703b..999d3ba19 100644
--- a/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp
+++ b/src/multimedia/platform/gstreamer/common/qgstreamermediaplayer.cpp
@@ -357,6 +357,17 @@ bool QGstreamerMediaPlayer::processBusMessage(const QGstreamerMessage &message)
emit tracksChanged();
mediaStatusChanged(QMediaPlayer::LoadedMedia);
+
+ GstQuery *query = gst_query_new_seeking(GST_FORMAT_TIME);
+ gboolean canSeek = false;
+ if (gst_element_query(playerPipeline.element(), query)) {
+ gst_query_parse_seeking(query, NULL, &canSeek, nullptr, nullptr);
+ qCDebug(qLcMediaPlayer) << " pipeline is seekable:" << canSeek;
+ } else {
+ qCDebug(qLcMediaPlayer) << " query for seekable failed.";
+ }
+ gst_query_unref(query);
+ seekableChanged(canSeek);
}
break;
@@ -620,10 +631,6 @@ void QGstreamerMediaPlayer::uridecodebinElementAddedCallback(GstElement */*uride
if (G_OBJECT_TYPE(child) == that->decodebinType) {
qCDebug(qLcMediaPlayer) << " -> setting post-stream-topology property";
c.set("post-stream-topology", true);
- } else if (!qstrcmp(gst_element_get_name(child), "source")) {
- GstBaseSrc *src = GST_BASE_SRC(child);
- bool seekable = src && GST_BASE_SRC_GET_CLASS(src)->is_seekable(src);
- that->seekableChanged(seekable);
}
}
diff --git a/src/multimedia/playback/qmediaplayer.cpp b/src/multimedia/playback/qmediaplayer.cpp
index 382743d48..69adcc485 100644
--- a/src/multimedia/playback/qmediaplayer.cpp
+++ b/src/multimedia/playback/qmediaplayer.cpp
@@ -597,7 +597,8 @@ void QMediaPlayer::setPosition(qint64 position)
if (d->control == nullptr)
return;
-
+ if (!d->control->isSeekable())
+ return;
d->control->setPosition(qMax(position, 0ll));
}