summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Blechmann <tim@klingt.org>2024-05-09 11:32:01 +0800
committerTim Blechmann <tim@klingt.org>2024-05-11 19:03:45 +0800
commitd52128cb200652391072d501e46f26e63aa6b913 (patch)
tree7362f3eb0e18025e3c67e50b23245634d1629ff6
parentadb0db1532d27d275936ceed57bb8f48ffa20b12 (diff)
GStreamer: factor detectPipelineIsSeekable out of event handler
Makes pipeline more modular and easier to shuffle code around. Pick-to: 6.5 6.7 Change-Id: I5d7bcbdb013d8987dc8832c8d27b907f33bfadd8 Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgst_handle_types_p.h1
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp29
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer_p.h1
3 files changed, 20 insertions, 11 deletions
diff --git a/src/plugins/multimedia/gstreamer/common/qgst_handle_types_p.h b/src/plugins/multimedia/gstreamer/common/qgst_handle_types_p.h
index 5cbbfaf19..bda9d5683 100644
--- a/src/plugins/multimedia/gstreamer/common/qgst_handle_types_p.h
+++ b/src/plugins/multimedia/gstreamer/common/qgst_handle_types_p.h
@@ -255,6 +255,7 @@ using QGstBufferHandle = QGstImpl::QGstMiniObjectHandleHelper<GstBuffer>::Shared
using QGstContextHandle = QGstImpl::QGstMiniObjectHandleHelper<GstContext>::UniqueHandle;
using QGstGstDateTimeHandle = QGstImpl::QGstMiniObjectHandleHelper<GstDateTime>::SharedHandle;
using QGstPluginFeatureHandle = QGstImpl::QGstHandleHelper<GstPluginFeature>::SharedHandle;
+using QGstQueryHandle = QGstImpl::QGstMiniObjectHandleHelper<GstQuery>::SharedHandle;
#if QT_CONFIG(gstreamer_gl)
using QGstGLContextHandle = QGstImpl::QGstHandleHelper<GstGLContext>::UniqueHandle;
diff --git a/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp b/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp
index 6e3636441..1a9cbaefb 100644
--- a/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp
+++ b/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp
@@ -294,6 +294,23 @@ void QGstreamerMediaPlayer::stopOrEOS(bool eos)
m_initialBufferProgressSent = false;
}
+void QGstreamerMediaPlayer::detectPipelineIsSeekable()
+{
+ qCDebug(qLcMediaPlayer) << "detectPipelineIsSeekable";
+ QGstQueryHandle query{
+ gst_query_new_seeking(GST_FORMAT_TIME),
+ QGstQueryHandle::HasRef,
+ };
+ gboolean canSeek = false;
+ if (gst_element_query(playerPipeline.element(), query.get())) {
+ gst_query_parse_seeking(query.get(), nullptr, &canSeek, nullptr, nullptr);
+ qCDebug(qLcMediaPlayer) << " pipeline is seekable:" << canSeek;
+ } else {
+ qCWarning(qLcMediaPlayer) << " query for seekable failed.";
+ }
+ seekableChanged(canSeek);
+}
+
bool QGstreamerMediaPlayer::processBusMessage(const QGstreamerMessage &message)
{
qCDebug(qLcMediaPlayer) << "received bus message:" << message;
@@ -396,17 +413,7 @@ 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, nullptr, &canSeek, nullptr, nullptr);
- qCDebug(qLcMediaPlayer) << " pipeline is seekable:" << canSeek;
- } else {
- qCDebug(qLcMediaPlayer) << " query for seekable failed.";
- }
- gst_query_unref(query);
- seekableChanged(canSeek);
+ detectPipelineIsSeekable();
if (!playerPipeline.inStoppedState()) {
Q_ASSERT(!m_initialBufferProgressSent);
diff --git a/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer_p.h b/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer_p.h
index 5c33d531f..fbd48d5ea 100644
--- a/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer_p.h
+++ b/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer_p.h
@@ -131,6 +131,7 @@ private:
void removeAllOutputs();
void stopOrEOS(bool eos);
bool canTrackProgress() const { return decodeBinQueues > 0; }
+ void detectPipelineIsSeekable();
std::array<TrackSelector, NTrackTypes> trackSelectors;
TrackSelector &trackSelector(TrackType type);