diff options
Diffstat (limited to 'src')
6 files changed, 136 insertions, 2 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; }; diff --git a/src/multimedia/doc/snippets/multimedia-snippets/multimedia-snippets.pro b/src/multimedia/doc/snippets/multimedia-snippets/multimedia-snippets.pro index c13090a79..a46b20bd0 100644 --- a/src/multimedia/doc/snippets/multimedia-snippets/multimedia-snippets.pro +++ b/src/multimedia/doc/snippets/multimedia-snippets/multimedia-snippets.pro @@ -22,4 +22,5 @@ SOURCES += \ OTHER_FILES += \ soundeffect.qml \ - qtvideosink.qml + qtvideosink.qml \ + multiple-videooutputs.qml diff --git a/src/multimedia/doc/snippets/multimedia-snippets/multiple-videooutputs.qml b/src/multimedia/doc/snippets/multimedia-snippets/multiple-videooutputs.qml new file mode 100644 index 000000000..e3c1587f6 --- /dev/null +++ b/src/multimedia/doc/snippets/multimedia-snippets/multiple-videooutputs.qml @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick.Window 2.2 +import QtMultimedia 5.15 + +//! [complete] +Item { + MediaPlayer { + id: mediaplayer + autoPlay: true + source: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4" + videoOutput: [v1, v2] + } + + VideoOutput { + id: v1 + anchors.fill: parent + } + + Window { + visible: true + width: 480; height: 320 + VideoOutput { + id: v2 + anchors.fill: parent + } + } +} +//! [complete] diff --git a/src/multimedia/playback/qmediaplayer.cpp b/src/multimedia/playback/qmediaplayer.cpp index 9b51bcddf..d96cb3a95 100644 --- a/src/multimedia/playback/qmediaplayer.cpp +++ b/src/multimedia/playback/qmediaplayer.cpp @@ -1184,7 +1184,7 @@ void QMediaPlayer::setVideoOutput(QAbstractVideoSurface *surface) void QMediaPlayer::setVideoOutput(const QVector<QAbstractVideoSurface *> &surfaces) { - setVideoOutput(new QVideoSurfaces(surfaces, this)); + setVideoOutput(!surfaces.empty() ? new QVideoSurfaces(surfaces, this) : nullptr); } /*! \reimp */ |