Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qffmpegvideoframeencoder_p.h
Go to the documentation of this file.
1// Copyright (C) 2022 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 QFFMPEGVIDEOFRAMEENCODER_P_H
4#define QFFMPEGVIDEOFRAMEENCODER_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/qffmpeghwaccel_p.h>
18#include <QtFFmpegMediaPluginImpl/private/qffmpegrecordingengineutils_p.h>
19#include <QtMultimedia/private/qplatformmediarecorder_p.h>
20#include <QtMultimedia/private/qmultimediautils_p.h>
21
22
24
25class QMediaEncoderSettings;
26
27namespace QFFmpeg {
28
31
33{
34public:
46 static VideoFrameEncoderUPtr create(const QMediaEncoderSettings &encoderSettings,
47 const SourceParams &sourceParams,
48 AVFormatContext *formatContext);
49
51
52 AVPixelFormat sourceFormat() const { return m_sourceFormat; }
53 AVPixelFormat targetFormat() const { return m_targetFormat; }
54
55 qreal codecFrameRate() const;
56
57 qint64 getPts(qint64 ms) const;
58
59 const AVRational &getTimeBase() const;
60
61 int sendFrame(AVFrameUPtr inputFrame);
63
64private:
65 VideoFrameEncoder(AVStream *stream, const Codec &codec, HWAccelUPtr hwAccel,
66 const SourceParams &sourceParams,
67 const QMediaEncoderSettings &encoderSettings);
68
69 static AVStream *createStream(const SourceParams &sourceParams, AVFormatContext *formatContext);
70
71 bool updateSourceFormatAndSize(const AVFrame *frame);
72
73 void updateConversions();
74
75 struct CreationResult
76 {
77 VideoFrameEncoderUPtr encoder;
78 AVPixelFormat targetFormat = AV_PIX_FMT_NONE;
79 };
80
81 static CreationResult create(AVStream *stream, const Codec &codec, HWAccelUPtr hwAccel,
82 const SourceParams &sourceParams,
83 const QMediaEncoderSettings &encoderSettings,
84 const AVPixelFormatSet &prohibitedTargetFormats = {});
85
86 void initTargetSize();
87
88 void initCodecFrameRate();
89
90 bool initTargetFormats(const AVPixelFormatSet &prohibitedTargetFormats);
91
92 void initStream();
93
94 bool initCodecContext();
95
96 bool open();
97
98 qint64 estimateDuration(const AVPacket &packet, bool isFirstPacket);
99
100private:
101 const QMediaEncoderSettings m_settings;
102 AVStream *const m_stream = nullptr;
103 const Codec m_codec;
104 const HWAccelUPtr m_accel;
105
106 QSize m_sourceSize;
107 QSize m_targetSize;
108
109 qint64 m_lastPacketTime = AV_NOPTS_VALUE;
110 AVCodecContextUPtr m_codecContext;
111 SwsContextUPtr m_scaleContext;
112 AVPixelFormat m_sourceFormat = AV_PIX_FMT_NONE;
113 AVPixelFormat m_sourceSWFormat = AV_PIX_FMT_NONE;
114 AVPixelFormat m_targetFormat = AV_PIX_FMT_NONE;
115 AVPixelFormat m_targetSWFormat = AV_PIX_FMT_NONE;
116 bool m_downloadFromHW = false;
117 bool m_uploadToHW = false;
118
119 qreal m_sourceFrameRate = 0.f; // 0 = variable/unknown
120 AVRational m_codecFrameRate = { 0, 1 };
121
122 // m_codecFrameRate as fed to AVCodecContext::framerate and used to derive the
123 // stream time base. Unlike m_codecFrameRate (which stays {0, 1} for a genuinely
124 // variable-rate stream), this is never zero
125 AVRational effectiveCodecFrameRate() const
126 {
127 return m_codecFrameRate.den > 0 && m_codecFrameRate.num > 0
128 ? m_codecFrameRate
129 : AVRational{ DefaultVideoFrameRate, 1 };
130 }
131
132 int64_t m_prevPacketDts = AV_NOPTS_VALUE;
133 int64_t m_packetDtsOffset = 0;
134};
135} // namespace QFFmpeg
136
137QT_END_NAMESPACE
138
139#endif
bool init() override
Called on this thread when thread starts.
bool checkIfCanPushFrame() const override
~VideoEncoder() override
void processOne() override
Process one work item.
void cleanup() override
Called on this thread before thread exits.
bool hasData() const override
Must return true when data is available for processing.
const AVRational & getTimeBase() const
int sendFrame(AVFrameUPtr inputFrame)
static VideoFrameEncoderUPtr create(const QMediaEncoderSettings &encoderSettings, const SourceParams &sourceParams, AVFormatContext *formatContext)
Q_STATIC_LOGGING_CATEGORY(qLCAndroidVideoDevices, "qt.multimedia.ffmpeg.android.videoDevices")
static void freeQVideoFrame(void *opaque, uint8_t *)
QT_MANGLE_NAMESPACE(QMacScreenCaptureStreamDelegate) QMacScreenCaptureStreamDelegate
constexpr int DefaultVideoFrameRate
Combined button and popup list for selecting options.