58 Q_DISABLE_COPY(QQuickVideoOutput)
59 Q_PROPERTY(FillMode fillMode READ fillMode WRITE setFillMode NOTIFY fillModeChanged)
60 Q_PROPERTY(EndOfStreamPolicy endOfStreamPolicy READ endOfStreamPolicy WRITE setEndOfStreamPolicy
61 NOTIFY endOfStreamPolicyChanged REVISION(6, 9))
62 Q_PROPERTY(
int orientation READ orientation WRITE setOrientation NOTIFY orientationChanged)
63 Q_PROPERTY(
bool mirrored READ mirrored WRITE setMirrored NOTIFY mirroredChanged REVISION(6, 9))
64 Q_PROPERTY(QRectF sourceRect READ sourceRect NOTIFY sourceRectChanged)
65 Q_PROPERTY(QRectF contentRect READ contentRect NOTIFY contentRectChanged)
66 Q_PROPERTY(QVideoSink* videoSink READ videoSink CONSTANT)
67 Q_MOC_INCLUDE(qvideosink.h)
68 Q_MOC_INCLUDE(qvideoframe.h)
69 QML_NAMED_ELEMENT(VideoOutput)
75 Stretch = Qt::IgnoreAspectRatio,
76 PreserveAspectFit = Qt::KeepAspectRatio,
77 PreserveAspectCrop = Qt::KeepAspectRatioByExpanding
81 enum EndOfStreamPolicy
86 Q_ENUM(EndOfStreamPolicy)
88 QQuickVideoOutput(QQuickItem *parent = 0);
89 ~QQuickVideoOutput() override;
91 Q_INVOKABLE QVideoSink *videoSink()
const;
93 FillMode fillMode()
const;
94 void setFillMode(FillMode mode);
96 int orientation()
const;
97 void setOrientation(
int);
99 bool mirrored()
const;
100 void setMirrored(
bool);
102 QRectF sourceRect()
const;
103 QRectF contentRect()
const;
105 EndOfStreamPolicy endOfStreamPolicy()
const;
106 void setEndOfStreamPolicy(EndOfStreamPolicy policy);
108 Q_REVISION(6, 9) Q_INVOKABLE
void clearOutput();
111 void sourceChanged();
112 void fillModeChanged(QQuickVideoOutput::FillMode);
113 void orientationChanged();
114 void mirroredChanged();
115 void sourceRectChanged();
116 void contentRectChanged();
117 void endOfStreamPolicyChanged(QQuickVideoOutput::EndOfStreamPolicy);
120 QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *) override;
121 void itemChange(ItemChange change,
const ItemChangeData &changeData) override;
122 void geometryChange(
const QRectF &newGeometry,
const QRectF &oldGeometry) override;
123 void releaseResources() override;
126 QSize nativeSize()
const;
127 void updateGeometry();
128 QRectF adjustedViewport()
const;
130 void setFrame(
const QVideoFrame &frame);
132 void initRhiForSink();
133 void updateHdr(QSGVideoNode *videoNode);
134 void disconnectWindowConnections();
137 void _q_newFrame(QSize);
138 void _q_updateGeometry();
143 bool m_geometryDirty =
true;
145 QRectF m_contentRect;
146 int m_orientation = 0;
147 bool m_mirrored =
false;
148 QtVideo::Rotation m_frameDisplayingRotation = QtVideo::Rotation::None;
149 Qt::AspectRatioMode m_aspectRatioMode = Qt::KeepAspectRatio;
151 QPointer<QQuickWindow> m_window;
152 QVideoSink *m_sink =
nullptr;
153 QVideoFrameFormat m_videoFormat;
155 QVideoFrameTexturePoolWPtr m_texturePool;
157 bool m_frameChanged =
false;
159 QRectF m_renderedRect;
160 QRectF m_sourceTextureRect;
162 EndOfStreamPolicy m_endOfStreamPolicy = ClearOutput;
164 struct DestructorGuard
167 bool m_isAlive{
true };
169 template <
typename Functor>
170 void runWhileAlive(Functor &&f)
172 QMutexLocker lock(&m_mutex);
178 std::shared_ptr<DestructorGuard> m_destructorGuard = std::make_shared<DestructorGuard>();
180 template <
typename Functor>
181 auto makeGuardedCall(Functor &&f)
183 return [f = std::forward<Functor>(f), guard = m_destructorGuard](
auto... params) {
184 if (g_signalBackoff) {
186 std::this_thread::sleep_for(*g_signalBackoff);
189 guard->runWhileAlive([&] {
196 static std::optional<std::chrono::nanoseconds> g_signalBackoff;
199 static void setSignalBackoff(std::optional<std::chrono::nanoseconds>);