Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qffmpegtimecontroller.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5
6#include "qglobal.h"
7#include "qdebug.h"
8
9#include <algorithm>
10
12
13namespace QFFmpeg {
14
16{
17 sync();
18}
19
21{
22 return m_playbackRate;
23}
24
26{
27 if (playbackRate == m_playbackRate)
28 return;
29
31
32 scrollTimeTillNow();
33 m_playbackRate = playbackRate;
34
35 if (m_softSyncData)
36 m_softSyncData = makeSoftSyncData(m_softSyncData->srcTimePoint, m_softSyncData->srcPosition,
37 m_softSyncData->dstTimePoint);
38}
39
41{
42 sync(Clock::now(), trackPos);
43}
44
46{
47 m_softSyncData.reset();
48 m_position = TrackTime(pos);
49 m_timePoint = tp;
50}
51
52void TimeController::syncSoft(const TimePoint &tp, qint64 pos, const Clock::duration &fixingTime)
53{
54 const auto srcTime = Clock::now();
55 const auto srcPos = positionFromTime(srcTime, true);
56 const auto dstTime = srcTime + fixingTime;
57
58 m_position = TrackTime(pos);
59 m_timePoint = tp;
60
61 m_softSyncData = makeSoftSyncData(srcTime, TrackTime(srcPos), dstTime);
62}
63
64qint64 TimeController::currentPosition(const Clock::duration &offset) const
65{
66 return positionFromTime(Clock::now() + offset);
67}
68
70{
71 if (m_paused == paused)
72 return;
73
74 scrollTimeTillNow();
75 m_paused = paused;
76}
77
79{
80 tp = m_paused && !ignorePause ? m_timePoint : tp;
81
82 if (m_softSyncData && tp < m_softSyncData->dstTimePoint) {
83 const float rate =
84 tp > m_softSyncData->srcTimePoint ? m_softSyncData->internalRate : m_playbackRate;
85
86 return (m_softSyncData->srcPosition
87 + toTrackTime((tp - m_softSyncData->srcTimePoint) * rate))
88 .count();
89 }
90
91 return positionFromTimeInternal(tp).count();
92}
93
95{
96 auto position = m_paused && !ignorePause ? m_position : TrackTime(pos);
97
98 if (m_softSyncData && position < m_softSyncData->dstPosition) {
99 const auto rate = position > m_softSyncData->srcPosition ? m_softSyncData->internalRate
100 : m_playbackRate;
101 return m_softSyncData->srcTimePoint
102 + toClockTime((position - m_softSyncData->srcPosition) / rate);
103 }
104
105 return timeFromPositionInternal(position);
106}
107
108TimeController::SoftSyncData TimeController::makeSoftSyncData(const TimePoint &srcTp,
109 const TrackTime &srcPos,
110 const TimePoint &dstTp) const
111{
112 SoftSyncData result;
113 result.srcTimePoint = srcTp;
114 result.srcPosition = srcPos;
115 result.dstTimePoint = dstTp;
116 result.srcPosOffest = srcPos - positionFromTimeInternal(srcTp);
117 result.dstPosition = positionFromTimeInternal(dstTp);
118 result.internalRate =
119 static_cast<PlaybackRate>(toClockTime(TrackTime(result.dstPosition - srcPos)).count())
120 / (dstTp - srcTp).count();
121
122 return result;
123}
124
125TimeController::TrackTime TimeController::positionFromTimeInternal(const TimePoint &tp) const
126{
127 return m_position + toTrackTime((tp - m_timePoint) * m_playbackRate);
128}
129
130TimeController::TimePoint TimeController::timeFromPositionInternal(const TrackTime &pos) const
131{
132 return m_timePoint + toClockTime(TrackTime(pos - m_position) / m_playbackRate);
133}
134
135void TimeController::scrollTimeTillNow()
136{
137 const auto now = Clock::now();
138 if (!m_paused)
139 m_position = positionFromTimeInternal(now);
140 else if (m_softSyncData) {
141 m_softSyncData->dstTimePoint += now - m_timePoint;
142 m_softSyncData->srcTimePoint += now - m_timePoint;
143 }
144
145 m_timePoint = now;
146}
147
148template<typename T>
149TimeController::Clock::duration TimeController::toClockTime(const T &t)
150{
151 return std::chrono::duration_cast<Clock::duration>(t);
152}
153
154template<typename T>
155TimeController::TrackTime TimeController::toTrackTime(const T &t)
156{
157 return std::chrono::duration_cast<TrackTime>(t);
158}
159
160} // namespace QFFmpeg
161
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)
qint64 currentPosition(const Clock::duration &offset=Clock::duration{ 0 }) const
void syncSoft(const TimePoint &tp, qint64 pos, const Clock::duration &fixingTime=std::chrono::seconds(4))
Combined button and popup list for selecting options.
GLenum GLuint GLintptr offset
GLuint GLenum * rate
GLdouble GLdouble t
Definition qopenglext.h:243
GLuint64EXT * result
[6]
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
long long qint64
Definition qtypes.h:55