summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-04-13 20:23:01 +0200
committerLars Knoll <lars.knoll@qt.io>2021-04-16 11:01:42 +0000
commit5ff8fa4ae1f5f5be5acc9ffc1ac834906859ecd6 (patch)
tree8b422b863390f396bad638a5041b9e19bbc84193
parentc25fe424afdc07f0eee4ae2d169df09eae22a6e4 (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>
-rw-r--r--examples/multimediawidgets/camera/camera.cpp2
-rw-r--r--src/multimedia/recording/qmediacapturesession.cpp42
-rw-r--r--src/multimedia/recording/qmediacapturesession.h9
-rw-r--r--src/qtmultimediaquicktools/qdeclarativevideooutput.cpp2
-rw-r--r--tests/auto/unit/multimediawidgets/qcamerawidgets/tst_qcamerawidgets.cpp20
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);
}