diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-10-06 11:30:14 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-10-12 14:00:41 +0200 |
commit | 9bb626d19f001ab7cf7719555f80ffe9837cd6b9 (patch) | |
tree | f5ff9c2e45de61d421b9b0503f7b7880dd89ef1f | |
parent | 839cb46628b197d0a851c78d518186881e047272 (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.cpp | 15 | ||||
-rw-r--r-- | src/multimedia/playback/qmediaplayer.cpp | 3 |
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)); } |