diff options
Diffstat (limited to 'src/plugins/multimedia/gstreamer/mediacapture/qgstreamercamera_p.h')
-rw-r--r-- | src/plugins/multimedia/gstreamer/mediacapture/qgstreamercamera_p.h | 114 |
1 files changed, 63 insertions, 51 deletions
diff --git a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamercamera_p.h b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamercamera_p.h index ac57eb5ef..3193a9090 100644 --- a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamercamera_p.h +++ b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamercamera_p.h @@ -1,42 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QGSTREAMERCAMERACONTROL_H #define QGSTREAMERCAMERACONTROL_H @@ -52,18 +15,28 @@ // We mean it. // -#include <QHash> #include <private/qplatformcamera_p.h> -#include "qgstreamermediacapture_p.h" -#include <qgst_p.h> +#include <private/qmultimediautils_p.h> + +#include <mediacapture/qgstreamermediacapture_p.h> +#include <common/qgst_p.h> +#include <common/qgstpipeline_p.h> QT_BEGIN_NAMESPACE -class QGstreamerCamera : public QPlatformCamera +class QGstreamerCameraBase : public QPlatformCamera { - Q_OBJECT public: - QGstreamerCamera(QCamera *camera); + using QPlatformCamera::QPlatformCamera; + + virtual QGstElement gstElement() const = 0; +}; + +class QGstreamerCamera : public QGstreamerCameraBase +{ +public: + static QMaybe<QPlatformCamera *> create(QCamera *camera); + virtual ~QGstreamerCamera(); bool isActive() const override; @@ -72,7 +45,7 @@ public: void setCamera(const QCameraDevice &camera) override; bool setCameraFormat(const QCameraFormat &format) override; - QGstElement gstElement() const { return gstCameraBin.element(); } + QGstElement gstElement() const override { return gstCameraBin; } #if QT_CONFIG(gstreamer_photography) GstPhotography *photography() const; #endif @@ -96,12 +69,13 @@ public: void setWhiteBalanceMode(QCamera::WhiteBalanceMode mode) override; void setColorTemperature(int temperature) override; - QString v4l2Device() const { return m_v4l2Device; } - bool isV4L2Camera() const { return !m_v4l2Device.isEmpty(); } - private: + QGstreamerCamera(QCamera *camera); + void updateCameraProperties(); + #if QT_CONFIG(linux_v4l) + bool isV4L2Camera() const; void initV4L2Controls(); int setV4L2ColorTemperature(int temperature); bool setV4L2Parameter(quint32 id, qint32 value); @@ -117,7 +91,29 @@ private: qint32 v4l2MaxExposure = 0; qint32 v4l2MinExposureAdjustment = 0; qint32 v4l2MaxExposureAdjustment = 0; - int v4l2FileDescriptor = -1; + + template <typename Functor> + auto withV4L2DeviceFileDescriptor(Functor &&f) const + { + using ReturnType = std::invoke_result_t<Functor, int>; + Q_ASSERT(isV4L2Camera()); + + if (int gstreamerDeviceFd = gstCamera.getInt("device-fd"); gstreamerDeviceFd != -1) + return f(gstreamerDeviceFd); + + auto v4l2FileDescriptor = QFileDescriptorHandle{ + qt_safe_open(m_v4l2DevicePath.toLocal8Bit().constData(), O_RDONLY), + }; + if (!v4l2FileDescriptor) { + qWarning() << "Unable to open the camera" << m_v4l2DevicePath + << "for read to query the parameter info:" << qt_error_string(errno); + if constexpr (std::is_void_v<ReturnType>) + return; + else + return ReturnType{}; + } + return f(v4l2FileDescriptor.get()); + } #endif QCameraDevice m_cameraDevice; @@ -130,7 +126,23 @@ private: QGstElement gstVideoScale; bool m_active = false; - QString m_v4l2Device; + QString m_v4l2DevicePath; +}; + +class QGstreamerCustomCamera : public QGstreamerCameraBase +{ +public: + explicit QGstreamerCustomCamera(QCamera *); + + QGstElement gstElement() const override { return gstCamera; } + void setCamera(const QCameraDevice &) override; + + bool isActive() const override; + void setActive(bool) override; + +private: + QGstBin gstCamera; + bool m_active{}; }; QT_END_NAMESPACE |