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
578 QGstPad staticPad(const char *name) const;
579 QGstPad src() const;
580 QGstPad sink() const;
581 QGstPad getRequestPad(const char *name) const;
582 void releaseRequestPad(const QGstPad &pad) const;
583
584 GstState state(std::chrono::nanoseconds timeout = std::chrono::seconds(0)) const;
585 GstStateChangeReturn setState(GstState state);
586 bool setStateSync(GstState state, std::chrono::nanoseconds timeout = std::chrono::seconds(1));
587 bool syncStateWithParent();
588 bool finishStateChange(std::chrono::nanoseconds timeout = std::chrono::seconds(5));
589 bool hasAsyncStateChange(std::chrono::nanoseconds timeout = std::chrono::seconds(0)) const;
591 std::chrono::nanoseconds timeout = std::chrono::seconds(5)) const;
592
593 void lockState(bool locked);
594 bool isStateLocked() const;
595
596 void sendEvent(GstEvent *event) const;
597 void sendEos() const;
598
603 std::optional<bool> canSeek() const;
604
605 template <auto Member, typename T>
607 {
608 struct Impl
609 {
610 static void callback(GstElement *e, GstPad *pad, gpointer userData)
611 {
612 (static_cast<T *>(userData)->*Member)(QGstElement(e, NeedsRef),
613 QGstPad(pad, NeedsRef));
614 };
615 };
616
617 return connect("pad-added", G_CALLBACK(Impl::callback), instance);
618 }
619 template <auto Member, typename T>
621 {
622 struct Impl
623 {
624 static void callback(GstElement *e, GstPad *pad, gpointer userData)
625 {
626 (static_cast<T *>(userData)->*Member)(QGstElement(e, NeedsRef),
627 QGstPad(pad, NeedsRef));
628 };
629 };
630
631 return connect("pad-removed", G_CALLBACK(Impl::callback), instance);
632 }
633 template <auto Member, typename T>
635 {
636 struct Impl
637 {
638 static void callback(GstElement *e, gpointer userData)
639 {
640 (static_cast<T *>(userData)->*Member)(QGstElement(e, NeedsRef));
641 };
642 };
643
644 return connect("no-more-pads", G_CALLBACK(Impl::callback), instance);
645 }
646
647 GstClockTime baseTime() const;
648 void setBaseTime(GstClockTime time) const;
649
650 GstElement *element() const;
651
652 QGstElement getParent() const;
653 QGstBin getParentBin() const;
655
656 void removeFromParent();
657 void dumpPipelineGraph(const char *filename) const;
658
659private:
660 QGstQueryHandle &positionQuery() const;
661 mutable QGstQueryHandle m_positionQuery;
662};
663
664// QGstPad implementations
665
666template <auto Member, typename T>
667void QGstPad::addProbe(T *instance, GstPadProbeType type)
668{
669 auto callback = [](GstPad *pad, GstPadProbeInfo *info, gpointer userData) {
670 return (static_cast<T *>(userData)->*Member)(QGstPad(pad, NeedsRef), info);
671 };
672
673 gst_pad_add_probe(pad(), type, callback, instance, nullptr);
674}
675
676template <typename Functor>
677void QGstPad::doInIdleProbe(Functor &&work)
678{
679 using namespace std::chrono_literals;
680
681 struct CallbackData
682 {
683 QSemaphore waitDone;
684 std::once_flag onceFlag;
685 Functor work;
686
687 void run()
688 {
689 std::call_once(onceFlag, [&] {
690 work();
691 });
692 }
693 };
694
695 CallbackData cd{ QSemaphore{}, {}, std::forward<Functor>(work) };
696
697 auto callback = [](GstPad *, GstPadProbeInfo *, gpointer p) {
698 auto cd = reinterpret_cast<CallbackData *>(p);
699 cd->run();
700 cd->waitDone.release();
701 return GST_PAD_PROBE_REMOVE;
702 };
703
704 gulong probe = gst_pad_add_probe(pad(), GST_PAD_PROBE_TYPE_IDLE, callback, &cd, nullptr);
705 if (probe == 0)
706 return; // probe was executed
707
708 bool success = cd.waitDone.try_acquire_for(250ms);
709 if (success)
710 return;
711
712 // the probe has not been executed for 250ms, probably because the element has transitioned
713 // from playing to paused. Flushing the pad would unblock paused pads
715
716 success = cd.waitDone.try_acquire_for(1s);
717 if (success)
718 return;
719
720 // if the idle probe still has not been called, we remove it and call it
721 // explicitly to avoid deadlocking the application. Probably not exactly safe,
722 // but better than deadlocking
723 qWarning() << "QGstPad::doInIdleProbe blocked for 1s. Executing the pad probe manually";
724 parent().dumpPipelineGraph("doInIdleProbeHang");
725 gst_pad_remove_probe(pad(), probe);
726 cd.run();
727}
728
729template <auto Member, typename T>
730void QGstPad::addEosProbe(T *instance)
731{
732 auto callback = [](GstPad *, GstPadProbeInfo *info, gpointer userData) {
733 if (GST_EVENT_TYPE(GST_PAD_PROBE_INFO_DATA(info)) != GST_EVENT_EOS)
734 return GST_PAD_PROBE_PASS;
735 (static_cast<T *>(userData)->*Member)();
736 return GST_PAD_PROBE_REMOVE;
737 };
738
739 gst_pad_add_probe(pad(), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, callback, instance, nullptr);
740}
741template <typename Functor>
743{
744 using namespace std::chrono_literals;
745
746 GstPadDirection direction = gst_pad_get_direction(pad());
747
748 switch (direction) {
749 case GstPadDirection::GST_PAD_SINK: {
750 // modifying a source: we need to flush the sink pad before we can modify downstream
751 // elements
753 doInIdleProbe(f);
754 return;
755 }
756 case GstPadDirection::GST_PAD_SRC: {
757 // modifying a sink: we need to use the idle probes iff the pipeline is playing
758 if (parent().state(1s) == GstState::GST_STATE_PLAYING)
759 doInIdleProbe(f);
760 else
761 f();
762 return;
763 }
764
765 default:
766 Q_UNREACHABLE();
767 }
768}
769
770template <typename... Ts>
771std::enable_if_t<(std::is_base_of_v<QGstElement, Ts> && ...), void>
772qLinkGstElements(const Ts &...ts)
773{
774 bool link_success = [&] {
775 if constexpr (sizeof...(Ts) == 2)
776 return gst_element_link(ts.element()...);
777 else
778 return gst_element_link_many(ts.element()..., nullptr);
779 }();
780
781 if (Q_UNLIKELY(!link_success)) {
782 qWarning() << "qLinkGstElements: could not link elements: "
783 << std::initializer_list<const char *>{
784 (GST_ELEMENT_NAME(ts.element()))...,
785 };
786 }
787}
788
789template <typename... Ts>
790std::enable_if_t<(std::is_base_of_v<QGstElement, Ts> && ...), void>
791qUnlinkGstElements(const Ts &...ts)
792{
793 if constexpr (sizeof...(Ts) == 2)
794 gst_element_unlink(ts.element()...);
795 else
796 gst_element_unlink_many(ts.element()..., nullptr);
797}
798
799class QGstBin : public QGstElement
800{
801public:
802 using QGstElement::QGstElement;
803 QGstBin(const QGstBin &) = default;
804 QGstBin(QGstBin &&) noexcept = default;
805 QGstBin &operator=(const QGstBin &) = default;
806 QGstBin &operator=(QGstBin &&) noexcept = default;
807
808 explicit QGstBin(GstBin *bin, RefMode mode = NeedsRef);
809 static QGstBin create(const char *name);
810 static QGstBin createFromFactory(const char *factory, const char *name);
811 static QGstBin createFromPipelineDescription(const QByteArray &pipelineDescription,
812 const char *name = nullptr,
813 bool ghostUnlinkedPads = false);
814 static QGstBin createFromPipelineDescription(const char *pipelineDescription,
815 const char *name = nullptr,
816 bool ghostUnlinkedPads = false);
817
818 template <typename... Ts>
819 std::enable_if_t<(std::is_base_of_v<QGstElement, Ts> && ...), void> add(const Ts &...ts)
820 {
821 if constexpr (sizeof...(Ts) == 1)
822 gst_bin_add(bin(), ts.element()...);
823 else
824 gst_bin_add_many(bin(), ts.element()..., nullptr);
825 }
826
827 template <typename... Ts>
828 std::enable_if_t<(std::is_base_of_v<QGstElement, Ts> && ...), void> remove(const Ts &...ts)
829 {
830 if constexpr (sizeof...(Ts) == 1)
831 gst_bin_remove(bin(), ts.element()...);
832 else
833 gst_bin_remove_many(bin(), ts.element()..., nullptr);
834 }
835
836 template <typename... Ts>
839 {
840 bool stateChangeSuccessful = (ts.setStateSync(GST_STATE_NULL) && ...);
841 Q_ASSERT(stateChangeSuccessful);
842 remove(ts...);
843 }
844
845 GstBin *bin() const;
846
847 void addGhostPad(const QGstElement &child, const char *name);
848 void addGhostPad(const char *name, const QGstPad &pad);
850
851 bool syncChildrenState();
852
853 void dumpGraph(const char *fileNamePrefix) const;
854
855 QGstElement findByName(const char *);
856
857 void recalculateLatency();
858};
859
861{
862public:
863 using QGstElement::QGstElement;
864
865 explicit QGstBaseSink(GstBaseSink *, RefMode);
866
867 QGstBaseSink(const QGstBaseSink &) = default;
868 QGstBaseSink(QGstBaseSink &&) noexcept = default;
869 QGstBaseSink &operator=(const QGstBaseSink &) = default;
870 QGstBaseSink &operator=(QGstBaseSink &&) noexcept = default;
871
872 void setSync(bool);
873
874 GstBaseSink *baseSink() const;
875};
876
878{
879public:
880 using QGstElement::QGstElement;
881
882 explicit QGstBaseSrc(GstBaseSrc *, RefMode);
883
884 QGstBaseSrc(const QGstBaseSrc &) = default;
885 QGstBaseSrc(QGstBaseSrc &&) noexcept = default;
886 QGstBaseSrc &operator=(const QGstBaseSrc &) = default;
887 QGstBaseSrc &operator=(QGstBaseSrc &&) noexcept = default;
888
889 GstBaseSrc *baseSrc() const;
890};
891
893{
894public:
895 using QGstBaseSink::QGstBaseSink;
896
897 explicit QGstAppSink(GstAppSink *, RefMode);
898
899 QGstAppSink(const QGstAppSink &) = default;
900 QGstAppSink(QGstAppSink &&) noexcept = default;
901 QGstAppSink &operator=(const QGstAppSink &) = default;
902 QGstAppSink &operator=(QGstAppSink &&) noexcept = default;
903
904 static QGstAppSink create(const char *name);
905
906 GstAppSink *appSink() const;
907
908 void setMaxBuffers(int);
909# if GST_CHECK_VERSION(1, 24, 0)
911# endif
912
913 void setCaps(const QGstCaps &caps);
914 void setCallbacks(GstAppSinkCallbacks &callbacks, gpointer user_data, GDestroyNotify notify);
915
917};
918
920{
921public:
922 using QGstBaseSrc::QGstBaseSrc;
923
924 explicit QGstAppSrc(GstAppSrc *, RefMode);
925
926 QGstAppSrc(const QGstAppSrc &) = default;
927 QGstAppSrc(QGstAppSrc &&) noexcept = default;
928 QGstAppSrc &operator=(const QGstAppSrc &) = default;
929 QGstAppSrc &operator=(QGstAppSrc &&) noexcept = default;
930
931 static QGstAppSrc create(const char *name);
932
933 GstAppSrc *appSrc() const;
934
935 void setCallbacks(GstAppSrcCallbacks &callbacks, gpointer user_data, GDestroyNotify notify);
936
937 GstFlowReturn pushBuffer(GstBuffer *); // take ownership
938};
939
940inline GstClockTime qGstClockTimeFromChrono(std::chrono::nanoseconds ns)
941{
942 return ns.count();
943}
944
945QString qGstErrorMessageCannotFindElement(std::string_view element);
946
947template <typename Arg, typename... Args>
949{
950 QGstElementFactoryHandle factory = QGstElement::findFactory(arg);
951 if (!factory)
952 return qGstErrorMessageCannotFindElement(arg);
953
954 if constexpr (sizeof...(args) != 0)
955 return qGstErrorMessageIfElementsNotAvailable(args...);
956 else
957 return std::nullopt;
958}
959
960template <typename Functor>
961void qForeachStreamInCollection(GstStreamCollection *collection, Functor &&f)
962{
963 guint size = gst_stream_collection_get_size(collection);
964 for (guint index = 0; index != size; ++index)
965 f(gst_stream_collection_get_stream(collection, index));
966}
967
968template <typename Functor>
969void qForeachStreamInCollection(const QGstStreamCollectionHandle &collection, Functor &&f)
970{
971 qForeachStreamInCollection(collection.get(), std::forward<Functor>(f));
972}
973
974QT_END_NAMESPACE
975
976namespace std {
977
978template <>
979struct hash<QT_PREPEND_NAMESPACE(QGstElement)>
980{
981 using argument_type = QT_PREPEND_NAMESPACE(QGstElement);
982 using result_type = size_t;
983 result_type operator()(const argument_type &e) const noexcept
984 {
985 return std::hash<void *>{}(e.element());
986 }
987};
988} // namespace std
989
990#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:750
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:767
QGObjectHandlerScopedConnection & operator=(QGObjectHandlerScopedConnection &&)=default
std::optional< int > toInt64() const
Definition qgst.cpp:95
std::optional< QGRange< int > > toIntRange() const
Definition qgst.cpp:124
std::optional< int > toInt() const
Definition qgst.cpp:88
QList< QAudioFormat::SampleFormat > getSampleFormats() const
int listSize() const
Definition qgst.cpp:150
bool isList() const
Definition qgst.cpp:145
T * getPointer() const
Definition qgst_p.h:273
QGstStructureView toStructure() const
Definition qgst.cpp:131
std::optional< QGRange< float > > getFractionRange() const
Definition qgst.cpp:115
const char * toString() const
Definition qgst.cpp:102
const GValue * value
Definition qgst_p.h:265
std::optional< float > getFraction() const
Definition qgst.cpp:107
QGValue at(int index) const
Definition qgst.cpp:155
bool isNull() const
Definition qgst.cpp:76
QGstCaps toCaps() const
Definition qgst.cpp:138
std::optional< bool > toBool() const
Definition qgst.cpp:81
QGValue(const GValue *v)
Definition qgst.cpp:74
QGstSampleHandle pullSample()
Definition qgst.cpp:1478
void setCallbacks(GstAppSinkCallbacks &callbacks, gpointer user_data, GDestroyNotify notify)
Definition qgst.cpp:1472
GstAppSink * appSink() const
Definition qgst.cpp:1450
void setCaps(const QGstCaps &caps)
Definition qgst.cpp:1467
void setMaxBuffers(int)
Definition qgst.cpp:1462
QGstAppSink(const QGstAppSink &)=default
QGstAppSink(QGstAppSink &&) noexcept=default
static QGstAppSink create(const char *name)
Definition qgst.cpp:1441
QGstAppSink(GstAppSink *, RefMode)
Definition qgst.cpp:1433
QGstAppSink & operator=(QGstAppSink &&) noexcept=default
QGstAppSink & operator=(const QGstAppSink &)=default
static QGstAppSrc create(const char *name)
Definition qgst.cpp:1496
QGstAppSrc & operator=(const QGstAppSrc &)=default
GstFlowReturn pushBuffer(GstBuffer *)
Definition qgst.cpp:1516
QGstAppSrc(const QGstAppSrc &)=default
void setCallbacks(GstAppSrcCallbacks &callbacks, gpointer user_data, GDestroyNotify notify)
Definition qgst.cpp:1510
QGstAppSrc & operator=(QGstAppSrc &&) noexcept=default
QGstAppSrc(GstAppSrc *, RefMode)
Definition qgst.cpp:1488
QGstAppSrc(QGstAppSrc &&) noexcept=default
GstAppSrc * appSrc() const
Definition qgst.cpp:1505
void setSync(bool)
Definition qgst.cpp:1406
QGstBaseSink & operator=(const QGstBaseSink &)=default
QGstBaseSink(GstBaseSink *, RefMode)
Definition qgst.cpp:1398
QGstBaseSink(const QGstBaseSink &)=default
GstBaseSink * baseSink() const
Definition qgst.cpp:1411
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:1418
GstBaseSrc * baseSrc() const
Definition qgst.cpp:1426
void addUnlinkedGhostPads(GstPadDirection)
Definition qgst.cpp:1353
QGstBin(QGstBin &&) noexcept=default
QGstBin & operator=(const QGstBin &)=default
QGstElement findByName(const char *)
Definition qgst.cpp:1383
void dumpGraph(const char *fileNamePrefix) const
Definition qgst.cpp:1375
void recalculateLatency()
Definition qgst.cpp:1391
GstBin * bin() const
Definition qgst.cpp:1338
static QGstBin create(const char *name)
Definition qgst.cpp:1285
void addGhostPad(const QGstElement &child, const char *name)
Definition qgst.cpp:1343
std::enable_if_t<(std::is_base_of_v< QGstElement, std::remove_reference_t< Ts > > &&...), void > stopAndRemoveElements(Ts &&...ts)
Definition qgst_p.h:838
QGstBin & operator=(QGstBin &&) noexcept=default
static QGstBin createFromPipelineDescription(const char *pipelineDescription, const char *name=nullptr, bool ghostUnlinkedPads=false)
Definition qgst.cpp:1306
QGstBin(const QGstBin &)=default
static QGstBin createFromFactory(const char *factory, const char *name)
Definition qgst.cpp:1290
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void > add(const Ts &...ts)
Definition qgst_p.h:819
void addGhostPad(const char *name, const QGstPad &pad)
Definition qgst.cpp:1348
bool syncChildrenState()
Definition qgst.cpp:1370
QGstBin(GstBin *bin, RefMode mode=NeedsRef)
Definition qgst.cpp:1330
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void > remove(const Ts &...ts)
Definition qgst_p.h:828
static QGstBin createFromPipelineDescription(const QByteArray &pipelineDescription, const char *name=nullptr, bool ghostUnlinkedPads=false)
Definition qgst.cpp:1300
void addPixelFormats(const QList< QVideoFrameFormat::PixelFormat > &formats, const char *modifier=nullptr)
Definition qgst.cpp:475
MemoryFormat memoryFormat() const
Definition qgst.cpp:551
QGstCaps & operator=(QGstCaps &&) noexcept=default
int size() const
Definition qgst.cpp:561
static QGstCaps fromCameraFormat(const QCameraFormat &format)
Definition qgst.cpp:522
static QGstCaps create()
Definition qgst.cpp:578
GstCaps * caps() const
Definition qgst.cpp:573
void setResolution(QSize)
Definition qgst.cpp:508
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:543
QGstCaps(QGstCaps &&) noexcept=default
QGstStructureView at(int index) const
Definition qgst.cpp:566
QGstClock(GstClock *clock, RefMode mode)
Definition qgst.cpp:928
GstClockTime time() const
Definition qgst.cpp:941
QGstClock()=default
GstClock * clock() const
Definition qgst.cpp:936
QGstClock(const QGstObject &o)
Definition qgst.cpp:920
void setBaseTime(GstClockTime time) const
Definition qgst.cpp:1213
GstStateChangeReturn setState(GstState state)
Definition qgst.cpp:1072
static QGstElement createFromFactory(const QGstElementFactoryHandle &, const char *name=nullptr)
Definition qgst.cpp:981
std::optional< std::chrono::nanoseconds > position() const
Definition qgst.cpp:1169
static QGstElement createFromDevice(const QGstDeviceHandle &, const char *name=nullptr)
Definition qgst.cpp:987
QGstElement & operator=(QGstElement &&) noexcept=default
QGObjectHandlerConnection onPadRemoved(T *instance)
Definition qgst_p.h:620
GstElement * element() const
Definition qgst.cpp:1218
static QGstElementFactoryHandle findFactory(const QByteArray &name)
Definition qgst.cpp:1027
void removeFromParent()
Definition qgst.cpp:1256
QGstElement(GstElement *element, RefMode mode)
Definition qgst.cpp:948
void lockState(bool locked)
Definition qgst.cpp:1130
QGstElement(const QGstElement &)=default
QGstPad getRequestPad(const char *name) const
Definition qgst.cpp:1047
QGstElement(QGstElement &&) noexcept=default
bool waitForAsyncStateChangeComplete(std::chrono::nanoseconds timeout=std::chrono::seconds(5)) const
Definition qgst.cpp:1117
std::optional< bool > canSeek() const
Definition qgst.cpp:1192
std::optional< std::chrono::nanoseconds > duration() const
Definition qgst.cpp:1150
bool finishStateChange(std::chrono::nanoseconds timeout=std::chrono::seconds(5))
Definition qgst.cpp:1096
bool setStateSync(GstState state, std::chrono::nanoseconds timeout=std::chrono::seconds(1))
Definition qgst.cpp:1077
bool isStateLocked() const
Definition qgst.cpp:1135
void sendEvent(GstEvent *event) const
Definition qgst.cpp:1140
void dumpPipelineGraph(const char *filename) const
Definition qgst.cpp:1262
QGstElement & operator=(const QGstElement &)=default
GstClockTime baseTime() const
Definition qgst.cpp:1208
static QGstElement createFromPipelineDescription(const QByteArray &)
Definition qgst.cpp:1014
void releaseRequestPad(const QGstPad &pad) const
Definition qgst.cpp:1052
static QGstElement createFromFactory(GstElementFactory *, const char *name=nullptr)
Definition qgst.cpp:973
bool syncStateWithParent()
Definition qgst.cpp:1090
static QGstElement createFromDevice(GstDevice *, const char *name=nullptr)
Definition qgst.cpp:992
QGstPad sink() const
Definition qgst.cpp:1042
QGstPad staticPad(const char *name) const
Definition qgst.cpp:1032
void sendEos() const
Definition qgst.cpp:1145
QGstBin getParentBin() const
Definition qgst.cpp:1231
std::optional< std::chrono::milliseconds > positionInMs() const
Definition qgst.cpp:1183
QGObjectHandlerConnection onPadAdded(T *instance)
Definition qgst_p.h:606
static QGstElement createFromFactory(const char *factory, const char *name=nullptr)
Definition qgst.cpp:956
bool hasAsyncStateChange(std::chrono::nanoseconds timeout=std::chrono::seconds(0)) const
Definition qgst.cpp:1109
static QGstElementFactoryHandle findFactory(const char *)
Definition qgst.cpp:1019
QGstElement getParent() const
Definition qgst.cpp:1223
QGObjectHandlerConnection onNoMorePads(T *instance)
Definition qgst_p.h:634
QGstPipeline getPipeline() const
Definition qgst.cpp:1239
static QGstElement createFromPipelineDescription(const char *)
Definition qgst.cpp:1000
GstState state(std::chrono::nanoseconds timeout=std::chrono::seconds(0)) const
Definition qgst.cpp:1057
QGstPad src() const
Definition qgst.cpp:1037
std::optional< std::chrono::milliseconds > durationInMs() const
Definition qgst.cpp:1160
T * getObject(const char *property) const
Definition qgst_p.h:434
void set(const char *property, double d)
Definition qgst.cpp:615
QGObjectHandlerConnection connect(const char *name, GCallback callback, gpointer userData)
Definition qgst.cpp:710
void * getObject(const char *property) const
Definition qgst.cpp:705
double getDouble(const char *property) const
Definition qgst.cpp:691
QGstObject & operator=(const QGstObject &)=default
int getInt(const char *property) const
Definition qgst.cpp:663
void set(const char *property, int32_t i)
Definition qgst.cpp:600
QLatin1StringView name() const
Definition qgst.cpp:741
void set(const char *property, const QGstObject &o)
Definition qgst.cpp:620
static void qDeleteFromVoidPointer(void *ptr)
Definition qgst_p.h:416
QGString getString(const char *property) const
Definition qgst.cpp:635
void disconnect(gulong handlerId)
Definition qgst.cpp:719
QGstObject getGstObject(const char *property) const
Definition qgst.cpp:698
QLatin1StringView typeName() const
Definition qgst.cpp:729
void set(const char *property, const char *str)
Definition qgst.cpp:585
bool getBool(const char *property) const
Definition qgst.cpp:649
GType type() const
Definition qgst.cpp:724
QGstObject & operator=(QGstObject &&) noexcept=default
void set(const char *property, void *object, GDestroyNotify destroyFunction)
Definition qgst.cpp:630
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:590
QGstObject(const QGstObject &)=default
quint64 getUInt64(const char *property) const
Definition qgst.cpp:670
QGstStructureView getStructure(const char *property) const
Definition qgst.cpp:642
qint64 getInt64(const char *property) const
Definition qgst.cpp:677
void set(const char *property, const QGstCaps &c)
Definition qgst.cpp:625
float getFloat(const char *property) const
Definition qgst.cpp:684
QGstObject(QGstObject &&) noexcept=default
uint getUInt(const char *property) const
Definition qgst.cpp:656
GstObject * object() const
Definition qgst.cpp:736
bool link(const QGstPad &sink) const
Definition qgst.cpp:847
GstEvent * stickyEvent(GstEventType type)
Definition qgst.cpp:881
void modifyPipelineInIdleProbe(Functor &&f)
Definition qgst_p.h:742
QGstTagListHandle tags() const
Definition qgst.cpp:813
QGstPad & operator=(QGstPad &&) noexcept=default
QGstPad(const QGstObject &o)
Definition qgst.cpp:787
bool isLinked() const
Definition qgst.cpp:842
bool unlinkPeer() const
Definition qgst.cpp:857
QGstPad(const QGstPad &)=default
QGstCaps queryCaps() const
Definition qgst.cpp:808
void doInIdleProbe(Functor &&work)
Definition qgst_p.h:677
GstPad * pad() const
Definition qgst.cpp:876
QGstPad(GstPad *pad, RefMode mode)
Definition qgst.cpp:795
QGstPad(QGstPad &&) noexcept=default
void sendFlushIfPaused()
Definition qgst.cpp:906
void sendFlushStartStop(bool resetTime)
Definition qgst.cpp:891
QGString streamId() const
Definition qgst.cpp:820
QGstPad & operator=(const QGstPad &)=default
void addProbe(T *instance, GstPadProbeType type)
Definition qgst_p.h:667
std::optional< QPlatformMediaPlayer::TrackType > inferTrackTypeFromName() const
Definition qgst.cpp:827
void addEosProbe(T *instance)
Definition qgst_p.h:730
bool sendEvent(GstEvent *event)
Definition qgst.cpp:886
QGstCaps currentCaps() const
Definition qgst.cpp:803
QGstElement parent() const
Definition qgst.cpp:871
bool unlink(const QGstPad &sink) const
Definition qgst.cpp:852
QGstPad peer() const
Definition qgst.cpp:866
QGstStructureView(const QUniqueGstStructureHandle &)
Definition qgst.cpp:164
bool isNull() const
Definition qgst.cpp:174
QGRange< float > frameRateRange() const
Definition qgst.cpp:242
QSize nativeSize() const
Definition qgst.cpp:360
QGValue operator[](const char *fieldname) const
Definition qgst.cpp:184
QVideoFrameFormat::PixelFormat pixelFormat() const
Definition qgst.cpp:219
const GstStructure * structure
Definition qgst_p.h:298
QUniqueGstStructureHandle clone() const
Definition qgst.cpp:169
std::optional< QGRange< QSize > > resolutionRange() const
Definition qgst.cpp:300
QGstreamerMessage getMessage()
Definition qgst.cpp:326
QGstCaps caps() const
Definition qgst.cpp:189
std::optional< Fraction > pixelAspectRatio() const
Definition qgst.cpp:333
QGstTagListHandle tags() const
Definition qgst.cpp:194
QSize resolution() const
Definition qgst.cpp:205
QByteArrayView name() const
Definition qgst.cpp:179
QGstStructureView(const GstStructure *)
Definition qgst.cpp:162
void setSourceDevice(QIODevice *device) override
QAudioFormat audioFormat() const override
QIODevice * sourceDevice() const override
void setSource(const QUrl &fileName) override
qint64 duration() const override
void setAudioFormat(const QAudioFormat &format) override
static QMaybe< QPlatformAudioDecoder * > create(QAudioDecoder *parent)
QAudioBuffer read() override
qint64 position() const override
bool processBusMessage(const QGstreamerMessage &message) override
bool canReadQrc() const override
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:961
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void > qLinkGstElements(const Ts &...ts)
Definition qgst_p.h:772
GstClockTime qGstClockTimeFromChrono(std::chrono::nanoseconds ns)
Definition qgst_p.h:940
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:791
QString qGstErrorMessageCannotFindElement(std::string_view element)
Definition qgst.cpp:1521
std::optional< QString > qGstErrorMessageIfElementsNotAvailable(const Arg &arg, Args... args)
Definition qgst_p.h:948
#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:969
@ 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
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:983