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
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)
37#else
38# define QT_GSTREAMER_SUPPORTS_GST_VIDEO_FORMAT_DMA_DRM 0
39#endif
40
42
43#include <type_traits>
44#ifdef __cpp_lib_three_way_comparison
45# include <compare>
46#endif
47
48#if QT_CONFIG(gstreamer_photography)
49# define GST_USE_UNSTABLE_API
50# include <gst/interfaces/photography.h>
51# undef GST_USE_UNSTABLE_API
52#endif
53
54
55QT_BEGIN_NAMESPACE
56
57namespace QGstImpl {
58
59template <typename T>
61{
62 // using Type = T;
63 // template <typename U>
64 // static bool isObjectOfType(U *);
65 // template <typename U>
66 // static T *cast(U *);
67};
68
69#define QGST_DEFINE_CAST_TRAITS(ClassName, MACRO_LABEL)
70 template <>
71 struct GstObjectTraits<ClassName>
72 {
73 using Type = ClassName;
74 template <typename U>
75 static bool isObjectOfType(U *arg)
76 {
77 return GST_IS_##MACRO_LABEL(arg);
78 }
79 template <typename U>
80 static Type *cast(U *arg)
81 {
82 return GST_##MACRO_LABEL##_CAST(arg);
83 }
84 template <typename U>
85 static Type *checked_cast(U *arg)
86 {
87 return GST_##MACRO_LABEL(arg);
88 }
89 };
90 static_assert(true, "ensure semicolon")
91
92#define QGST_DEFINE_CAST_TRAITS_FOR_INTERFACE(ClassName, MACRO_LABEL)
93 template <>
94 struct GstObjectTraits<ClassName>
95 {
96 using Type = ClassName;
97 template <typename U>
98 static bool isObjectOfType(U *arg)
99 {
100 return GST_IS_##MACRO_LABEL(arg);
101 }
102 template <typename U>
103 static Type *cast(U *arg)
104 {
105 return checked_cast(arg);
106 }
107 template <typename U>
108 static Type *checked_cast(U *arg)
109 {
110 return GST_##MACRO_LABEL(arg);
111 }
112 };
113 static_assert(true, "ensure semicolon")
114
125
127
128
129template <>
131{
132 using Type = GObject;
133 template <typename U>
134 static bool isObjectOfType(U *arg)
135 {
136 return G_IS_OBJECT(arg);
137 }
138 template <typename U>
139 static Type *cast(U *arg)
140 {
141 return G_OBJECT(arg);
142 }
143 template <typename U>
145 {
146 return G_OBJECT(arg);
147 }
148};
149
150#undef QGST_DEFINE_CAST_TRAITS
151#undef QGST_DEFINE_CAST_TRAITS_FOR_INTERFACE
152
153} // namespace QGstImpl
154
155template <typename DestinationType, typename SourceType>
156bool qIsGstObjectOfType(SourceType *arg)
157{
158 using Traits = QGstImpl::GstObjectTraits<DestinationType>;
159 return arg && Traits::isObjectOfType(arg);
160}
161
162template <typename DestinationType, typename SourceType>
163DestinationType *qGstSafeCast(SourceType *arg)
164{
165 using Traits = QGstImpl::GstObjectTraits<DestinationType>;
166 if (arg && Traits::isObjectOfType(arg))
167 return Traits::cast(arg);
168 return nullptr;
169}
170
171template <typename DestinationType, typename SourceType>
172DestinationType *qGstCheckedCast(SourceType *arg)
173{
174 using Traits = QGstImpl::GstObjectTraits<DestinationType>;
175 if (arg)
176 Q_ASSERT(Traits::isObjectOfType(arg));
177 return Traits::cast(arg);
178}
179
180GstVideoFormat qGstVideoFormatFromPixelFormat(QVideoFrameFormat::PixelFormat format);
182
183class QSize;
185class QGstCaps;
186class QCameraFormat;
187
193
195{
197
198 explicit QGstStructure(const char *name)
200 {
201 }
202
203 void setInt(const char *field, int value)
204 {
205 gst_structure_set(get(), field, G_TYPE_INT, value, nullptr);
206 }
207
208 void setString(const char *field, const char *value)
209 {
210 gst_structure_set(get(), field, G_TYPE_STRING, value, nullptr);
211 }
212
213 void setIntRange(const char *field, int min, int max)
214 {
215 gst_structure_set(get(), field, GST_TYPE_INT_RANGE, min, max, nullptr);
216 }
217
218 void setFractionRange(const char *field, Fraction min, Fraction max)
219 {
220 gst_structure_set(get(), field, GST_TYPE_FRACTION_RANGE, min.numerator,
221 min.denominator, max.numerator, max.denominator, nullptr);
222 }
223
224 void setValue(const char *field, const GValue *value)
225 {
226 gst_structure_set_value(get(), field, value);
227 }
228};
229
230template <typename T> struct QGRange
231{
234
235#ifdef __cpp_impl_three_way_comparison
236 auto operator<=> (const QGRange &) const = default;
237#else
238 bool operator==(const QGRange &rhs) const
239 {
240 return std::tie(min, max) == std::tie(rhs.min, rhs.max);
241 }
242#endif
243};
244
246{
248
249 QLatin1StringView asStringView() const { return QLatin1StringView{ get() }; }
250 QByteArrayView asByteArrayView() const { return QByteArrayView{ get() }; }
251 QString toQString() const { return QString::fromUtf8(get()); }
252
253#ifdef __cpp_lib_three_way_comparison
254 // clang-format off
255 friend auto operator<=>(const QGString &lhs, const QGString &rhs)
256 {
257 return lhs.asStringView() <=> rhs.asStringView();
258 }
259 friend auto operator<=>(const QGString &lhs, const QLatin1StringView rhs)
260 {
261 return lhs.asStringView() <=> rhs;
262 }
263 friend auto operator<=>(const QGString &lhs, const QByteArrayView rhs)
264 {
265 return lhs.asByteArrayView() <=> rhs;
266 }
267 friend auto operator<=>(const QLatin1StringView lhs, const QGString &rhs)
268 {
269 return lhs <=> rhs.asStringView();
270 }
271 friend auto operator<=>(const QByteArrayView lhs, const QGString &rhs)
272 {
273 return lhs <=> rhs.asByteArrayView();
274 }
275 // clang-format on
276#else
277 // remove once we're on c++20
278 bool operator==(const QGString &str) const { return asStringView() == str.asStringView(); }
279 bool operator==(const QLatin1StringView str) const { return asStringView() == str; }
280 bool operator==(const QByteArrayView str) const { return asByteArrayView() == str; }
281
282 bool operator!=(const QGString &str) const { return asStringView() != str.asStringView(); }
283 bool operator!=(const QLatin1StringView str) const { return asStringView() != str; }
284 bool operator!=(const QByteArrayView str) const { return asByteArrayView() != str; }
285
286 friend bool operator<(const QGString &lhs, const QGString &rhs)
287 {
288 return lhs.asStringView() < rhs.asStringView();
289 }
290 friend bool operator<(const QGString &lhs, const QLatin1StringView rhs)
291 {
292 return lhs.asStringView() < rhs;
293 }
294 friend bool operator<(const QGString &lhs, const QByteArrayView rhs)
295 {
296 return lhs.asByteArrayView() < rhs;
297 }
298 friend bool operator<(const QLatin1StringView lhs, const QGString &rhs)
299 {
300 return lhs < rhs.asStringView();
301 }
302 friend bool operator<(const QByteArrayView lhs, const QGString &rhs)
303 {
304 return lhs < rhs.asByteArrayView();
305 }
306#endif
307
308 explicit operator QByteArrayView() const { return asByteArrayView(); }
309 explicit operator QByteArray() const { return QByteArray{ asByteArrayView() }; }
310};
311
313{
314public:
315 explicit QGValue(const GValue *v);
316 const GValue *value;
317
318 bool isNull() const;
319
320 std::optional<bool> toBool() const;
321 std::optional<int> toInt() const;
322 std::optional<int> toInt64() const;
323 template<typename T>
324 T *getPointer() const
325 {
326 return value ? static_cast<T *>(g_value_get_pointer(value)) : nullptr;
327 }
328
329 const char *toString() const;
330 std::optional<float> getFraction() const;
331 std::optional<QGRange<float>> getFractionRange() const;
332 std::optional<QGRange<int>> toIntRange() const;
333
335 QGstCaps toCaps() const;
336
337 bool isList() const;
338 int listSize() const;
339 QGValue at(int index) const;
340
342};
343
345
347{
348public:
349 const GstStructure *structure = nullptr;
350 explicit QGstStructureView(const GstStructure *);
351 explicit QGstStructureView(const QUniqueGstStructureHandle &);
352
354
355 bool isNull() const;
356 QByteArrayView name() const;
357 QGValue operator[](const char *fieldname) const;
358
359 QGstCaps caps() const;
360 QGstTagListHandle tags() const;
361
362 QSize resolution() const;
364 QGRange<float> frameRateRange() const;
368 QSize nativeSize() const;
369};
370
372{
373 using Type = GstCaps *;
374 static constexpr Type invalidValue() noexcept { return nullptr; }
375 static GstCaps *ref(GstCaps *arg) noexcept { return gst_caps_ref(arg); }
376 static bool unref(GstCaps *arg) noexcept
377 {
378 gst_caps_unref(arg);
379 return true;
380 }
381};
382
384{
386
387public:
388 using BaseClass::BaseClass;
389 QGstCaps(const QGstCaps &) = default;
390 QGstCaps(QGstCaps &&) noexcept = default;
391 QGstCaps &operator=(const QGstCaps &) = default;
392 QGstCaps &operator=(QGstCaps &&) noexcept = default;
393
395
396 int size() const;
397 QGstStructureView at(int index) const;
398 GstCaps *caps() const;
399
402
403 void addPixelFormats(const QList<QVideoFrameFormat::PixelFormat> &formats,
404 const char* capsFeatures = nullptr);
405 void setResolution(QSize);
406
407 static QGstCaps create();
408
409 static QGstCaps fromCameraFormat(const QCameraFormat &format);
410
411 QGstCaps copy() const;
412};
413
415{
416 using Type = GstObject *;
417 static constexpr Type invalidValue() noexcept { return nullptr; }
418 static GstObject *ref(GstObject *arg) noexcept
419 {
420 gst_object_ref_sink(arg);
421 return arg;
422 }
423 static bool unref(GstObject *arg) noexcept
424 {
425 gst_object_unref(arg);
426 return true;
427 }
428};
429
431
433{
435
436public:
437 using BaseClass::BaseClass;
438 QGstObject(const QGstObject &) = default;
439 QGstObject(QGstObject &&) noexcept = default;
440
441 QGstObject &operator=(const QGstObject &) = default;
442 QGstObject &operator=(QGstObject &&) noexcept = default;
443
444 void set(const char *property, const char *str);
445 void set(const char *property, bool b);
446 void set(const char *property, int32_t i);
447 void set(const char *property, uint32_t i);
448 void set(const char *property, int64_t i);
449 void set(const char *property, uint64_t i);
450 void set(const char *property, double d);
451 void set(const char *property, const QGstObject &o);
452 void set(const char *property, const QGstCaps &c);
453 void set(const char *property, void *object, GDestroyNotify destroyFunction);
454
455 template <typename Object>
456 void set(const char *property, Object *object, GDestroyNotify destroyFunction)
457 {
458 set(property, static_cast<void *>(object), destroyFunction);
459 }
460
461 template <typename Object>
462 void set(const char *property, std::unique_ptr<Object> object)
463 {
464 set(property, static_cast<void *>(object.release()), qDeleteFromVoidPointer<Object>);
465 }
466
467 template <typename T>
468 static void qDeleteFromVoidPointer(void *ptr)
469 {
470 delete reinterpret_cast<T *>(ptr);
471 }
472
473 QGString getString(const char *property) const;
474 QGstStructureView getStructure(const char *property) const;
475 bool getBool(const char *property) const;
476 uint getUInt(const char *property) const;
477 int getInt(const char *property) const;
478 quint64 getUInt64(const char *property) const;
479 qint64 getInt64(const char *property) const;
480 float getFloat(const char *property) const;
481 double getDouble(const char *property) const;
482 QGstObject getGstObject(const char *property) const;
483 void *getObject(const char *property) const;
484
485 template <typename T>
486 T *getObject(const char *property) const
487 {
488 void *rawObject = getObject(property);
489 return reinterpret_cast<T *>(rawObject);
490 }
491
492 QGObjectHandlerConnection connect(const char *name, GCallback callback, gpointer userData);
493 void disconnect(gulong handlerId);
494
495 GType type() const;
497 GstObject *object() const;
498 QLatin1StringView name() const;
499};
500
502{
503public:
504 QGObjectHandlerConnection(QGstObject object, gulong handler);
505
511
512 void disconnect();
513
514private:
515 static constexpr gulong invalidHandlerId = std::numeric_limits<gulong>::max();
516
517 QGstObject object;
518 gulong handlerId = invalidHandlerId;
519};
520
521// disconnects in dtor
540
541class QGstElement;
542
543class QGstPad : public QGstObject
544{
545public:
546 using QGstObject::QGstObject;
547 QGstPad(const QGstPad &) = default;
548 QGstPad(QGstPad &&) noexcept = default;
549
550 explicit QGstPad(const QGstObject &o);
551 explicit QGstPad(GstPad *pad, RefMode mode);
552
553 QGstPad &operator=(const QGstPad &) = default;
554 QGstPad &operator=(QGstPad &&) noexcept = default;
555
556 QGstCaps currentCaps() const;
557 QGstCaps queryCaps() const;
558
559 QGstTagListHandle tags() const;
560 QGString streamId() const;
561
563 inferTrackTypeFromName() const; // for decodebin3 etc
564
565 bool isLinked() const;
566 bool link(const QGstPad &sink) const;
567 bool unlink(const QGstPad &sink) const;
568 bool unlinkPeer() const;
569 QGstPad peer() const;
570 QGstElement parent() const;
571
572 GstPad *pad() const;
573
574 GstEvent *stickyEvent(GstEventType type);
575 bool sendEvent(GstEvent *event);
576 void sendFlushStartStop(bool resetTime);
577
578 template <auto Member, typename T>
579 void addProbe(T *instance, GstPadProbeType type);
580
581 template <typename Functor>
582 void doInIdleProbe(Functor &&work);
583
584 template <auto Member, typename T>
585 void addEosProbe(T *instance);
586
587 template <typename Functor>
588 void modifyPipelineInIdleProbe(Functor &&f);
589
590 void sendFlushIfPaused();
591};
592
593class QGstClock : public QGstObject
594{
595public:
596 QGstClock() = default;
597 explicit QGstClock(const QGstObject &o);
598 explicit QGstClock(GstClock *clock, RefMode mode);
599
600 GstClock *clock() const;
601 GstClockTime time() const;
602};
603
604class QGstBin;
605class QGstPipeline;
606
608{
609public:
610 using QGstObject::QGstObject;
611
612 QGstElement(const QGstElement &) = default;
613 QGstElement(QGstElement &&) noexcept = default;
614 QGstElement &operator=(const QGstElement &) = default;
615 QGstElement &operator=(QGstElement &&) noexcept = default;
616
617 explicit QGstElement(GstElement *element, RefMode mode);
618 static QGstElement createFromFactory(const char *factory, const char *name = nullptr);
619 static QGstElement createFromFactory(GstElementFactory *, const char *name = nullptr);
620 static QGstElement createFromFactory(const QGstElementFactoryHandle &,
621 const char *name = nullptr);
622 static QGstElement createFromDevice(const QGstDeviceHandle &, const char *name = nullptr);
623 static QGstElement createFromDevice(GstDevice *, const char *name = nullptr);
624 static QGstElement createFromPipelineDescription(const char *);
625 static QGstElement createFromPipelineDescription(const QByteArray &);
626
627 static QGstElementFactoryHandle findFactory(const char *);
628 static QGstElementFactoryHandle findFactory(const QByteArray &name);
629
631
632 QGstPad staticPad(const char *name) const;
633 QGstPad src() const;
634 QGstPad sink() const;
635 QGstPad getRequestPad(const char *name) const;
636 void releaseRequestPad(const QGstPad &pad) const;
637
638 GstState state(std::chrono::nanoseconds timeout = std::chrono::seconds(0)) const;
639 GstStateChangeReturn setState(GstState state);
640 bool setStateSync(GstState state, std::chrono::nanoseconds timeout = std::chrono::seconds(1));
641 bool syncStateWithParent();
642 bool finishStateChange(std::chrono::nanoseconds timeout = std::chrono::seconds(5));
643 bool hasAsyncStateChange(std::chrono::nanoseconds timeout = std::chrono::seconds(0)) const;
645 std::chrono::nanoseconds timeout = std::chrono::seconds(5)) const;
646
647 void lockState(bool locked);
648 bool isStateLocked() const;
649
650 void sendEvent(GstEvent *event) const;
651 void sendEos() const;
652
657 std::optional<bool> canSeek() const;
658
659 template <auto Member, typename T>
661 {
662 struct Impl
663 {
664 static void callback(GstElement *e, GstPad *pad, gpointer userData)
665 {
666 (static_cast<T *>(userData)->*Member)(QGstElement(e, NeedsRef),
667 QGstPad(pad, NeedsRef));
668 };
669 };
670
671 return connect("pad-added", G_CALLBACK(Impl::callback), instance);
672 }
673 template <auto Member, typename T>
675 {
676 struct Impl
677 {
678 static void callback(GstElement *e, GstPad *pad, gpointer userData)
679 {
680 (static_cast<T *>(userData)->*Member)(QGstElement(e, NeedsRef),
681 QGstPad(pad, NeedsRef));
682 };
683 };
684
685 return connect("pad-removed", G_CALLBACK(Impl::callback), instance);
686 }
687 template <auto Member, typename T>
689 {
690 struct Impl
691 {
692 static void callback(GstElement *e, gpointer userData)
693 {
694 (static_cast<T *>(userData)->*Member)(QGstElement(e, NeedsRef));
695 };
696 };
697
698 return connect("no-more-pads", G_CALLBACK(Impl::callback), instance);
699 }
700
701 GstClockTime baseTime() const;
702 void setBaseTime(GstClockTime time) const;
703
704 GstElement *element() const;
705
706 QGstElement getParent() const;
707 QGstBin getParentBin() const;
709 QGstBin getRootBin() const;
710
711 void removeFromParent();
712 void dumpPipelineGraph(const char *filename) const;
713
714private:
715 QGstQueryHandle &positionQuery() const;
716 mutable QGstQueryHandle m_positionQuery;
717};
718
719// QGstPad implementations
720
721template <auto Member, typename T>
722void QGstPad::addProbe(T *instance, GstPadProbeType type)
723{
724 auto callback = [](GstPad *pad, GstPadProbeInfo *info, gpointer userData) {
725 return (static_cast<T *>(userData)->*Member)(QGstPad(pad, NeedsRef), info);
726 };
727
728 gst_pad_add_probe(pad(), type, callback, instance, nullptr);
729}
730
731template <typename Functor>
732void QGstPad::doInIdleProbe(Functor &&work)
733{
734 using namespace std::chrono_literals;
735
736 struct CallbackData
737 {
738 QSemaphore waitDone;
739 std::once_flag onceFlag;
740 Functor work;
741
742 void run()
743 {
744 std::call_once(onceFlag, [&] {
745 work();
746 });
747 }
748 };
749
750 CallbackData cd{ QSemaphore{}, {}, std::forward<Functor>(work) };
751
752 auto callback = [](GstPad *, GstPadProbeInfo *, gpointer p) {
753 auto cd = reinterpret_cast<CallbackData *>(p);
754 cd->run();
755 cd->waitDone.release();
756 return GST_PAD_PROBE_REMOVE;
757 };
758
759 gulong probe = gst_pad_add_probe(pad(), GST_PAD_PROBE_TYPE_IDLE, callback, &cd, nullptr);
760 if (probe == 0)
761 return; // probe was executed
762
763 bool success = cd.waitDone.try_acquire_for(250ms);
764 if (success)
765 return;
766
767 // the probe has not been executed for 250ms, probably because the element has transitioned
768 // from playing to paused. Flushing the pad would unblock paused pads
770
771 success = cd.waitDone.try_acquire_for(1s);
772 if (success)
773 return;
774
775 // if the idle probe still has not been called, we remove it and call it
776 // explicitly to avoid deadlocking the application. Probably not exactly safe,
777 // but better than deadlocking
778 qWarning() << "QGstPad::doInIdleProbe blocked for 1s. Executing the pad probe manually";
779 parent().dumpPipelineGraph("doInIdleProbeHang");
780 gst_pad_remove_probe(pad(), probe);
781 cd.run();
782}
783
784template <auto Member, typename T>
785void QGstPad::addEosProbe(T *instance)
786{
787 auto callback = [](GstPad *, GstPadProbeInfo *info, gpointer userData) {
788 if (GST_EVENT_TYPE(GST_PAD_PROBE_INFO_DATA(info)) != GST_EVENT_EOS)
789 return GST_PAD_PROBE_PASS;
790 (static_cast<T *>(userData)->*Member)();
791 return GST_PAD_PROBE_REMOVE;
792 };
793
794 gst_pad_add_probe(pad(), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, callback, instance, nullptr);
795}
796template <typename Functor>
798{
799 using namespace std::chrono_literals;
800
801 GstPadDirection direction = gst_pad_get_direction(pad());
802
803 switch (direction) {
804 case GstPadDirection::GST_PAD_SINK: {
805 // modifying a source: we need to flush the sink pad before we can modify downstream
806 // elements
808 doInIdleProbe(f);
809 return;
810 }
811 case GstPadDirection::GST_PAD_SRC: {
812 // modifying a sink: we need to use the idle probes iff the pipeline is playing
813 if (parent().state(1s) == GstState::GST_STATE_PLAYING)
814 doInIdleProbe(f);
815 else
816 f();
817 return;
818 }
819
820 default:
821 Q_UNREACHABLE();
822 }
823}
824
825template <typename... Ts>
826std::enable_if_t<(std::is_base_of_v<QGstElement, Ts> && ...), void>
827qLinkGstElements(const Ts &...ts)
828{
829 bool link_success = [&] {
830 if constexpr (sizeof...(Ts) == 2)
831 return gst_element_link(ts.element()...);
832 else
833 return gst_element_link_many(ts.element()..., nullptr);
834 }();
835
836 if (Q_UNLIKELY(!link_success)) {
837 qWarning() << "qLinkGstElements: could not link elements: "
838 << std::initializer_list<const char *>{
839 (GST_ELEMENT_NAME(ts.element()))...,
840 };
841 }
842}
843
844template <typename... Ts>
845std::enable_if_t<(std::is_base_of_v<QGstElement, Ts> && ...), void>
846qUnlinkGstElements(const Ts &...ts)
847{
848 if constexpr (sizeof...(Ts) == 2)
849 gst_element_unlink(ts.element()...);
850 else
851 gst_element_unlink_many(ts.element()..., nullptr);
852}
853
854class QGstBin : public QGstElement
855{
856public:
857 using QGstElement::QGstElement;
858 QGstBin(const QGstBin &) = default;
859 QGstBin(QGstBin &&) noexcept = default;
860 QGstBin &operator=(const QGstBin &) = default;
861 QGstBin &operator=(QGstBin &&) noexcept = default;
862
863 explicit QGstBin(GstBin *bin, RefMode mode = NeedsRef);
864 static QGstBin create(const char *name);
865 static QGstBin createFromFactory(const char *factory, const char *name);
866 static QGstBin createFromPipelineDescription(const QByteArray &pipelineDescription,
867 const char *name = nullptr,
868 bool ghostUnlinkedPads = false);
869 static QGstBin createFromPipelineDescription(const char *pipelineDescription,
870 const char *name = nullptr,
871 bool ghostUnlinkedPads = false);
872
873 template <typename... Ts>
874 std::enable_if_t<(std::is_base_of_v<QGstElement, Ts> && ...), void> add(const Ts &...ts)
875 {
876 if constexpr (sizeof...(Ts) == 1)
877 gst_bin_add(bin(), ts.element()...);
878 else
879 gst_bin_add_many(bin(), ts.element()..., nullptr);
880 }
881
882 template <typename... Ts>
883 std::enable_if_t<(std::is_base_of_v<QGstElement, Ts> && ...), void> remove(const Ts &...ts)
884 {
885 if constexpr (sizeof...(Ts) == 1)
886 gst_bin_remove(bin(), ts.element()...);
887 else
888 gst_bin_remove_many(bin(), ts.element()..., nullptr);
889 }
890
891 template <typename... Ts>
894 {
895 bool stateChangeSuccessful = (ts.setStateSync(GST_STATE_NULL) && ...);
896 Q_ASSERT(stateChangeSuccessful);
897 remove(ts...);
898 }
899
900 GstBin *bin() const;
901
902 void addGhostPad(const QGstElement &child, const char *name);
903 void addGhostPad(const char *name, const QGstPad &pad);
905
906 bool syncChildrenState();
907
908 void dumpGraph(const char *fileNamePrefix, bool includeTimestamp = true) const;
909
910 QGstElement findByName(const char *);
911
912 void recalculateLatency();
913};
914
916{
917public:
918 using QGstElement::QGstElement;
919
920 explicit QGstBaseSink(GstBaseSink *, RefMode);
921
922 QGstBaseSink(const QGstBaseSink &) = default;
923 QGstBaseSink(QGstBaseSink &&) noexcept = default;
924 QGstBaseSink &operator=(const QGstBaseSink &) = default;
925 QGstBaseSink &operator=(QGstBaseSink &&) noexcept = default;
926
927 void setSync(bool);
928
929 GstBaseSink *baseSink() const;
930};
931
933{
934public:
935 using QGstElement::QGstElement;
936
937 explicit QGstBaseSrc(GstBaseSrc *, RefMode);
938
939 QGstBaseSrc(const QGstBaseSrc &) = default;
940 QGstBaseSrc(QGstBaseSrc &&) noexcept = default;
941 QGstBaseSrc &operator=(const QGstBaseSrc &) = default;
942 QGstBaseSrc &operator=(QGstBaseSrc &&) noexcept = default;
943
944 GstBaseSrc *baseSrc() const;
945};
946
948{
949public:
950 using QGstBaseSink::QGstBaseSink;
951
952 explicit QGstAppSink(GstAppSink *, RefMode);
953
954 QGstAppSink(const QGstAppSink &) = default;
955 QGstAppSink(QGstAppSink &&) noexcept = default;
956 QGstAppSink &operator=(const QGstAppSink &) = default;
957 QGstAppSink &operator=(QGstAppSink &&) noexcept = default;
958
959 static QGstAppSink create(const char *name);
960
961 GstAppSink *appSink() const;
962
963 void setMaxBuffers(int);
964# if GST_CHECK_VERSION(1, 24, 0)
966# endif
967
968 void setCaps(const QGstCaps &caps);
969 void setCallbacks(GstAppSinkCallbacks &callbacks, gpointer user_data, GDestroyNotify notify);
970
972};
973
975{
976public:
977 using QGstBaseSrc::QGstBaseSrc;
978
979 explicit QGstAppSrc(GstAppSrc *, RefMode);
980
981 QGstAppSrc(const QGstAppSrc &) = default;
982 QGstAppSrc(QGstAppSrc &&) noexcept = default;
983 QGstAppSrc &operator=(const QGstAppSrc &) = default;
984 QGstAppSrc &operator=(QGstAppSrc &&) noexcept = default;
985
986 static QGstAppSrc create(const char *name);
987
988 GstAppSrc *appSrc() const;
989
990 void setCallbacks(GstAppSrcCallbacks &callbacks, gpointer user_data, GDestroyNotify notify);
991
992 GstFlowReturn pushBuffer(GstBuffer *); // take ownership
993};
994
995inline GstClockTime qGstClockTimeFromChrono(std::chrono::nanoseconds ns)
996{
997 return ns.count();
998}
999
1000QString qGstErrorMessageCannotFindElement(std::string_view element);
1001
1002template <typename Arg, typename... Args>
1004{
1005 QGstElementFactoryHandle factory = QGstElement::findFactory(arg);
1006 if (!factory)
1007 return qGstErrorMessageCannotFindElement(arg);
1008
1009 if constexpr (sizeof...(args) != 0)
1010 return qGstErrorMessageIfElementsNotAvailable(args...);
1011 else
1012 return std::nullopt;
1013}
1014
1015template <typename Functor>
1016void qForeachStreamInCollection(GstStreamCollection *collection, Functor &&f)
1017{
1018 guint size = gst_stream_collection_get_size(collection);
1019 for (guint index = 0; index != size; ++index)
1020 f(gst_stream_collection_get_stream(collection, index));
1021}
1022
1023template <typename Functor>
1024void qForeachStreamInCollection(const QGstStreamCollectionHandle &collection, Functor &&f)
1025{
1026 qForeachStreamInCollection(collection.get(), std::forward<Functor>(f));
1027}
1028
1031QVideoFrame qCreateFrameFromGstBuffer(QGstBufferHandle buffer, const QGstVideoInfo &videoInfo);
1032
1033QT_END_NAMESPACE
1034
1035namespace std {
1036
1037template <>
1039{
1041 using result_type = size_t;
1042 result_type operator()(const argument_type &e) const noexcept
1043 {
1044 return std::hash<void *>{}(e.element());
1045 }
1046};
1047} // namespace std
1048
1049#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:805
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:822
QGObjectHandlerScopedConnection & operator=(QGObjectHandlerScopedConnection &&)=default
std::optional< int > toInt64() const
Definition qgst.cpp:145
std::optional< QGRange< int > > toIntRange() const
Definition qgst.cpp:174
std::optional< int > toInt() const
Definition qgst.cpp:138
QList< QAudioFormat::SampleFormat > getSampleFormats() const
int listSize() const
Definition qgst.cpp:200
bool isList() const
Definition qgst.cpp:195
T * getPointer() const
Definition qgst_p.h:324
QGstStructureView toStructure() const
Definition qgst.cpp:181
std::optional< QGRange< float > > getFractionRange() const
Definition qgst.cpp:165
const char * toString() const
Definition qgst.cpp:152
const GValue * value
Definition qgst_p.h:316
std::optional< float > getFraction() const
Definition qgst.cpp:157
QGValue at(int index) const
Definition qgst.cpp:205
bool isNull() const
Definition qgst.cpp:126
QGstCaps toCaps() const
Definition qgst.cpp:188
std::optional< bool > toBool() const
Definition qgst.cpp:131
QGValue(const GValue *v)
Definition qgst.cpp:124
QGstSampleHandle pullSample()
Definition qgst.cpp:1561
void setCallbacks(GstAppSinkCallbacks &callbacks, gpointer user_data, GDestroyNotify notify)
Definition qgst.cpp:1555
GstAppSink * appSink() const
Definition qgst.cpp:1533
void setCaps(const QGstCaps &caps)
Definition qgst.cpp:1550
void setMaxBuffers(int)
Definition qgst.cpp:1545
QGstAppSink(const QGstAppSink &)=default
QGstAppSink(QGstAppSink &&) noexcept=default
static QGstAppSink create(const char *name)
Definition qgst.cpp:1524
QGstAppSink(GstAppSink *, RefMode)
Definition qgst.cpp:1516
QGstAppSink & operator=(QGstAppSink &&) noexcept=default
QGstAppSink & operator=(const QGstAppSink &)=default
static QGstAppSrc create(const char *name)
Definition qgst.cpp:1579
QGstAppSrc & operator=(const QGstAppSrc &)=default
GstFlowReturn pushBuffer(GstBuffer *)
Definition qgst.cpp:1599
QGstAppSrc(const QGstAppSrc &)=default
void setCallbacks(GstAppSrcCallbacks &callbacks, gpointer user_data, GDestroyNotify notify)
Definition qgst.cpp:1593
QGstAppSrc & operator=(QGstAppSrc &&) noexcept=default
QGstAppSrc(GstAppSrc *, RefMode)
Definition qgst.cpp:1571
QGstAppSrc(QGstAppSrc &&) noexcept=default
GstAppSrc * appSrc() const
Definition qgst.cpp:1588
void setSync(bool)
Definition qgst.cpp:1489
QGstBaseSink & operator=(const QGstBaseSink &)=default
QGstBaseSink(GstBaseSink *, RefMode)
Definition qgst.cpp:1481
QGstBaseSink(const QGstBaseSink &)=default
GstBaseSink * baseSink() const
Definition qgst.cpp:1494
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:1501
GstBaseSrc * baseSrc() const
Definition qgst.cpp:1509
void addUnlinkedGhostPads(GstPadDirection)
Definition qgst.cpp:1433
QGstBin(QGstBin &&) noexcept=default
void dumpGraph(const char *fileNamePrefix, bool includeTimestamp=true) const
Definition qgst.cpp:1455
QGstBin & operator=(const QGstBin &)=default
QGstElement findByName(const char *)
Definition qgst.cpp:1466
void recalculateLatency()
Definition qgst.cpp:1474
GstBin * bin() const
Definition qgst.cpp:1418
static QGstBin create(const char *name)
Definition qgst.cpp:1365
void addGhostPad(const QGstElement &child, const char *name)
Definition qgst.cpp:1423
std::enable_if_t<(std::is_base_of_v< QGstElement, std::remove_reference_t< Ts > > &&...), void > stopAndRemoveElements(Ts &&...ts)
Definition qgst_p.h:893
QGstBin & operator=(QGstBin &&) noexcept=default
static QGstBin createFromPipelineDescription(const char *pipelineDescription, const char *name=nullptr, bool ghostUnlinkedPads=false)
Definition qgst.cpp:1386
QGstBin(const QGstBin &)=default
static QGstBin createFromFactory(const char *factory, const char *name)
Definition qgst.cpp:1370
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void > add(const Ts &...ts)
Definition qgst_p.h:874
void addGhostPad(const char *name, const QGstPad &pad)
Definition qgst.cpp:1428
bool syncChildrenState()
Definition qgst.cpp:1450
QGstBin(GstBin *bin, RefMode mode=NeedsRef)
Definition qgst.cpp:1410
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void > remove(const Ts &...ts)
Definition qgst_p.h:883
static QGstBin createFromPipelineDescription(const QByteArray &pipelineDescription, const char *name=nullptr, bool ghostUnlinkedPads=false)
Definition qgst.cpp:1380
MemoryFormat memoryFormat() const
Definition qgst.cpp:606
std::optional< QGstVideoInfo > videoInfo() const
Definition qgst.cpp:465
QGstCaps & operator=(QGstCaps &&) noexcept=default
int size() const
Definition qgst.cpp:616
static QGstCaps fromCameraFormat(const QCameraFormat &format)
Definition qgst.cpp:541
static QGstCaps create()
Definition qgst.cpp:633
GstCaps * caps() const
Definition qgst.cpp:628
void setResolution(QSize)
Definition qgst.cpp:527
QGstCaps & operator=(const QGstCaps &)=default
MemoryFormat
Definition qgst_p.h:394
@ DMABuf
Definition qgst_p.h:394
@ CpuMemory
Definition qgst_p.h:394
@ GLTexture
Definition qgst_p.h:394
QGstCaps(const QGstCaps &)=default
QGstCaps copy() const
Definition qgst.cpp:598
void addPixelFormats(const QList< QVideoFrameFormat::PixelFormat > &formats, const char *capsFeatures=nullptr)
Definition qgst.cpp:487
QGstCaps(QGstCaps &&) noexcept=default
QGstStructureView at(int index) const
Definition qgst.cpp:621
QGstClock(GstClock *clock, RefMode mode)
Definition qgst.cpp:983
GstClockTime time() const
Definition qgst.cpp:996
QGstClock()=default
GstClock * clock() const
Definition qgst.cpp:991
QGstClock(const QGstObject &o)
Definition qgst.cpp:975
void setBaseTime(GstClockTime time) const
Definition qgst.cpp:1278
GstStateChangeReturn setState(GstState state)
Definition qgst.cpp:1137
static QGstElement createFromFactory(const QGstElementFactoryHandle &, const char *name=nullptr)
Definition qgst.cpp:1036
std::optional< std::chrono::nanoseconds > position() const
Definition qgst.cpp:1234
static QGstElement createFromDevice(const QGstDeviceHandle &, const char *name=nullptr)
Definition qgst.cpp:1042
QGstElement & operator=(QGstElement &&) noexcept=default
QGObjectHandlerConnection onPadRemoved(T *instance)
Definition qgst_p.h:674
GstElement * element() const
Definition qgst.cpp:1283
static QGstElementFactoryHandle findFactory(const QByteArray &name)
Definition qgst.cpp:1082
void removeFromParent()
Definition qgst.cpp:1338
QGstElement(GstElement *element, RefMode mode)
Definition qgst.cpp:1003
void lockState(bool locked)
Definition qgst.cpp:1195
QGstElement(const QGstElement &)=default
QGstBin getRootBin() const
Definition qgst.cpp:1304
QGstPad getRequestPad(const char *name) const
Definition qgst.cpp:1112
QGstElement(QGstElement &&) noexcept=default
bool waitForAsyncStateChangeComplete(std::chrono::nanoseconds timeout=std::chrono::seconds(5)) const
Definition qgst.cpp:1182
std::optional< bool > canSeek() const
Definition qgst.cpp:1257
std::optional< std::chrono::nanoseconds > duration() const
Definition qgst.cpp:1215
bool finishStateChange(std::chrono::nanoseconds timeout=std::chrono::seconds(5))
Definition qgst.cpp:1161
bool setStateSync(GstState state, std::chrono::nanoseconds timeout=std::chrono::seconds(1))
Definition qgst.cpp:1142
bool isStateLocked() const
Definition qgst.cpp:1200
void sendEvent(GstEvent *event) const
Definition qgst.cpp:1205
void dumpPipelineGraph(const char *filename) const
Definition qgst.cpp:1344
QGstElement & operator=(const QGstElement &)=default
GstClockTime baseTime() const
Definition qgst.cpp:1273
QByteArrayView factoryName() const
Definition qgst.cpp:1087
static QGstElement createFromPipelineDescription(const QByteArray &)
Definition qgst.cpp:1069
void releaseRequestPad(const QGstPad &pad) const
Definition qgst.cpp:1117
static QGstElement createFromFactory(GstElementFactory *, const char *name=nullptr)
Definition qgst.cpp:1028
bool syncStateWithParent()
Definition qgst.cpp:1155
static QGstElement createFromDevice(GstDevice *, const char *name=nullptr)
Definition qgst.cpp:1047
QGstPad sink() const
Definition qgst.cpp:1107
QGstPad staticPad(const char *name) const
Definition qgst.cpp:1097
void sendEos() const
Definition qgst.cpp:1210
QGstBin getParentBin() const
Definition qgst.cpp:1296
std::optional< std::chrono::milliseconds > positionInMs() const
Definition qgst.cpp:1248
QGObjectHandlerConnection onPadAdded(T *instance)
Definition qgst_p.h:660
static QGstElement createFromFactory(const char *factory, const char *name=nullptr)
Definition qgst.cpp:1011
bool hasAsyncStateChange(std::chrono::nanoseconds timeout=std::chrono::seconds(0)) const
Definition qgst.cpp:1174
static QGstElementFactoryHandle findFactory(const char *)
Definition qgst.cpp:1074
QGstElement getParent() const
Definition qgst.cpp:1288
QGObjectHandlerConnection onNoMorePads(T *instance)
Definition qgst_p.h:688
QGstPipeline getPipeline() const
Definition qgst.cpp:1324
static QGstElement createFromPipelineDescription(const char *)
Definition qgst.cpp:1055
GstState state(std::chrono::nanoseconds timeout=std::chrono::seconds(0)) const
Definition qgst.cpp:1122
QGstPad src() const
Definition qgst.cpp:1102
std::optional< std::chrono::milliseconds > durationInMs() const
Definition qgst.cpp:1225
T * getObject(const char *property) const
Definition qgst_p.h:486
void set(const char *property, double d)
Definition qgst.cpp:670
QGObjectHandlerConnection connect(const char *name, GCallback callback, gpointer userData)
Definition qgst.cpp:765
void * getObject(const char *property) const
Definition qgst.cpp:760
double getDouble(const char *property) const
Definition qgst.cpp:746
QGstObject & operator=(const QGstObject &)=default
int getInt(const char *property) const
Definition qgst.cpp:718
void set(const char *property, int32_t i)
Definition qgst.cpp:655
QLatin1StringView name() const
Definition qgst.cpp:796
void set(const char *property, const QGstObject &o)
Definition qgst.cpp:675
static void qDeleteFromVoidPointer(void *ptr)
Definition qgst_p.h:468
QGString getString(const char *property) const
Definition qgst.cpp:690
void disconnect(gulong handlerId)
Definition qgst.cpp:774
QGstObject getGstObject(const char *property) const
Definition qgst.cpp:753
QLatin1StringView typeName() const
Definition qgst.cpp:784
void set(const char *property, const char *str)
Definition qgst.cpp:640
bool getBool(const char *property) const
Definition qgst.cpp:704
GType type() const
Definition qgst.cpp:779
QGstObject & operator=(QGstObject &&) noexcept=default
void set(const char *property, void *object, GDestroyNotify destroyFunction)
Definition qgst.cpp:685
void set(const char *property, std::unique_ptr< Object > object)
Definition qgst_p.h:462
void set(const char *property, Object *object, GDestroyNotify destroyFunction)
Definition qgst_p.h:456
void set(const char *property, bool b)
Definition qgst.cpp:645
QGstObject(const QGstObject &)=default
quint64 getUInt64(const char *property) const
Definition qgst.cpp:725
QGstStructureView getStructure(const char *property) const
Definition qgst.cpp:697
qint64 getInt64(const char *property) const
Definition qgst.cpp:732
void set(const char *property, const QGstCaps &c)
Definition qgst.cpp:680
float getFloat(const char *property) const
Definition qgst.cpp:739
QGstObject(QGstObject &&) noexcept=default
uint getUInt(const char *property) const
Definition qgst.cpp:711
GstObject * object() const
Definition qgst.cpp:791
bool link(const QGstPad &sink) const
Definition qgst.cpp:902
GstEvent * stickyEvent(GstEventType type)
Definition qgst.cpp:936
void modifyPipelineInIdleProbe(Functor &&f)
Definition qgst_p.h:797
QGstTagListHandle tags() const
Definition qgst.cpp:868
QGstPad & operator=(QGstPad &&) noexcept=default
QGstPad(const QGstObject &o)
Definition qgst.cpp:842
bool isLinked() const
Definition qgst.cpp:897
bool unlinkPeer() const
Definition qgst.cpp:912
QGstPad(const QGstPad &)=default
QGstCaps queryCaps() const
Definition qgst.cpp:863
void doInIdleProbe(Functor &&work)
Definition qgst_p.h:732
GstPad * pad() const
Definition qgst.cpp:931
QGstPad(GstPad *pad, RefMode mode)
Definition qgst.cpp:850
QGstPad(QGstPad &&) noexcept=default
void sendFlushIfPaused()
Definition qgst.cpp:961
void sendFlushStartStop(bool resetTime)
Definition qgst.cpp:946
QGString streamId() const
Definition qgst.cpp:875
QGstPad & operator=(const QGstPad &)=default
void addProbe(T *instance, GstPadProbeType type)
Definition qgst_p.h:722
std::optional< QPlatformMediaPlayer::TrackType > inferTrackTypeFromName() const
Definition qgst.cpp:882
void addEosProbe(T *instance)
Definition qgst_p.h:785
bool sendEvent(GstEvent *event)
Definition qgst.cpp:941
QGstCaps currentCaps() const
Definition qgst.cpp:858
QGstElement parent() const
Definition qgst.cpp:926
bool unlink(const QGstPad &sink) const
Definition qgst.cpp:907
QGstPad peer() const
Definition qgst.cpp:921
QGstStructureView(const QUniqueGstStructureHandle &)
Definition qgst.cpp:214
bool isNull() const
Definition qgst.cpp:224
QGRange< float > frameRateRange() const
Definition qgst.cpp:344
QSize nativeSize() const
Definition qgst.cpp:449
QGValue operator[](const char *fieldname) const
Definition qgst.cpp:234
const GstStructure * structure
Definition qgst_p.h:349
QUniqueGstStructureHandle clone() const
Definition qgst.cpp:219
QList< QVideoFrameFormat::PixelFormat > pixelFormats() const
Definition qgst.cpp:269
std::optional< QGRange< QSize > > resolutionRange() const
Definition qgst.cpp:402
QGstreamerMessage getMessage()
Definition qgst.cpp:428
QGstCaps caps() const
Definition qgst.cpp:239
std::optional< Fraction > pixelAspectRatio() const
Definition qgst.cpp:435
QGstTagListHandle tags() const
Definition qgst.cpp:244
QSize resolution() const
Definition qgst.cpp:255
QByteArrayView name() const
Definition qgst.cpp:229
QGstStructureView(const GstStructure *)
Definition qgst.cpp:212
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.
QGstCaps::MemoryFormat qMemoryFormatFromGstBuffer(GstBuffer *buffer)
Definition qgst.cpp:1702
DestinationType * qGstCheckedCast(SourceType *arg)
Definition qgst_p.h:172
#define QGST_DEFINE_CAST_TRAITS(ClassName, MACRO_LABEL)
Definition qgst_p.h:69
QVideoFrameFormat qVideoFrameFormatFromGstVideoInfo(const QGstVideoInfo &vidInfo)
Definition qgst.cpp:1610
void qForeachStreamInCollection(GstStreamCollection *collection, Functor &&f)
Definition qgst_p.h:1016
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void > qLinkGstElements(const Ts &...ts)
Definition qgst_p.h:827
GstClockTime qGstClockTimeFromChrono(std::chrono::nanoseconds ns)
Definition qgst_p.h:995
bool qIsGstObjectOfType(SourceType *arg)
Definition qgst_p.h:156
GstVideoFormat qGstVideoFormatFromPixelFormat(QVideoFrameFormat::PixelFormat format)
Definition qgst.cpp:104
DestinationType * qGstSafeCast(SourceType *arg)
Definition qgst_p.h:163
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void > qUnlinkGstElements(const Ts &...ts)
Definition qgst_p.h:846
QString qGstErrorMessageCannotFindElement(std::string_view element)
Definition qgst.cpp:1604
std::optional< QString > qGstErrorMessageIfElementsNotAvailable(const Arg &arg, Args... args)
Definition qgst_p.h:1003
QVideoFrame qCreateFrameFromGstBuffer(QGstBufferHandle buffer, const QGstVideoInfo &videoInfo)
Definition qgst.cpp:1721
#define QGST_DEFINE_CAST_TRAITS_FOR_INTERFACE(ClassName, MACRO_LABEL)
Definition qgst_p.h:92
QVideoFrameFormat::PixelFormat qPixelFormatFromGstVideoFormat(GstVideoFormat format)
Definition qgst.cpp:113
void qForeachStreamInCollection(const QGstStreamCollectionHandle &collection, Functor &&f)
Definition qgst_p.h:1024
@ 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:232
T max
Definition qgst_p.h:233
bool operator==(const QGRange &rhs) const
Definition qgst_p.h:238
friend bool operator<(const QGString &lhs, const QGString &rhs)
Definition qgst_p.h:286
friend bool operator<(const QLatin1StringView lhs, const QGString &rhs)
Definition qgst_p.h:298
bool operator==(const QGString &str) const
Definition qgst_p.h:278
QString toQString() const
Definition qgst_p.h:251
bool operator!=(const QLatin1StringView str) const
Definition qgst_p.h:283
bool operator!=(const QGString &str) const
Definition qgst_p.h:282
QLatin1StringView asStringView() const
Definition qgst_p.h:249
friend bool operator<(const QGString &lhs, const QLatin1StringView rhs)
Definition qgst_p.h:290
bool operator==(const QLatin1StringView str) const
Definition qgst_p.h:279
QByteArrayView asByteArrayView() const
Definition qgst_p.h:250
void setInt(const char *field, int value)
Definition qgst_p.h:203
void setFractionRange(const char *field, Fraction min, Fraction max)
Definition qgst_p.h:218
void setIntRange(const char *field, int min, int max)
Definition qgst_p.h:213
void setString(const char *field, const char *value)
Definition qgst_p.h:208
QGstStructure(const char *name)
Definition qgst_p.h:198
void setValue(const char *field, const GValue *value)
Definition qgst_p.h:224
std::optional< guint64 > dmaDrmModifier
Definition qgst_p.h:191
GstVideoInfo gstVideoInfo
Definition qgst_p.h:190
static constexpr Type invalidValue() noexcept
Definition qgst_p.h:374
static bool unref(GstCaps *arg) noexcept
Definition qgst_p.h:376
static GstCaps * ref(GstCaps *arg) noexcept
Definition qgst_p.h:375
static bool unref(GstObject *arg) noexcept
Definition qgst_p.h:423
static GstObject * ref(GstObject *arg) noexcept
Definition qgst_p.h:418
static constexpr Type invalidValue() noexcept
Definition qgst_p.h:417
result_type operator()(const argument_type &e) const noexcept
Definition qgst_p.h:1042