diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-02-07 16:00:13 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-02-09 19:04:36 +0000 |
commit | c9207426ec8f44bf766180631890a5ba6f4925d6 (patch) | |
tree | 4b5540b577943642e85ebc924df68c12f67f5a30 /src/multimedia | |
parent | ff25f700c87a308702f4dfdd8b2ab145a75ef5e4 (diff) |
Clean up zooming API
There is very little point these days in having properties
for both optical and digital zoom. Most mobile cameras don't
have a real optical zoom, but instead combine different cameras
with different focal lengths.
Change-Id: Icac48d949e767d7f3105c4d330e15273fe715fbe
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Doris Verria <doris.verria@qt.io>
Diffstat (limited to 'src/multimedia')
9 files changed, 77 insertions, 211 deletions
diff --git a/src/multimedia/camera/qcamerafocus.cpp b/src/multimedia/camera/qcamerafocus.cpp index 0f8f8eaa0..7fa30a859 100644 --- a/src/multimedia/camera/qcamerafocus.cpp +++ b/src/multimedia/camera/qcamerafocus.cpp @@ -50,14 +50,6 @@ QT_BEGIN_NAMESPACE -static void qRegisterCameraFocusMetaTypes() -{ - qRegisterMetaType<QCameraFocus::FocusModes>("QCameraFocus::FocusModes"); - qRegisterMetaType<QCameraFocus::FocusPointMode>("QCameraFocus::FocusPointMode"); -} - -Q_CONSTRUCTOR_FUNCTION(qRegisterCameraFocusMetaTypes) - class QCameraFocusFakeFocusControl : public QCameraFocusControl { public: @@ -76,15 +68,11 @@ public: [[nodiscard]] QCameraFocusZoneList focusZones() const override { return QCameraFocusZoneList(); } - [[nodiscard]] qreal maximumOpticalZoom() const override { return 1.0; } - [[nodiscard]] qreal maximumDigitalZoom() const override { return 1.0; } - - [[nodiscard]] qreal requestedOpticalZoom() const override { return 1.0; } - [[nodiscard]] qreal requestedDigitalZoom() const override { return 1.0; } - [[nodiscard]] qreal currentOpticalZoom() const override { return 1.0; } - [[nodiscard]] qreal currentDigitalZoom() const override { return 1.0; } - - void zoomTo(qreal, qreal) override { qWarning("The camera doesn't support zooming."); } + ZoomRange zoomFactorRange() const override { return {1., 1.}; }; + void zoomTo(float, float) override + { + qWarning("The camera doesn't support zooming."); + } }; @@ -297,6 +285,7 @@ public: QCameraFocusControl *focusControl; bool available; + float zoomFactor = 1.; }; @@ -454,61 +443,54 @@ QCameraFocusZoneList QCameraFocus::focusZones() const } /*! - Returns the maximum optical zoom. + Returns the maximum zoom factor. - This will be \c 1.0 on cameras that do not support optical zoom. + This will be \c 1.0 on cameras that do not support zooming. */ -qreal QCameraFocus::maximumOpticalZoom() const +float QCameraFocus::maximumZoomFactor() const { - return d_func()->focusControl->maximumOpticalZoom(); + return d_func()->focusControl->zoomFactorRange().max; } /*! - Returns the maximum digital zoom + Returns the minimum zoom factor. - This will be \c 1.0 on cameras that do not support digital zoom. + This will be \c 1.0 on cameras that do not support zooming. */ -qreal QCameraFocus::maximumDigitalZoom() const +float QCameraFocus::minimumZoomFactor() const { - return d_func()->focusControl->maximumDigitalZoom(); + return d_func()->focusControl->zoomFactorRange().min; } /*! - \property QCameraFocus::opticalZoom - \brief the current optical zoom value. - - \sa QCameraFocus::digitalZoom + \property QCameraFocus::zoomFactor + \brief The current zoom factor. */ - -qreal QCameraFocus::opticalZoom() const +float QCameraFocus::zoomFactor() const { - return d_func()->focusControl->currentOpticalZoom(); + return d_func()->zoomFactor; } -/*! - \property QCameraFocus::digitalZoom - \brief the current digital zoom value. - - \sa QCameraFocus::opticalZoom -*/ -qreal QCameraFocus::digitalZoom() const +void QCameraFocus::setZoomFactor(float factor) { - return d_func()->focusControl->currentDigitalZoom(); + Q_D(QCameraFocus); + d->zoomFactor = factor; + d->focusControl->zoomTo(factor, -1); } - /*! - Set the camera \a optical and \a digital zoom values. + Zooms to a zoom factor \a factor using \a rate. - Since there may be a physical component to move, the change in - zoom value may not be instantaneous. - -*/ -void QCameraFocus::zoomTo(qreal optical, qreal digital) + The rate is specified in powers of two per second. A rate of 1 + would take two seconds to zoom from a zoom factor of 1 to a zoom factor of 4. + */ +void QCameraFocus::zoomTo(float factor, float rate) { - d_func()->focusControl->zoomTo(optical, digital); + Q_D(QCameraFocus); + d->zoomFactor = factor; + d->focusControl->zoomTo(factor, rate); } /*! diff --git a/src/multimedia/camera/qcamerafocus.h b/src/multimedia/camera/qcamerafocus.h index c8f7ae60d..1b8d69628 100644 --- a/src/multimedia/camera/qcamerafocus.h +++ b/src/multimedia/camera/qcamerafocus.h @@ -99,8 +99,7 @@ class Q_MULTIMEDIA_EXPORT QCameraFocus : public QObject Q_PROPERTY(FocusPointMode focusPointMode READ focusPointMode WRITE setFocusPointMode) Q_PROPERTY(QPointF customFocusPoint READ customFocusPoint WRITE setCustomFocusPoint) Q_PROPERTY(QCameraFocusZoneList focusZones READ focusZones NOTIFY focusZonesChanged) - Q_PROPERTY(qreal opticalZoom READ opticalZoom NOTIFY opticalZoomChanged) - Q_PROPERTY(qreal digitalZoom READ digitalZoom NOTIFY digitalZoomChanged) + Q_PROPERTY(float zoomFactor READ zoomFactor WRITE setZoomFactor NOTIFY zoomFactorChanged) Q_ENUMS(FocusMode) Q_ENUMS(FocusPointMode) @@ -136,22 +135,17 @@ public: QCameraFocusZoneList focusZones() const; - qreal maximumOpticalZoom() const; - qreal maximumDigitalZoom() const; - qreal opticalZoom() const; - qreal digitalZoom() const; + float minimumZoomFactor() const; + float maximumZoomFactor() const; + float zoomFactor() const; + void setZoomFactor(float factor); - void zoomTo(qreal opticalZoom, qreal digitalZoom); + void zoomTo(float zoom, float rate); Q_SIGNALS: - void opticalZoomChanged(qreal); - void digitalZoomChanged(qreal); - + void zoomFactorChanged(float); void focusZonesChanged(); - void maximumOpticalZoomChanged(qreal); - void maximumDigitalZoomChanged(qreal); - protected: ~QCameraFocus(); diff --git a/src/multimedia/controls/qcamerafocuscontrol.h b/src/multimedia/controls/qcamerafocuscontrol.h index 871f240da..cf5c391bd 100644 --- a/src/multimedia/controls/qcamerafocuscontrol.h +++ b/src/multimedia/controls/qcamerafocuscontrol.h @@ -67,15 +67,14 @@ public: virtual QCameraFocusZoneList focusZones() const = 0; - virtual qreal maximumOpticalZoom() const = 0; - virtual qreal maximumDigitalZoom() const = 0; + struct ZoomRange { + float min; + float max; + }; - virtual qreal requestedOpticalZoom() const = 0; - virtual qreal requestedDigitalZoom() const = 0; - virtual qreal currentOpticalZoom() const = 0; - virtual qreal currentDigitalZoom() const = 0; - - virtual void zoomTo(qreal optical, qreal digital) = 0; + virtual ZoomRange zoomFactorRange() const = 0; + // smaller 0: zoom instantly, rate in power-of-two/sec + virtual void zoomTo(float newZoomFactor, float rate = -1.) = 0; Q_SIGNALS: void focusModeChanged(QCameraFocus::FocusModes mode); @@ -84,13 +83,6 @@ Q_SIGNALS: void focusZonesChanged(); - void maximumOpticalZoomChanged(qreal); - void maximumDigitalZoomChanged(qreal); - - void requestedOpticalZoomChanged(qreal opticalZoom); - void requestedDigitalZoomChanged(qreal digitalZoom); - void currentOpticalZoomChanged(qreal opticalZoom); - void currentDigitalZoomChanged(qreal digitalZoom); protected: explicit QCameraFocusControl(QObject *parent = nullptr); diff --git a/src/multimedia/platform/android/mediacapture/qandroidcamerafocuscontrol.cpp b/src/multimedia/platform/android/mediacapture/qandroidcamerafocuscontrol.cpp index 0fa9b055a..b1805ff15 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcamerafocuscontrol.cpp +++ b/src/multimedia/platform/android/mediacapture/qandroidcamerafocuscontrol.cpp @@ -234,15 +234,11 @@ void QAndroidCameraFocusControl::onCameraOpened() qreal maxZoom = m_zoomRatios.last() / qreal(100); if (m_maximumZoom != maxZoom) { m_maximumZoom = maxZoom; - emit maximumDigitalZoomChanged(m_maximumZoom); } - zoomTo(1, m_requestedZoom); + zoomTo(1, -1); } else { m_zoomRatios.clear(); - if (!qFuzzyCompare(m_maximumZoom, qreal(1))) { - m_maximumZoom = 1.0; - emit maximumDigitalZoomChanged(m_maximumZoom); - } + m_maximumZoom = 1.0; } } @@ -326,56 +322,26 @@ void QAndroidCameraFocusControl::onAutoFocusComplete(bool success) } -qreal QAndroidCameraFocusControl::maximumOpticalZoom() const -{ - // Optical zoom not supported - return 1.0; -} - -qreal QAndroidCameraFocusControl::maximumDigitalZoom() const -{ - return m_maximumZoom; -} - -qreal QAndroidCameraFocusControl::requestedOpticalZoom() const -{ - // Optical zoom not supported - return 1.0; -} - -qreal QAndroidCameraFocusControl::requestedDigitalZoom() const -{ - return m_requestedZoom; -} - -qreal QAndroidCameraFocusControl::currentOpticalZoom() const -{ - // Optical zoom not supported - return 1.0; -} - -qreal QAndroidCameraFocusControl::currentDigitalZoom() const +QAndroidCameraFocusControl::ZoomRange QAndroidCameraFocusControl::zoomFactorRange() const { - return m_currentZoom; + return { 1., m_maximumZoom }; } -void QAndroidCameraFocusControl::zoomTo(qreal optical, qreal digital) +void QAndroidCameraFocusControl::zoomTo(float factor, float rate) { - Q_UNUSED(optical); + Q_UNUSED(rate); - if (!qFuzzyCompare(m_requestedZoom, digital)) { - m_requestedZoom = digital; - emit requestedDigitalZoomChanged(m_requestedZoom); + if (!qFuzzyCompare(m_requestedZoom, factor)) { + m_requestedZoom = factor; } if (m_session->camera()) { - digital = qBound(qreal(1), digital, m_maximumZoom); - int validZoomIndex = qt_findClosestValue(m_zoomRatios, qRound(digital * 100)); - qreal newZoom = m_zoomRatios.at(validZoomIndex) / qreal(100); + factor = qBound(qreal(1), factor, m_maximumZoom); + int validZoomIndex = qt_findClosestValue(m_zoomRatios, qRound(factor * 100)); + float newZoom = m_zoomRatios.at(validZoomIndex) / qreal(100); if (!qFuzzyCompare(m_currentZoom, newZoom)) { m_session->camera()->setZoom(validZoomIndex); m_currentZoom = newZoom; - emit currentDigitalZoomChanged(m_currentZoom); } } } diff --git a/src/multimedia/platform/android/mediacapture/qandroidcamerafocuscontrol_p.h b/src/multimedia/platform/android/mediacapture/qandroidcamerafocuscontrol_p.h index cf9c73017..79ab30f4f 100644 --- a/src/multimedia/platform/android/mediacapture/qandroidcamerafocuscontrol_p.h +++ b/src/multimedia/platform/android/mediacapture/qandroidcamerafocuscontrol_p.h @@ -73,13 +73,8 @@ public: void setCustomFocusPoint(const QPointF &point) override; QCameraFocusZoneList focusZones() const override; - qreal maximumOpticalZoom() const override; - qreal maximumDigitalZoom() const override; - qreal requestedOpticalZoom() const override; - qreal requestedDigitalZoom() const override; - qreal currentOpticalZoom() const override; - qreal currentDigitalZoom() const override; - void zoomTo(qreal optical, qreal digital) override; + ZoomRange zoomFactorRange() const override; + void zoomTo(float newZoomFactor, float rate) override; private Q_SLOTS: void onCameraOpened(); @@ -122,10 +117,10 @@ private: QList<QCameraFocus::FocusPointMode> m_supportedFocusPointModes; - qreal m_maximumZoom; + float m_maximumZoom; QList<int> m_zoomRatios; - qreal m_requestedZoom; - qreal m_currentZoom; + float m_requestedZoom; + float m_currentZoom; }; QT_END_NAMESPACE diff --git a/src/multimedia/platform/darwin/camera/avfcamerafocuscontrol.mm b/src/multimedia/platform/darwin/camera/avfcamerafocuscontrol.mm index 62a7d55e2..ea9827324 100644 --- a/src/multimedia/platform/darwin/camera/avfcamerafocuscontrol.mm +++ b/src/multimedia/platform/darwin/camera/avfcamerafocuscontrol.mm @@ -327,80 +327,32 @@ void AVFCameraFocusControl::cameraStateChanged() Q_EMIT maximumDigitalZoomChanged(1.); } - zoomToRequestedDigital(); + captureDevice.videoZoomFactor = m_zoomFactor; #endif } -qreal AVFCameraFocusControl::maximumOpticalZoom() const +AVFCameraFocusControl::ZoomRange AVFCameraFocusControl::zoomFactorRange() const { - // Not supported. - return 1.; + return { 1., (float)m_maxZoomFactor }; } -qreal AVFCameraFocusControl::maximumDigitalZoom() const +void AVFCameraFocusControl::zoomTo(float factor, float rate) { - return m_maxZoomFactor; -} - -qreal AVFCameraFocusControl::requestedOpticalZoom() const -{ - // Not supported. - return 1; -} - -qreal AVFCameraFocusControl::requestedDigitalZoom() const -{ - return m_requestedZoomFactor; -} - -qreal AVFCameraFocusControl::currentOpticalZoom() const -{ - // Not supported. - return 1.; -} - -qreal AVFCameraFocusControl::currentDigitalZoom() const -{ - return m_zoomFactor; -} - -void AVFCameraFocusControl::zoomTo(qreal optical, qreal digital) -{ - Q_UNUSED(optical); - Q_UNUSED(digital); + Q_UNUSED(factor); + Q_UNUSED(rate); #ifdef QOS_IOS - if (qFuzzyCompare(CGFloat(digital), m_requestedZoomFactor)) + if (qFuzzyCompare(CGFloat(factor), m_zoomFactor)) return; - m_requestedZoomFactor = digital; + m_requestedZoomFactor = factor; Q_EMIT requestedDigitalZoomChanged(digital); - zoomToRequestedDigital(); -#endif -} - -#ifdef QOS_IOS -void AVFCameraFocusControl::zoomToRequestedDigital() -{ AVCaptureDevice *captureDevice = m_session->videoCaptureDevice(); if (!captureDevice || !captureDevice.activeFormat) return; - if (qFuzzyCompare(captureDevice.activeFormat.videoMaxZoomFactor, CGFloat(1.))) - return; - - const CGFloat clampedZoom = qBound(CGFloat(1.), m_requestedZoomFactor, - captureDevice.activeFormat.videoMaxZoomFactor); - const CGFloat deviceZoom = captureDevice.videoZoomFactor; - if (qFuzzyCompare(clampedZoom, deviceZoom)) { - // Nothing to set, but check if a signal must be emitted: - if (!qFuzzyCompare(m_zoomFactor, deviceZoom)) { - m_zoomFactor = deviceZoom; - Q_EMIT currentDigitalZoomChanged(deviceZoom); - } - return; - } + m_zoomFactor = qBound(CGFloat(1.), factor, captureDevice.activeFormat.videoMaxZoomFactor); const AVFConfigurationLock lock(captureDevice); if (!lock) { @@ -408,14 +360,12 @@ void AVFCameraFocusControl::zoomToRequestedDigital() return; } - captureDevice.videoZoomFactor = clampedZoom; - - if (!qFuzzyCompare(clampedZoom, m_zoomFactor)) { - m_zoomFactor = clampedZoom; - Q_EMIT currentDigitalZoomChanged(clampedZoom); - } -} + if (rate < 0) + captureDevice.videoZoomFactor = clampedZoom; + else + [AVCaptureDevice rampToVideoZoomFactor:factor withRate:rate]; #endif +} QT_END_NAMESPACE diff --git a/src/multimedia/platform/darwin/camera/avfcamerafocuscontrol_p.h b/src/multimedia/platform/darwin/camera/avfcamerafocuscontrol_p.h index 3527d48b6..e1f8d9aec 100644 --- a/src/multimedia/platform/darwin/camera/avfcamerafocuscontrol_p.h +++ b/src/multimedia/platform/darwin/camera/avfcamerafocuscontrol_p.h @@ -83,24 +83,13 @@ public: QCameraFocusZoneList focusZones() const override; - qreal maximumOpticalZoom() const override; - qreal maximumDigitalZoom() const override; - - qreal requestedOpticalZoom() const override; - qreal requestedDigitalZoom() const override; - qreal currentOpticalZoom() const override; - qreal currentDigitalZoom() const override; - - void zoomTo(qreal optical, qreal digital) override; + ZoomRange zoomFactorRange() const override; + void zoomTo(float newZoomFactor, float rate = -1.) override; private Q_SLOTS: void cameraStateChanged(); private: -#ifdef QOS_IOS - void zoomToRequestedDigital(); -#endif - AVFCameraSession *m_session; QCameraFocus::FocusModes m_focusMode; QCameraFocus::FocusPointMode m_focusPointMode; @@ -109,7 +98,6 @@ private: CGFloat m_maxZoomFactor; CGFloat m_zoomFactor; - CGFloat m_requestedZoomFactor; }; diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoinput.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoinput.cpp index fedca45fc..0f87339df 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoinput.cpp +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoinput.cpp @@ -44,7 +44,7 @@ #include <private/qgstreamerintegration_p.h> #include <private/qgstreamerdevicemanager_p.h> - +#include <private/qgstutils_p.h> #include <algorithm> QGstreamerVideoInput::QGstreamerVideoInput() diff --git a/src/multimedia/platform/gstreamer/qgstreamerdevicemanager.cpp b/src/multimedia/platform/gstreamer/qgstreamerdevicemanager.cpp index b81ef86a3..3706ed278 100644 --- a/src/multimedia/platform/gstreamer/qgstreamerdevicemanager.cpp +++ b/src/multimedia/platform/gstreamer/qgstreamerdevicemanager.cpp @@ -140,7 +140,6 @@ QList<QCameraInfo> QGstreamerDeviceManager::videoInputs() const for (auto *d : qAsConst(m_videoSources)) { QGstStructure properties = gst_device_get_properties(d); - qDebug() << properties.toString(); if (!properties.isNull()) { QCameraInfoPrivate *info = new QCameraInfoPrivate; auto *desc = gst_device_get_display_name(d); |