diff options
author | Tim Blechmann <tim@klingt.org> | 2024-03-29 08:09:49 +0800 |
---|---|---|
committer | Tim Blechmann <tim@klingt.org> | 2024-04-27 10:56:48 +0800 |
commit | d27311be4a07051e0fd17b0535ea378c29e464e8 (patch) | |
tree | 614098781f518a5958a3ce595fd4a2f061d44095 /src | |
parent | a17f9937ef8efad084e783f146c4969be4819eb1 (diff) |
GStreamer: add private API to access pipeline for capture session
Allows users to mess with the underlying gstreamer pipeline of the
`QMediaCaptureSession` like they can with the `QMediaPlayer`
[ChangeLog] QMediaCaptureSession: GStreamer - private interface to
access underlying GstPipeline of QMediaCaptureSession
Pick-to: 6.5 6.6 6.7
Task-number: QTBUG-123830
Change-Id: I5b17240c9951ee8e05dd6cb4a78b203a56794922
Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io>
Diffstat (limited to 'src')
8 files changed, 88 insertions, 37 deletions
diff --git a/src/multimedia/CMakeLists.txt b/src/multimedia/CMakeLists.txt index 183ef7343..8c58545b5 100644 --- a/src/multimedia/CMakeLists.txt +++ b/src/multimedia/CMakeLists.txt @@ -67,7 +67,7 @@ qt_internal_add_module(Multimedia qmaybe_p.h qtmultimediaglobal.h qtmultimediaglobal_p.h qerrorinfo_p.h - recording/qmediacapturesession.cpp recording/qmediacapturesession.h + recording/qmediacapturesession.cpp recording/qmediacapturesession.h recording/qmediacapturesession_p.h recording/qmediarecorder.cpp recording/qmediarecorder.h recording/qmediarecorder_p.h recording/qscreencapture.cpp recording/qscreencapture.h recording/qwindowcapture.cpp recording/qwindowcapture.h diff --git a/src/multimedia/platform/qplatformmediacapture.cpp b/src/multimedia/platform/qplatformmediacapture.cpp index 826228764..c8aded824 100644 --- a/src/multimedia/platform/qplatformmediacapture.cpp +++ b/src/multimedia/platform/qplatformmediacapture.cpp @@ -1,12 +1,14 @@ // Copyright (C) 2021 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 -#include <qtmultimediaglobal_p.h> -#include "qplatformmediacapture_p.h" -#include "qaudiodevice.h" -#include "qaudioinput.h" -#include "qplatformcamera_p.h" -#include "qplatformsurfacecapture_p.h" +#include <QtMultimedia/qaudiodevice.h> +#include <QtMultimedia/qaudioinput.h> +#include <QtMultimedia/qmediacapturesession.h> +#include <QtMultimedia/private/qplatformcamera_p.h> +#include <QtMultimedia/private/qplatformmediacapture_p.h> +#include <QtMultimedia/private/qmediacapturesession_p.h> +#include <QtMultimedia/private/qplatformsurfacecapture_p.h> +#include <QtMultimedia/private/qtmultimediaglobal_p.h> QT_BEGIN_NAMESPACE @@ -28,6 +30,15 @@ std::vector<QPlatformVideoSource *> QPlatformMediaCaptureSession::activeVideoSou return result; } +void *QPlatformMediaCaptureSession::nativePipeline(QMediaCaptureSession *session) +{ + auto sessionPrivate = session->d_func(); + if (!sessionPrivate || !sessionPrivate->captureSession) + return nullptr; + + return sessionPrivate->captureSession->nativePipeline(); +} + QT_END_NAMESPACE #include "moc_qplatformmediacapture_p.cpp" diff --git a/src/multimedia/platform/qplatformmediacapture_p.h b/src/multimedia/platform/qplatformmediacapture_p.h index 814fa160c..981cf199b 100644 --- a/src/multimedia/platform/qplatformmediacapture_p.h +++ b/src/multimedia/platform/qplatformmediacapture_p.h @@ -64,6 +64,11 @@ public: // TBD: implement ordering of the sources basing on the order of adding std::vector<QPlatformVideoSource *> activeVideoSources(); + virtual void *nativePipeline() { return nullptr; } + + // private API, the purpose is getting GstPipeline + static void *nativePipeline(QMediaCaptureSession *); + Q_SIGNALS: void cameraChanged(); void screenCaptureChanged(); diff --git a/src/multimedia/recording/qmediacapturesession.cpp b/src/multimedia/recording/qmediacapturesession.cpp index 0ff804bf4..f175cd98e 100644 --- a/src/multimedia/recording/qmediacapturesession.cpp +++ b/src/multimedia/recording/qmediacapturesession.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "qmediacapturesession.h" +#include "qmediacapturesession_p.h" #include "qaudiodevice.h" #include "qcamera.h" #include "qmediarecorder.h" @@ -10,8 +11,6 @@ #include "qscreencapture.h" #include "qwindowcapture.h" -#include <qpointer.h> - #include "qplatformmediaintegration_p.h" #include "qplatformmediacapture_p.h" #include "qaudioinput.h" @@ -19,35 +18,19 @@ QT_BEGIN_NAMESPACE -class QMediaCaptureSessionPrivate +void QMediaCaptureSessionPrivate::setVideoSink(QVideoSink *sink) { -public: - QMediaCaptureSession *q = nullptr; - QPlatformMediaCaptureSession *captureSession = nullptr; - QAudioInput *audioInput = nullptr; - QAudioOutput *audioOutput = nullptr; - QPointer<QCamera> camera; - QPointer<QScreenCapture> screenCapture; - QPointer<QWindowCapture> windowCapture; - QPointer<QImageCapture> imageCapture; - QPointer<QMediaRecorder> recorder; - QPointer<QVideoSink> videoSink; - QPointer<QObject> videoOutput; - - void setVideoSink(QVideoSink *sink) - { - if (sink == videoSink) - return; - if (videoSink) - videoSink->setSource(nullptr); - videoSink = sink; - if (sink) - sink->setSource(q); - if (captureSession) - captureSession->setVideoPreview(sink); - emit q->videoOutputChanged(); - } -}; + if (sink == videoSink) + return; + if (videoSink) + videoSink->setSource(nullptr); + videoSink = sink; + if (sink) + sink->setSource(q); + if (captureSession) + captureSession->setVideoPreview(sink); + emit q->videoOutputChanged(); +} /*! \class QMediaCaptureSession diff --git a/src/multimedia/recording/qmediacapturesession.h b/src/multimedia/recording/qmediacapturesession.h index c613c3615..1333af7eb 100644 --- a/src/multimedia/recording/qmediacapturesession.h +++ b/src/multimedia/recording/qmediacapturesession.h @@ -78,6 +78,8 @@ Q_SIGNALS: void audioOutputChanged(); private: + friend class QPlatformMediaCaptureSession; + QMediaCaptureSessionPrivate *d_ptr; Q_DISABLE_COPY(QMediaCaptureSession) Q_DECLARE_PRIVATE(QMediaCaptureSession) diff --git a/src/multimedia/recording/qmediacapturesession_p.h b/src/multimedia/recording/qmediacapturesession_p.h new file mode 100644 index 000000000..8702c8d2b --- /dev/null +++ b/src/multimedia/recording/qmediacapturesession_p.h @@ -0,0 +1,44 @@ +// Copyright (C) 2024 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 QMEDIACAPTURESESSION_P_H +#define QMEDIACAPTURESESSION_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtMultimedia/qmediacapturesession.h> + +#include <QtCore/qpointer.h> + +QT_BEGIN_NAMESPACE + +class QMediaCaptureSessionPrivate +{ +public: + QMediaCaptureSession *q = nullptr; + QPlatformMediaCaptureSession *captureSession = nullptr; + QAudioInput *audioInput = nullptr; + QAudioOutput *audioOutput = nullptr; + QPointer<QCamera> camera; + QPointer<QScreenCapture> screenCapture; + QPointer<QWindowCapture> windowCapture; + QPointer<QImageCapture> imageCapture; + QPointer<QMediaRecorder> recorder; + QPointer<QVideoSink> videoSink; + QPointer<QObject> videoOutput; + + void setVideoSink(QVideoSink *sink); +}; + +QT_END_NAMESPACE + +#endif // QMEDIACAPTURESESSION_P_H diff --git a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture.cpp b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture.cpp index 0574a1f1a..720ff5603 100644 --- a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture.cpp +++ b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture.cpp @@ -322,6 +322,10 @@ QGstreamerVideoSink *QGstreamerMediaCapture::gstreamerVideoSink() const return gstVideoOutput ? gstVideoOutput->gstreamerVideoSink() : nullptr; } +void *QGstreamerMediaCapture::nativePipeline() +{ + return gstPipeline.pipeline(); +} QT_END_NAMESPACE diff --git a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture_p.h b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture_p.h index 6e93e8564..219773413 100644 --- a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture_p.h +++ b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediacapture_p.h @@ -63,6 +63,8 @@ public: QGstreamerVideoSink *gstreamerVideoSink() const; + void *nativePipeline() override; + private: void setCameraActive(bool activate); |