summaryrefslogtreecommitdiffstats
path: root/src/gsttools/qgstutils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gsttools/qgstutils.cpp')
-rw-r--r--src/gsttools/qgstutils.cpp92
1 files changed, 92 insertions, 0 deletions
diff --git a/src/gsttools/qgstutils.cpp b/src/gsttools/qgstutils.cpp
index 2cc7663b8..48781b0c7 100644
--- a/src/gsttools/qgstutils.cpp
+++ b/src/gsttools/qgstutils.cpp
@@ -686,6 +686,67 @@ QVector<QGstUtils::CameraInfo> QGstUtils::enumerateCameras(GstElementFactory *fa
camerasCacheAgeTimer.restart();
#endif // linux_v4l
+#if GST_CHECK_VERSION(1,4,0) && (defined(Q_OS_WIN) || defined(Q_OS_MACOS))
+ if (!devices.isEmpty())
+ return devices;
+
+#if defined(Q_OS_WIN)
+ const char *propName = "device-path";
+ auto deviceDesc = [](GValue *value) {
+ gchar *desc = g_value_dup_string(value);
+ const QString id = QLatin1String(desc);
+ g_free(desc);
+ return id;
+ };
+#elif defined(Q_OS_MACOS)
+ const char *propName = "device-index";
+ auto deviceDesc = [](GValue *value) {
+ return QString::number(g_value_get_int(value));
+ };
+#endif
+
+ 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);
+ GstElement *element = gst_device_create_element(dev, nullptr);
+ if (element) {
+ gchar *name = gst_device_get_display_name(dev);
+ const QString deviceName = QLatin1String(name);
+ g_free(name);
+ GParamSpec *prop = g_object_class_find_property(G_OBJECT_GET_CLASS(element), propName);
+ if (prop) {
+ GValue value = G_VALUE_INIT;
+ g_value_init(&value, prop->value_type);
+ g_object_get_property(G_OBJECT(element), prop->name, &value);
+ const QString deviceId = deviceDesc(&value);
+ g_value_unset(&value);
+
+ CameraInfo device = {
+ deviceId,
+ deviceName,
+ 0,
+ QCamera::UnspecifiedPosition,
+ QByteArray()
+ };
+
+ devices.append(device);
+ }
+
+ gst_object_unref(element);
+ }
+
+ gst_object_unref(dev);
+ devs = g_list_delete_link(devs, devs);
+ }
+ gst_object_unref(monitor);
+#endif // GST_CHECK_VERSION(1,4,0) && (defined(Q_OS_WIN) || defined(Q_OS_MACOS))
+
return devices;
}
@@ -1474,6 +1535,37 @@ QString QGstUtils::fileExtensionForMimeType(const QString &mimeType)
return extension;
}
+#if GST_CHECK_VERSION(0,10,30)
+QVariant QGstUtils::fromGStreamerOrientation(const QVariant &value)
+{
+ // Note gstreamer tokens either describe the counter clockwise rotation of the
+ // image or the clockwise transform to apply to correct the image. The orientation
+ // value returned is the clockwise rotation of the image.
+ const QString token = value.toString();
+ if (token == QStringLiteral("rotate-90"))
+ return 270;
+ if (token == QStringLiteral("rotate-180"))
+ return 180;
+ if (token == QStringLiteral("rotate-270"))
+ return 90;
+ return 0;
+}
+
+QVariant QGstUtils::toGStreamerOrientation(const QVariant &value)
+{
+ switch (value.toInt()) {
+ case 90:
+ return QStringLiteral("rotate-270");
+ case 180:
+ return QStringLiteral("rotate-180");
+ case 270:
+ return QStringLiteral("rotate-90");
+ default:
+ return QStringLiteral("rotate-0");
+ }
+}
+#endif
+
void qt_gst_object_ref_sink(gpointer object)
{
#if GST_CHECK_VERSION(0,10,24)