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
32
34{
35public:
47 static VideoFrameEncoderUPtr create(const QMediaEncoderSettings &encoderSettings,
48 const SourceParams &sourceParams,
49 AVFormatContext *formatContext);
50
52
53 AVPixelFormat sourceFormat() const { return m_sourceFormat; }
54 AVPixelFormat targetFormat() const { return m_targetFormat; }
55
56 qreal codecFrameRate() const;
57
58 qint64 getPts(qint64 ms) const;
59
60 const AVRational &getTimeBase() const;
61
62 int sendFrame(AVFrameUPtr inputFrame);
64
65private:
66 VideoFrameEncoder(AVStream *stream, const Codec &codec, HWAccelUPtr hwAccel,
67 const SourceParams &sourceParams,
68 const QMediaEncoderSettings &encoderSettings, bool needsGlobalHeader);
69
70 static AVStream *createStream(const SourceParams &sourceParams, AVFormatContext *formatContext);
71
72 bool updateSourceFormatAndSize(const AVFrame *frame);
73
74 void updateConversions();
75
76 static VideoFrameEncoderUPtr create(AVStream *stream, const Codec &codec, HWAccelUPtr hwAccel,
77 const SourceParams &sourceParams,
78 const QMediaEncoderSettings &encoderSettings,
79 bool needsGlobalHeader);
80
81 void initCodecFrameRate();
82 void initStream();
83
84 std::vector<ScoredPixelFormat> enumerateTargetSwFormats() const; // sorted by score
85 bool tryInitTargetSwFormat(AVPixelFormat targetSwFormat);
86
87 bool initCodecContext();
88
89 bool open();
90
91 qint64 estimateDuration(const AVPacket &packet, bool isFirstPacket);
92
93private:
94 const QMediaEncoderSettings m_settings;
95 AVStream *const m_stream = nullptr;
96 const Codec m_codec;
97 const HWAccelUPtr m_accel;
98 const bool m_needsGlobalHeader = false;
99
100 QSize m_sourceSize;
101 QSize m_targetSize;
102
103 qint64 m_lastPacketTime = AV_NOPTS_VALUE;
104 AVCodecContextUPtr m_codecContext;
105 SwsContextUPtr m_scaleContext;
106 AVPixelFormat m_sourceFormat = AV_PIX_FMT_NONE;
107 AVPixelFormat m_sourceSWFormat = AV_PIX_FMT_NONE;
108 AVPixelFormat m_targetFormat;
109 AVPixelFormat m_targetSWFormat = AV_PIX_FMT_NONE;
110 bool m_downloadFromHW = false;
111 bool m_uploadToHW = false;
112
113 qreal m_sourceFrameRate = 0.f; // 0 = variable/unknown
114 AVRational m_codecFrameRate = { 0, 1 };
115
116 // m_codecFrameRate as fed to AVCodecContext::framerate and used to derive the
117 // stream time base. Unlike m_codecFrameRate (which stays {0, 1} for a genuinely
118 // variable-rate stream), this is never zero
119 AVRational effectiveCodecFrameRate() const
120 {
121 return m_codecFrameRate.den > 0 && m_codecFrameRate.num > 0
122 ? m_codecFrameRate
123 : AVRational{ DefaultVideoFrameRate, 1 };
124 }
125
126 int64_t m_prevPacketDts = AV_NOPTS_VALUE;
127 int64_t m_packetDtsOffset = 0;
128};
129} // namespace QFFmpeg
130
131QT_END_NAMESPACE
132
133#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.
void handlePausedChanged(bool paused) override
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(qLCAndroidCaCertificates, "qt.multimedia.ffmpeg.android.caCertificates")
static void freeQVideoFrame(void *opaque, uint8_t *)
constexpr int DefaultVideoFrameRate
Combined button and popup list for selecting options.