diff options
Diffstat (limited to 'src/gsttools/qgstutils.cpp')
-rw-r--r-- | src/gsttools/qgstutils.cpp | 92 |
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) |