summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVal Doroshchuk <valentyn.doroshchuk@qt.io>2019-01-04 11:21:41 +0100
committerVaL Doroshchuk <valentyn.doroshchuk@qt.io>2019-01-17 13:52:13 +0000
commit5c91cfff5a8d7a5797c252beaf7493610a971d71 (patch)
tree4bc4f1b913d574ab57810104f3409307f2b79f02
parent94921e0fd8b9904e7472ae9546fa82e3eca55407 (diff)
Gstreamer: add support for ksvideosrc within camerabin
Task-number: QTBUG-72125 Change-Id: I12bc684a796c6abb6af3a51edca52011495f4ac9 Reviewed-by: Christian Stromme <christian.stromme@qt.io>
-rw-r--r--src/gsttools/qgstutils.cpp45
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinsession.cpp11
2 files changed, 54 insertions, 2 deletions
diff --git a/src/gsttools/qgstutils.cpp b/src/gsttools/qgstutils.cpp
index 6960ff8f4..f38ade75f 100644
--- a/src/gsttools/qgstutils.cpp
+++ b/src/gsttools/qgstutils.cpp
@@ -685,6 +685,51 @@ QVector<QGstUtils::CameraInfo> QGstUtils::enumerateCameras(GstElementFactory *fa
camerasCacheAgeTimer.restart();
#endif // linux_v4l
+#if defined(Q_OS_WIN) && GST_CHECK_VERSION(1,4,0)
+ QGstUtils::initializeGst();
+ GstDeviceMonitor *monitor = gst_device_monitor_new();
+ auto caps = gst_caps_new_empty_simple("video/x-raw");
+ gst_device_monitor_add_filter(monitor, "Video/Source", caps);
+ gst_caps_unref(caps);
+
+ GList *devs = gst_device_monitor_get_devices(monitor);
+ while (devs) {
+ GstDevice *dev = reinterpret_cast<GstDevice*>(devs->data);
+ gchar *name = gst_device_get_display_name(dev);
+ gchar *desc = nullptr;
+
+ GstElement *element = gst_device_create_element(dev, nullptr);
+ if (element) {
+ GParamSpec *prop = g_object_class_find_property(G_OBJECT_GET_CLASS(element), "device-path");
+ if (prop) {
+ GValue value = G_VALUE_INIT;
+ g_value_init(&value, prop->value_type);
+ g_object_get_property(G_OBJECT(element), prop->name, &value);
+ desc = g_value_dup_string(&value);
+ g_value_unset(&value);
+
+ CameraInfo device = {
+ desc,
+ name,
+ 0,
+ QCamera::UnspecifiedPosition,
+ QByteArray()
+ };
+
+ devices.append(device);
+ }
+
+ gst_object_unref(element);
+ }
+
+ g_free(desc);
+ g_free(name);
+ gst_object_unref(dev);
+ devs = g_list_delete_link(devs, devs);
+ }
+ gst_object_unref(monitor);
+#endif // #if defined(Q_OS_WIN) && GST_CHECK_VERSION(1,4,0)
+
return devices;
}
diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.cpp b/src/plugins/gstreamer/camerabin/camerabinsession.cpp
index ebb797189..f4559de81 100644
--- a/src/plugins/gstreamer/camerabin/camerabinsession.cpp
+++ b/src/plugins/gstreamer/camerabin/camerabinsession.cpp
@@ -541,13 +541,20 @@ GstElement *CameraBinSession::buildCameraSource()
if (!m_videoSrc)
m_videoSrc = gst_element_factory_make("v4l2src", "camera_source");
+ if (!m_videoSrc)
+ m_videoSrc = gst_element_factory_make("ksvideosrc", "camera_source");
+
if (m_videoSrc)
g_object_set(G_OBJECT(m_cameraSrc), "video-source", m_videoSrc, NULL);
}
- if (m_videoSrc)
- g_object_set(G_OBJECT(m_videoSrc), "device", m_inputDevice.toUtf8().constData(), NULL);
+ if (m_videoSrc) {
+ if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSrc), "device"))
+ g_object_set(G_OBJECT(m_videoSrc), "device", m_inputDevice.toUtf8().constData(), NULL);
+ if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSrc), "device-path"))
+ g_object_set(G_OBJECT(m_videoSrc), "device-path", m_inputDevice.toUtf8().constData(), NULL);
+ }
} else if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_cameraSrc), "camera-device")) {
if (m_inputDevice == QLatin1String("secondary")) {
g_object_set(G_OBJECT(m_cameraSrc), "camera-device", 1, NULL);