From 5fa4b2e448734da65ec24f2ce8234a4d3e4a832e Mon Sep 17 00:00:00 2001 From: VaL Doroshchuk Date: Tue, 29 Jan 2019 10:45:13 +0100 Subject: Gstreamer: Add support of avfvideosrc for camerabin Gst Device Provider now can be used for macOS also. Added support of avfvidesrc element to be used within camerabin. Task-number: QTBUG-72125 Change-Id: I69205649c6e75432534e240656d8cb4748ee10cc Reviewed-by: Andy Shaw --- src/gsttools/qgstutils.cpp | 38 +++++++++++++++------- .../gstreamer/camerabin/camerabinsession.cpp | 6 ++++ 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/gsttools/qgstutils.cpp b/src/gsttools/qgstutils.cpp index ac4428e04..bce453ac1 100644 --- a/src/gsttools/qgstutils.cpp +++ b/src/gsttools/qgstutils.cpp @@ -686,7 +686,25 @@ QVector QGstUtils::enumerateCameras(GstElementFactory *fa camerasCacheAgeTimer.restart(); #endif // linux_v4l -#if defined(Q_OS_WIN) && GST_CHECK_VERSION(1,4,0) +#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"); @@ -696,22 +714,22 @@ QVector QGstUtils::enumerateCameras(GstElementFactory *fa GList *devs = gst_device_monitor_get_devices(monitor); while (devs) { GstDevice *dev = reinterpret_cast(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"); + 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); - desc = g_value_dup_string(&value); + const QString deviceId = deviceDesc(&value); g_value_unset(&value); CameraInfo device = { - desc, - name, + deviceId, + deviceName, 0, QCamera::UnspecifiedPosition, QByteArray() @@ -723,13 +741,11 @@ QVector QGstUtils::enumerateCameras(GstElementFactory *fa 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) +#endif // GST_CHECK_VERSION(1,4,0) && (defined(Q_OS_WIN) || defined(Q_OS_MACOS)) return devices; } diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.cpp b/src/plugins/gstreamer/camerabin/camerabinsession.cpp index 77178c322..f064c7c92 100644 --- a/src/plugins/gstreamer/camerabin/camerabinsession.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinsession.cpp @@ -544,6 +544,9 @@ GstElement *CameraBinSession::buildCameraSource() if (!m_videoSrc) m_videoSrc = gst_element_factory_make("ksvideosrc", "camera_source"); + if (!m_videoSrc) + m_videoSrc = gst_element_factory_make("avfvideosrc", "camera_source"); + if (m_videoSrc) g_object_set(G_OBJECT(m_cameraSrc), "video-source", m_videoSrc, NULL); } @@ -554,6 +557,9 @@ GstElement *CameraBinSession::buildCameraSource() 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); + + if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSrc), "device-index")) + g_object_set(G_OBJECT(m_videoSrc), "device-index", m_inputDevice.toInt(), NULL); } } else if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_cameraSrc), "camera-device")) { if (m_inputDevice == QLatin1String("secondary")) { -- cgit v1.2.3