Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qffmpegencoder_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 QFFMPEGENCODER_P_H
4#define QFFMPEGENCODER_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 "qffmpegthread_p.h"
18#include "qffmpeg_p.h"
19#include "qffmpeghwaccel_p.h"
20
21#include <private/qplatformmediarecorder_p.h>
22#include <qaudioformat.h>
23#include <qaudiobuffer.h>
24
25#include <qqueue.h>
26
28
30class QVideoFrame;
32
33namespace QFFmpeg
34{
35
36class Encoder;
37class Muxer;
38class AudioEncoder;
39class VideoEncoder;
40class VideoFrameEncoder;
41
43{
44public:
46
47 void run() override;
48
49private:
50 Encoder *encoder = nullptr;
51};
52
53class Encoder : public QObject
54{
56public:
57 Encoder(const QMediaEncoderSettings &settings, const QUrl &url);
59
62
63 void start();
64 void finalize();
65
66 void setPaused(bool p);
67
68 void setMetaData(const QMediaMetaData &metaData);
69
70public Q_SLOTS:
73
75 void durationChanged(qint64 duration);
76 void error(QMediaRecorder::Error code, const QString &description);
78
79private:
80 // TODO: improve the encasulation
81 friend class EncodingFinalizer;
82 friend class AudioEncoder;
83 friend class VideoEncoder;
84 friend class Muxer;
85
87 QMediaMetaData metaData;
88 AVFormatContext *formatContext = nullptr;
89 Muxer *muxer = nullptr;
90 bool isRecording = false;
91
92 AudioEncoder *audioEncode = nullptr;
93 QList<VideoEncoder *> videoEncoders;
95
96 QMutex timeMutex;
97 qint64 timeRecorded = 0;
98};
99
100
101class Muxer : public Thread
102{
103 mutable QMutex queueMutex;
104 QQueue<AVPacket *> packetQueue;
105public:
106 Muxer(Encoder *encoder);
107
108 void addPacket(AVPacket *);
109
110private:
111 AVPacket *takePacket();
112
113 void init() override;
114 void cleanup() override;
115 bool shouldWait() const override;
116 void loop() override;
117
118 Encoder *encoder;
119};
120
121class EncoderThread : public Thread
122{
123public:
124 virtual void setPaused(bool b)
125 {
127 }
128
129protected:
131 Encoder *encoder = nullptr;
132};
133
135{
136 mutable QMutex queueMutex;
137 QQueue<QAudioBuffer> audioBufferQueue;
138public:
140
141 void open();
143
144 QFFmpegAudioInput *audioInput() const { return input; }
145
146private:
147 QAudioBuffer takeBuffer();
148 void retrievePackets();
149
150 void init() override;
151 void cleanup() override;
152 bool shouldWait() const override;
153 void loop() override;
154
155 AVStream *stream = nullptr;
156 AVCodecContext *codec = nullptr;
159
160 SwrContext *resampler = nullptr;
161 qint64 samplesWritten = 0;
162 const AVCodec *avCodec = nullptr;
163 QMediaEncoderSettings settings;
164};
165
166
168{
169 mutable QMutex queueMutex;
170 QQueue<QVideoFrame> videoFrameQueue;
171 const qsizetype maxQueueSize = 10; // Arbitrarily chosen to limit memory usage (332 MB @ 4K)
172
173public:
175 const QVideoFrameFormat &format, std::optional<AVPixelFormat> hwFormat);
176 ~VideoEncoder() override;
177
179
180 bool isValid() const;
181
182 void setPaused(bool b) override
183 {
185 if (b)
186 baseTime.storeRelease(-1);
187 }
188
189private:
190 QVideoFrame takeFrame();
191 void retrievePackets();
192
193 void init() override;
194 void cleanup() override;
195 bool shouldWait() const override;
196 void loop() override;
197
198 VideoFrameEncoder *frameEncoder = nullptr;
199
200 QAtomicInteger<qint64> baseTime = std::numeric_limits<qint64>::min();
201 qint64 lastFrameTime = 0;
202};
203
204}
205
207
208#endif
\inmodule QtCore
Definition qatomic.h:18
\inmodule QtMultimedia
The QAudioFormat class stores audio stream parameter information.
void storeRelease(T newValue) noexcept
void addBuffer(const QAudioBuffer &buffer)
void cleanup() override
bool shouldWait() const override
void loop() override
QFFmpegAudioInput * audioInput() const
AudioEncoder(Encoder *encoder, QFFmpegAudioInput *input, const QMediaEncoderSettings &settings)
void init() override
virtual void setPaused(bool b)
QAtomicInteger< bool > paused
Encoder(const QMediaEncoderSettings &settings, const QUrl &url)
void newTimeStamp(qint64 time)
void durationChanged(qint64 duration)
void addAudioInput(QFFmpegAudioInput *input)
void setPaused(bool p)
void error(QMediaRecorder::Error code, const QString &description)
void setMetaData(const QMediaMetaData &metaData)
void addVideoSource(QPlatformVideoSource *source)
void newAudioBuffer(const QAudioBuffer &buffer)
void finalizationDone()
void loop() override
void cleanup() override
Muxer(Encoder *encoder)
void init() override
bool shouldWait() const override
void addPacket(AVPacket *)
void setPaused(bool b) override
bool isValid() const
~VideoEncoder() override
void init() override
void loop() override
bool shouldWait() const override
void cleanup() override
void addFrame(const QVideoFrame &frame)
VideoEncoder(Encoder *encoder, const QMediaEncoderSettings &settings, const QVideoFrameFormat &format, std::optional< AVPixelFormat > hwFormat)
Definition qlist.h:74
\inmodule QtMultimedia
Error
\qmlproperty enumeration QtMultimedia::MediaRecorder::error
\inmodule QtCore
Definition qmutex.h:285
\inmodule QtCore
Definition qobject.h:90
\inmodule QtCore
Definition qqueue.h:14
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
\inmodule QtCore
Definition qurl.h:94
The QVideoFrameFormat class specifies the stream format of a video presentation surface.
The QVideoFrame class represents a frame of video data.
Definition qvideoframe.h:26
double e
Combined button and popup list for selecting options.
EGLStreamKHR stream
GLboolean GLboolean GLboolean b
GLenum GLuint buffer
GLint GLsizei GLsizei GLenum format
GLsizei GLsizei GLchar * source
GLfloat GLfloat p
[1]
GLenum GLenum GLenum input
#define Q_OBJECT
#define Q_SLOTS
#define Q_SIGNALS
ptrdiff_t qsizetype
Definition qtypes.h:70
long long qint64
Definition qtypes.h:55
QSettings settings("MySoft", "Star Runner")
[0]
QUrl url("example.com")
[constructor-url-reference]
QFrame frame
[0]