summaryrefslogtreecommitdiffstats
path: root/src/plugins/gstreamer/camerabin/camerabinfocus.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/gstreamer/camerabin/camerabinfocus.cpp')
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinfocus.cpp91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/plugins/gstreamer/camerabin/camerabinfocus.cpp b/src/plugins/gstreamer/camerabin/camerabinfocus.cpp
index d60a643f6..f795b0f2f 100644
--- a/src/plugins/gstreamer/camerabin/camerabinfocus.cpp
+++ b/src/plugins/gstreamer/camerabin/camerabinfocus.cpp
@@ -48,6 +48,9 @@
#include <private/qgstutils_p.h>
+#define ZOOM_PROPERTY "zoom"
+#define MAX_ZOOM_PROPERTY "max-zoom"
+
//#define CAMERABIN_DEBUG 1
QT_BEGIN_NAMESPACE
@@ -70,6 +73,10 @@ CameraBinFocus::CameraBinFocus(CameraBinSession *session)
connect(m_session, SIGNAL(statusChanged(QCamera::Status)),
this, SLOT(_q_handleCameraStatusChange(QCamera::Status)));
+
+ GstElement *camerabin = m_session->cameraBin();
+ g_signal_connect(G_OBJECT(camerabin), "notify::zoom", G_CALLBACK(updateZoom), this);
+ g_signal_connect(G_OBJECT(camerabin), "notify::max-zoom", G_CALLBACK(updateMaxZoom), this);
}
CameraBinFocus::~CameraBinFocus()
@@ -513,4 +520,88 @@ bool CameraBinFocus::probeBuffer(GstBuffer *buffer)
return true;
}
+qreal CameraBinFocus::maximumOpticalZoom() const
+{
+ return 1.0;
+}
+
+qreal CameraBinFocus::maximumDigitalZoom() const
+{
+ gfloat zoomFactor = 1.0;
+ g_object_get(GST_BIN(m_session->cameraBin()), MAX_ZOOM_PROPERTY, &zoomFactor, NULL);
+ return zoomFactor;
+}
+
+qreal CameraBinFocus::requestedDigitalZoom() const
+{
+ return m_requestedDigitalZoom;
+}
+
+qreal CameraBinFocus::requestedOpticalZoom() const
+{
+ return m_requestedOpticalZoom;
+}
+
+qreal CameraBinFocus::currentOpticalZoom() const
+{
+ return 1.0;
+}
+
+qreal CameraBinFocus::currentDigitalZoom() const
+{
+ gfloat zoomFactor = 1.0;
+ g_object_get(GST_BIN(m_session->cameraBin()), ZOOM_PROPERTY, &zoomFactor, NULL);
+ return zoomFactor;
+}
+
+void CameraBinFocus::zoomTo(qreal optical, qreal digital)
+{
+ qreal oldDigitalZoom = currentDigitalZoom();
+
+ if (m_requestedDigitalZoom != digital) {
+ m_requestedDigitalZoom = digital;
+ emit requestedDigitalZoomChanged(digital);
+ }
+
+ if (m_requestedOpticalZoom != optical) {
+ m_requestedOpticalZoom = optical;
+ emit requestedOpticalZoomChanged(optical);
+ }
+
+ digital = qBound(qreal(1.0), digital, maximumDigitalZoom());
+ g_object_set(GST_BIN(m_session->cameraBin()), ZOOM_PROPERTY, digital, NULL);
+
+ qreal newDigitalZoom = currentDigitalZoom();
+ if (!qFuzzyCompare(oldDigitalZoom, newDigitalZoom))
+ emit currentDigitalZoomChanged(digital);
+}
+
+void CameraBinFocus::updateZoom(GObject *o, GParamSpec *p, gpointer d)
+{
+ Q_UNUSED(p);
+
+ gfloat zoomFactor = 1.0;
+ g_object_get(o, ZOOM_PROPERTY, &zoomFactor, NULL);
+
+ CameraBinFocus *zoom = reinterpret_cast<CameraBinFocus *>(d);
+
+ QMetaObject::invokeMethod(zoom, "currentDigitalZoomChanged",
+ Qt::QueuedConnection,
+ Q_ARG(qreal, zoomFactor));
+}
+
+void CameraBinFocus::updateMaxZoom(GObject *o, GParamSpec *p, gpointer d)
+{
+ Q_UNUSED(p);
+
+ gfloat zoomFactor = 1.0;
+ g_object_get(o, MAX_ZOOM_PROPERTY, &zoomFactor, NULL);
+
+ CameraBinFocus *zoom = reinterpret_cast<CameraBinFocus *>(d);
+
+ QMetaObject::invokeMethod(zoom, "maximumDigitalZoomChanged",
+ Qt::QueuedConnection,
+ Q_ARG(qreal, zoomFactor));
+}
+
QT_END_NAMESPACE