diff options
author | VaL Doroshchuk <valentyn.doroshchuk@qt.io> | 2019-10-30 14:01:18 +0100 |
---|---|---|
committer | VaL Doroshchuk <valentyn.doroshchuk@qt.io> | 2020-01-22 17:02:18 +0100 |
commit | 836bde2ba1a3fc5bdce51aad839e07fb7584af35 (patch) | |
tree | e2c86ecbefe5ce345d01c4189e7e993ce589f0f6 /src/imports/multimedia | |
parent | f4e2f8f71660a914bbbe2495b922ae83c5c5ad67 (diff) |
Introduce MediaPlayer::videoOutput property
This property holds the target video output,
and allows to render video to multiple items.
MediaPlayer {
videoOutput: [videoOutput1, 1, "ignored", videoOutput2.videoSurface]
}
Incorrect inputs are ignored.
The property also accepts single either QAbstractVideoSurface or QDeclarativeVideoOutput objects.
Task-number: QTBUG-32939
Change-Id: I41fc557dcac60be6d70b3889036ff4ae75734cc0
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/imports/multimedia')
-rw-r--r-- | src/imports/multimedia/multimedia.cpp | 1 | ||||
-rw-r--r-- | src/imports/multimedia/qdeclarativeaudio.cpp | 59 | ||||
-rw-r--r-- | src/imports/multimedia/qdeclarativeaudio_p.h | 6 |
3 files changed, 66 insertions, 0 deletions
diff --git a/src/imports/multimedia/multimedia.cpp b/src/imports/multimedia/multimedia.cpp index 6106bb45d..0bbe9cae3 100644 --- a/src/imports/multimedia/multimedia.cpp +++ b/src/imports/multimedia/multimedia.cpp @@ -162,6 +162,7 @@ public: qmlRegisterType<QDeclarativeVideoOutput, 13>(uri, 5, 13, "VideoOutput"); // 5.15 types + qmlRegisterType<QDeclarativeAudio, 15>(uri, 5, 15, "MediaPlayer"); qmlRegisterType<QDeclarativeVideoOutput, 15>(uri, 5, 15, "VideoOutput"); qmlRegisterType<QAbstractVideoSurface>(); diff --git a/src/imports/multimedia/qdeclarativeaudio.cpp b/src/imports/multimedia/qdeclarativeaudio.cpp index 9d41c77fa..fcba6257d 100644 --- a/src/imports/multimedia/qdeclarativeaudio.cpp +++ b/src/imports/multimedia/qdeclarativeaudio.cpp @@ -45,12 +45,14 @@ #include <qmediaservice.h> #include <private/qmediaserviceprovider_p.h> +#include <private/qdeclarativevideooutput_p.h> #include <qmetadatareadercontrol.h> #include <qmediaavailabilitycontrol.h> #include "qdeclarativeplaylist_p.h" #include "qdeclarativemediametadata_p.h" +#include <QAbstractVideoSurface> #include <QTimerEvent> #include <QtQml/qqmlengine.h> @@ -130,6 +132,63 @@ QDeclarativeAudio::~QDeclarativeAudio() } /*! + \since 5.15 + \qmlproperty url QtMultimedia::MediaPlayer::videoOutput + + This property holds the target video output. + Accepts one or an array of QAbstractVideoSurface or VideoOutput elements. + + \snippet multimedia-snippets/multiple-videooutputs.qml complete + + \sa QMediaPlayer::setVideoOutput() +*/ + +QVariant QDeclarativeAudio::videoOutput() const +{ + return m_videoOutput; +} + +void QDeclarativeAudio::setVideoOutput(const QVariant &v) +{ + if (m_videoOutput == v) + return; + + QAbstractVideoSurface *surface = nullptr; + auto vo = v.value<QDeclarativeVideoOutput *>(); + if (vo) + surface = vo->videoSurface(); + else + surface = v.value<QAbstractVideoSurface *>(); + + // If only one object has been passed. + if (surface) { + m_player->setVideoOutput(surface); + } else { + QVector<QAbstractVideoSurface *> surfaces; + // Check if it is an array. + auto arr = v.value<QJSValue>(); + if (!arr.isNull()) { + const int len = arr.property("length").toInt(); + for (int i = 0; i < len; ++i) { + auto &&v = arr.property(i); + if (v.isQObject()) { + auto obj = v.toQObject(); + vo = qobject_cast<QDeclarativeVideoOutput *>(obj); + surface = vo ? vo->videoSurface() : qobject_cast<QAbstractVideoSurface *>(obj); + if (surface) + surfaces.append(surface); + } + } + } + + m_player->setVideoOutput(surfaces); + } + + m_videoOutput = v; + emit videoOutputChanged(); +} + +/*! \qmlproperty enumeration QtMultimedia::Audio::availability Returns the availability state of the media player. diff --git a/src/imports/multimedia/qdeclarativeaudio_p.h b/src/imports/multimedia/qdeclarativeaudio_p.h index 043b36042..dc8800695 100644 --- a/src/imports/multimedia/qdeclarativeaudio_p.h +++ b/src/imports/multimedia/qdeclarativeaudio_p.h @@ -97,6 +97,7 @@ class QDeclarativeAudio : public QObject, public QQmlParserStatus Q_PROPERTY(AudioRole audioRole READ audioRole WRITE setAudioRole NOTIFY audioRoleChanged REVISION 1) Q_PROPERTY(QString customAudioRole READ customAudioRole WRITE setCustomAudioRole NOTIFY customAudioRoleChanged REVISION 3) Q_PROPERTY(int notifyInterval READ notifyInterval WRITE setNotifyInterval NOTIFY notifyIntervalChanged REVISION 2) + Q_PROPERTY(QVariant videoOutput READ videoOutput WRITE setVideoOutput NOTIFY videoOutputChanged REVISION 15) Q_ENUMS(Status) Q_ENUMS(Error) Q_ENUMS(Loop) @@ -164,6 +165,9 @@ public: QDeclarativeAudio(QObject *parent = 0); ~QDeclarativeAudio(); + QVariant videoOutput() const; + void setVideoOutput(const QVariant &); + bool hasAudio() const; bool hasVideo() const; @@ -269,6 +273,7 @@ Q_SIGNALS: void mediaObjectChanged(); Q_REVISION(2) void notifyIntervalChanged(); + Q_REVISION(15) void videoOutputChanged(); private Q_SLOTS: void _q_error(QMediaPlayer::Error); @@ -305,6 +310,7 @@ private: QMediaPlayer *m_player; int m_notifyInterval; + QVariant m_videoOutput; friend class QDeclarativeMediaBaseAnimation; }; |