Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
qffmpegplaybackengineobject.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
4
#
include
"playbackengine/qffmpegplaybackengineobject_p.h"
5
6
#
include
<
QtCore
/
qchronotimer
.
h
>
7
#
include
<
QtCore
/
qdebug
.
h
>
8
#
include
<
QtCore
/
qscopedvaluerollback
.
h
>
9
10
QT_BEGIN_NAMESPACE
11
12
namespace
QFFmpeg
{
13
14
PlaybackEngineObject
::
PlaybackEngineObject
(
const
PlaybackEngineObjectID &id) :
m_id
{
id
} { }
15
16
PlaybackEngineObject
::~
PlaybackEngineObject
()
17
{
18
if
(!thread()->isCurrentThread())
19
qWarning() <<
"The playback engine object is being removed in an unexpected thread"
;
20
}
21
22
bool
PlaybackEngineObject
::
isPaused
()
const
23
{
24
return
m_paused;
25
}
26
27
void
PlaybackEngineObject
::
setAtEnd
(
bool
isAtEnd)
28
{
29
if
(m_atEnd.testAndSetRelease(!isAtEnd, isAtEnd) && isAtEnd)
30
Q_EMIT atEnd(id());
31
}
32
33
bool
PlaybackEngineObject
::
isAtEnd
()
const
34
{
35
return
m_atEnd;
36
}
37
38
void
PlaybackEngineObject
::
setPaused
(
bool
isPaused)
39
{
40
if
(m_paused.testAndSetRelease(!isPaused, isPaused))
41
invokePriorityMethod([
this
]() {
onPauseChanged
(
)
; });
42
}
43
44
void
PlaybackEngineObject
::
kill
()
45
{
46
m_invalidateCounter.fetch_add(1, std::memory_order_relaxed);
47
48
disconnect();
49
deleteLater();
50
}
51
52
bool
PlaybackEngineObject
::
canDoNextStep
()
const
53
{
54
return
!m_paused;
55
}
56
57
QChronoTimer &
PlaybackEngineObject
::
timer
()
58
{
59
if
(!m_timer) {
60
m_timer = std::make_unique<QChronoTimer>();
61
m_timer->setTimerType(Qt::PreciseTimer);
62
m_timer->setSingleShot(
true
);
63
connect(m_timer.get(), &QChronoTimer::timeout,
this
, &PlaybackEngineObject::onTimeout);
64
}
65
66
return
*m_timer;
67
}
68
69
void
PlaybackEngineObject
::onTimeout()
70
{
71
Q_ASSERT(m_timePoint && !m_nextTimePoint && m_stepType == StepType::None);
72
73
m_timePoint.reset();
74
if
(isValid() &&
canDoNextStep
(
)
)
75
doNextStep(StepType::Timeout);
76
}
77
78
PlaybackEngineObject
::
TimePoint
PlaybackEngineObject
::
nextTimePoint
()
const
79
{
80
return
TimePoint::min();
81
}
82
83
void
PlaybackEngineObject
::
onPauseChanged
()
84
{
85
scheduleNextStep
(
)
;
86
}
87
88
void
PlaybackEngineObject
::
scheduleNextStep
()
89
{
90
using
std
::chrono::milliseconds;
91
using
namespace
std
::chrono_literals;
92
93
if
(isValid() && canDoNextStep())
94
m_nextTimePoint = nextTimePoint();
95
else
96
m_nextTimePoint.reset();
97
98
if
(m_stepType == StepType::Immediate)
99
return
;
100
101
std::optional<TimePoint> nowCached;
102
auto
now = [&nowCached,
this
]() {
103
Q_ASSERT(m_nextTimePoint);
104
105
if
(!nowCached) {
106
Q_ASSERT(m_nextTimePoint);
107
if
(*m_nextTimePoint == TimePoint::min())
108
// 2 optimizations: reduce invoking SteadyClock::now() and timer's restarts
109
nowCached = TimePoint::min();
110
else
111
nowCached = SteadyClock::now();
112
}
113
114
return
*nowCached;
115
};
116
117
if
(m_stepType == StepType::None && m_nextTimePoint) {
118
if
(*m_nextTimePoint <= now()) {
119
m_nextTimePoint.reset();
120
doNextStep(StepType::Immediate);
121
nowCached.reset();
// doNextStep() may take some time, 'now' is not valid anymore
122
}
123
}
124
125
if
(m_nextTimePoint) {
126
*m_nextTimePoint = std::max(*m_nextTimePoint, now());
127
if
(!m_timePoint || *m_nextTimePoint != std::max(*m_timePoint, now())) {
128
timer
(
)
.setInterval(*m_nextTimePoint - now());
129
timer
(
)
.start();
130
}
131
}
else
if
(m_timePoint) {
132
timer
(
)
.stop();
133
}
134
135
m_timePoint = std::exchange(m_nextTimePoint, std::nullopt);
136
}
137
138
void
PlaybackEngineObject
::doNextStep(StepType type)
139
{
140
Q_ASSERT(m_stepType == StepType::None && type != StepType::None);
141
QScopedValueRollback rollback(m_stepType, type);
142
doNextStep
(
)
;
143
}
144
145
bool
PlaybackEngineObject
::
event
(QEvent *e)
146
{
147
if
(e->type() == FuncEventType) {
148
e->accept();
149
static_cast
<FuncEvent *>(e)->invoke();
150
return
true
;
151
}
152
153
return
QObject::event(e);
154
}
155
156
}
// namespace QFFmpeg
157
158
QT_END_NAMESPACE
159
160
#
include
"moc_qffmpegplaybackengineobject_p.cpp"
QFFmpeg::PlaybackEngineObject
Definition
qffmpegplaybackengineobject_p.h:35
QFFmpeg::PlaybackEngineObject::~PlaybackEngineObject
~PlaybackEngineObject() override
Definition
qffmpegplaybackengineobject.cpp:16
QFFmpeg::PlaybackEngineObject::timer
QChronoTimer & timer()
Definition
qffmpegplaybackengineobject.cpp:57
QFFmpeg::PlaybackEngineObject::kill
void kill()
Definition
qffmpegplaybackengineobject.cpp:44
QFFmpeg::PlaybackEngineObject::isPaused
bool isPaused() const
Definition
qffmpegplaybackengineobject.cpp:22
QFFmpeg::PlaybackEngineObject::isAtEnd
bool isAtEnd() const
Definition
qffmpegplaybackengineobject.cpp:33
QFFmpeg::PlaybackEngineObject::canDoNextStep
virtual bool canDoNextStep() const
Definition
qffmpegplaybackengineobject.cpp:52
QFFmpeg::PlaybackEngineObject::PlaybackEngineObject
PlaybackEngineObject(const PlaybackEngineObjectID &id)
Definition
qffmpegplaybackengineobject.cpp:14
QFFmpeg::PlaybackEngineObject::nextTimePoint
virtual TimePoint nextTimePoint() const
Definition
qffmpegplaybackengineobject.cpp:78
QFFmpeg::PlaybackEngineObject::event
bool event(QEvent *e) override
This virtual function receives events to an object and should return true if the event e was recogniz...
Definition
qffmpegplaybackengineobject.cpp:145
QFFmpeg::PlaybackEngineObject::doNextStep
virtual void doNextStep()
Definition
qffmpegplaybackengineobject_p.h:133
QFFmpeg::PlaybackEngineObject::onPauseChanged
virtual void onPauseChanged()
Definition
qffmpegplaybackengineobject.cpp:83
QFFmpeg::PlaybackEngineObject::scheduleNextStep
void scheduleNextStep()
Definition
qffmpegplaybackengineobject.cpp:88
QFFmpeg::PlaybackEngineObject::setAtEnd
void setAtEnd(bool isAtEnd)
Definition
qffmpegplaybackengineobject.cpp:27
QFFmpeg::PlaybackEngineObject::setPaused
void setPaused(bool isPaused)
Definition
qffmpegplaybackengineobject.cpp:38
QFFmpeg
Definition
qandroidcacertificates.cpp:26
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
std
[33]
Definition
src_corelib_tools_qhash.cpp:421
qtmultimedia
src
plugins
multimedia
ffmpeg
playbackengine
qffmpegplaybackengineobject.cpp
Generated on
for Qt by
1.18.0