Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qplatformmediaintegration.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
6#include <qatomic.h>
7#include <qmutex.h>
11#include <qmediadevices.h>
12#include <qcameradevice.h>
13#include <qloggingcategory.h>
14
16#include "QtCore/private/qfactoryloader_p.h"
18
20{
21public:
23 {
24 qCritical("QtMultimedia is not currently supported on this platform or compiler.");
25 }
26 QPlatformMediaFormatInfo *formatInfo() override { return nullptr; }
27};
28
29static Q_LOGGING_CATEGORY(qLcMediaPlugin, "qt.multimedia.plugin")
30
33 QLatin1String("/multimedia")))
34
35static const auto FFmpegBackend = QStringLiteral("ffmpeg");
36
38{
40
41 if (QFactoryLoader *fl = loader()) {
42 const auto keyMap = fl->keyMap();
43 for (auto it = keyMap.constBegin(); it != keyMap.constEnd(); ++it)
44 if (!list.contains(it.value()))
45 list << it.value();
46 }
47
48 qCDebug(qLcMediaPlugin) << "Available backends" << list;
49 return list;
50}
51
52static QString defaultBackend(const QStringList &backends)
53{
54#ifdef QT_DEFAULT_MEDIA_BACKEND
55 auto backend = QString::fromUtf8(QT_DEFAULT_MEDIA_BACKEND);
56 if (backends.contains(backend))
57 return backend;
58#endif
59
60#if defined(Q_OS_DARWIN) || defined(Q_OS_LINUX) || defined(Q_OS_WINDOWS) || defined(Q_OS_ANDROID)
61 // Return ffmpeg backend by default.
62 // Platform backends for the OS list are optionally available but have limited support.
63 if (backends.contains(FFmpegBackend))
64 return FFmpegBackend;
65#else
66 // Return platform backend (non-ffmpeg) by default.
67 if (backends.size() > 1 && backends[0] == FFmpegBackend)
68 return backends[1];
69#endif
70
71 return backends[0];
72}
73
75
77{
78 // TODO: replace the mutex with std::once
80 std::unique_ptr<QPlatformMediaIntegration> instance;
81 Factory factory;
83
85{
88 return instanceHolder.instance.get();
89
92 return instanceHolder.instance.get();
93 }
94
95 const auto backends = availableBackends();
96 QString backend = QString::fromUtf8(qgetenv("QT_MEDIA_BACKEND"));
97 if (backend.isEmpty() && !backends.isEmpty())
98 backend = defaultBackend(backends);
99
100 qCDebug(qLcMediaPlugin) << "loading backend" << backend;
102 qLoadPlugin<QPlatformMediaIntegration, QPlatformMediaPlugin>(loader(), backend));
103
105 qWarning() << "could not load multimedia backend" << backend;
106 instanceHolder.instance = std::make_unique<QDummyIntegration>();
107 }
108
109 return instanceHolder.instance.get();
110}
111
112/*
113 This API is there to be able to test with a mock backend.
114*/
115void QPlatformMediaIntegration::setPlatformFactory(Factory factory)
116{
117 Q_ASSERT((factory == nullptr) ^ (instanceHolder.factory == nullptr));
118 instanceHolder.instance.reset();
119 instanceHolder.factory = std::move(factory);
120}
121
123{
124 return m_videoDevices ? m_videoDevices->videoDevices() : QList<QCameraDevice>{};
125}
126
128{
129 return new QPlatformAudioInput(q);
130}
131
133{
134 return new QPlatformAudioOutput(q);
135}
136
138{
140}
141
143{
144 return m_capturableWindows && m_capturableWindows->isWindowValid(window);
145}
146
148
150
\qmltype AudioInput \instantiates QAudioInput
Definition qaudioinput.h:19
\qmltype AudioOutput \instantiates QAudioOutput
QPlatformMediaFormatInfo * formatInfo() override
Definition qlist.h:74
\inmodule QtCore
Definition qmutex.h:317
\inmodule QtCore
Definition qmutex.h:285
virtual QMaybe< QPlatformAudioOutput * > createAudioOutput(QAudioOutput *)
std::unique_ptr< QPlatformVideoDevices > m_videoDevices
std::unique_ptr< QPlatformCapturableWindows > m_capturableWindows
static QPlatformMediaIntegration * instance()
virtual QMaybe< QPlatformAudioInput * > createAudioInput(QAudioInput *)
virtual QList< QCameraDevice > videoInputs()
bool isCapturableWindowValid(const QCapturableWindowPrivate &)
QList< QCapturableWindow > capturableWindows()
virtual ~QPlatformMediaIntegration()
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5857
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:1083
QSet< QString >::iterator it
Combined button and popup list for selecting options.
#define Q_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ARGS)
#define qCritical
Definition qlogging.h:163
#define qWarning
Definition qlogging.h:162
#define Q_LOGGING_CATEGORY(name,...)
#define qCDebug(category,...)
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
QT_BEGIN_NAMESPACE struct QPlatformMediaIntegration::InstanceHolder instanceHolder
static QStringList availableBackends()
static QString defaultBackend(const QStringList &backends)
static QPlatformMediaPlugin_iid
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define QStringLiteral(str)
Q_CORE_EXPORT QByteArray qgetenv(const char *varName)
static const struct @437 keyMap[]
QList< int > list
[14]
QItemEditorFactory * factory
aWidget window() -> setWindowTitle("New Window Title")
[2]
bool contains(const AT &t) const noexcept
Definition qlist.h:44
std::unique_ptr< QPlatformMediaIntegration > instance