4#include <QtCore/qmap.h>
5#include <QtCore/qtimer.h>
6#include <QtCore/qmutex.h>
7#include <QtCore/qlist.h>
8#include <QtCore/qabstracteventdispatcher.h>
9#include <QtCore/qcoreapplication.h>
10#include <QtCore/qproperty.h>
50 if (
filter->processBusMessage(msg))
56 static GstBusSyncReply syncGstBusFilter(GstBus *bus, GstMessage *
message,
66 if (
filter->processSyncMessage(
89 static gboolean busCallback(GstBus *, GstMessage *
message, gpointer
data)
102 const bool hasGlib = dispatcher && dispatcher->
inherits(
"QEventDispatcherGlib");
108 while ((
message = gst_bus_poll(
m_bus, GST_MESSAGE_ANY, 0)) !=
nullptr) {
115 m_tag = gst_bus_add_watch_full(bus, G_PRIORITY_DEFAULT, busCallback,
this,
nullptr);
118 gst_bus_set_sync_handler(bus, (GstBusSyncHandler)syncGstBusFilter,
this,
nullptr);
126 gst_bus_remove_watch(
m_bus);
128 gst_bus_set_sync_handler(
m_bus,
nullptr,
nullptr,
nullptr);
129 gst_object_unref(GST_OBJECT(
m_bus));
163 GstPipeline *
pipeline = qGstCheckedCast<GstPipeline>(gst_pipeline_new(
name));
170 g_object_set_data_full(qGstCheckedCast<GObject>(
pipeline),
"pipeline-private",
d,
191 return d->inStoppedState;
197 d->inStoppedState = stopped;
203 d->m_flushOnConfigChanges =
flush;
209 d->installMessageFilter(
filter);
215 d->removeMessageFilter(
filter);
221 d->installMessageFilter(
filter);
227 d->removeMessageFilter(
filter);
234 if (
d->m_pendingFlush) {
235 d->m_pendingFlush =
false;
245 gst_bus_pop_filtered(
d->m_bus,
types),
259void QGstPipeline::beginConfig()
264 ++
d->m_configCounter;
265 if (
d->m_configCounter > 1)
270 GstStateChangeReturn stateChangeReturn = gst_element_get_state(
element(), &
state, &
pending, 0);
271 switch (stateChangeReturn) {
272 case GST_STATE_CHANGE_ASYNC: {
273 if (
state == GST_STATE_PLAYING) {
276 if (!stateChangeSuccessful)
277 qWarning() <<
"QGstPipeline::beginConfig: timeout when waiting for state change";
283 case GST_STATE_CHANGE_FAILURE: {
284 qDebug() <<
"QGstPipeline::beginConfig: state change failure";
289 case GST_STATE_CHANGE_NO_PREROLL:
290 case GST_STATE_CHANGE_SUCCESS:
295 if (
d->m_savedState == GST_STATE_PLAYING)
299void QGstPipeline::endConfig()
304 --
d->m_configCounter;
305 if (
d->m_configCounter)
308 if (
d->m_flushOnConfigChanges)
309 d->m_pendingFlush =
true;
310 if (
d->m_savedState == GST_STATE_PLAYING)
312 d->m_savedState = GST_STATE_NULL;
329 bool success = gst_element_seek(
element(),
rate, GST_FORMAT_TIME,
330 GstSeekFlags(GST_SEEK_FLAG_FLUSH),
331 GST_SEEK_TYPE_SET, from,
332 GST_SEEK_TYPE_SET, to);
343 if (
rate ==
d->m_rate)
346 if (!applyToPipeline) {
351 constexpr GstSeekFlags seekFlags =
352#if GST_CHECK_VERSION(1, 18, 0)
353 GST_SEEK_FLAG_INSTANT_RATE_CHANGE;
358 bool success = gst_element_seek(
element(),
rate, GST_FORMAT_TIME, seekFlags, GST_SEEK_TYPE_NONE,
359 GST_CLOCK_TIME_NONE, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
382 if (gst_element_query_position(
element(), GST_FORMAT_TIME, &
pos))
384 return d->m_position;
390 if (!gst_element_query_duration(
element(), GST_FORMAT_TIME, &
d))
397 gpointer
p = g_object_get_data(qGstCheckedCast<GObject>(
object()),
"pipeline-private");
static QAbstractEventDispatcher * eventDispatcher()
Returns a pointer to the event dispatcher object for the main thread.
GstElement * element() const
bool finishStateChange(std::chrono::nanoseconds timeout=std::chrono::seconds(5))
bool setStateSync(GstState state, std::chrono::nanoseconds timeout=std::chrono::seconds(1))
void installMessageFilter(QGstreamerSyncMessageFilter *filter)
void processMessage(const QGstreamerMessage &msg)
QList< QGstreamerBusMessageFilter * > busFilters
QGstPipelinePrivate(GstBus *bus, QObject *parent=nullptr)
void removeMessageFilter(QGstreamerSyncMessageFilter *filter)
bool m_flushOnConfigChanges
QList< QGstreamerSyncMessageFilter * > syncFilters
GstStateChangeReturn setState(GstState state)
GstPipeline * pipeline() const
bool inStoppedState() const
void installMessageFilter(QGstreamerSyncMessageFilter *filter)
void dumpGraph(const char *fileName)
void removeMessageFilter(QGstreamerSyncMessageFilter *filter)
constexpr QGstPipeline()=default
double playbackRate() const
bool seek(qint64 pos, double rate)
void processMessages(GstMessageType=GST_MESSAGE_ANY)
void setInStoppedState(bool stopped)
void setFlushOnConfigChanges(bool flush)
bool setPosition(qint64 pos)
bool setPlaybackRate(double rate, bool applyToPipeline=true)
static QGstPipeline create(const char *name)
static QGstPipeline adopt(GstPipeline *)
qsizetype removeAll(const AT &t)
void append(parameter_type t)
QObject * parent() const
Returns a pointer to the parent object.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
bool inherits(const char *classname) const
Returns true if this object is an instance of a class that inherits className or a QObject subclass t...
void start(int msec)
Starts or restarts the timer with a timeout interval of msec milliseconds.
void setInterval(int msec)
void timeout(QPrivateSignal)
This signal is emitted when the timer times out.
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 return DBusPendingCall * pending
DestinationType * qGstCheckedCast(SourceType *arg)
static ControlElement< T > * ptr(QWidget *widget)
GLsizei GLenum GLenum * types
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLuint GLsizei const GLchar * message
bool contains(const AT &t) const noexcept