diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-02-07 12:35:24 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-02-09 19:04:31 +0000 |
commit | ff25f700c87a308702f4dfdd8b2ab145a75ef5e4 (patch) | |
tree | 21f7e0606670d7bc7689029bf039b91ac1b8045a /src/multimedia/platform | |
parent | 42ff692daa02a22ebfb80be3205ebe8b36870b53 (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')
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; |