diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-04-13 20:23:01 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-04-16 11:01:42 +0000 |
commit | 5ff8fa4ae1f5f5be5acc9ffc1ac834906859ecd6 (patch) | |
tree | 8b422b863390f396bad638a5041b9e19bbc84193 | |
parent | c25fe424afdc07f0eee4ae2d169df09eae22a6e4 (diff) |
Rename videoPreview to videoOutput
It's better to be consistent with QMediaPlayer.
Also add the required QVariant based overloads, that we need
for QML.
Change-Id: I583bc795c029f35373546a6e673c575a7c20dfa1
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Doris Verria <doris.verria@qt.io>
5 files changed, 57 insertions, 18 deletions
diff --git a/examples/multimediawidgets/camera/camera.cpp b/examples/multimediawidgets/camera/camera.cpp index dcbb4d50e..69445a29f 100644 --- a/examples/multimediawidgets/camera/camera.cpp +++ b/examples/multimediawidgets/camera/camera.cpp @@ -122,7 +122,7 @@ void Camera::setCamera(const QCameraInfo &cameraInfo) connect(ui->exposureCompensation, &QAbstractSlider::valueChanged, this, &Camera::setExposureCompensation); - m_captureSession.setVideoPreview(ui->viewfinder); + m_captureSession.setVideoOutput(ui->viewfinder); updateCameraActive(m_camera->isActive()); updateRecorderState(m_mediaEncoder->state()); diff --git a/src/multimedia/recording/qmediacapturesession.cpp b/src/multimedia/recording/qmediacapturesession.cpp index f2e2c34f7..f0782457a 100644 --- a/src/multimedia/recording/qmediacapturesession.cpp +++ b/src/multimedia/recording/qmediacapturesession.cpp @@ -42,6 +42,7 @@ #include "qcamera.h" #include "qmediaencoder.h" #include "qcameraimagecapture.h" +#include "qvideosink.h" #include "qplatformmediaintegration_p.h" #include "qplatformmediacapture_p.h" @@ -56,6 +57,7 @@ public: QCamera *camera = nullptr; QCameraImageCapture *imageCapture = nullptr; QMediaEncoder *encoder = nullptr; + QVariant videoOutput; }; @@ -199,6 +201,32 @@ void QMediaCaptureSession::setEncoder(QMediaEncoder *recorder) } /*! + 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 QMediaCaptureSession::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 QMediaCaptureSession::videoOutput() const +{ + Q_D(const QMediaCaptureSession); + return d->videoOutput; +} + +/*! Sets a QObject based video preview for the capture session. A QObject based preview is expected to have an invokable videoSink() @@ -206,18 +234,24 @@ void QMediaCaptureSession::setEncoder(QMediaEncoder *recorder) The previously set preview is detached. */ -void QMediaCaptureSession::setVideoPreview(QObject *preview) +void QMediaCaptureSession::setVideoOutput(QObject *preview) { auto *mo = preview->metaObject(); QVideoSink *sink = nullptr; if (preview) mo->invokeMethod(preview, "videoSink", Q_RETURN_ARG(QVideoSink *, sink)); - setVideoPreview(sink); + setVideoOutput(sink); } -void QMediaCaptureSession::setVideoPreview(QVideoSink *preview) +void QMediaCaptureSession::setVideoOutput(QVideoSink *sink) { - d_ptr->captureSession->setVideoPreview(preview); + Q_D(QMediaCaptureSession); + QVariant out = QVariant::fromValue(sink); + if (d->videoOutput == out) + return; + d->videoOutput = out; + d->captureSession->setVideoPreview(sink); + emit videoOutputChanged(); } QPlatformMediaCaptureSession *QMediaCaptureSession::platformSession() const diff --git a/src/multimedia/recording/qmediacapturesession.h b/src/multimedia/recording/qmediacapturesession.h index db6e41115..2be98f9d6 100644 --- a/src/multimedia/recording/qmediacapturesession.h +++ b/src/multimedia/recording/qmediacapturesession.h @@ -63,6 +63,7 @@ class Q_MULTIMEDIA_EXPORT QMediaCaptureSession : public QObject Q_PROPERTY(QCamera *camera READ camera WRITE setCamera NOTIFY cameraChanged) Q_PROPERTY(QCameraImageCapture *imageCapture READ imageCapture WRITE setImageCapture NOTIFY imageCaptureChanged) Q_PROPERTY(QMediaEncoder *encoder READ encoder WRITE setEncoder NOTIFY encoderChanged) + Q_PROPERTY(QVariant videoOutput READ videoOutput WRITE setVideoOutput NOTIFY videoOutputChanged) public: explicit QMediaCaptureSession(QObject *parent = nullptr); ~QMediaCaptureSession(); @@ -86,8 +87,11 @@ public: QMediaEncoder *encoder(); void setEncoder(QMediaEncoder *recorder); - void setVideoPreview(QObject *preview); - void setVideoPreview(QVideoSink *preview); + void setVideoOutput(const QVariant &output); + QVariant videoOutput() const; + + void setVideoOutput(QObject *preview); + void setVideoOutput(QVideoSink *preview); QPlatformMediaCaptureSession *platformSession() const; @@ -98,6 +102,7 @@ Q_SIGNALS: void cameraChanged(); void imageCaptureChanged(); void encoderChanged(); + void videoOutputChanged(); private: QMediaCaptureSessionPrivate *d_ptr; diff --git a/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp index fc6d8d755..0fa6b36ed 100644 --- a/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp +++ b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp @@ -182,7 +182,7 @@ void QDeclarativeVideoOutput::setSource(QObject *source) } if (QMediaCaptureSession *s = qobject_cast<QMediaCaptureSession *>(source)) { - s->setVideoPreview(videoSink()); + s->setVideoOutput(videoSink()); } else if (QMediaPlayer *p = qobject_cast<QMediaPlayer *>(source)) { p->setVideoOutput(videoSink()); } diff --git a/tests/auto/unit/multimediawidgets/qcamerawidgets/tst_qcamerawidgets.cpp b/tests/auto/unit/multimediawidgets/qcamerawidgets/tst_qcamerawidgets.cpp index 9cc815e3e..6b5e7ea2a 100644 --- a/tests/auto/unit/multimediawidgets/qcamerawidgets/tst_qcamerawidgets.cpp +++ b/tests/auto/unit/multimediawidgets/qcamerawidgets/tst_qcamerawidgets.cpp @@ -115,37 +115,37 @@ void tst_QCameraWidgets::testSetVideoOutput() QVideoSink surface; QMediaCaptureSession session; - session.setVideoPreview(&widget); + session.setVideoOutput(&widget); // qDebug() << widget.mediaSource(); // QVERIFY(widget.mediaSource() == &session); - session.setVideoPreview(&item); + session.setVideoOutput(&item); // QVERIFY(widget.mediaSource() == nullptr); // QVERIFY(item.mediaSource() == &session); - session.setVideoPreview(reinterpret_cast<QVideoWidget *>(0)); + session.setVideoOutput(reinterpret_cast<QVideoWidget *>(0)); // QVERIFY(item.mediaSource() == nullptr); - session.setVideoPreview(&widget); + session.setVideoOutput(&widget); // QVERIFY(widget.mediaSource() == &session); - session.setVideoPreview(reinterpret_cast<QGraphicsVideoItem *>(0)); + session.setVideoOutput(reinterpret_cast<QGraphicsVideoItem *>(0)); // QVERIFY(widget.mediaSource() == nullptr); - session.setVideoPreview(&surface); + session.setVideoOutput(&surface); // QVERIFY(mocksessionService->rendererControl->surface() == &surface); - session.setVideoPreview(reinterpret_cast<QVideoSink *>(0)); + session.setVideoOutput(reinterpret_cast<QVideoSink *>(0)); // QVERIFY(mocksessionService->rendererControl->surface() == nullptr); - session.setVideoPreview(&surface); + session.setVideoOutput(&surface); // QVERIFY(mocksessionService->rendererControl->surface() == &surface); - session.setVideoPreview(&widget); + session.setVideoOutput(&widget); // QVERIFY(mocksessionService->rendererControl->surface() == nullptr); // QVERIFY(widget.mediaSource() == &session); - session.setVideoPreview(&surface); + session.setVideoOutput(&surface); // QVERIFY(mockCameraService->rendererControl->surface() == &surface); // QVERIFY(widget.mediaSource() == nullptr); } |