6#include <QtMultimedia/qvideosink.h>
7#include <QtMultimedia/qvideoframe.h>
8#include <QtMultimedia/qvideoframeformat.h>
10#include <QtCore/qobject.h>
11#include <QtCore/qcoreevent.h>
15class QGraphicsVideoItemPrivate
18 QGraphicsVideoItemPrivate()
19 : rect(0.0, 0.0, 320, 240)
23 QGraphicsVideoItem *q_ptr =
nullptr;
25 QVideoSink *sink =
nullptr;
30 Qt::AspectRatioMode m_aspectRatioMode = Qt::KeepAspectRatio;
34 void _q_present(
const QVideoFrame &);
37void QGraphicsVideoItemPrivate::updateRects()
39 q_ptr->prepareGeometryChange();
42 if (nativeSize.isEmpty())
45 if (m_aspectRatioMode == Qt::KeepAspectRatio) {
46 QSizeF size = nativeSize;
47 size.scale(rect.size(), Qt::KeepAspectRatio);
49 boundingRect = QRectF(0, 0, size.width(), size.height());
50 boundingRect.moveCenter(rect.center());
54void QGraphicsVideoItemPrivate::_q_present(
const QVideoFrame &frame)
57 q_ptr->update(boundingRect);
59 if (frame.isValid()) {
60 const QSize &size = frame.surfaceFormat().viewport().size();
61 if (nativeSize != size) {
65 emit q_ptr->nativeSizeChanged(nativeSize);
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
90
91
92
93
94QGraphicsVideoItem::QGraphicsVideoItem(QGraphicsItem *parent)
95 : QGraphicsObject(parent)
96 , d_ptr(
new QGraphicsVideoItemPrivate)
99 d_ptr->sink =
new QVideoSink(
this);
101 connect(d_ptr->sink, SIGNAL(videoFrameChanged(QVideoFrame)),
102 this, SLOT(_q_present(QVideoFrame)));
106
107
108QGraphicsVideoItem::~QGraphicsVideoItem()
114
115
116
117
118
119
120
121
122
124QVideoSink *QGraphicsVideoItem::videoSink()
const
126 return d_func()->sink;
130
131
132
134Qt::AspectRatioMode QGraphicsVideoItem::aspectRatioMode()
const
136 return d_func()->m_aspectRatioMode;
139void QGraphicsVideoItem::setAspectRatioMode(Qt::AspectRatioMode mode)
141 Q_D(QGraphicsVideoItem);
142 if (d->m_aspectRatioMode == mode)
145 d->m_aspectRatioMode = mode;
150
151
152
153
154
155
157QPointF QGraphicsVideoItem::offset()
const
159 return d_func()->rect.topLeft();
162void QGraphicsVideoItem::setOffset(
const QPointF &offset)
164 Q_D(QGraphicsVideoItem);
166 d->rect.moveTo(offset);
171
172
173
174
175
176
178QSizeF QGraphicsVideoItem::size()
const
180 return d_func()->rect.size();
183void QGraphicsVideoItem::setSize(
const QSizeF &size)
185 Q_D(QGraphicsVideoItem);
187 d->rect.setSize(size.isValid() ? size : QSizeF(0, 0));
192
193
194
196QSizeF QGraphicsVideoItem::nativeSize()
const
198 return d_func()->nativeSize;
202
203
204QRectF QGraphicsVideoItem::boundingRect()
const
206 return d_func()->boundingRect;
210
211
212void QGraphicsVideoItem::paint(QPainter *painter,
const QStyleOptionGraphicsItem *option, QWidget *widget)
214 Q_D(QGraphicsVideoItem);
219 d->m_frame.paint(painter, d->rect, { Qt::transparent, d->m_aspectRatioMode });
223
224
225
226
227
229
230
231
233
234
235
236
237
239
240
241
242
243QVariant QGraphicsVideoItem::itemChange(GraphicsItemChange change,
const QVariant &value)
245 return QGraphicsItem::itemChange(change, value);
249
250
251void QGraphicsVideoItem::timerEvent(QTimerEvent *event)
253 QGraphicsObject::timerEvent(event);
258#include "moc_qgraphicsvideoitem.cpp"