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_p.h
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
#
ifndef
QFFMPEGPLAYBACKENGINEOBJECT_P_H
4
#
define
QFFMPEGPLAYBACKENGINEOBJECT_P_H
5
6
//
7
// W A R N I N G
8
// -------------
9
//
10
// This file is not part of the Qt API. It exists purely as an
11
// implementation detail. This header file may change from version to
12
// version without notice, or even be removed.
13
//
14
// We mean it.
15
//
16
17
#
include
<
QtCore
/
qatomic
.
h
>
18
#
include
<
QtCore
/
qthread
.
h
>
19
#
include
<
QtCore
/
qcoreevent
.
h
>
20
#
include
<
QtCore
/
qcoreapplication
.
h
>
21
#
include
<
QtMultimedia
/
qmediaplayer
.
h
>
22
#
include
<
QtFFmpegMediaPluginImpl
/
private
/
qffmpegplaybackenginedefs_p
.
h
>
23
#
include
<
QtFFmpegMediaPluginImpl
/
private
/
qffmpegplaybackutils_p
.
h
>
24
25
#
include
<
chrono
>
26
#
include
<
optional
>
27
28
QT_BEGIN_NAMESPACE
29
30
class
QChronoTimer;
31
32
namespace
QFFmpeg
{
33
34
class
PlaybackEngineObject
:
public
QObject
35
{
36
Q_OBJECT
37
38
static
constexpr
QEvent
::
Type
FuncEventType
=
QEvent
::
User
;
39
class
FuncEvent :
public
QEvent
40
{
41
public
:
42
FuncEvent() : QEvent(FuncEventType) { }
43
virtual
void
invoke() = 0;
44
};
45
46
template
<
typename
F>
47
class
FuncEventImpl
final
:
public
FuncEvent
48
{
49
public
:
50
explicit
FuncEventImpl(F &&f) : m_func(std::forward<F>(f)) { }
51
void
invoke()
override
{ m_func(); }
52
53
private
:
54
std::decay_t<F> m_func;
55
};
56
57
public
:
58
using
TimePoint
=
SteadyClock
::
time_point
;
59
using
TimePointOpt
=
std
::
optional
<
TimePoint
>;
60
61
explicit
PlaybackEngineObject
(
const
PlaybackEngineObjectID &id);
62
63
~
PlaybackEngineObject
()
override
;
64
65
bool
isPaused
()
const
;
66
67
bool
isAtEnd
()
const
;
68
69
void
kill
();
70
71
void
setPaused
(
bool
isPaused);
72
73
quint64
objectID
()
const
{
return
m_id.objectID; }
74
75
Q_SIGNALS
:
76
void
atEnd
(
PlaybackEngineObjectID
id
);
77
78
void
error
(
QMediaPlayer
::
Error
,
const
QString &errorString);
79
80
protected
:
81
bool
event
(QEvent *e)
override
;
82
83
bool
checkSessionID
(quint64 sessionID)
const
{
return
sessionID == m_id.sessionID; }
84
85
bool
checkID
(
const
PlaybackEngineObjectID &id)
const
86
{
87
return
checkSessionID(id.sessionID) && id.objectID == objectID();
88
}
89
90
const
PlaybackEngineObjectID
&
id
()
const
91
{
92
Q_ASSERT(thread()->isCurrentThread());
93
return
m_id;
94
}
95
96
template
<
typename
F>
97
void
updateSession
(quint64 newID, F &&f)
98
{
99
m_invalidateCounter.fetch_add(1, std::memory_order_relaxed);
100
invokePriorityMethod([f =
std
::forward<F>(f),
this
, newID]() {
101
const
int
count = m_invalidateCounter.fetch_sub(1, std::memory_order_relaxed) - 1;
102
Q_ASSERT(count >= 0);
103
if
(count)
104
return
;
105
106
m_id.sessionID = newID;
107
setAtEnd
(
false
)
;
108
f();
109
});
110
}
111
112
template
<
typename
F>
113
void
invokePriorityMethod
(F &&f)
114
{
115
Q_ASSERT(!thread()->isCurrentThread());
116
// Note, that the event loop takes ownership of the event
117
QCoreApplication::postEvent(
this
,
new
FuncEventImpl<F>(std::forward<F>(f)),
118
Qt::HighEventPriority);
119
}
120
121
QChronoTimer &
timer
();
122
123
void
scheduleNextStep
();
124
125
virtual
void
onPauseChanged
();
126
127
virtual
bool
canDoNextStep
()
const
;
128
129
virtual
TimePoint
nextTimePoint
()
const
;
130
131
void
setAtEnd
(
bool
isAtEnd);
132
133
virtual
void
doNextStep
() { }
134
135
private
Q_SLOTS
:
136
void
onTimeout
();
137
138
private
:
139
enum
class
StepType : uint8_t { None, Timeout, Immediate };
140
141
void
doNextStep(StepType type);
142
143
bool
isValid()
const
{
return
m_invalidateCounter.load(std::memory_order_relaxed) == 0; }
144
145
std::unique_ptr<QChronoTimer> m_timer;
146
147
QAtomicInteger<
bool
> m_paused =
true
;
148
QAtomicInteger<
bool
> m_atEnd =
false
;
149
std::atomic_int m_invalidateCounter = 0;
150
PlaybackEngineObjectID m_id;
151
152
TimePointOpt m_nextTimePoint;
153
TimePointOpt m_timePoint;
154
StepType m_stepType = StepType::None;
155
};
156
}
// namespace QFFmpeg
157
158
QT_END_NAMESPACE
159
160
#
endif
// QFFMPEGPLAYBACKENGINEOBJECT_P_H
QFFmpeg::PlaybackEngineObject
Definition
qffmpegplaybackengineobject_p.h:35
QFFmpeg::PlaybackEngineObject::checkID
bool checkID(const PlaybackEngineObjectID &id) const
Definition
qffmpegplaybackengineobject_p.h:85
QFFmpeg::PlaybackEngineObject::checkSessionID
bool checkSessionID(quint64 sessionID) const
Definition
qffmpegplaybackengineobject_p.h:83
QFFmpeg::PlaybackEngineObject::~PlaybackEngineObject
~PlaybackEngineObject() override
Definition
qffmpegplaybackengineobject.cpp:16
QFFmpeg::PlaybackEngineObject::timer
QChronoTimer & timer()
Definition
qffmpegplaybackengineobject.cpp:57
QFFmpeg::PlaybackEngineObject::error
void error(QMediaPlayer::Error, const QString &errorString)
QFFmpeg::PlaybackEngineObject::updateSession
void updateSession(quint64 newID, F &&f)
Definition
qffmpegplaybackengineobject_p.h:97
QFFmpeg::PlaybackEngineObject::kill
void kill()
Definition
qffmpegplaybackengineobject.cpp:44
QFFmpeg::PlaybackEngineObject::isPaused
bool isPaused() const
Definition
qffmpegplaybackengineobject.cpp:22
QFFmpeg::PlaybackEngineObject::id
const PlaybackEngineObjectID & id() const
Definition
qffmpegplaybackengineobject_p.h:90
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::invokePriorityMethod
void invokePriorityMethod(F &&f)
Definition
qffmpegplaybackengineobject_p.h:113
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::objectID
quint64 objectID() const
Definition
qffmpegplaybackengineobject_p.h:73
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_p.h
Generated on
for Qt by
1.18.0