summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPiotr Srebrny <piotr.srebrny@qt.io>2022-10-12 16:47:46 +0200
committerPiotr Srebrny <piotr.srebrny@qt.io>2022-10-19 13:59:03 +0200
commit31430b1d1b2f89cc81a7301013e381cc3fab1a75 (patch)
tree8c32b979a5cf6060b3c799a32b72386a609f8845 /src
parent7fa57a2cede08d95c2d868c20052552a04ff6ea5 (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.cpp118
-rw-r--r--src/plugins/multimedia/gstreamer/qgstreamervideodevices_p.h10
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