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>
26#include <common/qgst_bus_observer_p.h>
27#include <common/qgst_discoverer_p.h>
28#include <common/qgst_p.h>
29#include <common/qgstpipeline_p.h>
30#include <common/qgstreamervideosink_p.h>
32#include <gst/play/gstplay.h>
38class QGstreamerMessage;
63 void setMedia(
const QUrl &, QIODevice *)
override;
95 static void sourceSetupCallback(GstElement *uridecodebin, GstElement *source,
97 bool hasMedia()
const;
98 bool hasValidMedia()
const;
100 void updatePositionFromPipeline();
101 void updateBufferProgress(
float);
104 QIODevice *m_stream =
nullptr;
106 enum class ResourceErrorState : uint8_t {
112 ResourceErrorState m_resourceErrorState = ResourceErrorState::NoError;
113 float m_bufferProgress = 0.f;
114 std::chrono::milliseconds m_duration{};
124 void disconnectDecoderHandlers();
127 bool discover(
const QUrl &);
132 bool isCustomSource()
const {
return m_url.scheme() == QStringLiteral(u"gstreamer-pipeline"); }
133 void setMediaCustomSource(
const QUrl &content);
134 void cleanupCustomPipeline();
139 std::unique_ptr<QTimer> positionUpdateTimer;
144 QGstPlayHandle m_gstPlay;
149 QMediaMetaData m_metaData;
150 std::array<std::vector<QMediaMetaData>, 3> m_trackMetaData;
151 std::array<std::vector<QByteArray>, 3> m_trackIDs;
152 std::array<
int, 3> m_activeTrack{};
153 QList<QSize> m_nativeSize;
155 void resetStateForEmptyOrInvalidMedia();
156 void updateNativeSizeOnVideoOutput();
158 void seekToCurrentPosition();
160 std::optional<std::chrono::nanoseconds> m_pendingSeek;
162 int stateChangeToSkip = 0;
164 void updateVideoTrackEnabled();
165 void updateAudioTrackEnabled();
166 void updateSubtitleTrackEnabled();
QGstStructureView at(int index) const
bool syncStateWithParent()
static QGstElement createFromPipelineDescription(const char *)
bool link(const QGstPad &sink) const
QGstCaps queryCaps() 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)
Q_STATIC_LOGGING_CATEGORY(lcAccessibilityCore, "qt.accessibility.core")