4#include "playbackengine/qffmpegtimecontroller_p.h"
22 return m_playbackRate;
27 if (playbackRate == m_playbackRate)
30 Q_ASSERT(playbackRate > 0.f);
33 m_playbackRate = playbackRate;
36 m_softSyncData = makeSoftSyncData(m_timePoint, m_position, m_softSyncData->dstTimePoint);
41 sync(SteadyClock::now(), trackPos);
46 m_softSyncData.reset();
53 const auto srcTime = SteadyClock::now();
54 const auto srcPos = positionFromTime(srcTime,
true);
55 const auto dstTime = srcTime + fixingTime;
60 m_softSyncData = makeSoftSyncData(srcTime, srcPos, dstTime);
65 return positionFromTime(SteadyClock::now() + offset);
88 const bool active = !m_paused && m_started;
89 if (m_active == active)
99 tp = !m_active && !ignoreInactive ? m_timePoint : tp;
101 if (m_softSyncData && tp < m_softSyncData->dstTimePoint) {
103 tp > m_softSyncData->srcTimePoint ? m_softSyncData->internalRate : m_playbackRate;
105 return m_softSyncData->srcPosition
106 + toTrackDuration(tp - m_softSyncData->srcTimePoint, rate);
109 return positionFromTimeInternal(tp);
113 bool ignoreInactive)
const
115 auto position = !m_active && !ignoreInactive ? m_position : TrackPosition(pos);
117 if (m_softSyncData && position < m_softSyncData->dstPosition) {
118 const auto rate = position > m_softSyncData->srcPosition ? m_softSyncData->internalRate
120 return m_softSyncData->srcTimePoint
121 + toClockDuration(position - m_softSyncData->srcPosition, rate);
124 return timeFromPositionInternal(position);
128 const TrackPosition &srcPos,
129 const TimePoint &dstTp)
const
132 result.srcTimePoint = srcTp;
133 result.srcPosition = srcPos;
134 result.dstTimePoint = dstTp;
135 result.srcPosOffest = srcPos - positionFromTimeInternal(srcTp);
136 result.dstPosition = positionFromTimeInternal(dstTp);
137 result.internalRate =
138 static_cast<
PlaybackRate>(toClockDuration(result.dstPosition - srcPos).count())
139 / (dstTp - srcTp).count();
144TrackPosition
TimeController::positionFromTimeInternal(
const TimePoint &tp)
const
146 return m_position + toTrackDuration(tp - m_timePoint, m_playbackRate);
149TimeController::TimePoint
TimeController::timeFromPositionInternal(
const TrackPosition &pos)
const
151 return m_timePoint + toClockDuration(pos - m_position, m_playbackRate);
156 const auto now = SteadyClock::now();
158 m_position = positionFromTimeInternal(now);
161 if (m_softSyncData && m_softSyncData->dstTimePoint <= now)
162 m_softSyncData.reset();
163 }
else if (m_softSyncData) {
164 m_softSyncData->dstTimePoint += now - m_timePoint;
165 m_softSyncData->srcTimePoint += now - m_timePoint;
173 return std::chrono::duration_cast<SteadyClock::duration>(
174 std::chrono::microseconds(trackDuration.get()) / rate);
179 return TrackDuration(
180 std::chrono::duration_cast<
std::chrono::microseconds>(clockDuration * rate).count());
void syncSoft(TimePoint tp, TrackPosition pos, SteadyClock::duration fixingTime=std::chrono::seconds(4))
PlaybackRate playbackRate() const
TrackPosition currentPosition(SteadyClock::duration offset=SteadyClock::duration{ 0 }) const
TimePoint timeFromPosition(TrackPosition pos, bool ignoreInactive=false) const
TrackPosition positionFromTime(TimePoint tp, bool ignoreInactive=false) const
void sync(TimePoint tp, TrackPosition pos)
void setPlaybackRate(PlaybackRate playbackRate)
void setPaused(bool paused)
void sync(TrackPosition trackPos=TrackPosition(0))
std::conditional_t< QT_FFMPEG_AVIO_WRITE_CONST, const uint8_t *, uint8_t * > AvioWriteBufferType