diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-05-19 21:15:31 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-05-21 09:53:05 +0000 |
commit | 84fc04caae9103aea0bbf0fe6d33143e2a28425f (patch) | |
tree | dbd40816c3d1153af560aef08d9222d993983cc9 /src/multimedia/playback | |
parent | f3526fd7af8b9ca7e2929c21e5bd364fad0eaa3e (diff) |
Clean up the videoOutput() API
The current API was rather messy, with multiple overloads.
Change this and make the videoOutput a QObject * based property.
To account for QVideoSink, add a videoSink()/setVideoSink()
overload.
This also helps identifying the correct sink in all cases.
Add some code to protect against deletion of the videoOutput
or videoSink from somewhere else.
Adjust autotests and fix the qquickvideooutput autotests.
With this change we are now passing all existing autotests
again on Linux/gstreamer.
Change-Id: I77b9863e88a7863abf27ab465fadd9c24f486502
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/multimedia/playback')
-rw-r--r-- | src/multimedia/playback/qmediaplayer.cpp | 55 | ||||
-rw-r--r-- | src/multimedia/playback/qmediaplayer.h | 12 | ||||
-rw-r--r-- | src/multimedia/playback/qmediaplayer_p.h | 18 |
3 files changed, 43 insertions, 42 deletions
diff --git a/src/multimedia/playback/qmediaplayer.cpp b/src/multimedia/playback/qmediaplayer.cpp index db236093e..02805469b 100644 --- a/src/multimedia/playback/qmediaplayer.cpp +++ b/src/multimedia/playback/qmediaplayer.cpp @@ -680,27 +680,7 @@ void QMediaPlayer::setActiveSubtitleTrack(int index) d->control->setActiveTrack(QPlatformMediaPlayer::SubtitleStream, index); } -/*! - Attach a video \a output to the media player. - - If the media player has already video output attached, - it will be replaced with a new one. -*/ -void QMediaPlayer::setVideoOutput(const QVariant &output) -{ - QVideoSink *s = output.value<QVideoSink *>(); - if (s) { - setVideoOutput(s); - return; - } - QObject *o = output.value<QObject *>(); - if (o) { - setVideoOutput(o); - return; - } -} - -QVariant QMediaPlayer::videoOutput() const +QObject *QMediaPlayer::videoOutput() const { Q_D(const QMediaPlayer); return d->videoOutput; @@ -717,35 +697,37 @@ void QMediaPlayer::setVideoOutput(QObject *output) Q_D(QMediaPlayer); if (!d->control) return; + if (d->videoOutput == output) + return; - QVideoSink *sink = nullptr; - if (output) { + QVideoSink *sink = qobject_cast<QVideoSink *>(output); + if (!sink && output) { auto *mo = output->metaObject(); if (output) mo->invokeMethod(output, "videoSink", Q_RETURN_ARG(QVideoSink *, sink)); } - QVariant out = QVariant::fromValue(output); - if (d->videoOutput == out) - return; - d->videoOutput = out; - d->control->setVideoSink(sink); - emit videoOutputChanged(); + d->videoOutput = output; + d->setVideoSink(sink); } -void QMediaPlayer::setVideoOutput(QVideoSink *sink) +void QMediaPlayer::setVideoSink(QVideoSink *sink) { Q_D(QMediaPlayer); if (!d->control) return; - QVariant out = QVariant::fromValue(sink); - if (d->videoOutput == out) - return; - d->videoOutput = out; - d->control->setVideoSink(sink); - emit videoOutputChanged(); + d->videoOutput = nullptr; + d->setVideoSink(sink); } +QVideoSink *QMediaPlayer::videoSink() const +{ + Q_D(const QMediaPlayer); + return d->videoSink; +} + + +#if 0 /*! \since 5.15 Sets multiple video sinks as the video output of a media player. @@ -760,6 +742,7 @@ void QMediaPlayer::setVideoOutput(const QList<QVideoSink *> &sinks) Q_UNUSED(sinks); // setVideoOutput(!surfaces.empty() ? new QVideoSurfaces(surfaces, this) : nullptr); } +#endif /*! Returns true if the media player is supported on this platform. diff --git a/src/multimedia/playback/qmediaplayer.h b/src/multimedia/playback/qmediaplayer.h index 746725ebb..4ee762fed 100644 --- a/src/multimedia/playback/qmediaplayer.h +++ b/src/multimedia/playback/qmediaplayer.h @@ -73,7 +73,7 @@ class Q_MULTIMEDIA_EXPORT QMediaPlayer : public QObject Q_PROPERTY(QMediaMetaData metaData READ metaData NOTIFY metaDataChanged) Q_PROPERTY(Error error READ error NOTIFY errorChanged) Q_PROPERTY(QString errorString READ errorString NOTIFY errorChanged) - Q_PROPERTY(QVariant videoOutput READ videoOutput WRITE setVideoOutput NOTIFY videoOutputChanged) + Q_PROPERTY(QObject *videoOutput READ videoOutput WRITE setVideoOutput NOTIFY videoOutputChanged) Q_ENUMS(PlaybackState) Q_ENUMS(MediaStatus) Q_ENUMS(Error) @@ -129,12 +129,14 @@ public: void setActiveVideoTrack(int index); void setActiveSubtitleTrack(int index); - void setVideoOutput(const QVariant &output); - QVariant videoOutput() const; - void setVideoOutput(QObject *); + QObject *videoOutput() const; +#if 0 void setVideoOutput(const QList<QVideoSink *> &sinks); - void setVideoOutput(QVideoSink *sink); +#endif + + void setVideoSink(QVideoSink *sink); + QVideoSink *videoSink() const; QUrl source() const; const QIODevice *sourceStream() const; diff --git a/src/multimedia/playback/qmediaplayer_p.h b/src/multimedia/playback/qmediaplayer_p.h index 9c609de28..ee519fb86 100644 --- a/src/multimedia/playback/qmediaplayer_p.h +++ b/src/multimedia/playback/qmediaplayer_p.h @@ -53,6 +53,7 @@ #include "qmediaplayer.h" #include "qmediametadata.h" +#include "qvideosink.h" #include <private/qplatformmediaplayer_p.h> #include "private/qobject_p.h" @@ -76,7 +77,8 @@ public: QPlatformMediaPlayer* control = nullptr; QString errorString; - QVariant videoOutput; + QVideoSink *videoSink = nullptr; + QPointer<QObject> videoOutput; QUrl qrcMedia; QScopedPointer<QFile> qrcFile; QUrl source; @@ -95,6 +97,20 @@ public: void setState(QMediaPlayer::PlaybackState state); void setStatus(QMediaPlayer::MediaStatus status); void setError(int error, const QString &errorString); + + void setVideoSink(QVideoSink *sink) + { + Q_Q(QMediaPlayer); + if (sink == videoSink) + return; + if (videoSink) + videoSink->setSource(nullptr); + videoSink = sink; + if (sink) + sink->setSource(q); + control->setVideoSink(sink); + emit q->videoOutputChanged(); + } }; QT_END_NAMESPACE |