summaryrefslogtreecommitdiffstats
path: root/src/multimedia/platform
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/platform
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/platform')
-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
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);