14 : m_timeController(
tc),
15 m_lastFrameEnd(
tc.currentPosition()),
16 m_lastPosition(m_lastFrameEnd),
17 m_seekPos(
tc.currentPosition(-seekPosTimeOffset))
24 m_timeController.
syncSoft(tp, trackTime);
36 return m_lastPosition;
58 m_explicitNextFrameTime = Clock::now();
66 return m_isStepForced;
79 m_timeController.
sync(tp, trackPos);
92 if (isFrameOutdated) {
93 qCDebug(qLcRenderer) <<
"frame outdated! absEnd:" <<
frame.absoluteEnd() <<
"absPts"
99 m_frames.enqueue(
frame);
101 if (m_frames.size() == 1)
123 if (m_frames.empty())
126 auto calculateInterval = [](
const TimePoint &nextTime) {
127 using namespace std::chrono;
129 const auto delay = nextTime - Clock::now();
130 return std::max(0,
static_cast<int>(duration_cast<milliseconds>(delay).
count()));
133 if (m_explicitNextFrameTime)
134 return calculateInterval(*m_explicitNextFrameTime);
136 if (m_frames.front().isValid())
137 return calculateInterval(m_timeController.
timeFromPosition(m_frames.front().absolutePts()));
139 if (m_lastFrameEnd > 0)
140 return calculateInterval(m_timeController.
timeFromPosition(m_lastFrameEnd));
150 m_explicitNextFrameTime.reset();
157 auto frame = m_frames.front();
169 m_explicitNextFrameTime.reset();
172 if (
frame.isValid()) {
176 m_lastFrameEnd =
frame.absoluteEnd();
179 const auto loopIndex =
frame.loopOffset().index;
180 if (m_loopIndex < loopIndex) {
181 m_loopIndex = loopIndex;
190 m_explicitNextFrameTime = Clock::now() +
result.recheckInterval;
200 return std::chrono::duration_cast<std::chrono::microseconds>(
206 const auto now = Clock::now();
216#include "moc_qffmpegrenderer_p.cpp"
bool testAndSetOrdered(T expectedValue, T newValue) noexcept
void storeRelaxed(T newValue) noexcept
void storeRelease(T newValue) noexcept
virtual bool canDoNextStep() const
virtual void onPauseChanged()
void setAtEnd(bool isAtEnd)
void scheduleNextStep(bool allowDoImmediatelly=true)
int timerInterval() const override
void onPauseChanged() override
void syncSoft(TimePoint tp, qint64 trackPos)
void doNextStep() override
TimeController::TimePoint TimePoint
virtual RenderingResult renderInternal(Frame frame)=0
void frameProcessed(Frame)
void setInitialPosition(TimePoint tp, qint64 trackPos)
bool canDoNextStep() const override
void setPlaybackRate(float rate)
qint64 seekPosition() const
float playbackRate() const
std::chrono::microseconds frameDelay(const Frame &frame, TimePoint timePoint=Clock::now()) const
Renderer(const TimeController &tc, const std::chrono::microseconds &seekPosTimeOffset={})
virtual void onPlaybackRateChanged()
void onFinalFrameReceived()
void changeRendererTime(std::chrono::microseconds offset)
void loopChanged(Id id, qint64 offset, int index)
qint64 lastPosition() const
bool isStepForced() const
PlaybackRate playbackRate() const
void sync(qint64 trackPos=0)
qint64 positionFromTime(TimePoint tp, bool ignorePause=false) const
TimePoint timeFromPosition(qint64 pos, bool ignorePause=false) const
void setPlaybackRate(PlaybackRate playbackRate)
void setPaused(bool paused)
void syncSoft(const TimePoint &tp, qint64 pos, const Clock::duration &fixingTime=std::chrono::seconds(4))
Combined button and popup list for selecting options.
#define Q_LOGGING_CATEGORY(name,...)
#define qCDebug(category,...)
GLenum GLenum GLsizei count
GLenum GLuint GLintptr offset