Commit 5fa4b2e4 authored by VaL Doroshchuk's avatar VaL Doroshchuk
Browse files

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: default avatarAndy Shaw <andy.shaw@qt.io>
Showing with 33 additions and 11 deletions
...@@ -686,7 +686,25 @@ QVector<QGstUtils::CameraInfo> QGstUtils::enumerateCameras(GstElementFactory *fa ...@@ -686,7 +686,25 @@ QVector<QGstUtils::CameraInfo> QGstUtils::enumerateCameras(GstElementFactory *fa
camerasCacheAgeTimer.restart(); camerasCacheAgeTimer.restart();
#endif // linux_v4l #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(); QGstUtils::initializeGst();
GstDeviceMonitor *monitor = gst_device_monitor_new(); GstDeviceMonitor *monitor = gst_device_monitor_new();
auto caps = gst_caps_new_empty_simple("video/x-raw"); auto caps = gst_caps_new_empty_simple("video/x-raw");
...@@ -696,22 +714,22 @@ QVector<QGstUtils::CameraInfo> QGstUtils::enumerateCameras(GstElementFactory *fa ...@@ -696,22 +714,22 @@ QVector<QGstUtils::CameraInfo> QGstUtils::enumerateCameras(GstElementFactory *fa
GList *devs = gst_device_monitor_get_devices(monitor); GList *devs = gst_device_monitor_get_devices(monitor);
while (devs) { while (devs) {
GstDevice *dev = reinterpret_cast<GstDevice*>(devs->data); 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); GstElement *element = gst_device_create_element(dev, nullptr);
if (element) { 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) { if (prop) {
GValue value = G_VALUE_INIT; GValue value = G_VALUE_INIT;
g_value_init(&value, prop->value_type); g_value_init(&value, prop->value_type);
g_object_get_property(G_OBJECT(element), prop->name, &value); 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); g_value_unset(&value);
CameraInfo device = { CameraInfo device = {
desc, deviceId,
name, deviceName,
0, 0,
QCamera::UnspecifiedPosition, QCamera::UnspecifiedPosition,
QByteArray() QByteArray()
...@@ -723,13 +741,11 @@ QVector<QGstUtils::CameraInfo> QGstUtils::enumerateCameras(GstElementFactory *fa ...@@ -723,13 +741,11 @@ QVector<QGstUtils::CameraInfo> QGstUtils::enumerateCameras(GstElementFactory *fa
gst_object_unref(element); gst_object_unref(element);
} }
g_free(desc);
g_free(name);
gst_object_unref(dev); gst_object_unref(dev);
devs = g_list_delete_link(devs, devs); devs = g_list_delete_link(devs, devs);
} }
gst_object_unref(monitor); 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; return devices;
} }
......
...@@ -544,6 +544,9 @@ GstElement *CameraBinSession::buildCameraSource() ...@@ -544,6 +544,9 @@ GstElement *CameraBinSession::buildCameraSource()
if (!m_videoSrc) if (!m_videoSrc)
m_videoSrc = gst_element_factory_make("ksvideosrc", "camera_source"); m_videoSrc = gst_element_factory_make("ksvideosrc", "camera_source");
if (!m_videoSrc)
m_videoSrc = gst_element_factory_make("avfvideosrc", "camera_source");
if (m_videoSrc) if (m_videoSrc)
g_object_set(G_OBJECT(m_cameraSrc), "video-source", m_videoSrc, NULL); g_object_set(G_OBJECT(m_cameraSrc), "video-source", m_videoSrc, NULL);
} }
...@@ -554,6 +557,9 @@ GstElement *CameraBinSession::buildCameraSource() ...@@ -554,6 +557,9 @@ GstElement *CameraBinSession::buildCameraSource()
if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSrc), "device-path")) 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); 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")) { } else if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_cameraSrc), "camera-device")) {
if (m_inputDevice == QLatin1String("secondary")) { if (m_inputDevice == QLatin1String("secondary")) {
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment