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
qffmpegrecordingengineutils_p.h
Go to the documentation of this file.
1// Copyright (C) 2024 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
4#ifndef QFFMPEGRECORDINGENGINEUTILS_P_H
5#define QFFMPEGRECORDINGENGINEUTILS_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include "qobject.h"
19#include <queue>
20
22
24class QPlatformVideoSource;
25
26namespace QFFmpeg {
27
28constexpr qint64 VideoFrameTimeBase = 1000000; // us in sec
29
30class EncoderThread;
31
32template <typename T>
33T dequeueIfPossible(std::queue<T> &queue)
34{
35 if (queue.empty())
36 return T{};
37
38 auto result = std::move(queue.front());
39 queue.pop();
40 return result;
41}
42
44
45void setEncoderUpdateConnection(QObject *source, EncoderThread *encoder);
46
47template <typename Encoder, typename Source>
48void connectEncoderToSource(Encoder *encoder, Source *source)
49{
50 Q_ASSERT(!encoder->source());
51 encoder->setSource(source);
52
53 if constexpr (std::is_same_v<Source, QPlatformVideoSource>) {
54 QObject::connect(source, &Source::newVideoFrame, encoder, &Encoder::addFrame,
55 Qt::DirectConnection);
56
57 QObject::connect(source, &Source::activeChanged, encoder, [=]() {
58 if (!source->isActive())
59 encoder->setEndOfSourceStream();
60 });
61 } else {
62 QObject::connect(source, &Source::newAudioBuffer, encoder, &Encoder::addBuffer,
63 Qt::DirectConnection);
64 }
65
66 // TODO:
67 // QObject::connect(source, &Source::disconnectedFromSession, encoder, [=]() {
68 // encoder->setSourceEndOfStream();
69 // });
70
71 setEncoderUpdateConnection(source, encoder);
72 setEncoderInterface(source, encoder);
73}
74
76
77} // namespace QFFmpeg
78
79QT_END_NAMESPACE
80
81#endif // QFFMPEGRECORDINGENGINEUTILS_P_H
The QAudioFormat class stores audio stream parameter information.
bool init() override
Called on this thread when thread starts.
AudioEncoder(RecordingEngine &recordingEngine, const QAudioFormat &sourceFormat, const QMediaEncoderSettings &settings)
void addBuffer(const QAudioBuffer &buffer)
void cleanup() override
Called on this thread before thread exits.
bool hasData() const override
Must return true when data is available for processing.
void processOne() override
Process one work item.
bool checkIfCanPushFrame() const override
Q_STATIC_LOGGING_CATEGORY(qLcEncodingFormatContext, "qt.multimedia.ffmpeg.encodingformatcontext")
void setEncoderInterface(QObject *source, QMediaInputEncoderInterface *)
void setEncoderUpdateConnection(QObject *source, EncoderThread *encoder)
T dequeueIfPossible(std::queue< T > &queue)
std::conditional_t< QT_FFMPEG_AVIO_WRITE_CONST, const uint8_t *, uint8_t * > AvioWriteBufferType
void disconnectEncoderFromSource(EncoderThread *encoder)
void connectEncoderToSource(Encoder *encoder, Source *source)
constexpr qint64 VideoFrameTimeBase
static constexpr bool audioEncoderExtendedTracing