Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qgst_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 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
4#ifndef QGST_P_H
5#define QGST_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtCore/qdebug.h>
19#include <QtCore/qlist.h>
20#include <QtCore/qmutex.h>
21#include <QtCore/qsemaphore.h>
22
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>
29
30#include <gst/gst.h>
31#include <gst/app/gstappsink.h>
32#include <gst/app/gstappsrc.h>
33#include <gst/video/video-info.h>
34
36
37#include <type_traits>
38#ifdef __cpp_lib_three_way_comparison
39# include <compare>
40#endif
41
42#if QT_CONFIG(gstreamer_photography)
43# define GST_USE_UNSTABLE_API
44# include <gst/interfaces/photography.h>
45# undef GST_USE_UNSTABLE_API
46#endif
47
48
49QT_BEGIN_NAMESPACE
50
51namespace QGstImpl {
52
53template <typename T>
55{
56 // using Type = T;
57 // template <typename U>
58 // static bool isObjectOfType(U *);
59 // template <typename U>
60 // static T *cast(U *);
61};
62
63#define QGST_DEFINE_CAST_TRAITS(ClassName, MACRO_LABEL)
64 template <>
65 struct GstObjectTraits<ClassName>
66 {
67 using Type = ClassName;
68 template <typename U>
69 static bool isObjectOfType(U *arg)
70 {
71 return GST_IS_##MACRO_LABEL(arg);
72 }
73 template <typename U>
74 static Type *cast(U *arg)
75 {
76 return GST_##MACRO_LABEL##_CAST(arg);
77 }
78 template <typename U>
79 static Type *checked_cast(U *arg)
80 {
81 return GST_##MACRO_LABEL(arg);
82 }
83 };
84 static_assert(true, "ensure semicolon")
85
86#define QGST_DEFINE_CAST_TRAITS_FOR_INTERFACE(ClassName, MACRO_LABEL)
87 template <>
88 struct GstObjectTraits<ClassName>
89 {
90 using Type = ClassName;
91 template <typename U>
92 static bool isObjectOfType(U *arg)
93 {
94 return GST_IS_##MACRO_LABEL(arg);
95 }
96 template <typename U>
97 static Type *cast(U *arg)
98 {
99 return checked_cast(arg);
100 }
101 template <typename U>
102 static Type *checked_cast(U *arg)
103 {
104 return GST_##MACRO_LABEL(arg);
105 }
106 };
107 static_assert(true, "ensure semicolon")
108
119
121
122
123template <>
125{
126 using Type = GObject;
127 template <typename U>
128 static bool isObjectOfType(U *arg)
129 {
130 return G_IS_OBJECT(arg);
131 }
132 template <typename U>
133 static Type *cast(U *arg)
134 {
135 return G_OBJECT(arg);
136 }
137 template <typename U>
139 {
140 return G_OBJECT(arg);
141 }
142};
143
144#undef QGST_DEFINE_CAST_TRAITS
145#undef QGST_DEFINE_CAST_TRAITS_FOR_INTERFACE
146
147} // namespace QGstImpl
148
149template <typename DestinationType, typename SourceType>
150bool qIsGstObjectOfType(SourceType *arg)
151{
152 using Traits = QGstImpl::GstObjectTraits<DestinationType>;
153 return arg && Traits::isObjectOfType(arg);
154}
155
156template <typename DestinationType, typename SourceType>
157DestinationType *qGstSafeCast(SourceType *arg)
158{
159 using Traits = QGstImpl::GstObjectTraits<DestinationType>;
160 if (arg && Traits::isObjectOfType(arg))
161 return Traits::cast(arg);
162 return nullptr;
163}
164
165template <typename DestinationType, typename SourceType>
166DestinationType *qGstCheckedCast(SourceType *arg)
167{
168 using Traits = QGstImpl::GstObjectTraits<DestinationType>;
169 if (arg)
170 Q_ASSERT(Traits::isObjectOfType(arg));
171 return Traits::cast(arg);
172}
173
174class QSize;
176class QGstCaps;
177class QCameraFormat;
178
179template <typename T> struct QGRange
180{
183
184#ifdef __cpp_impl_three_way_comparison
185 auto operator<=> (const QGRange &) const = default;
186#else
187 bool operator==(const QGRange &rhs) const
188 {
189 return std::tie(min, max) == std::tie(rhs.min, rhs.max);
190 }
191#endif
192};
193
195{
197
198 QLatin1StringView asStringView() const { return QLatin1StringView{ get() }; }
199 QByteArrayView asByteArrayView() const { return QByteArrayView{ get() }; }
200 QString toQString() const { return QString::fromUtf8(get()); }
201
202#ifdef __cpp_lib_three_way_comparison
203 // clang-format off
204 friend auto operator<=>(const QGString &lhs, const QGString &rhs)
205 {
206 return lhs.asStringView() <=> rhs.asStringView();
207 }
208 friend auto operator<=>(const QGString &lhs, const QLatin1StringView rhs)
209 {
210 return lhs.asStringView() <=> rhs;
211 }
212 friend auto operator<=>(const QGString &lhs, const QByteArrayView rhs)
213 {
214 return lhs.asByteArrayView() <=> rhs;
215 }
216 friend auto operator<=>(const QLatin1StringView lhs, const QGString &rhs)
217 {
218 return lhs <=> rhs.asStringView();
219 }
220 friend auto operator<=>(const QByteArrayView lhs, const QGString &rhs)
221 {
222 return lhs <=> rhs.asByteArrayView();
223 }
224 // clang-format on
225#else
226 // remove once we're on c++20
227 bool operator==(const QGString &str) const { return asStringView() == str.asStringView(); }
228 bool operator==(const QLatin1StringView str) const { return asStringView() == str; }
229 bool operator==(const QByteArrayView str) const { return asByteArrayView() == str; }
230
231 bool operator!=(const QGString &str) const { return asStringView() != str.asStringView(); }
232 bool operator!=(const QLatin1StringView str) const { return asStringView() != str; }
233 bool operator!=(const QByteArrayView str) const { return asByteArrayView() != str; }
234
235 friend bool operator<(const QGString &lhs, const QGString &rhs)
236 {
237 return lhs.asStringView() < rhs.asStringView();
238 }
239 friend bool operator<(const QGString &lhs, const QLatin1StringView rhs)
240 {
241 return lhs.asStringView() < rhs;
242 }
243 friend bool operator<(const QGString &lhs, const QByteArrayView rhs)
244 {
245 return lhs.asByteArrayView() < rhs;
246 }
247 friend bool operator<(const QLatin1StringView lhs, const QGString &rhs)
248 {
249 return lhs < rhs.asStringView();
250 }
251 friend bool operator<(const QByteArrayView lhs, const QGString &rhs)
252 {
253 return lhs < rhs.asByteArrayView();
254 }
255#endif
256
257 explicit operator QByteArrayView() const { return asByteArrayView(); }
258 explicit operator QByteArray() const { return QByteArray{ asByteArrayView() }; }
259};
260
262{
263public:
264 explicit QGValue(const GValue *v);
265 const GValue *value;
266
267 bool isNull() const;
268
269 std::optional<bool> toBool() const;
270 std::optional<int> toInt() const;
271 std::optional<int> toInt64() const;
272 template<typename T>
273 T *getPointer() const
274 {
275 return value ? static_cast<T *>(g_value_get_pointer(value)) : nullptr;
276 }
277
278 const char *toString() const;
279 std::optional<float> getFraction() const;
280 std::optional<QGRange<float>> getFractionRange() const;
281 std::optional<QGRange<int>> toIntRange() const;
282
284 QGstCaps toCaps() const;
285
286 bool isList() const;
287 int listSize() const;
288 QGValue at(int index) const;
289
291};
292
294
296{
297public:
298 const GstStructure *structure = nullptr;
299 explicit QGstStructureView(const GstStructure *);
300 explicit QGstStructureView(const QUniqueGstStructureHandle &);
301
303
304 bool isNull() const;
305 QByteArrayView name() const;
306 QGValue operator[](const char *fieldname) const;
307
308 QGstCaps caps() const;
309 QGstTagListHandle tags() const;
310
311 QSize resolution() const;
313 QGRange<float> frameRateRange() const;
317 QSize nativeSize() const;
318};
319
321{
322 using Type = GstCaps *;
323 static constexpr Type invalidValue() noexcept { return nullptr; }
324 static GstCaps *ref(GstCaps *arg) noexcept { return gst_caps_ref(arg); }
325 static bool unref(GstCaps *arg) noexcept
326 {
327 gst_caps_unref(arg);
328 return true;
329 }
330};
331
333{
335
336public:
337 using BaseClass::BaseClass;
338 QGstCaps(const QGstCaps &) = default;
339 QGstCaps(QGstCaps &&) noexcept = default;
340 QGstCaps &operator=(const QGstCaps &) = default;
341 QGstCaps &operator=(QGstCaps &&) noexcept = default;
342
344
345 int size() const;
346 QGstStructureView at(int index) const;
347 GstCaps *caps() const;
348
351
352 void addPixelFormats(const QList<QVideoFrameFormat::PixelFormat> &formats, const char *modifier = nullptr);
353 void setResolution(QSize);
354
355 static QGstCaps create();
356
357 static QGstCaps fromCameraFormat(const QCameraFormat &format);
358
359 QGstCaps copy() const;
360};
361
363{
364 using Type = GstObject *;
365 static constexpr Type invalidValue() noexcept { return nullptr; }
366 static GstObject *ref(GstObject *arg) noexcept
367 {
368 gst_object_ref_sink(arg);
369 return arg;
370 }
371 static bool unref(GstObject *arg) noexcept
372 {
373 gst_object_unref(arg);
374 return true;
375 }
376};
377
379
381{
383
384public:
385 using BaseClass::BaseClass;
386 QGstObject(const QGstObject &) = default;
387 QGstObject(QGstObject &&) noexcept = default;
388
389 QGstObject &operator=(const QGstObject &) = default;
390 QGstObject &operator=(QGstObject &&) noexcept = default;
391
392 void set(const char *property, const char *str);
393 void set(const char *property, bool b);
394 void set(const char *property, int32_t i);
395 void set(const char *property, uint32_t i);
396 void set(const char *property, int64_t i);
397 void set(const char *property, uint64_t i);
398 void set(const char *property, double d);
399 void set(const char *property, const QGstObject &o);
400 void set(const char *property, const QGstCaps &c);
401 void set(const char *property, void *object, GDestroyNotify destroyFunction);
402
403 template <typename Object>
404 void set(const char *property, Object *object, GDestroyNotify destroyFunction)
405 {
406 set(property, static_cast<void *>(object), destroyFunction);
407 }
408
409 template <typename Object>
410 void set(const char *property, std::unique_ptr<Object> object)
411 {
412 set(property, static_cast<void *>(object.release()), qDeleteFromVoidPointer<Object>);
413 }
414
415 template <typename T>
416 static void qDeleteFromVoidPointer(void *ptr)
417 {
418 delete reinterpret_cast<T *>(ptr);
419 }
420
421 QGString getString(const char *property) const;
422 QGstStructureView getStructure(const char *property) const;
423 bool getBool(const char *property) const;
424 uint getUInt(const char *property) const;
425 int getInt(const char *property) const;
426 quint64 getUInt64(const char *property) const;
427 qint64 getInt64(const char *property) const;
428 float getFloat(const char *property) const;
429 double getDouble(const char *property) const;
430 QGstObject getGstObject(const char *property) const;
431 void *getObject(const char *property) const;
432
433 template <typename T>
434 T *getObject(const char *property) const
435 {
436 void *rawObject = getObject(property);
437 return reinterpret_cast<T *>(rawObject);
438 }
439
440 QGObjectHandlerConnection connect(const char *name, GCallback callback, gpointer userData);
441 void disconnect(gulong handlerId);
442
443 GType type() const;
445 GstObject *object() const;
446 QLatin1StringView name() const;
447};
448
450{
451public:
452 QGObjectHandlerConnection(QGstObject object, gulong handler);
453
459
460 void disconnect();
461
462private:
463 static constexpr gulong invalidHandlerId = std::numeric_limits<gulong>::max();
464
465 QGstObject object;
466 gulong handlerId = invalidHandlerId;
467};
468
469// disconnects in dtor
488
489class QGstElement;
490
491class QGstPad : public QGstObject
492{
493public:
494 using QGstObject::QGstObject;
495 QGstPad(const QGstPad &) = default;
496 QGstPad(QGstPad &&) noexcept = default;
497
498 explicit QGstPad(const QGstObject &o);
499 explicit QGstPad(GstPad *pad, RefMode mode);
500
501 QGstPad &operator=(const QGstPad &) = default;
502 QGstPad &operator=(QGstPad &&) noexcept = default;
503
504 QGstCaps currentCaps() const;
505 QGstCaps queryCaps() const;
506
507 QGstTagListHandle tags() const;
508 QGString streamId() const;
509
511 inferTrackTypeFromName() const; // for decodebin3 etc
512
513 bool isLinked() const;
514 bool link(const QGstPad &sink) const;
515 bool unlink(const QGstPad &sink) const;
516 bool unlinkPeer() const;
517 QGstPad peer() const;
518 QGstElement parent() const;
519
520 GstPad *pad() const;
521
522 GstEvent *stickyEvent(GstEventType type);
523 bool sendEvent(GstEvent *event);
524 void sendFlushStartStop(bool resetTime);
525
526 template <auto Member, typename T>
527 void addProbe(T *instance, GstPadProbeType type);
528
529 template <typename Functor>
530 void doInIdleProbe(Functor &&work);
531
532 template <auto Member, typename T>
533 void addEosProbe(T *instance);
534
535 template <typename Functor>
536 void modifyPipelineInIdleProbe(Functor &&f);
537
538 void sendFlushIfPaused();
539};
540
541class QGstClock : public QGstObject
542{
543public:
544 QGstClock() = default;
545 explicit QGstClock(const QGstObject &o);
546 explicit QGstClock(GstClock *clock, RefMode mode);
547
548 GstClock *clock() const;
549 GstClockTime time() const;
550};
551
552class QGstBin;
553class QGstPipeline;
554
556{
557public:
558 using QGstObject::QGstObject;
559
560 QGstElement(const QGstElement &) = default;
561 QGstElement(QGstElement &&) noexcept = default;
562 QGstElement &operator=(const QGstElement &) = default;
563 QGstElement &operator=(QGstElement &&) noexcept = default;
564
565 explicit QGstElement(GstElement *element, RefMode mode);
566 static QGstElement createFromFactory(const char *factory, const char *name = nullptr);
567 static QGstElement createFromFactory(GstElementFactory *, const char *name = nullptr);
568 static QGstElement createFromFactory(const QGstElementFactoryHandle &,
569 const char *name = nullptr);
570 static QGstElement createFromDevice(const QGstDeviceHandle &, const char *name = nullptr);
571 static QGstElement createFromDevice(GstDevice *, const char *name = nullptr);
572 static QGstElement createFromPipelineDescription(const char *);
573 static QGstElement createFromPipelineDescription(const QByteArray &);
574
575 static QGstElementFactoryHandle findFactory(const char *);
576 static QGstElementFactoryHandle findFactory(const QByteArray &name);
577
579
580 QGstPad staticPad(const char *name) const;
581 QGstPad src() const;
582 QGstPad sink() const;
583 QGstPad getRequestPad(const char *name) const;
584 void releaseRequestPad(const QGstPad &pad) const;
585
586 GstState state(std::chrono::nanoseconds timeout = std::chrono::seconds(0)) const;
587 GstStateChangeReturn setState(GstState state);
588 bool setStateSync(GstState state, std::chrono::nanoseconds timeout = std::chrono::seconds(1));
589 bool syncStateWithParent();
590 bool finishStateChange(std::chrono::nanoseconds timeout = std::chrono::seconds(5));
591 bool hasAsyncStateChange(std::chrono::nanoseconds timeout = std::chrono::seconds(0)) const;
593 std::chrono::nanoseconds timeout = std::chrono::seconds(5)) const;
594
595 void lockState(bool locked);
596 bool isStateLocked() const;
597
598 void sendEvent(GstEvent *event) const;
599 void sendEos() const;
600
605 std::optional<bool> canSeek() const;
606
607 template <auto Member, typename T>
609 {
610 struct Impl
611 {
612 static void callback(GstElement *e, GstPad *pad, gpointer userData)
613 {
614 (static_cast<T *>(userData)->*Member)(QGstElement(e, NeedsRef),
615 QGstPad(pad, NeedsRef));
616 };
617 };
618
619 return connect("pad-added", G_CALLBACK(Impl::callback), instance);
620 }
621 template <auto Member, typename T>
623 {
624 struct Impl
625 {
626 static void callback(GstElement *e, GstPad *pad, gpointer userData)
627 {
628 (static_cast<T *>(userData)->*Member)(QGstElement(e, NeedsRef),
629 QGstPad(pad, NeedsRef));
630 };
631 };
632
633 return connect("pad-removed", G_CALLBACK(Impl::callback), instance);
634 }
635 template <auto Member, typename T>
637 {
638 struct Impl
639 {
640 static void callback(GstElement *e, gpointer userData)
641 {
642 (static_cast<T *>(userData)->*Member)(QGstElement(e, NeedsRef));
643 };
644 };
645
646 return connect("no-more-pads", G_CALLBACK(Impl::callback), instance);
647 }
648
649 GstClockTime baseTime() const;
650 void setBaseTime(GstClockTime time) const;
651
652 GstElement *element() const;
653
654 QGstElement getParent() const;
655 QGstBin getParentBin() const;
657 QGstBin getRootBin() const;
658
659 void removeFromParent();
660 void dumpPipelineGraph(const char *filename) const;
661
662private:
663 QGstQueryHandle &positionQuery() const;
664 mutable QGstQueryHandle m_positionQuery;
665};
666
667// QGstPad implementations
668
669template <auto Member, typename T>
670void QGstPad::addProbe(T *instance, GstPadProbeType type)
671{
672 auto callback = [](GstPad *pad, GstPadProbeInfo *info, gpointer userData) {
673 return (static_cast<T *>(userData)->*Member)(QGstPad(pad, NeedsRef), info);
674 };
675
676 gst_pad_add_probe(pad(), type, callback, instance, nullptr);
677}
678
679template <typename Functor>
680void QGstPad::doInIdleProbe(Functor &&work)
681{
682 using namespace std::chrono_literals;
683
684 struct CallbackData
685 {
686 QSemaphore waitDone;
687 std::once_flag onceFlag;
688 Functor work;
689
690 void run()
691 {
692 std::call_once(onceFlag, [&] {
693 work();
694 });
695 }
696 };
697
698 CallbackData cd{ QSemaphore{}, {}, std::forward<Functor>(work) };
699
700 auto callback = [](GstPad *, GstPadProbeInfo *, gpointer p) {
701 auto cd = reinterpret_cast<CallbackData *>(p);
702 cd->run();
703 cd->waitDone.release();
704 return GST_PAD_PROBE_REMOVE;
705 };
706
707 gulong probe = gst_pad_add_probe(pad(), GST_PAD_PROBE_TYPE_IDLE, callback, &cd, nullptr);
708 if (probe == 0)
709 return; // probe was executed
710
711 bool success = cd.waitDone.try_acquire_for(250ms);
712 if (success)
713 return;
714
715 // the probe has not been executed for 250ms, probably because the element has transitioned
716 // from playing to paused. Flushing the pad would unblock paused pads
718
719 success = cd.waitDone.try_acquire_for(1s);
720 if (success)
721 return;
722
723 // if the idle probe still has not been called, we remove it and call it
724 // explicitly to avoid deadlocking the application. Probably not exactly safe,
725 // but better than deadlocking
726 qWarning() << "QGstPad::doInIdleProbe blocked for 1s. Executing the pad probe manually";
727 parent().dumpPipelineGraph("doInIdleProbeHang");
728 gst_pad_remove_probe(pad(), probe);
729 cd.run();
730}
731
732template <auto Member, typename T>
733void QGstPad::addEosProbe(T *instance)
734{
735 auto callback = [](GstPad *, GstPadProbeInfo *info, gpointer userData) {
736 if (GST_EVENT_TYPE(GST_PAD_PROBE_INFO_DATA(info)) != GST_EVENT_EOS)
737 return GST_PAD_PROBE_PASS;
738 (static_cast<T *>(userData)->*Member)();
739 return GST_PAD_PROBE_REMOVE;
740 };
741
742 gst_pad_add_probe(pad(), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, callback, instance, nullptr);
743}
744template <typename Functor>
746{
747 using namespace std::chrono_literals;
748
749 GstPadDirection direction = gst_pad_get_direction(pad());
750
751 switch (direction) {
752 case GstPadDirection::GST_PAD_SINK: {
753 // modifying a source: we need to flush the sink pad before we can modify downstream
754 // elements
756 doInIdleProbe(f);
757 return;
758 }
759 case GstPadDirection::GST_PAD_SRC: {
760 // modifying a sink: we need to use the idle probes iff the pipeline is playing
761 if (parent().state(1s) == GstState::GST_STATE_PLAYING)
762 doInIdleProbe(f);
763 else
764 f();
765 return;
766 }
767
768 default:
769 Q_UNREACHABLE();
770 }
771}
772
773template <typename... Ts>
774std::enable_if_t<(std::is_base_of_v<QGstElement, Ts> && ...), void>
775qLinkGstElements(const Ts &...ts)
776{
777 bool link_success = [&] {
778 if constexpr (sizeof...(Ts) == 2)
779 return gst_element_link(ts.element()...);
780 else
781 return gst_element_link_many(ts.element()..., nullptr);
782 }();
783
784 if (Q_UNLIKELY(!link_success)) {
785 qWarning() << "qLinkGstElements: could not link elements: "
786 << std::initializer_list<const char *>{
787 (GST_ELEMENT_NAME(ts.element()))...,
788 };
789 }
790}
791
792template <typename... Ts>
793std::enable_if_t<(std::is_base_of_v<QGstElement, Ts> && ...), void>
794qUnlinkGstElements(const Ts &...ts)
795{
796 if constexpr (sizeof...(Ts) == 2)
797 gst_element_unlink(ts.element()...);
798 else
799 gst_element_unlink_many(ts.element()..., nullptr);
800}
801
802class QGstBin : public QGstElement
803{
804public:
805 using QGstElement::QGstElement;
806 QGstBin(const QGstBin &) = default;
807 QGstBin(QGstBin &&) noexcept = default;
808 QGstBin &operator=(const QGstBin &) = default;
809 QGstBin &operator=(QGstBin &&) noexcept = default;
810
811 explicit QGstBin(GstBin *bin, RefMode mode = NeedsRef);
812 static QGstBin create(const char *name);
813 static QGstBin createFromFactory(const char *factory, const char *name);
814 static QGstBin createFromPipelineDescription(const QByteArray &pipelineDescription,
815 const char *name = nullptr,
816 bool ghostUnlinkedPads = false);
817 static QGstBin createFromPipelineDescription(const char *pipelineDescription,
818 const char *name = nullptr,
819 bool ghostUnlinkedPads = false);
820
821 template <typename... Ts>
822 std::enable_if_t<(std::is_base_of_v<QGstElement, Ts> && ...), void> add(const Ts &...ts)
823 {
824 if constexpr (sizeof...(Ts) == 1)
825 gst_bin_add(bin(), ts.element()...);
826 else
827 gst_bin_add_many(bin(), ts.element()..., nullptr);
828 }
829
830 template <typename... Ts>
831 std::enable_if_t<(std::is_base_of_v<QGstElement, Ts> && ...), void> remove(const Ts &...ts)
832 {
833 if constexpr (sizeof...(Ts) == 1)
834 gst_bin_remove(bin(), ts.element()...);
835 else
836 gst_bin_remove_many(bin(), ts.element()..., nullptr);
837 }
838
839 template <typename... Ts>
842 {
843 bool stateChangeSuccessful = (ts.setStateSync(GST_STATE_NULL) && ...);
844 Q_ASSERT(stateChangeSuccessful);
845 remove(ts...);
846 }
847
848 GstBin *bin() const;
849
850 void addGhostPad(const QGstElement &child, const char *name);
851 void addGhostPad(const char *name, const QGstPad &pad);
853
854 bool syncChildrenState();
855
856 void dumpGraph(const char *fileNamePrefix, bool includeTimestamp = true) const;
857
858 QGstElement findByName(const char *);
859
860 void recalculateLatency();
861};
862
864{
865public:
866 using QGstElement::QGstElement;
867
868 explicit QGstBaseSink(GstBaseSink *, RefMode);
869
870 QGstBaseSink(const QGstBaseSink &) = default;
871 QGstBaseSink(QGstBaseSink &&) noexcept = default;
872 QGstBaseSink &operator=(const QGstBaseSink &) = default;
873 QGstBaseSink &operator=(QGstBaseSink &&) noexcept = default;
874
875 void setSync(bool);
876
877 GstBaseSink *baseSink() const;
878};
879
881{
882public:
883 using QGstElement::QGstElement;
884
885 explicit QGstBaseSrc(GstBaseSrc *, RefMode);
886
887 QGstBaseSrc(const QGstBaseSrc &) = default;
888 QGstBaseSrc(QGstBaseSrc &&) noexcept = default;
889 QGstBaseSrc &operator=(const QGstBaseSrc &) = default;
890 QGstBaseSrc &operator=(QGstBaseSrc &&) noexcept = default;
891
892 GstBaseSrc *baseSrc() const;
893};
894
896{
897public:
898 using QGstBaseSink::QGstBaseSink;
899
900 explicit QGstAppSink(GstAppSink *, RefMode);
901
902 QGstAppSink(const QGstAppSink &) = default;
903 QGstAppSink(QGstAppSink &&) noexcept = default;
904 QGstAppSink &operator=(const QGstAppSink &) = default;
905 QGstAppSink &operator=(QGstAppSink &&) noexcept = default;
906
907 static QGstAppSink create(const char *name);
908
909 GstAppSink *appSink() const;
910
911 void setMaxBuffers(int);
912# if GST_CHECK_VERSION(1, 24, 0)
914# endif
915
916 void setCaps(const QGstCaps &caps);
917 void setCallbacks(GstAppSinkCallbacks &callbacks, gpointer user_data, GDestroyNotify notify);
918
920};
921
923{
924public:
925 using QGstBaseSrc::QGstBaseSrc;
926
927 explicit QGstAppSrc(GstAppSrc *, RefMode);
928
929 QGstAppSrc(const QGstAppSrc &) = default;
930 QGstAppSrc(QGstAppSrc &&) noexcept = default;
931 QGstAppSrc &operator=(const QGstAppSrc &) = default;
932 QGstAppSrc &operator=(QGstAppSrc &&) noexcept = default;
933
934 static QGstAppSrc create(const char *name);
935
936 GstAppSrc *appSrc() const;
937
938 void setCallbacks(GstAppSrcCallbacks &callbacks, gpointer user_data, GDestroyNotify notify);
939
940 GstFlowReturn pushBuffer(GstBuffer *); // take ownership
941};
942
943inline GstClockTime qGstClockTimeFromChrono(std::chrono::nanoseconds ns)
944{
945 return ns.count();
946}
947
948QString qGstErrorMessageCannotFindElement(std::string_view element);
949
950template <typename Arg, typename... Args>
952{
953 QGstElementFactoryHandle factory = QGstElement::findFactory(arg);
954 if (!factory)
955 return qGstErrorMessageCannotFindElement(arg);
956
957 if constexpr (sizeof...(args) != 0)
958 return qGstErrorMessageIfElementsNotAvailable(args...);
959 else
960 return std::nullopt;
961}
962
963template <typename Functor>
964void qForeachStreamInCollection(GstStreamCollection *collection, Functor &&f)
965{
966 guint size = gst_stream_collection_get_size(collection);
967 for (guint index = 0; index != size; ++index)
968 f(gst_stream_collection_get_stream(collection, index));
969}
970
971template <typename Functor>
972void qForeachStreamInCollection(const QGstStreamCollectionHandle &collection, Functor &&f)
973{
974 qForeachStreamInCollection(collection.get(), std::forward<Functor>(f));
975}
976
977QT_END_NAMESPACE
978
979namespace std {
980
981template <>
983{
985 using result_type = size_t;
986 result_type operator()(const argument_type &e) const noexcept
987 {
988 return std::hash<void *>{}(e.element());
989 }
990};
991} // namespace std
992
993#endif
The QAudioFormat class stores audio stream parameter information.
QGObjectHandlerConnection & operator=(const QGObjectHandlerConnection &)=default
QGObjectHandlerConnection & operator=(QGObjectHandlerConnection &&)=default
QGObjectHandlerConnection(QGstObject object, gulong handler)
Definition qgst.cpp:738
QGObjectHandlerConnection()=default
QGObjectHandlerConnection(const QGObjectHandlerConnection &)=default
QGObjectHandlerConnection(QGObjectHandlerConnection &&)=default
QGObjectHandlerScopedConnection(const QGObjectHandlerScopedConnection &)=delete
QGObjectHandlerScopedConnection & operator=(const QGObjectHandlerScopedConnection &)=delete
QGObjectHandlerScopedConnection(QGObjectHandlerScopedConnection &&)=default
QGObjectHandlerScopedConnection(QGObjectHandlerConnection connection)
Definition qgst.cpp:755
QGObjectHandlerScopedConnection & operator=(QGObjectHandlerScopedConnection &&)=default
std::optional< int > toInt64() const
Definition qgst.cpp:96
std::optional< QGRange< int > > toIntRange() const
Definition qgst.cpp:125
std::optional< int > toInt() const
Definition qgst.cpp:89
QList< QAudioFormat::SampleFormat > getSampleFormats() const
int listSize() const
Definition qgst.cpp:151
bool isList() const
Definition qgst.cpp:146
T * getPointer() const
Definition qgst_p.h:273
QGstStructureView toStructure() const
Definition qgst.cpp:132
std::optional< QGRange< float > > getFractionRange() const
Definition qgst.cpp:116
const char * toString() const
Definition qgst.cpp:103
const GValue * value
Definition qgst_p.h:265
std::optional< float > getFraction() const
Definition qgst.cpp:108
QGValue at(int index) const
Definition qgst.cpp:156
bool isNull() const
Definition qgst.cpp:77
QGstCaps toCaps() const
Definition qgst.cpp:139
std::optional< bool > toBool() const
Definition qgst.cpp:82
QGValue(const GValue *v)
Definition qgst.cpp:75
QGstSampleHandle pullSample()
Definition qgst.cpp:1494
void setCallbacks(GstAppSinkCallbacks &callbacks, gpointer user_data, GDestroyNotify notify)
Definition qgst.cpp:1488
GstAppSink * appSink() const
Definition qgst.cpp:1466
void setCaps(const QGstCaps &caps)
Definition qgst.cpp:1483
void setMaxBuffers(int)
Definition qgst.cpp:1478
QGstAppSink(const QGstAppSink &)=default
QGstAppSink(QGstAppSink &&) noexcept=default
static QGstAppSink create(const char *name)
Definition qgst.cpp:1457
QGstAppSink(GstAppSink *, RefMode)
Definition qgst.cpp:1449
QGstAppSink & operator=(QGstAppSink &&) noexcept=default
QGstAppSink & operator=(const QGstAppSink &)=default
static QGstAppSrc create(const char *name)
Definition qgst.cpp:1512
QGstAppSrc & operator=(const QGstAppSrc &)=default
GstFlowReturn pushBuffer(GstBuffer *)
Definition qgst.cpp:1532
QGstAppSrc(const QGstAppSrc &)=default
void setCallbacks(GstAppSrcCallbacks &callbacks, gpointer user_data, GDestroyNotify notify)
Definition qgst.cpp:1526
QGstAppSrc & operator=(QGstAppSrc &&) noexcept=default
QGstAppSrc(GstAppSrc *, RefMode)
Definition qgst.cpp:1504
QGstAppSrc(QGstAppSrc &&) noexcept=default
GstAppSrc * appSrc() const
Definition qgst.cpp:1521
void setSync(bool)
Definition qgst.cpp:1422
QGstBaseSink & operator=(const QGstBaseSink &)=default
QGstBaseSink(GstBaseSink *, RefMode)
Definition qgst.cpp:1414
QGstBaseSink(const QGstBaseSink &)=default
GstBaseSink * baseSink() const
Definition qgst.cpp:1427
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)
Definition qgst.cpp:1434
GstBaseSrc * baseSrc() const
Definition qgst.cpp:1442
void addUnlinkedGhostPads(GstPadDirection)
Definition qgst.cpp:1366
QGstBin(QGstBin &&) noexcept=default
void dumpGraph(const char *fileNamePrefix, bool includeTimestamp=true) const
Definition qgst.cpp:1388
QGstBin & operator=(const QGstBin &)=default
QGstElement findByName(const char *)
Definition qgst.cpp:1399
void recalculateLatency()
Definition qgst.cpp:1407
GstBin * bin() const
Definition qgst.cpp:1351
static QGstBin create(const char *name)
Definition qgst.cpp:1298
void addGhostPad(const QGstElement &child, const char *name)
Definition qgst.cpp:1356
std::enable_if_t<(std::is_base_of_v< QGstElement, std::remove_reference_t< Ts > > &&...), void > stopAndRemoveElements(Ts &&...ts)
Definition qgst_p.h:841
QGstBin & operator=(QGstBin &&) noexcept=default
static QGstBin createFromPipelineDescription(const char *pipelineDescription, const char *name=nullptr, bool ghostUnlinkedPads=false)
Definition qgst.cpp:1319
QGstBin(const QGstBin &)=default
static QGstBin createFromFactory(const char *factory, const char *name)
Definition qgst.cpp:1303
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void > add(const Ts &...ts)
Definition qgst_p.h:822
void addGhostPad(const char *name, const QGstPad &pad)
Definition qgst.cpp:1361
bool syncChildrenState()
Definition qgst.cpp:1383
QGstBin(GstBin *bin, RefMode mode=NeedsRef)
Definition qgst.cpp:1343
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void > remove(const Ts &...ts)
Definition qgst_p.h:831
static QGstBin createFromPipelineDescription(const QByteArray &pipelineDescription, const char *name=nullptr, bool ghostUnlinkedPads=false)
Definition qgst.cpp:1313
void addPixelFormats(const QList< QVideoFrameFormat::PixelFormat > &formats, const char *modifier=nullptr)
Definition qgst.cpp:463
MemoryFormat memoryFormat() const
Definition qgst.cpp:539
QGstCaps & operator=(QGstCaps &&) noexcept=default
int size() const
Definition qgst.cpp:549
static QGstCaps fromCameraFormat(const QCameraFormat &format)
Definition qgst.cpp:510
static QGstCaps create()
Definition qgst.cpp:566
GstCaps * caps() const
Definition qgst.cpp:561
void setResolution(QSize)
Definition qgst.cpp:496
QGstCaps & operator=(const QGstCaps &)=default
MemoryFormat
Definition qgst_p.h:343
@ DMABuf
Definition qgst_p.h:343
@ CpuMemory
Definition qgst_p.h:343
@ GLTexture
Definition qgst_p.h:343
QGstCaps(const QGstCaps &)=default
QGstCaps copy() const
Definition qgst.cpp:531
QGstCaps(QGstCaps &&) noexcept=default
QGstStructureView at(int index) const
Definition qgst.cpp:554
QGstClock(GstClock *clock, RefMode mode)
Definition qgst.cpp:916
GstClockTime time() const
Definition qgst.cpp:929
QGstClock()=default
GstClock * clock() const
Definition qgst.cpp:924
QGstClock(const QGstObject &o)
Definition qgst.cpp:908
void setBaseTime(GstClockTime time) const
Definition qgst.cpp:1211
GstStateChangeReturn setState(GstState state)
Definition qgst.cpp:1070
static QGstElement createFromFactory(const QGstElementFactoryHandle &, const char *name=nullptr)
Definition qgst.cpp:969
std::optional< std::chrono::nanoseconds > position() const
Definition qgst.cpp:1167
static QGstElement createFromDevice(const QGstDeviceHandle &, const char *name=nullptr)
Definition qgst.cpp:975
QGstElement & operator=(QGstElement &&) noexcept=default
QGObjectHandlerConnection onPadRemoved(T *instance)
Definition qgst_p.h:622
GstElement * element() const
Definition qgst.cpp:1216
static QGstElementFactoryHandle findFactory(const QByteArray &name)
Definition qgst.cpp:1015
void removeFromParent()
Definition qgst.cpp:1271
QGstElement(GstElement *element, RefMode mode)
Definition qgst.cpp:936
void lockState(bool locked)
Definition qgst.cpp:1128
QGstElement(const QGstElement &)=default
QGstBin getRootBin() const
Definition qgst.cpp:1237
QGstPad getRequestPad(const char *name) const
Definition qgst.cpp:1045
QGstElement(QGstElement &&) noexcept=default
bool waitForAsyncStateChangeComplete(std::chrono::nanoseconds timeout=std::chrono::seconds(5)) const
Definition qgst.cpp:1115
std::optional< bool > canSeek() const
Definition qgst.cpp:1190
std::optional< std::chrono::nanoseconds > duration() const
Definition qgst.cpp:1148
bool finishStateChange(std::chrono::nanoseconds timeout=std::chrono::seconds(5))
Definition qgst.cpp:1094
bool setStateSync(GstState state, std::chrono::nanoseconds timeout=std::chrono::seconds(1))
Definition qgst.cpp:1075
bool isStateLocked() const
Definition qgst.cpp:1133
void sendEvent(GstEvent *event) const
Definition qgst.cpp:1138
void dumpPipelineGraph(const char *filename) const
Definition qgst.cpp:1277
QGstElement & operator=(const QGstElement &)=default
GstClockTime baseTime() const
Definition qgst.cpp:1206
QByteArrayView factoryName() const
Definition qgst.cpp:1020
static QGstElement createFromPipelineDescription(const QByteArray &)
Definition qgst.cpp:1002
void releaseRequestPad(const QGstPad &pad) const
Definition qgst.cpp:1050
static QGstElement createFromFactory(GstElementFactory *, const char *name=nullptr)
Definition qgst.cpp:961
bool syncStateWithParent()
Definition qgst.cpp:1088
static QGstElement createFromDevice(GstDevice *, const char *name=nullptr)
Definition qgst.cpp:980
QGstPad sink() const
Definition qgst.cpp:1040
QGstPad staticPad(const char *name) const
Definition qgst.cpp:1030
void sendEos() const
Definition qgst.cpp:1143
QGstBin getParentBin() const
Definition qgst.cpp:1229
std::optional< std::chrono::milliseconds > positionInMs() const
Definition qgst.cpp:1181
QGObjectHandlerConnection onPadAdded(T *instance)
Definition qgst_p.h:608
static QGstElement createFromFactory(const char *factory, const char *name=nullptr)
Definition qgst.cpp:944
bool hasAsyncStateChange(std::chrono::nanoseconds timeout=std::chrono::seconds(0)) const
Definition qgst.cpp:1107
static QGstElementFactoryHandle findFactory(const char *)
Definition qgst.cpp:1007
QGstElement getParent() const
Definition qgst.cpp:1221
QGObjectHandlerConnection onNoMorePads(T *instance)
Definition qgst_p.h:636
QGstPipeline getPipeline() const
Definition qgst.cpp:1257
static QGstElement createFromPipelineDescription(const char *)
Definition qgst.cpp:988
GstState state(std::chrono::nanoseconds timeout=std::chrono::seconds(0)) const
Definition qgst.cpp:1055
QGstPad src() const
Definition qgst.cpp:1035
std::optional< std::chrono::milliseconds > durationInMs() const
Definition qgst.cpp:1158
T * getObject(const char *property) const
Definition qgst_p.h:434
void set(const char *property, double d)
Definition qgst.cpp:603
QGObjectHandlerConnection connect(const char *name, GCallback callback, gpointer userData)
Definition qgst.cpp:698
void * getObject(const char *property) const
Definition qgst.cpp:693
double getDouble(const char *property) const
Definition qgst.cpp:679
QGstObject & operator=(const QGstObject &)=default
int getInt(const char *property) const
Definition qgst.cpp:651
void set(const char *property, int32_t i)
Definition qgst.cpp:588
QLatin1StringView name() const
Definition qgst.cpp:729
void set(const char *property, const QGstObject &o)
Definition qgst.cpp:608
static void qDeleteFromVoidPointer(void *ptr)
Definition qgst_p.h:416
QGString getString(const char *property) const
Definition qgst.cpp:623
void disconnect(gulong handlerId)
Definition qgst.cpp:707
QGstObject getGstObject(const char *property) const
Definition qgst.cpp:686
QLatin1StringView typeName() const
Definition qgst.cpp:717
void set(const char *property, const char *str)
Definition qgst.cpp:573
bool getBool(const char *property) const
Definition qgst.cpp:637
GType type() const
Definition qgst.cpp:712
QGstObject & operator=(QGstObject &&) noexcept=default
void set(const char *property, void *object, GDestroyNotify destroyFunction)
Definition qgst.cpp:618
void set(const char *property, std::unique_ptr< Object > object)
Definition qgst_p.h:410
void set(const char *property, Object *object, GDestroyNotify destroyFunction)
Definition qgst_p.h:404
void set(const char *property, bool b)
Definition qgst.cpp:578
QGstObject(const QGstObject &)=default
quint64 getUInt64(const char *property) const
Definition qgst.cpp:658
QGstStructureView getStructure(const char *property) const
Definition qgst.cpp:630
qint64 getInt64(const char *property) const
Definition qgst.cpp:665
void set(const char *property, const QGstCaps &c)
Definition qgst.cpp:613
float getFloat(const char *property) const
Definition qgst.cpp:672
QGstObject(QGstObject &&) noexcept=default
uint getUInt(const char *property) const
Definition qgst.cpp:644
GstObject * object() const
Definition qgst.cpp:724
bool link(const QGstPad &sink) const
Definition qgst.cpp:835
GstEvent * stickyEvent(GstEventType type)
Definition qgst.cpp:869
void modifyPipelineInIdleProbe(Functor &&f)
Definition qgst_p.h:745
QGstTagListHandle tags() const
Definition qgst.cpp:801
QGstPad & operator=(QGstPad &&) noexcept=default
QGstPad(const QGstObject &o)
Definition qgst.cpp:775
bool isLinked() const
Definition qgst.cpp:830
bool unlinkPeer() const
Definition qgst.cpp:845
QGstPad(const QGstPad &)=default
QGstCaps queryCaps() const
Definition qgst.cpp:796
void doInIdleProbe(Functor &&work)
Definition qgst_p.h:680
GstPad * pad() const
Definition qgst.cpp:864
QGstPad(GstPad *pad, RefMode mode)
Definition qgst.cpp:783
QGstPad(QGstPad &&) noexcept=default
void sendFlushIfPaused()
Definition qgst.cpp:894
void sendFlushStartStop(bool resetTime)
Definition qgst.cpp:879
QGString streamId() const
Definition qgst.cpp:808
QGstPad & operator=(const QGstPad &)=default
void addProbe(T *instance, GstPadProbeType type)
Definition qgst_p.h:670
std::optional< QPlatformMediaPlayer::TrackType > inferTrackTypeFromName() const
Definition qgst.cpp:815
void addEosProbe(T *instance)
Definition qgst_p.h:733
bool sendEvent(GstEvent *event)
Definition qgst.cpp:874
QGstCaps currentCaps() const
Definition qgst.cpp:791
QGstElement parent() const
Definition qgst.cpp:859
bool unlink(const QGstPad &sink) const
Definition qgst.cpp:840
QGstPad peer() const
Definition qgst.cpp:854
QGstStructureView(const QUniqueGstStructureHandle &)
Definition qgst.cpp:165
bool isNull() const
Definition qgst.cpp:175
QGRange< float > frameRateRange() const
Definition qgst.cpp:243
QSize nativeSize() const
Definition qgst.cpp:348
QGValue operator[](const char *fieldname) const
Definition qgst.cpp:185
QVideoFrameFormat::PixelFormat pixelFormat() const
Definition qgst.cpp:220
const GstStructure * structure
Definition qgst_p.h:298
QUniqueGstStructureHandle clone() const
Definition qgst.cpp:170
std::optional< QGRange< QSize > > resolutionRange() const
Definition qgst.cpp:301
QGstreamerMessage getMessage()
Definition qgst.cpp:327
QGstCaps caps() const
Definition qgst.cpp:190
std::optional< Fraction > pixelAspectRatio() const
Definition qgst.cpp:334
QGstTagListHandle tags() const
Definition qgst.cpp:195
QSize resolution() const
Definition qgst.cpp:206
QByteArrayView name() const
Definition qgst.cpp:180
QGstStructureView(const GstStructure *)
Definition qgst.cpp:163
void setSourceDevice(QIODevice *device) override
QAudioFormat audioFormat() const override
QIODevice * sourceDevice() const override
void setSource(const QUrl &fileName) override
qint64 duration() const override
static q23::expected< QPlatformAudioDecoder *, QString > create(QAudioDecoder *parent)
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)
Definition qgstutils.cpp:83
Combined button and popup list for selecting options.
DestinationType * qGstCheckedCast(SourceType *arg)
Definition qgst_p.h:166
#define QGST_DEFINE_CAST_TRAITS(ClassName, MACRO_LABEL)
Definition qgst_p.h:63
void qForeachStreamInCollection(GstStreamCollection *collection, Functor &&f)
Definition qgst_p.h:964
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void > qLinkGstElements(const Ts &...ts)
Definition qgst_p.h:775
GstClockTime qGstClockTimeFromChrono(std::chrono::nanoseconds ns)
Definition qgst_p.h:943
bool qIsGstObjectOfType(SourceType *arg)
Definition qgst_p.h:150
DestinationType * qGstSafeCast(SourceType *arg)
Definition qgst_p.h:157
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void > qUnlinkGstElements(const Ts &...ts)
Definition qgst_p.h:794
QString qGstErrorMessageCannotFindElement(std::string_view element)
Definition qgst.cpp:1537
std::optional< QString > qGstErrorMessageIfElementsNotAvailable(const Arg &arg, Args... args)
Definition qgst_p.h:951
#define QGST_DEFINE_CAST_TRAITS_FOR_INTERFACE(ClassName, MACRO_LABEL)
Definition qgst_p.h:86
void qForeachStreamInCollection(const QGstStreamCollectionHandle &collection, Functor &&f)
Definition qgst_p.h:972
@ GST_PLAY_FLAG_AUDIO
@ GST_PLAY_FLAG_SOFT_VOLUME
@ GST_PLAY_FLAG_DOWNLOAD
@ GST_PLAY_FLAG_BUFFERING
@ GST_PLAY_FLAG_NATIVE_AUDIO
@ GST_PLAY_FLAG_NATIVE_VIDEO
@ GST_PLAY_FLAG_VIDEO
QCompactGstMessageAdaptor(const QGstreamerMessage &m)
T min
Definition qgst_p.h:181
T max
Definition qgst_p.h:182
bool operator==(const QGRange &rhs) const
Definition qgst_p.h:187
friend bool operator<(const QGString &lhs, const QGString &rhs)
Definition qgst_p.h:235
friend bool operator<(const QLatin1StringView lhs, const QGString &rhs)
Definition qgst_p.h:247
bool operator==(const QGString &str) const
Definition qgst_p.h:227
QString toQString() const
Definition qgst_p.h:200
bool operator!=(const QLatin1StringView str) const
Definition qgst_p.h:232
bool operator!=(const QGString &str) const
Definition qgst_p.h:231
QLatin1StringView asStringView() const
Definition qgst_p.h:198
friend bool operator<(const QGString &lhs, const QLatin1StringView rhs)
Definition qgst_p.h:239
bool operator==(const QLatin1StringView str) const
Definition qgst_p.h:228
QByteArrayView asByteArrayView() const
Definition qgst_p.h:199
static constexpr Type invalidValue() noexcept
Definition qgst_p.h:323
static bool unref(GstCaps *arg) noexcept
Definition qgst_p.h:325
static GstCaps * ref(GstCaps *arg) noexcept
Definition qgst_p.h:324
static bool unref(GstObject *arg) noexcept
Definition qgst_p.h:371
static GstObject * ref(GstObject *arg) noexcept
Definition qgst_p.h:366
static constexpr Type invalidValue() noexcept
Definition qgst_p.h:365
result_type operator()(const argument_type &e) const noexcept
Definition qgst_p.h:986