diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-10-06 11:30:14 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-11-02 14:36:59 +0100 |
commit | 4a0c04b1539089d041875662ce46728d2a8796f5 (patch) | |
tree | 4db639920b6acd8806b04ab7a1503bc7a2a1e859 | |
parent | dd86a8ba5cf7c349eabd212d02a45fa8012698cf (diff) | |
download | qtmultimedia-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.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 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)); } |