diff options
17 files changed, 71 insertions, 552 deletions
diff --git a/src/imports/multimedia/plugins.qmltypes b/src/imports/multimedia/plugins.qmltypes index c19995431..09c1d39a7 100644 --- a/src/imports/multimedia/plugins.qmltypes +++ b/src/imports/multimedia/plugins.qmltypes @@ -613,15 +613,6 @@ Module { } } Enum { - name: "FocusPointMode" - values: { - "FocusPointAuto": 0, - "FocusPointCenter": 1, - "FocusPointFaceDetection": 2, - "FocusPointCustom": 3 - } - } - Enum { name: "Availability" values: { "Available": 0, @@ -970,29 +961,14 @@ Module { "FocusManual": 5 } } - Enum { - name: "FocusPointMode" - values: { - "FocusPointAuto": 0, - "FocusPointCenter": 1, - "FocusPointFaceDetection": 2, - "FocusPointCustom": 3 - } - } Property { name: "focusMode"; type: "FocusMode" } Property { name: "supportedFocusModes"; revision: 1; type: "QVariantList"; isReadonly: true } - Property { name: "focusPointMode"; type: "FocusPointMode" } - Property { name: "supportedFocusPointModes"; revision: 1; type: "QVariantList"; isReadonly: true } Property { name: "customFocusPoint"; type: "QPointF" } Signal { name: "focusModeChanged" Parameter { type: "FocusMode" } } Signal { - name: "focusPointModeChanged" - Parameter { type: "FocusPointMode" } - } - Signal { name: "customFocusPointChanged" Parameter { type: "QPointF" } } @@ -1001,10 +977,6 @@ Module { Parameter { type: "FocusMode" } } Method { - name: "setFocusPointMode" - Parameter { name: "mode"; type: "FocusPointMode" } - } - Method { name: "setCustomFocusPoint" Parameter { name: "point"; type: "QPointF" } } @@ -1013,11 +985,6 @@ Module { type: "bool" Parameter { name: "mode"; type: "FocusMode" } } - Method { - name: "isFocusPointModeSupported" - type: "bool" - Parameter { name: "mode"; type: "FocusPointMode" } - } } Component { name: "QDeclarativeCameraImageProcessing" diff --git a/src/imports/multimedia/qdeclarativecamera_p.h b/src/imports/multimedia/qdeclarativecamera_p.h index 1c2da5384..b0f617865 100644 --- a/src/imports/multimedia/qdeclarativecamera_p.h +++ b/src/imports/multimedia/qdeclarativecamera_p.h @@ -110,7 +110,6 @@ class QDeclarativeCamera : public QObject, public QQmlParserStatus Q_ENUMS(ExposureMode) Q_ENUMS(FocusMode) - Q_ENUMS(FocusPointMode) public: enum Position { @@ -187,13 +186,6 @@ public: #endif }; - enum FocusPointMode { - FocusPointAuto = QCameraFocus::FocusPointAuto, - FocusPointCenter = QCameraFocus::FocusPointCenter, - FocusPointFaceDetection = QCameraFocus::FocusPointFaceDetection, - FocusPointCustom = QCameraFocus::FocusPointCustom - }; - QDeclarativeCamera(QObject *parent = 0); ~QDeclarativeCamera(); diff --git a/src/imports/multimedia/qdeclarativecamerafocus.cpp b/src/imports/multimedia/qdeclarativecamerafocus.cpp index 02d4995be..0a50b12f8 100644 --- a/src/imports/multimedia/qdeclarativecamerafocus.cpp +++ b/src/imports/multimedia/qdeclarativecamerafocus.cpp @@ -68,7 +68,6 @@ QT_BEGIN_NAMESPACE focus { focusMode: Camera.FocusMacro - focusPointMode: Camera.FocusPointCustom customFocusPoint: Qt.point(0.2, 0.2) // Focus relative to top-left corner } } @@ -104,7 +103,6 @@ QDeclarativeCameraFocus::QDeclarativeCameraFocus(QCamera *camera, QObject *paren } emit supportedFocusModeChanged(); - emit supportedFocusPointModesChanged(); }); } @@ -114,9 +112,8 @@ QDeclarativeCameraFocus::~QDeclarativeCameraFocus() = default; This property holds the current camera focus mode. - In automatic focusing modes, the \l focusPointMode - property provides information and control - over how automatic focusing is performed. + In automatic focusing modes, the \l focusPoint + property provides a hint on where the camera should focus. */ /*! @@ -149,9 +146,9 @@ QDeclarativeCameraFocus::~QDeclarativeCameraFocus() = default; \li Manual or fixed focus mode. \endtable - In automatic focusing modes, the \l focusPointMode property + In automatic focusing modes, the \l focusPoint property provides information and control - over how automatic focusing is performed. + over the area of the image that is being focused. */ QDeclarativeCameraFocus::FocusMode QDeclarativeCameraFocus::focusMode() const { @@ -185,75 +182,6 @@ void QDeclarativeCameraFocus::setFocusMode(QDeclarativeCameraFocus::FocusMode mo emit focusModeChanged(focusMode()); } } -/*! - \property QDeclarativeCameraFocus::focusPointMode - - This property holds the current camera focus point mode. It is used in - automatic focusing modes to determine what to focus on. - - If the current focus point mode is \l QCameraFocus::FocusPointCustom, the - \l customFocusPoint property allows you to specify which part of - the frame to focus on. -*/ -/*! - \qmlproperty enumeration CameraFocus::focusPointMode - - This property holds the current camera focus point mode. It is used in automatic - focusing modes to determine what to focus on. If the current - focus point mode is \c Camera.FocusPointCustom, the \l customFocusPoint - property allows you to specify which part of the frame to focus on. - - The property can take one of the following values: - \table - \header - \li Value - \li Description - \row - \li FocusPointAuto - \li Automatically select one or multiple focus points. - \row - \li FocusPointCenter - \li Focus to the frame center. - \row - \li FocusPointFaceDetection - \li Focus on faces in the frame. - \row - \li FocusPointCustom - \li Focus to the custom point, defined by the customFocusPoint property. - \endtable -*/ -QDeclarativeCameraFocus::FocusPointMode QDeclarativeCameraFocus::focusPointMode() const -{ - return QDeclarativeCameraFocus::FocusPointMode(m_focus->focusPointMode()); -} - -/*! - \qmlproperty list<enumeration> CameraFocus::supportedFocusPointModes - - This property holds the supported focus point modes of the camera. - - \since 5.10 - \sa focusPointMode -*/ -QVariantList QDeclarativeCameraFocus::supportedFocusPointModes() const -{ - QVariantList supportedModes; - - for (int i = int(FocusPointAuto); i <= int(FocusPointCustom); i++) { - if (m_focus->isFocusPointModeSupported(QCameraFocus::FocusPointMode(i))) - supportedModes.append(i); - } - - return supportedModes; -} - -void QDeclarativeCameraFocus::setFocusPointMode(QDeclarativeCameraFocus::FocusPointMode mode) -{ - if (mode != focusPointMode()) { - m_focus->setFocusPointMode(QCameraFocus::FocusPointMode(mode)); - emit focusPointModeChanged(focusPointMode()); - } -} /*! \property QDeclarativeCameraFocus::customFocusPoint diff --git a/src/imports/multimedia/qdeclarativecamerafocus_p.h b/src/imports/multimedia/qdeclarativecamerafocus_p.h index c9919e332..1314e8d6d 100644 --- a/src/imports/multimedia/qdeclarativecamerafocus_p.h +++ b/src/imports/multimedia/qdeclarativecamerafocus_p.h @@ -67,13 +67,9 @@ class QDeclarativeCameraFocus : public QObject Q_PROPERTY(FocusMode focusMode READ focusMode WRITE setFocusMode NOTIFY focusModeChanged) Q_PROPERTY(QVariantList supportedFocusMode READ supportedFocusMode NOTIFY supportedFocusModeChanged REVISION 1) - Q_PROPERTY(FocusPointMode focusPointMode READ focusPointMode WRITE setFocusPointMode NOTIFY focusPointModeChanged) - Q_PROPERTY(QVariantList supportedFocusPointModes READ supportedFocusPointModes NOTIFY supportedFocusPointModesChanged REVISION 1) - Q_PROPERTY(QPointF customFocusPoint READ customFocusPoint WRITE setCustomFocusPoint NOTIFY customFocusPointChanged) Q_ENUMS(FocusMode) - Q_ENUMS(FocusPointMode) public: enum FocusMode { FocusModeAuto = QCameraFocus::FocusModeAuto, @@ -92,33 +88,20 @@ public: #endif }; - enum FocusPointMode { - FocusPointAuto = QCameraFocus::FocusPointAuto, - FocusPointCenter = QCameraFocus::FocusPointCenter, - FocusPointFaceDetection = QCameraFocus::FocusPointFaceDetection, - FocusPointCustom = QCameraFocus::FocusPointCustom - }; - ~QDeclarativeCameraFocus(); FocusMode focusMode() const; QVariantList supportedFocusMode() const; - FocusPointMode focusPointMode() const; - QVariantList supportedFocusPointModes() const; - QPointF customFocusPoint() const; public Q_SLOTS: void setFocusMode(FocusMode); - void setFocusPointMode(FocusPointMode mode); void setCustomFocusPoint(const QPointF &point); Q_SIGNALS: void focusModeChanged(FocusMode); void supportedFocusModeChanged(); - void focusPointModeChanged(FocusPointMode); - void supportedFocusPointModesChanged(); void customFocusPointChanged(const QPointF &); private: diff --git a/src/multimedia/camera/qcamerafocus.cpp b/src/multimedia/camera/qcamerafocus.cpp index 1f140674d..5912c33ce 100644 --- a/src/multimedia/camera/qcamerafocus.cpp +++ b/src/multimedia/camera/qcamerafocus.cpp @@ -83,11 +83,8 @@ QT_BEGIN_NAMESPACE \section2 Some notes on autofocus Some hardware supports a movable focus lens assembly, and typically this hardware also supports automatically focusing via some heuristic. - You can influence this via the \l FocusPointMode setting - typically - the center of the frame is brought into focus, but some hardware - also supports focusing on any faces detected in the frame, or on - a specific point (usually provided by a user in a "touch to focus" - scenario). + You can influence this via the \l focusPoint property (usually provided + by a user in a "touch to focus" scenario). */ #define Q_DECLARE_NON_CONST_PUBLIC(Class) \ @@ -105,6 +102,7 @@ public: QPlatformCameraFocus *focusControl; bool available; float zoomFactor = 1.; + QPointF customFocusPoint{-1, -1}; }; #undef Q_DECLARE_NON_CONST_PUBLIC @@ -188,36 +186,13 @@ bool QCameraFocus::isFocusModeSupported(FocusMode mode) const } /*! - \property QCameraFocus::focusPointMode - \brief the current camera focus point selection mode. - - If the camera focus mode is set to use an autofocusing mode, - this property controls the way the camera will select areas - of the frame to use for autofocusing. - - \sa QCameraFocus::isFocusPointModeSupported() -*/ - -QCameraFocus::FocusPointMode QCameraFocus::focusPointMode() const -{ - Q_D(const QCameraFocus); - return d->focusControl ? d->focusControl->focusPointMode() : QCameraFocus::FocusPointAuto; -} - -void QCameraFocus::setFocusPointMode(QCameraFocus::FocusPointMode mode) -{ - Q_D(QCameraFocus); - if (d->focusControl) - d->focusControl->setFocusPointMode(mode); -} - -/*! - Returns true if focus point \a mode is supported. + Returns the point currently used by the auto focus system to focus onto. */ -bool QCameraFocus::isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const +QPointF QCameraFocus::focusPoint() const { Q_D(const QCameraFocus); - return d->focusControl ? d->focusControl->isFocusPointModeSupported(mode) : false; + return d->focusControl ? d->focusControl->focusPoint() : QPointF(-1., -1.); + } /*! @@ -232,14 +207,24 @@ bool QCameraFocus::isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) QPointF QCameraFocus::customFocusPoint() const { Q_D(const QCameraFocus); - return d->focusControl ? d->focusControl->customFocusPoint() : QPointF(0.5,0.5); + return d->customFocusPoint; } void QCameraFocus::setCustomFocusPoint(const QPointF &point) { Q_D(QCameraFocus); + if (d->customFocusPoint == point) + return; + d->customFocusPoint = point; if (d->focusControl) d->focusControl->setCustomFocusPoint(point); + Q_EMIT customFocusPointChanged(); +} + +bool QCameraFocus::isCustomFocusPointSupported() const +{ + Q_D(const QCameraFocus); + return d->focusControl ? d->focusControl->isCustomFocusPointSupported() : false; } /*! @@ -336,15 +321,6 @@ void QCameraFocus::zoomTo(float factor, float rate) */ /*! - \enum QCameraFocus::FocusPointMode - - \value FocusPointAuto Automatically select one or multiple focus points. - \value FocusPointCenter Focus to the frame center. - \value FocusPointFaceDetection Focus on faces in the frame. - \value FocusPointCustom Focus to the custom point, defined by QCameraFocus::customFocusPoint property. -*/ - -/*! \fn void QCameraFocus::opticalZoomChanged(qreal value) Signal emitted when optical zoom value changes to new \a value. diff --git a/src/multimedia/camera/qcamerafocus.h b/src/multimedia/camera/qcamerafocus.h index 130a20e00..524439b31 100644 --- a/src/multimedia/camera/qcamerafocus.h +++ b/src/multimedia/camera/qcamerafocus.h @@ -63,13 +63,11 @@ class Q_MULTIMEDIA_EXPORT QCameraFocus : public QObject Q_OBJECT Q_PROPERTY(FocusMode focusMode READ focusMode WRITE setFocusMode) - Q_PROPERTY(FocusPointMode focusPointMode READ focusPointMode WRITE setFocusPointMode) - Q_PROPERTY(QPointF customFocusPoint READ customFocusPoint WRITE setCustomFocusPoint) + Q_PROPERTY(QPointF customFocusPoint READ customFocusPoint WRITE setCustomFocusPoint NOTIFY customFocusPointChanged) Q_PROPERTY(float zoomFactor READ zoomFactor WRITE setZoomFactor NOTIFY zoomFactorChanged) Q_PROPERTY(float focusDistance READ focusDistance WRITE setFocusDistance NOTIFY focusDistanceChanged) Q_ENUMS(FocusMode) - Q_ENUMS(FocusPointMode) public: enum FocusMode { FocusModeAuto, @@ -88,24 +86,17 @@ public: #endif }; - enum FocusPointMode { - FocusPointAuto, - FocusPointCenter, - FocusPointFaceDetection, - FocusPointCustom - }; - bool isAvailable() const; FocusMode focusMode() const; void setFocusMode(FocusMode mode); bool isFocusModeSupported(FocusMode mode) const; - FocusPointMode focusPointMode() const; - void setFocusPointMode(FocusPointMode mode); - bool isFocusPointModeSupported(FocusPointMode) const; + QPointF focusPoint() const; + QPointF customFocusPoint() const; void setCustomFocusPoint(const QPointF &point); + bool isCustomFocusPointSupported() const; void setFocusDistance(float d); float focusDistance() const; @@ -120,6 +111,7 @@ public: Q_SIGNALS: void zoomFactorChanged(float); void focusDistanceChanged(float); + void customFocusPointChanged(); protected: ~QCameraFocus(); @@ -136,6 +128,5 @@ private: QT_END_NAMESPACE Q_MEDIA_ENUM_DEBUG(QCameraFocus, FocusMode) -Q_MEDIA_ENUM_DEBUG(QCameraFocus, FocusPointMode) #endif // QCAMERAFOCUS_H diff --git a/src/multimedia/platform/android/mediacapture/qandroidcamerafocuscontrol.cpp b/src/multimedia/platform/android/mediacapture/qandroidcamerafocuscontrol.cpp index 03d13b1c3..42bb3c842 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcamerafocuscontrol.cpp +++ b/src/multimedia/platform/android/mediacapture/qandroidcamerafocuscontrol.cpp @@ -63,8 +63,7 @@ QAndroidCameraFocusControl::QAndroidCameraFocusControl(QAndroidCameraSession *se : QPlatformCameraFocus() , m_session(session) , m_focusMode(QCameraFocus::AutoFocus) - , m_focusPointMode(QCameraFocus::FocusPointAuto) - , m_actualFocusPoint(0.5, 0.5) + , m_focusPoint(0.5, 0.5) , m_continuousPictureFocusSupported(false) , m_continuousVideoFocusSupported(false) { @@ -124,55 +123,25 @@ bool QAndroidCameraFocusControl::isFocusModeSupported(QCameraFocus::FocusMode mo return m_session->camera() ? m_supportedFocusModes.contains(mode) : false; } -QCameraFocus::FocusPointMode QAndroidCameraFocusControl::focusPointMode() const +bool QAndroidCameraFocusControl::isCustomFocusPointSupported() const { - return m_focusPointMode; + return m_focusPointSupported; } -void QAndroidCameraFocusControl::setFocusPointMode(QCameraFocus::FocusPointMode mode) +QPointF QAndroidCameraFocusControl::focusPoint() const { - if (!m_session->camera()) { - setFocusPointModeHelper(mode); - return; - } - - if (isFocusPointModeSupported(mode)) { - if (mode == QCameraFocus::FocusPointCustom) { - m_actualFocusPoint = m_customFocusPoint; - } else { - // FocusPointAuto | FocusPointCenter - // note: there is no way to know the actual focus point in FocusPointAuto mode, - // so just report the focus point to be at the center of the frame - m_actualFocusPoint = QPointF(0.5, 0.5); - } - - setFocusPointModeHelper(mode); - - setCameraFocusArea(); - } -} - -bool QAndroidCameraFocusControl::isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const -{ - return m_session->camera() ? m_supportedFocusPointModes.contains(mode) : false; -} - -QPointF QAndroidCameraFocusControl::customFocusPoint() const -{ - return m_customFocusPoint; + return m_focusPoint; } void QAndroidCameraFocusControl::setCustomFocusPoint(const QPointF &point) { - if (m_customFocusPoint != point) { - m_customFocusPoint = point; - emit customFocusPointChanged(m_customFocusPoint); + if (m_focusPoint != point) { + m_focusPoint = point; + emit customFocusPointChanged(m_focusPoint); } - if (m_session->camera() && m_focusPointMode == QCameraFocus::FocusPointCustom) { - m_actualFocusPoint = m_customFocusPoint; + if (m_session->camera()) setCameraFocusArea(); - } } void QAndroidCameraFocusControl::onCameraOpened() @@ -187,7 +156,7 @@ void QAndroidCameraFocusControl::onCameraOpened() m_supportedFocusModes.clear(); m_continuousPictureFocusSupported = false; m_continuousVideoFocusSupported = false; - m_supportedFocusPointModes.clear(); + m_focusPointSupported = false; QStringList focusModes = m_session->camera()->getSupportedFocusModes(); for (int i = 0; i < focusModes.size(); ++i) { @@ -209,18 +178,14 @@ void QAndroidCameraFocusControl::onCameraOpened() } } - m_supportedFocusPointModes << QCameraFocus::FocusPointAuto; if (m_session->camera()->getMaxNumFocusAreas() > 0) - m_supportedFocusPointModes << QCameraFocus::FocusPointCenter << QCameraFocus::FocusPointCustom; + m_focusPointSupported = true; if (!m_supportedFocusModes.contains(m_focusMode)) setFocusModeHelper(QCameraFocus::AutoFocus); - if (!m_supportedFocusPointModes.contains(m_focusPointMode)) - setFocusPointModeHelper(QCameraFocus::FocusPointAuto); setFocusMode(m_focusMode); - setCustomFocusPoint(m_customFocusPoint); - setFocusPointMode(m_focusPointMode); + setCustomFocusPoint(m_focusPoint); if (m_session->camera()->isZoomSupported()) { m_zoomRatios = m_session->camera()->getZoomRatios(); @@ -238,7 +203,7 @@ void QAndroidCameraFocusControl::onCameraOpened() void QAndroidCameraFocusControl::setCameraFocusArea() { QList<QRect> areas; - if (m_focusPointMode != QCameraFocus::FocusPointAuto) { + if (QRectF(0., 0., 1., 1.).contains(m_focusPoint)) { // in FocusPointAuto mode, leave the area list empty // to let the driver choose the focus point. QSize viewportSize = m_session->camera()->previewSize(); @@ -249,10 +214,10 @@ void QAndroidCameraFocusControl::setCameraFocusArea() // Set up a 50x50 pixel focus area around the focal point QSizeF focusSize(50.f / viewportSize.width(), 50.f / viewportSize.height()); float x = qBound(qreal(0), - m_actualFocusPoint.x() - (focusSize.width() / 2), + m_focusPoint.x() - (focusSize.width() / 2), 1.f - focusSize.width()); float y = qBound(qreal(0), - m_actualFocusPoint.y() - (focusSize.height() / 2), + m_focusPoint.y() - (focusSize.height() / 2), 1.f - focusSize.height()); QRectF area(QPointF(x, y), focusSize); diff --git a/src/multimedia/platform/android/mediacapture/qandroidcamerafocuscontrol_p.h b/src/multimedia/platform/android/mediacapture/qandroidcamerafocuscontrol_p.h index 8149fcbdc..5b72f978d 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcamerafocuscontrol_p.h +++ b/src/multimedia/platform/android/mediacapture/qandroidcamerafocuscontrol_p.h @@ -66,10 +66,9 @@ public: QCameraFocus::FocusMode focusMode() const override; void setFocusMode(QCameraFocus::FocusMode mode) override; bool isFocusModeSupported(QCameraFocus::FocusMode mode) const override; - QCameraFocus::FocusPointMode focusPointMode() const override; - void setFocusPointMode(QCameraFocus::FocusPointMode mode) override; - bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const override; - QPointF customFocusPoint() const override; + + bool isCustomFocusPointSupported() const override; + QPointF focusPoint() const override; void setCustomFocusPoint(const QPointF &point) override; ZoomRange zoomFactorRange() const override; @@ -91,28 +90,17 @@ private: } } - inline void setFocusPointModeHelper(QCameraFocus::FocusPointMode mode) - { - if (m_focusPointMode != mode) { - m_focusPointMode = mode; - emit focusPointModeChanged(mode); - } - } - void setCameraFocusArea(); QAndroidCameraSession *m_session; QCameraFocus::FocusMode m_focusMode; - QCameraFocus::FocusPointMode m_focusPointMode; - QPointF m_actualFocusPoint; - QPointF m_customFocusPoint; + QPointF m_focusPoint; QList<QCameraFocus::FocusMode> m_supportedFocusModes; bool m_continuousPictureFocusSupported; bool m_continuousVideoFocusSupported; - - QList<QCameraFocus::FocusPointMode> m_supportedFocusPointModes; + bool m_focusPointSupported = false; float m_maximumZoom; QList<int> m_zoomRatios; diff --git a/src/multimedia/platform/darwin/camera/avfcamerafocuscontrol.mm b/src/multimedia/platform/darwin/camera/avfcamerafocuscontrol.mm index 8f34d8f7e..628394686 100644 --- a/src/multimedia/platform/darwin/camera/avfcamerafocuscontrol.mm +++ b/src/multimedia/platform/darwin/camera/avfcamerafocuscontrol.mm @@ -62,13 +62,6 @@ bool qt_focus_mode_supported(QCameraFocus::FocusMode mode) || mode == QCameraFocus::ManualFocus; } -bool qt_focus_point_mode_supported(QCameraFocus::FocusPointMode mode) -{ - return mode == QCameraFocus::FocusPointAuto - || mode == QCameraFocus::FocusPointCustom - || mode == QCameraFocus::FocusPointCenter; -} - AVCaptureFocusMode avf_focus_mode(QCameraFocus::FocusMode requestedMode) { switch (requestedMode) { @@ -87,7 +80,6 @@ AVCaptureFocusMode avf_focus_mode(QCameraFocus::FocusMode requestedMode) AVFCameraFocusControl::AVFCameraFocusControl(AVFCameraService *service) : m_session(service->session()), m_focusMode(QCameraFocus::ContinuousFocus), - m_focusPointMode(QCameraFocus::FocusPointAuto), m_customFocusPoint(0.5f, 0.5f), m_actualFocusPoint(m_customFocusPoint) { @@ -160,71 +152,7 @@ bool AVFCameraFocusControl::isFocusModeSupported(QCameraFocus::FocusMode mode) c #endif } -QCameraFocus::FocusPointMode AVFCameraFocusControl::focusPointMode() const -{ - return m_focusPointMode; -} - -void AVFCameraFocusControl::setFocusPointMode(QCameraFocus::FocusPointMode mode) -{ - if (m_focusPointMode == mode) - return; - - AVCaptureDevice *captureDevice = m_session->videoCaptureDevice(); - if (!captureDevice) { - if (qt_focus_point_mode_supported(mode)) { - m_focusPointMode = mode; - Q_EMIT focusPointModeChanged(mode); - } - return; - } - - if (isFocusPointModeSupported(mode)) { - const AVFConfigurationLock lock(captureDevice); - if (!lock) { - qDebugCamera() << Q_FUNC_INFO << "failed to lock for configuration"; - return; - } - - bool resetPOI = false; - if (mode == QCameraFocus::FocusPointCenter || mode == QCameraFocus::FocusPointAuto) { - if (m_actualFocusPoint != QPointF(0.5, 0.5)) { - m_actualFocusPoint = QPointF(0.5, 0.5); - resetPOI = true; - } - } else if (mode == QCameraFocus::FocusPointCustom) { - if (m_actualFocusPoint != m_customFocusPoint) { - m_actualFocusPoint = m_customFocusPoint; - resetPOI = true; - } - } // else for any other mode in future. - - if (resetPOI) { - const CGPoint focusPOI = CGPointMake(m_actualFocusPoint.x(), m_actualFocusPoint.y()); - [captureDevice setFocusPointOfInterest:focusPOI]; - } - m_focusPointMode = mode; - } else { - qDebugCamera() << Q_FUNC_INFO << "focus point mode is not supported"; - return; - } - - Q_EMIT focusPointModeChanged(mode); -} - -bool AVFCameraFocusControl::isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const -{ - AVCaptureDevice *captureDevice = m_session->videoCaptureDevice(); - if (!captureDevice) - return false; - - if (!qt_focus_point_mode_supported(mode)) - return false; - - return [captureDevice isFocusPointOfInterestSupported]; -} - -QPointF AVFCameraFocusControl::customFocusPoint() const +QPointF AVFCameraFocusControl::focusPoint() const { return m_customFocusPoint; } @@ -235,6 +163,7 @@ void AVFCameraFocusControl::setCustomFocusPoint(const QPointF &point) return; if (!QRectF(0.f, 0.f, 1.f, 1.f).contains(point)) { + // ### release custom focus point, tell the camera to focus where it wants... qDebugCamera() << Q_FUNC_INFO << "invalid focus point (out of range)"; return; } @@ -243,7 +172,7 @@ void AVFCameraFocusControl::setCustomFocusPoint(const QPointF &point) Q_EMIT customFocusPointChanged(m_customFocusPoint); AVCaptureDevice *captureDevice = m_session->videoCaptureDevice(); - if (!captureDevice || m_focusPointMode != QCameraFocus::FocusPointCustom) + if (!captureDevice) return; if ([captureDevice isFocusPointOfInterestSupported]) { @@ -264,6 +193,11 @@ void AVFCameraFocusControl::setCustomFocusPoint(const QPointF &point) } } +bool AVFCameraFocusControl::isCustomFocusPointSupported() const +{ + return true; +} + void AVFCameraFocusControl::setFocusDistance(float d) { #ifdef Q_OS_IOS @@ -312,8 +246,7 @@ void AVFCameraFocusControl::cameraStateChanged() } const AVFConfigurationLock lock(captureDevice); - if (m_customFocusPoint != m_actualFocusPoint - && m_focusPointMode == QCameraFocus::FocusPointCustom) { + if (m_customFocusPoint != m_actualFocusPoint) { if (![captureDevice isFocusPointOfInterestSupported]) { qDebugCamera() << Q_FUNC_INFO << "focus point of interest not supported"; diff --git a/src/multimedia/platform/darwin/camera/avfcamerafocuscontrol_p.h b/src/multimedia/platform/darwin/camera/avfcamerafocuscontrol_p.h index 89f65ab6b..206b6d221 100644 --- a/src/multimedia/platform/darwin/camera/avfcamerafocuscontrol_p.h +++ b/src/multimedia/platform/darwin/camera/avfcamerafocuscontrol_p.h @@ -75,11 +75,9 @@ public: void setFocusMode(QCameraFocus::FocusMode mode) override; bool isFocusModeSupported(QCameraFocus::FocusMode mode) const override; - QCameraFocus::FocusPointMode focusPointMode() const override; - void setFocusPointMode(QCameraFocus::FocusPointMode mode) override; - bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const override; - QPointF customFocusPoint() const override; + QPointF focusPoint() const override; void setCustomFocusPoint(const QPointF &point) override; + bool isCustomFocusPointSupported() const override; void setFocusDistance(float) override; float focusDistance() const override; @@ -93,7 +91,6 @@ private Q_SLOTS: private: AVFCameraSession *m_session; QCameraFocus::FocusMode m_focusMode; - QCameraFocus::FocusPointMode m_focusPointMode; QPointF m_customFocusPoint; QPointF m_actualFocusPoint; diff --git a/src/multimedia/platform/gstreamer/camerabin/camerabinfocus.cpp b/src/multimedia/platform/gstreamer/camerabin/camerabinfocus.cpp index 65283a62f..d9096b6a0 100644 --- a/src/multimedia/platform/gstreamer/camerabin/camerabinfocus.cpp +++ b/src/multimedia/platform/gstreamer/camerabin/camerabinfocus.cpp @@ -61,9 +61,8 @@ CameraBinFocus::CameraBinFocus(CameraBinSession *session) m_session(session), m_cameraStatus(QCamera::UnloadedStatus), m_focusMode(QCameraFocus::AutoFocus), - m_focusPointMode(QCameraFocus::FocusPointAuto), m_focusStatus(QCamera::Unlocked), - m_focusPoint(0.5, 0.5), + m_focusPoint(-1., -1.), m_focusRect(0, 0, 0.3, 0.3) { m_focusRect.moveCenter(m_focusPoint); @@ -134,72 +133,6 @@ bool CameraBinFocus::isFocusModeSupported(QCameraFocus::FocusMode mode) const } } -QCameraFocus::FocusPointMode CameraBinFocus::focusPointMode() const -{ - return m_focusPointMode; -} - -void CameraBinFocus::setFocusPointMode(QCameraFocus::FocusPointMode mode) -{ - GstElement *source = m_session->cameraSource(); - - if (m_focusPointMode == mode || !source) - return; - - if (m_focusPointMode == QCameraFocus::FocusPointFaceDetection) { - g_object_set (G_OBJECT(source), "detect-faces", FALSE, NULL); - - if (GstPad *pad = gst_element_get_static_pad(source, "vfsrc")) { - removeProbeFromPad(pad); - gst_object_unref(GST_OBJECT(pad)); - } - - m_faceResetTimer.stop(); - m_faceFocusRects.clear(); - - QMutexLocker locker(&m_mutex); - m_faces.clear(); - } - - if (m_focusPointMode != QCameraFocus::FocusPointAuto) - resetFocusPoint(); - - switch (mode) { - case QCameraFocus::FocusPointAuto: - case QCameraFocus::FocusPointCustom: - break; - case QCameraFocus::FocusPointFaceDetection: - if (g_object_class_find_property(G_OBJECT_GET_CLASS(source), "detect-faces")) { - if (GstPad *pad = gst_element_get_static_pad(source, "vfsrc")) { - addProbeToPad(pad); - g_object_set (G_OBJECT(source), "detect-faces", TRUE, NULL); - break; - } - } - return; - default: - return; - } - - m_focusPointMode = mode; - emit focusPointModeChanged(m_focusPointMode); -} - -bool CameraBinFocus::isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const -{ - switch (mode) { - case QCameraFocus::FocusPointAuto: - case QCameraFocus::FocusPointCustom: - return true; - case QCameraFocus::FocusPointFaceDetection: - if (GstElement *source = m_session->cameraSource()) - return g_object_class_find_property(G_OBJECT_GET_CLASS(source), "detect-faces"); - return false; - default: - return false; - } -} - QPointF CameraBinFocus::customFocusPoint() const { return m_focusPoint; @@ -214,12 +147,9 @@ void CameraBinFocus::setCustomFocusPoint(const QPointF &point) m_focusPoint.setX(qBound(m_focusRect.width() / 2, m_focusPoint.x(), 1 - m_focusRect.width() / 2)); m_focusPoint.setY(qBound(m_focusRect.height() / 2, m_focusPoint.y(), 1 - m_focusRect.height() / 2)); - if (m_focusPointMode == QCameraFocus::FocusPointCustom) { - const QRectF focusRect = m_focusRect; - m_focusRect.moveCenter(m_focusPoint); + m_focusRect.moveCenter(m_focusPoint); - updateRegionOfInterest(m_focusRect); - } + updateRegionOfInterest(m_focusRect); emit customFocusPointChanged(m_focusPoint); } @@ -242,9 +172,7 @@ void CameraBinFocus::_q_handleCameraStatusChange(QCamera::Status status) } gst_object_unref(GST_OBJECT(pad)); } - if (m_focusPointMode == QCameraFocus::FocusPointCustom) { - updateRegionOfInterest(m_focusRect); - } + updateRegionOfInterest(m_focusRect); } else { _q_setFocusStatus(QCamera::Unlocked, QCamera::LockLost); @@ -353,8 +281,8 @@ void CameraBinFocus::updateRegionOfInterest(const QList<QRect> &rectangles) void CameraBinFocus::_q_updateFaces() { - if (m_focusPointMode != QCameraFocus::FocusPointFaceDetection) - return; +// if (m_focusPointMode != QCameraFocus::FocusPointFaceDetection) +// return; QList<QRect> faces; diff --git a/src/multimedia/platform/gstreamer/camerabin/camerabinfocus_p.h b/src/multimedia/platform/gstreamer/camerabin/camerabinfocus_p.h index 48ec7e559..a83e505ca 100644 --- a/src/multimedia/platform/gstreamer/camerabin/camerabinfocus_p.h +++ b/src/multimedia/platform/gstreamer/camerabin/camerabinfocus_p.h @@ -81,10 +81,7 @@ public: void setFocusMode(QCameraFocus::FocusMode mode) override; bool isFocusModeSupported(QCameraFocus::FocusMode mode) const override; - QCameraFocus::FocusPointMode focusPointMode() const override; - void setFocusPointMode(QCameraFocus::FocusPointMode mode) override; - bool isFocusPointModeSupported(QCameraFocus::FocusPointMode) const override; - QPointF customFocusPoint() const override; + QPointF focusPoint() const override; void setCustomFocusPoint(const QPointF &point) override; qreal maximumOpticalZoom() const override; @@ -115,7 +112,6 @@ private: CameraBinSession *m_session; QCamera::Status m_cameraStatus; QCameraFocus::FocusMode m_focusMode; - QCameraFocus::FocusPointMode m_focusPointMode; QPointF m_focusPoint; QRectF m_focusRect; QSize m_viewfinderResolution; diff --git a/src/multimedia/platform/qnx/camera/bbcamerafocuscontrol.cpp b/src/multimedia/platform/qnx/camera/bbcamerafocuscontrol.cpp index 4e1b8802b..2865a0363 100644 --- a/src/multimedia/platform/qnx/camera/bbcamerafocuscontrol.cpp +++ b/src/multimedia/platform/qnx/camera/bbcamerafocuscontrol.cpp @@ -48,7 +48,6 @@ BbCameraFocusControl::BbCameraFocusControl(BbCameraSession *session, QObject *pa : QPlatformCameraFocus(parent) , m_session(session) , m_focusMode(QCameraFocus::FocusModeAuto) - , m_focusPointMode(QCameraFocus::FocusPointAuto) , m_customFocusPoint(QPointF(0, 0)) { connect(m_session, SIGNAL(statusChanged(QCamera::Status)), this, SLOT(statusChanged(QCamera::Status))); @@ -133,81 +132,7 @@ bool BbCameraFocusControl::isFocusModeSupported(QCameraFocus::FocusMode mode) co return false; } -QCameraFocus::FocusPointMode BbCameraFocusControl::focusPointMode() const -{ - return m_focusPointMode; -} - -void BbCameraFocusControl::setFocusPointMode(QCameraFocus::FocusPointMode mode) -{ - if (m_session->status() != QCamera::ActiveStatus) - return; - - if (m_focusPointMode == mode) - return; - - m_focusPointMode = mode; - emit focusPointModeChanged(m_focusPointMode); - - if (m_focusPointMode == QCameraFocus::FocusPointAuto) { - //TODO: is this correct? - const camera_error_t result = camera_set_focus_regions(m_session->handle(), 0, 0); - if (result != CAMERA_EOK) { - qWarning() << "Unable to set focus region:" << result; - return; - } - } else if (m_focusPointMode == QCameraFocus::FocusPointCenter) { - // get the size of the viewfinder - int viewfinderWidth = 0; - int viewfinderHeight = 0; - - if (!retrieveViewfinderSize(&viewfinderWidth, &viewfinderHeight)) - return; - - // define a 40x40 pixel focus region in the center of the viewfinder - camera_region_t focusRegion; - focusRegion.left = (viewfinderWidth / 2) - 20; - focusRegion.top = (viewfinderHeight / 2) - 20; - focusRegion.width = 40; - focusRegion.height = 40; - - camera_error_t result = camera_set_focus_regions(m_session->handle(), 1, &focusRegion); - if (result != CAMERA_EOK) { - qWarning() << "Unable to set focus region:" << result; - return; - } - - // re-set focus mode to apply focus region changes - camera_focusmode_t focusMode = CAMERA_FOCUSMODE_OFF; - result = camera_get_focus_mode(m_session->handle(), &focusMode); - camera_set_focus_mode(m_session->handle(), focusMode); - - } else if (m_focusPointMode == QCameraFocus::FocusPointFaceDetection) { - //TODO: implement later - } else if (m_focusPointMode == QCameraFocus::FocusPointCustom) { - updateCustomFocusRegion(); - } -} - -bool BbCameraFocusControl::isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const -{ - if (m_session->state() == QCamera::UnloadedState) - return false; - - if (mode == QCameraFocus::FocusPointAuto) { - return camera_has_feature(m_session->handle(), CAMERA_FEATURE_AUTOFOCUS); - } else if (mode == QCameraFocus::FocusPointCenter) { - return camera_has_feature(m_session->handle(), CAMERA_FEATURE_REGIONFOCUS); - } else if (mode == QCameraFocus::FocusPointFaceDetection) { - return false; //TODO: implement via custom region in combination with face detection in viewfinder - } else if (mode == QCameraFocus::FocusPointCustom) { - return camera_has_feature(m_session->handle(), CAMERA_FEATURE_REGIONFOCUS); - } - - return false; -} - -QPointF BbCameraFocusControl::customFocusPoint() const +QPointF BbCameraFocusControl::focusPoint() const { return m_customFocusPoint; } diff --git a/src/multimedia/platform/qnx/camera/bbcamerafocuscontrol_p.h b/src/multimedia/platform/qnx/camera/bbcamerafocuscontrol_p.h index 40cf01070..231ff9025 100644 --- a/src/multimedia/platform/qnx/camera/bbcamerafocuscontrol_p.h +++ b/src/multimedia/platform/qnx/camera/bbcamerafocuscontrol_p.h @@ -65,10 +65,7 @@ public: QCameraFocus::FocusMode focusMode() const override; void setFocusMode(QCameraFocus::FocusMode mode) override; bool isFocusModeSupported(QCameraFocus::FocusMode mode) const override; - QCameraFocus::FocusPointMode focusPointMode() const override; - void setFocusPointMode(QCameraFocus::FocusPointMode mode) override; - bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const override; - QPointF customFocusPoint() const override; + QPointF focusPoint() const override; void setCustomFocusPoint(const QPointF &point) override; qreal maximumOpticalZoom() const override; @@ -89,7 +86,6 @@ private: BbCameraSession *m_session; QCameraFocus::FocusMode m_focusMode; - QCameraFocus::FocusPointMode m_focusPointMode; QPointF m_customFocusPoint; qreal m_minimumZoomFactor; diff --git a/src/multimedia/platform/qplatformcamerafocus_p.h b/src/multimedia/platform/qplatformcamerafocus_p.h index a1a95ffb3..b08755598 100644 --- a/src/multimedia/platform/qplatformcamerafocus_p.h +++ b/src/multimedia/platform/qplatformcamerafocus_p.h @@ -59,11 +59,9 @@ public: virtual void setFocusMode(QCameraFocus::FocusMode mode) = 0; virtual bool isFocusModeSupported(QCameraFocus::FocusMode mode) const = 0; - virtual QCameraFocus::FocusPointMode focusPointMode() const = 0; - virtual void setFocusPointMode(QCameraFocus::FocusPointMode mode) = 0; - virtual bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const = 0; - virtual QPointF customFocusPoint() const = 0; - virtual void setCustomFocusPoint(const QPointF &point) = 0; + virtual bool isCustomFocusPointSupported() const { return false; } + virtual void setCustomFocusPoint(const QPointF &/*point*/) {} + virtual QPointF focusPoint() const { return {-1., -1.}; } virtual void setFocusDistance(float) {} virtual float focusDistance() const { return 0.; } @@ -79,7 +77,6 @@ public: Q_SIGNALS: void focusModeChanged(QCameraFocus::FocusMode mode); - void focusPointModeChanged(QCameraFocus::FocusPointMode mode); void customFocusPointChanged(const QPointF &point); protected: diff --git a/tests/auto/unit/mockbackend/mockcamerafocuscontrol.h b/tests/auto/unit/mockbackend/mockcamerafocuscontrol.h index df40a24d9..9442fb890 100644 --- a/tests/auto/unit/mockbackend/mockcamerafocuscontrol.h +++ b/tests/auto/unit/mockbackend/mockcamerafocuscontrol.h @@ -39,7 +39,6 @@ public: MockCameraFocusControl(QObject *parent = 0): QPlatformCameraFocus(parent), m_focusMode(QCameraFocus::AutoFocus), - m_focusPointMode(QCameraFocus::FocusPointAuto), m_focusPoint(0.5, 0.5) { } @@ -62,30 +61,7 @@ public: return mode == QCameraFocus::FocusModeAuto; } - QCameraFocus::FocusPointMode focusPointMode() const - { - return m_focusPointMode; - } - - void setFocusPointMode(QCameraFocus::FocusPointMode mode) - { - if (isFocusPointModeSupported(mode)) - m_focusPointMode = mode; - } - - bool isFocusPointModeSupported(QCameraFocus::FocusPointMode mode) const - { - switch (mode) { - case QCameraFocus::FocusPointAuto: - case QCameraFocus::FocusPointCenter: - case QCameraFocus::FocusPointCustom: - return true; - default: - return false; - } - } - - QPointF customFocusPoint() const + QPointF focusPoint() const { return m_focusPoint; } @@ -106,7 +82,6 @@ public: private: QCameraFocus::FocusMode m_focusMode; - QCameraFocus::FocusPointMode m_focusPointMode; QPointF m_focusPoint; float m_zoom = 1.; diff --git a/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp b/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp index c208381de..62ae3bd2c 100644 --- a/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp +++ b/tests/auto/unit/multimedia/qcamera/tst_qcamera.cpp @@ -241,13 +241,6 @@ void tst_QCamera::testSimpleCameraFocus() cameraFocus->zoomTo(100.0, 100.0); QCOMPARE(cameraFocus->zoomFactor(), 1.0); - QVERIFY(!cameraFocus->isFocusPointModeSupported(QCameraFocus::FocusPointAuto)); - QCOMPARE(cameraFocus->focusPointMode(), QCameraFocus::FocusPointAuto); - - QTest::ignoreMessage(QtWarningMsg, "Focus points mode selection is not supported"); - cameraFocus->setFocusPointMode( QCameraFocus::FocusPointCenter ); - QCOMPARE(cameraFocus->focusPointMode(), QCameraFocus::FocusPointAuto); - QCOMPARE(cameraFocus->customFocusPoint(), QPointF(0.5, 0.5)); QTest::ignoreMessage(QtWarningMsg, "Focus points selection is not supported"); cameraFocus->setCustomFocusPoint(QPointF(1.0, 1.0)); @@ -534,17 +527,6 @@ void tst_QCamera::testCameraFocus() cameraFocus->zoomTo(2000000.0, -1); QVERIFY(qFuzzyCompare(cameraFocus->zoomFactor(), cameraFocus->maximumZoomFactor())); - QVERIFY(cameraFocus->isFocusPointModeSupported(QCameraFocus::FocusPointAuto)); - QVERIFY(cameraFocus->isFocusPointModeSupported(QCameraFocus::FocusPointCenter)); - QVERIFY(cameraFocus->isFocusPointModeSupported(QCameraFocus::FocusPointCustom)); - QCOMPARE(cameraFocus->focusPointMode(), QCameraFocus::FocusPointAuto); - - cameraFocus->setFocusPointMode( QCameraFocus::FocusPointCenter ); - QCOMPARE(cameraFocus->focusPointMode(), QCameraFocus::FocusPointCenter); - - cameraFocus->setFocusPointMode( QCameraFocus::FocusPointFaceDetection ); - QCOMPARE(cameraFocus->focusPointMode(), QCameraFocus::FocusPointCenter); - QCOMPARE(cameraFocus->customFocusPoint(), QPointF(0.5, 0.5)); cameraFocus->setCustomFocusPoint(QPointF(1.0, 1.0)); QCOMPARE(cameraFocus->customFocusPoint(), QPointF(1.0, 1.0)); |