summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVaL Doroshchuk <valentyn.doroshchuk@qt.io>2019-01-29 10:45:13 +0100
committerVaL Doroshchuk <valentyn.doroshchuk@qt.io>2019-02-08 09:50:14 +0000
commit5fa4b2e448734da65ec24f2ce8234a4d3e4a832e (patch)
tree5314a008da9d1ddbf396c56f123731d8310f1c25
parent26830d435d942ce580dfe17209563c47eb3da722 (diff)
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 <andy.shaw@qt.io>
-rw-r--r--src/gsttools/qgstutils.cpp38
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinsession.cpp6
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::CameraInfo> 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::CameraInfo> QGstUtils::enumerateCameras(GstElementFactory *fa
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");
+ 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::CameraInfo> 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")) {