summaryrefslogtreecommitdiff
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-11-02 14:36:59 +0100
commit4a0c04b1539089d041875662ce46728d2a8796f5 (patch)
tree4db639920b6acd8806b04ab7a1503bc7a2a1e859
parentdd86a8ba5cf7c349eabd212d02a45fa8012698cf (diff)
downloadqtmultimedia-4a0c04b1539089d041875662ce46728d2a8796f5.tar.gz
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> (cherry picked from commit 9bb626d19f001ab7cf7719555f80ffe9837cd6b9) Reviewed-by: Assam Boudjelthia <assam.boudjelthia@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 f65b6a2a1..5c11d8e81 100644
--- a/src/multimedia/playback/qmediaplayer.cpp
+++ b/src/multimedia/playback/qmediaplayer.cpp
@@ -600,7 +600,8 @@ void QMediaPlayer::setPosition(qint64 position)
if (d->control == nullptr)
return;
-
+ if (!d->control->isSeekable())
+ return;
d->control->setPosition(qMax(position, 0ll));
}