summaryrefslogtreecommitdiffstats
path: root/src/multimedia
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-09-06 12:52:02 +0200
committerLars Knoll <lars.knoll@qt.io>2021-09-07 10:55:43 +0200
commit5c88c2f110c94b202554063d81ad696ff29bd307 (patch)
tree3e75bf40f4588cc18d8b2d9272355368cde4b1bf /src/multimedia
parent712efcb4f70352665209198e32abd3ee72e7dffc (diff)
API fix: Give QVideoSink a videoFrame property
Gives a more consistent API with a videoFrameChanged() signal instead of a newVideoFrame() signal. Add setters and getters for videoFrame and subtitleText. Pick-to: 6.2 Change-Id: Ib6bb27b76cbf195dcc83eb00bca080ffd64ef538 Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io> Reviewed-by: Samuel Mira <samuel.mira@qt.io>
Diffstat (limited to 'src/multimedia')
-rw-r--r--src/multimedia/doc/snippets/multimedia-snippets/camera.cpp2
-rw-r--r--src/multimedia/doc/snippets/multimedia-snippets/video.cpp4
-rw-r--r--src/multimedia/doc/src/cameraoverview.qdoc2
-rw-r--r--src/multimedia/platform/android/common/qandroidvideooutput.cpp4
-rw-r--r--src/multimedia/platform/darwin/camera/avfcamerarenderer.mm2
-rw-r--r--src/multimedia/platform/darwin/mediaplayer/avfvideorenderercontrol.mm2
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstvideorenderersink.cpp4
-rw-r--r--src/multimedia/platform/qnx/mediaplayer/mmrendererplayervideorenderercontrol.cpp4
-rw-r--r--src/multimedia/platform/qplatformvideosink_p.h9
-rw-r--r--src/multimedia/platform/windows/evr/evrcustompresenter.cpp2
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsimagecapture.cpp6
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsimagecapture_p.h2
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp2
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h2
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp10
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h4
-rw-r--r--src/multimedia/platform/windows/player/mfvideorenderercontrol.cpp4
-rw-r--r--src/multimedia/video/qvideosink.cpp28
-rw-r--r--src/multimedia/video/qvideosink.h9
-rw-r--r--src/multimedia/video/qvideowindow.cpp4
-rw-r--r--src/multimedia/video/qvideowindow_p.h2
21 files changed, 69 insertions, 39 deletions
diff --git a/src/multimedia/doc/snippets/multimedia-snippets/camera.cpp b/src/multimedia/doc/snippets/multimedia-snippets/camera.cpp
index fa2ca6d25..0abc4062f 100644
--- a/src/multimedia/doc/snippets/multimedia-snippets/camera.cpp
+++ b/src/multimedia/doc/snippets/multimedia-snippets/camera.cpp
@@ -99,7 +99,7 @@ void overview_surface()
camera->setVideoOutput(mySink);
camera->start();
- // MyVideoSink::newVideoFrame(..) will be called with video frames
+ // MyVideoSink::setVideoFrame(..) will be called with video frames
//! [Camera overview surface]
}
diff --git a/src/multimedia/doc/snippets/multimedia-snippets/video.cpp b/src/multimedia/doc/snippets/multimedia-snippets/video.cpp
index 4e29269d8..ac920d858 100644
--- a/src/multimedia/doc/snippets/multimedia-snippets/video.cpp
+++ b/src/multimedia/doc/snippets/multimedia-snippets/video.cpp
@@ -69,7 +69,7 @@ public slots:
void onNewVideoContentReceived(const QVideoFrame &frame)
{
if (m_sink)
- m_sink->newVideoFrame(frame);
+ m_sink->setVideoFrame(frame);
}
private:
@@ -140,7 +140,7 @@ void VideoExample::VideoSurface()
graphicsView->scene()->addItem(item);
graphicsView->show();
QImage img = QImage("images/qt-logo.png").convertToFormat(QImage::Format_ARGB32);
- item->videoSink()->newVideoFrame(QVideoFrame(img));
+ item->videoSink()->setVideoFrame(QVideoFrame(img));
//! [GraphicsVideoItem Surface]
}
diff --git a/src/multimedia/doc/src/cameraoverview.qdoc b/src/multimedia/doc/src/cameraoverview.qdoc
index d738b8d35..87d513eed 100644
--- a/src/multimedia/doc/src/cameraoverview.qdoc
+++ b/src/multimedia/doc/src/cameraoverview.qdoc
@@ -208,7 +208,7 @@ For advanced usage (like processing preview frames as they come, which enables
detection of objects or patterns), you can also use your own QVideoSink and set
that as the videoOutput for the QCamera object. In this case, you will need to
render the viewfinder image yourself by processing the data received from the
-newVideoFrame() signal.
+videoFrameChanged() signal.
\snippet multimedia-snippets/camera.cpp Camera overview surface
diff --git a/src/multimedia/platform/android/common/qandroidvideooutput.cpp b/src/multimedia/platform/android/common/qandroidvideooutput.cpp
index 66fc65150..d0f3203de 100644
--- a/src/multimedia/platform/android/common/qandroidvideooutput.cpp
+++ b/src/multimedia/platform/android/common/qandroidvideooutput.cpp
@@ -247,7 +247,7 @@ void QAndroidTextureVideoOutput::reset()
{
// flush pending frame
if (m_sink)
- m_sink->platformVideoSink()->newVideoFrame(QVideoFrame());
+ m_sink->platformVideoSink()->setVideoFrame(QVideoFrame());
clearSurfaceTexture();
}
@@ -262,7 +262,7 @@ void QAndroidTextureVideoOutput::onFrameAvailable()
const QVideoFrameFormat::PixelFormat format = rhi ? QVideoFrameFormat::Format_SamplerExternalOES
: QVideoFrameFormat::Format_RGBA8888;
QVideoFrame frame(buffer, QVideoFrameFormat(m_nativeSize, format));
- m_sink->platformVideoSink()->newVideoFrame(frame);
+ m_sink->platformVideoSink()->setVideoFrame(frame);
}
static const float g_quad[] = {
diff --git a/src/multimedia/platform/darwin/camera/avfcamerarenderer.mm b/src/multimedia/platform/darwin/camera/avfcamerarenderer.mm
index 9d0029a28..002e95e3c 100644
--- a/src/multimedia/platform/darwin/camera/avfcamerarenderer.mm
+++ b/src/multimedia/platform/darwin/camera/avfcamerarenderer.mm
@@ -221,7 +221,7 @@ void AVFCameraRenderer::handleViewfinderFrame()
if (m_needsHorizontalMirroring)
format.setMirrored(true);
- m_sink->newVideoFrame(frame);
+ m_sink->setVideoFrame(frame);
}
}
diff --git a/src/multimedia/platform/darwin/mediaplayer/avfvideorenderercontrol.mm b/src/multimedia/platform/darwin/mediaplayer/avfvideorenderercontrol.mm
index 4899f8a64..214b8f1a6 100644
--- a/src/multimedia/platform/darwin/mediaplayer/avfvideorenderercontrol.mm
+++ b/src/multimedia/platform/darwin/mediaplayer/avfvideorenderercontrol.mm
@@ -158,7 +158,7 @@ void AVFVideoRendererControl::updateVideoFrame(const CVTimeStamp &ts)
QVideoFrameFormat format(QSize(width, height), fmt);
frame = QVideoFrame(buffer, format);
- m_sink->newVideoFrame(frame);
+ m_sink->setVideoFrame(frame);
}
static NSDictionary* const AVF_OUTPUT_SETTINGS = @{
diff --git a/src/multimedia/platform/gstreamer/common/qgstvideorenderersink.cpp b/src/multimedia/platform/gstreamer/common/qgstvideorenderersink.cpp
index ceb2c0982..a74fa1b4b 100644
--- a/src/multimedia/platform/gstreamer/common/qgstvideorenderersink.cpp
+++ b/src/multimedia/platform/gstreamer/common/qgstvideorenderersink.cpp
@@ -278,7 +278,7 @@ bool QGstVideoRenderer::handleEvent(QMutexLocker<QMutex> *locker)
locker->unlock();
if (m_sink && !m_flushed)
- m_sink->newVideoFrame(QVideoFrame());
+ m_sink->setVideoFrame(QVideoFrame());
m_flushed = true;
}
} else if (m_stop) {
@@ -336,7 +336,7 @@ bool QGstVideoRenderer::handleEvent(QMutexLocker<QMutex> *locker)
QVideoFrame frame(videoBuffer, m_format);
QGstUtils::setFrameTimeStamps(&frame, buffer);
- m_sink->newVideoFrame(frame);
+ m_sink->setVideoFrame(frame);
gst_buffer_unref(buffer);
diff --git a/src/multimedia/platform/qnx/mediaplayer/mmrendererplayervideorenderercontrol.cpp b/src/multimedia/platform/qnx/mediaplayer/mmrendererplayervideorenderercontrol.cpp
index 7c731c404..dbcfad245 100644
--- a/src/multimedia/platform/qnx/mediaplayer/mmrendererplayervideorenderercontrol.cpp
+++ b/src/multimedia/platform/qnx/mediaplayer/mmrendererplayervideorenderercontrol.cpp
@@ -175,9 +175,9 @@ void MmRendererPlayerVideoRendererControl::updateScene(const QSize &size)
if (m_windowGrabber->eglImageSupported()) {
QnxTextureBuffer *textBuffer = new QnxTextureBuffer(m_windowGrabber);
QVideoFrame actualFrame(textBuffer, QVideoFrameFormat(size, QVideoFrameFormat::Format_BGR32));
- m_sink->newVideoFrame(actualFrame);
+ m_sink->setVideoFrame(actualFrame);
} else {
- m_sink->newVideoFrame(m_windowGrabber->getNextImage().copy());
+ m_sink->setVideoFrame(m_windowGrabber->getNextImage().copy());
}
}
}
diff --git a/src/multimedia/platform/qplatformvideosink_p.h b/src/multimedia/platform/qplatformvideosink_p.h
index 7512629e3..95d1aa085 100644
--- a/src/multimedia/platform/qplatformvideosink_p.h
+++ b/src/multimedia/platform/qplatformvideosink_p.h
@@ -99,11 +99,13 @@ public:
m_nativeSize = s;
sink->videoSizeChanged();
}
- void newVideoFrame(QVideoFrame frame) {
+ void setVideoFrame(const QVideoFrame &frame) {
setNativeSize(frame.size());
- frame.setSubtitleText(subtitleText());
- sink->newVideoFrame(frame);
+ m_currentVideoFrame = frame;
+ m_currentVideoFrame.setSubtitleText(subtitleText());
+ sink->videoFrameChanged(m_currentVideoFrame);
}
+ QVideoFrame currentVideoFrame() const { return m_currentVideoFrame; }
void setSubtitleText(const QString &subtitleText)
{
@@ -126,6 +128,7 @@ protected:
private:
QSize m_nativeSize;
QString m_subtitleText;
+ QVideoFrame m_currentVideoFrame;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/windows/evr/evrcustompresenter.cpp b/src/multimedia/platform/windows/evr/evrcustompresenter.cpp
index 647ea5d36..086fb57d4 100644
--- a/src/multimedia/platform/windows/evr/evrcustompresenter.cpp
+++ b/src/multimedia/platform/windows/evr/evrcustompresenter.cpp
@@ -1914,7 +1914,7 @@ void EVRCustomPresenter::presentSample(IMFSample *sample)
frame.setEndTime(frame.endTime() + m_positionOffset);
}
- m_videoSink->platformVideoSink()->newVideoFrame(frame);
+ m_videoSink->platformVideoSink()->setVideoFrame(frame);
}
void EVRCustomPresenter::positionChanged(qint64 position)
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsimagecapture.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsimagecapture.cpp
index f24823401..d61cd6cde 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsimagecapture.cpp
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsimagecapture.cpp
@@ -114,11 +114,11 @@ void QWindowsImageCapture::setCaptureSession(QPlatformMediaCaptureSession *sessi
connect(m_mediaDeviceSession, SIGNAL(readyForCaptureChanged(bool)),
this, SIGNAL(readyForCaptureChanged(bool)));
- connect(m_mediaDeviceSession, SIGNAL(newVideoFrame(QVideoFrame)),
- this, SLOT(handleNewVideoFrame(QVideoFrame)));
+ connect(m_mediaDeviceSession, SIGNAL(videoFrameChanged(QVideoFrame)),
+ this, SLOT(handleVideoFrameChanged(QVideoFrame)));
}
-void QWindowsImageCapture::handleNewVideoFrame(const QVideoFrame &frame)
+void QWindowsImageCapture::handleVideoFrameChanged(const QVideoFrame &frame)
{
if (m_capturing) {
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsimagecapture_p.h b/src/multimedia/platform/windows/mediacapture/qwindowsimagecapture_p.h
index c862dc914..6c3bc8107 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsimagecapture_p.h
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsimagecapture_p.h
@@ -76,7 +76,7 @@ public:
void setCaptureSession(QPlatformMediaCaptureSession *session);
private Q_SLOTS:
- void handleNewVideoFrame(const QVideoFrame &frame);
+ void handleVideoFrameChanged(const QVideoFrame &frame);
private:
int doCapture(const QString &fileName);
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp
index 4a1a91887..670e39f7e 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp
@@ -1012,7 +1012,7 @@ STDMETHODIMP QWindowsMediaDeviceReader::OnReadSample(HRESULT hrStatus, DWORD dwS
if (SUCCEEDED(pSample->GetSampleDuration(&duration)))
frame.setEndTime((llTimestamp + duration) * 0.1);
- emit newVideoFrame(frame);
+ emit videoFrameChanged(frame);
mediaBuffer->Unlock();
}
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h
index f7d5f973a..3e3aec0fc 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h
@@ -121,7 +121,7 @@ Q_SIGNALS:
void recordingStopped();
void recordingError(int errorCode);
void durationChanged(qint64 duration);
- void newVideoFrame(const QVideoFrame &frame);
+ void videoFrameChanged(const QVideoFrame &frame);
private slots:
void updateDuration();
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp
index e82246699..c43771d23 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp
@@ -56,7 +56,7 @@ QWindowsMediaDeviceSession::QWindowsMediaDeviceSession(QObject *parent)
connect(m_mediaDeviceReader, SIGNAL(streamingStarted()), this, SLOT(handleStreamingStarted()));
connect(m_mediaDeviceReader, SIGNAL(streamingStopped()), this, SLOT(handleStreamingStopped()));
connect(m_mediaDeviceReader, SIGNAL(streamingError(int)), this, SLOT(handleStreamingError(int)));
- connect(m_mediaDeviceReader, SIGNAL(newVideoFrame(QVideoFrame)), this, SLOT(handleNewVideoFrame(QVideoFrame)));
+ connect(m_mediaDeviceReader, SIGNAL(videoFrameChanged(QVideoFrame)), this, SLOT(handleVideoFrameChanged(QVideoFrame)));
connect(m_mediaDeviceReader, SIGNAL(recordingStarted()), this, SIGNAL(recordingStarted()));
connect(m_mediaDeviceReader, SIGNAL(recordingStopped()), this, SIGNAL(recordingStopped()));
connect(m_mediaDeviceReader, SIGNAL(recordingError(int)), this, SIGNAL(recordingError(int)));
@@ -153,15 +153,15 @@ void QWindowsMediaDeviceSession::handleStreamingStopped()
void QWindowsMediaDeviceSession::handleStreamingError(int errorCode)
{
if (m_surface)
- emit m_surface->platformVideoSink()->newVideoFrame(QVideoFrame());
+ emit m_surface->platformVideoSink()->setVideoFrame(QVideoFrame());
emit streamingError(errorCode);
}
-void QWindowsMediaDeviceSession::handleNewVideoFrame(const QVideoFrame &frame)
+void QWindowsMediaDeviceSession::handleVideoFrameChanged(const QVideoFrame &frame)
{
if (m_surface)
- emit m_surface->platformVideoSink()->newVideoFrame(frame);
- emit newVideoFrame(frame);
+ emit m_surface->platformVideoSink()->setVideoFrame(frame);
+ emit videoFrameChanged(frame);
}
void QWindowsMediaDeviceSession::setAudioInputMuted(bool muted)
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h
index 93642d676..4620bd6fb 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h
@@ -108,13 +108,13 @@ Q_SIGNALS:
void recordingStopped();
void streamingError(int errorCode);
void recordingError(int errorCode);
- void newVideoFrame(const QVideoFrame &frame);
+ void videoFrameChanged(const QVideoFrame &frame);
private Q_SLOTS:
void handleStreamingStarted();
void handleStreamingStopped();
void handleStreamingError(int errorCode);
- void handleNewVideoFrame(const QVideoFrame &frame);
+ void handleVideoFrameChanged(const QVideoFrame &frame);
private:
void reactivate();
diff --git a/src/multimedia/platform/windows/player/mfvideorenderercontrol.cpp b/src/multimedia/platform/windows/player/mfvideorenderercontrol.cpp
index 859de0f37..a2a83d1cb 100644
--- a/src/multimedia/platform/windows/player/mfvideorenderercontrol.cpp
+++ b/src/multimedia/platform/windows/player/mfvideorenderercontrol.cpp
@@ -849,7 +849,7 @@ namespace
new MediaSampleVideoBuffer(m_scheduledBuffer, m_bytesPerLine), m_surfaceFormat);
frame.setStartTime(m_bufferStartTime * 0.1);
frame.setEndTime((m_bufferStartTime + m_bufferDuration) * 0.1);
- m_videoSink->platformVideoSink()->newVideoFrame(frame);
+ m_videoSink->platformVideoSink()->setVideoFrame(frame);
m_scheduledBuffer->Release();
m_scheduledBuffer = NULL;
if (m_rate != 0)
@@ -2175,7 +2175,7 @@ MFVideoRendererControl::~MFVideoRendererControl()
void MFVideoRendererControl::clear()
{
if (m_sink)
- m_sink->platformVideoSink()->newVideoFrame(QVideoFrame());
+ m_sink->platformVideoSink()->setVideoFrame(QVideoFrame());
if (m_presenterActivate) {
m_presenterActivate->ShutdownObject();
diff --git a/src/multimedia/video/qvideosink.cpp b/src/multimedia/video/qvideosink.cpp
index 94a153564..e84330535 100644
--- a/src/multimedia/video/qvideosink.cpp
+++ b/src/multimedia/video/qvideosink.cpp
@@ -95,7 +95,7 @@ public:
QVideoSink can operate in two modes. In the first mode, it can render the video
stream to a native window of the underlying windowing system. In the other mode,
it will provide individual video frames to the application developer through the
- newVideoFrame() signal.
+ videoFrameChanged() signal.
The video frame can then be used to read out the data of those frames and handle them
further. When using QPainter, the QVideoFrame can be drawing using the paint() method
@@ -158,14 +158,38 @@ QPlatformVideoSink *QVideoSink::platformVideoSink() const
}
/*!
- Returns the current subtitle text.
+ Returns the current video frame.
*/
+QVideoFrame QVideoSink::videoFrame() const
+{
+ return d->videoSink->currentVideoFrame();
+}
+
+/*!
+ Sets the current video frame.
+*/
+void QVideoSink::setVideoFrame(const QVideoFrame &frame)
+{
+ d->videoSink->setVideoFrame(frame);
+}
+
+/*!
+ Returns the current subtitle text.
+*/
QString QVideoSink::subtitleText() const
{
return d->videoSink->subtitleText();
}
/*!
+ Sets the current subtitle text.
+*/
+void QVideoSink::setSubtitleText(const QString &subtitle)
+{
+ d->videoSink->setSubtitleText(subtitle);
+}
+
+/*!
Returns the size of the video currently being played back. If no video is
being played, this method returns an invalid size.
*/
diff --git a/src/multimedia/video/qvideosink.h b/src/multimedia/video/qvideosink.h
index d836abb4e..0e7f3d8cd 100644
--- a/src/multimedia/video/qvideosink.h
+++ b/src/multimedia/video/qvideosink.h
@@ -66,12 +66,15 @@ public:
QSize videoSize() const;
- QPlatformVideoSink *platformVideoSink() const;
-
QString subtitleText() const;
+ void setSubtitleText(const QString &subtitle);
+ void setVideoFrame(const QVideoFrame &frame);
+ QVideoFrame videoFrame() const;
+
+ QPlatformVideoSink *platformVideoSink() const;
Q_SIGNALS:
- void newVideoFrame(const QVideoFrame &frame) const;
+ void videoFrameChanged(const QVideoFrame &frame) const;
void subtitleTextChanged(const QString &subtitleText) const;
void videoSizeChanged();
diff --git a/src/multimedia/video/qvideowindow.cpp b/src/multimedia/video/qvideowindow.cpp
index 9b0bb7fc1..56b2281c8 100644
--- a/src/multimedia/video/qvideowindow.cpp
+++ b/src/multimedia/video/qvideowindow.cpp
@@ -94,7 +94,7 @@ QVideoWindowPrivate::QVideoWindowPrivate(QVideoWindow *q)
}
}
- QObject::connect(m_sink.get(), &QVideoSink::newVideoFrame, q, &QVideoWindow::newVideoFrame);
+ QObject::connect(m_sink.get(), &QVideoSink::videoFrameChanged, q, &QVideoWindow::setVideoFrame);
}
QVideoWindowPrivate::~QVideoWindowPrivate()
@@ -520,7 +520,7 @@ void QVideoWindow::resizeEvent(QResizeEvent *resizeEvent)
d->backingStore->resize(resizeEvent->size());
}
-void QVideoWindow::newVideoFrame(const QVideoFrame &frame)
+void QVideoWindow::setVideoFrame(const QVideoFrame &frame)
{
if (d->m_currentFrame.subtitleText() != frame.subtitleText())
d->m_subtitleDirty = true;
diff --git a/src/multimedia/video/qvideowindow_p.h b/src/multimedia/video/qvideowindow_p.h
index f95f5ca7f..c7324ec3f 100644
--- a/src/multimedia/video/qvideowindow_p.h
+++ b/src/multimedia/video/qvideowindow_p.h
@@ -164,7 +164,7 @@ protected:
void resizeEvent(QResizeEvent *) override;
private Q_SLOTS:
- void newVideoFrame(const QVideoFrame &frame);
+ void setVideoFrame(const QVideoFrame &frame);
private:
friend class QVideoWindowPrivate;