18#include <private/qtmultimediaglobal_p.h>
21#include <QtCore/qlist.h>
23#include <QtMultimedia/qaudioformat.h>
24#include <QtMultimedia/qvideoframe.h>
27#include <gst/video/video-info.h>
31#if QT_CONFIG(gstreamer_photography)
32#define GST_USE_UNSTABLE_API
33#include <gst/interfaces/photography.h>
34#undef GST_USE_UNSTABLE_API
61 operator const char *() {
return str; }
74 if (!G_VALUE_HOLDS_BOOLEAN(
value))
76 return g_value_get_boolean(
value);
78 std::optional<int>
toInt()
const
80 if (!G_VALUE_HOLDS_INT(
value))
82 return g_value_get_int(
value);
86 if (!G_VALUE_HOLDS_INT64(
value))
88 return g_value_get_int64(
value);
93 return value ?
static_cast<T *
>(g_value_get_pointer(
value)) :
nullptr;
98 return value ? g_value_get_string(
value) :
nullptr;
102 if (!GST_VALUE_HOLDS_FRACTION(
value))
104 return (
float)gst_value_get_fraction_numerator(
value)/(float)gst_value_get_fraction_denominator(
value);
109 if (!GST_VALUE_HOLDS_FRACTION_RANGE(
value))
118 if (!GST_VALUE_HOLDS_INT_RANGE(
value))
161 GstCaps *caps =
nullptr;
182 gst_caps_unref(caps);
187 if (
this != &
other) {
189 gst_caps_ref(
other.caps);
191 gst_caps_unref(caps);
200 int size()
const {
return int(gst_caps_get_size(caps)); }
202 GstCaps *
get()
const {
return caps; }
204 auto *features = gst_caps_get_features(caps, 0);
205 if (gst_caps_features_contains(features,
"memory:GLMemory"))
207 else if (gst_caps_features_contains(features,
"memory:DMABuf"))
221 gchar *
c = gst_caps_to_string(caps);
256 gst_object_ref(
other.m_object);
268 if (
this != &
other) {
281 explicit operator bool()
const {
return bool(
m_object); }
284 {
return a.m_object ==
b.m_object; }
286 {
return a.m_object !=
b.m_object; }
313 void connect(
const char *
name, GCallback callback, gpointer userData) { g_signal_connect(
m_object,
name, callback, userData); }
344 GstPad *
pad()
const {
return GST_PAD_CAST(
object()); }
349 template<auto Member,
typename T>
352 static GstPadProbeReturn callback(GstPad *pad, GstPadProbeInfo *
info, gpointer userData) {
353 return (
static_cast<T *
>(userData)->*Member)(
QGstPad(pad, NeedsRef),
info);
357 gst_pad_add_probe (
pad(),
type, Impl::callback, instance,
nullptr);
361 struct CallbackData {
363 std::function<
void()> work;
367 auto callback= [](GstPad *, GstPadProbeInfo *, gpointer
p) {
368 auto cd =
reinterpret_cast<CallbackData*
>(
p);
370 cd->waitDone.release();
371 return GST_PAD_PROBE_REMOVE;
374 gst_pad_add_probe(
pad(), GST_PAD_PROBE_TYPE_IDLE, callback, &cd,
nullptr);
375 cd.waitDone.acquire();
378 template<auto Member,
typename T>
381 static GstPadProbeReturn callback(GstPad *, GstPadProbeInfo *
info, gpointer userData) {
382 if (GST_EVENT_TYPE(GST_PAD_PROBE_INFO_DATA(
info)) != GST_EVENT_EOS)
383 return GST_PAD_PROBE_PASS;
384 (
static_cast<T *
>(userData)->*Member)();
385 return GST_PAD_PROBE_REMOVE;
389 gst_pad_add_probe (
pad(), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, Impl::callback, instance,
nullptr);
404 GstClock *
clock()
const {
return GST_CLOCK_CAST(
object()); }
406 GstClockTime
time()
const {
return gst_clock_get_time(
clock()); }
430 {
return gst_element_link(
element(),
next.element()); }
448#if GST_CHECK_VERSION(1,19,1)
466 if (change == GST_STATE_CHANGE_ASYNC) {
467 change = gst_element_get_state(
element(),
nullptr, &
state, 1000*1e6 );
470 if (change != GST_STATE_CHANGE_SUCCESS && change != GST_STATE_CHANGE_NO_PREROLL)
473 return change == GST_STATE_CHANGE_SUCCESS;
478 auto change = gst_element_get_state(
element(),
nullptr,
nullptr, 1000*1e6 );
480 if (change != GST_STATE_CHANGE_SUCCESS && change != GST_STATE_CHANGE_NO_PREROLL)
483 return change == GST_STATE_CHANGE_SUCCESS;
492 template<auto Member,
typename T>
495 static void callback(GstElement *
e, GstPad *pad, gpointer userData) {
500 connect(
"pad-added", G_CALLBACK(Impl::callback), instance);
502 template<auto Member,
typename T>
505 static void callback(GstElement *
e, GstPad *pad, gpointer userData) {
510 connect(
"pad-removed", G_CALLBACK(Impl::callback), instance);
512 template<auto Member,
typename T>
515 static void callback(GstElement *
e, gpointer userData) {
520 connect(
"no-more-pads", G_CALLBACK(Impl::callback), instance);
572 gst_element_add_pad(
element(), gst_ghost_pad_new(
name, pad.
pad()));
578 if (!
value || !GST_VALUE_HOLDS_STRUCTURE(
value))
592 return QStringLiteral(
"Could not find the %1 GStreamer element").arg(element.data());
std::optional< int > toInt64() const
std::optional< QGRange< int > > toIntRange() const
std::optional< int > toInt() const
Q_MULTIMEDIA_EXPORT QList< QAudioFormat::SampleFormat > getSampleFormats() const
std::optional< QGRange< float > > getFractionRange() const
const char * toString() const
QGstStructure toStructure() const
std::optional< float > getFraction() const
QGValue at(int index) const
std::optional< bool > toBool() const
void add(const QGstElement &e1, const QGstElement &e2)
void add(const QGstElement &e1, const QGstElement &e2, const QGstElement &e3)
QGstBin(const char *name)
void addGhostPad(const QGstElement &child, const char *name)
void remove(const QGstElement &element)
void add(const QGstElement &element)
void add(const QGstElement &e1, const QGstElement &e2, const QGstElement &e3, const QGstElement &e4, const QGstElement &e5)
void add(const QGstElement &e1, const QGstElement &e2, const QGstElement &e3, const QGstElement &e4)
QGstBin(const QGstObject &o)
void addGhostPad(const char *name, const QGstPad &pad)
QGstBin(GstBin *bin, RefMode mode=NeedsRef)
void add(const QGstElement &e1, const QGstElement &e2, const QGstElement &e3, const QGstElement &e4, const QGstElement &e5, const QGstElement &e6)
QByteArray toString() const
void addPixelFormats(const QList< QVideoFrameFormat::PixelFormat > &formats, const char *modifier=nullptr)
QGstCaps & operator=(const QGstCaps &other)
QGstCaps(GstCaps *c, RefMode mode)
static QGstCaps fromCameraFormat(const QCameraFormat &format)
QGstCaps(const QGstCaps &other)
QGstStructure at(int index) const
QVideoFrameFormat formatForCaps(GstVideoInfo *info) const
static QByteArray toString(const GstCaps *caps)
MemoryFormat memoryFormat() const
QGstClock(GstClock *clock, RefMode mode=NeedsRef)
GstClockTime time() const
QGstClock(const QGstObject &o)
void setBaseTime(GstClockTime time) const
GstStateChangeReturn setState(GstState state)
bool link(const QGstElement &n1, const QGstElement &n2)
GstElement * element() const
void onPadRemoved(T *instance)
void lockState(bool locked)
bool link(const QGstElement &n1, const QGstElement &n2, const QGstElement &n3, const QGstElement &n4)
QGstPad getRequestPad(const char *name) const
void onPadAdded(T *instance)
bool isStateLocked() const
void sendEvent(GstEvent *event) const
GstClockTime baseTime() const
bool link(const QGstElement &n1, const QGstElement &n2, const QGstElement &n3)
bool link(const QGstElement &n1, const QGstElement &n2, const QGstElement &n3, const QGstElement &n4, const QGstElement &n5)
QGstElement(const QGstObject &o)
bool setStateSync(GstState state)
void releaseRequestPad(const QGstPad &pad) const
bool syncStateWithParent()
void unlink(const QGstElement &next)
QGstElement(const char *factory, const char *name=nullptr)
QGstPad staticPad(const char *name) const
bool link(const QGstElement &next)
void onNoMorePads(T *instance)
QGstElement(GstElement *element, RefMode mode=NeedsRef)
QGstObject(QGstObject &&other) noexcept
void set(const char *property, double d)
void set(const char *property, uint i)
QGstStructure getStructure(const char *property) const
friend bool operator==(const QGstObject &a, const QGstObject &b)
QGstObject & operator=(QGstObject &&other)
QGstObject & operator=(const QGstObject &other)
double getDouble(const char *property) const
const char * name() const
int getInt(const char *property) const
void set(const char *property, const QGstObject &o)
QGString getString(const char *property) const
void set(const char *property, int i)
friend bool operator!=(const QGstObject &a, const QGstObject &b)
QGstObject(GstObject *o, RefMode mode=HasRef)
QGstObject getObject(const char *property) const
void set(const char *property, const char *str)
QGstObject(const QGstObject &other)
bool getBool(const char *property) const
void set(const char *property, qint64 i)
void set(const char *property, bool b)
void set(const char *property, quint64 i)
quint64 getUInt64(const char *property) const
qint64 getInt64(const char *property) const
void set(const char *property, const QGstCaps &c)
float getFloat(const char *property) const
void connect(const char *name, GCallback callback, gpointer userData)
uint getUInt(const char *property) const
GstObject * object() const
bool link(const QGstPad &sink) const
GstEvent * stickyEvent(GstEventType type)
QGstPad(const QGstObject &o)
QGstPad(GstPad *pad, RefMode mode=NeedsRef)
QGstCaps queryCaps() const
void addProbe(T *instance, GstPadProbeType type)
void addEosProbe(T *instance)
bool sendEvent(GstEvent *event)
QGstCaps currentCaps() const
QGstElement parent() const
bool unlink(const QGstPad &sink) const
void doInIdleProbe(std::function< void()> work)
Q_MULTIMEDIA_EXPORT QSize resolution() const
QGstStructure copy() const
const GstStructure * structure
Q_MULTIMEDIA_EXPORT QGRange< float > frameRateRange() const
QByteArrayView name() const
QGValue operator[](const char *name) const
Q_MULTIMEDIA_EXPORT QVideoFrameFormat::PixelFormat pixelFormat() const
QByteArray toString() const
QGstStructure(const GstStructure *s)
\macro QT_RESTRICTED_CAST_FROM_ASCII
Combined button and popup list for selecting options.
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
QString errorMessageCannotFindElement(std::string_view element)
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
GLboolean GLboolean GLboolean GLboolean a
[7]
GLint GLsizei GLsizei GLenum format
GLsizei GLenum GLboolean sink
GLsizei const GLchar *const * string
[0]
#define QStringLiteral(str)
unsigned long long quint64
QFileInfo info(fileName)
[8]
QItemEditorFactory * factory