14 : m_timeController(
tc),
15 m_lastPosition(
tc.currentPosition()),
16 m_seekPos(
tc.currentPosition(-seekPosTimeOffset))
23 m_timeController.
syncSoft(tp, trackTime);
35 return m_lastPosition;
49 if (!m_isStepForced.exchange(
true))
57 m_explicitNextFrameTime = Clock::now();
65 return m_isStepForced;
75 const auto isFrameOutdated =
frame.isValid() &&
frame.absoluteEnd() < m_seekPos;
77 if (isFrameOutdated) {
78 qCDebug(qLcRenderer) <<
"frame outdated! absEnd:" <<
frame.absoluteEnd() <<
"absPts"
79 <<
frame.absolutePts() <<
"seekPos:" << m_seekPos;
84 m_frames.enqueue(
frame);
86 if (m_frames.size() == 1)
108 auto frame = !m_frames.empty() ? m_frames.front() :
Frame();
109 if (
frame.isValid()) {
110 using namespace std::chrono;
112 const auto nextTime = m_explicitNextFrameTime
113 ? *m_explicitNextFrameTime
116 const auto delay = nextTime - Clock::now();
117 return std::max(0,
static_cast<int>(duration_cast<milliseconds>(delay).
count()));
125 if (!m_isStepForced.exchange(
false))
128 m_explicitNextFrameTime.reset();
135 auto frame = m_frames.front();
147 m_explicitNextFrameTime.reset();
150 if (
frame.isValid()) {
151 m_lastPosition = std::max(
frame.absolutePts(), m_lastPosition.load());
152 m_seekPos =
frame.absoluteEnd();
154 const auto loopIndex =
frame.loopOffset().index;
155 if (m_loopIndex < loopIndex) {
156 m_loopIndex = loopIndex;
163 m_explicitNextFrameTime = Clock::now() +
result.recheckInterval;
173 return std::chrono::duration_cast<std::chrono::microseconds>(
179 const auto now = Clock::now();
189#include "moc_qffmpegrenderer_p.cpp"
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)
bool canDoNextStep() const override
void setPlaybackRate(float rate)
qint64 seekPosition() const
float playbackRate() const
std::chrono::microseconds frameDelay(const Frame &frame) 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
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)
float playbackRate() const
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