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
qffmpegdemuxer_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
QFFMPEGDEMUXER_P_H
4
#
define
QFFMPEGDEMUXER_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
<
QtFFmpegMediaPluginImpl
/
private
/
qffmpegplaybackengineobject_p
.
h
>
18
#
include
<
QtFFmpegMediaPluginImpl
/
private
/
qffmpegpacket_p
.
h
>
19
#
include
<
QtFFmpegMediaPluginImpl
/
private
/
qffmpegplaybackutils_p
.
h
>
20
#
include
<
QtFFmpegMediaPluginImpl
/
private
/
qffmpegtime_p
.
h
>
21
#
include
<
QtMultimedia
/
private
/
qplatformmediaplayer_p
.
h
>
22
23
#
include
<
unordered_map
>
24
25
QT_BEGIN_NAMESPACE
26
27
namespace
QFFmpeg
{
28
29
class
Demuxer
:
public
PlaybackEngineObject
30
{
31
Q_OBJECT
32
public
:
33
using
TrackType
=
QPlatformMediaPlayer
::
TrackType
;
34
35
Demuxer
(
const
PlaybackEngineObjectID &id, AVFormatContext *context, TrackPosition initialPosUs,
36
bool
seekPending,
const
LoopOffset &loopOffset,
const
StreamIndexes &streamIndexes,
37
int
loops);
38
39
void
seek
(quint64 sessionId, TrackPosition initialPosUs,
const
LoopOffset &loopOffset);
40
41
using
RequestingSignal
=
void
(
Demuxer
::*)(
Packet
);
42
static
RequestingSignal
signalByTrackType
(TrackType trackType);
43
44
void
setLoops
(
int
loopsCount);
45
46
public
Q_SLOTS
:
47
void
onPacketProcessed
(
const
Packet
&);
48
49
Q_SIGNALS
:
50
void
requestProcessAudioPacket
(
Packet
);
51
void
requestProcessVideoPacket
(
Packet
);
52
void
requestProcessSubtitlePacket
(
Packet
);
53
void
firstPacketFound
(PlaybackEngineObjectID id, TrackPosition absSeekPos);
54
void
packetsBuffered
();
55
56
protected
:
57
TimePoint
nextTimePoint
()
const
override
;
58
59
private
:
60
bool
canDoNextStep
()
const
override
;
61
62
void
doNextStep
()
override
;
63
64
void
ensureSeeked();
65
66
private
:
67
struct
StreamData
68
{
69
TrackType trackType;
70
TrackDuration bufferedDuration = TrackDuration(0);
71
qint64 bufferedSize = 0;
72
73
TrackPosition maxSentPacketsPos = TrackPosition(0);
74
TrackPosition maxProcessedPacketPos = TrackPosition(0);
75
76
bool
isDataLimitReached =
false
;
77
};
78
79
void
updateStreamDataLimitFlag(StreamData &streamData);
80
81
private
:
82
AVFormatContext *m_context =
nullptr
;
83
84
struct
SessionContext
85
{
86
TrackPosition posInLoopUs = TrackPosition(0);
// Position in current loop in [0, duration()]
87
LoopOffset loopOffset = {};
88
bool
seeked =
false
;
89
bool
firstPacketFound =
false
;
90
bool
buffered =
false
;
91
TrackPosition maxPacketsEndPos = TrackPosition(0);
92
93
qsizetype demuxerRetryCount = 0;
94
std::optional<TimePoint> failTimePoint = {};
95
};
96
97
SessionContext m_sessionCtx;
98
std::unordered_map<
int
, StreamData> m_streams;
99
QAtomicInt m_loops =
QMediaPlayer
::
Once
;
100
101
static
constexpr
qsizetype s_maxDemuxerRetries = 10;
// Arbitrarily chosen
102
static
constexpr
std::chrono::milliseconds s_demuxerRetryInterval =
std
::
chrono
::
milliseconds
(10);
103
};
104
105
}
// namespace QFFmpeg
106
107
QT_END_NAMESPACE
// QFFMPEGDEMUXER_P_H
108
109
#
endif
QFFmpeg::Demuxer
Definition
qffmpegdemuxer_p.h:30
QFFmpeg::Demuxer::packetsBuffered
void packetsBuffered()
QFFmpeg::Demuxer::setLoops
void setLoops(int loopsCount)
Definition
qffmpegdemuxer.cpp:306
QFFmpeg::Demuxer::doNextStep
void doNextStep() override
Definition
qffmpegdemuxer.cpp:91
QFFmpeg::Demuxer::seek
void seek(quint64 sessionId, TrackPosition initialPosUs, const LoopOffset &loopOffset)
Definition
qffmpegdemuxer.cpp:79
QFFmpeg::Demuxer::firstPacketFound
void firstPacketFound(PlaybackEngineObjectID id, TrackPosition absSeekPos)
QFFmpeg::Demuxer::requestProcessVideoPacket
void requestProcessVideoPacket(Packet)
QFFmpeg::Demuxer::RequestingSignal
void(Demuxer::*)(Packet) RequestingSignal
Definition
qffmpegdemuxer_p.h:41
QFFmpeg::Demuxer::requestProcessSubtitlePacket
void requestProcessSubtitlePacket(Packet)
QFFmpeg::Demuxer::Demuxer
Demuxer(const PlaybackEngineObjectID &id, AVFormatContext *context, TrackPosition initialPosUs, bool seekPending, const LoopOffset &loopOffset, const StreamIndexes &streamIndexes, int loops)
Definition
qffmpegdemuxer.cpp:55
QFFmpeg::Demuxer::canDoNextStep
bool canDoNextStep() const override
Definition
qffmpegdemuxer.cpp:239
QFFmpeg::Demuxer::signalByTrackType
static RequestingSignal signalByTrackType(TrackType trackType)
Definition
qffmpegdemuxer.cpp:290
QFFmpeg::Demuxer::nextTimePoint
TimePoint nextTimePoint() const override
Definition
qffmpegdemuxer.cpp:232
QFFmpeg
Definition
qandroidcacertificates.cpp:26
QFFmpeg::MaxBufferedDurationUs
static constexpr TrackDuration MaxBufferedDurationUs
Definition
qffmpegdemuxer.cpp:15
QFFmpeg::Q_STATIC_LOGGING_CATEGORY
Q_STATIC_LOGGING_CATEGORY(qLCAndroidCaCertificates, "qt.multimedia.ffmpeg.android.caCertificates")
QFFmpeg::MaxBufferedSize
static constexpr qint64 MaxBufferedSize
Definition
qffmpegdemuxer.cpp:18
QFFmpeg::packetEndPos
static TrackPosition packetEndPos(const Packet &packet, const AVStream *stream, const AVFormatContext *context)
Definition
qffmpegdemuxer.cpp:22
QFFmpeg::isPacketWithinStreamDuration
static bool isPacketWithinStreamDuration(const AVFormatContext *context, const Packet &packet)
Definition
qffmpegdemuxer.cpp:30
std
[33]
Definition
src_corelib_tools_qhash.cpp:421
qtmultimedia
src
plugins
multimedia
ffmpeg
playbackengine
qffmpegdemuxer_p.h
Generated on
for Qt by
1.18.0