3#ifndef QFFMPEGPLAYBACKENGINEOBJECT_P_H
4#define QFFMPEGPLAYBACKENGINEOBJECT_P_H
17#include <QtCore/qatomic.h>
18#include <QtCore/qthread.h>
19#include <QtCore/qcoreevent.h>
20#include <QtCore/qcoreapplication.h>
21#include <QtMultimedia/qmediaplayer.h>
22#include <QtFFmpegMediaPluginImpl/private/qffmpegplaybackenginedefs_p.h>
23#include <QtFFmpegMediaPluginImpl/private/qffmpegplaybackutils_p.h>
39 class FuncEvent :
public QEvent
42 FuncEvent() : QEvent(FuncEventType) { }
43 virtual void invoke() = 0;
47 class FuncEventImpl
final :
public FuncEvent
50 explicit FuncEventImpl(F &&f) : m_func(std::forward<F>(f)) { }
51 void invoke()
override { m_func(); }
54 std::decay_t<F> m_func;
81 bool event(QEvent *e)
override;
83 bool checkSessionID(quint64 sessionID)
const {
return sessionID == m_id.sessionID; }
85 bool checkID(
const PlaybackEngineObjectID &id)
const
87 return checkSessionID(id.sessionID) && id.objectID == objectID();
92 Q_ASSERT(thread()->isCurrentThread());
99 m_invalidateCounter.fetch_add(1, std::memory_order_relaxed);
100 invokePriorityMethod([f =
std::forward<F>(f),
this, newID]() {
101 const int count = m_invalidateCounter.fetch_sub(1, std::memory_order_relaxed) - 1;
102 Q_ASSERT(count >= 0);
106 m_id.sessionID = newID;
112 template <
typename F>
115 Q_ASSERT(!thread()->isCurrentThread());
117 QCoreApplication::postEvent(
this,
new FuncEventImpl<F>(std::forward<F>(f)),
118 Qt::HighEventPriority);
121 QChronoTimer &
timer();
139 enum class StepType : uint8_t { None, Timeout, Immediate };
141 void doNextStep(StepType type);
143 bool isValid()
const {
return m_invalidateCounter.load(std::memory_order_relaxed) == 0; }
145 std::unique_ptr<QChronoTimer> m_timer;
147 QAtomicInteger<
bool> m_paused =
true;
148 QAtomicInteger<
bool> m_atEnd =
false;
149 std::atomic_int m_invalidateCounter = 0;
150 PlaybackEngineObjectID m_id;
154 StepType m_stepType = StepType::None;
bool checkID(const PlaybackEngineObjectID &id) const
bool checkSessionID(quint64 sessionID) const
~PlaybackEngineObject() override
std::optional< TimePoint > TimePointOpt
void error(QMediaPlayer::Error, const QString &errorString)
void updateSession(quint64 newID, F &&f)
const PlaybackEngineObjectID & id() const
virtual bool canDoNextStep() const
PlaybackEngineObject(const PlaybackEngineObjectID &id)
virtual TimePoint nextTimePoint() const
bool event(QEvent *e) override
This virtual function receives events to an object and should return true if the event e was recogniz...
virtual void doNextStep()
void invokePriorityMethod(F &&f)
virtual void onPauseChanged()
void setAtEnd(bool isAtEnd)
std::chrono::steady_clock::time_point TimePoint
void setPaused(bool isPaused)
std::conditional_t< QT_FFMPEG_AVIO_WRITE_CONST, const uint8_t *, uint8_t * > AvioWriteBufferType
Combined button and popup list for selecting options.