diff options
Diffstat (limited to 'src/multimedia/platform')
18 files changed, 297 insertions, 78 deletions
diff --git a/src/multimedia/platform/qgstreamer_platformspecificinterface.cpp b/src/multimedia/platform/qgstreamer_platformspecificinterface.cpp new file mode 100644 index 000000000..06ce46e3c --- /dev/null +++ b/src/multimedia/platform/qgstreamer_platformspecificinterface.cpp @@ -0,0 +1,27 @@ +// 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 + +// +// 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/private/qgstreamer_platformspecificinterface_p.h> + +QT_BEGIN_NAMESPACE + +QGStreamerPlatformSpecificInterface::~QGStreamerPlatformSpecificInterface() = default; + +QGStreamerPlatformSpecificInterface *QGStreamerPlatformSpecificInterface::instance() +{ + return dynamic_cast<QGStreamerPlatformSpecificInterface *>( + QPlatformMediaIntegration::instance()->platformSpecificInterface()); +} + +QT_END_NAMESPACE diff --git a/src/multimedia/platform/qgstreamer_platformspecificinterface_p.h b/src/multimedia/platform/qgstreamer_platformspecificinterface_p.h new file mode 100644 index 000000000..1a086f5a4 --- /dev/null +++ b/src/multimedia/platform/qgstreamer_platformspecificinterface_p.h @@ -0,0 +1,46 @@ +// 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 GSTREAMER_PLATFORMSPECIFICINTERFACE_P_H +#define GSTREAMER_PLATFORMSPECIFICINTERFACE_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/private/qplatformmediaintegration_p.h> + +typedef struct _GstPipeline GstPipeline; // NOLINT (bugprone-reserved-identifier) +typedef struct _GstElement GstElement; // NOLINT (bugprone-reserved-identifier) + +QT_BEGIN_NAMESPACE + +class Q_MULTIMEDIA_EXPORT QGStreamerPlatformSpecificInterface + : public QAbstractPlatformSpecificInterface +{ +public: + ~QGStreamerPlatformSpecificInterface() override; + + static QGStreamerPlatformSpecificInterface *instance(); + + virtual QAudioDevice makeCustomGStreamerAudioInput(const QByteArray &gstreamerPipeline) = 0; + virtual QAudioDevice makeCustomGStreamerAudioOutput(const QByteArray &gstreamerPipeline) = 0; + virtual QCamera *makeCustomGStreamerCamera(const QByteArray &gstreamerPipeline, + QObject *parent) = 0; + + // Note: ownership of GstElement is not transferred + virtual QCamera *makeCustomGStreamerCamera(GstElement *, QObject *parent) = 0; + + virtual GstPipeline *gstPipeline(QMediaPlayer *) = 0; + virtual GstPipeline *gstPipeline(QMediaCaptureSession *) = 0; +}; + +QT_END_NAMESPACE + +#endif // GSTREAMER_PLATFORMSPECIFICINTERFACE_P_H diff --git a/src/multimedia/platform/qplatformaudiobufferinput.cpp b/src/multimedia/platform/qplatformaudiobufferinput.cpp new file mode 100644 index 000000000..883b11fc0 --- /dev/null +++ b/src/multimedia/platform/qplatformaudiobufferinput.cpp @@ -0,0 +1,10 @@ +// 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 + +#include "qplatformaudiobufferinput_p.h" + +QT_BEGIN_NAMESPACE + +QT_END_NAMESPACE + +#include "moc_qplatformaudiobufferinput_p.cpp" diff --git a/src/multimedia/platform/qplatformaudiobufferinput_p.h b/src/multimedia/platform/qplatformaudiobufferinput_p.h new file mode 100644 index 000000000..a05a98100 --- /dev/null +++ b/src/multimedia/platform/qplatformaudiobufferinput_p.h @@ -0,0 +1,56 @@ +// 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 QPLATFORMAUDIOBUFFERINPUT_P_H +#define QPLATFORMAUDIOBUFFERINPUT_P_H + +#include "qaudioformat.h" +#include "qaudiobuffer.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. +// + +QT_BEGIN_NAMESPACE + +class QMediaInputEncoderInterface; + +class Q_MULTIMEDIA_EXPORT QPlatformAudioBufferInputBase : public QObject +{ + Q_OBJECT +Q_SIGNALS: + void newAudioBuffer(const QAudioBuffer &buffer); +}; + +class Q_MULTIMEDIA_EXPORT QPlatformAudioBufferInput : public QPlatformAudioBufferInputBase +{ + Q_OBJECT +public: + QPlatformAudioBufferInput(QAudioFormat format = {}) : m_format(std::move(format)) { } + + const QAudioFormat &audioFormat() const { return m_format; } + + QMediaInputEncoderInterface *encoderInterface() const { return m_encoderInterface; } + void setEncoderInterface(QMediaInputEncoderInterface *interface) + { + m_encoderInterface = interface; + } + +Q_SIGNALS: + void encoderUpdated(); + +private: + QMediaInputEncoderInterface *m_encoderInterface = nullptr; + QAudioFormat m_format; +}; + +QT_END_NAMESPACE + +#endif // QPLATFORMAUDIOBUFFERINPUT_P_H diff --git a/src/multimedia/platform/qplatformcamera.cpp b/src/multimedia/platform/qplatformcamera.cpp index 0d3975550..d03c19d67 100644 --- a/src/multimedia/platform/qplatformcamera.cpp +++ b/src/multimedia/platform/qplatformcamera.cpp @@ -50,7 +50,7 @@ QVideoFrameFormat QPlatformCamera::frameFormat() const m_framePixelFormat == QVideoFrameFormat::Format_Invalid ? m_cameraFormat.pixelFormat() : m_framePixelFormat); - result.setFrameRate(m_cameraFormat.maxFrameRate()); + result.setStreamFrameRate(m_cameraFormat.maxFrameRate()); return result; } @@ -221,6 +221,13 @@ int QPlatformCamera::colorTemperatureForWhiteBalance(QCamera::WhiteBalanceMode m return 0; } +void QPlatformCamera::updateError(QCamera::Error error, const QString &errorString) +{ + QMetaObject::invokeMethod(this, [this, error, errorString]() { + m_error.setAndNotify(error, errorString, *this); + }); +} + QT_END_NAMESPACE #include "moc_qplatformcamera_p.cpp" diff --git a/src/multimedia/platform/qplatformcamera_p.h b/src/multimedia/platform/qplatformcamera_p.h index 85624c0ce..341bf9121 100644 --- a/src/multimedia/platform/qplatformcamera_p.h +++ b/src/multimedia/platform/qplatformcamera_p.h @@ -16,7 +16,7 @@ // #include "qplatformvideosource_p.h" - +#include "private/qerrorinfo_p.h" #include <QtMultimedia/qcamera.h> QT_BEGIN_NAMESPACE @@ -110,8 +110,13 @@ public: static int colorTemperatureForWhiteBalance(QCamera::WhiteBalanceMode mode); + QCamera::Error error() const { return m_error.code(); } + QString errorString() const final { return m_error.description(); } + + void updateError(QCamera::Error error, const QString &errorString); + Q_SIGNALS: - void error(int error, const QString &errorString); + void errorOccurred(QCamera::Error error, const QString &errorString); protected: explicit QPlatformCamera(QCamera *parent); @@ -150,6 +155,7 @@ private: float m_maxExposureTime = -1.; QCamera::WhiteBalanceMode m_whiteBalance = QCamera::WhiteBalanceAuto; int m_colorTemperature = 0; + QErrorInfo<QCamera::Error> m_error; }; QT_END_NAMESPACE diff --git a/src/multimedia/platform/qplatformmediacapture.cpp b/src/multimedia/platform/qplatformmediacapture.cpp index 826228764..13bcbd63b 100644 --- a/src/multimedia/platform/qplatformmediacapture.cpp +++ b/src/multimedia/platform/qplatformmediacapture.cpp @@ -1,12 +1,15 @@ // 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/qplatformvideoframeinput_p.h> +#include <QtMultimedia/private/qtmultimediaglobal_p.h> QT_BEGIN_NAMESPACE @@ -21,6 +24,7 @@ std::vector<QPlatformVideoSource *> QPlatformMediaCaptureSession::activeVideoSou result.push_back(source); }; + checkSource(videoFrameInput()); checkSource(camera()); checkSource(screenCapture()); checkSource(windowCapture()); diff --git a/src/multimedia/platform/qplatformmediacapture_p.h b/src/multimedia/platform/qplatformmediacapture_p.h index 814fa160c..8d6afc90e 100644 --- a/src/multimedia/platform/qplatformmediacapture_p.h +++ b/src/multimedia/platform/qplatformmediacapture_p.h @@ -29,6 +29,8 @@ class QPlatformAudioOutput; class QMediaCaptureSession; class QPlatformSurfaceCapture; class QPlatformVideoSource; +class QPlatformAudioBufferInput; +class QPlatformVideoFrameInput; class Q_MULTIMEDIA_EXPORT QPlatformMediaCaptureSession : public QObject { @@ -49,6 +51,9 @@ public: virtual QPlatformSurfaceCapture *windowCapture() { return nullptr; } virtual void setWindowCapture(QPlatformSurfaceCapture *) { } + virtual QPlatformVideoFrameInput *videoFrameInput() { return nullptr; } + virtual void setVideoFrameInput(QPlatformVideoFrameInput *) { } + virtual QPlatformImageCapture *imageCapture() = 0; virtual void setImageCapture(QPlatformImageCapture *) {} @@ -57,6 +62,8 @@ public: virtual void setAudioInput(QPlatformAudioInput *input) = 0; + virtual void setAudioBufferInput(QPlatformAudioBufferInput *) { } + virtual void setVideoPreview(QVideoSink * /*sink*/) {} virtual void setAudioOutput(QPlatformAudioOutput *) {} @@ -68,6 +75,7 @@ Q_SIGNALS: void cameraChanged(); void screenCaptureChanged(); void windowCaptureChanged(); + void videoFrameInputChanged(); void imageCaptureChanged(); void encoderChanged(); diff --git a/src/multimedia/platform/qplatformmediaintegration.cpp b/src/multimedia/platform/qplatformmediaintegration.cpp index c8f662963..4bacc488f 100644 --- a/src/multimedia/platform/qplatformmediaintegration.cpp +++ b/src/multimedia/platform/qplatformmediaintegration.cpp @@ -91,48 +91,10 @@ struct InstanceHolder qCDebug(qLcMediaPlugin) << "Released media backend"; } - // Play nice with QtGlobalStatic::ApplicationHolder - using QAS_Type = InstanceHolder; - static void innerFunction(void *pointer) - { - new (pointer) InstanceHolder(); - } - std::unique_ptr<QPlatformMediaIntegration> instance; }; -// Specialized implementation of Q_APPLICATION_STATIC which behaves as -// an application static if a Qt application is present, otherwise as a Q_GLOBAL_STATIC. -// By doing this, and we have a Qt application, all system resources allocated by the -// backend is released when application lifetime ends. This is important on Windows, -// where Windows Media Foundation instances should not be released during static destruction. -// -// If we don't have a Qt application available when instantiating the instance holder, -// it will be created once, and not destroyed until static destruction. This can cause -// abrupt termination of Windows applications during static destruction. This is not a -// supported use case, but we keep this as a fallback to keep old applications functional. -// See also QTBUG-120198 -struct ApplicationHolder : QtGlobalStatic::ApplicationHolder<InstanceHolder> -{ - // Replace QtGlobalStatic::ApplicationHolder::pointer to prevent crash if - // no application is present - static InstanceHolder* pointer() - { - if (guard.loadAcquire() == QtGlobalStatic::Initialized) - return realPointer(); - - QMutexLocker locker(&mutex); - if (guard.loadRelaxed() == QtGlobalStatic::Uninitialized) { - InstanceHolder::innerFunction(&storage); - - if (const QCoreApplication *app = QCoreApplication::instance()) - QObject::connect(app, &QObject::destroyed, app, reset, Qt::DirectConnection); - - guard.storeRelease(QtGlobalStatic::Initialized); - } - return realPointer(); - } -}; +Q_APPLICATION_STATIC(InstanceHolder, s_instanceHolder); } // namespace @@ -140,7 +102,6 @@ QT_BEGIN_NAMESPACE QPlatformMediaIntegration *QPlatformMediaIntegration::instance() { - static QGlobalStatic<ApplicationHolder> s_instanceHolder; return s_instanceHolder->instance.get(); } @@ -246,6 +207,12 @@ QLatin1String QPlatformMediaIntegration::name() return m_backendName; } +QVideoFrame QPlatformMediaIntegration::convertVideoFrame(QVideoFrame &, + const QVideoFrameFormat &) +{ + return {}; +} + QPlatformMediaIntegration::QPlatformMediaIntegration(QLatin1String name) : m_backendName(name) { } QPlatformMediaIntegration::~QPlatformMediaIntegration() = default; diff --git a/src/multimedia/platform/qplatformmediaintegration_p.h b/src/multimedia/platform/qplatformmediaintegration_p.h index 19fa40baf..d03d0c794 100644 --- a/src/multimedia/platform/qplatformmediaintegration_p.h +++ b/src/multimedia/platform/qplatformmediaintegration_p.h @@ -53,6 +53,13 @@ class QPlatformAudioOutput; class QPlatformVideoDevices; class QCapturableWindow; class QPlatformCapturableWindows; +class QVideoFrame; + +class Q_MULTIMEDIA_EXPORT QAbstractPlatformSpecificInterface +{ +public: + virtual ~QAbstractPlatformSpecificInterface() = default; +}; class Q_MULTIMEDIA_EXPORT QPlatformMediaIntegration : public QObject { @@ -96,6 +103,11 @@ public: static QStringList availableBackends(); QLatin1String name(); // for unit tests + // Convert a QVideoFrame to the destination format + virtual QVideoFrame convertVideoFrame(QVideoFrame &, const QVideoFrameFormat &); + + virtual QAbstractPlatformSpecificInterface *platformSpecificInterface() { return nullptr; } + protected: virtual QPlatformMediaFormatInfo *createFormatInfo(); diff --git a/src/multimedia/platform/qplatformmediaplayer.cpp b/src/multimedia/platform/qplatformmediaplayer.cpp index ea22f94df..00840f074 100644 --- a/src/multimedia/platform/qplatformmediaplayer.cpp +++ b/src/multimedia/platform/qplatformmediaplayer.cpp @@ -14,9 +14,7 @@ QPlatformMediaPlayer::QPlatformMediaPlayer(QMediaPlayer *parent) : player(parent QPlatformMediaIntegration::instance()->mediaDevices()->prepareAudio(); } -QPlatformMediaPlayer::~QPlatformMediaPlayer() -{ -} +QPlatformMediaPlayer::~QPlatformMediaPlayer() = default; void QPlatformMediaPlayer::stateChanged(QMediaPlayer::PlaybackState newState) { @@ -39,16 +37,4 @@ void QPlatformMediaPlayer::error(int error, const QString &errorString) player->d_func()->setError(QMediaPlayer::Error(error), errorString); } -void *QPlatformMediaPlayer::nativePipeline(QMediaPlayer *player) -{ - if (!player) - return nullptr; - - auto playerPrivate = player->d_func(); - if (!playerPrivate || !playerPrivate->control) - return nullptr; - - return playerPrivate->control->nativePipeline(); -} - QT_END_NAMESPACE diff --git a/src/multimedia/platform/qplatformmediaplayer_p.h b/src/multimedia/platform/qplatformmediaplayer_p.h index 6e3590763..f8815958b 100644 --- a/src/multimedia/platform/qplatformmediaplayer_p.h +++ b/src/multimedia/platform/qplatformmediaplayer_p.h @@ -22,6 +22,7 @@ #include <QtCore/qpair.h> #include <QtCore/private/qglobal_p.h> +#include <QtCore/qobject.h> QT_BEGIN_NAMESPACE @@ -64,19 +65,23 @@ public: virtual void setAudioOutput(QPlatformAudioOutput *) {} + virtual void setAudioBufferOutput(QAudioBufferOutput *) { } + virtual QMediaMetaData metaData() const { return {}; } virtual void setVideoSink(QVideoSink * /*sink*/) = 0; // media streams - enum TrackType { VideoStream, AudioStream, SubtitleStream, NTrackTypes }; + enum TrackType : uint8_t { VideoStream, AudioStream, SubtitleStream, NTrackTypes }; virtual int trackCount(TrackType) { return 0; }; virtual QMediaMetaData trackMetaData(TrackType /*type*/, int /*streamNumber*/) { return QMediaMetaData(); } virtual int activeTrack(TrackType) { return -1; } virtual void setActiveTrack(TrackType, int /*streamNumber*/) {} + void durationChanged(std::chrono::milliseconds ms) { durationChanged(ms.count()); } void durationChanged(qint64 duration) { emit player->durationChanged(duration); } + void positionChanged(std::chrono::milliseconds ms) { positionChanged(ms.count()); } void positionChanged(qint64 position) { if (m_position == position) return; @@ -115,7 +120,7 @@ public: bool doLoop() { return isSeekable() && (m_loops < 0 || ++m_currentLoop < m_loops); } - int loops() { return m_loops; } + int loops() const { return m_loops; } virtual void setLoops(int loops) { if (m_loops == loops) @@ -124,11 +129,6 @@ public: Q_EMIT player->loopsChanged(); } - virtual void *nativePipeline() { return nullptr; } - - // private API, the purpose is getting GstPipeline - static void *nativePipeline(QMediaPlayer *player); - protected: explicit QPlatformMediaPlayer(QMediaPlayer *parent = nullptr); @@ -144,6 +144,25 @@ private: qint64 m_position = 0; }; +#ifndef QT_NO_DEBUG_STREAM +inline QDebug operator<<(QDebug dbg, QPlatformMediaPlayer::TrackType type) +{ + QDebugStateSaver save(dbg); + dbg.nospace(); + + switch (type) { + case QPlatformMediaPlayer::TrackType::AudioStream: + return dbg << "AudioStream"; + case QPlatformMediaPlayer::TrackType::VideoStream: + return dbg << "VideoStream"; + case QPlatformMediaPlayer::TrackType::SubtitleStream: + return dbg << "SubtitleStream"; + default: + Q_UNREACHABLE_RETURN(dbg); + } +} +#endif + QT_END_NAMESPACE diff --git a/src/multimedia/platform/qplatformmediarecorder.cpp b/src/multimedia/platform/qplatformmediarecorder.cpp index ba9ea0165..30dba0a45 100644 --- a/src/multimedia/platform/qplatformmediarecorder.cpp +++ b/src/multimedia/platform/qplatformmediarecorder.cpp @@ -15,12 +15,12 @@ QPlatformMediaRecorder::QPlatformMediaRecorder(QMediaRecorder *parent) void QPlatformMediaRecorder::pause() { - error(QMediaRecorder::FormatError, QMediaRecorder::tr("Pause not supported")); + updateError(QMediaRecorder::FormatError, QMediaRecorder::tr("Pause not supported")); } void QPlatformMediaRecorder::resume() { - error(QMediaRecorder::FormatError, QMediaRecorder::tr("Resume not supported")); + updateError(QMediaRecorder::FormatError, QMediaRecorder::tr("Resume not supported")); } void QPlatformMediaRecorder::stateChanged(QMediaRecorder::RecorderState state) @@ -47,7 +47,7 @@ void QPlatformMediaRecorder::actualLocationChanged(const QUrl &location) emit q->actualLocationChanged(location); } -void QPlatformMediaRecorder::error(QMediaRecorder::Error error, const QString &errorString) +void QPlatformMediaRecorder::updateError(QMediaRecorder::Error error, const QString &errorString) { m_error.setAndNotify(error, errorString, *q); } diff --git a/src/multimedia/platform/qplatformmediarecorder_p.h b/src/multimedia/platform/qplatformmediarecorder_p.h index 6e88dc187..ab6af759d 100644 --- a/src/multimedia/platform/qplatformmediarecorder_p.h +++ b/src/multimedia/platform/qplatformmediarecorder_p.h @@ -125,18 +125,20 @@ public: virtual void setOutputLocation(const QUrl &location) { m_outputLocation = location; } QUrl actualLocation() const { return m_actualLocation; } void clearActualLocation() { m_actualLocation.clear(); } - void clearError() { error(QMediaRecorder::NoError, QString()); } + void clearError() { updateError(QMediaRecorder::NoError, QString()); } QIODevice *outputDevice() const { return m_outputDevice; } void setOutputDevice(QIODevice *device) { m_outputDevice = device; } + virtual void updateAutoStop() { } + protected: explicit QPlatformMediaRecorder(QMediaRecorder *parent); void stateChanged(QMediaRecorder::RecorderState state); void durationChanged(qint64 position); void actualLocationChanged(const QUrl &location); - void error(QMediaRecorder::Error error, const QString &errorString); + void updateError(QMediaRecorder::Error error, const QString &errorString); void metaDataChanged(); QMediaRecorder *mediaRecorder() { return q; } diff --git a/src/multimedia/platform/qplatformsurfacecapture_p.h b/src/multimedia/platform/qplatformsurfacecapture_p.h index 42fbda474..e4c59c6f4 100644 --- a/src/multimedia/platform/qplatformsurfacecapture_p.h +++ b/src/multimedia/platform/qplatformsurfacecapture_p.h @@ -61,7 +61,7 @@ public: Source source() const { return m_source; } Error error() const; - QString errorString() const; + QString errorString() const final; protected: virtual bool setActiveInternal(bool) = 0; @@ -74,7 +74,6 @@ public Q_SLOTS: Q_SIGNALS: void sourceChanged(WindowSource); void sourceChanged(ScreenSource); - void errorChanged(); void errorOccurred(Error error, QString errorString); private: diff --git a/src/multimedia/platform/qplatformvideoframeinput.cpp b/src/multimedia/platform/qplatformvideoframeinput.cpp new file mode 100644 index 000000000..d90306345 --- /dev/null +++ b/src/multimedia/platform/qplatformvideoframeinput.cpp @@ -0,0 +1,10 @@ +// 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 + +#include "qplatformvideoframeinput_p.h" + +QT_BEGIN_NAMESPACE + +QT_END_NAMESPACE + +#include "moc_qplatformvideoframeinput_p.cpp" diff --git a/src/multimedia/platform/qplatformvideoframeinput_p.h b/src/multimedia/platform/qplatformvideoframeinput_p.h new file mode 100644 index 000000000..45714492c --- /dev/null +++ b/src/multimedia/platform/qplatformvideoframeinput_p.h @@ -0,0 +1,55 @@ +// 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 QPLATFORMVIDEOFRAMEINPUT_P_H +#define QPLATFORMVIDEOFRAMEINPUT_P_H + +#include "qplatformvideosource_p.h" +#include "qmetaobject.h" +#include "qpointer.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. +// + +QT_BEGIN_NAMESPACE + +class QMediaInputEncoderInterface; + +class Q_MULTIMEDIA_EXPORT QPlatformVideoFrameInput : public QPlatformVideoSource +{ + Q_OBJECT +public: + QPlatformVideoFrameInput(QVideoFrameFormat format = {}) : m_format(std::move(format)) { } + + void setActive(bool) final { } + bool isActive() const final { return true; } + + QVideoFrameFormat frameFormat() const final { return m_format; } + + QString errorString() const final { return {}; } + + QMediaInputEncoderInterface *encoderInterface() const { return m_encoderInterface; } + void setEncoderInterface(QMediaInputEncoderInterface *interface) + { + m_encoderInterface = interface; + } + +Q_SIGNALS: + void encoderUpdated(); + +private: + QMediaInputEncoderInterface *m_encoderInterface = nullptr; + QVideoFrameFormat m_format; +}; + +QT_END_NAMESPACE + +#endif // QPLATFORMVIDEOFRAMEINPUT_P_H diff --git a/src/multimedia/platform/qplatformvideosource_p.h b/src/multimedia/platform/qplatformvideosource_p.h index 3ed76d3e2..b11524226 100644 --- a/src/multimedia/platform/qplatformvideosource_p.h +++ b/src/multimedia/platform/qplatformvideosource_p.h @@ -43,9 +43,14 @@ public: virtual void setCaptureSession(QPlatformMediaCaptureSession *) { } + virtual QString errorString() const = 0; + + bool hasError() const { return !errorString().isEmpty(); } + Q_SIGNALS: void newVideoFrame(const QVideoFrame &); void activeChanged(bool); + void errorChanged(); }; QT_END_NAMESPACE |