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/platform | |
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/platform')
6 files changed, 33 insertions, 135 deletions
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); |