diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-02-11 09:20:08 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-02-17 08:26:34 +0000 |
commit | a8eb585f239c2e5c0a5fed8a1a279fbd076c8446 (patch) | |
tree | 8edab7e7e297bc42e3ee214bf803e03a393e8ad8 /src/multimediawidgets | |
parent | 5b08bbc4a244416ee961e9793cc12a652994573b (diff) |
Rework how to set a video output surface
Setting a video output should not require QMediaService
anymore.
Reverse the logic, by making QAbstractVideoSurface the primary
interface. Use runtime method lookup to get a pointer to the
video surface from QVideoWidget/QGraphicsVideoItem.
QAbstractVideoSurface is now the primary interface for setting
up a video output. We will need to add some API there to allow for
windows/fullscreen rendering.
With this change, QVideoRendererControl/QVideoWindowControl can
also be retired as an abstraction layer in the longer term.
Change-Id: Iedff18c6b95fedc7cb914075a8c84081080deab1
Reviewed-by: Doris Verria <doris.verria@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/multimediawidgets')
-rw-r--r-- | src/multimediawidgets/qgraphicsvideoitem.cpp | 41 | ||||
-rw-r--r-- | src/multimediawidgets/qgraphicsvideoitem.h | 2 | ||||
-rw-r--r-- | src/multimediawidgets/qpaintervideosurface.cpp | 19 | ||||
-rw-r--r-- | src/multimediawidgets/qvideowidget.h | 2 |
4 files changed, 10 insertions, 54 deletions
diff --git a/src/multimediawidgets/qgraphicsvideoitem.cpp b/src/multimediawidgets/qgraphicsvideoitem.cpp index 91c157d62..af45d930d 100644 --- a/src/multimediawidgets/qgraphicsvideoitem.cpp +++ b/src/multimediawidgets/qgraphicsvideoitem.cpp @@ -67,9 +67,7 @@ public: QPainterVideoSurface *surface = nullptr; QPointer<QMediaSource> mediaSource; QMediaService *service = nullptr; - QVideoRendererControl *rendererControl = nullptr; Qt::AspectRatioMode aspectRatioMode = Qt::KeepAspectRatio; - bool updatePaintDevice = true; QRectF rect; QRectF boundingRect; QRectF sourceRect; @@ -86,12 +84,6 @@ public: void QGraphicsVideoItemPrivate::clearService() { - if (rendererControl) { - surface->stop(); - rendererControl->setSurface(nullptr); - service->releaseControl(rendererControl); - rendererControl = nullptr; - } if (service) { QObject::disconnect(service, SIGNAL(destroyed()), q_ptr, SLOT(_q_serviceDestroyed())); service = nullptr; @@ -152,7 +144,6 @@ void QGraphicsVideoItemPrivate::_q_updateNativeSize() void QGraphicsVideoItemPrivate::_q_serviceDestroyed() { - rendererControl = nullptr; service = nullptr; surface->stop(); @@ -204,11 +195,6 @@ QGraphicsVideoItem::QGraphicsVideoItem(QGraphicsItem *parent) */ QGraphicsVideoItem::~QGraphicsVideoItem() { - if (d_ptr->rendererControl) { - d_ptr->rendererControl->setSurface(nullptr); - d_ptr->service->releaseControl(d_ptr->rendererControl); - } - delete d_ptr->surface; delete d_ptr; } @@ -256,28 +242,6 @@ bool QGraphicsVideoItem::setMediaSource(QMediaSource *object) if (d->mediaSource) { d->service = d->mediaSource->service(); - - if (d->service) { - QObject *control = d->service->requestControl(QVideoRendererControl_iid); - if (control) { - d->rendererControl = qobject_cast<QVideoRendererControl *>(control); - - if (d->rendererControl) { - //don't set the surface until the item is painted - //at least once and the surface is configured - if (!d->updatePaintDevice) - d->rendererControl->setSurface(d->surface); - else - update(boundingRect()); - - connect(d->service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed())); - - return true; - } - if (control) - d->service->releaseControl(control); - } - } } d->mediaSource = nullptr; @@ -379,8 +343,7 @@ void QGraphicsVideoItem::paint( Q_UNUSED(option); Q_UNUSED(widget); - if (d->surface && d->updatePaintDevice) { - d->updatePaintDevice = false; + if (d->surface) { #if QT_CONFIG(opengl) if (widget) connect(widget, SIGNAL(destroyed()), d->surface, SLOT(viewportDestroyed())); @@ -396,8 +359,6 @@ void QGraphicsVideoItem::paint( } } #endif - if (d->rendererControl && d->rendererControl->surface() != d->surface) - d->rendererControl->setSurface(d->surface); } if (d->surface && d->surface->isActive()) { diff --git a/src/multimediawidgets/qgraphicsvideoitem.h b/src/multimediawidgets/qgraphicsvideoitem.h index 0a51269a2..65915a573 100644 --- a/src/multimediawidgets/qgraphicsvideoitem.h +++ b/src/multimediawidgets/qgraphicsvideoitem.h @@ -67,7 +67,7 @@ public: QMediaSource *mediaSource() const override; QObject *asObject() override { return this; } - QAbstractVideoSurface *videoSurface() const; + Q_INVOKABLE QAbstractVideoSurface *videoSurface() const; Qt::AspectRatioMode aspectRatioMode() const; void setAspectRatioMode(Qt::AspectRatioMode mode); diff --git a/src/multimediawidgets/qpaintervideosurface.cpp b/src/multimediawidgets/qpaintervideosurface.cpp index 8a3567d01..9e6d8fa8a 100644 --- a/src/multimediawidgets/qpaintervideosurface.cpp +++ b/src/multimediawidgets/qpaintervideosurface.cpp @@ -150,12 +150,12 @@ QAbstractVideoSurface::Error QVideoSurfaceGenericPainter::start(const QVideoSurf const QAbstractVideoBuffer::HandleType t = format.handleType(); if (t == QAbstractVideoBuffer::NoHandle) { - bool ok = m_imageFormat != QImage::Format_Invalid && !m_imageSize.isEmpty(); -#ifndef QT_NO_OPENGL - if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGLES) - ok &= format.pixelFormat() != QVideoFrame::Format_RGB24; -#endif - if (ok) +// bool ok = m_imageFormat != QImage::Format_Invalid && !m_imageSize.isEmpty(); +//#ifndef QT_NO_OPENGL +// if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGLES) +// ok &= format.pixelFormat() != QVideoFrame::Format_RGB24; +//#endif +// if (ok) return QAbstractVideoSurface::NoError; } else if (t == QAbstractVideoBuffer::QPixmapHandle) { return QAbstractVideoSurface::NoError; @@ -186,12 +186,7 @@ QAbstractVideoSurface::Error QVideoSurfaceGenericPainter::paint( if (m_frame.handleType() == QAbstractVideoBuffer::QPixmapHandle) { painter->drawPixmap(target, m_frame.handle().value<QPixmap>(), source); } else if (m_frame.map(QAbstractVideoBuffer::ReadOnly)) { - QImage image( - m_frame.bits(), - m_imageSize.width(), - m_imageSize.height(), - m_frame.bytesPerLine(), - m_imageFormat); + QImage image = m_frame.image(); const QTransform oldTransform = painter->transform(); QTransform transform = oldTransform; diff --git a/src/multimediawidgets/qvideowidget.h b/src/multimediawidgets/qvideowidget.h index 3073033ae..3a858077c 100644 --- a/src/multimediawidgets/qvideowidget.h +++ b/src/multimediawidgets/qvideowidget.h @@ -71,7 +71,7 @@ public: QMediaSource *mediaSource() const override; QObject *asObject() override { return this; } - QAbstractVideoSurface *videoSurface() const; + Q_INVOKABLE QAbstractVideoSurface *videoSurface() const; #ifdef Q_QDOC bool isFullScreen() const; |