diff options
author | Tim Blechmann <tim@klingt.org> | 2024-05-09 11:32:01 +0800 |
---|---|---|
committer | Tim Blechmann <tim@klingt.org> | 2024-05-11 19:03:45 +0800 |
commit | d52128cb200652391072d501e46f26e63aa6b913 (patch) | |
tree | 7362f3eb0e18025e3c67e50b23245634d1629ff6 | |
parent | adb0db1532d27d275936ceed57bb8f48ffa20b12 (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>
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); |