4#include <QtCore/qloggingcategory.h>
14#if GST_CHECK_VERSION(1, 18, 0)
15 GST_SEEK_FLAG_INSTANT_RATE_CHANGE;
52 return QGstPipeline::adopt(
pipeline);
62 g_object_set_data_full(qGstCheckedCast<GObject>(
pipeline),
"pipeline-private",
d,
83 d->installMessageFilter(
filter);
95 d->installMessageFilter(
filter);
101 d->removeMessageFilter(
filter);
112 d->processPendingMessage(
types, std::chrono::nanoseconds{ 0 });
115void QGstPipeline::beginConfig()
120 ++
d->m_configCounter;
121 if (
d->m_configCounter > 1)
126 GstStateChangeReturn stateChangeReturn = gst_element_get_state(
element(), &
state, &
pending, 0);
127 switch (stateChangeReturn) {
128 case GST_STATE_CHANGE_ASYNC: {
129 if (
state == GST_STATE_PLAYING) {
132 if (!stateChangeSuccessful)
133 qWarning() <<
"QGstPipeline::beginConfig: timeout when waiting for state change";
139 case GST_STATE_CHANGE_FAILURE: {
140 qDebug() <<
"QGstPipeline::beginConfig: state change failure";
145 case GST_STATE_CHANGE_NO_PREROLL:
146 case GST_STATE_CHANGE_SUCCESS:
151 if (
d->m_savedState == GST_STATE_PLAYING)
155void QGstPipeline::endConfig()
160 --
d->m_configCounter;
161 if (
d->m_configCounter)
164 if (
d->m_savedState == GST_STATE_PLAYING)
166 d->m_savedState = GST_STATE_NULL;
174void QGstPipeline::seek(std::chrono::nanoseconds
pos,
double rate)
176 using namespace std::chrono_literals;
182 qCDebug(qLcGstPipeline) <<
"QGstPipeline::seek to" <<
pos <<
"rate:" <<
rate;
184 bool success = (
rate > 0)
185 ? gst_element_seek(
element(),
rate, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
186 GST_SEEK_TYPE_SET,
pos.count(), GST_SEEK_TYPE_END, 0)
187 : gst_element_seek(
element(),
rate, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
188 GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET,
pos.
count());
191 qDebug() <<
"seek: gst_element_seek failed" <<
pos;
198void QGstPipeline::seek(std::chrono::nanoseconds
pos)
200 qCDebug(qLcGstPipeline) <<
"QGstPipeline::seek to" <<
pos;
201 seek(
pos, getPrivate()->m_rate);
207 if (
rate ==
d->m_rate)
212 qCDebug(qLcGstPipeline) <<
"QGstPipeline::setPlaybackRate to" <<
rate;
229 if (instantRateChange && GST_CHECK_VERSION(1, 18, 0)) {
230 qCDebug(qLcGstPipeline) <<
"QGstPipeline::applyPlaybackRate instantly";
231 bool success = gst_element_seek(
233 GST_CLOCK_TIME_NONE, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
235 qDebug() <<
"setPlaybackRate: gst_element_seek failed";
251 d->m_position = *
pos;
252 qCDebug(qLcGstPipeline) <<
"QGstPipeline::position:"
253 << std::chrono::round<std::chrono::milliseconds>(*
pos);
255 qDebug() <<
"QGstPipeline: failed to query position, using previous position";
258 return d->m_position;
263 using namespace std::chrono;
264 return round<milliseconds>(
position());
269 gpointer
p = g_object_get_data(qGstCheckedCast<GObject>(
object()),
"pipeline-private");
void dumpGraph(const char *fileNamePrefix) const
std::optional< std::chrono::nanoseconds > position() const
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))
static QGstElement createFromFactory(const char *factory, const char *name=nullptr)
std::chrono::nanoseconds m_position
QGstPipelinePrivate(QGstBusHandle)
static QGstPipeline createFromFactory(const char *factory, const char *name)
GstStateChangeReturn setState(GstState state)
GstPipeline * pipeline() const
void installMessageFilter(QGstreamerSyncMessageFilter *filter)
void removeMessageFilter(QGstreamerSyncMessageFilter *filter)
constexpr QGstPipeline()=default
void applyPlaybackRate(bool instantRateChange)
double playbackRate() const
void setPosition(std::chrono::nanoseconds pos)
std::chrono::nanoseconds position() const
void processMessages(GstMessageType=GST_MESSAGE_ANY)
static QGstPipeline create(const char *name)
std::chrono::milliseconds positionInMs() const
void setPlaybackRate(double rate)
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 constexpr GstSeekFlags rateChangeSeekFlags
#define qCDebug(category,...)
#define Q_STATIC_LOGGING_CATEGORY(name,...)
static ControlElement< T > * ptr(QWidget *widget)
GLsizei GLenum GLenum * types
GLenum GLenum GLsizei count
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
QItemEditorFactory * factory