7#include "private/qmultimediautils_p.h"
12#include <private/qplatformcamera_p.h>
27 std::unique_ptr<EncodingFormatContext>
context)
31 Q_ASSERT(m_formatContext->isAVIOOpen());
42 if (
input->device.isNull()) {
48 if (!
input->device.preferredFormat().isValid()) {
55 auto audioEncoder =
new AudioEncoder(*
this,
input, m_settings);
56 m_audioEncoders.push_back(audioEncoder);
59 input->setRunning(
true);
69 std::optional<AVPixelFormat> hwPixelFormat =
source->ffmpegHWPixelFormat()
70 ? AVPixelFormat(*
source->ffmpegHWPixelFormat())
71 :
std::optional<AVPixelFormat>{};
73 qCDebug(qLcFFmpegEncoder) <<
"adding video source" <<
source->metaObject()->className() <<
":"
75 <<
"frameSize=" << frameFormat.
frameSize()
77 <<
"ffmpegHWPixelFormat=" << (hwPixelFormat ? *hwPixelFormat : AV_PIX_FMT_NONE);
79 auto veUPtr = std::make_unique<VideoEncoder>(*
this, m_settings, frameFormat, hwPixelFormat);
80 if (!veUPtr->isValid()) {
86 auto ve = veUPtr.release();
88 m_videoEncoders.append(ve);
91 ve->addFrame(firstFrame);
94void RecordingEngine::start()
97 m_initializer.reset();
99 if (m_audioEncoders.empty() && m_videoEncoders.empty()) {
105 qCDebug(qLcFFmpegEncoder) <<
"RecordingEngine::start!";
119 m_isHeaderWritten =
true;
121 qCDebug(qLcFFmpegEncoder) <<
"stream header is successfully written";
129 const std::vector<QPlatformVideoSource *> &videoSources)
131 qCDebug(qLcFFmpegEncoder) <<
">>>>>>>>>>>>>>> initialize";
133 m_initializer = std::make_unique<EncodingInitializer>(*
this);
134 m_initializer->start(audioInput, videoSources);
137RecordingEngine::EncodingFinalizer::EncodingFinalizer(
RecordingEngine &recordingEngine)
138 : m_recordingEngine(recordingEngine)
143void RecordingEngine::EncodingFinalizer::run()
147 if (m_recordingEngine.m_isHeaderWritten) {
151 qCWarning(qLcFFmpegEncoder) <<
"could not write trailer" <<
res << errorDescription;
160 m_recordingEngine.m_formatContext->closeAVIO();
162 qCDebug(qLcFFmpegEncoder) <<
" done finalizing.";
164 auto recordingEnginePtr = &m_recordingEngine;
165 delete recordingEnginePtr;
170 qCDebug(qLcFFmpegEncoder) <<
">>>>>>>>>>>>>>> finalize";
172 m_initializer.reset();
174 for (
auto &conn : m_connections)
177 auto *finalizer =
new EncodingFinalizer(*
this);
188 m_metaData = metaData;
194 if (
time > m_timeRecorded) {
195 m_timeRecorded =
time;
200template<
typename... Args>
201void RecordingEngine::addMediaFrameHandler(Args &&...
args)
207template <
typename F,
typename... Args>
208void RecordingEngine::forEachEncoder(F &&
f, Args &&...
args)
210 for (AudioEncoder *audioEncoder : m_audioEncoders)
211 std::invoke(
f, audioEncoder,
args...);
212 for (VideoEncoder *videoEncoder : m_videoEncoders)
213 std::invoke(
f, videoEncoder,
args...);
219#include "moc_qffmpegrecordingengine_p.cpp"
void addBuffer(const QAudioBuffer &buffer)
void stopAndDelete()
Stops the thread and deletes this object.
virtual void setPaused(bool paused)
RecordingEngine(const QMediaEncoderSettings &settings, std::unique_ptr< EncodingFormatContext > context)
void initialize(QFFmpegAudioInput *audioInput, const std::vector< QPlatformVideoSource * > &videoSources)
void newTimeStamp(qint64 time)
AVFormatContext * avFormatContext()
void setMetaData(const QMediaMetaData &metaData)
void sessionError(QMediaRecorder::Error code, const QString &description)
void durationChanged(qint64 duration)
void streamInitializationError(QMediaRecorder::Error code, const QString &description)
void addFrame(const QVideoFrame &frame)
void append(parameter_type t)
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
QThread * thread() const
Returns the thread in which the object lives.
void deleteLater()
\threadsafe
void start(Priority=InheritPriority)
void finished(QPrivateSignal)
The QVideoFrame class represents a frame of video data.
QVideoFrameFormat surfaceFormat() const
Returns the surface format of this video frame.
bool isValid() const
Identifies whether a video frame is valid.
QString err2str(int errnum)
Combined button and popup list for selecting options.
DBusConnection * connection
#define Q_LOGGING_CATEGORY(name,...)
#define qCWarning(category,...)
#define qCDebug(category,...)
GLsizei GLsizei GLchar * source
GLenum GLenum GLenum input
QLatin1StringView QLatin1String
QSettings settings("MySoft", "Star Runner")
[0]
myObject disconnect()
[26]