4#ifndef QGSTREAMERMEDIAPLAYER_P_H
5#define QGSTREAMERMEDIAPLAYER_P_H
18#include <QtMultimedia/private/qplatformmediaplayer_p.h>
19#include <QtMultimedia/private/qtmultimediaglobal_p.h>
20#include <QtMultimedia/private/qmultimediautils_p.h>
22#include <QtCore/qelapsedtimer.h>
23#include <QtCore/qtimer.h>
24#include <QtCore/qurl.h>
25#include <QtCore/qfuture.h>
27#include <common/qgst_bus_observer_p.h>
28#include <common/qgst_discoverer_p.h>
29#include <common/qgst_p.h>
30#include <common/qgstpipeline_p.h>
31#include <common/qgstreamervideosink_p.h>
33#include <gst/play/gstplay.h>
39class QGstreamerMessage;
64 void setMedia(
const QUrl &, QIODevice *)
override;
96 static void sourceSetupCallback(GstElement *uridecodebin, GstElement *source,
98 bool hasMedia()
const;
99 bool hasValidMedia()
const;
101 void updatePositionFromPipeline();
102 void updateBufferProgress(
float);
105 QIODevice *m_stream =
nullptr;
107 enum class ResourceErrorState : uint8_t {
113 ResourceErrorState m_resourceErrorState = ResourceErrorState::NoError;
114 float m_bufferProgress = 0.f;
115 std::chrono::milliseconds m_duration{};
125 void disconnectDecoderHandlers();
131 bool isCustomSource()
const {
return m_url.scheme() == QStringLiteral(u"gstreamer-pipeline"); }
132 void setMediaCustomSource(
const QUrl &content);
133 void cleanupCustomPipeline();
138 std::unique_ptr<QTimer> positionUpdateTimer;
143 QGstPlayHandle m_gstPlay;
148 QMediaMetaData m_metaData;
149 std::array<std::vector<QMediaMetaData>, 3> m_trackMetaData;
150 std::array<std::vector<QByteArray>, 3> m_trackIDs;
151 std::array<
int, 3> m_activeTrack{};
152 QList<QSize> m_nativeSize;
154 void resetStateForEmptyOrInvalidMedia();
155 void updateNativeSizeOnVideoOutput();
157 void seekToCurrentPosition();
159 std::optional<std::chrono::nanoseconds> m_pendingSeek;
161 int stateChangeToSkip = 0;
163 void updateVideoTrackEnabled();
164 void updateAudioTrackEnabled();
165 void updateSubtitleTrackEnabled();
171 QFuture<DiscoverResult> discover(QUrl);
172 void handleDiscoverResult(
const DiscoverResult &,
const QUrl &playerUrl);
174 QFuture<DiscoverResult> m_discoverFuture;
175 QFuture<
void> m_discoveryHandler;
176 bool m_hasPendingMedia =
false;
177 std::optional<QMediaPlayer::PlaybackState> m_requestedPlaybackState =
std::
nullopt;
QGstStructureView at(int index) const
bool syncStateWithParent()
static QGstElement createFromPipelineDescription(const char *)
bool link(const QGstPad &sink) const
QGstCaps queryCaps() const
QGString streamId() const
QGstElement gstElement() const
void connectPluggableVideoSink(QGstreamerPluggableVideoSink *pluggableSink)
void disconnectPluggableVideoSink()
void setVideoSink(QGstreamerRelayVideoSink *sink)
QGstreamerRelayVideoSink * gstreamerVideoSink() const
void setNativeSize(QSize)
std::optional< QGstreamerMediaPlayer::TrackType > toTrackType(const QGstCaps &caps)
QT_BEGIN_NAMESPACE Q_STATIC_LOGGING_CATEGORY(lcSynthesizedIterableAccess, "qt.iterable.synthesized", QtWarningMsg)
QGstPlayMessageAdaptor(const QGstreamerMessage &m)