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
194template <typename T> struct QGRange
195{
198
199#ifdef __cpp_impl_three_way_comparison
200 auto operator<=> (const QGRange &) const = default;
201#else
202 bool operator==(const QGRange &rhs) const
203 {
204 return std::tie(min, max) == std::tie(rhs.min, rhs.max);
205 }
206#endif
207};
208
210{
212
213 QLatin1StringView asStringView() const { return QLatin1StringView{ get() }; }
214 QByteArrayView asByteArrayView() const { return QByteArrayView{ get() }; }
215 QString toQString() const { return QString::fromUtf8(get()); }
216
217#ifdef __cpp_lib_three_way_comparison
218 // clang-format off
219 friend auto operator<=>(const QGString &lhs, const QGString &rhs)
220 {
221 return lhs.asStringView() <=> rhs.asStringView();
222 }
223 friend auto operator<=>(const QGString &lhs, const QLatin1StringView rhs)
224 {
225 return lhs.asStringView() <=> rhs;
226 }
227 friend auto operator<=>(const QGString &lhs, const QByteArrayView rhs)
228 {
229 return lhs.asByteArrayView() <=> rhs;
230 }
231 friend auto operator<=>(const QLatin1StringView lhs, const QGString &rhs)
232 {
233 return lhs <=> rhs.asStringView();
234 }
235 friend auto operator<=>(const QByteArrayView lhs, const QGString &rhs)
236 {
237 return lhs <=> rhs.asByteArrayView();
238 }
239 // clang-format on
240#else
241 // remove once we're on c++20
242 bool operator==(const QGString &str) const { return asStringView() == str.asStringView(); }
243 bool operator==(const QLatin1StringView str) const { return asStringView() == str; }
244 bool operator==(const QByteArrayView str) const { return asByteArrayView() == str; }
245
246 bool operator!=(const QGString &str) const { return asStringView() != str.asStringView(); }
247 bool operator!=(const QLatin1StringView str) const { return asStringView() != str; }
248 bool operator!=(const QByteArrayView str) const { return asByteArrayView() != str; }
249
250 friend bool operator<(const QGString &lhs, const QGString &rhs)
251 {
252 return lhs.asStringView() < rhs.asStringView();
253 }
254 friend bool operator<(const QGString &lhs, const QLatin1StringView rhs)
255 {
256 return lhs.asStringView() < rhs;
257 }
258 friend bool operator<(const QGString &lhs, const QByteArrayView rhs)
259 {
260 return lhs.asByteArrayView() < rhs;
261 }
262 friend bool operator<(const QLatin1StringView lhs, const QGString &rhs)
263 {
264 return lhs < rhs.asStringView();
265 }
266 friend bool operator<(const QByteArrayView lhs, const QGString &rhs)
267 {
268 return lhs < rhs.asByteArrayView();
269 }
270#endif
271
272 explicit operator QByteArrayView() const { return asByteArrayView(); }
273 explicit operator QByteArray() const { return QByteArray{ asByteArrayView() }; }
274};
275
277{
278public:
279 explicit QGValue(const GValue *v);
280 const GValue *value;
281
282 bool isNull() const;
283
284 std::optional<bool> toBool() const;
285 std::optional<int> toInt() const;
286 std::optional<int> toInt64() const;
287 template<typename T>
288 T *getPointer() const
289 {
290 return value ? static_cast<T *>(g_value_get_pointer(value)) : nullptr;
291 }
292
293 const char *toString() const;
294 std::optional<float> getFraction() const;
295 std::optional<QGRange<float>> getFractionRange() const;
296 std::optional<QGRange<int>> toIntRange() const;
297
299 QGstCaps toCaps() const;
300
301 bool isList() const;
302 int listSize() const;
303 QGValue at(int index) const;
304
306};
307
309
311{
312public:
313 const GstStructure *structure = nullptr;
314 explicit QGstStructureView(const GstStructure *);
315 explicit QGstStructureView(const QUniqueGstStructureHandle &);
316
318
319 bool isNull() const;
320 QByteArrayView name() const;
321 QGValue operator[](const char *fieldname) const;
322
323 QGstCaps caps() const;
324 QGstTagListHandle tags() const;
325
326 QSize resolution() const;
328 QGRange<float> frameRateRange() const;
332 QSize nativeSize() const;
333};
334
336{
337 using Type = GstCaps *;
338 static constexpr Type invalidValue() noexcept { return nullptr; }
339 static GstCaps *ref(GstCaps *arg) noexcept { return gst_caps_ref(arg); }
340 static bool unref(GstCaps *arg) noexcept
341 {
342 gst_caps_unref(arg);
343 return true;
344 }
345};
346
348{
350
351public:
352 using BaseClass::BaseClass;
353 QGstCaps(const QGstCaps &) = default;
354 QGstCaps(QGstCaps &&) noexcept = default;
355 QGstCaps &operator=(const QGstCaps &) = default;
356 QGstCaps &operator=(QGstCaps &&) noexcept = default;
357
359
360 int size() const;
361 QGstStructureView at(int index) const;
362 GstCaps *caps() const;
363
366
367 void addPixelFormats(const QList<QVideoFrameFormat::PixelFormat> &formats,
368 const char* capsFeatures = nullptr);
369 void setResolution(QSize);
370
371 static QGstCaps create();
372
373 static QGstCaps fromCameraFormat(const QCameraFormat &format);
374
375 QGstCaps copy() const;
376};
377
379{
380 using Type = GstObject *;
381 static constexpr Type invalidValue() noexcept { return nullptr; }
382 static GstObject *ref(GstObject *arg) noexcept
383 {
384 gst_object_ref_sink(arg);
385 return arg;
386 }
387 static bool unref(GstObject *arg) noexcept
388 {
389 gst_object_unref(arg);
390 return true;
391 }
392};
393
395
397{
399
400public:
401 using BaseClass::BaseClass;
402 QGstObject(const QGstObject &) = default;
403 QGstObject(QGstObject &&) noexcept = default;
404
405 QGstObject &operator=(const QGstObject &) = default;
406 QGstObject &operator=(QGstObject &&) noexcept = default;
407
408 void set(const char *property, const char *str);
409 void set(const char *property, bool b);
410 void set(const char *property, int32_t i);
411 void set(const char *property, uint32_t i);
412 void set(const char *property, int64_t i);
413 void set(const char *property, uint64_t i);
414 void set(const char *property, double d);
415 void set(const char *property, const QGstObject &o);
416 void set(const char *property, const QGstCaps &c);
417 void set(const char *property, void *object, GDestroyNotify destroyFunction);
418
419 template <typename Object>
420 void set(const char *property, Object *object, GDestroyNotify destroyFunction)
421 {
422 set(property, static_cast<void *>(object), destroyFunction);
423 }
424
425 template <typename Object>
426 void set(const char *property, std::unique_ptr<Object> object)
427 {
428 set(property, static_cast<void *>(object.release()), qDeleteFromVoidPointer<Object>);
429 }
430
431 template <typename T>
432 static void qDeleteFromVoidPointer(void *ptr)
433 {
434 delete reinterpret_cast<T *>(ptr);
435 }
436
437 QGString getString(const char *property) const;
438 QGstStructureView getStructure(const char *property) const;
439 bool getBool(const char *property) const;
440 uint getUInt(const char *property) const;
441 int getInt(const char *property) const;
442 quint64 getUInt64(const char *property) const;
443 qint64 getInt64(const char *property) const;
444 float getFloat(const char *property) const;
445 double getDouble(const char *property) const;
446 QGstObject getGstObject(const char *property) const;
447 void *getObject(const char *property) const;
448
449 template <typename T>
450 T *getObject(const char *property) const
451 {
452 void *rawObject = getObject(property);
453 return reinterpret_cast<T *>(rawObject);
454 }
455
456 QGObjectHandlerConnection connect(const char *name, GCallback callback, gpointer userData);
457 void disconnect(gulong handlerId);
458
459 GType type() const;
461 GstObject *object() const;
462 QLatin1StringView name() const;
463};
464
466{
467public:
468 QGObjectHandlerConnection(QGstObject object, gulong handler);
469
475
476 void disconnect();
477
478private:
479 static constexpr gulong invalidHandlerId = std::numeric_limits<gulong>::max();
480
481 QGstObject object;
482 gulong handlerId = invalidHandlerId;
483};
484
485// disconnects in dtor
504
505class QGstElement;
506
507class QGstPad : public QGstObject
508{
509public:
510 using QGstObject::QGstObject;
511 QGstPad(const QGstPad &) = default;
512 QGstPad(QGstPad &&) noexcept = default;
513
514 explicit QGstPad(const QGstObject &o);
515 explicit QGstPad(GstPad *pad, RefMode mode);
516
517 QGstPad &operator=(const QGstPad &) = default;
518 QGstPad &operator=(QGstPad &&) noexcept = default;
519
520 QGstCaps currentCaps() const;
521 QGstCaps queryCaps() const;
522
523 QGstTagListHandle tags() const;
524 QGString streamId() const;
525
527 inferTrackTypeFromName() const; // for decodebin3 etc
528
529 bool isLinked() const;
530 bool link(const QGstPad &sink) const;
531 bool unlink(const QGstPad &sink) const;
532 bool unlinkPeer() const;
533 QGstPad peer() const;
534 QGstElement parent() const;
535
536 GstPad *pad() const;
537
538 GstEvent *stickyEvent(GstEventType type);
539 bool sendEvent(GstEvent *event);
540 void sendFlushStartStop(bool resetTime);
541
542 template <auto Member, typename T>
543 void addProbe(T *instance, GstPadProbeType type);
544
545 template <typename Functor>
546 void doInIdleProbe(Functor &&work);
547
548 template <auto Member, typename T>
549 void addEosProbe(T *instance);
550
551 template <typename Functor>
552 void modifyPipelineInIdleProbe(Functor &&f);
553
554 void sendFlushIfPaused();
555};
556
557class QGstClock : public QGstObject
558{
559public:
560 QGstClock() = default;
561 explicit QGstClock(const QGstObject &o);
562 explicit QGstClock(GstClock *clock, RefMode mode);
563
564 GstClock *clock() const;
565 GstClockTime time() const;
566};
567
568class QGstBin;
569class QGstPipeline;
570
572{
573public:
574 using QGstObject::QGstObject;
575
576 QGstElement(const QGstElement &) = default;
577 QGstElement(QGstElement &&) noexcept = default;
578 QGstElement &operator=(const QGstElement &) = default;
579 QGstElement &operator=(QGstElement &&) noexcept = default;
580
581 explicit QGstElement(GstElement *element, RefMode mode);
582 static QGstElement createFromFactory(const char *factory, const char *name = nullptr);
583 static QGstElement createFromFactory(GstElementFactory *, const char *name = nullptr);
584 static QGstElement createFromFactory(const QGstElementFactoryHandle &,
585 const char *name = nullptr);
586 static QGstElement createFromDevice(const QGstDeviceHandle &, const char *name = nullptr);
587 static QGstElement createFromDevice(GstDevice *, const char *name = nullptr);
588 static QGstElement createFromPipelineDescription(const char *);
589 static QGstElement createFromPipelineDescription(const QByteArray &);
590
591 static QGstElementFactoryHandle findFactory(const char *);
592 static QGstElementFactoryHandle findFactory(const QByteArray &name);
593
595
596 QGstPad staticPad(const char *name) const;
597 QGstPad src() const;
598 QGstPad sink() const;
599 QGstPad getRequestPad(const char *name) const;
600 void releaseRequestPad(const QGstPad &pad) const;
601
602 GstState state(std::chrono::nanoseconds timeout = std::chrono::seconds(0)) const;
603 GstStateChangeReturn setState(GstState state);
604 bool setStateSync(GstState state, std::chrono::nanoseconds timeout = std::chrono::seconds(1));
605 bool syncStateWithParent();
606 bool finishStateChange(std::chrono::nanoseconds timeout = std::chrono::seconds(5));
607 bool hasAsyncStateChange(std::chrono::nanoseconds timeout = std::chrono::seconds(0)) const;
609 std::chrono::nanoseconds timeout = std::chrono::seconds(5)) const;
610
611 void lockState(bool locked);
612 bool isStateLocked() const;
613
614 void sendEvent(GstEvent *event) const;
615 void sendEos() const;
616
621 std::optional<bool> canSeek() const;
622
623 template <auto Member, typename T>
625 {
626 struct Impl
627 {
628 static void callback(GstElement *e, GstPad *pad, gpointer userData)
629 {
630 (static_cast<T *>(userData)->*Member)(QGstElement(e, NeedsRef),
631 QGstPad(pad, NeedsRef));
632 };
633 };
634
635 return connect("pad-added", G_CALLBACK(Impl::callback), instance);
636 }
637 template <auto Member, typename T>
639 {
640 struct Impl
641 {
642 static void callback(GstElement *e, GstPad *pad, gpointer userData)
643 {
644 (static_cast<T *>(userData)->*Member)(QGstElement(e, NeedsRef),
645 QGstPad(pad, NeedsRef));
646 };
647 };
648
649 return connect("pad-removed", G_CALLBACK(Impl::callback), instance);
650 }
651 template <auto Member, typename T>
653 {
654 struct Impl
655 {
656 static void callback(GstElement *e, gpointer userData)
657 {
658 (static_cast<T *>(userData)->*Member)(QGstElement(e, NeedsRef));
659 };
660 };
661
662 return connect("no-more-pads", G_CALLBACK(Impl::callback), instance);
663 }
664
665 GstClockTime baseTime() const;
666 void setBaseTime(GstClockTime time) const;
667
668 GstElement *element() const;
669
670 QGstElement getParent() const;
671 QGstBin getParentBin() const;
673 QGstBin getRootBin() const;
674
675 void removeFromParent();
676 void dumpPipelineGraph(const char *filename) const;
677
678private:
679 QGstQueryHandle &positionQuery() const;
680 mutable QGstQueryHandle m_positionQuery;
681};
682
683// QGstPad implementations
684
685template <auto Member, typename T>
686void QGstPad::addProbe(T *instance, GstPadProbeType type)
687{
688 auto callback = [](GstPad *pad, GstPadProbeInfo *info, gpointer userData) {
689 return (static_cast<T *>(userData)->*Member)(QGstPad(pad, NeedsRef), info);
690 };
691
692 gst_pad_add_probe(pad(), type, callback, instance, nullptr);
693}
694
695template <typename Functor>
696void QGstPad::doInIdleProbe(Functor &&work)
697{
698 using namespace std::chrono_literals;
699
700 struct CallbackData
701 {
702 QSemaphore waitDone;
703 std::once_flag onceFlag;
704 Functor work;
705
706 void run()
707 {
708 std::call_once(onceFlag, [&] {
709 work();
710 });
711 }
712 };
713
714 CallbackData cd{ QSemaphore{}, {}, std::forward<Functor>(work) };
715
716 auto callback = [](GstPad *, GstPadProbeInfo *, gpointer p) {
717 auto cd = reinterpret_cast<CallbackData *>(p);
718 cd->run();
719 cd->waitDone.release();
720 return GST_PAD_PROBE_REMOVE;
721 };
722
723 gulong probe = gst_pad_add_probe(pad(), GST_PAD_PROBE_TYPE_IDLE, callback, &cd, nullptr);
724 if (probe == 0)
725 return; // probe was executed
726
727 bool success = cd.waitDone.try_acquire_for(250ms);
728 if (success)
729 return;
730
731 // the probe has not been executed for 250ms, probably because the element has transitioned
732 // from playing to paused. Flushing the pad would unblock paused pads
734
735 success = cd.waitDone.try_acquire_for(1s);
736 if (success)
737 return;
738
739 // if the idle probe still has not been called, we remove it and call it
740 // explicitly to avoid deadlocking the application. Probably not exactly safe,
741 // but better than deadlocking
742 qWarning() << "QGstPad::doInIdleProbe blocked for 1s. Executing the pad probe manually";
743 parent().dumpPipelineGraph("doInIdleProbeHang");
744 gst_pad_remove_probe(pad(), probe);
745 cd.run();
746}
747
748template <auto Member, typename T>
749void QGstPad::addEosProbe(T *instance)
750{
751 auto callback = [](GstPad *, GstPadProbeInfo *info, gpointer userData) {
752 if (GST_EVENT_TYPE(GST_PAD_PROBE_INFO_DATA(info)) != GST_EVENT_EOS)
753 return GST_PAD_PROBE_PASS;
754 (static_cast<T *>(userData)->*Member)();
755 return GST_PAD_PROBE_REMOVE;
756 };
757
758 gst_pad_add_probe(pad(), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, callback, instance, nullptr);
759}
760template <typename Functor>
762{
763 using namespace std::chrono_literals;
764
765 GstPadDirection direction = gst_pad_get_direction(pad());
766
767 switch (direction) {
768 case GstPadDirection::GST_PAD_SINK: {
769 // modifying a source: we need to flush the sink pad before we can modify downstream
770 // elements
772 doInIdleProbe(f);
773 return;
774 }
775 case GstPadDirection::GST_PAD_SRC: {
776 // modifying a sink: we need to use the idle probes iff the pipeline is playing
777 if (parent().state(1s) == GstState::GST_STATE_PLAYING)
778 doInIdleProbe(f);
779 else
780 f();
781 return;
782 }
783
784 default:
785 Q_UNREACHABLE();
786 }
787}
788
789template <typename... Ts>
790std::enable_if_t<(std::is_base_of_v<QGstElement, Ts> && ...), void>
791qLinkGstElements(const Ts &...ts)
792{
793 bool link_success = [&] {
794 if constexpr (sizeof...(Ts) == 2)
795 return gst_element_link(ts.element()...);
796 else
797 return gst_element_link_many(ts.element()..., nullptr);
798 }();
799
800 if (Q_UNLIKELY(!link_success)) {
801 qWarning() << "qLinkGstElements: could not link elements: "
802 << std::initializer_list<const char *>{
803 (GST_ELEMENT_NAME(ts.element()))...,
804 };
805 }
806}
807
808template <typename... Ts>
809std::enable_if_t<(std::is_base_of_v<QGstElement, Ts> && ...), void>
810qUnlinkGstElements(const Ts &...ts)
811{
812 if constexpr (sizeof...(Ts) == 2)
813 gst_element_unlink(ts.element()...);
814 else
815 gst_element_unlink_many(ts.element()..., nullptr);
816}
817
818class QGstBin : public QGstElement
819{
820public:
821 using QGstElement::QGstElement;
822 QGstBin(const QGstBin &) = default;
823 QGstBin(QGstBin &&) noexcept = default;
824 QGstBin &operator=(const QGstBin &) = default;
825 QGstBin &operator=(QGstBin &&) noexcept = default;
826
827 explicit QGstBin(GstBin *bin, RefMode mode = NeedsRef);
828 static QGstBin create(const char *name);
829 static QGstBin createFromFactory(const char *factory, const char *name);
830 static QGstBin createFromPipelineDescription(const QByteArray &pipelineDescription,
831 const char *name = nullptr,
832 bool ghostUnlinkedPads = false);
833 static QGstBin createFromPipelineDescription(const char *pipelineDescription,
834 const char *name = nullptr,
835 bool ghostUnlinkedPads = false);
836
837 template <typename... Ts>
838 std::enable_if_t<(std::is_base_of_v<QGstElement, Ts> && ...), void> add(const Ts &...ts)
839 {
840 if constexpr (sizeof...(Ts) == 1)
841 gst_bin_add(bin(), ts.element()...);
842 else
843 gst_bin_add_many(bin(), ts.element()..., nullptr);
844 }
845
846 template <typename... Ts>
847 std::enable_if_t<(std::is_base_of_v<QGstElement, Ts> && ...), void> remove(const Ts &...ts)
848 {
849 if constexpr (sizeof...(Ts) == 1)
850 gst_bin_remove(bin(), ts.element()...);
851 else
852 gst_bin_remove_many(bin(), ts.element()..., nullptr);
853 }
854
855 template <typename... Ts>
858 {
859 bool stateChangeSuccessful = (ts.setStateSync(GST_STATE_NULL) && ...);
860 Q_ASSERT(stateChangeSuccessful);
861 remove(ts...);
862 }
863
864 GstBin *bin() const;
865
866 void addGhostPad(const QGstElement &child, const char *name);
867 void addGhostPad(const char *name, const QGstPad &pad);
869
870 bool syncChildrenState();
871
872 void dumpGraph(const char *fileNamePrefix, bool includeTimestamp = true) const;
873
874 QGstElement findByName(const char *);
875
876 void recalculateLatency();
877};
878
880{
881public:
882 using QGstElement::QGstElement;
883
884 explicit QGstBaseSink(GstBaseSink *, RefMode);
885
886 QGstBaseSink(const QGstBaseSink &) = default;
887 QGstBaseSink(QGstBaseSink &&) noexcept = default;
888 QGstBaseSink &operator=(const QGstBaseSink &) = default;
889 QGstBaseSink &operator=(QGstBaseSink &&) noexcept = default;
890
891 void setSync(bool);
892
893 GstBaseSink *baseSink() const;
894};
895
897{
898public:
899 using QGstElement::QGstElement;
900
901 explicit QGstBaseSrc(GstBaseSrc *, RefMode);
902
903 QGstBaseSrc(const QGstBaseSrc &) = default;
904 QGstBaseSrc(QGstBaseSrc &&) noexcept = default;
905 QGstBaseSrc &operator=(const QGstBaseSrc &) = default;
906 QGstBaseSrc &operator=(QGstBaseSrc &&) noexcept = default;
907
908 GstBaseSrc *baseSrc() const;
909};
910
912{
913public:
914 using QGstBaseSink::QGstBaseSink;
915
916 explicit QGstAppSink(GstAppSink *, RefMode);
917
918 QGstAppSink(const QGstAppSink &) = default;
919 QGstAppSink(QGstAppSink &&) noexcept = default;
920 QGstAppSink &operator=(const QGstAppSink &) = default;
921 QGstAppSink &operator=(QGstAppSink &&) noexcept = default;
922
923 static QGstAppSink create(const char *name);
924
925 GstAppSink *appSink() const;
926
927 void setMaxBuffers(int);
928# if GST_CHECK_VERSION(1, 24, 0)
930# endif
931
932 void setCaps(const QGstCaps &caps);
933 void setCallbacks(GstAppSinkCallbacks &callbacks, gpointer user_data, GDestroyNotify notify);
934
936};
937
939{
940public:
941 using QGstBaseSrc::QGstBaseSrc;
942
943 explicit QGstAppSrc(GstAppSrc *, RefMode);
944
945 QGstAppSrc(const QGstAppSrc &) = default;
946 QGstAppSrc(QGstAppSrc &&) noexcept = default;
947 QGstAppSrc &operator=(const QGstAppSrc &) = default;
948 QGstAppSrc &operator=(QGstAppSrc &&) noexcept = default;
949
950 static QGstAppSrc create(const char *name);
951
952 GstAppSrc *appSrc() const;
953
954 void setCallbacks(GstAppSrcCallbacks &callbacks, gpointer user_data, GDestroyNotify notify);
955
956 GstFlowReturn pushBuffer(GstBuffer *); // take ownership
957};
958
959inline GstClockTime qGstClockTimeFromChrono(std::chrono::nanoseconds ns)
960{
961 return ns.count();
962}
963
964QString qGstErrorMessageCannotFindElement(std::string_view element);
965
966template <typename Arg, typename... Args>
968{
969 QGstElementFactoryHandle factory = QGstElement::findFactory(arg);
970 if (!factory)
971 return qGstErrorMessageCannotFindElement(arg);
972
973 if constexpr (sizeof...(args) != 0)
974 return qGstErrorMessageIfElementsNotAvailable(args...);
975 else
976 return std::nullopt;
977}
978
979template <typename Functor>
980void qForeachStreamInCollection(GstStreamCollection *collection, Functor &&f)
981{
982 guint size = gst_stream_collection_get_size(collection);
983 for (guint index = 0; index != size; ++index)
984 f(gst_stream_collection_get_stream(collection, index));
985}
986
987template <typename Functor>
988void qForeachStreamInCollection(const QGstStreamCollectionHandle &collection, Functor &&f)
989{
990 qForeachStreamInCollection(collection.get(), std::forward<Functor>(f));
991}
992
995QVideoFrame qCreateFrameFromGstBuffer(QGstBufferHandle buffer, const QGstVideoInfo &videoInfo);
996
997QT_END_NAMESPACE
998
999namespace std {
1000
1001template <>
1003{
1005 using result_type = size_t;
1006 result_type operator()(const argument_type &e) const noexcept
1007 {
1008 return std::hash<void *>{}(e.element());
1009 }
1010};
1011} // namespace std
1012
1013#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:801
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:818
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:288
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:280
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:1557
void setCallbacks(GstAppSinkCallbacks &callbacks, gpointer user_data, GDestroyNotify notify)
Definition qgst.cpp:1551
GstAppSink * appSink() const
Definition qgst.cpp:1529
void setCaps(const QGstCaps &caps)
Definition qgst.cpp:1546
void setMaxBuffers(int)
Definition qgst.cpp:1541
QGstAppSink(const QGstAppSink &)=default
QGstAppSink(QGstAppSink &&) noexcept=default
static QGstAppSink create(const char *name)
Definition qgst.cpp:1520
QGstAppSink(GstAppSink *, RefMode)
Definition qgst.cpp:1512
QGstAppSink & operator=(QGstAppSink &&) noexcept=default
QGstAppSink & operator=(const QGstAppSink &)=default
static QGstAppSrc create(const char *name)
Definition qgst.cpp:1575
QGstAppSrc & operator=(const QGstAppSrc &)=default
GstFlowReturn pushBuffer(GstBuffer *)
Definition qgst.cpp:1595
QGstAppSrc(const QGstAppSrc &)=default
void setCallbacks(GstAppSrcCallbacks &callbacks, gpointer user_data, GDestroyNotify notify)
Definition qgst.cpp:1589
QGstAppSrc & operator=(QGstAppSrc &&) noexcept=default
QGstAppSrc(GstAppSrc *, RefMode)
Definition qgst.cpp:1567
QGstAppSrc(QGstAppSrc &&) noexcept=default
GstAppSrc * appSrc() const
Definition qgst.cpp:1584
void setSync(bool)
Definition qgst.cpp:1485
QGstBaseSink & operator=(const QGstBaseSink &)=default
QGstBaseSink(GstBaseSink *, RefMode)
Definition qgst.cpp:1477
QGstBaseSink(const QGstBaseSink &)=default
GstBaseSink * baseSink() const
Definition qgst.cpp:1490
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:1497
GstBaseSrc * baseSrc() const
Definition qgst.cpp:1505
void addUnlinkedGhostPads(GstPadDirection)
Definition qgst.cpp:1429
QGstBin(QGstBin &&) noexcept=default
void dumpGraph(const char *fileNamePrefix, bool includeTimestamp=true) const
Definition qgst.cpp:1451
QGstBin & operator=(const QGstBin &)=default
QGstElement findByName(const char *)
Definition qgst.cpp:1462
void recalculateLatency()
Definition qgst.cpp:1470
GstBin * bin() const
Definition qgst.cpp:1414
static QGstBin create(const char *name)
Definition qgst.cpp:1361
void addGhostPad(const QGstElement &child, const char *name)
Definition qgst.cpp:1419
std::enable_if_t<(std::is_base_of_v< QGstElement, std::remove_reference_t< Ts > > &&...), void > stopAndRemoveElements(Ts &&...ts)
Definition qgst_p.h:857
QGstBin & operator=(QGstBin &&) noexcept=default
static QGstBin createFromPipelineDescription(const char *pipelineDescription, const char *name=nullptr, bool ghostUnlinkedPads=false)
Definition qgst.cpp:1382
QGstBin(const QGstBin &)=default
static QGstBin createFromFactory(const char *factory, const char *name)
Definition qgst.cpp:1366
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void > add(const Ts &...ts)
Definition qgst_p.h:838
void addGhostPad(const char *name, const QGstPad &pad)
Definition qgst.cpp:1424
bool syncChildrenState()
Definition qgst.cpp:1446
QGstBin(GstBin *bin, RefMode mode=NeedsRef)
Definition qgst.cpp:1406
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void > remove(const Ts &...ts)
Definition qgst_p.h:847
static QGstBin createFromPipelineDescription(const QByteArray &pipelineDescription, const char *name=nullptr, bool ghostUnlinkedPads=false)
Definition qgst.cpp:1376
MemoryFormat memoryFormat() const
Definition qgst.cpp:602
std::optional< QGstVideoInfo > videoInfo() const
Definition qgst.cpp:465
QGstCaps & operator=(QGstCaps &&) noexcept=default
int size() const
Definition qgst.cpp:612
static QGstCaps fromCameraFormat(const QCameraFormat &format)
Definition qgst.cpp:539
static QGstCaps create()
Definition qgst.cpp:629
GstCaps * caps() const
Definition qgst.cpp:624
void setResolution(QSize)
Definition qgst.cpp:525
QGstCaps & operator=(const QGstCaps &)=default
MemoryFormat
Definition qgst_p.h:358
@ DMABuf
Definition qgst_p.h:358
@ CpuMemory
Definition qgst_p.h:358
@ GLTexture
Definition qgst_p.h:358
QGstCaps(const QGstCaps &)=default
QGstCaps copy() const
Definition qgst.cpp:594
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:617
QGstClock(GstClock *clock, RefMode mode)
Definition qgst.cpp:979
GstClockTime time() const
Definition qgst.cpp:992
QGstClock()=default
GstClock * clock() const
Definition qgst.cpp:987
QGstClock(const QGstObject &o)
Definition qgst.cpp:971
void setBaseTime(GstClockTime time) const
Definition qgst.cpp:1274
GstStateChangeReturn setState(GstState state)
Definition qgst.cpp:1133
static QGstElement createFromFactory(const QGstElementFactoryHandle &, const char *name=nullptr)
Definition qgst.cpp:1032
std::optional< std::chrono::nanoseconds > position() const
Definition qgst.cpp:1230
static QGstElement createFromDevice(const QGstDeviceHandle &, const char *name=nullptr)
Definition qgst.cpp:1038
QGstElement & operator=(QGstElement &&) noexcept=default
QGObjectHandlerConnection onPadRemoved(T *instance)
Definition qgst_p.h:638
GstElement * element() const
Definition qgst.cpp:1279
static QGstElementFactoryHandle findFactory(const QByteArray &name)
Definition qgst.cpp:1078
void removeFromParent()
Definition qgst.cpp:1334
QGstElement(GstElement *element, RefMode mode)
Definition qgst.cpp:999
void lockState(bool locked)
Definition qgst.cpp:1191
QGstElement(const QGstElement &)=default
QGstBin getRootBin() const
Definition qgst.cpp:1300
QGstPad getRequestPad(const char *name) const
Definition qgst.cpp:1108
QGstElement(QGstElement &&) noexcept=default
bool waitForAsyncStateChangeComplete(std::chrono::nanoseconds timeout=std::chrono::seconds(5)) const
Definition qgst.cpp:1178
std::optional< bool > canSeek() const
Definition qgst.cpp:1253
std::optional< std::chrono::nanoseconds > duration() const
Definition qgst.cpp:1211
bool finishStateChange(std::chrono::nanoseconds timeout=std::chrono::seconds(5))
Definition qgst.cpp:1157
bool setStateSync(GstState state, std::chrono::nanoseconds timeout=std::chrono::seconds(1))
Definition qgst.cpp:1138
bool isStateLocked() const
Definition qgst.cpp:1196
void sendEvent(GstEvent *event) const
Definition qgst.cpp:1201
void dumpPipelineGraph(const char *filename) const
Definition qgst.cpp:1340
QGstElement & operator=(const QGstElement &)=default
GstClockTime baseTime() const
Definition qgst.cpp:1269
QByteArrayView factoryName() const
Definition qgst.cpp:1083
static QGstElement createFromPipelineDescription(const QByteArray &)
Definition qgst.cpp:1065
void releaseRequestPad(const QGstPad &pad) const
Definition qgst.cpp:1113
static QGstElement createFromFactory(GstElementFactory *, const char *name=nullptr)
Definition qgst.cpp:1024
bool syncStateWithParent()
Definition qgst.cpp:1151
static QGstElement createFromDevice(GstDevice *, const char *name=nullptr)
Definition qgst.cpp:1043
QGstPad sink() const
Definition qgst.cpp:1103
QGstPad staticPad(const char *name) const
Definition qgst.cpp:1093
void sendEos() const
Definition qgst.cpp:1206
QGstBin getParentBin() const
Definition qgst.cpp:1292
std::optional< std::chrono::milliseconds > positionInMs() const
Definition qgst.cpp:1244
QGObjectHandlerConnection onPadAdded(T *instance)
Definition qgst_p.h:624
static QGstElement createFromFactory(const char *factory, const char *name=nullptr)
Definition qgst.cpp:1007
bool hasAsyncStateChange(std::chrono::nanoseconds timeout=std::chrono::seconds(0)) const
Definition qgst.cpp:1170
static QGstElementFactoryHandle findFactory(const char *)
Definition qgst.cpp:1070
QGstElement getParent() const
Definition qgst.cpp:1284
QGObjectHandlerConnection onNoMorePads(T *instance)
Definition qgst_p.h:652
QGstPipeline getPipeline() const
Definition qgst.cpp:1320
static QGstElement createFromPipelineDescription(const char *)
Definition qgst.cpp:1051
GstState state(std::chrono::nanoseconds timeout=std::chrono::seconds(0)) const
Definition qgst.cpp:1118
QGstPad src() const
Definition qgst.cpp:1098
std::optional< std::chrono::milliseconds > durationInMs() const
Definition qgst.cpp:1221
T * getObject(const char *property) const
Definition qgst_p.h:450
void set(const char *property, double d)
Definition qgst.cpp:666
QGObjectHandlerConnection connect(const char *name, GCallback callback, gpointer userData)
Definition qgst.cpp:761
void * getObject(const char *property) const
Definition qgst.cpp:756
double getDouble(const char *property) const
Definition qgst.cpp:742
QGstObject & operator=(const QGstObject &)=default
int getInt(const char *property) const
Definition qgst.cpp:714
void set(const char *property, int32_t i)
Definition qgst.cpp:651
QLatin1StringView name() const
Definition qgst.cpp:792
void set(const char *property, const QGstObject &o)
Definition qgst.cpp:671
static void qDeleteFromVoidPointer(void *ptr)
Definition qgst_p.h:432
QGString getString(const char *property) const
Definition qgst.cpp:686
void disconnect(gulong handlerId)
Definition qgst.cpp:770
QGstObject getGstObject(const char *property) const
Definition qgst.cpp:749
QLatin1StringView typeName() const
Definition qgst.cpp:780
void set(const char *property, const char *str)
Definition qgst.cpp:636
bool getBool(const char *property) const
Definition qgst.cpp:700
GType type() const
Definition qgst.cpp:775
QGstObject & operator=(QGstObject &&) noexcept=default
void set(const char *property, void *object, GDestroyNotify destroyFunction)
Definition qgst.cpp:681
void set(const char *property, std::unique_ptr< Object > object)
Definition qgst_p.h:426
void set(const char *property, Object *object, GDestroyNotify destroyFunction)
Definition qgst_p.h:420
void set(const char *property, bool b)
Definition qgst.cpp:641
QGstObject(const QGstObject &)=default
quint64 getUInt64(const char *property) const
Definition qgst.cpp:721
QGstStructureView getStructure(const char *property) const
Definition qgst.cpp:693
qint64 getInt64(const char *property) const
Definition qgst.cpp:728
void set(const char *property, const QGstCaps &c)
Definition qgst.cpp:676
float getFloat(const char *property) const
Definition qgst.cpp:735
QGstObject(QGstObject &&) noexcept=default
uint getUInt(const char *property) const
Definition qgst.cpp:707
GstObject * object() const
Definition qgst.cpp:787
bool link(const QGstPad &sink) const
Definition qgst.cpp:898
GstEvent * stickyEvent(GstEventType type)
Definition qgst.cpp:932
void modifyPipelineInIdleProbe(Functor &&f)
Definition qgst_p.h:761
QGstTagListHandle tags() const
Definition qgst.cpp:864
QGstPad & operator=(QGstPad &&) noexcept=default
QGstPad(const QGstObject &o)
Definition qgst.cpp:838
bool isLinked() const
Definition qgst.cpp:893
bool unlinkPeer() const
Definition qgst.cpp:908
QGstPad(const QGstPad &)=default
QGstCaps queryCaps() const
Definition qgst.cpp:859
void doInIdleProbe(Functor &&work)
Definition qgst_p.h:696
GstPad * pad() const
Definition qgst.cpp:927
QGstPad(GstPad *pad, RefMode mode)
Definition qgst.cpp:846
QGstPad(QGstPad &&) noexcept=default
void sendFlushIfPaused()
Definition qgst.cpp:957
void sendFlushStartStop(bool resetTime)
Definition qgst.cpp:942
QGString streamId() const
Definition qgst.cpp:871
QGstPad & operator=(const QGstPad &)=default
void addProbe(T *instance, GstPadProbeType type)
Definition qgst_p.h:686
std::optional< QPlatformMediaPlayer::TrackType > inferTrackTypeFromName() const
Definition qgst.cpp:878
void addEosProbe(T *instance)
Definition qgst_p.h:749
bool sendEvent(GstEvent *event)
Definition qgst.cpp:937
QGstCaps currentCaps() const
Definition qgst.cpp:854
QGstElement parent() const
Definition qgst.cpp:922
bool unlink(const QGstPad &sink) const
Definition qgst.cpp:903
QGstPad peer() const
Definition qgst.cpp:917
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:313
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:1698
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:1606
void qForeachStreamInCollection(GstStreamCollection *collection, Functor &&f)
Definition qgst_p.h:980
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void > qLinkGstElements(const Ts &...ts)
Definition qgst_p.h:791
GstClockTime qGstClockTimeFromChrono(std::chrono::nanoseconds ns)
Definition qgst_p.h:959
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:810
QString qGstErrorMessageCannotFindElement(std::string_view element)
Definition qgst.cpp:1600
std::optional< QString > qGstErrorMessageIfElementsNotAvailable(const Arg &arg, Args... args)
Definition qgst_p.h:967
QVideoFrame qCreateFrameFromGstBuffer(QGstBufferHandle buffer, const QGstVideoInfo &videoInfo)
Definition qgst.cpp:1717
#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:988
@ 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:196
T max
Definition qgst_p.h:197
bool operator==(const QGRange &rhs) const
Definition qgst_p.h:202
friend bool operator<(const QGString &lhs, const QGString &rhs)
Definition qgst_p.h:250
friend bool operator<(const QLatin1StringView lhs, const QGString &rhs)
Definition qgst_p.h:262
bool operator==(const QGString &str) const
Definition qgst_p.h:242
QString toQString() const
Definition qgst_p.h:215
bool operator!=(const QLatin1StringView str) const
Definition qgst_p.h:247
bool operator!=(const QGString &str) const
Definition qgst_p.h:246
QLatin1StringView asStringView() const
Definition qgst_p.h:213
friend bool operator<(const QGString &lhs, const QLatin1StringView rhs)
Definition qgst_p.h:254
bool operator==(const QLatin1StringView str) const
Definition qgst_p.h:243
QByteArrayView asByteArrayView() const
Definition qgst_p.h:214
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:338
static bool unref(GstCaps *arg) noexcept
Definition qgst_p.h:340
static GstCaps * ref(GstCaps *arg) noexcept
Definition qgst_p.h:339
static bool unref(GstObject *arg) noexcept
Definition qgst_p.h:387
static GstObject * ref(GstObject *arg) noexcept
Definition qgst_p.h:382
static constexpr Type invalidValue() noexcept
Definition qgst_p.h:381
result_type operator()(const argument_type &e) const noexcept
Definition qgst_p.h:1006