diff options
author | Piotr Srebrny <piotr.srebrny@qt.io> | 2022-10-12 16:47:46 +0200 |
---|---|---|
committer | Piotr Srebrny <piotr.srebrny@qt.io> | 2022-10-19 13:59:03 +0200 |
commit | 31430b1d1b2f89cc81a7301013e381cc3fab1a75 (patch) | |
tree | 8c32b979a5cf6060b3c799a32b72386a609f8845 /src | |
parent | 7fa57a2cede08d95c2d868c20052552a04ff6ea5 (diff) |
Don't use device.path gst property for device ID, instead generate it
The gst_device_get_properties does not work for libcamera; thus, we
cannot use the device.path property as the device ID. Instead, we
generate ID locally and bind it with GstDevice* in one object.
Pick-to: 6.4 6.3 6.2
Fixes: QTBUG-104226
Change-Id: I837b74175e48ee15d3fbb3ab26cf21d6a5fea794
Reviewed-by: Lars Knoll <lars@knoll.priv.no>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/multimedia/gstreamer/qgstreamervideodevices.cpp | 118 | ||||
-rw-r--r-- | src/plugins/multimedia/gstreamer/qgstreamervideodevices_p.h | 10 |
2 files changed, 62 insertions, 66 deletions
diff --git a/src/plugins/multimedia/gstreamer/qgstreamervideodevices.cpp b/src/plugins/multimedia/gstreamer/qgstreamervideodevices.cpp index 44cb5a0ae..d0c341fc9 100644 --- a/src/plugins/multimedia/gstreamer/qgstreamervideodevices.cpp +++ b/src/plugins/multimedia/gstreamer/qgstreamervideodevices.cpp @@ -65,52 +65,53 @@ QList<QCameraDevice> QGstreamerVideoDevices::videoDevices() const { QList<QCameraDevice> devices; - for (auto *d : std::as_const(m_videoSources)) { - QGstStructure properties = gst_device_get_properties(d); - if (!properties.isNull()) { - QCameraDevicePrivate *info = new QCameraDevicePrivate; - auto *desc = gst_device_get_display_name(d); - info->description = QString::fromUtf8(desc); - g_free(desc); - - info->id = properties["device.path"].toString(); + for (auto device : m_videoSources) { + QCameraDevicePrivate *info = new QCameraDevicePrivate; + auto *desc = gst_device_get_display_name(device.gstDevice); + info->description = QString::fromUtf8(desc); + g_free(desc); + info->id = device.id; + + if (QGstStructure properties = gst_device_get_properties(device.gstDevice); !properties.isNull()) { auto def = properties["is-default"].toBool(); info->isDefault = def && *def; - if (def) - devices.prepend(info->create()); - else - devices.append(info->create()); properties.free(); - QGstCaps caps = gst_device_get_caps(d); - if (!caps.isNull()) { - QList<QCameraFormat> formats; - QSet<QSize> photoResolutions; - - int size = caps.size(); - for (int i = 0; i < size; ++i) { - auto cap = caps.at(i); - - QSize resolution = cap.resolution(); - if (!resolution.isValid()) - continue; - - auto pixelFormat = cap.pixelFormat(); - auto frameRate = cap.frameRateRange(); - - auto *f = new QCameraFormatPrivate{ - QSharedData(), - pixelFormat, - resolution, - frameRate.min, - frameRate.max - }; - formats << f->create(); - photoResolutions.insert(resolution); - } - info->videoFormats = formats; - // ### sort resolutions? - info->photoResolutions = photoResolutions.values(); + } + + if (info->isDefault) + devices.prepend(info->create()); + else + devices.append(info->create()); + + QGstCaps caps = gst_device_get_caps(device.gstDevice); + if (!caps.isNull()) { + QList<QCameraFormat> formats; + QSet<QSize> photoResolutions; + + int size = caps.size(); + for (int i = 0; i < size; ++i) { + auto cap = caps.at(i); + + QSize resolution = cap.resolution(); + if (!resolution.isValid()) + continue; + + auto pixelFormat = cap.pixelFormat(); + auto frameRate = cap.frameRateRange(); + + auto *f = new QCameraFormatPrivate{ + QSharedData(), + pixelFormat, + resolution, + frameRate.min, + frameRate.max + }; + formats << f->create(); + photoResolutions.insert(resolution); } + info->videoFormats = formats; + // ### sort resolutions? + info->photoResolutions = photoResolutions.values(); } } return devices; @@ -119,11 +120,11 @@ QList<QCameraDevice> QGstreamerVideoDevices::videoDevices() const void QGstreamerVideoDevices::addDevice(GstDevice *device) { gchar *type = gst_device_get_device_class(device); -// qDebug() << "adding device:" << device << type << gst_device_get_display_name(device) << gst_structure_to_string(gst_device_get_properties(device)); gst_object_ref(device); if (!strcmp(type, "Video/Source") || !strcmp(type, "Source/Video")) { - m_videoSources.insert(device); + m_videoSources.push_back({device, QByteArray::number(m_idGenerator)}); videoInputsChanged(); + m_idGenerator++; } else { gst_object_unref(device); } @@ -133,33 +134,22 @@ void QGstreamerVideoDevices::addDevice(GstDevice *device) void QGstreamerVideoDevices::removeDevice(GstDevice *device) { // qDebug() << "removing device:" << device << gst_device_get_display_name(device); - if (m_videoSources.remove(device)) + auto it = std::find_if(m_videoSources.begin(), m_videoSources.end(), + [=](const QGstDevice &a) { return a.gstDevice == device; }); + + if (it != m_videoSources.end()) { + m_videoSources.erase(it); videoInputsChanged(); + } gst_object_unref(device); } -static GstDevice *getDevice(const QSet<GstDevice *> &devices, const char *key, const QByteArray &id) -{ - GstDevice *gstDevice = nullptr; - for (auto *d : devices) { - QGstStructure properties = gst_device_get_properties(d); - if (!properties.isNull()) { - auto *name = properties[key].toString(); - if (id == name) { - gstDevice = d; - } - } - properties.free(); - if (gstDevice) - break; - } - return gstDevice; -} - GstDevice *QGstreamerVideoDevices::videoDevice(const QByteArray &id) const { - return getDevice(m_videoSources, "device.path", id); + auto it = std::find_if(m_videoSources.begin(), m_videoSources.end(), + [=](const QGstDevice &a) { return a.id == id; }); + return it != m_videoSources.end() ? it->gstDevice : nullptr; } QT_END_NAMESPACE diff --git a/src/plugins/multimedia/gstreamer/qgstreamervideodevices_p.h b/src/plugins/multimedia/gstreamer/qgstreamervideodevices_p.h index c3e48bced..48181c6ed 100644 --- a/src/plugins/multimedia/gstreamer/qgstreamervideodevices_p.h +++ b/src/plugins/multimedia/gstreamer/qgstreamervideodevices_p.h @@ -17,8 +17,8 @@ #include <private/qplatformvideodevices_p.h> #include <gst/gst.h> -#include <qset.h> #include <qaudiodevice.h> +#include <vector> QT_BEGIN_NAMESPACE @@ -34,7 +34,13 @@ public: void removeDevice(GstDevice *); private: - QSet<GstDevice *> m_videoSources; + struct QGstDevice { + GstDevice *gstDevice = nullptr; + QByteArray id; + }; + + quint64 m_idGenerator = 0; + std::vector<QGstDevice> m_videoSources; }; QT_END_NAMESPACE |