summaryrefslogtreecommitdiffstats
path: root/src/multimedia/recording/qmediacapturesession.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/multimedia/recording/qmediacapturesession.cpp')
-rw-r--r--src/multimedia/recording/qmediacapturesession.cpp68
1 files changed, 21 insertions, 47 deletions
diff --git a/src/multimedia/recording/qmediacapturesession.cpp b/src/multimedia/recording/qmediacapturesession.cpp
index 727f5bac6..6e9df9c8d 100644
--- a/src/multimedia/recording/qmediacapturesession.cpp
+++ b/src/multimedia/recording/qmediacapturesession.cpp
@@ -44,6 +44,8 @@
#include "qcameraimagecapture.h"
#include "qvideosink.h"
+#include <qpointer.h>
+
#include "qplatformmediaintegration_p.h"
#include "qplatformmediacapture_p.h"
@@ -58,28 +60,18 @@ public:
QCamera *camera = nullptr;
QCameraImageCapture *imageCapture = nullptr;
QMediaEncoder *encoder = nullptr;
- QVariant videoOutput;
QVideoSink *videoSink = nullptr;
-
- void _q_sinkDestroyed(QObject *sink)
- {
- if (sink == videoSink) {
- captureSession->setVideoPreview(nullptr);
- videoOutput = {};
- videoSink = nullptr;
- }
- }
+ QPointer<QObject> videoOutput;
void setVideoSink(QVideoSink *sink)
{
+ if (sink == videoSink)
+ return;
if (videoSink)
- QObject::disconnect(videoSink, SIGNAL(destroyed(QObject *)), q, SLOT(_q_sinkDestroyed(QObject *)));
+ videoSink->setSource(nullptr);
videoSink = sink;
- if (videoSink)
- QObject::connect(videoSink, SIGNAL(destroyed(QObject *)), q, SLOT(_q_sinkDestroyed(QObject *)));
- else
- videoOutput = {};
-
+ if (sink)
+ sink->setSource(q);
captureSession->setVideoPreview(sink);
emit q->videoOutputChanged();
}
@@ -286,27 +278,7 @@ void QMediaCaptureSession::setEncoder(QMediaEncoder *encoder)
emit encoderChanged();
}
-/*!
- 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
+QObject *QMediaCaptureSession::videoOutput() const
{
Q_D(const QMediaCaptureSession);
return d->videoOutput;
@@ -323,28 +295,30 @@ QVariant QMediaCaptureSession::videoOutput() const
void QMediaCaptureSession::setVideoOutput(QObject *output)
{
Q_D(QMediaCaptureSession);
- QVariant out = QVariant::fromValue(output);
- if (d->videoOutput == out)
+ if (d->videoOutput == output)
return;
- d->videoOutput = out;
- QVideoSink *sink = nullptr;
- if (output) {
+ QVideoSink *sink = qobject_cast<QVideoSink *>(output);
+ if (!sink && output) {
auto *mo = output->metaObject();
mo->invokeMethod(output, "videoSink", Q_RETURN_ARG(QVideoSink *, sink));
}
+ d->videoOutput = output;
d->setVideoSink(sink);
}
-void QMediaCaptureSession::setVideoOutput(QVideoSink *sink)
+void QMediaCaptureSession::setVideoSink(QVideoSink *sink)
{
Q_D(QMediaCaptureSession);
- QVariant out = QVariant::fromValue(sink);
- if (d->videoOutput == out)
- return;
- d->videoOutput = out;
+ d->videoOutput = nullptr;
d->setVideoSink(sink);
}
+QVideoSink *QMediaCaptureSession::videoSink() const
+{
+ Q_D(const QMediaCaptureSession);
+ return d->videoSink;
+}
+
/*!
\internal
*/