Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qffmpegrecordingengine_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"
19
20#include <private/qplatformmediarecorder_p.h>
21#include <qmediarecorder.h>
22
23#include <queue>
24
26
28class QVideoFrame;
30
31namespace QFFmpeg
32{
33
34class RecordingEngine;
35class Muxer;
36class AudioEncoder;
37class VideoEncoder;
38class VideoFrameEncoder;
39class EncodingInitializer;
40
41template <typename T>
42T dequeueIfPossible(std::queue<T> &queue)
43{
44 if (queue.empty())
45 return T{};
46
47 auto result = std::move(queue.front());
48 queue.pop();
49 return result;
50}
51
53{
55public:
56 RecordingEngine(const QMediaEncoderSettings &settings, std::unique_ptr<EncodingFormatContext> context);
58
59 void initialize(QFFmpegAudioInput *audioInput,
60 const std::vector<QPlatformVideoSource *> &videoSources);
61 void finalize();
62
63 void setPaused(bool p);
64
65 void setMetaData(const QMediaMetaData &metaData);
66 AVFormatContext *avFormatContext() { return m_formatContext->avFormatContext(); }
67 Muxer *getMuxer() { return m_muxer; }
68
69public Q_SLOTS:
71
73 void durationChanged(qint64 duration);
74 void sessionError(QMediaRecorder::Error code, const QString &description);
77
78private:
79 template<typename... Args>
80 void addMediaFrameHandler(Args &&...args);
81
82 class EncodingFinalizer : public QThread
83 {
84 public:
85 EncodingFinalizer(RecordingEngine &recordingEngine);
86
87 void run() override;
88
89 private:
90 RecordingEngine &m_recordingEngine;
91 };
92
93 friend class EncodingInitializer;
94 void addAudioInput(QFFmpegAudioInput *input);
95 void addVideoSource(QPlatformVideoSource *source, const QVideoFrame &firstFrame);
96
97 void start();
98
99 template <typename F, typename... Args>
100 void forEachEncoder(F &&f, Args &&...args);
101private:
102 QMediaEncoderSettings m_settings;
103 QMediaMetaData m_metaData;
104 std::unique_ptr<EncodingFormatContext> m_formatContext;
105 Muxer *m_muxer = nullptr;
106
107 QList<AudioEncoder *> m_audioEncoders;
108 QList<VideoEncoder *> m_videoEncoders;
109 QList<QMetaObject::Connection> m_connections;
110 std::unique_ptr<EncodingInitializer> m_initializer;
111
112 QMutex m_timeMutex;
113 qint64 m_timeRecorded = 0;
114
115 bool m_isHeaderWritten = false;
116};
117
118}
119
121
122#endif
RecordingEngine(const QMediaEncoderSettings &settings, std::unique_ptr< EncodingFormatContext > context)
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)
\inmodule QtMultimedia
Error
\qmlproperty enumeration QtMultimedia::MediaRecorder::error
\inmodule QtCore
Definition qmutex.h:281
\inmodule QtCore
Definition qobject.h:103
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
The QVideoFrame class represents a frame of video data.
Definition qvideoframe.h:27
T dequeueIfPossible(std::queue< T > &queue)
Combined button and popup list for selecting options.
static void * context
static bool initialize()
Definition qctf.cpp:94
GLfloat GLfloat f
GLuint start
GLsizei GLsizei GLchar * source
GLuint64EXT * result
[6]
GLfloat GLfloat p
[1]
GLenum GLenum GLenum input
#define Q_OBJECT
#define Q_SLOTS
#define Q_SIGNALS
long long qint64
Definition qtypes.h:60
QSettings settings("MySoft", "Star Runner")
[0]
QQueue< int > queue
[0]
QJSValueList args