summaryrefslogtreecommitdiffstats
path: root/src/multimediawidgets
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-02-11 09:20:08 +0100
committerLars Knoll <lars.knoll@qt.io>2021-02-17 08:26:34 +0000
commita8eb585f239c2e5c0a5fed8a1a279fbd076c8446 (patch)
tree8edab7e7e297bc42e3ee214bf803e03a393e8ad8 /src/multimediawidgets
parent5b08bbc4a244416ee961e9793cc12a652994573b (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.cpp41
-rw-r--r--src/multimediawidgets/qgraphicsvideoitem.h2
-rw-r--r--src/multimediawidgets/qpaintervideosurface.cpp19
-rw-r--r--src/multimediawidgets/qvideowidget.h2
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;