Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qgstreamermediaplayer_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QGSTREAMERMEDIAPLAYER_P_H
5#define QGSTREAMERMEDIAPLAYER_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtCore/qstack.h>
19#include <private/qplatformmediaplayer_p.h>
20#include <private/qtmultimediaglobal_p.h>
21#include <private/qmultimediautils_p.h>
22#include <qurl.h>
23#include <common/qgst_p.h>
25
26#include <QtCore/qtimer.h>
27
28#include <array>
29
31
34class QGstAppSource;
37
42{
43public:
44 static QMaybe<QPlatformMediaPlayer *> create(QMediaPlayer *parent = nullptr);
46
47 qint64 position() const override;
48 qint64 duration() const override;
49
50 float bufferProgress() const override;
51
53
54 qreal playbackRate() const override;
55 void setPlaybackRate(qreal rate) override;
56
57 QUrl media() const override;
58 const QIODevice *mediaStream() const override;
59 void setMedia(const QUrl &, QIODevice *) override;
60
61 bool streamPlaybackSupported() const override { return true; }
62
64
65 QMediaMetaData metaData() const override;
66
67 void setVideoSink(QVideoSink *sink) override;
68
69 int trackCount(TrackType) override;
70 QMediaMetaData trackMetaData(TrackType /*type*/, int /*streamNumber*/) override;
71 int activeTrack(TrackType) override;
72 void setActiveTrack(TrackType, int /*streamNumber*/) override;
73
74 void setPosition(qint64 pos) override;
75
76 void play() override;
77 void pause() override;
78 void stop() override;
79
80 void *nativePipeline() override;
81
82 bool processBusMessage(const QGstreamerMessage& message) override;
83 bool processSyncMessage(const QGstreamerMessage& message) override;
84
86
87private:
88 QGstreamerMediaPlayer(QGstreamerVideoOutput *videoOutput, QGstElement videoInputSelector,
89 QGstElement audioInputSelector, QGstElement subTitleInputSelector,
91
92 struct TrackSelector
93 {
94 TrackSelector(TrackType, QGstElement selector);
95 QGstPad createInputPad();
96 void removeInputPad(QGstPad pad);
97 void removeAllInputPads();
98 QGstPad inputPad(int index);
99 int activeInputIndex() const { return isConnected ? tracks.indexOf(activeInputPad()) : -1; }
100 QGstPad activeInputPad() const
101 {
102 return isConnected ? QGstPad{ selector.getObject("active-pad") } : QGstPad{};
103 }
104 void setActiveInputPad(QGstPad input) { selector.set("active-pad", input); }
105 int trackCount() const { return tracks.count(); }
106
107 QGstElement selector;
109 QList<QGstPad> tracks;
110 bool isConnected = false;
111 };
112
114 void decoderPadAdded(const QGstElement &src, const QGstPad &pad);
115 void decoderPadRemoved(const QGstElement &src, const QGstPad &pad);
116 void disconnectDecoderHandlers();
117 static void uridecodebinElementAddedCallback(GstElement *uridecodebin, GstElement *child,
119 static void sourceSetupCallback(GstElement *uridecodebin, GstElement *source,
121 static void unknownTypeCallback(GstElement *decodebin, GstPad *pad, GstCaps *caps,
123 static void decodebinElementAddedCallback(GstBin *decodebin, GstBin *sub_bin,
124 GstElement *element, QGstreamerMediaPlayer *self);
125 static void decodebinElementRemovedCallback(GstBin *decodebin, GstBin *sub_bin,
126 GstElement *element, QGstreamerMediaPlayer *self);
127
128 void parseStreamsAndMetadata();
129 void connectOutput(TrackSelector &ts);
130 void removeOutput(TrackSelector &ts);
131 void removeDynamicPipelineElements();
132 void removeAllOutputs();
133 void stopOrEOS(bool eos);
134 bool canTrackProgress() const { return decodeBinQueues > 0; }
135 void detectPipelineIsSeekable();
136
137 std::array<TrackSelector, NTrackTypes> trackSelectors;
138 TrackSelector &trackSelector(TrackType type);
139
140 QMediaMetaData m_metaData;
141
142 int m_bufferProgress = 0;
143 QUrl m_url;
144 QIODevice *m_stream = nullptr;
145
146 enum class ResourceErrorState : uint8_t {
147 NoError,
148 ErrorOccurred,
149 ErrorReported,
150 };
151
152 bool prerolling = false;
153 bool m_requiresSeekOnPlay = false;
154 bool m_initialBufferProgressSent = false;
155 ResourceErrorState m_resourceErrorState = ResourceErrorState::NoError;
156 qint64 m_duration = 0;
157 QTimer positionUpdateTimer;
158
159 QGstAppSource *m_appSrc = nullptr;
160
161 QGstStructure topology;
162
163 // Gst elements
164 QGstPipeline playerPipeline;
166 QGstElement decoder;
167
168 QGstreamerAudioOutput *gstAudioOutput = nullptr;
169 QGstreamerVideoOutput *gstVideoOutput = nullptr;
170
171 // QGstElement streamSynchronizer;
172
173 QHash<QByteArray, QGstPad> decoderOutputMap;
174
175 // decoder connections
179 QGObjectHandlerScopedConnection uridecodebinElementAdded;
182 QGObjectHandlerScopedConnection elementRemoved;
183
184 int decodeBinQueues = 0;
185};
186
188
189#endif
QGstObject getObject(const char *property) const
Definition qgst.cpp:646
void set(const char *property, const char *str)
Definition qgst.cpp:538
QUrl media() const override
bool processBusMessage(const QGstreamerMessage &message) override
qreal playbackRate() const override
void setMedia(const QUrl &, QIODevice *) override
qint64 duration() const override
void setPlaybackRate(qreal rate) override
qint64 position() const override
QMediaTimeRange availablePlaybackRanges() const override
void setVideoSink(QVideoSink *sink) override
int trackCount(TrackType) override
float bufferProgress() const override
bool processSyncMessage(const QGstreamerMessage &message) override
QMediaMetaData trackMetaData(TrackType, int) override
void setActiveTrack(TrackType, int) override
void setAudioOutput(QPlatformAudioOutput *output) override
const QIODevice * mediaStream() const override
int activeTrack(TrackType) override
QMediaMetaData metaData() const override
bool streamPlaybackSupported() const override
\inmodule QtCore \reentrant
Definition qiodevice.h:34
qsizetype count() const noexcept
Definition qlist.h:398
\inmodule QtMultimedia
The QMediaPlayer class allows the playing of a media files.
The QMediaTimeRange class represents a set of zero or more disjoint time intervals.
The QNetworkAccessManager class allows the application to send network requests and receive replies.
\inmodule QtCore
Definition qobject.h:103
QObject * parent() const
Returns a pointer to the parent object.
Definition qobject.h:346
void positionChanged(qint64 position)
\inmodule QtCore
Definition qtimer.h:20
\inmodule QtCore
Definition qurl.h:94
The QVideoSink class represents a generic sink for video data.
Definition qvideosink.h:22
Combined button and popup list for selecting options.
n void setPosition(void) \n\
GLuint index
[2]
GLenum src
GLenum type
GLuint GLsizei const GLchar * message
GLsizei GLsizei GLchar * source
GLuint GLenum * rate
GLsizei GLenum GLboolean sink
GLenum GLenum GLenum input
@ NoError
Definition main.cpp:34
long long qint64
Definition qtypes.h:60
double qreal
Definition qtypes.h:187
QT_BEGIN_NAMESPACE typedef uchar * output
QLayoutItem * child
[0]
view create()
qsizetype indexOf(const AT &t, qsizetype from=0) const noexcept
Definition qlist.h:962