File indexing completed on 2024-05-05 05:30:18

0001 /*
0002     SPDX-FileCopyrightText: 2023 Aleix Pol Gonzalez <aleixpol@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "pipewireencodedstream.h"
0008 #include "pipewireencodedstream_p.h"
0009 #include "pipewireproduce_p.h"
0010 #include <QDebug>
0011 
0012 extern "C" {
0013 #include <libavcodec/packet.h>
0014 }
0015 
0016 class PipeWirePacketPrivate
0017 {
0018 public:
0019     PipeWirePacketPrivate(bool isKey, const QByteArray &data)
0020         : isKey(isKey)
0021         , data(data)
0022     {
0023     }
0024 
0025     const bool isKey;
0026     const QByteArray data;
0027 };
0028 
0029 PipeWireEncodedStream::Packet::Packet(bool isKey, const QByteArray &data)
0030     : d(std::make_shared<PipeWirePacketPrivate>(isKey, data))
0031 {
0032 }
0033 
0034 QByteArray PipeWireEncodedStream::Packet::data() const
0035 {
0036     return d->data;
0037 }
0038 
0039 bool PipeWireEncodedStream::Packet::isKeyFrame() const
0040 {
0041     return d->isKey;
0042 }
0043 
0044 PipeWireEncodeProduce::PipeWireEncodeProduce(PipeWireBaseEncodedStream::Encoder encoder,
0045                                              uint nodeId,
0046                                              uint fd,
0047                                              const Fraction &framerate,
0048                                              PipeWireEncodedStream *stream)
0049     : PipeWireProduce(encoder, nodeId, fd, framerate)
0050     , m_encodedStream(stream)
0051 {
0052 }
0053 
0054 void PipeWireEncodeProduce::processPacket(AVPacket *packet)
0055 {
0056     if (!packet) {
0057         return;
0058     }
0059 
0060     Q_EMIT newPacket(PipeWireEncodedStream::Packet(packet->flags & AV_PKT_FLAG_KEY, QByteArray(reinterpret_cast<char *>(packet->data), packet->size)));
0061 }
0062 
0063 void PipeWireEncodeProduce::processFrame(const PipeWireFrame &frame)
0064 {
0065     if (m_size != m_stream->size()) {
0066         m_size = m_stream->size();
0067         Q_EMIT m_encodedStream->sizeChanged(m_size);
0068     }
0069 
0070     PipeWireProduce::processFrame(frame);
0071     if (frame.cursor && m_cursor != *frame.cursor) {
0072         m_cursor = *frame.cursor;
0073         Q_EMIT m_encodedStream->cursorChanged(m_cursor);
0074     }
0075 }
0076 
0077 PipeWireEncodedStream::PipeWireEncodedStream(QObject *parent)
0078     : PipeWireBaseEncodedStream(parent)
0079 {
0080 }
0081 
0082 PipeWireEncodedStream::~PipeWireEncodedStream() = default;
0083 
0084 std::unique_ptr<PipeWireProduce> PipeWireEncodedStream::makeProduce()
0085 {
0086     auto produce = new PipeWireEncodeProduce(encoder(), nodeId(), fd(), maxFramerate(), this);
0087     connect(produce, &PipeWireEncodeProduce::newPacket, this, &PipeWireEncodedStream::newPacket);
0088     connect(this, &PipeWireEncodedStream::maxFramerateChanged, produce, [this, produce]() {
0089         produce->setMaxFramerate(maxFramerate());
0090     });
0091     return std::unique_ptr<PipeWireProduce>(produce);
0092 }
0093 
0094 #include "moc_pipewireencodedstream_p.cpp"
0095 
0096 #include "moc_pipewireencodedstream.cpp"