summaryrefslogtreecommitdiffstats
path: root/src/multimedia
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-02-07 16:00:13 +0100
committerLars Knoll <lars.knoll@qt.io>2021-02-09 19:04:36 +0000
commitc9207426ec8f44bf766180631890a5ba6f4925d6 (patch)
tree4b5540b577943642e85ebc924df68c12f67f5a30 /src/multimedia
parentff25f700c87a308702f4dfdd8b2ab145a75ef5e4 (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')
-rw-r--r--src/multimedia/camera/qcamerafocus.cpp78
-rw-r--r--src/multimedia/camera/qcamerafocus.h20
-rw-r--r--src/multimedia/controls/qcamerafocuscontrol.h22
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcamerafocuscontrol.cpp56
-rw-r--r--src/multimedia/platform/android/mediacapture/qandroidcamerafocuscontrol_p.h15
-rw-r--r--src/multimedia/platform/darwin/camera/avfcamerafocuscontrol.mm78
-rw-r--r--src/multimedia/platform/darwin/camera/avfcamerafocuscontrol_p.h16
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoinput.cpp2
-rw-r--r--src/multimedia/platform/gstreamer/qgstreamerdevicemanager.cpp1
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);