diff options
29 files changed, 452 insertions, 383 deletions
diff --git a/examples/multimedia/audiorecorder/audiorecorder.cpp b/examples/multimedia/audiorecorder/audiorecorder.cpp index 821b6481c..0d0ad8355 100644 --- a/examples/multimedia/audiorecorder/audiorecorder.cpp +++ b/examples/multimedia/audiorecorder/audiorecorder.cpp @@ -69,7 +69,8 @@ AudioRecorder::AudioRecorder() { ui->setupUi(this); - m_audioRecorder = new QMediaRecorder(QMediaRecorder::AudioOnly, this); + m_audioRecorder = new QMediaRecorder(this); + m_captureSession.setRecorder(m_audioRecorder); // ### replace with a monitoring output once we have it. // m_probe = new QAudioProbe(this); // connect(m_probe, &QAudioProbe::audioBufferProbed, diff --git a/examples/multimedia/audiorecorder/audiorecorder.h b/examples/multimedia/audiorecorder/audiorecorder.h index 4d253d6b6..76968674b 100644 --- a/examples/multimedia/audiorecorder/audiorecorder.h +++ b/examples/multimedia/audiorecorder/audiorecorder.h @@ -53,6 +53,7 @@ #include <QMainWindow> #include <QMediaRecorder> +#include <QMediaCaptureSession> #include <QUrl> QT_BEGIN_NAMESPACE @@ -88,6 +89,7 @@ private: Ui::AudioRecorder *ui = nullptr; + QMediaCaptureSession m_captureSession; QMediaRecorder *m_audioRecorder = nullptr; QList<AudioLevel*> m_audioLevels; bool m_outputLocationSet = false; diff --git a/examples/multimediawidgets/camera/camera.cpp b/examples/multimediawidgets/camera/camera.cpp index b8fd7c4d5..8fa860901 100644 --- a/examples/multimediawidgets/camera/camera.cpp +++ b/examples/multimediawidgets/camera/camera.cpp @@ -104,14 +104,17 @@ Camera::Camera() : ui(new Ui::Camera) void Camera::setCamera(const QCameraInfo &cameraInfo) { m_camera.reset(new QCamera(cameraInfo)); + m_captureSession.setCamera(m_camera.data()); connect(m_camera.data(), &QCamera::activeChanged, this, &Camera::updateCameraActive); connect(m_camera.data(), &QCamera::errorOccurred, this, &Camera::displayCameraError); - m_mediaRecorder.reset(new QMediaRecorder(m_camera.data())); + m_mediaRecorder.reset(new QMediaRecorder); + m_captureSession.setRecorder(m_mediaRecorder.data()); connect(m_mediaRecorder.data(), &QMediaRecorder::stateChanged, this, &Camera::updateRecorderState); - m_imageCapture = new QCameraImageCapture(m_camera.data()); + m_imageCapture = new QCameraImageCapture; + m_captureSession.setImageCapture(m_imageCapture); connect(m_mediaRecorder.data(), &QMediaRecorder::durationChanged, this, &Camera::updateRecordTime); connect(m_mediaRecorder.data(), QOverload<QMediaRecorder::Error>::of(&QMediaRecorder::error), @@ -119,7 +122,7 @@ void Camera::setCamera(const QCameraInfo &cameraInfo) connect(ui->exposureCompensation, &QAbstractSlider::valueChanged, this, &Camera::setExposureCompensation); - m_camera->setViewfinder(ui->viewfinder); + m_captureSession.setVideoPreview(ui->viewfinder); updateCameraActive(m_camera->isActive()); updateRecorderState(m_mediaRecorder->state()); diff --git a/examples/multimediawidgets/camera/camera.h b/examples/multimediawidgets/camera/camera.h index 8b8968142..fe47acf75 100644 --- a/examples/multimediawidgets/camera/camera.h +++ b/examples/multimediawidgets/camera/camera.h @@ -56,6 +56,7 @@ #include <QMediaRecorder> #include <QScopedPointer> #include <QMediaMetaData> +#include <QMediaCaptureSession> #include <QMainWindow> @@ -128,6 +129,7 @@ private: QActionGroup *videoDevicesGroup = nullptr; + QMediaCaptureSession m_captureSession; QScopedPointer<QCamera> m_camera; QCameraImageCapture *m_imageCapture; QScopedPointer<QMediaRecorder> m_mediaRecorder; diff --git a/examples/multimediawidgets/camera/imagesettings.cpp b/examples/multimediawidgets/camera/imagesettings.cpp index a74982854..df0056029 100644 --- a/examples/multimediawidgets/camera/imagesettings.cpp +++ b/examples/multimediawidgets/camera/imagesettings.cpp @@ -55,7 +55,7 @@ #include <QDebug> #include <QCameraImageCapture> #include <QCamera> - +#include <QMediaCaptureSession> ImageSettings::ImageSettings(QCameraImageCapture *imageCapture, QWidget *parent) : QDialog(parent), @@ -75,7 +75,7 @@ ImageSettings::ImageSettings(QCameraImageCapture *imageCapture, QWidget *parent) ui->imageQualitySlider->setRange(0, int(QImageEncoderSettings::VeryHighQuality)); ui->imageResolutionBox->addItem(tr("Default Resolution")); - const QList<QSize> supportedResolutions = imagecapture->camera()->cameraInfo().photoResolutions(); + const QList<QSize> supportedResolutions = imagecapture->captureSession()->camera()->cameraInfo().photoResolutions(); for (const QSize &resolution : supportedResolutions) { ui->imageResolutionBox->addItem(QString("%1x%2").arg(resolution.width()).arg(resolution.height()), QVariant(resolution)); diff --git a/src/imports/multimedia/qdeclarativecamera.cpp b/src/imports/multimedia/qdeclarativecamera.cpp index 481c2f055..9e4f775a8 100644 --- a/src/imports/multimedia/qdeclarativecamera.cpp +++ b/src/imports/multimedia/qdeclarativecamera.cpp @@ -171,8 +171,8 @@ QDeclarativeCamera::QDeclarativeCamera(QObject *parent) : m_currentCameraInfo = QMediaDeviceManager::defaultVideoInput(); m_camera = new QCamera(m_currentCameraInfo); - m_imageCapture = new QDeclarativeCameraCapture(m_camera); - m_videoRecorder = new QDeclarativeCameraRecorder(m_camera); + m_imageCapture = new QDeclarativeCameraCapture(&captureSession); + m_videoRecorder = new QDeclarativeCameraRecorder(&captureSession); m_exposure = new QDeclarativeCameraExposure(m_camera); m_flash = new QDeclarativeCameraFlash(m_camera); m_torch = new QDeclarativeTorch(m_camera); diff --git a/src/imports/multimedia/qdeclarativecamera_p.h b/src/imports/multimedia/qdeclarativecamera_p.h index ebe7b4d2a..c06df6c42 100644 --- a/src/imports/multimedia/qdeclarativecamera_p.h +++ b/src/imports/multimedia/qdeclarativecamera_p.h @@ -58,6 +58,7 @@ #include <qcamerainfo.h> #include <qcameraimageprocessing.h> #include <qcameraimagecapture.h> +#include <qmediacapturesession.h> #include <QtCore/qbasictimer.h> #include <QtCore/qdatetime.h> @@ -246,6 +247,7 @@ private: Q_DISABLE_COPY(QDeclarativeCamera) void setupDevice(const QString &deviceName); + QMediaCaptureSession captureSession; QCamera *m_camera; QCameraInfo m_currentCameraInfo; diff --git a/src/imports/multimedia/qdeclarativecameracapture.cpp b/src/imports/multimedia/qdeclarativecameracapture.cpp index 59267e792..3360cc319 100644 --- a/src/imports/multimedia/qdeclarativecameracapture.cpp +++ b/src/imports/multimedia/qdeclarativecameracapture.cpp @@ -95,11 +95,10 @@ QT_BEGIN_NAMESPACE */ -QDeclarativeCameraCapture::QDeclarativeCameraCapture(QCamera *camera) - : QObject(camera), - m_camera(camera) +QDeclarativeCameraCapture::QDeclarativeCameraCapture(QMediaCaptureSession *captureSession) + : QObject(captureSession) { - m_capture = new QCameraImageCapture(camera); + m_capture = new QCameraImageCapture(captureSession); connect(m_capture, SIGNAL(readyForCaptureChanged(bool)), this, SIGNAL(readyForCaptureChanged(bool))); connect(m_capture, SIGNAL(imageExposed(int)), this, SIGNAL(imageExposed(int))); @@ -109,9 +108,6 @@ QDeclarativeCameraCapture::QDeclarativeCameraCapture(QCamera *camera) connect(m_capture, SIGNAL(imageSaved(int,QString)), this, SLOT(_q_imageSaved(int,QString))); connect(m_capture, SIGNAL(error(int,QCameraImageCapture::Error,QString)), this, SLOT(_q_captureFailed(int,QCameraImageCapture::Error,QString))); - - connect(m_camera, SIGNAL(statusChanged(QCamera::Status)), - this, SLOT(_q_cameraStatusChanged(QCamera::Status))); } QDeclarativeCameraCapture::~QDeclarativeCameraCapture() = default; @@ -230,44 +226,12 @@ void QDeclarativeCameraCapture::_q_captureFailed(int id, QCameraImageCapture::Er emit captureFailed(id, message); } -void QDeclarativeCameraCapture::_q_cameraStatusChanged(QCamera::Status status) -{ - if (status != QCamera::InactiveStatus && status != QCamera::ActiveStatus) - return; - - emit supportedResolutionsChanged(); -} /*! \property QDeclarativeCameraCapture::resolution This property holds the resolution/size of the image to be captured. If empty, the system chooses the appropriate resolution. */ - -/*! - \qmlproperty size QtMultimedia::CameraCapture::resolution - - This property holds the resolution/size of the image to be captured. - If empty, the system chooses the appropriate resolution. - - \sa supportedResolutions -*/ - -QSize QDeclarativeCameraCapture::resolution() -{ - return m_imageSettings.resolution(); -} - -void QDeclarativeCameraCapture::setResolution(const QSize &captureResolution) -{ - m_imageSettings = m_capture->encodingSettings(); - if (captureResolution != resolution()) { - m_imageSettings.setResolution(captureResolution); - m_capture->setEncodingSettings(m_imageSettings); - emit resolutionChanged(captureResolution); - } -} - QCameraImageCapture::Error QDeclarativeCameraCapture::error() const { return m_capture->error(); @@ -289,29 +253,6 @@ QString QDeclarativeCameraCapture::errorString() const } /*! - \qmlproperty list<size> QtMultimedia::CameraCapture::supportedResolutions - - This property holds a list of resolutions which are supported for capturing. - The information can be used to set a valid \e resolution. If the camera isn't - loaded, the list will be empty. - - \since 5.9 - \sa resolution - */ -QVariantList QDeclarativeCameraCapture::supportedResolutions() -{ - QVariantList supportedResolutions; - - if (m_camera) { - auto resolutions = m_camera->cameraInfo().photoResolutions(); - for (const auto &r : resolutions) - supportedResolutions.append(r); - } - - return supportedResolutions; -} - -/*! \qmlmethod QtMultimedia::CameraCapture::setMetadata(key, value) diff --git a/src/imports/multimedia/qdeclarativecameracapture_p.h b/src/imports/multimedia/qdeclarativecameracapture_p.h index aa6aa8fc6..055b16b1d 100644 --- a/src/imports/multimedia/qdeclarativecameracapture_p.h +++ b/src/imports/multimedia/qdeclarativecameracapture_p.h @@ -67,28 +67,22 @@ class QDeclarativeCameraCapture : public QObject Q_OBJECT Q_PROPERTY(bool ready READ isReadyForCapture NOTIFY readyForCaptureChanged) Q_PROPERTY(QString capturedImagePath READ capturedImagePath NOTIFY imageSaved) - Q_PROPERTY(QSize resolution READ resolution WRITE setResolution NOTIFY resolutionChanged) Q_PROPERTY(QString errorString READ errorString NOTIFY captureFailed) - Q_PROPERTY(QVariantList supportedResolutions READ supportedResolutions NOTIFY supportedResolutionsChanged REVISION 1) public: ~QDeclarativeCameraCapture(); bool isReadyForCapture() const; - QSize resolution(); - QString capturedImagePath() const; QCameraImageCapture::Error error() const; QString errorString() const; - QVariantList supportedResolutions(); public Q_SLOTS: int capture(); int captureToLocation(const QString &location); void cancelCapture(); - void setResolution(const QSize &resolution); void setMetadata(QMediaMetaData::Key key, const QVariant &value); Q_SIGNALS: @@ -100,20 +94,15 @@ Q_SIGNALS: void imageSaved(int requestId, const QString &path); void captureFailed(int requestId, const QString &message); - void resolutionChanged(const QSize &); - void supportedResolutionsChanged(); - private slots: void _q_imageCaptured(int, const QImage&); void _q_imageSaved(int, const QString&); void _q_captureFailed(int, QCameraImageCapture::Error, const QString&); - void _q_cameraStatusChanged(QCamera::Status status); private: friend class QDeclarativeCamera; - QDeclarativeCameraCapture(QCamera *camera); + QDeclarativeCameraCapture(QMediaCaptureSession *captureSession); - QCamera *m_camera; QCameraImageCapture *m_capture; QImageEncoderSettings m_imageSettings; QString m_capturedImagePath; diff --git a/src/imports/multimedia/qdeclarativecamerarecorder.cpp b/src/imports/multimedia/qdeclarativecamerarecorder.cpp index 39d218373..d5e49b6cf 100644 --- a/src/imports/multimedia/qdeclarativecamerarecorder.cpp +++ b/src/imports/multimedia/qdeclarativecamerarecorder.cpp @@ -75,10 +75,11 @@ QT_BEGIN_NAMESPACE \sa QAudioEncoderSettings, QVideoEncoderSettings */ -QDeclarativeCameraRecorder::QDeclarativeCameraRecorder(QCamera *camera, QObject *parent) : +QDeclarativeCameraRecorder::QDeclarativeCameraRecorder(QMediaCaptureSession *session, QObject *parent) : QObject(parent) { - m_recorder = new QMediaRecorder(camera, this); + m_recorder = new QMediaRecorder(this); + session->setRecorder(m_recorder); connect(m_recorder, SIGNAL(stateChanged(QMediaRecorder::State)), SLOT(updateRecorderState(QMediaRecorder::State))); connect(m_recorder, SIGNAL(statusChanged(QMediaRecorder::Status)), diff --git a/src/imports/multimedia/qdeclarativecamerarecorder_p.h b/src/imports/multimedia/qdeclarativecamerarecorder_p.h index 613d00cb6..48a35703a 100644 --- a/src/imports/multimedia/qdeclarativecamerarecorder_p.h +++ b/src/imports/multimedia/qdeclarativecamerarecorder_p.h @@ -209,7 +209,7 @@ private slots: private: friend class QDeclarativeCamera; - QDeclarativeCameraRecorder(QCamera *camera, QObject *parent = 0); + QDeclarativeCameraRecorder(QMediaCaptureSession *session, QObject *parent = 0); QMediaRecorder *m_recorder = nullptr; QDeclarativeMediaMetaData *m_metaData = nullptr; diff --git a/src/imports/multimedia/qdeclarativetorch.cpp b/src/imports/multimedia/qdeclarativetorch.cpp index 66f2105f4..d0fabe099 100644 --- a/src/imports/multimedia/qdeclarativetorch.cpp +++ b/src/imports/multimedia/qdeclarativetorch.cpp @@ -40,6 +40,7 @@ #include <QDebug> #include <private/qplatformmediacapture_p.h> #include <private/qplatformcamera_p.h> +#include <qmediacapturesession.h> #include "qdeclarativetorch_p.h" @@ -73,7 +74,7 @@ QDeclarativeTorch::QDeclarativeTorch(QCamera *camera) { if (!camera) return; - auto *service = m_camera->captureInterface(); + auto *service = m_camera->captureSession()->platformSession(); m_exposure = service->cameraControl()->exposureControl(); if (m_exposure) diff --git a/src/multimedia/camera/qcamera.cpp b/src/multimedia/camera/qcamera.cpp index 3db7040a5..e1a964fcd 100644 --- a/src/multimedia/camera/qcamera.cpp +++ b/src/multimedia/camera/qcamera.cpp @@ -49,6 +49,7 @@ #include <private/qplatformmediaintegration_p.h> #include <private/qplatformmediacapture_p.h> #include <qmediadevicemanager.h> +#include <qmediacapturesession.h> #include <QDebug> @@ -87,33 +88,30 @@ void QCameraPrivate::_q_error(int error, const QString &errorString) void QCameraPrivate::init() { Q_Q(QCamera); - initControls(); - cameraExposure = new QCameraExposure(q, control); - cameraFocus = new QCameraFocus(q, control); - imageProcessing = new QCameraImageProcessing(q, control); -} - -void QCameraPrivate::initControls() -{ - Q_Q(QCamera); - - captureInterface = QPlatformMediaIntegration::instance()->createCaptureSession(QMediaRecorder::AudioAndVideo); - if (captureInterface) { + control = nullptr; + if (captureInterface && !cameraInfo.isNull()) { control = captureInterface->cameraControl(); - - if (control) { - q->connect(control, SIGNAL(activeChanged(bool)), q, SIGNAL(activeChanged(bool))); - q->connect(control, SIGNAL(statusChanged(QCamera::Status)), q, SIGNAL(statusChanged(QCamera::Status))); - q->connect(control, SIGNAL(error(int,QString)), q, SLOT(_q_error(int,QString))); - } - - error = QCamera::NoError; + control->setCamera(cameraInfo); } else { - control = nullptr; + clear(); + error = QCamera::CameraError; + errorString = QCamera::tr("The camera is not connected to a capture session"); + return; + } + if (!control) { + clear(); error = QCamera::CameraError; - errorString = QCamera::tr("The camera captureInterface is missing"); + errorString = QCamera::tr("The capture session doesn't support cameras."); + return; } + + q->connect(control, SIGNAL(activeChanged(bool)), q, SIGNAL(activeChanged(bool))); + q->connect(control, SIGNAL(statusChanged(QCamera::Status)), q, SIGNAL(statusChanged(QCamera::Status))); + q->connect(control, SIGNAL(error(int,QString)), q, SLOT(_q_error(int,QString))); + cameraExposure = new QCameraExposure(q, control); + cameraFocus = new QCameraFocus(q, control); + imageProcessing = new QCameraImageProcessing(q, control); } void QCameraPrivate::clear() @@ -151,6 +149,7 @@ QCamera::QCamera(const QCameraInfo &cameraInfo, QObject *parent) : QObject(*new QCameraPrivate, parent) { Q_D(QCamera); + d->init(); setCameraInfo(cameraInfo); } @@ -191,7 +190,9 @@ QCamera::QCamera(QCameraInfo::Position position, QObject *parent) QCamera::~QCamera() { Q_D(QCamera); - d->clear(); + if (d->captureSession) + d->captureSession->setCamera(nullptr); + Q_ASSERT(!d->captureSession); } /*! @@ -206,13 +207,14 @@ bool QCamera::isAvailable() const bool QCamera::isActive() const { Q_D(const QCamera); - return d->control->isActive(); + return d->control && d->control->isActive(); } void QCamera::setActive(bool active) { Q_D(const QCamera); - d->control->setActive(active); + if (d->control) + d->control->setActive(active); } /*! @@ -240,38 +242,6 @@ QCameraImageProcessing *QCamera::imageProcessing() const } /*! - Sets a QObject based camera \a viewfinder. - - A QObject based viewfinder is expected to have an invokable videoSurface() - method that returns a QAbstractVideoSurface. - - The previously set viewfinder is detached. -*/ -void QCamera::setViewfinder(QObject *viewfinder) -{ - auto *mo = viewfinder->metaObject(); - QAbstractVideoSurface *surface = nullptr; - if (viewfinder && !mo->invokeMethod(viewfinder, "videoSurface", Q_RETURN_ARG(QAbstractVideoSurface *, surface))) { - qWarning() << "QCamera::setViewFinder: Object" << viewfinder->metaObject()->className() << "does not have a videoSurface()"; - return; - } - setViewfinder(surface); -} - -/*! - Sets a video \a surface as the viewfinder of a camera. - - If a viewfinder has already been set on the camera the new surface - will replace it. -*/ - -void QCamera::setViewfinder(QAbstractVideoSurface *surface) -{ - Q_D(QCamera); - d->control->setVideoSurface(surface); -} - -/*! Returns the error state of the object. */ @@ -288,14 +258,6 @@ QString QCamera::errorString() const return d_func()->errorString; } -/*! - \internal - */ -QPlatformMediaCaptureSession *QCamera::captureInterface() const -{ - return d_func()->captureInterface; -} - /*! \fn void QCamera::start() Starts the camera. @@ -326,6 +288,20 @@ QCamera::Status QCamera::status() const return QCamera::UnavailableStatus; } +QMediaCaptureSession *QCamera::captureSession() const +{ + Q_D(const QCamera); + return d->captureSession; +} + +void QCamera::setCaptureSession(QMediaCaptureSession *session) +{ + Q_D(QCamera); + d->captureSession = session; + d->captureInterface = session ? session->platformSession() : nullptr; + d->init(); +} + /*! Returns the QCameraInfo object associated with this camera. */ @@ -338,10 +314,7 @@ QCameraInfo QCamera::cameraInfo() const void QCamera::setCameraInfo(const QCameraInfo &cameraInfo) { Q_D(QCamera); - if (cameraInfo.isNull()) - d->cameraInfo = QMediaDeviceManager::defaultVideoInput(); - else - d->cameraInfo = cameraInfo; + d->cameraInfo = cameraInfo; if (d->control) d->control->setCamera(d->cameraInfo); } diff --git a/src/multimedia/camera/qcamera.h b/src/multimedia/camera/qcamera.h index 11b11b1a4..63003ecf4 100644 --- a/src/multimedia/camera/qcamera.h +++ b/src/multimedia/camera/qcamera.h @@ -61,6 +61,7 @@ QT_BEGIN_NAMESPACE class QAbstractVideoSurface; class QCameraInfo; class QPlatformMediaCaptureSession; +class QMediaCaptureSession; class QCameraPrivate; class Q_MULTIMEDIA_EXPORT QCamera : public QObject @@ -96,6 +97,8 @@ public: Status status() const; + QMediaCaptureSession *captureSession() const; + QCameraInfo cameraInfo() const; void setCameraInfo(const QCameraInfo &cameraInfo); @@ -103,13 +106,9 @@ public: QCameraFocus *focus() const; QCameraImageProcessing *imageProcessing() const; - void setViewfinder(QObject *viewfinder); - void setViewfinder(QAbstractVideoSurface *surface); - Error error() const; QString errorString() const; - QPlatformMediaCaptureSession *captureInterface() const; public Q_SLOTS: void setActive(bool active); void start() { setActive(true); } @@ -121,6 +120,8 @@ Q_SIGNALS: void errorOccurred(QCamera::Error); private: + void setCaptureSession(QMediaCaptureSession *session); + friend class QMediaCaptureSession; Q_DISABLE_COPY(QCamera) Q_DECLARE_PRIVATE(QCamera) Q_PRIVATE_SLOT(d_func(), void _q_error(int, const QString &)) diff --git a/src/multimedia/camera/qcamera_p.h b/src/multimedia/camera/qcamera_p.h index 5ef2566a4..f0f1c2553 100644 --- a/src/multimedia/camera/qcamera_p.h +++ b/src/multimedia/camera/qcamera_p.h @@ -71,13 +71,14 @@ public: } void init(); - void initControls(); void clear(); + QMediaCaptureSession *captureSession = nullptr; QPlatformMediaCaptureSession *captureInterface = nullptr; QPlatformCamera *control = nullptr; + QCameraInfo cameraDevice; QCameraExposure *cameraExposure = nullptr; QCameraFocus *cameraFocus = nullptr; QCameraImageProcessing *imageProcessing = nullptr; diff --git a/src/multimedia/camera/qcameraimagecapture.cpp b/src/multimedia/camera/qcameraimagecapture.cpp index b3528f9aa..e11b0cf28 100644 --- a/src/multimedia/camera/qcameraimagecapture.cpp +++ b/src/multimedia/camera/qcameraimagecapture.cpp @@ -41,6 +41,7 @@ #include <qmediaencodersettings.h> #include <qmediametadata.h> #include <private/qplatformmediacapture_p.h> +#include <qmediacapturesession.h> #include "private/qobject_p.h" #include <qcamera.h> @@ -85,6 +86,7 @@ class QCameraImageCapturePrivate public: QCamera *camera = nullptr; + QMediaCaptureSession *captureSession = nullptr; QPlatformCameraImageCapture *control = nullptr; QCameraImageCapture::Error error = QCameraImageCapture::NoError; @@ -93,7 +95,6 @@ public: void _q_error(int id, int error, const QString &errorString); void _q_readyChanged(bool); - void _q_serviceDestroyed(); void unsetError() { error = QCameraImageCapture::NoError; errorString.clear(); } @@ -116,56 +117,48 @@ void QCameraImageCapturePrivate::_q_readyChanged(bool ready) emit q->readyForCaptureChanged(ready); } -void QCameraImageCapturePrivate::_q_serviceDestroyed() -{ - camera = nullptr; - control = nullptr; -} - /*! Constructs a media recorder which records the media produced by \a camera. The \a camera is also used as the parent of this object. */ -QCameraImageCapture::QCameraImageCapture(QCamera *camera) - : QObject(camera), d_ptr(new QCameraImageCapturePrivate) +QCameraImageCapture::QCameraImageCapture(QObject *parent) + : QObject(parent), d_ptr(new QCameraImageCapturePrivate) { - Q_ASSERT(camera); Q_D(QCameraImageCapture); - d->q_ptr = this; - d->camera = camera; - - QPlatformMediaCaptureSession *service = camera->captureInterface(); - if (service) { - d->control = service->imageCaptureControl(); - - if (d->control) { - connect(d->control, SIGNAL(imageExposed(int)), - this, SIGNAL(imageExposed(int))); - connect(d->control, SIGNAL(imageCaptured(int,QImage)), - this, SIGNAL(imageCaptured(int,QImage))); - connect(d->control, SIGNAL(imageMetadataAvailable(int,const QMediaMetaData&)), - this, SIGNAL(imageMetadataAvailable(int,const QMediaMetaData&))); - connect(d->control, SIGNAL(imageAvailable(int,QVideoFrame)), - this, SIGNAL(imageAvailable(int,QVideoFrame))); - connect(d->control, SIGNAL(imageSaved(int,QString)), - this, SIGNAL(imageSaved(int,QString))); - connect(d->control, SIGNAL(readyForCaptureChanged(bool)), - this, SLOT(_q_readyChanged(bool))); - connect(d->control, SIGNAL(error(int,int,QString)), - this, SLOT(_q_error(int,int,QString))); - - connect(service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed())); - - return; - } +} + +void QCameraImageCapture::setCaptureSession(QMediaCaptureSession *session) +{ + Q_D(QCameraImageCapture); + d->captureSession = session; + + if (!session) { + d->control = nullptr; + return; } - // without QPlatformCameraImageCapture discard the camera - d->camera = nullptr; - d->control = nullptr; + d->control = session->platformSession()->imageCaptureControl(); + + if (!d->control) + return; + + connect(d->control, SIGNAL(imageExposed(int)), + this, SIGNAL(imageExposed(int))); + connect(d->control, SIGNAL(imageCaptured(int,QImage)), + this, SIGNAL(imageCaptured(int,QImage))); + connect(d->control, SIGNAL(imageMetadataAvailable(int,const QMediaMetaData&)), + this, SIGNAL(imageMetadataAvailable(int,const QMediaMetaData&))); + connect(d->control, SIGNAL(imageAvailable(int,QVideoFrame)), + this, SIGNAL(imageAvailable(int,QVideoFrame))); + connect(d->control, SIGNAL(imageSaved(int,QString)), + this, SIGNAL(imageSaved(int,QString))); + connect(d->control, SIGNAL(readyForCaptureChanged(bool)), + this, SLOT(_q_readyChanged(bool))); + connect(d->control, SIGNAL(error(int,int,QString)), + this, SLOT(_q_error(int,int,QString))); } /*! @@ -174,18 +167,12 @@ QCameraImageCapture::QCameraImageCapture(QCamera *camera) QCameraImageCapture::~QCameraImageCapture() { + if (d_ptr->captureSession) + d_ptr->captureSession->setImageCapture(nullptr); delete d_ptr; } /*! - \reimp -*/ -QCamera *QCameraImageCapture::camera() const -{ - return d_func()->camera; -} - -/*! Returns true if the images capture service ready to use. */ bool QCameraImageCapture::isAvailable() const @@ -193,6 +180,11 @@ bool QCameraImageCapture::isAvailable() const return d_func()->control != nullptr; } +QMediaCaptureSession *QCameraImageCapture::captureSession() const +{ + return d_ptr->captureSession; +} + /*! Returns the current error state. diff --git a/src/multimedia/camera/qcameraimagecapture.h b/src/multimedia/camera/qcameraimagecapture.h index 785ab1d78..1eb72a63b 100644 --- a/src/multimedia/camera/qcameraimagecapture.h +++ b/src/multimedia/camera/qcameraimagecapture.h @@ -56,6 +56,7 @@ QT_BEGIN_NAMESPACE class QImageEncoderSettings; class QCamera; +class QMediaCaptureSession; class QCameraImageCapturePrivate; class Q_MULTIMEDIA_EXPORT QCameraImageCapture : public QObject @@ -82,12 +83,12 @@ public: }; Q_DECLARE_FLAGS(CaptureDestinations, CaptureDestination) - explicit QCameraImageCapture(QCamera *camera); + explicit QCameraImageCapture(QObject *parent = nullptr); ~QCameraImageCapture(); bool isAvailable() const; - QCamera *camera() const; + QMediaCaptureSession *captureSession() const; Error error() const; QString errorString() const; @@ -120,14 +121,17 @@ Q_SIGNALS: void imageAvailable(int id, const QVideoFrame &frame); void imageSaved(int id, const QString &fileName); -protected: - QCameraImageCapturePrivate *d_ptr; private: + // This is here to flag an incompatibilities with Qt 5 + QCameraImageCapture(QCamera *) = delete; + + friend class QMediaCaptureSession; + void setCaptureSession(QMediaCaptureSession *session); + QCameraImageCapturePrivate *d_ptr; Q_DISABLE_COPY(QCameraImageCapture) Q_DECLARE_PRIVATE(QCameraImageCapture) Q_PRIVATE_SLOT(d_func(), void _q_error(int, int, const QString &)) Q_PRIVATE_SLOT(d_func(), void _q_readyChanged(bool)) - Q_PRIVATE_SLOT(d_func(), void _q_serviceDestroyed()) }; Q_DECLARE_OPERATORS_FOR_FLAGS(QCameraImageCapture::CaptureDestinations) diff --git a/src/multimedia/recording/qmediacapturesession.cpp b/src/multimedia/recording/qmediacapturesession.cpp index bac3da3e2..251f09b51 100644 --- a/src/multimedia/recording/qmediacapturesession.cpp +++ b/src/multimedia/recording/qmediacapturesession.cpp @@ -39,21 +39,23 @@ #include "qmediacapturesession.h" #include "qaudiodeviceinfo.h" -#include "qplatformmediaintegration_p.h" #include "qcamera.h" #include "qmediarecorder.h" #include "qcameraimagecapture.h" +#include "qplatformmediaintegration_p.h" +#include "qplatformmediacapture_p.h" + QT_BEGIN_NAMESPACE class QMediaCaptureSessionPrivate { public: QPlatformMediaCaptureSession *captureSession; - QCamera *camera; QAudioDeviceInfo audioInput; - QCameraImageCapture *imageCapture; - QMediaRecorder *recorder; + QCamera *camera = nullptr; + QCameraImageCapture *imageCapture = nullptr; + QMediaRecorder *recorder = nullptr; }; @@ -104,7 +106,14 @@ QCamera *QMediaCaptureSession::camera() const void QMediaCaptureSession::setCamera(QCamera *camera) { + if (d_ptr->camera == camera) + return; + if (d_ptr->camera) + d_ptr->camera->setCaptureSession(nullptr); + d_ptr->camera = camera; + if (d_ptr->camera) + d_ptr->camera->setCaptureSession(this); emit cameraChanged(); } @@ -115,7 +124,14 @@ QCameraImageCapture *QMediaCaptureSession::imageCapture() void QMediaCaptureSession::setImageCapture(QCameraImageCapture *imageCapture) { + if (d_ptr->imageCapture == imageCapture) + return; + if (d_ptr->imageCapture) + d_ptr->imageCapture->setCaptureSession(nullptr); + d_ptr->imageCapture = imageCapture; + if (d_ptr->imageCapture) + d_ptr->imageCapture->setCaptureSession(this); emit imageCaptureChanged(); } @@ -126,10 +142,47 @@ QMediaRecorder *QMediaCaptureSession::recorder() void QMediaCaptureSession::setRecorder(QMediaRecorder *recorder) { + if (d_ptr->recorder == recorder) + return; + if (d_ptr->recorder) + d_ptr->recorder->setCaptureSession(nullptr); + d_ptr->recorder = recorder; + if (d_ptr->recorder) + d_ptr->recorder->setCaptureSession(this); emit recorderChanged(); } +/*! + Sets a QObject based video preview for the capture session. + + A QObject based preview is expected to have an invokable videoSurface() + method that returns a QAbstractVideoSurface. + + The previously set preview is detached. +*/ +void QMediaCaptureSession::setVideoPreview(QObject *preview) +{ + auto *mo = preview->metaObject(); + QAbstractVideoSurface *surface = nullptr; + if (preview && !mo->invokeMethod(preview, "videoSurface", Q_RETURN_ARG(QAbstractVideoSurface *, surface))) { + qWarning() << "QCamera::setViewFinder: Object" << preview->metaObject()->className() << "does not have a videoSurface()"; + return; + } + setVideoPreview(surface); +} + +/*! + Sets a video \a surface as the preview for the capture session. + + If a preview has already been set on the session, the new surface + will replace it. +*/ +void QMediaCaptureSession::setVideoPreview(QAbstractVideoSurface *preview) +{ + d_ptr->captureSession->setVideoPreview(preview); +} + QPlatformMediaCaptureSession *QMediaCaptureSession::platformSession() const { return d_ptr->captureSession; diff --git a/src/multimedia/recording/qmediacapturesession.h b/src/multimedia/recording/qmediacapturesession.h index 05eb20405..db2976385 100644 --- a/src/multimedia/recording/qmediacapturesession.h +++ b/src/multimedia/recording/qmediacapturesession.h @@ -47,9 +47,11 @@ QT_BEGIN_NAMESPACE class QCamera; class QAudioDeviceInfo; +class QCameraInfo; class QCameraImageCapture; // ### rename to QMediaImageCapture class QMediaRecorder; class QPlatformMediaCaptureSession; +class QAbstractVideoSurface; class QMediaCaptureSessionPrivate; class Q_MULTIMEDIA_EXPORT QMediaCaptureSession : public QObject @@ -77,6 +79,9 @@ public: QMediaRecorder *recorder(); void setRecorder(QMediaRecorder *recorder); + void setVideoPreview(QObject *preview); + void setVideoPreview(QAbstractVideoSurface *preview); + QPlatformMediaCaptureSession *platformSession() const; Q_SIGNALS: diff --git a/src/multimedia/recording/qmediarecorder.cpp b/src/multimedia/recording/qmediarecorder.cpp index e480eb45b..7cd5b2a32 100644 --- a/src/multimedia/recording/qmediarecorder.cpp +++ b/src/multimedia/recording/qmediarecorder.cpp @@ -43,6 +43,7 @@ #include <private/qplatformmediarecorder_p.h> #include <qaudiodeviceinfo.h> #include <qcamera.h> +#include <qmediacapturesession.h> #include <private/qplatformcamera_p.h> #include <private/qplatformmediaintegration_p.h> #include <private/qplatformmediacapture_p.h> @@ -126,29 +127,12 @@ void QMediaRecorderPrivate::_q_applySettings() Constructs a media recorder which records the media produced by a microphone and camera. */ -QMediaRecorder::QMediaRecorder(QMediaRecorder::CaptureMode mode, QObject *parent) +QMediaRecorder::QMediaRecorder(QObject *parent) : QObject(parent), d_ptr(new QMediaRecorderPrivate) { Q_D(QMediaRecorder); d->q_ptr = this; - - if (mode != AudioOnly) { - setCamera(new QCamera(this)); - } else { - auto *captureIface = QPlatformMediaIntegration::instance()->createCaptureSession(mode); - d->control = captureIface->mediaRecorderControl(); - } -} - -QMediaRecorder::QMediaRecorder(QCamera *camera, QObject *parent) - : QObject(parent), - d_ptr(new QMediaRecorderPrivate) -{ - Q_D(QMediaRecorder); - d->q_ptr = this; - - setCamera(camera); } /*! @@ -157,23 +141,31 @@ QMediaRecorder::QMediaRecorder(QCamera *camera, QObject *parent) QMediaRecorder::~QMediaRecorder() { + if (d_ptr->captureSession) + d_ptr->captureSession->setRecorder(nullptr); delete d_ptr; } /*! \internal */ -bool QMediaRecorder::setCamera(QCamera *object) +void QMediaRecorder::setCaptureSession(QMediaCaptureSession *session) { Q_D(QMediaRecorder); - Q_ASSERT(!d->camera); + if (d->captureSession == session) + return; - d->camera = object; + if (d->control) + d->control->disconnect(this); + + d->captureSession = session; - auto *service = d->camera->captureInterface(); - Q_ASSERT(service); + if (!d->captureSession) { + d->control = nullptr; + return; + } - d->control = service->mediaRecorderControl(); + d->control = d->captureSession->platformSession()->mediaRecorderControl(); Q_ASSERT(d->control); connect(d->control, SIGNAL(stateChanged(QMediaRecorder::State)), @@ -202,7 +194,6 @@ bool QMediaRecorder::setCamera(QCamera *object) d->applySettingsLater(); - return true; } /*! @@ -603,13 +594,14 @@ QCameraInfo QMediaRecorder::videoInput() const { Q_D(const QMediaRecorder); - return d->camera ? d->camera->cameraInfo() : QCameraInfo(); + auto *camera = d->captureSession->camera(); + return camera ? camera->cameraInfo() : QCameraInfo(); } -QCamera *QMediaRecorder::camera() const +QMediaCaptureSession *QMediaRecorder::captureSession() const { Q_D(const QMediaRecorder); - return d->camera; + return d->captureSession; } /*! diff --git a/src/multimedia/recording/qmediarecorder.h b/src/multimedia/recording/qmediarecorder.h index b024b8a22..eb0c02b56 100644 --- a/src/multimedia/recording/qmediarecorder.h +++ b/src/multimedia/recording/qmediarecorder.h @@ -59,6 +59,7 @@ class QMediaRecorderService; class QAudioEncoderSettings; class QVideoEncoderSettings; class QAudioDeviceInfo; +class QMediaCaptureSession; class QMediaRecorderPrivate; class Q_MULTIMEDIA_EXPORT QMediaRecorder : public QObject @@ -107,8 +108,7 @@ public: AudioAndVideo }; - QMediaRecorder(CaptureMode mode = AudioOnly, QObject *parent = nullptr); - explicit QMediaRecorder(QCamera *mediaSource, QObject *parent = nullptr); + QMediaRecorder(QObject *parent = nullptr); ~QMediaRecorder(); bool isAvailable() const; @@ -139,7 +139,7 @@ public: QAudioDeviceInfo audioInput() const; QCameraInfo videoInput() const; - QCamera *camera() const; + QMediaCaptureSession *captureSession() const; public Q_SLOTS: void record(); @@ -162,11 +162,13 @@ Q_SIGNALS: void metaDataChanged(); -protected: - bool setCamera(QCamera *object); +private: + // This is here to flag an incompatibilities with Qt 5 + QMediaRecorder(QCamera *) = delete; QMediaRecorderPrivate *d_ptr; -private: + friend class QMediaCaptureSession; + void setCaptureSession(QMediaCaptureSession *session); Q_DISABLE_COPY(QMediaRecorder) Q_DECLARE_PRIVATE(QMediaRecorder) Q_PRIVATE_SLOT(d_func(), void _q_stateChanged(QMediaRecorder::State)) diff --git a/src/multimedia/recording/qmediarecorder_p.h b/src/multimedia/recording/qmediarecorder_p.h index 096236a05..2cadc709a 100644 --- a/src/multimedia/recording/qmediarecorder_p.h +++ b/src/multimedia/recording/qmediarecorder_p.h @@ -64,20 +64,16 @@ class QAudioEncoderSettingsControl; class QVideoEncoderSettingsControl; class QTimer; -#define Q_DECLARE_NON_CONST_PUBLIC(Class) \ - inline Class* q_func() { return static_cast<Class *>(q_ptr); } \ - friend class Class; - class QMediaRecorderPrivate { - Q_DECLARE_NON_CONST_PUBLIC(QMediaRecorder) + Q_DECLARE_PUBLIC(QMediaRecorder) public: QMediaRecorderPrivate() = default; void applySettingsLater(); - QPointer<QCamera> camera; + QMediaCaptureSession *captureSession = nullptr; QPlatformMediaRecorder *control = nullptr; diff --git a/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp index 7cea41330..4699a6c20 100644 --- a/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp +++ b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp @@ -43,7 +43,7 @@ #include "qdeclarativevideooutput_p.h" #include <private/qvideooutputorientationhandler_p.h> #include <QtMultimedia/qmediaplayer.h> -#include <QtMultimedia/qcamera.h> +#include <QtMultimedia/qmediacapturesession.h> #include <private/qfactoryloader_p.h> #include <QtCore/qloggingcategory.h> @@ -176,19 +176,18 @@ void QDeclarativeVideoOutput::setSource(QObject *source) return; m_source = source; - QObject *s = source; - if (s) { + if (source) { const QMetaObject *metaObject = m_source.data()->metaObject(); int mediaSourcePropertyIndex = metaObject->indexOfProperty("mediaSource"); if (mediaSourcePropertyIndex != -1) { const QMetaProperty mediaSourceProperty = metaObject->property(mediaSourcePropertyIndex); - s = mediaSourceProperty.read(s).value<QObject *>(); + source = mediaSourceProperty.read(source).value<QObject *>(); } } - if (QCamera *c = qobject_cast<QCamera *>(s)) { - c->setViewfinder(videoSurface()); - } else if (QMediaPlayer *p = qobject_cast<QMediaPlayer *>(s)) { + if (QMediaCaptureSession *s = qobject_cast<QMediaCaptureSession *>(source)) { + s->setVideoPreview(videoSurface()); + } else if (QMediaPlayer *p = qobject_cast<QMediaPlayer *>(source)) { p->setVideoOutput(videoSurface()); } emit sourceChanged(); diff --git a/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp b/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp index 190f54e16..7923689b7 100644 --- a/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp +++ b/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp @@ -41,6 +41,7 @@ #include <qcamera.h> #include <qcamerainfo.h> #include <qcameraimagecapture.h> +#include <qmediacapturesession.h> #include <qobject.h> #include <qmediadevicemanager.h> #include <qmediarecorder.h> @@ -155,8 +156,11 @@ void tst_QCameraBackend::testCtorWithPosition() void tst_QCameraBackend::testCameraStates() { + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); QSignalSpy errorSignal(&camera, SIGNAL(errorOccurred(QCamera::Error))); QSignalSpy activeChangedSignal(&camera, SIGNAL(activeChanged())); @@ -183,8 +187,12 @@ void tst_QCameraBackend::testCameraStates() void tst_QCameraBackend::testCameraStartError() { + QMediaCaptureSession session1; + QMediaCaptureSession session2; QCamera camera1(QMediaDeviceManager::defaultVideoInput()); QCamera camera2(QMediaDeviceManager::defaultVideoInput()); + session1.setCamera(&camera1); + session2.setCamera(&camera2); QSignalSpy errorSpy1(&camera1, &QCamera::errorOccurred); QSignalSpy errorSpy2(&camera2, &QCamera::errorOccurred); @@ -203,8 +211,12 @@ void tst_QCameraBackend::testCameraStartError() void tst_QCameraBackend::testCameraCapture() { + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); + //prevents camera to flash during the test camera.exposure()->setFlashMode(QCameraExposure::FlashOff); @@ -249,8 +261,12 @@ void tst_QCameraBackend::testCameraCapture() void tst_QCameraBackend::testCaptureToBuffer() { + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); + camera.exposure()->setFlashMode(QCameraExposure::FlashOff); camera.setActive(true); @@ -324,8 +340,12 @@ void tst_QCameraBackend::testCameraCaptureMetadata() { QSKIP("Capture metadata is supported only on harmattan"); + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); + camera.exposure()->setFlashMode(QCameraExposure::FlashOff); QSignalSpy metadataSignal(&imageCapture, SIGNAL(imageMetadataAvailable(int,const QMediaMetaData&))); @@ -421,9 +441,12 @@ void tst_QCameraBackend::testVideoRecording() { QFETCH(QCameraInfo, device); + QMediaCaptureSession session; QScopedPointer<QCamera> camera(new QCamera(device)); + session.setCamera(camera.data()); - QMediaRecorder recorder(camera.data()); + QMediaRecorder recorder; + session.setRecorder(&recorder); QSignalSpy errorSignal(camera.data(), SIGNAL(errorOccurred(QCamera::Error))); QSignalSpy recorderErrorSignal(&recorder, SIGNAL(error(QMediaRecorder::Error))); diff --git a/tests/auto/unit/multimedia/qaudiorecorder/tst_qaudiorecorder.cpp b/tests/auto/unit/multimedia/qaudiorecorder/tst_qaudiorecorder.cpp index b599cdbf5..6a1b4aa55 100644 --- a/tests/auto/unit/multimedia/qaudiorecorder/tst_qaudiorecorder.cpp +++ b/tests/auto/unit/multimedia/qaudiorecorder/tst_qaudiorecorder.cpp @@ -35,6 +35,7 @@ #include <private/qplatformmediarecorder_p.h> #include <qaudiodeviceinfo.h> #include <qaudioinput.h> +#include <qmediacapturesession.h> //TESTED_COMPONENT=src/multimedia @@ -106,9 +107,11 @@ void tst_QAudioRecorder::testNullControl() void tst_QAudioRecorder::testAudioSource() { - audiosource = new QMediaRecorder(QMediaRecorder::AudioOnly); + QMediaCaptureSession session; + audiosource = new QMediaRecorder; + session.setRecorder(audiosource); - QCOMPARE(audiosource->camera(), nullptr); + QCOMPARE(session.camera(), nullptr); } void tst_QAudioRecorder::testDevices() diff --git a/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp b/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp index a9a94b7c5..bbf405ad0 100644 --- a/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp +++ b/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp @@ -40,6 +40,7 @@ #include <qcamera.h> #include <qcamerainfo.h> #include <qcameraimagecapture.h> +#include <qmediacapturesession.h> #include <qobject.h> #include <qmediadevicemanager.h> @@ -246,8 +247,11 @@ void tst_QCamera::testSimpleCameraCapture() { MockMediaRecorderService::simpleCamera = true; + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); QVERIFY(!imageCapture.isReadyForCapture()); QVERIFY(!imageCapture.isAvailable()); @@ -266,8 +270,11 @@ void tst_QCamera::testSimpleCaptureDestination() { MockMediaRecorderService::simpleCamera = true; + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); QCOMPARE(imageCapture.captureDestination(), QCameraImageCapture::CaptureToFile); imageCapture.setCaptureDestination(QCameraImageCapture::CaptureToBuffer); @@ -276,8 +283,11 @@ void tst_QCamera::testSimpleCaptureDestination() void tst_QCamera::testCaptureDestination() { + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); QSignalSpy destinationChangedSignal(&imageCapture, SIGNAL(captureDestinationChanged(QCameraImageCapture::CaptureDestinations))); @@ -295,8 +305,11 @@ void tst_QCamera::testCaptureDestination() void tst_QCamera::testCameraCapture() { + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); QVERIFY(!imageCapture.isReadyForCapture()); @@ -323,8 +336,11 @@ void tst_QCamera::testCameraCapture() void tst_QCamera::testCameraCaptureMetadata() { + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); QSignalSpy metadataSignal(&imageCapture, SIGNAL(imageMetadataAvailable(int,const QMediaMetaData&))); QSignalSpy savedSignal(&imageCapture, SIGNAL(imageSaved(int,QString))); @@ -644,8 +660,11 @@ void tst_QCamera::testImageSettings() void tst_QCamera::testCameraEncodingProperyChange() { + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); QSignalSpy stateChangedSignal(&camera, SIGNAL(stateChanged(QCamera::State))); QSignalSpy statusChangedSignal(&camera, SIGNAL(statusChanged(QCamera::Status))); @@ -665,7 +684,7 @@ void tst_QCamera::testSetVideoOutput() MockVideoSurface surface; QCamera camera; - camera.setViewfinder(static_cast<QAbstractVideoSurface *>(nullptr)); +// camera.setViewfinder(static_cast<QAbstractVideoSurface *>(nullptr)); // QCOMPARE(mockCameraService->rendererRef, 0); @@ -701,7 +720,7 @@ void tst_QCamera::testSetVideoOutputNoService() integration->setFlags(QMockIntegration::NoCaptureInterface); QCamera camera; - camera.setViewfinder(&surface); +// camera.setViewfinder(&surface); // Nothing we can verify here other than it doesn't assert. } @@ -711,7 +730,7 @@ void tst_QCamera::testSetVideoOutputDestruction() { QCamera camera; - camera.setViewfinder(&surface); +// camera.setViewfinder(&surface); } } diff --git a/tests/auto/unit/multimedia/qcameraimagecapture/tst_qcameraimagecapture.cpp b/tests/auto/unit/multimedia/qcameraimagecapture/tst_qcameraimagecapture.cpp index 6c8fb8456..4abc9d5a4 100644 --- a/tests/auto/unit/multimedia/qcameraimagecapture/tst_qcameraimagecapture.cpp +++ b/tests/auto/unit/multimedia/qcameraimagecapture/tst_qcameraimagecapture.cpp @@ -46,6 +46,7 @@ Reviewer Name Date Coverage ( Full / Test Case IDs ). #include <private/qplatformcameraimageprocessing_p.h> #include <qcamera.h> #include <qcameraimagecapture.h> +#include <qmediacapturesession.h> #include "mockmediarecorderservice.h" #include "qmockintegration_p.h" @@ -103,37 +104,53 @@ void tst_QCameraImageCapture::cleanupTestCase() //MaemoAPI-1823:test QCameraImageCapture Constructor void tst_QCameraImageCapture::constructor() { + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); + QVERIFY(imageCapture.isAvailable() == true); } //MaemoAPI-1824:test mediaSource void tst_QCameraImageCapture::mediaSource() { - QCamera camera; - mockIntegration->lastCaptureService()->hasControls = false; - QCameraImageCapture imageCapture(&camera); - QVERIFY(imageCapture.camera() == nullptr); - - QCamera camera1; - QCameraImageCapture imageCapture1(&camera1); - auto *medobj1 = imageCapture1.camera(); - QCOMPARE(medobj1, &camera1); + { + QMediaCaptureSession session; + QCamera camera; + mockIntegration->lastCaptureService()->hasControls = false; + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); + + QVERIFY(!imageCapture.isAvailable()); + } + + { + QMediaCaptureSession session; + QCamera camera; + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); + + QVERIFY(imageCapture.isAvailable()); + } } void tst_QCameraImageCapture::deleteMediaSource() { + QMediaCaptureSession session; QCamera *camera = new QCamera; - QCameraImageCapture *capture = new QCameraImageCapture(camera); + QCameraImageCapture *capture = new QCameraImageCapture; + session.setCamera(camera); + session.setImageCapture(capture); - QVERIFY(capture->camera() == camera); QVERIFY(capture->isAvailable()); delete camera; - //capture should detach from camera - QVERIFY(capture->camera() == nullptr); + QVERIFY(session.camera() == nullptr); QVERIFY(!capture->isAvailable()); capture->capture(); @@ -143,8 +160,12 @@ void tst_QCameraImageCapture::deleteMediaSource() //MaemoAPI-1825:test isReadyForCapture void tst_QCameraImageCapture::isReadyForCapture() { + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); + QVERIFY(imageCapture.isAvailable() == true); QVERIFY(imageCapture.isReadyForCapture() == false); camera.start(); @@ -156,8 +177,12 @@ void tst_QCameraImageCapture::isReadyForCapture() //MaemoAPI-1826:test capture void tst_QCameraImageCapture::capture() { + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); + QVERIFY(imageCapture.isAvailable() == true); QVERIFY(imageCapture.isReadyForCapture() == false); QVERIFY(imageCapture.capture() == -1); @@ -171,8 +196,12 @@ void tst_QCameraImageCapture::capture() //MaemoAPI-1827:test cancelCapture void tst_QCameraImageCapture::cancelCapture() { + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); + QSignalSpy spy(&imageCapture, SIGNAL(imageCaptured(int,QImage))); QSignalSpy spy1(&imageCapture, SIGNAL(imageSaved(int,QString))); QVERIFY(imageCapture.isAvailable() == true); @@ -198,8 +227,12 @@ void tst_QCameraImageCapture::cancelCapture() //MaemoAPI-1829:test set encodingSettings void tst_QCameraImageCapture::encodingSettings() { + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); + QVERIFY(imageCapture.isAvailable() == true); QVERIFY(imageCapture.encodingSettings() == QImageEncoderSettings()); QImageEncoderSettings settings; @@ -216,15 +249,25 @@ void tst_QCameraImageCapture::errors() { MockMediaRecorderService::simpleCamera = true; - QCamera camera1; - QCameraImageCapture imageCapture1(&camera1); - QVERIFY(imageCapture1.isAvailable() == false); - imageCapture1.capture(QString::fromLatin1("/dev/null")); - QVERIFY(imageCapture1.error() == QCameraImageCapture::NotSupportedFeatureError); - QVERIFY2(!imageCapture1.errorString().isEmpty(), "Device does not support images capture"); + { + QMediaCaptureSession session; + QCamera camera; + QCameraImageCapture imageCapture; + session.setCamera(&camera); + + session.setImageCapture(&imageCapture); + QVERIFY(imageCapture.isAvailable() == false); + imageCapture.capture(QString::fromLatin1("/dev/null")); + QVERIFY(imageCapture.error() == QCameraImageCapture::NotSupportedFeatureError); + QVERIFY2(!imageCapture.errorString().isEmpty(), "Device does not support images capture"); + } + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); + QVERIFY(imageCapture.isAvailable() == true); QVERIFY(imageCapture.error() == QCameraImageCapture::NoError); QVERIFY(imageCapture.errorString().isEmpty()); @@ -239,8 +282,12 @@ void tst_QCameraImageCapture::errors() //MaemoAPI-1831:test error void tst_QCameraImageCapture::error() { + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); + QSignalSpy spy(&imageCapture, SIGNAL(error(int,QCameraImageCapture::Error,QString))); imageCapture.capture(); QTest::qWait(30); @@ -254,8 +301,12 @@ void tst_QCameraImageCapture::error() //MaemoAPI-1832:test imageCaptured void tst_QCameraImageCapture::imageCaptured() { + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); + QSignalSpy spy(&imageCapture, SIGNAL(imageCaptured(int,QImage))); QVERIFY(imageCapture.isAvailable() == true); QVERIFY(imageCapture.isReadyForCapture() == false); @@ -274,8 +325,12 @@ void tst_QCameraImageCapture::imageCaptured() //MaemoAPI-1833:test imageExposed void tst_QCameraImageCapture::imageExposed() { + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); + QSignalSpy spy(&imageCapture, SIGNAL(imageExposed(int))); QVERIFY(imageCapture.isAvailable() == true); QVERIFY(imageCapture.isReadyForCapture() == false); @@ -292,8 +347,12 @@ void tst_QCameraImageCapture::imageExposed() //MaemoAPI-1834:test imageSaved void tst_QCameraImageCapture::imageSaved() { + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); + QSignalSpy spy(&imageCapture, SIGNAL(imageSaved(int,QString))); QVERIFY(imageCapture.isAvailable() == true); QVERIFY(imageCapture.isReadyForCapture() == false); @@ -311,8 +370,12 @@ void tst_QCameraImageCapture::imageSaved() //MaemoAPI-1835:test readyForCaptureChanged void tst_QCameraImageCapture::readyForCaptureChanged() { + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); + QSignalSpy spy(&imageCapture, SIGNAL(readyForCaptureChanged(bool))); QVERIFY(imageCapture.isReadyForCapture() == false); imageCapture.capture(); diff --git a/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp b/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp index 356cc64e7..ccbb0774b 100644 --- a/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp +++ b/tests/auto/unit/multimedia/qmediarecorder/tst_qmediarecorder.cpp @@ -35,6 +35,7 @@ #include <qmediarecorder.h> #include <qaudioformat.h> #include <qmockintegration_p.h> +#include <qmediacapturesession.h> #include "mockmediarecorderservice.h" #include "mockmediarecordercontrol.h" @@ -72,7 +73,6 @@ private slots: void testAudioSettingsOperatorAssign(); void testAudioSettingsDestructor(); - void testAvailabilityStatus(); void testIsAvailable(); void testMediaSource(); void testEnum(); @@ -87,6 +87,7 @@ private slots: private: QMockIntegration *mockIntegration = nullptr; + QMediaCaptureSession *captureSession; QCamera *object = nullptr; MockMediaRecorderService *service = nullptr; MockMediaRecorderControl *mock; @@ -96,8 +97,11 @@ private: void tst_QMediaRecorder::initTestCase() { mockIntegration = new QMockIntegration; + captureSession = new QMediaCaptureSession; object = new QCamera; - capture = new QMediaRecorder(object); + capture = new QMediaRecorder; + captureSession->setCamera(object); + captureSession->setRecorder(capture); service = mockIntegration->lastCaptureService(); mock = service->mockControl; } @@ -114,8 +118,11 @@ void tst_QMediaRecorder::testNullService() { const QString id(QLatin1String("application/x-format")); - QCamera object; - QMediaRecorder recorder(&object); + QMediaCaptureSession session; + QCamera camera; + QMediaRecorder recorder; + session.setCamera(&camera); + session.setRecorder(&recorder); QCOMPARE(recorder.outputLocation(), QUrl()); QCOMPARE(recorder.state(), QMediaRecorder::StoppedState); @@ -129,8 +136,11 @@ void tst_QMediaRecorder::testNullService() void tst_QMediaRecorder::testNullControls() { service->hasControls = false; - QCamera object; - QMediaRecorder recorder(&object); + QMediaCaptureSession session; + QCamera camera; + QMediaRecorder recorder; + session.setCamera(&camera); + session.setRecorder(&recorder); QCOMPARE(recorder.outputLocation(), QUrl()); QCOMPARE(recorder.state(), QMediaRecorder::StoppedState); @@ -175,18 +185,21 @@ void tst_QMediaRecorder::testNullControls() void tst_QMediaRecorder::testDeleteMediaSource() { - QCamera *object = new QCamera; - QMediaRecorder *capture = new QMediaRecorder(object); + QMediaCaptureSession session; + QCamera *camera = new QCamera; + QMediaRecorder *recorder = new QMediaRecorder; + session.setCamera(camera); + session.setRecorder(recorder); - QVERIFY(capture->camera() == object); - QVERIFY(capture->isAvailable()); + QVERIFY(session.camera() == camera); + QVERIFY(recorder->isAvailable()); - delete object; + delete camera; - QVERIFY(capture->camera() == nullptr); - QVERIFY(!capture->isAvailable()); + QVERIFY(session.camera() == nullptr); + QVERIFY(recorder->isAvailable()); - delete capture; + delete recorder; } void tst_QMediaRecorder::testError() @@ -720,9 +733,12 @@ void tst_QMediaRecorder::metaData() QFETCH(QString, genre); QFETCH(QString, custom); - QCamera object; + QMediaCaptureSession session; + QCamera camera; + QMediaRecorder recorder; + session.setCamera(&camera); + session.setRecorder(&recorder); - QMediaRecorder recorder(&object); QVERIFY(recorder.metaData().isEmpty()); QMediaMetaData data; @@ -866,54 +882,35 @@ void tst_QMediaRecorder::testAudioSettingsDestructor() // delete audiosettings; } -/* availability() API test. */ -void tst_QMediaRecorder::testAvailabilityStatus() +void tst_QMediaRecorder::testIsAvailable() { { - QCamera object; - QMediaRecorder recorder(&object); - QCOMPARE(recorder.isAvailable(), false); + QMediaCaptureSession session; + QCamera camera; + QMediaRecorder recorder; + session.setCamera(&camera); + session.setRecorder(&recorder); + QCOMPARE(recorder.isAvailable(), true); } { - mockIntegration->createCaptureSession(QMediaRecorder::AudioAndVideo); - QCamera object1; - QMediaRecorder recorder1(&object1); - QCOMPARE(recorder1.isAvailable(), true); - } - { - mockIntegration->createCaptureSession(QMediaRecorder::AudioAndVideo); - QCamera object1; - QMediaRecorder recorder1(&object1); - - QCOMPARE(recorder1.isAvailable(), true); + QMediaRecorder recorder; + QCOMPARE(recorder.isAvailable(), false); } } -/* isAvailable() API test. */ -void tst_QMediaRecorder::testIsAvailable() -{ - QCamera object; - QMediaRecorder recorder(&object); - QCOMPARE(recorder.isAvailable(), false); - - mockIntegration->createCaptureSession(QMediaRecorder::AudioAndVideo); - QCamera object1; - QMediaRecorder recorder1(&object1); - QCOMPARE(recorder1.isAvailable(), true); -} - /* mediaSource() API test. */ void tst_QMediaRecorder::testMediaSource() { service->hasControls = false; - QCamera object; - QMediaRecorder recorder(&object); - - QCamera *medobj = recorder.camera(); - QVERIFY(medobj == nullptr); - - auto *medobj1 = capture->camera(); - QVERIFY(medobj1 != nullptr); + QMediaCaptureSession session; + QCamera camera; + QMediaRecorder recorder; + session.setCamera(&camera); + session.setRecorder(&recorder); + + QCamera *medobj = session.camera(); + QVERIFY(medobj != nullptr); + QVERIFY(!camera.isAvailable()); } /* enum QMediaRecorder::ResourceError property test. */ diff --git a/tests/auto/unit/multimediawidgets/qcamerawidgets/tst_qcamerawidgets.cpp b/tests/auto/unit/multimediawidgets/qcamerawidgets/tst_qcamerawidgets.cpp index dc08f0e55..1b083bed7 100644 --- a/tests/auto/unit/multimediawidgets/qcamerawidgets/tst_qcamerawidgets.cpp +++ b/tests/auto/unit/multimediawidgets/qcamerawidgets/tst_qcamerawidgets.cpp @@ -37,6 +37,7 @@ #include <private/qplatformcamerafocus_p.h> #include <private/qplatformcameraimagecapture_p.h> #include <private/qplatformcameraimageprocessing_p.h> +#include <qmediacapturesession.h> #include <qcamera.h> #include <qcameraimagecapture.h> #include <qgraphicsvideoitem.h> @@ -90,8 +91,11 @@ void tst_QCameraWidgets::cleanupTestCase() void tst_QCameraWidgets::testCameraEncodingProperyChange() { + QMediaCaptureSession session; QCamera camera; - QCameraImageCapture imageCapture(&camera); + QCameraImageCapture imageCapture; + session.setCamera(&camera); + session.setImageCapture(&imageCapture); QSignalSpy stateChangedSignal(&camera, SIGNAL(stateChanged(QCamera::State))); QSignalSpy statusChangedSignal(&camera, SIGNAL(statusChanged(QCamera::Status))); @@ -111,39 +115,39 @@ void tst_QCameraWidgets::testSetVideoOutput() QVideoWidget widget; QGraphicsVideoItem item; MockVideoSurface surface; - QCamera camera; + QMediaCaptureSession session; - camera.setViewfinder(&widget); + session.setVideoPreview(&widget); // qDebug() << widget.mediaSource(); -// QVERIFY(widget.mediaSource() == &camera); +// QVERIFY(widget.mediaSource() == &session); - camera.setViewfinder(&item); + session.setVideoPreview(&item); // QVERIFY(widget.mediaSource() == nullptr); -// QVERIFY(item.mediaSource() == &camera); +// QVERIFY(item.mediaSource() == &session); - camera.setViewfinder(reinterpret_cast<QVideoWidget *>(0)); + session.setVideoPreview(reinterpret_cast<QVideoWidget *>(0)); // QVERIFY(item.mediaSource() == nullptr); - camera.setViewfinder(&widget); -// QVERIFY(widget.mediaSource() == &camera); + session.setVideoPreview(&widget); +// QVERIFY(widget.mediaSource() == &session); - camera.setViewfinder(reinterpret_cast<QGraphicsVideoItem *>(0)); + session.setVideoPreview(reinterpret_cast<QGraphicsVideoItem *>(0)); // QVERIFY(widget.mediaSource() == nullptr); - camera.setViewfinder(&surface); -// QVERIFY(mockCameraService->rendererControl->surface() == &surface); + session.setVideoPreview(&surface); +// QVERIFY(mocksessionService->rendererControl->surface() == &surface); - camera.setViewfinder(reinterpret_cast<QAbstractVideoSurface *>(0)); -// QVERIFY(mockCameraService->rendererControl->surface() == nullptr); + session.setVideoPreview(reinterpret_cast<QAbstractVideoSurface *>(0)); +// QVERIFY(mocksessionService->rendererControl->surface() == nullptr); - camera.setViewfinder(&surface); -// QVERIFY(mockCameraService->rendererControl->surface() == &surface); + session.setVideoPreview(&surface); +// QVERIFY(mocksessionService->rendererControl->surface() == &surface); - camera.setViewfinder(&widget); -// QVERIFY(mockCameraService->rendererControl->surface() == nullptr); -// QVERIFY(widget.mediaSource() == &camera); + session.setVideoPreview(&widget); +// QVERIFY(mocksessionService->rendererControl->surface() == nullptr); +// QVERIFY(widget.mediaSource() == &session); - camera.setViewfinder(&surface); + session.setVideoPreview(&surface); // QVERIFY(mockCameraService->rendererControl->surface() == &surface); // QVERIFY(widget.mediaSource() == nullptr); } |