From f8512bcafadef8d71244f78ce7f4bc88e06698f3 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Mon, 8 Feb 2021 10:53:45 +0100 Subject: Don't use QMediaService anymore to get the camera controls Instead retrieve them from the camera control. Change-Id: Ic996a672f102f7dc3fc5e3b73f977d3864e9a129 Reviewed-by: Lars Knoll Reviewed-by: Doris Verria --- src/imports/multimedia/qmldir | 1 - src/multimedia/camera/qcamera.cpp | 6 +- src/multimedia/camera/qcameraexposure.cpp | 39 +++--- src/multimedia/camera/qcameraexposure.h | 6 +- src/multimedia/camera/qcamerafocus.cpp | 85 ++++++------- src/multimedia/camera/qcamerafocus.h | 3 +- src/multimedia/camera/qcameraimageprocessing.cpp | 134 +++++++++++---------- src/multimedia/camera/qcameraimageprocessing.h | 6 +- src/multimedia/controls/qcameracontrol.h | 7 ++ .../android/mediacapture/qandroidcameracontrol.cpp | 18 +++ .../android/mediacapture/qandroidcameracontrol_p.h | 4 + .../android/mediacapture/qandroidcamerasession.cpp | 11 ++ .../android/mediacapture/qandroidcamerasession_p.h | 11 ++ .../mediacapture/qandroidcaptureservice.cpp | 21 ---- .../mediacapture/qandroidcaptureservice_p.h | 7 -- .../platform/darwin/camera/avfcameracontrol.mm | 18 +++ .../platform/darwin/camera/avfcameracontrol_p.h | 4 + .../platform/darwin/camera/avfcameraservice.mm | 6 - .../platform/darwin/camera/avfcameraservice_p.h | 6 +- 19 files changed, 208 insertions(+), 185 deletions(-) diff --git a/src/imports/multimedia/qmldir b/src/imports/multimedia/qmldir index e7dcc3dd6..d68049f63 100644 --- a/src/imports/multimedia/qmldir +++ b/src/imports/multimedia/qmldir @@ -4,4 +4,3 @@ classname QMultimediaDeclarativeModule typeinfo plugins.qmltypes typeinfo plugins.qmltypes Video 5.0 Video.qml - diff --git a/src/multimedia/camera/qcamera.cpp b/src/multimedia/camera/qcamera.cpp index a418704e5..7276f9fdd 100644 --- a/src/multimedia/camera/qcamera.cpp +++ b/src/multimedia/camera/qcamera.cpp @@ -157,9 +157,9 @@ void QCameraPrivate::init() { Q_Q(QCamera); initControls(); - cameraExposure = new QCameraExposure(q); - cameraFocus = new QCameraFocus(q); - imageProcessing = new QCameraImageProcessing(q); + cameraExposure = new QCameraExposure(q, control); + cameraFocus = new QCameraFocus(q, control); + imageProcessing = new QCameraImageProcessing(q, control); } void QCameraPrivate::initControls() diff --git a/src/multimedia/camera/qcameraexposure.cpp b/src/multimedia/camera/qcameraexposure.cpp index 693f2bb55..9acaf7d3a 100644 --- a/src/multimedia/camera/qcameraexposure.cpp +++ b/src/multimedia/camera/qcameraexposure.cpp @@ -42,6 +42,7 @@ #include #include +#include #include #include @@ -62,20 +63,12 @@ QT_BEGIN_NAMESPACE //#define DEBUG_EXPOSURE_CHANGES 1 -static void qRegisterCameraExposureMetaTypes() -{ - qRegisterMetaType("QCameraExposure::ExposureMode"); - qRegisterMetaType("QCameraExposure::FlashModes"); -} - -Q_CONSTRUCTOR_FUNCTION(qRegisterCameraExposureMetaTypes) - class QCameraExposurePrivate { Q_DECLARE_NON_CONST_PUBLIC(QCameraExposure) public: - void initControls(); + void init(QCameraControl *cameraControl); QCameraExposure *q_ptr; template T actualExposureParameter(QCameraExposureControl::ExposureParameter parameter, const T &defaultValue) const; @@ -90,22 +83,20 @@ public: void _q_exposureParameterRangeChanged(int parameter); }; -void QCameraExposurePrivate::initControls() +void QCameraExposurePrivate::init(QCameraControl *cameraControl) { Q_Q(QCameraExposure); - QMediaService *service = camera->service(); - exposureControl = nullptr; - if (service) { - exposureControl = qobject_cast(service->requestControl(QCameraExposureControl_iid)); - } - if (exposureControl) { - q->connect(exposureControl, SIGNAL(actualValueChanged(int)), - q, SLOT(_q_exposureParameterChanged(int))); - q->connect(exposureControl, SIGNAL(parameterRangeChanged(int)), - q, SLOT(_q_exposureParameterRangeChanged(int))); - q->connect(exposureControl, SIGNAL(flashReady(bool)), q, SIGNAL(flashReady(bool))); - } + exposureControl = cameraControl->exposureControl(); + + if (!exposureControl) + return; + + q->connect(exposureControl, SIGNAL(actualValueChanged(int)), + q, SLOT(_q_exposureParameterChanged(int))); + q->connect(exposureControl, SIGNAL(parameterRangeChanged(int)), + q, SLOT(_q_exposureParameterRangeChanged(int))); + q->connect(exposureControl, SIGNAL(flashReady(bool)), q, SIGNAL(flashReady(bool))); } template @@ -182,13 +173,13 @@ void QCameraExposurePrivate::_q_exposureParameterRangeChanged(int parameter) Construct a QCameraExposure from service \a provider and \a parent. */ -QCameraExposure::QCameraExposure(QCamera *parent): +QCameraExposure::QCameraExposure(QCamera *parent, QCameraControl *cameraControl): QObject(parent), d_ptr(new QCameraExposurePrivate) { Q_D(QCameraExposure); d->camera = parent; d->q_ptr = this; - d->initControls(); + d->init(cameraControl); } diff --git a/src/multimedia/camera/qcameraexposure.h b/src/multimedia/camera/qcameraexposure.h index 78be56e21..d6550c6e3 100644 --- a/src/multimedia/camera/qcameraexposure.h +++ b/src/multimedia/camera/qcameraexposure.h @@ -47,6 +47,7 @@ QT_BEGIN_NAMESPACE class QCamera; +class QCameraControl; class QCameraExposurePrivate; class Q_MULTIMEDIA_EXPORT QCameraExposure : public QObject @@ -156,7 +157,7 @@ protected: private: friend class QCamera; friend class QCameraPrivate; - explicit QCameraExposure(QCamera *parent = nullptr); + explicit QCameraExposure(QCamera *parent, QCameraControl *cameraControl); Q_DISABLE_COPY(QCameraExposure) Q_DECLARE_PRIVATE(QCameraExposure) @@ -169,9 +170,6 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(QCameraExposure::FlashModes) QT_END_NAMESPACE -Q_DECLARE_METATYPE(QCameraExposure::ExposureMode) -Q_DECLARE_METATYPE(QCameraExposure::FlashModes) - Q_MEDIA_ENUM_DEBUG(QCameraExposure, ExposureMode) Q_MEDIA_ENUM_DEBUG(QCameraExposure, FlashMode) diff --git a/src/multimedia/camera/qcamerafocus.cpp b/src/multimedia/camera/qcamerafocus.cpp index 7fa30a859..7c07669f6 100644 --- a/src/multimedia/camera/qcamerafocus.cpp +++ b/src/multimedia/camera/qcamerafocus.cpp @@ -50,33 +50,6 @@ QT_BEGIN_NAMESPACE -class QCameraFocusFakeFocusControl : public QCameraFocusControl -{ -public: - QCameraFocusFakeFocusControl(QObject *parent) : - QCameraFocusControl(parent) {} - - [[nodiscard]] QCameraFocus::FocusModes focusMode() const override { return QCameraFocus::AutoFocus; } - void setFocusMode(QCameraFocus::FocusModes) override { qWarning("Focus mode selection is not supported"); } - [[nodiscard]] bool isFocusModeSupported(QCameraFocus::FocusModes) const override { return false; } - - [[nodiscard]] QCameraFocus::FocusPointMode focusPointMode() const override { return QCameraFocus::FocusPointAuto; } - void setFocusPointMode(QCameraFocus::FocusPointMode) override { qWarning("Focus points mode selection is not supported"); } - [[nodiscard]] bool isFocusPointModeSupported(QCameraFocus::FocusPointMode) const override { return false; } - [[nodiscard]] QPointF customFocusPoint() const override { return QPointF(0.5,0.5); } - void setCustomFocusPoint(const QPointF &) override { qWarning("Focus points selection is not supported"); } - - [[nodiscard]] QCameraFocusZoneList focusZones() const override { return QCameraFocusZoneList(); } - - ZoomRange zoomFactorRange() const override { return {1., 1.}; }; - void zoomTo(float, float) override - { - qWarning("The camera doesn't support zooming."); - } -}; - - - class QCameraFocusZoneData : public QSharedData { public: @@ -279,7 +252,7 @@ class QCameraFocusPrivate : public QMediaSourcePrivate { Q_DECLARE_NON_CONST_PUBLIC(QCameraFocus) public: - void initControls(); + void init(QCameraControl *cameraControl); QCamera *camera; @@ -289,21 +262,15 @@ public: }; -void QCameraFocusPrivate::initControls() +void QCameraFocusPrivate::init(QCameraControl *cameraControl) { Q_Q(QCameraFocus); - focusControl = nullptr; - - QMediaService *service = camera->service(); - if (service) { - focusControl = qobject_cast(service->requestControl(QCameraFocusControl_iid)); - } - + focusControl = cameraControl->focusControl(); available = focusControl != nullptr; if (!focusControl) - focusControl = new QCameraFocusFakeFocusControl(q); + return; q->connect(focusControl, SIGNAL(focusZonesChanged()), q, SIGNAL(focusZonesChanged())); @@ -322,12 +289,12 @@ void QCameraFocusPrivate::initControls() Construct a QCameraFocus for \a camera. */ -QCameraFocus::QCameraFocus(QCamera *camera) +QCameraFocus::QCameraFocus(QCamera *camera, QCameraControl *cameraControl) : QObject(*new QCameraFocusPrivate, camera) { Q_D(QCameraFocus); d->camera = camera; - d->initControls(); + d->init(cameraControl); } @@ -361,12 +328,15 @@ bool QCameraFocus::isAvailable() const QCameraFocus::FocusModes QCameraFocus::focusMode() const { - return d_func()->focusControl->focusMode(); + Q_D(const QCameraFocus); + return d->focusControl ? d->focusControl->focusMode() : QCameraFocus::AutoFocus; } void QCameraFocus::setFocusMode(QCameraFocus::FocusModes mode) { - d_func()->focusControl->setFocusMode(mode); + Q_D(QCameraFocus); + if (d->focusControl) + d->focusControl->setFocusMode(mode); } /*! @@ -375,7 +345,8 @@ void QCameraFocus::setFocusMode(QCameraFocus::FocusModes mode) bool QCameraFocus::isFocusModeSupported(FocusModes mode) const { - return d_func()->focusControl->isFocusModeSupported(mode); + Q_D(const QCameraFocus); + return d->focusControl ? d->focusControl->isFocusModeSupported(mode) : false; } /*! @@ -391,12 +362,15 @@ bool QCameraFocus::isFocusModeSupported(FocusModes mode) const QCameraFocus::FocusPointMode QCameraFocus::focusPointMode() const { - return d_func()->focusControl->focusPointMode(); + Q_D(const QCameraFocus); + return d->focusControl ? d->focusControl->focusPointMode() : QCameraFocus::FocusPointAuto; } void QCameraFocus::setFocusPointMode(QCameraFocus::FocusPointMode mode) { - d_func()->focusControl->setFocusPointMode(mode); + Q_D(QCameraFocus); + if (d->focusControl) + d->focusControl->setFocusPointMode(mode); } /*! @@ -404,7 +378,8 @@ void QCameraFocus::setFocusPointMode(QCameraFocus::FocusPointMode mode) */ bool QCameraFocus::isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const { - return d_func()->focusControl->isFocusPointModeSupported(mode); + Q_D(const QCameraFocus); + return d->focusControl ? d->focusControl->isFocusPointModeSupported(mode) : false; } /*! @@ -418,12 +393,15 @@ bool QCameraFocus::isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) QPointF QCameraFocus::customFocusPoint() const { - return d_func()->focusControl->customFocusPoint(); + Q_D(const QCameraFocus); + return d->focusControl ? d->focusControl->customFocusPoint() : QPointF(0.5,0.5); } void QCameraFocus::setCustomFocusPoint(const QPointF &point) { - d_func()->focusControl->setCustomFocusPoint(point); + Q_D(QCameraFocus); + if (d->focusControl) + d->focusControl->setCustomFocusPoint(point); } /*! @@ -439,7 +417,8 @@ void QCameraFocus::setCustomFocusPoint(const QPointF &point) */ QCameraFocusZoneList QCameraFocus::focusZones() const { - return d_func()->focusControl->focusZones(); + Q_D(const QCameraFocus); + return d->focusControl ? d->focusControl->focusZones() : QCameraFocusZoneList(); } /*! @@ -450,7 +429,8 @@ QCameraFocusZoneList QCameraFocus::focusZones() const float QCameraFocus::maximumZoomFactor() const { - return d_func()->focusControl->zoomFactorRange().max; + Q_D(const QCameraFocus); + return d->focusControl ? d->focusControl->zoomFactorRange().max : 1.; } /*! @@ -461,7 +441,8 @@ float QCameraFocus::maximumZoomFactor() const float QCameraFocus::minimumZoomFactor() const { - return d_func()->focusControl->zoomFactorRange().min; + Q_D(const QCameraFocus); + return d->focusControl ? d->focusControl->zoomFactorRange().min : 1.; } /*! @@ -476,6 +457,7 @@ float QCameraFocus::zoomFactor() const void QCameraFocus::setZoomFactor(float factor) { Q_D(QCameraFocus); + factor = qBound(minimumZoomFactor(), factor, maximumZoomFactor()); d->zoomFactor = factor; d->focusControl->zoomTo(factor, -1); } @@ -488,7 +470,10 @@ void QCameraFocus::setZoomFactor(float factor) */ void QCameraFocus::zoomTo(float factor, float rate) { + Q_ASSERT(rate > 0); + Q_D(QCameraFocus); + factor = qBound(minimumZoomFactor(), factor, maximumZoomFactor()); d->zoomFactor = factor; d->focusControl->zoomTo(factor, rate); } diff --git a/src/multimedia/camera/qcamerafocus.h b/src/multimedia/camera/qcamerafocus.h index 1b8d69628..ecdb7b623 100644 --- a/src/multimedia/camera/qcamerafocus.h +++ b/src/multimedia/camera/qcamerafocus.h @@ -54,6 +54,7 @@ QT_BEGIN_NAMESPACE class QCamera; +class QCameraControl; class QCameraFocusZoneData; @@ -152,7 +153,7 @@ protected: private: friend class QCamera; friend class QCameraPrivate; - QCameraFocus(QCamera *camera); + QCameraFocus(QCamera *camera, QCameraControl *cameraControl); Q_DISABLE_COPY(QCameraFocus) Q_DECLARE_PRIVATE(QCameraFocus) diff --git a/src/multimedia/camera/qcameraimageprocessing.cpp b/src/multimedia/camera/qcameraimageprocessing.cpp index e7e53d491..502bcf07a 100644 --- a/src/multimedia/camera/qcameraimageprocessing.cpp +++ b/src/multimedia/camera/qcameraimageprocessing.cpp @@ -41,23 +41,12 @@ #include "qmediasource_p.h" #include -#include -#include #include #include QT_BEGIN_NAMESPACE -static void qRegisterCameraImageProcessingMetaTypes() - { - qRegisterMetaType(); - qRegisterMetaType(); - } - -Q_CONSTRUCTOR_FUNCTION(qRegisterCameraImageProcessingMetaTypes) - - /*! \class QCameraImageProcessing @@ -92,55 +81,31 @@ Q_CONSTRUCTOR_FUNCTION(qRegisterCameraImageProcessingMetaTypes) \sa QCameraImageProcessingControl */ -class QCameraImageProcessingFakeControl : public QCameraImageProcessingControl { -public: - QCameraImageProcessingFakeControl(QObject *parent) : - QCameraImageProcessingControl(parent) - {} - - [[nodiscard]] bool isParameterSupported(ProcessingParameter) const override { return false; } - [[nodiscard]] bool isParameterValueSupported(ProcessingParameter, const QVariant &) const override { return false; } - [[nodiscard]] QVariant parameter(ProcessingParameter) const override { return QVariant(); } - void setParameter(ProcessingParameter, const QVariant &) override {} -}; - - class QCameraImageProcessingPrivate : public QMediaSourcePrivate { - Q_DECLARE_NON_CONST_PUBLIC(QCameraImageProcessing) public: - void initControls(); + void init(QCameraControl *cameraControl); QCamera *camera; QCameraImageProcessingControl *imageControl; - bool available; }; -void QCameraImageProcessingPrivate::initControls() +void QCameraImageProcessingPrivate::init(QCameraControl *cameraControl) { - imageControl = nullptr; - - QMediaService *service = camera->service(); - if (service) - imageControl = qobject_cast(service->requestControl(QCameraImageProcessingControl_iid)); - - available = (imageControl != nullptr); - - if (!imageControl) - imageControl = new QCameraImageProcessingFakeControl(q_ptr); + imageControl = cameraControl->imageProcessingControl(); } /*! Construct a QCameraImageProcessing for \a camera. */ -QCameraImageProcessing::QCameraImageProcessing(QCamera *camera) +QCameraImageProcessing::QCameraImageProcessing(QCamera *camera, QCameraControl *cameraControl) : QObject(*new QCameraImageProcessingPrivate, camera) { Q_D(QCameraImageProcessing); d->camera = camera; - d->initControls(); + d->init(cameraControl); } @@ -158,7 +123,7 @@ QCameraImageProcessing::~QCameraImageProcessing() */ bool QCameraImageProcessing::isAvailable() const { - return d_func()->available; + return d_func()->imageControl; } @@ -168,7 +133,10 @@ bool QCameraImageProcessing::isAvailable() const QCameraImageProcessing::WhiteBalanceMode QCameraImageProcessing::whiteBalanceMode() const { - return d_func()->imageControl->parameter(QCameraImageProcessingControl::WhiteBalancePreset) + Q_D(const QCameraImageProcessing); + if (!d->imageControl) + return WhiteBalanceAuto; + return d->imageControl->parameter(QCameraImageProcessingControl::WhiteBalancePreset) .value(); } @@ -178,7 +146,9 @@ QCameraImageProcessing::WhiteBalanceMode QCameraImageProcessing::whiteBalanceMod void QCameraImageProcessing::setWhiteBalanceMode(QCameraImageProcessing::WhiteBalanceMode mode) { - d_func()->imageControl->setParameter( + Q_D(QCameraImageProcessing); + if (d->imageControl) + d->imageControl->setParameter( QCameraImageProcessingControl::WhiteBalancePreset, QVariant::fromValue(mode)); } @@ -189,7 +159,10 @@ void QCameraImageProcessing::setWhiteBalanceMode(QCameraImageProcessing::WhiteBa bool QCameraImageProcessing::isWhiteBalanceModeSupported(QCameraImageProcessing::WhiteBalanceMode mode) const { - return d_func()->imageControl->isParameterValueSupported( + Q_D(const QCameraImageProcessing); + if (!d->imageControl) + return false; + return d->imageControl->isParameterValueSupported( QCameraImageProcessingControl::WhiteBalancePreset, QVariant::fromValue(mode)); @@ -203,7 +176,11 @@ bool QCameraImageProcessing::isWhiteBalanceModeSupported(QCameraImageProcessing: qreal QCameraImageProcessing::manualWhiteBalance() const { - return d_func()->imageControl->parameter(QCameraImageProcessingControl::ColorTemperature).toReal(); + Q_D(const QCameraImageProcessing); + if (!d->imageControl) + return 0.; + + return d->imageControl->parameter(QCameraImageProcessingControl::ColorTemperature).toReal(); } /*! @@ -213,7 +190,9 @@ qreal QCameraImageProcessing::manualWhiteBalance() const void QCameraImageProcessing::setManualWhiteBalance(qreal colorTemperature) { - d_func()->imageControl->setParameter( + Q_D(QCameraImageProcessing); + if (d->imageControl) + d->imageControl->setParameter( QCameraImageProcessingControl::ColorTemperature, QVariant(colorTemperature)); } @@ -223,7 +202,10 @@ void QCameraImageProcessing::setManualWhiteBalance(qreal colorTemperature) */ qreal QCameraImageProcessing::brightness() const { - return d_func()->imageControl->parameter(QCameraImageProcessingControl::BrightnessAdjustment).toReal(); + Q_D(const QCameraImageProcessing); + if (!d->imageControl) + return 0.; + return d->imageControl->parameter(QCameraImageProcessingControl::BrightnessAdjustment).toReal(); } /*! @@ -233,7 +215,9 @@ qreal QCameraImageProcessing::brightness() const */ void QCameraImageProcessing::setBrightness(qreal value) { - d_func()->imageControl->setParameter(QCameraImageProcessingControl::BrightnessAdjustment, + Q_D(QCameraImageProcessing); + if (d->imageControl) + d->imageControl->setParameter(QCameraImageProcessingControl::BrightnessAdjustment, QVariant(value)); } @@ -242,7 +226,10 @@ void QCameraImageProcessing::setBrightness(qreal value) */ qreal QCameraImageProcessing::contrast() const { - return d_func()->imageControl->parameter(QCameraImageProcessingControl::ContrastAdjustment).toReal(); + Q_D(const QCameraImageProcessing); + if (!d->imageControl) + return 0.; + return d->imageControl->parameter(QCameraImageProcessingControl::ContrastAdjustment).toReal(); } /*! @@ -252,7 +239,9 @@ qreal QCameraImageProcessing::contrast() const */ void QCameraImageProcessing::setContrast(qreal value) { - d_func()->imageControl->setParameter(QCameraImageProcessingControl::ContrastAdjustment, + Q_D(QCameraImageProcessing); + if (d->imageControl) + d->imageControl->setParameter(QCameraImageProcessingControl::ContrastAdjustment, QVariant(value)); } @@ -261,7 +250,10 @@ void QCameraImageProcessing::setContrast(qreal value) */ qreal QCameraImageProcessing::saturation() const { - return d_func()->imageControl->parameter(QCameraImageProcessingControl::SaturationAdjustment).toReal(); + Q_D(const QCameraImageProcessing); + if (!d->imageControl) + return 0.; + return d->imageControl->parameter(QCameraImageProcessingControl::SaturationAdjustment).toReal(); } /*! @@ -272,7 +264,9 @@ qreal QCameraImageProcessing::saturation() const void QCameraImageProcessing::setSaturation(qreal value) { - d_func()->imageControl->setParameter(QCameraImageProcessingControl::SaturationAdjustment, + Q_D(QCameraImageProcessing); + if (d->imageControl) + d->imageControl->setParameter(QCameraImageProcessingControl::SaturationAdjustment, QVariant(value)); } @@ -281,7 +275,10 @@ void QCameraImageProcessing::setSaturation(qreal value) */ qreal QCameraImageProcessing::sharpeningLevel() const { - return d_func()->imageControl->parameter(QCameraImageProcessingControl::SharpeningAdjustment).toReal(); + Q_D(const QCameraImageProcessing); + if (!d->imageControl) + return 0.; + return d->imageControl->parameter(QCameraImageProcessingControl::SharpeningAdjustment).toReal(); } /*! @@ -292,7 +289,9 @@ qreal QCameraImageProcessing::sharpeningLevel() const void QCameraImageProcessing::setSharpeningLevel(qreal level) { - d_func()->imageControl->setParameter(QCameraImageProcessingControl::SharpeningAdjustment, + Q_D(QCameraImageProcessing); + if (d->imageControl) + d->imageControl->setParameter(QCameraImageProcessingControl::SharpeningAdjustment, QVariant(level)); } @@ -301,7 +300,10 @@ void QCameraImageProcessing::setSharpeningLevel(qreal level) */ qreal QCameraImageProcessing::denoisingLevel() const { - return d_func()->imageControl->parameter(QCameraImageProcessingControl::DenoisingAdjustment).toReal(); + Q_D(const QCameraImageProcessing); + if (!d->imageControl) + return 0.; + return d->imageControl->parameter(QCameraImageProcessingControl::DenoisingAdjustment).toReal(); } /*! @@ -316,7 +318,9 @@ qreal QCameraImageProcessing::denoisingLevel() const */ void QCameraImageProcessing::setDenoisingLevel(qreal level) { - d_func()->imageControl->setParameter(QCameraImageProcessingControl::DenoisingAdjustment, + Q_D(QCameraImageProcessing); + if (d->imageControl) + d->imageControl->setParameter(QCameraImageProcessingControl::DenoisingAdjustment, QVariant(level)); } @@ -361,7 +365,10 @@ void QCameraImageProcessing::setDenoisingLevel(qreal level) QCameraImageProcessing::ColorFilter QCameraImageProcessing::colorFilter() const { - return d_func()->imageControl->parameter(QCameraImageProcessingControl::ColorFilter) + Q_D(const QCameraImageProcessing); + if (!d->imageControl) + return ColorFilterNone; + return d->imageControl->parameter(QCameraImageProcessingControl::ColorFilter) .value(); } @@ -374,9 +381,11 @@ QCameraImageProcessing::ColorFilter QCameraImageProcessing::colorFilter() const void QCameraImageProcessing::setColorFilter(QCameraImageProcessing::ColorFilter filter) { - d_func()->imageControl->setParameter( - QCameraImageProcessingControl::ColorFilter, - QVariant::fromValue(filter)); + Q_D(QCameraImageProcessing); + if (d->imageControl) + d->imageControl->setParameter( + QCameraImageProcessingControl::ColorFilter, + QVariant::fromValue(filter)); } /*! @@ -387,7 +396,10 @@ void QCameraImageProcessing::setColorFilter(QCameraImageProcessing::ColorFilter bool QCameraImageProcessing::isColorFilterSupported(QCameraImageProcessing::ColorFilter filter) const { - return d_func()->imageControl->isParameterValueSupported( + Q_D(const QCameraImageProcessing); + if (!d->imageControl) + return false; + return d->imageControl->isParameterValueSupported( QCameraImageProcessingControl::ColorFilter, QVariant::fromValue(filter)); diff --git a/src/multimedia/camera/qcameraimageprocessing.h b/src/multimedia/camera/qcameraimageprocessing.h index 6f26adf5a..d77e9a694 100644 --- a/src/multimedia/camera/qcameraimageprocessing.h +++ b/src/multimedia/camera/qcameraimageprocessing.h @@ -55,6 +55,7 @@ QT_BEGIN_NAMESPACE class QCamera; +class QCameraControl; class QCameraImageProcessingPrivate; class Q_MULTIMEDIA_EXPORT QCameraImageProcessing : public QObject @@ -122,7 +123,7 @@ protected: private: friend class QCamera; friend class QCameraPrivate; - QCameraImageProcessing(QCamera *camera); + QCameraImageProcessing(QCamera *camera, QCameraControl *cameraControl); Q_DISABLE_COPY(QCameraImageProcessing) Q_DECLARE_PRIVATE(QCameraImageProcessing) @@ -130,9 +131,6 @@ private: QT_END_NAMESPACE -Q_DECLARE_METATYPE(QCameraImageProcessing::WhiteBalanceMode) -Q_DECLARE_METATYPE(QCameraImageProcessing::ColorFilter) - Q_MEDIA_ENUM_DEBUG(QCameraImageProcessing, WhiteBalanceMode) Q_MEDIA_ENUM_DEBUG(QCameraImageProcessing, ColorFilter) diff --git a/src/multimedia/controls/qcameracontrol.h b/src/multimedia/controls/qcameracontrol.h index fd557a734..8074381f0 100644 --- a/src/multimedia/controls/qcameracontrol.h +++ b/src/multimedia/controls/qcameracontrol.h @@ -49,6 +49,9 @@ QT_BEGIN_NAMESPACE // Required for QDoc workaround class QString; +class QCameraFocusControl; +class QCameraExposureControl; +class QCameraImageProcessingControl; class Q_MULTIMEDIA_EXPORT QCameraControl : public QObject { @@ -82,6 +85,10 @@ public: virtual void searchAndLock(QCamera::LockTypes locks) = 0; virtual void unlock(QCamera::LockTypes locks) = 0; + virtual QCameraFocusControl *focusControl() { return nullptr; } + virtual QCameraExposureControl *exposureControl() { return nullptr; } + virtual QCameraImageProcessingControl *imageProcessingControl() { return nullptr; } + Q_SIGNALS: void stateChanged(QCamera::State); void statusChanged(QCamera::Status); diff --git a/src/multimedia/platform/android/mediacapture/qandroidcameracontrol.cpp b/src/multimedia/platform/android/mediacapture/qandroidcameracontrol.cpp index 62a548830..700ce2928 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcameracontrol.cpp +++ b/src/multimedia/platform/android/mediacapture/qandroidcameracontrol.cpp @@ -39,6 +39,9 @@ #include "qandroidcameracontrol_p.h" #include "qandroidcamerasession_p.h" +#include "qandroidcameraexposurecontrol_p.h" +#include "qandroidcamerafocuscontrol_p.h" +#include "qandroidcameraimageprocessingcontrol_p.h" #include #include #include @@ -235,6 +238,21 @@ void QAndroidCameraControl::unlock(QCamera::LockTypes locks) } } +QCameraFocusControl *QAndroidCameraControl::focusControl() +{ + return m_cameraSession->focusControl(); +} + +QCameraExposureControl *QAndroidCameraControl::exposureControl() +{ + return m_cameraSession->exposureControl(); +} + +QCameraImageProcessingControl *QAndroidCameraControl::imageProcessingControl() +{ + return m_cameraSession->imageProcessingControl(); +} + void QAndroidCameraControl::onCameraOpened() { m_supportedLocks = QCamera::NoLock; diff --git a/src/multimedia/platform/android/mediacapture/qandroidcameracontrol_p.h b/src/multimedia/platform/android/mediacapture/qandroidcameracontrol_p.h index 77bcbf7ff..d313db9fd 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcameracontrol_p.h +++ b/src/multimedia/platform/android/mediacapture/qandroidcameracontrol_p.h @@ -83,6 +83,10 @@ public: void searchAndLock(QCamera::LockTypes locks) override; void unlock(QCamera::LockTypes locks) override; + QCameraFocusControl *focusControl() override; + QCameraExposureControl *exposureControl() override; + QCameraImageProcessingControl *imageProcessingControl() override; + private Q_SLOTS: void onCameraOpened(); void onCameraAutoFocusComplete(bool success); diff --git a/src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp b/src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp index fdf791f85..042f66078 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp +++ b/src/multimedia/platform/android/mediacapture/qandroidcamerasession.cpp @@ -45,6 +45,9 @@ #include "qandroidvideooutput_p.h" #include "qandroidmultimediautils_p.h" #include "qandroidcameravideorenderercontrol_p.h" +#include "qandroidcameraexposurecontrol_p.h" +#include "qandroidcamerafocuscontrol_p.h" +#include "qandroidcameraimageprocessingcontrol_p.h" #include #include #include @@ -82,6 +85,10 @@ QAndroidCameraSession::QAndroidCameraSession(QObject *parent) QMediaStorageLocation::Pictures, AndroidMultimediaUtils::getDefaultMediaDirectory(AndroidMultimediaUtils::DCIM)); + m_cameraExposureControl = new QAndroidCameraExposureControl(this); + m_cameraFocusControl = new QAndroidCameraFocusControl(this); + m_cameraImageProcessingControl = new QAndroidCameraImageProcessingControl(this); + if (qApp) { connect(qApp, SIGNAL(applicationStateChanged(Qt::ApplicationState)), this, SLOT(onApplicationStateChanged(Qt::ApplicationState))); @@ -90,6 +97,10 @@ QAndroidCameraSession::QAndroidCameraSession(QObject *parent) QAndroidCameraSession::~QAndroidCameraSession() { + delete m_cameraExposureControl; + delete m_cameraFocusControl; + delete m_cameraImageProcessingControl; + close(); } diff --git a/src/multimedia/platform/android/mediacapture/qandroidcamerasession_p.h b/src/multimedia/platform/android/mediacapture/qandroidcamerasession_p.h index ea0176a6f..c2278434b 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcamerasession_p.h +++ b/src/multimedia/platform/android/mediacapture/qandroidcamerasession_p.h @@ -63,6 +63,9 @@ QT_BEGIN_NAMESPACE class QAndroidVideoOutput; +class QAndroidCameraExposureControl; +class QAndroidCameraFocusControl; +class QAndroidCameraImageProcessingControl; class QAndroidCameraSession : public QObject { @@ -117,6 +120,10 @@ public: void setPreviewCallback(PreviewCallback *callback); bool requestRecordingPermission(); + QAndroidCameraFocusControl *focusControl() { return m_cameraFocusControl; } + QAndroidCameraExposureControl *exposureControl() { return m_cameraExposureControl; } + QAndroidCameraImageProcessingControl *imageProcessingControl() { return m_cameraImageProcessingControl; } + Q_SIGNALS: void statusChanged(QCamera::Status status); void stateChanged(QCamera::State); @@ -182,6 +189,10 @@ private: QCamera::Status m_status; bool m_previewStarted; + QAndroidCameraExposureControl *m_cameraExposureControl; + QAndroidCameraFocusControl *m_cameraFocusControl; + QAndroidCameraImageProcessingControl *m_cameraImageProcessingControl; + QImageEncoderSettings m_requestedImageSettings; QImageEncoderSettings m_actualImageSettings; QCameraImageCapture::CaptureDestinations m_captureDestination; diff --git a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp index 26095fd36..9721229a6 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp +++ b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice.cpp @@ -45,9 +45,6 @@ #include "qandroidcameracontrol_p.h" #include "qandroidcamerasession_p.h" #include "qandroidcameravideorenderercontrol_p.h" -#include "qandroidcameraexposurecontrol_p.h" -#include "qandroidcamerafocuscontrol_p.h" -#include "qandroidcameraimageprocessingcontrol_p.h" #include "qandroidimageencodercontrol_p.h" #include "qandroidcameraimagecapturecontrol_p.h" @@ -60,17 +57,11 @@ QAndroidCaptureService::QAndroidCaptureService(QMediaRecorder::CaptureMode mode) if (m_videoEnabled) { m_cameraSession = new QAndroidCameraSession; m_cameraControl = new QAndroidCameraControl(m_cameraSession); - m_cameraExposureControl = new QAndroidCameraExposureControl(m_cameraSession); - m_cameraFocusControl = new QAndroidCameraFocusControl(m_cameraSession); - m_cameraImageProcessingControl = new QAndroidCameraImageProcessingControl(m_cameraSession); m_imageEncoderControl = new QAndroidImageEncoderControl(m_cameraSession); m_imageCaptureControl = new QAndroidCameraImageCaptureControl(m_cameraSession); } else { m_cameraSession = 0; m_cameraControl = 0; - m_cameraExposureControl = 0; - m_cameraFocusControl = 0; - m_cameraImageProcessingControl = 0; m_imageEncoderControl = 0; m_imageCaptureControl = 0; } @@ -85,9 +76,6 @@ QAndroidCaptureService::~QAndroidCaptureService() delete m_captureSession; delete m_cameraControl; delete m_videoRendererControl; - delete m_cameraExposureControl; - delete m_cameraFocusControl; - delete m_cameraImageProcessingControl; delete m_imageEncoderControl; delete m_imageCaptureControl; delete m_cameraSession; @@ -101,15 +89,6 @@ QObject *QAndroidCaptureService::requestControl(const char *name) if (qstrcmp(name, QCameraControl_iid) == 0) return m_cameraControl; - if (qstrcmp(name, QCameraExposureControl_iid) == 0) - return m_cameraExposureControl; - - if (qstrcmp(name, QCameraFocusControl_iid) == 0) - return m_cameraFocusControl; - - if (qstrcmp(name, QCameraImageProcessingControl_iid) == 0) - return m_cameraImageProcessingControl; - if (qstrcmp(name, QImageEncoderControl_iid) == 0) return m_imageEncoderControl; diff --git a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h index b9d7bb685..0f0892a24 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h +++ b/src/multimedia/platform/android/mediacapture/qandroidcaptureservice_p.h @@ -63,9 +63,6 @@ class QAndroidCaptureSession; class QAndroidCameraControl; class QAndroidCameraSession; class QAndroidCameraVideoRendererControl; -class QAndroidCameraExposureControl; -class QAndroidCameraFocusControl; -class QAndroidCameraImageProcessingControl; class QAndroidImageEncoderControl; class QAndroidCameraImageCaptureControl; @@ -80,7 +77,6 @@ public: QObject *requestControl(const char *name); void releaseControl(QObject *); -private: bool m_videoEnabled = false; QAndroidMediaRecorderControl *m_recorderControl; @@ -88,9 +84,6 @@ private: QAndroidCameraControl *m_cameraControl; QAndroidCameraSession *m_cameraSession; QAndroidCameraVideoRendererControl *m_videoRendererControl; - QAndroidCameraExposureControl *m_cameraExposureControl; - QAndroidCameraFocusControl *m_cameraFocusControl; - QAndroidCameraImageProcessingControl *m_cameraImageProcessingControl; QAndroidImageEncoderControl *m_imageEncoderControl; QAndroidCameraImageCaptureControl *m_imageCaptureControl; }; diff --git a/src/multimedia/platform/darwin/camera/avfcameracontrol.mm b/src/multimedia/platform/darwin/camera/avfcameracontrol.mm index 1a8051c46..ae492257e 100644 --- a/src/multimedia/platform/darwin/camera/avfcameracontrol.mm +++ b/src/multimedia/platform/darwin/camera/avfcameracontrol.mm @@ -43,6 +43,8 @@ #include "avfcameraservice_p.h" #include "avfcamerautility_p.h" #include "avfcamerarenderercontrol_p.h" +#include "avfcameraexposurecontrol_p.h" +#include "avfcamerafocuscontrol_p.h" #include "qabstractvideosurface.h" QT_USE_NAMESPACE @@ -230,4 +232,20 @@ AVCaptureConnection *AVFCameraControl::videoConnection() const return [m_service->videoOutput()->videoDataOutput() connectionWithMediaType:AVMediaTypeVideo]; } + +QCameraFocusControl *AVFCameraControl::focusControl() +{ + return m_service->cameraFocusControl(); +} + +QCameraExposureControl *AVFCameraControl::exposureControl() +{ + return m_service->cameraExposureControl(); +} + +QCameraImageProcessingControl *AVFCameraControl::imageProcessingControl() +{ + return nullptr; +} + #include "moc_avfcameracontrol_p.cpp" diff --git a/src/multimedia/platform/darwin/camera/avfcameracontrol_p.h b/src/multimedia/platform/darwin/camera/avfcameracontrol_p.h index 8a66e0579..d0a7bba01 100644 --- a/src/multimedia/platform/darwin/camera/avfcameracontrol_p.h +++ b/src/multimedia/platform/darwin/camera/avfcameracontrol_p.h @@ -89,6 +89,10 @@ public: void searchAndLock(QCamera::LockTypes locks) override; void unlock(QCamera::LockTypes locks) override; + QCameraFocusControl *focusControl() override; + QCameraExposureControl *exposureControl() override; + QCameraImageProcessingControl *imageProcessingControl() override; + // "Converters": static QVideoFrame::PixelFormat QtPixelFormatFromCVFormat(unsigned avPixelFormat); static bool CVPixelFormatFromQtFormat(QVideoFrame::PixelFormat qtFormat, unsigned &conv); diff --git a/src/multimedia/platform/darwin/camera/avfcameraservice.mm b/src/multimedia/platform/darwin/camera/avfcameraservice.mm index a811cc746..5a4a2b2de 100644 --- a/src/multimedia/platform/darwin/camera/avfcameraservice.mm +++ b/src/multimedia/platform/darwin/camera/avfcameraservice.mm @@ -128,12 +128,6 @@ QObject *AVFCameraService::requestControl(const char *name) if (qstrcmp(name, QCameraImageCaptureControl_iid) == 0) return m_imageCaptureControl; - if (qstrcmp(name, QCameraExposureControl_iid) == 0) - return m_cameraExposureControl; - - if (qstrcmp(name, QCameraFocusControl_iid) == 0) - return m_cameraFocusControl; - if (qstrcmp(name, QImageEncoderControl_iid) == 0) return m_imageEncoderControl; diff --git a/src/multimedia/platform/darwin/camera/avfcameraservice_p.h b/src/multimedia/platform/darwin/camera/avfcameraservice_p.h index 5bcde87c3..a848725b7 100644 --- a/src/multimedia/platform/darwin/camera/avfcameraservice_p.h +++ b/src/multimedia/platform/darwin/camera/avfcameraservice_p.h @@ -87,9 +87,9 @@ public: QMediaRecorderControl *recorderControl() const { return m_recorderControl; } AVFImageCaptureControl *imageCaptureControl() const { return m_imageCaptureControl; } AVFCameraFocusControl *cameraFocusControl() const { return m_cameraFocusControl; } - AVFCameraExposureControl *cameraExposureControl() const {return m_cameraExposureControl; } - AVFCameraRendererControl *videoOutput() const {return m_videoOutput; } - AVFImageEncoderControl *imageEncoderControl() const {return m_imageEncoderControl; } + AVFCameraExposureControl *cameraExposureControl() const { return m_cameraExposureControl; } + AVFCameraRendererControl *videoOutput() const { return m_videoOutput; } + AVFImageEncoderControl *imageEncoderControl() const { return m_imageEncoderControl; } private: AVFCameraSession *m_session; -- cgit v1.2.3