From 0241788e99ff236bf52d07ee8a83c4f60b7c9afc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8ger=20Hanseg=C3=A5rd?= Date: Mon, 1 Apr 2024 15:56:23 +0200 Subject: Move FFmpeg::Muxer into its own file This helps readability because the qffmpegrecordingengine_p.h file is quite big. Task-number: QTBUG-121792 Pick-to: 6.5 Change-Id: Ibb8a51937622f44820e7f0b46b32f20f47225216 Reviewed-by: Artem Dyomin (cherry picked from commit 1e69b9774b65d43ca8c6197f8c5031c5955fdcc7) Reviewed-by: Qt Cherry-pick Bot (cherry picked from commit a149227f76911e6953636ec07a59525acb34cfb6) --- src/plugins/multimedia/ffmpeg/CMakeLists.txt | 2 + .../ffmpeg/recordingengine/qffmpegmuxer.cpp | 60 ++++++++++++++++++++ .../ffmpeg/recordingengine/qffmpegmuxer_p.h | 44 +++++++++++++++ .../recordingengine/qffmpegrecordingengine.cpp | 64 +--------------------- .../recordingengine/qffmpegrecordingengine_p.h | 35 ++++-------- 5 files changed, 119 insertions(+), 86 deletions(-) create mode 100644 src/plugins/multimedia/ffmpeg/recordingengine/qffmpegmuxer.cpp create mode 100644 src/plugins/multimedia/ffmpeg/recordingengine/qffmpegmuxer_p.h diff --git a/src/plugins/multimedia/ffmpeg/CMakeLists.txt b/src/plugins/multimedia/ffmpeg/CMakeLists.txt index e0d5576cb..c6c1fd37f 100644 --- a/src/plugins/multimedia/ffmpeg/CMakeLists.txt +++ b/src/plugins/multimedia/ffmpeg/CMakeLists.txt @@ -58,6 +58,8 @@ qt_internal_add_plugin(QFFmpegMediaPlugin recordingengine/qffmpegaudioencoderutils.cpp recordingengine/qffmpegencoderoptions_p.h recordingengine/qffmpegencoderoptions.cpp + recordingengine/qffmpegmuxer_p.h + recordingengine/qffmpegmuxer.cpp recordingengine/qffmpegrecordingengine_p.h recordingengine/qffmpegrecordingengine.cpp recordingengine/qffmpegvideoencoderutils_p.h diff --git a/src/plugins/multimedia/ffmpeg/recordingengine/qffmpegmuxer.cpp b/src/plugins/multimedia/ffmpeg/recordingengine/qffmpegmuxer.cpp new file mode 100644 index 000000000..6367dde3b --- /dev/null +++ b/src/plugins/multimedia/ffmpeg/recordingengine/qffmpegmuxer.cpp @@ -0,0 +1,60 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#include "qffmpegmuxer_p.h" +#include "qffmpegrecordingengine_p.h" +#include + +QT_BEGIN_NAMESPACE + +namespace QFFmpeg { + +static Q_LOGGING_CATEGORY(qLcFFmpegMuxer, "qt.multimedia.ffmpeg.muxer"); + +Muxer::Muxer(RecordingEngine *encoder) : m_encoder(encoder) +{ + setObjectName(QLatin1String("Muxer")); +} + +void Muxer::addPacket(AVPacketUPtr packet) +{ + { + QMutexLocker locker(&m_queueMutex); + m_packetQueue.push(std::move(packet)); + } + + // qCDebug(qLcFFmpegEncoder) << "Muxer::addPacket" << packet->pts << packet->stream_index; + dataReady(); +} + +AVPacketUPtr Muxer::takePacket() +{ + QMutexLocker locker(&m_queueMutex); + return dequeueIfPossible(m_packetQueue); +} + +void Muxer::init() +{ + qCDebug(qLcFFmpegMuxer) << "Muxer::init started thread."; +} + +void Muxer::cleanup() { } + +bool QFFmpeg::Muxer::hasData() const +{ + QMutexLocker locker(&m_queueMutex); + return !m_packetQueue.empty(); +} + +void Muxer::processOne() +{ + auto packet = takePacket(); + // qCDebug(qLcFFmpegEncoder) << "writing packet to file" << packet->pts << packet->duration << + // packet->stream_index; + + // the function takes ownership for the packet + av_interleaved_write_frame(m_encoder->avFormatContext(), packet.release()); +} + +} // namespace QFFmpeg + +QT_END_NAMESPACE diff --git a/src/plugins/multimedia/ffmpeg/recordingengine/qffmpegmuxer_p.h b/src/plugins/multimedia/ffmpeg/recordingengine/qffmpegmuxer_p.h new file mode 100644 index 000000000..a50ffc6a2 --- /dev/null +++ b/src/plugins/multimedia/ffmpeg/recordingengine/qffmpegmuxer_p.h @@ -0,0 +1,44 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#ifndef QFFMPEGMUXER_P_H +#define QFFMPEGMUXER_P_H + +#include "qffmpegthread_p.h" +#include "qffmpeg_p.h" +#include +#include +#include + +QT_BEGIN_NAMESPACE + +namespace QFFmpeg { + +class RecordingEngine; + +class Muxer : public ConsumerThread +{ +public: + Muxer(RecordingEngine *encoder); + + void addPacket(AVPacketUPtr packet); + +private: + AVPacketUPtr takePacket(); + + void init() override; + void cleanup() override; + bool hasData() const override; + void processOne() override; + +private: + mutable QMutex m_queueMutex; + std::queue m_packetQueue; + + RecordingEngine *m_encoder; +}; + +} // namespace QFFmpeg + +QT_END_NAMESPACE + +#endif diff --git a/src/plugins/multimedia/ffmpeg/recordingengine/qffmpegrecordingengine.cpp b/src/plugins/multimedia/ffmpeg/recordingengine/qffmpegrecordingengine.cpp index d1d0b2ba4..485e39dc9 100644 --- a/src/plugins/multimedia/ffmpeg/recordingengine/qffmpegrecordingengine.cpp +++ b/src/plugins/multimedia/ffmpeg/recordingengine/qffmpegrecordingengine.cpp @@ -16,7 +16,7 @@ #include "qffmpegmediametadata_p.h" #include "qffmpegencoderoptions_p.h" #include "qffmpegaudioencoderutils_p.h" - +#include "qffmpegmuxer_p.h" #include extern "C" { @@ -31,21 +31,6 @@ static Q_LOGGING_CATEGORY(qLcFFmpegEncoder, "qt.multimedia.ffmpeg.encoder"); namespace QFFmpeg { -namespace { - -template -T dequeueIfPossible(std::queue &queue) -{ - if (queue.empty()) - return T{}; - - auto result = std::move(queue.front()); - queue.pop(); - return result; -} - -} // namespace - RecordingEngine::RecordingEngine(const QMediaEncoderSettings &settings, std::unique_ptr context) : m_settings(settings), m_formatContext(std::move(context)), m_muxer(new Muxer(this)) @@ -197,53 +182,6 @@ void RecordingEngine::addMediaFrameHandler(Args &&...args) m_connections.append(connection); } -Muxer::Muxer(RecordingEngine *encoder) : m_encoder(encoder) -{ - setObjectName(QLatin1String("Muxer")); -} - -void Muxer::addPacket(AVPacketUPtr packet) -{ - { - QMutexLocker locker(&m_queueMutex); - m_packetQueue.push(std::move(packet)); - } - - // qCDebug(qLcFFmpegEncoder) << "Muxer::addPacket" << packet->pts << packet->stream_index; - dataReady(); -} - -AVPacketUPtr Muxer::takePacket() -{ - QMutexLocker locker(&m_queueMutex); - return dequeueIfPossible(m_packetQueue); -} - -void Muxer::init() -{ - qCDebug(qLcFFmpegEncoder) << "Muxer::init started thread."; -} - -void Muxer::cleanup() -{ -} - -bool QFFmpeg::Muxer::hasData() const -{ - QMutexLocker locker(&m_queueMutex); - return !m_packetQueue.empty(); -} - -void Muxer::processOne() -{ - auto packet = takePacket(); - // qCDebug(qLcFFmpegEncoder) << "writing packet to file" << packet->pts << packet->duration << - // packet->stream_index; - - // the function takes ownership for the packet - av_interleaved_write_frame(m_encoder->avFormatContext(), packet.release()); -} - AudioEncoder::AudioEncoder(RecordingEngine *encoder, QFFmpegAudioInput *input, const QMediaEncoderSettings &settings) : EncoderThread(encoder), m_input(input), m_settings(settings) diff --git a/src/plugins/multimedia/ffmpeg/recordingengine/qffmpegrecordingengine_p.h b/src/plugins/multimedia/ffmpeg/recordingengine/qffmpegrecordingengine_p.h index aafee5b67..86e322a33 100644 --- a/src/plugins/multimedia/ffmpeg/recordingengine/qffmpegrecordingengine_p.h +++ b/src/plugins/multimedia/ffmpeg/recordingengine/qffmpegrecordingengine_p.h @@ -44,6 +44,18 @@ class AudioEncoder; class VideoEncoder; class VideoFrameEncoder; + +template +T dequeueIfPossible(std::queue &queue) +{ + if (queue.empty()) + return T{}; + + auto result = std::move(queue.front()); + queue.pop(); + return result; +} + class EncodingFinalizer : public QThread { public: @@ -108,29 +120,6 @@ private: bool m_isHeaderWritten = false; }; - -class Muxer : public ConsumerThread -{ -public: - Muxer(RecordingEngine *encoder); - - void addPacket(AVPacketUPtr packet); - -private: - AVPacketUPtr takePacket(); - - void init() override; - void cleanup() override; - bool hasData() const override; - void processOne() override; - -private: - mutable QMutex m_queueMutex; - std::queue m_packetQueue; - - RecordingEngine *m_encoder; -}; - class EncoderThread : public ConsumerThread { public: -- cgit v1.2.3