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"