summaryrefslogtreecommitdiffstats
path: root/src/multimedia/platform
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-02-07 12:35:24 +0100
committerLars Knoll <lars.knoll@qt.io>2021-02-09 19:04:31 +0000
commitff25f700c87a308702f4dfdd8b2ab145a75ef5e4 (patch)
tree21f7e0606670d7bc7689029bf039b91ac1b8045a /src/multimedia/platform
parent42ff692daa02a22ebfb80be3205ebe8b36870b53 (diff)
Remove direct dependency on v4l2
Using GstDevice, there is no need to directly depend on Video4Linux, at least not for device discovery. We'll probably continue to have a dependency on it for setting properties on the video device. Change-Id: Idcea9f257cf5a6fa6e54819fcdc278c7c94bfa03 Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Doris Verria <doris.verria@qt.io>
Diffstat (limited to 'src/multimedia/platform')
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstutils_p.h2
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/mediacapture.pri14
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamercameracontrol.cpp1
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice.cpp4
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice_p.h4
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession.cpp2
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession_p.h8
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoinput.cpp (renamed from src/multimedia/platform/gstreamer/mediacapture/qgstreamerv4l2input.cpp)22
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoinput_p.h (renamed from src/multimedia/platform/gstreamer/mediacapture/qgstreamerv4l2input_p.h)16
-rw-r--r--src/multimedia/platform/gstreamer/qgstreamerdevicemanager.cpp44
-rw-r--r--src/multimedia/platform/gstreamer/qgstreamerdevicemanager_p.h2
11 files changed, 51 insertions, 68 deletions
diff --git a/src/multimedia/platform/gstreamer/common/qgstutils_p.h b/src/multimedia/platform/gstreamer/common/qgstutils_p.h
index 93c60dea1..8dee7b704 100644
--- a/src/multimedia/platform/gstreamer/common/qgstutils_p.h
+++ b/src/multimedia/platform/gstreamer/common/qgstutils_p.h
@@ -173,6 +173,8 @@ public:
Q_MULTIMEDIA_EXPORT QVideoFrame::PixelFormat pixelFormat() const;
Q_MULTIMEDIA_EXPORT QSize pixelAspectRatio() const;
Q_MULTIMEDIA_EXPORT QGRange<float> frameRateRange() const;
+
+ QByteArray toString() const { return gst_structure_to_string(structure); }
};
class QGstCaps {
diff --git a/src/multimedia/platform/gstreamer/mediacapture/mediacapture.pri b/src/multimedia/platform/gstreamer/mediacapture/mediacapture.pri
index cf91d7360..9dfea5ee6 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/mediacapture.pri
+++ b/src/multimedia/platform/gstreamer/mediacapture/mediacapture.pri
@@ -6,7 +6,8 @@ HEADERS += $$PWD/qgstreamercaptureservice_p.h \
$$PWD/qgstreamercameracontrol_p.h \
$$PWD/qgstreamercapturemetadatacontrol_p.h \
$$PWD/qgstreamerimagecapturecontrol_p.h \
- $$PWD/qgstreamerimageencode_p.h
+ $$PWD/qgstreamerimageencode_p.h \
+ $$PWD/qgstreamervideoinput_p.h
SOURCES += $$PWD/qgstreamercaptureservice.cpp \
$$PWD/qgstreamercapturesession.cpp \
@@ -14,16 +15,9 @@ SOURCES += $$PWD/qgstreamercaptureservice.cpp \
$$PWD/qgstreamercameracontrol.cpp \
$$PWD/qgstreamercapturemetadatacontrol.cpp \
$$PWD/qgstreamerimagecapturecontrol.cpp \
- $$PWD/qgstreamerimageencode.cpp
+ $$PWD/qgstreamerimageencode.cpp \
+ $$PWD/qgstreamervideoinput.cpp
# Camera usage with gstreamer needs to have
CONFIG += use_gstreamer_camera
-use_gstreamer_camera:qtConfig(linux_v4l) {
- DEFINES += USE_GSTREAMER_CAMERA
-
- HEADERS += \
- $$PWD/qgstreamerv4l2input_p.h
- SOURCES += \
- $$PWD/qgstreamerv4l2input.cpp
-}
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercameracontrol.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercameracontrol.cpp
index ef3e46f3f..32b1fd460 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercameracontrol.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercameracontrol.cpp
@@ -39,6 +39,7 @@
#include "qgstreamercameracontrol_p.h"
#include "qgstreamerimageencode_p.h"
+#include "qgstreamervideoinput_p.h"
#include <qcamerainfo.h>
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice.cpp
index 7679c4647..3271a2307 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice.cpp
@@ -46,7 +46,7 @@
#include "qgstreamercapturemetadatacontrol_p.h"
#if defined(USE_GSTREAMER_CAMERA)
-#include "qgstreamerv4l2input_p.h"
+#include "qgstreamervideoinput_p.h"
#endif
#include "qgstreamerimagecapturecontrol_p.h"
@@ -66,7 +66,7 @@ QGstreamerCaptureService::QGstreamerCaptureService(QMediaRecorder::CaptureMode m
else {
m_captureSession = new QGstreamerCaptureSession(QGstreamerCaptureSession::AudioAndVideo, this);
m_cameraControl = new QGstreamerCameraControl(m_captureSession);
- m_videoInput = new QGstreamerV4L2Input;
+ m_videoInput = new QGstreamerVideoInput;
m_captureSession->setVideoInput(m_videoInput);
m_videoRenderer = new QGstreamerVideoRenderer(this);
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice_p.h
index 598f805ef..adfb97a9b 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice_p.h
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercaptureservice_p.h
@@ -67,7 +67,7 @@ class QGstreamerVideoWindow;
class QGstreamerElementFactory;
class QGstreamerCaptureMetaDataControl;
class QGstreamerImageCaptureControl;
-class QGstreamerV4L2Input;
+class QGstreamerVideoInput;
class QGstreamerCaptureService : public QMediaPlatformCaptureInterface
{
@@ -86,7 +86,7 @@ private:
QGstreamerCaptureSession *m_captureSession = nullptr;
QGstreamerCameraControl *m_cameraControl = nullptr;
#if defined(USE_GSTREAMER_CAMERA)
- QGstreamerV4L2Input *m_videoInput = nullptr;
+ QGstreamerVideoInput *m_videoInput = nullptr;
#endif
QGstreamerCaptureMetaDataControl *m_metaDataControl = nullptr;
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession.cpp
index 784fa13b2..871bf0f81 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession.cpp
@@ -40,6 +40,7 @@
#include "qgstreamercapturesession_p.h"
#include "qgstreamerrecordercontrol_p.h"
#include "qgstreamerimageencode_p.h"
+#include "qgstreamervideoinput_p.h"
#include <qmediarecorder.h>
#include <qmediadevicemanager.h>
#include <private/qgstreamervideorendererinterface_p.h>
@@ -283,7 +284,6 @@ GstElement *QGstreamerCaptureSession::buildVideoSrc()
videoSrc = m_videoInputFactory->buildElement();
} else {
videoSrc = gst_element_factory_make("videotestsrc", "video_test_src");
- //videoSrc = gst_element_factory_make("v4l2src", "video_test_src");
}
return videoSrc;
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession_p.h
index 09c650388..043e9dee9 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession_p.h
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamercapturesession_p.h
@@ -72,6 +72,7 @@ class QGstreamerImageEncode;
class QGstreamerRecorderControl;
class QGstreamerVideoRendererInterface;
class QCameraInfo;
+class QGstreamerVideoInput;
class QGstreamerElementFactory
{
@@ -80,13 +81,6 @@ public:
virtual void prepareWinId() {}
};
-class QGstreamerVideoInput : public QGstreamerElementFactory
-{
-public:
- virtual QCameraInfo device() const = 0;
- virtual void setDevice(const QCameraInfo &device) = 0;
-};
-
class QGstreamerCaptureSession
: public QObject
, public QGstreamerBusMessageFilter
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerv4l2input.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoinput.cpp
index 1a0779ba5..fedca45fc 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerv4l2input.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoinput.cpp
@@ -37,34 +37,32 @@
**
****************************************************************************/
-#include "qgstreamerv4l2input_p.h"
+#include "qgstreamervideoinput_p.h"
#include <QtCore/qdebug.h>
#include <QtCore/qfile.h>
-#include <private/qcore_unix_p.h>
-#include <linux/videodev2.h>
+#include <private/qgstreamerintegration_p.h>
+#include <private/qgstreamerdevicemanager_p.h>
#include <algorithm>
-QGstreamerV4L2Input::QGstreamerV4L2Input()
+QGstreamerVideoInput::QGstreamerVideoInput()
{
}
-QGstreamerV4L2Input::~QGstreamerV4L2Input()
+QGstreamerVideoInput::~QGstreamerVideoInput()
{
}
-GstElement *QGstreamerV4L2Input::buildElement()
+GstElement *QGstreamerVideoInput::buildElement()
{
- GstElement *camera = gst_element_factory_make("v4l2src", "camera_source");
- if (camera && !m_cameraInfo.isNull())
- g_object_set(G_OBJECT(camera), "device", m_cameraInfo.id().constData(), NULL);
-
- return camera;
+ auto *deviceManager = static_cast<QGstreamerDeviceManager *>(QGstreamerIntegration::instance()->deviceManager());
+ GstDevice *videoDevice = deviceManager->videoDevice(m_cameraInfo.id());
+ return gst_device_create_element(videoDevice, "camerasrc");
}
-void QGstreamerV4L2Input::setDevice(const QCameraInfo &newDevice)
+void QGstreamerVideoInput::setDevice(const QCameraInfo &newDevice)
{
if (m_cameraInfo != newDevice)
m_cameraInfo = newDevice;
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerv4l2input_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoinput_p.h
index aafe4e71d..9f0313629 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamerv4l2input_p.h
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamervideoinput_p.h
@@ -38,8 +38,8 @@
****************************************************************************/
-#ifndef QGSTREAMERV4L2INPUT_H
-#define QGSTREAMERV4L2INPUT_H
+#ifndef QGSTREAMERVIDEOINPUT_H
+#define QGSTREAMERVIDEOINPUT_H
//
// W A R N I N G
@@ -62,16 +62,16 @@
QT_BEGIN_NAMESPACE
-class QGstreamerV4L2Input : public QGstreamerVideoInput
+class QGstreamerVideoInput : public QGstreamerElementFactory
{
public:
- QGstreamerV4L2Input();
- virtual ~QGstreamerV4L2Input();
+ QGstreamerVideoInput();
+ virtual ~QGstreamerVideoInput();
GstElement *buildElement() override;
- QCameraInfo device() const override { return m_cameraInfo; }
- void setDevice(const QCameraInfo &device) override;
+ QCameraInfo device() const { return m_cameraInfo; }
+ void setDevice(const QCameraInfo &device);
private:
QCameraInfo m_cameraInfo;
@@ -81,4 +81,4 @@ private:
QT_END_NAMESPACE
-#endif // QGSTREAMERV4L2INPUT_H
+#endif // QGSTREAMERVIDEOINPUT_H
diff --git a/src/multimedia/platform/gstreamer/qgstreamerdevicemanager.cpp b/src/multimedia/platform/gstreamer/qgstreamerdevicemanager.cpp
index 5250c6e69..b81ef86a3 100644
--- a/src/multimedia/platform/gstreamer/qgstreamerdevicemanager.cpp
+++ b/src/multimedia/platform/gstreamer/qgstreamerdevicemanager.cpp
@@ -140,6 +140,7 @@ QList<QCameraInfo> QGstreamerDeviceManager::videoInputs() const
for (auto *d : qAsConst(m_videoSources)) {
QGstStructure properties = gst_device_get_properties(d);
+ qDebug() << properties.toString();
if (!properties.isNull()) {
QCameraInfoPrivate *info = new QCameraInfoPrivate;
auto *desc = gst_device_get_display_name(d);
@@ -147,7 +148,6 @@ QList<QCameraInfo> QGstreamerDeviceManager::videoInputs() const
g_free(desc);
info->id = properties["device.path"].toString();
-// info->driver = properties["v4l2.device.driver"].getString();
auto def = properties["is-default"].toBool();
info->isDefault = *def;
if (def)
@@ -242,41 +242,35 @@ void QGstreamerDeviceManager::removeDevice(GstDevice *device)
gst_object_unref(device);
}
-QByteArray QGstreamerDeviceManager::cameraDriver(const QByteArray &cameraId) const
+static GstDevice *getDevice(const QSet<GstDevice *> &devices, const char *key, const QByteArray &id)
{
- for (auto *d : qAsConst(m_videoSources)) {
- auto *properties = gst_device_get_properties(d);
- if (properties) {
- auto *name = gst_structure_get_string(properties, "device.path");
- if (cameraId == name) {
- QByteArray driver = gst_structure_get_string(properties, "v4l2.device.driver");
- gst_structure_free(properties);
- return driver;
- }
- gst_structure_free(properties);
- }
- }
- return QByteArray();
-}
-
-GstDevice *QGstreamerDeviceManager::audioDevice(const QByteArray &id, QAudio::Mode mode) const
-{
- const auto devices = (mode == QAudio::AudioOutput) ? m_audioSinks : m_audioSources;
-
GstDevice *gstDevice = nullptr;
for (auto *d : devices) {
- auto *properties = gst_device_get_properties(d);
- if (properties) {
- auto *name = gst_structure_get_string(properties, "sysfs.path");
+ QGstStructure properties = gst_device_get_properties(d);
+ if (!properties.isNull()) {
+ auto *name = properties[key].toString();
if (id == name) {
gstDevice = d;
}
}
- gst_structure_free(properties);
+ properties.free();
if (gstDevice)
break;
}
return gstDevice;
+
+}
+
+GstDevice *QGstreamerDeviceManager::audioDevice(const QByteArray &id, QAudio::Mode mode) const
+{
+ const auto devices = (mode == QAudio::AudioOutput) ? m_audioSinks : m_audioSources;
+
+ return getDevice(devices, "sysfs.path", id);
+}
+
+GstDevice *QGstreamerDeviceManager::videoDevice(const QByteArray &id) const
+{
+ return getDevice(m_videoSources, "device.path", id);
}
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/gstreamer/qgstreamerdevicemanager_p.h b/src/multimedia/platform/gstreamer/qgstreamerdevicemanager_p.h
index 607056851..ab639c586 100644
--- a/src/multimedia/platform/gstreamer/qgstreamerdevicemanager_p.h
+++ b/src/multimedia/platform/gstreamer/qgstreamerdevicemanager_p.h
@@ -72,8 +72,8 @@ public:
void addDevice(GstDevice *);
void removeDevice(GstDevice *);
- QByteArray cameraDriver(const QByteArray &cameraId) const;
GstDevice *audioDevice(const QByteArray &id, QAudio::Mode mode) const;
+ GstDevice *videoDevice(const QByteArray &id) const;
private:
QSet<GstDevice *> m_videoSources;