summaryrefslogtreecommitdiffstats
path: root/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-02-11 18:05:58 +0100
committerLars Knoll <lars.knoll@qt.io>2021-02-17 08:27:17 +0000
commit0d5527ba1ed568abc1f3ffe943d0def9929d2123 (patch)
treeaf5e53c97a3f98ed39af1aa6f5dfb4add76bd590 /src/qtmultimediaquicktools/qdeclarativevideooutput.cpp
parent79159a4ff3678218e7fe6a55417355430f7e4a59 (diff)
Fix QML VideoOutput element
Requires a bit of plumming to get this to work. This is currently not ideal, and will require some further work. Change-Id: I5126e8ac0ba1db383d4694c3ab80b67a395a5464 Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/qtmultimediaquicktools/qdeclarativevideooutput.cpp')
-rw-r--r--src/qtmultimediaquicktools/qdeclarativevideooutput.cpp166
1 files changed, 19 insertions, 147 deletions
diff --git a/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp
index 2aae59509..93fbd75ab 100644
--- a/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp
+++ b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp
@@ -40,10 +40,9 @@
#include "qdeclarativevideooutput_p.h"
#include "qdeclarativevideooutput_render_p.h"
-#include "qdeclarativevideooutput_window_p.h"
+#include "qdeclarativevideooutput_p.h"
#include <private/qvideooutputorientationhandler_p.h>
-#include <QtMultimedia/qmediasource.h>
-#include <QtMultimedia/qmediaservice.h>
+#include <QtMultimedia/qmediaplayer.h>
#include <QtMultimedia/qcamera.h>
#include <private/qfactoryloader_p.h>
#include <QtCore/qloggingcategory.h>
@@ -130,7 +129,6 @@ Q_LOGGING_CATEGORY(qLcVideo, "qt.multimedia.video")
QDeclarativeVideoOutput::QDeclarativeVideoOutput(QQuickItem *parent) :
QQuickItem(parent),
- m_sourceType(NoSource),
m_fillMode(PreserveAspectFit),
m_geometryDirty(true),
m_orientation(0),
@@ -139,14 +137,12 @@ QDeclarativeVideoOutput::QDeclarativeVideoOutput(QQuickItem *parent) :
{
initResource();
setFlag(ItemHasContents, true);
- createBackend(nullptr);
+ createBackend();
}
QDeclarativeVideoOutput::~QDeclarativeVideoOutput()
{
m_backend.reset();
- m_source.clear();
- _q_updateMediaSource();
}
/*!
@@ -185,157 +181,38 @@ void QDeclarativeVideoOutput::setSource(QObject *source)
if (source == m_source.data())
return;
-
- if (m_source && m_sourceType == MediaSourceSource) {
- disconnect(m_source.data(), nullptr, this, SLOT(_q_updateMediaSource()));
- disconnect(m_source.data(), nullptr, this, SLOT(_q_updateCameraInfo()));
- }
-
- if (m_backend)
- m_backend->releaseSource();
-
m_source = source;
- if (m_source) {
+ QObject *s = source;
+ if (s) {
const QMetaObject *metaObject = m_source.data()->metaObject();
-
int mediaSourcePropertyIndex = metaObject->indexOfProperty("mediaSource");
if (mediaSourcePropertyIndex != -1) {
const QMetaProperty mediaSourceProperty = metaObject->property(mediaSourcePropertyIndex);
-
- if (mediaSourceProperty.hasNotifySignal()) {
- QMetaMethod method = mediaSourceProperty.notifySignal();
- QMetaObject::connect(m_source.data(), method.methodIndex(),
- this, this->metaObject()->indexOfSlot("_q_updateMediaSource()"),
- Qt::DirectConnection, nullptr);
-
- }
-
- int deviceIdPropertyIndex = metaObject->indexOfProperty("deviceId");
- if (deviceIdPropertyIndex != -1) { // Camera source
- const QMetaProperty deviceIdProperty = metaObject->property(deviceIdPropertyIndex);
-
- if (deviceIdProperty.hasNotifySignal()) {
- QMetaMethod method = deviceIdProperty.notifySignal();
- QMetaObject::connect(m_source.data(), method.methodIndex(),
- this, this->metaObject()->indexOfSlot("_q_updateCameraInfo()"),
- Qt::DirectConnection, nullptr);
-
- }
- }
-
- m_sourceType = MediaSourceSource;
- } else if (metaObject->indexOfProperty("videoSurface") != -1) {
- m_source.data()->setProperty("videoSurface",
- QVariant::fromValue<QAbstractVideoSurface *>(videoSurface()));
- m_sourceType = VideoSurfaceSource;
- } else {
- m_sourceType = NoSource;
+ s = mediaSourceProperty.read(s).value<QObject *>();
}
- } else {
- m_sourceType = NoSource;
}
- _q_updateMediaSource();
- emit sourceChanged();
-}
-
-Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, videoBackendFactoryLoader,
- (QDeclarativeVideoBackendFactoryInterface_iid, QLatin1String("video/declarativevideobackend"), Qt::CaseInsensitive))
-
-bool QDeclarativeVideoOutput::createBackend(QMediaService *service)
-{
- bool backendAvailable = false;
-
- int i = 0;
- while (const auto instance = videoBackendFactoryLoader()->instance(i)) {
- if (QDeclarativeVideoBackendFactoryInterface *plugin = qobject_cast<QDeclarativeVideoBackendFactoryInterface*>(instance)) {
- if (!m_backend)
- m_backend.reset(plugin->create(this));
- if (m_backend && m_backend->init(service)) {
- backendAvailable = true;
- break;
- }
- }
- }
-
- if (!backendAvailable) {
- if (!m_backend)
- m_backend.reset(new QDeclarativeVideoRendererBackend(this));
- if (m_backend->init(service))
- backendAvailable = true;
+ if (QCamera *c = qobject_cast<QCamera *>(s)) {
+ c->setViewfinder(videoSurface());
+ } else if (QMediaPlayer *p = qobject_cast<QMediaPlayer *>(s)) {
+ p->setVideoOutput(videoSurface());
}
-
- // QDeclarativeVideoWindowBackend only works when there is a service with a QVideoWindowControl.
- // Without service, the QDeclarativeVideoRendererBackend should always work.
- if (!backendAvailable) {
- Q_ASSERT(service);
- m_backend.reset(new QDeclarativeVideoWindowBackend(this));
- if (m_backend->init(service))
- backendAvailable = true;
- }
-
- if (backendAvailable) {
- // Since new backend has been created needs to update its geometry.
- m_geometryDirty = true;
-
- m_backend->clearFilters();
- for (int i = 0; i < m_filters.count(); ++i)
- m_backend->appendFilter(m_filters[i]);
- } else {
- qWarning() << Q_FUNC_INFO << "Media service has neither renderer nor window control available.";
- m_backend.reset();
- }
-
- return backendAvailable;
+ emit sourceChanged();
}
-void QDeclarativeVideoOutput::_q_updateMediaSource()
+bool QDeclarativeVideoOutput::createBackend()
{
- QMediaSource *mediaSource = nullptr;
-
- if (m_source)
- mediaSource = qobject_cast<QMediaSource*>(m_source.data()->property("mediaSource").value<QObject*>());
-
- qCDebug(qLcVideo) << "media object is" << mediaSource;
-
- if (m_mediaSource.data() == mediaSource)
- return;
-
- m_mediaSource.clear();
- m_service.clear();
-
- if (mediaSource) {
- if (QMediaService *service = mediaSource->service()) {
- if (createBackend(service)) {
- m_service = service;
- m_mediaSource = mediaSource;
- }
- }
- }
-
- _q_updateCameraInfo();
-}
+ m_backend.reset(new QDeclarativeVideoBackend(this));
-void QDeclarativeVideoOutput::_q_updateCameraInfo()
-{
- if (m_mediaSource) {
- const QCamera *camera = qobject_cast<const QCamera *>(m_mediaSource);
- if (camera) {
- QCameraInfo info = camera->cameraInfo();
+ // Since new backend has been created needs to update its geometry.
+ m_geometryDirty = true;
- if (m_cameraInfo != info) {
- m_cameraInfo = info;
+ m_backend->clearFilters();
+ for (int i = 0; i < m_filters.count(); ++i)
+ m_backend->appendFilter(m_filters[i]);
- // The camera position and orientation need to be taken into account for
- // the viewport auto orientation
- if (m_autoOrientation)
- _q_screenOrientationChanged(m_screenOrientationHandler->currentOrientation());
- }
- }
- } else {
- m_cameraInfo = QCameraInfo();
- }
+ return true;
}
/*!
@@ -746,11 +623,6 @@ QRectF QDeclarativeVideoOutput::mapRectToSourceNormalized(const QRectF &rectangl
mapPointToSourceNormalized(rectangle.bottomRight())).normalized();
}
-QDeclarativeVideoOutput::SourceType QDeclarativeVideoOutput::sourceType() const
-{
- return m_sourceType;
-}
-
/*!
\qmlmethod QPointF QtMultimedia::VideoOutput::mapPointToItem(const QPointF &point) const