18#include <QtCore/qdebug.h>
19#include <QtCore/qlist.h>
20#include <QtCore/qmutex.h>
21#include <QtCore/qsemaphore.h>
23#include <QtMultimedia/qaudioformat.h>
24#include <QtMultimedia/qvideoframe.h>
25#include <QtMultimedia/private/qtmultimediaglobal_p.h>
26#include <QtMultimedia/private/qmultimediautils_p.h>
27#include <QtMultimedia/private/qplatformmediaplayer_p.h>
28#include <QtMultimedia/private/qsharedhandle_p.h>
31#include <gst/app/gstappsink.h>
32#include <gst/app/gstappsrc.h>
33#include <gst/video/video-info.h>
35#if QT_CONFIG(gstreamer_gl_egl) && QT_CONFIG(linux_dmabuf)
36# define QT_GSTREAMER_SUPPORTS_GST_VIDEO_FORMAT_DMA_DRM GST_CHECK_VERSION(1
, 24
, 0
)
38# define QT_GSTREAMER_SUPPORTS_GST_VIDEO_FORMAT_DMA_DRM 0
44#ifdef __cpp_lib_three_way_comparison
48#if QT_CONFIG(gstreamer_photography)
49# define GST_USE_UNSTABLE_API
50# include <gst/interfaces/photography.h>
51# undef GST_USE_UNSTABLE_API
69#define QGST_DEFINE_CAST_TRAITS(ClassName, MACRO_LABEL)
71 struct GstObjectTraits<ClassName>
73 using Type = ClassName;
75 static bool isObjectOfType(U *arg)
77 return GST_IS_##MACRO_LABEL(arg);
80 static Type *cast(U *arg)
82 return GST_##MACRO_LABEL##_CAST(arg);
85 static Type *checked_cast(U *arg)
87 return GST_##MACRO_LABEL(arg);
90 static_assert(true, "ensure semicolon")
92#define QGST_DEFINE_CAST_TRAITS_FOR_INTERFACE(ClassName, MACRO_LABEL)
94 struct GstObjectTraits<ClassName>
96 using Type = ClassName;
98 static bool isObjectOfType(U *arg)
100 return GST_IS_##MACRO_LABEL(arg);
102 template <typename U>
103 static Type *cast(U *arg)
105 return checked_cast(arg);
107 template <typename U>
108 static Type *checked_cast(U *arg)
110 return GST_##MACRO_LABEL(arg);
113 static_assert(true, "ensure semicolon")
133 template <
typename U>
138 template <
typename U>
143 template <
typename U>
150#undef QGST_DEFINE_CAST_TRAITS
151#undef QGST_DEFINE_CAST_TRAITS_FOR_INTERFACE
155template <
typename DestinationType,
typename SourceType>
159 return arg && Traits::isObjectOfType(arg);
162template <
typename DestinationType,
typename SourceType>
166 if (arg && Traits::isObjectOfType(arg))
167 return Traits::cast(arg);
171template <
typename DestinationType,
typename SourceType>
176 Q_ASSERT(Traits::isObjectOfType(arg));
177 return Traits::cast(arg);
199#ifdef __cpp_impl_three_way_comparison
204 return std::tie(min, max) == std::tie(rhs.min, rhs.max);
217#ifdef __cpp_lib_three_way_comparison
242 bool operator==(
const QGString &str)
const {
return asStringView() == str.asStringView(); }
243 bool operator==(
const QLatin1StringView str)
const {
return asStringView() == str; }
244 bool operator==(
const QByteArrayView str)
const {
return asByteArrayView() == str; }
246 bool operator!=(
const QGString &str)
const {
return asStringView() != str.asStringView(); }
247 bool operator!=(
const QLatin1StringView str)
const {
return asStringView() != str; }
248 bool operator!=(
const QByteArrayView str)
const {
return asByteArrayView() != str; }
252 return lhs.asStringView() < rhs.asStringView();
256 return lhs.asStringView() < rhs;
260 return lhs.asByteArrayView() < rhs;
264 return lhs < rhs.asStringView();
268 return lhs < rhs.asByteArrayView();
279 explicit QGValue(
const GValue *v);
290 return value ?
static_cast<T *>(g_value_get_pointer(value)) :
nullptr;
339 static GstCaps *
ref(GstCaps *arg)
noexcept {
return gst_caps_ref(arg); }
340 static bool unref(GstCaps *arg)
noexcept
367 void addPixelFormats(
const QList<QVideoFrameFormat::PixelFormat> &formats,
368 const char* capsFeatures =
nullptr);
384 gst_object_ref_sink(arg);
387 static bool unref(GstObject *arg)
noexcept
389 gst_object_unref(arg);
408 void set(
const char *property,
const char *str);
409 void set(
const char *property,
bool b);
410 void set(
const char *property, int32_t i);
411 void set(
const char *property, uint32_t i);
412 void set(
const char *property, int64_t i);
413 void set(
const char *property, uint64_t i);
414 void set(
const char *property,
double d);
417 void set(
const char *property,
void *object, GDestroyNotify destroyFunction);
419 template <
typename Object>
420 void set(
const char *property, Object *object, GDestroyNotify destroyFunction)
422 set(property,
static_cast<
void *>(object), destroyFunction);
425 template <
typename Object>
426 void set(
const char *property, std::unique_ptr<Object> object)
428 set(property,
static_cast<
void *>(object.release()), qDeleteFromVoidPointer<Object>);
431 template <
typename T>
434 delete reinterpret_cast<T *>(ptr);
439 bool getBool(
const char *property)
const;
441 int getInt(
const char *property)
const;
444 float getFloat(
const char *property)
const;
445 double getDouble(
const char *property)
const;
447 void *
getObject(
const char *property)
const;
449 template <
typename T>
453 return reinterpret_cast<T *>(rawObject);
515 explicit QGstPad(GstPad *pad, RefMode mode);
542 template <
auto Member,
typename T>
543 void addProbe(T *instance, GstPadProbeType type);
545 template <
typename Functor>
548 template <
auto Member,
typename T>
551 template <
typename Functor>
562 explicit QGstClock(GstClock *clock, RefMode mode);
581 explicit QGstElement(GstElement *element, RefMode mode);
585 const char *name =
nullptr);
623 template <
auto Member,
typename T>
628 static void callback(GstElement *e, GstPad *pad, gpointer userData)
630 (
static_cast<T *>(userData)->*Member)(QGstElement(e, NeedsRef),
631 QGstPad(pad, NeedsRef));
635 return connect(
"pad-added", G_CALLBACK(Impl::callback), instance);
637 template <
auto Member,
typename T>
642 static void callback(GstElement *e, GstPad *pad, gpointer userData)
644 (
static_cast<T *>(userData)->*Member)(QGstElement(e, NeedsRef),
645 QGstPad(pad, NeedsRef));
649 return connect(
"pad-removed", G_CALLBACK(Impl::callback), instance);
651 template <
auto Member,
typename T>
656 static void callback(GstElement *e, gpointer userData)
658 (
static_cast<T *>(userData)->*Member)(QGstElement(e, NeedsRef));
662 return connect(
"no-more-pads", G_CALLBACK(Impl::callback), instance);
679 QGstQueryHandle &positionQuery()
const;
680 mutable QGstQueryHandle m_positionQuery;
685template <
auto Member,
typename T>
688 auto callback = [](GstPad *pad, GstPadProbeInfo *info, gpointer userData) {
689 return (
static_cast<T *>(userData)->*Member)(QGstPad(pad, NeedsRef), info);
692 gst_pad_add_probe(pad(), type, callback, instance,
nullptr);
695template <
typename Functor>
698 using namespace std::chrono_literals;
703 std::once_flag onceFlag;
708 std::call_once(onceFlag, [&] {
714 CallbackData cd{ QSemaphore{}, {}, std::forward<Functor>(work) };
716 auto callback = [](GstPad *, GstPadProbeInfo *, gpointer p) {
717 auto cd =
reinterpret_cast<CallbackData *>(p);
719 cd->waitDone.release();
720 return GST_PAD_PROBE_REMOVE;
723 gulong probe = gst_pad_add_probe(pad(), GST_PAD_PROBE_TYPE_IDLE, callback, &cd,
nullptr);
727 bool success = cd.waitDone.try_acquire_for(250ms);
735 success = cd.waitDone.try_acquire_for(1s);
742 qWarning() <<
"QGstPad::doInIdleProbe blocked for 1s. Executing the pad probe manually";
744 gst_pad_remove_probe(pad(), probe);
748template <
auto Member,
typename T>
751 auto callback = [](GstPad *, GstPadProbeInfo *info, gpointer userData) {
752 if (GST_EVENT_TYPE(GST_PAD_PROBE_INFO_DATA(info)) != GST_EVENT_EOS)
753 return GST_PAD_PROBE_PASS;
754 (
static_cast<T *>(userData)->*Member)();
755 return GST_PAD_PROBE_REMOVE;
758 gst_pad_add_probe(pad(), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, callback, instance,
nullptr);
760template <
typename Functor>
763 using namespace std::chrono_literals;
765 GstPadDirection direction = gst_pad_get_direction(pad());
768 case GstPadDirection::GST_PAD_SINK: {
775 case GstPadDirection::GST_PAD_SRC: {
777 if (parent().state(1s) == GstState::GST_STATE_PLAYING)
789template <
typename... Ts>
793 bool link_success = [&] {
794 if constexpr (
sizeof...(Ts) == 2)
795 return gst_element_link(ts.element()...);
797 return gst_element_link_many(ts.element()...,
nullptr);
800 if (Q_UNLIKELY(!link_success)) {
801 qWarning() <<
"qLinkGstElements: could not link elements: "
802 << std::initializer_list<
const char *>{
803 (GST_ELEMENT_NAME(ts.element()))...,
808template <
typename... Ts>
812 if constexpr (
sizeof...(Ts) == 2)
813 gst_element_unlink(ts.element()...);
815 gst_element_unlink_many(ts.element()...,
nullptr);
831 const char *name =
nullptr,
832 bool ghostUnlinkedPads =
false);
834 const char *name =
nullptr,
835 bool ghostUnlinkedPads =
false);
837 template <
typename... Ts>
840 if constexpr (
sizeof...(Ts) == 1)
841 gst_bin_add(bin(), ts.element()...);
843 gst_bin_add_many(bin(), ts.element()...,
nullptr);
846 template <
typename... Ts>
849 if constexpr (
sizeof...(Ts) == 1)
850 gst_bin_remove(bin(), ts.element()...);
852 gst_bin_remove_many(bin(), ts.element()...,
nullptr);
855 template <
typename... Ts>
859 bool stateChangeSuccessful = (ts.setStateSync(GST_STATE_NULL) && ...);
860 Q_ASSERT(stateChangeSuccessful);
872 void dumpGraph(
const char *fileNamePrefix,
bool includeTimestamp =
true)
const;
928# if GST_CHECK_VERSION(1
, 24
, 0
)
933 void setCallbacks(GstAppSinkCallbacks &callbacks, gpointer user_data, GDestroyNotify notify);
954 void setCallbacks(GstAppSrcCallbacks &callbacks, gpointer user_data, GDestroyNotify notify);
966template <
typename Arg,
typename... Args>
969 QGstElementFactoryHandle factory = QGstElement::findFactory(arg);
971 return qGstErrorMessageCannotFindElement(arg);
973 if constexpr (
sizeof...(args) != 0)
974 return qGstErrorMessageIfElementsNotAvailable(args...);
979template <
typename Functor>
982 guint size = gst_stream_collection_get_size(collection);
983 for (guint index = 0; index != size; ++index)
984 f(gst_stream_collection_get_stream(collection, index));
987template <
typename Functor>
990 qForeachStreamInCollection(collection.get(), std::forward<Functor>(f));
1008 return std::hash<
void *>{}(e.element());
QGObjectHandlerConnection & operator=(const QGObjectHandlerConnection &)=default
QGObjectHandlerConnection & operator=(QGObjectHandlerConnection &&)=default
QGObjectHandlerConnection(QGstObject object, gulong handler)
QGObjectHandlerConnection()=default
QGObjectHandlerConnection(const QGObjectHandlerConnection &)=default
QGObjectHandlerConnection(QGObjectHandlerConnection &&)=default
~QGObjectHandlerScopedConnection()
QGObjectHandlerScopedConnection(const QGObjectHandlerScopedConnection &)=delete
QGObjectHandlerScopedConnection & operator=(const QGObjectHandlerScopedConnection &)=delete
QGObjectHandlerScopedConnection(QGObjectHandlerScopedConnection &&)=default
QGObjectHandlerScopedConnection()=default
QGObjectHandlerScopedConnection(QGObjectHandlerConnection connection)
QGObjectHandlerScopedConnection & operator=(QGObjectHandlerScopedConnection &&)=default
std::optional< int > toInt64() const
std::optional< QGRange< int > > toIntRange() const
std::optional< int > toInt() const
QList< QAudioFormat::SampleFormat > getSampleFormats() const
QGstStructureView toStructure() const
std::optional< QGRange< float > > getFractionRange() const
const char * toString() const
std::optional< float > getFraction() const
QGValue at(int index) const
std::optional< bool > toBool() const
QGstSampleHandle pullSample()
void setCallbacks(GstAppSinkCallbacks &callbacks, gpointer user_data, GDestroyNotify notify)
GstAppSink * appSink() const
void setCaps(const QGstCaps &caps)
QGstAppSink(const QGstAppSink &)=default
QGstAppSink(QGstAppSink &&) noexcept=default
static QGstAppSink create(const char *name)
QGstAppSink(GstAppSink *, RefMode)
QGstAppSink & operator=(QGstAppSink &&) noexcept=default
QGstAppSink & operator=(const QGstAppSink &)=default
static QGstAppSrc create(const char *name)
QGstAppSrc & operator=(const QGstAppSrc &)=default
GstFlowReturn pushBuffer(GstBuffer *)
QGstAppSrc(const QGstAppSrc &)=default
void setCallbacks(GstAppSrcCallbacks &callbacks, gpointer user_data, GDestroyNotify notify)
QGstAppSrc & operator=(QGstAppSrc &&) noexcept=default
QGstAppSrc(GstAppSrc *, RefMode)
QGstAppSrc(QGstAppSrc &&) noexcept=default
GstAppSrc * appSrc() const
QGstBaseSink & operator=(const QGstBaseSink &)=default
QGstBaseSink(GstBaseSink *, RefMode)
QGstBaseSink(const QGstBaseSink &)=default
GstBaseSink * baseSink() const
QGstBaseSink(QGstBaseSink &&) noexcept=default
QGstBaseSink & operator=(QGstBaseSink &&) noexcept=default
QGstBaseSrc(QGstBaseSrc &&) noexcept=default
QGstBaseSrc & operator=(QGstBaseSrc &&) noexcept=default
QGstBaseSrc(const QGstBaseSrc &)=default
QGstBaseSrc & operator=(const QGstBaseSrc &)=default
QGstBaseSrc(GstBaseSrc *, RefMode)
GstBaseSrc * baseSrc() const
void addUnlinkedGhostPads(GstPadDirection)
QGstBin(QGstBin &&) noexcept=default
void dumpGraph(const char *fileNamePrefix, bool includeTimestamp=true) const
QGstBin & operator=(const QGstBin &)=default
QGstElement findByName(const char *)
void recalculateLatency()
static QGstBin create(const char *name)
void addGhostPad(const QGstElement &child, const char *name)
std::enable_if_t<(std::is_base_of_v< QGstElement, std::remove_reference_t< Ts > > &&...), void > stopAndRemoveElements(Ts &&...ts)
QGstBin & operator=(QGstBin &&) noexcept=default
static QGstBin createFromPipelineDescription(const char *pipelineDescription, const char *name=nullptr, bool ghostUnlinkedPads=false)
QGstBin(const QGstBin &)=default
static QGstBin createFromFactory(const char *factory, const char *name)
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void > add(const Ts &...ts)
void addGhostPad(const char *name, const QGstPad &pad)
QGstBin(GstBin *bin, RefMode mode=NeedsRef)
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void > remove(const Ts &...ts)
static QGstBin createFromPipelineDescription(const QByteArray &pipelineDescription, const char *name=nullptr, bool ghostUnlinkedPads=false)
MemoryFormat memoryFormat() const
std::optional< QGstVideoInfo > videoInfo() const
QGstCaps & operator=(QGstCaps &&) noexcept=default
static QGstCaps fromCameraFormat(const QCameraFormat &format)
void setResolution(QSize)
QGstCaps & operator=(const QGstCaps &)=default
QGstCaps(const QGstCaps &)=default
void addPixelFormats(const QList< QVideoFrameFormat::PixelFormat > &formats, const char *capsFeatures=nullptr)
QGstCaps(QGstCaps &&) noexcept=default
QGstStructureView at(int index) const
QGstClock(GstClock *clock, RefMode mode)
GstClockTime time() const
QGstClock(const QGstObject &o)
void setBaseTime(GstClockTime time) const
GstStateChangeReturn setState(GstState state)
static QGstElement createFromFactory(const QGstElementFactoryHandle &, const char *name=nullptr)
std::optional< std::chrono::nanoseconds > position() const
static QGstElement createFromDevice(const QGstDeviceHandle &, const char *name=nullptr)
QGstElement & operator=(QGstElement &&) noexcept=default
QGObjectHandlerConnection onPadRemoved(T *instance)
GstElement * element() const
static QGstElementFactoryHandle findFactory(const QByteArray &name)
QGstElement(GstElement *element, RefMode mode)
void lockState(bool locked)
QGstElement(const QGstElement &)=default
QGstBin getRootBin() const
QGstPad getRequestPad(const char *name) const
QGstElement(QGstElement &&) noexcept=default
bool waitForAsyncStateChangeComplete(std::chrono::nanoseconds timeout=std::chrono::seconds(5)) const
std::optional< bool > canSeek() const
std::optional< std::chrono::nanoseconds > duration() const
bool finishStateChange(std::chrono::nanoseconds timeout=std::chrono::seconds(5))
bool setStateSync(GstState state, std::chrono::nanoseconds timeout=std::chrono::seconds(1))
bool isStateLocked() const
void sendEvent(GstEvent *event) const
void dumpPipelineGraph(const char *filename) const
QGstElement & operator=(const QGstElement &)=default
GstClockTime baseTime() const
QByteArrayView factoryName() const
static QGstElement createFromPipelineDescription(const QByteArray &)
void releaseRequestPad(const QGstPad &pad) const
static QGstElement createFromFactory(GstElementFactory *, const char *name=nullptr)
bool syncStateWithParent()
static QGstElement createFromDevice(GstDevice *, const char *name=nullptr)
QGstPad staticPad(const char *name) const
QGstBin getParentBin() const
std::optional< std::chrono::milliseconds > positionInMs() const
QGObjectHandlerConnection onPadAdded(T *instance)
static QGstElement createFromFactory(const char *factory, const char *name=nullptr)
bool hasAsyncStateChange(std::chrono::nanoseconds timeout=std::chrono::seconds(0)) const
static QGstElementFactoryHandle findFactory(const char *)
QGstElement getParent() const
QGObjectHandlerConnection onNoMorePads(T *instance)
QGstPipeline getPipeline() const
static QGstElement createFromPipelineDescription(const char *)
GstState state(std::chrono::nanoseconds timeout=std::chrono::seconds(0)) const
std::optional< std::chrono::milliseconds > durationInMs() const
T * getObject(const char *property) const
void set(const char *property, double d)
QGObjectHandlerConnection connect(const char *name, GCallback callback, gpointer userData)
void * getObject(const char *property) const
double getDouble(const char *property) const
QGstObject & operator=(const QGstObject &)=default
int getInt(const char *property) const
void set(const char *property, int32_t i)
QLatin1StringView name() const
void set(const char *property, const QGstObject &o)
static void qDeleteFromVoidPointer(void *ptr)
QGString getString(const char *property) const
void disconnect(gulong handlerId)
QGstObject getGstObject(const char *property) const
QLatin1StringView typeName() const
void set(const char *property, const char *str)
bool getBool(const char *property) const
QGstObject & operator=(QGstObject &&) noexcept=default
void set(const char *property, void *object, GDestroyNotify destroyFunction)
void set(const char *property, std::unique_ptr< Object > object)
void set(const char *property, Object *object, GDestroyNotify destroyFunction)
void set(const char *property, bool b)
QGstObject(const QGstObject &)=default
quint64 getUInt64(const char *property) const
QGstStructureView getStructure(const char *property) const
qint64 getInt64(const char *property) const
void set(const char *property, const QGstCaps &c)
float getFloat(const char *property) const
QGstObject(QGstObject &&) noexcept=default
uint getUInt(const char *property) const
GstObject * object() const
bool link(const QGstPad &sink) const
GstEvent * stickyEvent(GstEventType type)
void modifyPipelineInIdleProbe(Functor &&f)
QGstTagListHandle tags() const
QGstPad & operator=(QGstPad &&) noexcept=default
QGstPad(const QGstObject &o)
QGstPad(const QGstPad &)=default
QGstCaps queryCaps() const
void doInIdleProbe(Functor &&work)
QGstPad(GstPad *pad, RefMode mode)
QGstPad(QGstPad &&) noexcept=default
void sendFlushStartStop(bool resetTime)
QGString streamId() const
QGstPad & operator=(const QGstPad &)=default
void addProbe(T *instance, GstPadProbeType type)
std::optional< QPlatformMediaPlayer::TrackType > inferTrackTypeFromName() const
void addEosProbe(T *instance)
bool sendEvent(GstEvent *event)
QGstCaps currentCaps() const
QGstElement parent() const
bool unlink(const QGstPad &sink) const
QGstStructureView(const QUniqueGstStructureHandle &)
QGRange< float > frameRateRange() const
QGValue operator[](const char *fieldname) const
const GstStructure * structure
QUniqueGstStructureHandle clone() const
QList< QVideoFrameFormat::PixelFormat > pixelFormats() const
std::optional< QGRange< QSize > > resolutionRange() const
QGstreamerMessage getMessage()
std::optional< Fraction > pixelAspectRatio() const
QGstTagListHandle tags() const
QByteArrayView name() const
QGstStructureView(const GstStructure *)
void setSourceDevice(QIODevice *device) override
QAudioFormat audioFormat() const override
~QGstreamerAudioDecoder() override
QIODevice * sourceDevice() const override
void setSource(const QUrl &fileName) override
qint64 duration() const override
static q23::expected< QPlatformAudioDecoder *, QString > create(QAudioDecoder *parent)
QUrl source() const override
void setAudioFormat(const QAudioFormat &format) override
QAudioBuffer read() override
qint64 position() const override
bool processBusMessage(const QGstreamerMessage &message) override
bool canReadQrc() const override
QGstCaps capsForAudioFormat(const QAudioFormat &format)
Combined button and popup list for selecting options.
QGstCaps::MemoryFormat qMemoryFormatFromGstBuffer(GstBuffer *buffer)
DestinationType * qGstCheckedCast(SourceType *arg)
#define QGST_DEFINE_CAST_TRAITS(ClassName, MACRO_LABEL)
QVideoFrameFormat qVideoFrameFormatFromGstVideoInfo(const QGstVideoInfo &vidInfo)
void qForeachStreamInCollection(GstStreamCollection *collection, Functor &&f)
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void > qLinkGstElements(const Ts &...ts)
GstClockTime qGstClockTimeFromChrono(std::chrono::nanoseconds ns)
bool qIsGstObjectOfType(SourceType *arg)
GstVideoFormat qGstVideoFormatFromPixelFormat(QVideoFrameFormat::PixelFormat format)
DestinationType * qGstSafeCast(SourceType *arg)
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void > qUnlinkGstElements(const Ts &...ts)
QString qGstErrorMessageCannotFindElement(std::string_view element)
std::optional< QString > qGstErrorMessageIfElementsNotAvailable(const Arg &arg, Args... args)
QVideoFrame qCreateFrameFromGstBuffer(QGstBufferHandle buffer, const QGstVideoInfo &videoInfo)
#define QGST_DEFINE_CAST_TRAITS_FOR_INTERFACE(ClassName, MACRO_LABEL)
QVideoFrameFormat::PixelFormat qPixelFormatFromGstVideoFormat(GstVideoFormat format)
void qForeachStreamInCollection(const QGstStreamCollectionHandle &collection, Functor &&f)
@ GST_PLAY_FLAG_SOFT_VOLUME
@ GST_PLAY_FLAG_BUFFERING
@ GST_PLAY_FLAG_NATIVE_AUDIO
@ GST_PLAY_FLAG_NATIVE_VIDEO
QCompactGstMessageAdaptor(const QGstreamerMessage &m)
bool operator==(const QGRange &rhs) const
friend bool operator<(const QGString &lhs, const QGString &rhs)
friend bool operator<(const QLatin1StringView lhs, const QGString &rhs)
bool operator==(const QGString &str) const
QString toQString() const
bool operator!=(const QLatin1StringView str) const
bool operator!=(const QGString &str) const
QLatin1StringView asStringView() const
friend bool operator<(const QGString &lhs, const QLatin1StringView rhs)
bool operator==(const QLatin1StringView str) const
QByteArrayView asByteArrayView() const
std::optional< guint64 > dmaDrmModifier
GstVideoInfo gstVideoInfo
static constexpr Type invalidValue() noexcept
static bool unref(GstCaps *arg) noexcept
static GstCaps * ref(GstCaps *arg) noexcept
static bool unref(GstObject *arg) noexcept
static GstObject * ref(GstObject *arg) noexcept
static constexpr Type invalidValue() noexcept
result_type operator()(const argument_type &e) const noexcept